Files
Socrates/docs/design-source/socrata/project/Socrata.html
dtoro f1c4566576 Initial commit — design docs + Phase 0 validation harness
Sets up the Socrata project repo with:

docs/ — strategy and design documents
  - idea.md: full product vision
  - implementation-plan.md: Phase 0 + Phase 1 MVP plan
  - phase-0-validation.md: 2-week validation experiment strategy
  - phase-0-plan.md: concrete Phase 0 build plan
  - phase-0-results.md: Phase 0 gate outcome — GO for MVP
  - sysml-modeling.md: metamodel + SE discipline + validation rules
  - socrates.md: agent character, surfaces, modes, prompts, lifecycle
  - sync.md: bidirectional text↔diagram sync engineering
  - design-source/: HTML/CSS/JS handoff bundle from Claude Design

phase-0/ — validated harness (CLI, no UI, no DB)
  - LM Studio (local OpenAI-compatible) generation + detection + judge
  - PlantUML rendering for SysML model visualization
  - 10-seed corpus (8 working + 2 holdouts)
  - 5 corpus runs with iteration history in reports/
  - Final gate: 10/10 pass, mean 4.32/5, holdouts validated

Phase 1 MVP scope and milestones documented in implementation-plan.md.
2026-04-28 22:07:38 +02:00

212 lines
7.4 KiB
HTML

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Socrata — dual-canvas explorations</title>
<meta name="viewport" content="width=1480" />
<!-- Fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=Newsreader:ital,wght@0,400;0,500;0,600;1,400;1,500;1,600&family=Fraunces:opsz,wght@9..144,400;9..144,500;9..144,600&family=Inter+Tight:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="styles.css" />
<link rel="stylesheet" href="theme-manuscript.css" />
<link rel="stylesheet" href="theme-foundry.css" />
<link rel="stylesheet" href="theme-atelier.css" />
<style>
body { background: #f0eee9; }
/* Make each editor artboard fill its DCArtboard frame */
.artboard-host {
width: 100%; height: 100%; overflow: hidden;
border-radius: 6px;
box-shadow: 0 1px 0 rgba(0,0,0,0.04);
}
.seed-host { width: 100%; height: 100%; overflow: hidden; }
/* Direction caption shown on each artboard above the chrome */
.aes-caption {
position: absolute; top: 10px; left: 14px;
font-family: "JetBrains Mono", monospace;
font-size: 10px;
letter-spacing: 0.14em;
text-transform: uppercase;
color: rgba(0,0,0,0.55);
pointer-events: none;
z-index: 5;
}
</style>
</head>
<body>
<div id="root"></div>
<!-- React + Babel pinned -->
<script src="https://unpkg.com/react@18.3.1/umd/react.development.js" integrity="sha384-hD6/rw4ppMLGNu3tX5cjIb+uRZ7UkRJ6BPkLpg4hAu/6onKUg4lLsHAs9EBPT82L" crossorigin="anonymous"></script>
<script src="https://unpkg.com/react-dom@18.3.1/umd/react-dom.development.js" integrity="sha384-u6aeetuaXnQ38mYT8rp6sbXaQe3NL9t+IBXmnYxwkUI2Hw4bsp2Wvmx4yRQF1uAm" crossorigin="anonymous"></script>
<script src="https://unpkg.com/@babel/standalone@7.29.0/babel.min.js" integrity="sha384-m08KidiNqLdpJqLq95G/LEi8Qvjl/xUYll3QILypMoQ65QorJ9Lvtp2RXYGBFj1y" crossorigin="anonymous"></script>
<script src="data.js"></script>
<script type="text/babel" src="design-canvas.jsx"></script>
<script type="text/babel" src="tweaks-panel.jsx"></script>
<script type="text/babel" src="diagram.jsx"></script>
<script type="text/babel" src="text-canvas.jsx"></script>
<script type="text/babel" src="socrates.jsx"></script>
<script type="text/babel" src="editor-shell.jsx"></script>
<script type="text/babel" src="seed-screen.jsx"></script>
<script type="text/babel">
const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
"diagramStyle": "softened",
"density": "compact",
"markupStyle": "color",
"presence": "default"
}/*EDITMODE-END*/;
function ThemedEditor({ theme, caption, density, markupStyle, diagramStyle, presence }) {
return (
<div className={`artboard-host theme-${theme}`}>
<div className="aes-caption">{caption}</div>
<EditorShell
data={window.SOCRATA_DATA}
density={density}
markupStyle={markupStyle}
diagramStyle={diagramStyle}
presence={presence}
/>
</div>
);
}
function ThemedSeed({ theme, caption }) {
return (
<div className={`seed-host theme-${theme}`}>
<div className="aes-caption">{caption}</div>
<SeedScreen />
</div>
);
}
function App() {
const [tweaks, setTweak] = useTweaks(TWEAK_DEFAULTS);
return (
<>
<DesignCanvas>
<DCSection
id="editor"
title="Dual-canvas editor"
subtitle="Three aesthetic directions for the main workspace. Same data, same components, different soul."
>
<DCArtboard id="manuscript" label="A · Manuscript — parchment, serif, ink-blue. Document-first." width={1480} height={920}>
<ThemedEditor
theme="manuscript"
caption="A · Manuscript"
density={tweaks.density}
markupStyle={tweaks.markupStyle}
diagramStyle={tweaks.diagramStyle}
presence={tweaks.presence}
/>
</DCArtboard>
<DCArtboard id="foundry" label="B · Foundry — dark IDE, amber + teal. For PMs who think like engineers." width={1480} height={920}>
<ThemedEditor
theme="foundry"
caption="B · Foundry"
density={tweaks.density}
markupStyle={tweaks.markupStyle}
diagramStyle={tweaks.diagramStyle}
presence={tweaks.presence}
/>
</DCArtboard>
<DCArtboard id="atelier" label="C · Atelier — off-white, sage + rust, Fraunces display. Crafted, opinionated." width={1480} height={920}>
<ThemedEditor
theme="atelier"
caption="C · Atelier"
density={tweaks.density}
markupStyle={tweaks.markupStyle}
diagramStyle={tweaks.diagramStyle}
presence={tweaks.presence}
/>
</DCArtboard>
</DCSection>
<DCSection
id="seed"
title="Seed idea formation"
subtitle="Onboarding — Socrates interviews the PM and a seed model emerges in the left rail."
>
<DCArtboard id="seed-manuscript" label="A · Manuscript" width={1480} height={920}>
<ThemedSeed theme="manuscript" caption="A · Manuscript" />
</DCArtboard>
<DCArtboard id="seed-foundry" label="B · Foundry" width={1480} height={920}>
<ThemedSeed theme="foundry" caption="B · Foundry" />
</DCArtboard>
<DCArtboard id="seed-atelier" label="C · Atelier" width={1480} height={920}>
<ThemedSeed theme="atelier" caption="C · Atelier" />
</DCArtboard>
</DCSection>
</DesignCanvas>
<TweaksPanel title="Tweaks">
<TweakSection label="Diagram" />
<TweakRadio
label="Block style"
value={tweaks.diagramStyle}
onChange={(v) => setTweak('diagramStyle', v)}
options={[
{ value: 'softened', label: 'Soft' },
{ value: 'formal', label: 'Formal' },
{ value: 'graph', label: 'Graph' },
]}
/>
<TweakSection label="Density" />
<TweakRadio
label="Layout"
value={tweaks.density}
onChange={(v) => setTweak('density', v)}
options={[
{ value: 'comfortable', label: 'Comfortable' },
{ value: 'compact', label: 'Compact' },
]}
/>
<TweakSection label="Markup rendering" />
<TweakSelect
label="In-text markup"
value={tweaks.markupStyle}
onChange={(v) => setTweak('markupStyle', v)}
options={[
{ value: 'pill', label: 'Pill (muted chip)' },
{ value: 'color', label: 'Color-coded by type' },
{ value: 'underline', label: 'Underline + glyph' },
{ value: 'bracket', label: 'Bracket syntax (dimmed)' },
]}
/>
<TweakSection label="Socrates presence" />
<TweakRadio
label="Dock"
value={tweaks.presence}
onChange={(v) => setTweak('presence', v)}
options={[
{ value: 'subtle', label: 'Subtle' },
{ value: 'default', label: 'Default' },
{ value: 'prominent', label: 'Prominent' },
]}
/>
</TweaksPanel>
</>
);
}
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<App />);
</script>
</body>
</html>