feat: add neutral architecture overview beat
This commit is contained in:
@@ -162,7 +162,7 @@ visual hierarchy, chat mode, evidence mode, and fallback route.
|
|||||||
|
|
||||||
- Title: `http://127.0.0.1:5173/present#scene/thesis/title`
|
- Title: `http://127.0.0.1:5173/present#scene/thesis/title`
|
||||||
- Positioning: `http://127.0.0.1:5173/present#scene/positioning/landscape`
|
- Positioning: `http://127.0.0.1:5173/present#scene/positioning/landscape`
|
||||||
- Architecture root: `http://127.0.0.1:5173/present#scene/architecture/client`
|
- Architecture root: `http://127.0.0.1:5173/present#scene/architecture/overview`
|
||||||
- Runtime providers:
|
- Runtime providers:
|
||||||
`http://127.0.0.1:5173/present#scene/architecture/runtime/focus/runtime-providers`
|
`http://127.0.0.1:5173/present#scene/architecture/runtime/focus/runtime-providers`
|
||||||
- NodeUse:
|
- NodeUse:
|
||||||
|
|||||||
@@ -92,13 +92,13 @@ Keep Scene 5 conceptual. Scene 9 applies this vocabulary to the prepared example
|
|||||||
|
|
||||||
### Scene 6: Zoom through the implemented architecture
|
### Scene 6: Zoom through the implemented architecture
|
||||||
|
|
||||||
**Route:** `architecture/client`, `architecture/api`, `architecture/runtime`, then `architecture/node-use`
|
**Route:** `architecture/overview`, `architecture/client`, `architecture/api`, `architecture/runtime`, then `architecture/node-use`<br>
|
||||||
**Time:** 3:55-4:50
|
**Time:** 3:55-4:50
|
||||||
**Evidence:** Supported
|
**Evidence:** Supported
|
||||||
|
|
||||||
Say:
|
Say:
|
||||||
|
|
||||||
> Human operators and external agents enter through the same public lifecycle surface. WorkflowApi owns lifecycle operations; JSON-RPC adapts requests without owning domain behavior. WorkflowServer composes records, provider-neutral capabilities, WorkflowApi, and the execution kernel; provider behavior remains outside the core. A NodeUse resolves bindings, invokes its NodeDef handler, reduces output into state, appends a trace frame, and routes the outcome.
|
> First, the implemented architecture spine and its ownership boundaries. Humans and agents share one public lifecycle surface. WorkflowApi owns lifecycle operations; JSON-RPC only adapts transport. WorkflowServer composes records, capabilities, API, and kernel; providers remain outside the core. NodeUse invokes a NodeDef handler, reduces state, records trace, and routes the declared outcome.
|
||||||
|
|
||||||
The NodeUse sequence is documented in the thesis runtime diagram and narrative ([lines 706-750](../thesis/system-design-implementation.md#workflow-core-model)).
|
The NodeUse sequence is documented in the thesis runtime diagram and narrative ([lines 706-750](../thesis/system-design-implementation.md#workflow-core-model)).
|
||||||
|
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ can be shown after selecting replay with the runbook's session-storage switch.
|
|||||||
| `lifecycle/artifact` | Artifact is an immutable workflow definition. | Lifecycle stage: Artifact | State transition strip | hidden | replay-only; Thesis Workflow Lifecycle | `lifecycle/artifact` |
|
| `lifecycle/artifact` | Artifact is an immutable workflow definition. | Lifecycle stage: Artifact | State transition strip | hidden | replay-only; Thesis Workflow Lifecycle | `lifecycle/artifact` |
|
||||||
| `lifecycle/deployment` | Deployment binds an artifact version to concrete sources and runtime context. | Lifecycle stage: Deployment | Binding relationship | hidden | replay-only; Thesis Workflow Lifecycle | `lifecycle/deployment` |
|
| `lifecycle/deployment` | Deployment binds an artifact version to concrete sources and runtime context. | Lifecycle stage: Deployment | Binding relationship | hidden | replay-only; Thesis Workflow Lifecycle | `lifecycle/deployment` |
|
||||||
| `lifecycle/run` | Run records one execution, including status, diagnostics, output, trace, and an explicit stopped or interrupted state. | Lifecycle stage: Run | Evidence record chain | hidden | replay-only; Thesis Workflow Lifecycle | `lifecycle/run` |
|
| `lifecycle/run` | Run records one execution, including status, diagnostics, output, trace, and an explicit stopped or interrupted state. | Lifecycle stage: Run | Evidence record chain | hidden | replay-only; Thesis Workflow Lifecycle | `lifecycle/run` |
|
||||||
|
| `architecture/overview` | The implemented system separates its public surface, lifecycle records, provider boundary, and execution kernel. | Neutral architecture spine | System architecture figure | hidden | replay-only; Thesis System Architecture; `docs/project_map.md`; `docs/source_architecture.md` | `architecture/overview` |
|
||||||
| `architecture/client` | Human and agent clients use the same public lifecycle operations. | Architecture client node | System architecture figure | hidden | replay-only; Thesis System Architecture; `docs/project_map.md`; `docs/source_architecture.md` | `architecture/client` |
|
| `architecture/client` | Human and agent clients use the same public lifecycle operations. | Architecture client node | System architecture figure | hidden | replay-only; Thesis System Architecture; `docs/project_map.md`; `docs/source_architecture.md` | `architecture/client` |
|
||||||
| `architecture/api` | JSON-RPC handles transport concerns and delegates to WorkflowApi rather than owning domain behavior. | Architecture API node | Client operations | hidden | replay-only; Thesis System Architecture; `docs/project_map.md`; `docs/source_architecture.md` | `architecture/api` |
|
| `architecture/api` | JSON-RPC handles transport concerns and delegates to WorkflowApi rather than owning domain behavior. | Architecture API node | Client operations | hidden | replay-only; Thesis System Architecture; `docs/project_map.md`; `docs/source_architecture.md` | `architecture/api` |
|
||||||
| `architecture/runtime` | Server composition supplies stores, provider projections, and the runtime while the core remains independent of MCP and Python behavior. | Runtime/providers focus | Architecture overview | hidden | replay-only; Thesis System Architecture; `docs/project_map.md`; `docs/source_architecture.md` | `architecture/runtime` |
|
| `architecture/runtime` | Server composition supplies stores, provider projections, and the runtime while the core remains independent of MCP and Python behavior. | Runtime/providers focus | Architecture overview | hidden | replay-only; Thesis System Architecture; `docs/project_map.md`; `docs/source_architecture.md` | `architecture/runtime` |
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
Open each URL in a browser at 100% zoom, 1280x720 viewport:
|
Open each URL in a browser at 100% zoom, 1280x720 viewport:
|
||||||
|
|
||||||
1. **Scene 6 root**: `http://127.0.0.1:5173/present#scene/architecture/client`
|
1. **Scene 6 root**: `http://127.0.0.1:5173/present#scene/architecture/overview`
|
||||||
2. **Scene 6 runtime**: `http://127.0.0.1:5173/present#scene/architecture/runtime/focus/runtime-providers`
|
2. **Scene 6 runtime**: `http://127.0.0.1:5173/present#scene/architecture/runtime/focus/runtime-providers`
|
||||||
3. **Scene 6 providers**: `http://127.0.0.1:5173/present#scene/architecture/runtime/focus/runtime-providers/configured-providers`
|
3. **Scene 6 providers**: `http://127.0.0.1:5173/present#scene/architecture/runtime/focus/runtime-providers/configured-providers`
|
||||||
4. **Console**: `http://127.0.0.1:5173/console`
|
4. **Console**: `http://127.0.0.1:5173/console`
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
{"sceneId":"lifecycle","beatId":"artifact","route":"lifecycle/artifact","fileStem":"05-lifecycle-artifact"},
|
{"sceneId":"lifecycle","beatId":"artifact","route":"lifecycle/artifact","fileStem":"05-lifecycle-artifact"},
|
||||||
{"sceneId":"lifecycle","beatId":"deployment","route":"lifecycle/deployment","fileStem":"05-lifecycle-deployment"},
|
{"sceneId":"lifecycle","beatId":"deployment","route":"lifecycle/deployment","fileStem":"05-lifecycle-deployment"},
|
||||||
{"sceneId":"lifecycle","beatId":"run","route":"lifecycle/run","fileStem":"05-lifecycle-run"},
|
{"sceneId":"lifecycle","beatId":"run","route":"lifecycle/run","fileStem":"05-lifecycle-run"},
|
||||||
|
{"sceneId":"architecture","beatId":"overview","route":"architecture/overview","fileStem":"06-architecture-overview"},
|
||||||
{"sceneId":"architecture","beatId":"client","route":"architecture/client","fileStem":"06-architecture-client"},
|
{"sceneId":"architecture","beatId":"client","route":"architecture/client","fileStem":"06-architecture-client"},
|
||||||
{"sceneId":"architecture","beatId":"api","route":"architecture/api","fileStem":"06-architecture-api"},
|
{"sceneId":"architecture","beatId":"api","route":"architecture/api","fileStem":"06-architecture-api"},
|
||||||
{"sceneId":"architecture","beatId":"runtime","route":"architecture/runtime","fileStem":"06-architecture-runtime"},
|
{"sceneId":"architecture","beatId":"runtime","route":"architecture/runtime","fileStem":"06-architecture-runtime"},
|
||||||
|
|||||||
@@ -75,6 +75,7 @@ afterEach(() => {
|
|||||||
describe("PresentationRoute", () => {
|
describe("PresentationRoute", () => {
|
||||||
const directHashRoutes = [
|
const directHashRoutes = [
|
||||||
{ hash: "#scene/thesis/title", heading: "Design and Implementation of lda.chat", hasDemoChrome: false },
|
{ hash: "#scene/thesis/title", heading: "Design and Implementation of lda.chat", hasDemoChrome: false },
|
||||||
|
{ hash: "#scene/architecture/overview", heading: "Architecture Zoom", hasDemoChrome: false },
|
||||||
{ hash: "#scene/architecture/client", heading: "Architecture Zoom", hasDemoChrome: false },
|
{ hash: "#scene/architecture/client", heading: "Architecture Zoom", hasDemoChrome: false },
|
||||||
{ hash: "#scene/authoring/diagnose", heading: "Author, Validate, Repair", hasDemoChrome: false },
|
{ hash: "#scene/authoring/diagnose", heading: "Author, Validate, Repair", hasDemoChrome: false },
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -148,6 +148,7 @@ const beatContracts = {
|
|||||||
"thesis/substrate": { mode: "split", primarySurface: "opening-decomposition", supportSurface: "none" },
|
"thesis/substrate": { mode: "split", primarySurface: "opening-decomposition", supportSurface: "none" },
|
||||||
"problem/direct-actions": { mode: "split", primarySurface: "tool-loop-transcript", supportSurface: "workflow-blueprint" },
|
"problem/direct-actions": { mode: "split", primarySurface: "tool-loop-transcript", supportSurface: "workflow-blueprint" },
|
||||||
"problem/missing-contracts": { mode: "split", primarySurface: "workflow-blueprint", supportSurface: "tool-loop-transcript" },
|
"problem/missing-contracts": { mode: "split", primarySurface: "workflow-blueprint", supportSurface: "tool-loop-transcript" },
|
||||||
|
"architecture/overview": { mode: "focal", primarySurface: "interactive-architecture", supportSurface: "none" },
|
||||||
"architecture/client": { mode: "zoom", primarySurface: "interactive-architecture", supportSurface: "none" },
|
"architecture/client": { mode: "zoom", primarySurface: "interactive-architecture", supportSurface: "none" },
|
||||||
"architecture/api": { mode: "zoom", primarySurface: "interactive-architecture", supportSurface: "none" },
|
"architecture/api": { mode: "zoom", primarySurface: "interactive-architecture", supportSurface: "none" },
|
||||||
"architecture/runtime": { mode: "zoom", primarySurface: "interactive-architecture", supportSurface: "none" },
|
"architecture/runtime": { mode: "zoom", primarySurface: "interactive-architecture", supportSurface: "none" },
|
||||||
|
|||||||
@@ -368,7 +368,7 @@
|
|||||||
|
|
||||||
.architecture-scene .interactive-figure:has(.figure-node[data-active="true"])
|
.architecture-scene .interactive-figure:has(.figure-node[data-active="true"])
|
||||||
.figure-node:not([data-active="true"]) {
|
.figure-node:not([data-active="true"]) {
|
||||||
opacity: 0.48;
|
opacity: 0.76;
|
||||||
}
|
}
|
||||||
|
|
||||||
.architecture-scene .figure-node[data-active="true"] {
|
.architecture-scene .figure-node[data-active="true"] {
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ describe("PresenterRoute", () => {
|
|||||||
expect(screen.getByRole("main", { name: /lda.chat presenter notes/i })).toBeInTheDocument();
|
expect(screen.getByRole("main", { name: /lda.chat presenter notes/i })).toBeInTheDocument();
|
||||||
expect(screen.getByText(/This project began with the goal/i)).toBeInTheDocument();
|
expect(screen.getByText(/This project began with the goal/i)).toBeInTheDocument();
|
||||||
expect(screen.getByText("the system underneath the chat").tagName).toBe("STRONG");
|
expect(screen.getByText("the system underneath the chat").tagName).toBe("STRONG");
|
||||||
expect(screen.getByRole("navigation", { name: /presenter note navigation/i })).toHaveTextContent("1 / 42");
|
expect(screen.getByRole("navigation", { name: /presenter note navigation/i })).toHaveTextContent("1 / 43");
|
||||||
expect(screen.getByRole("link", { name: "Next →" })).toHaveAttribute("href", "#scene/thesis/substrate");
|
expect(screen.getByRole("link", { name: "Next →" })).toHaveAttribute("href", "#scene/thesis/substrate");
|
||||||
expect(screen.getByRole("link", { name: /open audience slide/i })).toHaveAttribute("href", "/present#scene/thesis/title");
|
expect(screen.getByRole("link", { name: /open audience slide/i })).toHaveAttribute("href", "/present#scene/thesis/title");
|
||||||
expect(screen.queryByText(/live target/i)).not.toBeInTheDocument();
|
expect(screen.queryByText(/live target/i)).not.toBeInTheDocument();
|
||||||
|
|||||||
@@ -154,34 +154,41 @@ export const presenterNotes = [
|
|||||||
["Thesis Workflow Lifecycle"],
|
["Thesis Workflow Lifecycle"],
|
||||||
{ qnaBranchIds: ["lifecycle-states", "run-persistence"] },
|
{ qnaBranchIds: ["lifecycle-states", "run-persistence"] },
|
||||||
),
|
),
|
||||||
|
beatNote(
|
||||||
|
"architecture",
|
||||||
|
"overview",
|
||||||
|
7,
|
||||||
|
"First, the **implemented architecture spine** and its ownership boundaries.",
|
||||||
|
["Thesis System Architecture", "docs/project_map.md"],
|
||||||
|
),
|
||||||
beatNote(
|
beatNote(
|
||||||
"architecture",
|
"architecture",
|
||||||
"client",
|
"client",
|
||||||
13,
|
10,
|
||||||
"Human operators and external agents enter through **the same public lifecycle surface**.",
|
"Humans and agents share **one public lifecycle surface**.",
|
||||||
["Thesis System Architecture", "docs/project_map.md"],
|
["Thesis System Architecture", "docs/project_map.md"],
|
||||||
),
|
),
|
||||||
beatNote(
|
beatNote(
|
||||||
"architecture",
|
"architecture",
|
||||||
"api",
|
"api",
|
||||||
13,
|
11,
|
||||||
"**WorkflowApi owns lifecycle operations**; JSON-RPC adapts requests without owning domain behavior.",
|
"WorkflowApi owns lifecycle operations; **JSON-RPC only adapts transport**.",
|
||||||
["Thesis System Architecture", "docs/source_architecture.md"],
|
["Thesis System Architecture", "docs/source_architecture.md"],
|
||||||
{ qnaBranchIds: ["not-just-cli"] },
|
{ qnaBranchIds: ["not-just-cli"] },
|
||||||
),
|
),
|
||||||
beatNote(
|
beatNote(
|
||||||
"architecture",
|
"architecture",
|
||||||
"runtime",
|
"runtime",
|
||||||
14,
|
13,
|
||||||
"**WorkflowServer composes records, provider-neutral capabilities, WorkflowApi, and the execution kernel**; provider behavior remains outside the core.",
|
"WorkflowServer composes **records, capabilities, API, and kernel**; providers remain outside the core.",
|
||||||
["Thesis System Architecture", "docs/source_architecture.md"],
|
["Thesis System Architecture", "docs/source_architecture.md"],
|
||||||
{ qnaBranchIds: ["provider-security"] },
|
{ qnaBranchIds: ["provider-security"] },
|
||||||
),
|
),
|
||||||
beatNote(
|
beatNote(
|
||||||
"architecture",
|
"architecture",
|
||||||
"node-use",
|
"node-use",
|
||||||
15,
|
14,
|
||||||
"A NodeUse resolves bindings, **invokes its NodeDef handler**, reduces output into state, appends a trace frame, and routes the outcome.",
|
"NodeUse **invokes a NodeDef handler**, reduces state, records trace, and routes the declared outcome.",
|
||||||
["Thesis Workflow Core Model"],
|
["Thesis Workflow Core Model"],
|
||||||
),
|
),
|
||||||
beatNote(
|
beatNote(
|
||||||
|
|||||||
@@ -71,6 +71,17 @@ const renderArchitecture = (overrides: Partial<React.ComponentProps<typeof Archi
|
|||||||
afterEach(() => cleanup());
|
afterEach(() => cleanup());
|
||||||
|
|
||||||
describe("ArchitectureScene", () => {
|
describe("ArchitectureScene", () => {
|
||||||
|
it("keeps the overview beat neutral so the entire spine remains readable", () => {
|
||||||
|
renderArchitecture({
|
||||||
|
beat: { ...mockBeat, id: "overview" },
|
||||||
|
focusPath: [],
|
||||||
|
activeNodeId: null,
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(screen.getByTestId("architecture-scene")).toHaveAttribute("data-architecture-beat", "overview");
|
||||||
|
expect(document.querySelector('.figure-node[data-active="true"]')).toBeNull();
|
||||||
|
});
|
||||||
|
|
||||||
it("renders the architecture spine and expands the capability boundary", () => {
|
it("renders the architecture spine and expands the capability boundary", () => {
|
||||||
const onFocusPathChange = vi.fn();
|
const onFocusPathChange = vi.fn();
|
||||||
renderArchitecture({ focusPath: [], onFocusPathChange });
|
renderArchitecture({ focusPath: [], onFocusPathChange });
|
||||||
|
|||||||
@@ -132,6 +132,7 @@ export const mainScenes = defineScenes([
|
|||||||
evidencePointer: "Thesis System Architecture; docs/project_map.md; docs/source_architecture.md",
|
evidencePointer: "Thesis System Architecture; docs/project_map.md; docs/source_architecture.md",
|
||||||
view: "architecture",
|
view: "architecture",
|
||||||
beats: [
|
beats: [
|
||||||
|
sceneBeat("overview", "Architecture spine", "The implemented system separates its public surface, lifecycle records, provider boundary, and execution kernel.", { figure: { catalogId: "system-architecture", focusPath: [], activeNodeId: null } }),
|
||||||
sceneBeat("client", "Client operations", "Human and agent clients use the same public lifecycle surface.", { figure: { catalogId: "system-architecture", focusPath: [], activeNodeId: "client-operations" } }),
|
sceneBeat("client", "Client operations", "Human and agent clients use the same public lifecycle surface.", { figure: { catalogId: "system-architecture", focusPath: [], activeNodeId: "client-operations" } }),
|
||||||
sceneBeat("api", "Transport and API", "JSON-RPC reaches WorkflowApi without owning domain behavior.", { figure: { catalogId: "system-architecture", focusPath: ["application-lifecycle"], activeNodeId: "workflow-api-boundary" } }),
|
sceneBeat("api", "Transport and API", "JSON-RPC reaches WorkflowApi without owning domain behavior.", { figure: { catalogId: "system-architecture", focusPath: ["application-lifecycle"], activeNodeId: "workflow-api-boundary" } }),
|
||||||
sceneBeat("runtime", "Runtime and providers", "The runtime resolves provider-neutral capabilities and stores lifecycle records.", { figure: { catalogId: "system-architecture", focusPath: ["runtime-providers"], activeNodeId: "configured-providers" } }),
|
sceneBeat("runtime", "Runtime and providers", "The runtime resolves provider-neutral capabilities and stores lifecycle records.", { figure: { catalogId: "system-architecture", focusPath: ["runtime-providers"], activeNodeId: "configured-providers" } }),
|
||||||
|
|||||||
Reference in New Issue
Block a user