re-sync and add notes about server refactor#277
Conversation
Signed-off-by: Lu Nelson <ln@hash.ai>
Signed-off-by: Lu Nelson <ln@hash.ai>
Amp-Thread-ID: https://ampcode.com/threads/T-019e3a39-ed43-7738-ba68-5ed42148be9a Co-authored-by: Amp <amp@ampcode.com>
Amp-Thread-ID: https://ampcode.com/threads/T-019e3a39-ed43-7738-ba68-5ed42148be9a Co-authored-by: Amp <amp@ampcode.com>
Amp-Thread-ID: https://ampcode.com/threads/T-019e3a39-ed43-7738-ba68-5ed42148be9a Co-authored-by: Amp <amp@ampcode.com>
Amp-Thread-ID: https://ampcode.com/threads/T-019e3a39-ed43-7738-ba68-5ed42148be9a Co-authored-by: Amp <amp@ampcode.com>
Amp-Thread-ID: https://ampcode.com/threads/T-019e3a39-ed43-7738-ba68-5ed42148be9a Co-authored-by: Amp <amp@ampcode.com>
Amp-Thread-ID: https://ampcode.com/threads/T-019e4462-0fbc-7552-8dd2-825eaba27afb Co-authored-by: Amp <amp@ampcode.com>
Move legacy design, reference, schema, prototypes, and superseded next/ architecture notes to archive/. Move pre-POC SPEC.md, PLAN.md, and SERVER_REFACTOR_NOTES.md to archive/memory/ in preparation for fresh POC-targeted memory reset. Retain docs/design/BEHAVIORAL_KERNELS.md as canonical input to the POC oracle plane. Amp-Thread-ID: https://ampcode.com/threads/T-019e4462-0fbc-7552-8dd2-825eaba27afb Co-authored-by: Amp <amp@ampcode.com>
Delete src/, drizzle/, bin/, scripts/agent-probes/, public/, .ladle/, and all build/runtime config (package.json, tsconfig.json, vite, drizzle, docker, oxlint/oxfmt, etc.) in preparation for a fresh POC scaffold built thinly over pi-coding-agent. Skills, agent harness configs, praxis docs, and the three canonical POC architecture docs remain. Amp-Thread-ID: https://ampcode.com/threads/T-019e4462-0fbc-7552-8dd2-825eaba27afb Co-authored-by: Amp <amp@ampcode.com>
SPEC.md establishes product contract, capability requirements, assumptions A1-L through A10-L, decisions D1-L through D14-L, invariants I1-L through I10-L, future direction register, lexicon, and verification stance — anchored on the three canonical POC architecture docs. PLAN.md sequences M0-M9 from the PRD as stable-id frontier items on the active/next/horizon ladder, plus brief-library-curation and fixture-strategy-evolution as parallel low-conflict work. walking-skeleton is the single active frontier and absorbs Phase-3 infra bootstrap. Amp-Thread-ID: https://ampcode.com/threads/T-019e4462-0fbc-7552-8dd2-825eaba27afb Co-authored-by: Amp <amp@ampcode.com>
Minimal Node/TS scaffold over @earendil-works/pi-coding-agent: - package.json: pi-coding-agent dep, tsx/vitest/oxlint/oxfmt dev deps, scripts (fix/check/verify) per AGENTS.md verification harness - tsconfig.json: strict NodeNext targeting src/ - .oxlintrc.json, .oxfmtrc.json: minimal configs scoped to src/ - src/brunch.ts: walking-skeleton entrypoint stub that proves the pi-coding-agent import chain resolves end-to-end - src/brunch.smoke.test.ts: vitest smoke proving createAgentSession and SessionManager are present in the pi import surface - .brunch-fixtures/README.md: home of curated briefs and captured runs per docs/next/architecture/brunch-poc-fixture-strategy.md - docs/next/README.md: rewritten to point at the three canonical POC docs, memory/SPEC.md + PLAN.md, .brunch-fixtures/, BEHAVIORAL_KERNELS, and the praxis docs. Verified: npm run verify (fmt:check + lint + test + build) green. Amp-Thread-ID: https://ampcode.com/threads/T-019e4462-0fbc-7552-8dd2-825eaba27afb Co-authored-by: Amp <amp@ampcode.com>
.tours/ contained three codetours describing the old client refactor (progressive rendering boundaries, workspace controller, mutation boundaries) — all referencing deleted src/client and src/server code. config/ contained four Vite plugin configs (vite-client, vite-dev-server, vite-react-scan, vite-server-runtime) tied to the removed React + Vite + TanStack stack. Amp-Thread-ID: https://ampcode.com/threads/T-019e4462-0fbc-7552-8dd2-825eaba27afb Co-authored-by: Amp <amp@ampcode.com>
The docs/next/ subtree predates the next-baseline rebase; with the pre-POC line archived, the 'next' sublabel no longer carries meaning. Flatten: docs/next/README.md -> docs/README.md docs/next/architecture/brunch-poc-architecture-prd.md -> docs/architecture/prd.md docs/next/architecture/brunch-poc-pi-seam-extensions.md -> docs/architecture/pi-seam-extensions.md docs/next/architecture/brunch-poc-fixture-strategy.md -> docs/architecture/fixture-strategy.md docs/next/architecture/artifacts/ -> docs/architecture/artifacts/ Update all cross-references in the moved docs, memory/SPEC.md, memory/PLAN.md, and .brunch-fixtures/README.md. Rewrite stale hashintel/brunch/ absolute paths in prd.md to brunch-next/, and point SPEC_WORKSPACE_GRAPHS.md references at archive/ where the file now lives. Verified: npm run verify green. Amp-Thread-ID: https://ampcode.com/threads/T-019e4462-0fbc-7552-8dd2-825eaba27afb Co-authored-by: Amp <amp@ampcode.com>
Amp-Thread-ID: https://ampcode.com/threads/T-019e44e3-7a5e-70ed-9623-2376c822373f Co-authored-by: Amp <amp@ampcode.com>
* Scope sidecar live-driver authority * Render band-filtered graph slices by requested band * Record sidecar authority invariant * sync pass * Characterize request_answer answer sources * Prefer broker for request_answer * Use protocol JSON-RPC response type in web-driver tests * Extract web-driver streaming test support
* Scope sidecar live-driver authority * Render band-filtered graph slices by requested band * Record sidecar authority invariant * sync pass * Characterize request_answer answer sources * Prefer broker for request_answer * Use protocol JSON-RPC response type in web-driver tests * Extract web-driver streaming test support * FE-xxx: add VirtualTerminal harness + workspace-dialog preflight viewport proof * FE-xxx: add runtime-axis-picker harness integration test Proves the VirtualTerminal harness generalizes beyond workspace-dialog preflight by driving the runtime strategy picker through a real pi-tui TUI overlay: focus set, arrow/hjkl cycling visible in getViewport(), Enter commit, and Esc cancel all route through terminal.sendInput. Also repairs the invalid JSON escape (\; -> \\;) introduced in the Card 1 package.json edit, which blocked npm/rolldown parsing. * FE-xxx: add .pi/components topology README Documents the fractal sub-tree organization, dependency direction, layout sketch, and the two-tier test convention (direct-render + VirtualTerminal harness integration) for Pi TUI components. Retires the tooling scope file now that Cards 1–3 are complete. * Tighten virtual terminal render idle wait * docs: correct pi components topology README
…235) * plan: file D85-L prompt-resource axis model + FE-861 capture oracle design SPEC: - D85-L — Brunch prompt-resource axis model: two AUTO axes (strategy, lens), goal inlined into the elicitor role, propose-graph/project-graph re-filed as graph-write methods, capture skill owns gap-reflection conduct, fossil correction (capture_*/tool_meta/candidate refs are live-or-stubbed seams, not removable). Refined-by back-pointers on D25/D40/D58/D59. - D85-L still-open: agent-definition convention (.pi/agents/<agent>/SYSTEM.md + references/, [sub] marker) as the agent-layer twin of the SKILL.md shape; elicitor is the only live agent definition, rest are stubs. - §Verification Design: capture commitment-gradient routing gate (false-commit guard, deterministic) + sweep-watermark property; two new blind spots (contradiction->recon-need outlet, classification/dedup quality); I30-L repointed to the FE-861 forward oracle. PLAN: - new frontier prompt-skill-consolidation (earned, materializes D85-L); absorbs elicitation-gap-guidance (a); hard-blocks generalized-capture's capture-skill home; soft-coordinates with runtime-vocab-leaf. - FE-861 Verification line rewritten to the lean oracle design. * prompt: compose elicitor system body * spec: record agent-body base-prompt finding from slice 1 - D58-L: Brunch's composed block (now led by the agent SYSTEM.md body) is appended to Pi's base coding-agent prompt, so a foreground agent augments rather than replaces it; replace-vs-augment is open, tied to future pi-coder. - PLAN: refresh prompt-skill-consolidation execution pointer — slice 1 landed (7537c05); next slice = relocate reviewer + stub pi-coder/SYSTEM.md, then goal-axis drop + posture inline (grill R1-R5 stack on this foundation). * test: regenerate compose previews to match renderer (drop trailing newline) * prompt: relocate reviewer + stub pi-coder under <agent>/SYSTEM.md convention * plan: assign prompt-skill-consolidation to FE-893 + branch * prompt: drop runtime goal axis; inline elicitor objective postures (D85-L) * prompt: collapse graph-write off strategy axis; add methods/capture home (D85-L)
…false-commit guard (#236) * FE-861: land capture commitment gradient gate * FE-861: land capture sweep watermark window (D80-L) * plan: archive done frontiers, demote standing obligations, collect residue into alpha-hardening; retire validated A28-L/A29-L * FE-861: retire submit-time capture fossil (D80-L) * Register web tools in Brunch profile * Add D82 acquisition mode resources * Seed D82 situating gap * FE-861: reconcile PLAN for D82 acquisition/digest/situating landed D82-L acquisition modes (ea54122) + situating gap (6d4c8a7) landed; split subagent-adoption into its own frontier; scope file retired. Remaining FE-861 work (false-commit matrix, reconciliation_need outlet) continues on a fresh stacked branch.
* Add all-seeds seed fixture mode * Add session runtime vocab leaf * package formatting reversion * Close prompt-shape hardening residue * Delete dead runtime-vocab re-export facade; collapse seed run-loop ln-judo-review found two code-judo moves left by the alpha-hardening residue commits: - src/session/runtime-state.ts carried ~18 lines of re-exports that no consumer imports (every axis-vocab consumer already imports from the leaf). The build surfaced six consumers the review grep missed (axis-picker, two picker tests, commands/index, chrome/index, agent-context-seed); redirect them to schema/kinds.js, then delete the facade and trim the internal import to the seven body-used symbols. Reinforces D73-L: the leaf is the unambiguous single source. - src/graph/seed-fixtures.ts had single/all branches each spelling readSelectedSeed → seedFixture → stdout. Collapse to one seeding path; preserves identical stdout, --reset semantics, and the all-seeds summary. Net -28 lines. npm run verify green (124 files, 941 tests). * Record FE-897 alpha hardening tracker
…false-commit guard (#238) * plan: ln-sync — archive done alpha-hardening (FE-897), compress capture diary - Archive FE-897 alpha-hardening done def to PLAN_HISTORY 2026-06-19 section - Compress generalized-capture execution pointer (slice diary -> landed/remaining) - Remove exhausted core-tools-adoption bullet; reduce elicitation-gap-guidance to open item - Move alpha-hardening to dependency done-anchors block * scope: agentskills topology/format realignment (new frontier) Adopt Agent Skills standard topology (skills/<family>/<name>/SKILL.md + frontmatter) by reusing pi's loadSkills/formatSkillsForPrompt over a code-owned skillPaths list; file-owned description, code-owned path set, D39-L sealing preserved. New frontier (reverses D85-L deferral); needs ln-plan + Linear issue + branch at pickup. * FE-861: contradiction -> reconciliation_need outlet Add read_reconciliation_needs / update_reconciliation_needs (create/resolve) over the existing CommandExecutor recon-need substrate; register in the sealed profile; legal in elicit posture (read on read-context, write on capture). Repair the latent update_elicitation_gaps legality gap in the same seam. Capture gradient gains the contradiction outlet (semantic_conflict over the conflicting node_pair), distinct from gap-spawn, anti-shadowing prose + shared {specId,lsn} clock. Deterministic routing gate + tool-boundary create/resolve fail-loud + posture-legality tests. SPEC I30-L / PLAN reconciled. * fix: regenerate specification-context golden (drop stale trailing newline) Unrelated pre-existing snapshot drift on the renderer-golden surface (FE-870); golden now matches the renderer's EOF output. Whitespace-only. * split the pi-coder SYSTEM.md from the documentation about it * scope: FE-861 false-commit scenario-matrix completeness (light) Re-aim the closed capture-quality-spike family from binary shouldCommit to the D81-L gradient outcome; every scenario class gets a deterministic regression guard through the real adapters; probe stays fitness. * plan: register prompt-skill-topology frontier; FE-861 matrix in-flight + tie-off - generalized-capture execution pointer: matrix scoped/in-flight; on land FE-861 is complete -> tie off; next frontier is prompt-skill-topology - add prompt-skill-topology frontier def + Parallel/Low-conflict pointer + dependency node/edges (reverses the D85-L SKILL.md-shape deferral) * plan: assign FE-898 to prompt-skill-topology; branch on clean FE-861 tip * Complete capture false-commit matrix * test: reconcile pi-coder agent-body needles to the 5eb0ece rewrite pi-coder/SYSTEM.md is now a brunch coding-agent body (heading dropped, 'inside pi' -> 'inside *brunch*'); architecture agent-body check asserts the new opening identity + a guideline phrase instead of the stale needles.
…245) * fix: harden acquisition and subagent boundaries * FE-898: Align prompt skills to Agent Skills topology * sync delta
…#247) * first skill repasses Signed-off-by: Lu Nelson <ln@hash.ai> * skills pass 2 Signed-off-by: Lu Nelson <ln@hash.ai> * thinning/activating pass, based on dev- review Signed-off-by: Lu Nelson <ln@hash.ai> * distill ln-* skill system per meta-skill-design audit C: fold neighbour disambiguators into 6 confusable descriptions (review↔witness, spike↔prototype, grill→disambiguate, consult verb-led). B: disclose branch-specific machinery behind pointers — ln-scope slices/sweep modes, ln-build sliced/sweep execution, ln-review contract-lens catalog — into references/ (ln-scope 393→337, ln-build 255→202, ln-review 186→170 lines). Rename scope-mode chain→slices and serial-execution→sliced-execution so the slice(∃)-vs-sweep(∀) axis is named by essence, not sequencing mechanism. Preserves pseudo/reference 'chain' and SQL 'serial' senses. check:skills green. * distill AGENTS.md planning/skills to canonical pointers The ln-* flow, skill map, verification boundary, and traceability are canonical (and richer) in docs/praxis/ln-skills.md and the individual skills (ln-spec/ln-plan §Traceability). Collapse the duplicated `## planning` + `### skills` into a pointer-led `## planning & skills`, and promote the repo build harness to a top-level `## verification`. No content lost — system doctrine now has one home; AGENTS.md keeps only the repo-level summary and the canonical pointer. * posture: canonicalize dependencies axis, relocate to memory/, redesign as preset+overrides - rename sourcing→dependencies (accept|resist) across spec, plan, docs, and product code - move .pi/POSTURE.md → memory/POSTURE.md; rewrite as preset + overrides form - route full posture schema to on-demand posture skill; thin always-on globals - document product WorkspacePostureState as an independently-owned mirror of the dev vocabulary Amp-Thread-ID: https://ampcode.com/threads/T-019eef42-a71e-7617-a265-8ba643f88793 Co-authored-by: Amp <amp@ampcode.com> * topology convention: decisions are events, READMEs own current state - AGENTS.md §topology READMEs: canonical ownership-direction rule — co-located README owns current materialized state; a SPEC decision is the event (choice/rationale/supersession) + pointer, not a second copy - ln-spec: decision rows are events, not state essays (references the rule) - ln-sync: new migrate-to-co-located-home disposition + archivable-once-state-lives-elsewhere exit criterion; Document-roles README row tightened - ln-skills.md: canonical-state table gains src/**/README.md row (drift fix); Level-2 (cross-project) parameterization seam marked - SPEC: thin D7-L (retired), D19-L (→ src/rpc/README.md), D52-L (→ src/README.md) to event+pointer; all IDs and citations preserved, no state lost Amp-Thread-ID: https://ampcode.com/threads/T-019eef42-a71e-7617-a265-8ba643f88793 Co-authored-by: Amp <amp@ampcode.com> * spec: thin 14 Active Decision essays to event+pointer form Apply the topology convention (3954cad2) to the heaviest Active Decisions: each keeps its ID, title, architectural guardrails, and verbatim Depends/Refined/Supersedes trailer, but delegates materialized current-state prose to the co-located src/**/README.md (or code) that owns it via repo-relative pointers. Thinned: D37 D39 D40 D41 D49 D58 D60 D65 D66 D69 D72 D75 D76 D78. - citation trailers preserved byte-identical (verified) - restored two non-homed guardrails kept in SPEC: D40 runtime-state render rule, D60 cwd kickoff-heuristic enumeration - fixed stale brunch-next/ absolute links in D49/D75 bodies en passant - 85 decisions in, 85 out; ~22.5KB removed (345KB -> 323KB) Not thinned: D35 (TUI chrome) has no co-located chrome README home yet; flagged for a follow-up that creates src/.pi/extensions/chrome/README.md first. Amp-Thread-ID: https://ampcode.com/threads/T-019eef42-a71e-7617-a265-8ba643f88793 Co-authored-by: Amp <amp@ampcode.com> * chrome: add co-located README, thin D35-L to event+pointer Create src/.pi/extensions/chrome/README.md to own the chrome subtree's materialized current-state (state shape, footer/title/startup-header render surfaces, telemetry/refresh, status-key filtering, RPC visibility, dependency direction). Then thin D35-L to its title + architectural guardrails + verbatim trailer, pointing current-state at the new README and launch-wiring at the parent extensions README. Drift corrected while co-locating (README reflects code, not stale prose): session labels are sessionDisplayName = `${specTitle} — session ${ordinal}`, not the 'Untitled Session N' workspace-global label D35-L claimed; getGitBranch is no longer read by the footer compositor. - D35-L trailer preserved byte-identical (verified) - 85 decisions in, 85 out; check:skills OK Amp-Thread-ID: https://ampcode.com/threads/T-019eef42-a71e-7617-a265-8ba643f88793 Co-authored-by: Amp <amp@ampcode.com> * spec: repoint stale brunch-next/ absolute links to repo-relative Strip the absolute file:///…/brunch-next/ prefix from 18 links so they resolve regardless of checkout location, matching the D7/D19/D52 pointer style. All 52 repo-relative link targets in SPEC now resolve. One target (archive/docs/design/PLANNING_PERSISTENCE_MODEL.md) was deleted with archive/ and is no longer in the repo; demoted to a non-link code-span rather than leave a broken link. Amp-Thread-ID: https://ampcode.com/threads/T-019eef42-a71e-7617-a265-8ba643f88793 Co-authored-by: Amp <amp@ampcode.com> --------- Signed-off-by: Lu Nelson <ln@hash.ai> Co-authored-by: Amp <amp@ampcode.com>
* FE-811: Public-entry composition gate + anti-cheat import guard
Card 1 of poc-live-ship-gate: the first probe that drives the product
through its public CLI entrypoint instead of importing private wiring.
- ship-gate-rpc-client.ts spawns `node dist/app/brunch.js --mode rpc` and
speaks JSON-RPC over its stdio; imports no wiring modules.
- ship-gate-composition-proof.ts seeds two specs via the public
seed-fixtures CLI, then over public RPC activates each spec, reads the
selected-spec graph.overview (cross-spec isolation), and reads the
session.runtimeState posture observable; emits a durable report.
- anti-cheat-guard.test.ts fails if the gate driver imports
createRpcHandlers / createWorkspaceSessionCoordinator /
createBrunchAgentSessionRuntimeFactory.
- Real subprocess run gated behind BRUNCH_RUN_SHIP_GATE=1 + script wrapper.
Card 2 (live --mode tui runbook) intentionally not started.
* FE-811: Live ship runbook + artifact schema (Card 2 scaffolding)
Card 2 of poc-live-ship-gate, automatable half: the documented outer-loop
runbook and durable artifact schema for the live `brunch --mode tui
--open-web` proof.
- docs/architecture/poc-live-ship-runbook.md: fresh-cwd setup, public-
entry-only 8-step walkthrough, artifact schema + report.json shape,
capture commands (workspace-rpc / .brunch/debug mirrors), pass/fail rule,
and the same anti-cheat boundary as Card 1.
- .fixtures/runs/ship-gate-runbook/README.md: artifact home + required
file list; states no live evidence is captured yet.
The dated live provider run remains manual debt — Card 2 stays in progress
until that sample directory exists.
* Fix TUI request_answer source precedence
* Complete alpha-grounding seed with a foundational thesis node
The alpha-grounding fixture seeded context/goal/constraint/term but no
thesis, leaving the thesis presence gap uncovered. That kept propose-graph
in `negotiate` and withheld mutate_graph from the live elicitor — blocking
the FE-811 ship-gate runbook's capture-to-graph step.
A "grounding" fixture should carry all four intent-plane foundational
kinds. Adds an intent thesis node + a support edge to the goal.
(Layer-1 unblock only; the deeper bootstrap-gating conflict — a fresh or
foundationless spec can never reach mutate_graph — is tracked for ln-spec.)
* spec: D86-L — capability-readiness never withholds a graph-write tool
Records the decision that mutate_graph + review-set tools are floor
capabilities in elicit mode; readiness scales epistemic status, narrows
AUTO axis menus, and surfaces the establishment offer, but never removes
a graph-write tool from the active set.
Resolves the bootstrap deadlock: gating mutate_graph behind propose-graph
readiness meant a fresh/foundation-light spec could never establish its
context/thesis/goal/constraint frame (the only tool that writes those
nodes was gated on those nodes already existing). Re-asserts I31-L
against D85-L move 2's contrary gate clause.
Event+pointer form per the new convention: README current-state + code
change land in the build slice.
- D86-L added (event + pointers to projections README + runtime state.ts)
- D74-L / D85-L: forward Refined-by: D86-L notes; D85-L move 2 gate marked removed
- I31-L: explicit "never withholds a graph-write tool" clause; new oracle planned
* D86-L: floor graph-write tools — readiness never withholds mutate_graph
Decouples commit-graph / generate-proposal from the propose-graph /
project-graph capability gate in runtime state.ts: graph-write methods
drop out of METHOD_CAPABILITY, so mutate_graph + the review-set tools are
floor in elicit mode whenever gaps exist. review-for-gaps stays gated by
commitment-review (deliberate audit, grants no graph-write tool).
Resolves the bootstrap deadlock the live runbook surfaced: a fresh or
foundation-light spec could never establish its context/thesis/goal/
constraint frame because the only tool that writes those nodes was gated
on those nodes already existing. Readiness stays advisory (epistemic
scaling + establishment offer), per I31-L.
Tests inverted from the old gated behavior (they were locking in the
deadlock): state.test.ts, prompting.test.ts, operational-mode.test.ts,
authority-matrix.test.ts, compose.test.ts goldens, and the tier-2
live-boot legality test now prove mutate_graph stays floor through
negotiate. I31-L sub-claim flipped planned→covered; projections README
records the floor boundary.
Also folds in two rebase-fallout fixes in touched files: the posture
sourcing→dependencies rename (88254dc0) in compose/prompting fixtures,
and the alpha-grounding 4→5 node count in workspace-overview +
specification-context (from the thesis-node seed commit 6e2fe444).
* ln-review: graduate the circular-precondition-gate lens
ln-induct surfaced a recurring fault behind D86-L: a capability-readiness
gate whose required precondition can only be produced by the capability it
gates (bootstrap deadlock). Adds the cue to the contract-integrity catalog
with its mechanical discriminator ("does the gated action produce the
gated-on state?") that cleanly clears the false positives (audit gated on
graph truth; generative lens gated on a frame it defers creating), plus a
new repair class: floor the bootstrapping capability, keep readiness
advisory.
* D39-L: seal ambient APPEND_SYSTEM.md out of Brunch sessions
The ship-gate runbook surfaced a sealed-profile breach: the global
~/.pi/agent/APPEND_SYSTEM.md leaked into the Brunch system prompt. Pi's
resource loader resolves the append source as
`appendSystemPromptSource ?? discover()`, and brunchResourceLoaderOptions
sealed noContextFiles/noExtensions/noPromptTemplates/noSkills/noThemes but
never the append-prompt source — so Pi fell through to ambient discovery
of <cwd>/.pi/ and <agentDir>/ APPEND_SYSTEM.md.
Fix: pin `appendSystemPrompt: []` in brunchResourceLoaderOptions so the
fallback never fires. One value, no override hook (laziest rung).
Oracle: a live-loader seal test drives Pi's real DefaultResourceLoader
through Brunch's seal with a planted ambient APPEND_SYSTEM.md and asserts
getAppendSystemPrompt() stays empty — exercises the real product path, not
a mock. Verified to have teeth (catches the sentinel when the seal is
removed). The existing brunchResourceLoaderOptions toEqual guards also
gained the field, so re-omitting it fails loudly.
Reconciliation: A19-L evidence records the missed surface + falsifier;
src/.pi/README states the append seal and its oracle.
Note: captured workbench debug/system-prompt.md from the pre-fix run is
contaminated; re-capture posture artifacts after relaunch.
* fix: type present_review_set.payload at the param boundary (was z.unknown)
The live ship-gate run hit STRUCTURAL_ILLEGAL "review-set payload must be
an object": the agent passed payload as a JSON-encoded string, which
present_review_set's z.unknown() payload accepted at the tool boundary and
only failed deep in graph/review-set.ts. The opaque z.unknown() taught the
agent nothing about the required shape (and forced an unsafe cast), so it
abandoned review and fell to mutate_graph — whose ops is a typed array.
Fix: type payload as a loose object carrying the review-set discriminator
(schemaVersion: 1). A JSON string or the mutate_graph {createBasis, ops}
shape now fails at zPresentReviewSetParams.parse with a named field error,
and the model-facing JSON Schema shows {object, schemaVersion: const 1}
instead of an opaque blob. The full nested proposal shape stays owned by
validateReviewSetPayloadShape in graph/review-set.ts (single owner) — the
boundary only guarantees the discriminator, so no second source of truth.
Regression oracles drive the tool boundary with the exact bug shapes (JSON
string; mutate_graph object) and assert rejection at parse. Reconciled into
I23-L coverage note + schemas README source-boundary list.
(Diagnosed non-bugs in the same session, no change needed: present_question
→request_choice and set_disposition-on-presence-gap were correct grammar/
D65-L enforcement; the context gap's coverage:0 was a read-ordering
artifact — live derivation confirms coverage=1.)
* fix: teach the present_*→request_* pairing in-band (describe + guideline)
The live ship-gate agent tried request_choice after present_question —
structurally rejected (correct), but the pairing rule was enforced and
never taught. respondsToPresentTool was the one model-facing param field
with no .describe(), serializing to the model as a bare enum.
- .describe() on respondsToPresentTool at all three request_* params,
naming the legal originating present_* and the exchangeId-match rule, so
the model-facing JSON Schema surfaces the pairing before the call.
- present_question guideline now states a free-text question is answered by
request_answer only, never request_choice/request_choices (use
present_options for multiple-choice) — the exact confusion site.
- regression oracle: each request_* param's JSON Schema must carry a
respondsToPresentTool description mentioning present_/exchangeId (teeth
verified). shared.ts curr/next stays the single source of truth.
Cheap, now half of the affordance theme (enforced-but-untaught). The
structural half — collapsing present_*+request_* into one tool per
interaction so respondsToPresentTool ceases to exist — is deferred to a
post-runbook ln-design pass; these describes would be deleted with the
field if that lands. Reconciled into I23-L coverage note.
* docs: design the structured-exchange request-side collapse (respond)
Records the ln-design Design-It-Twice exploration for fixing the recurring
present_*→request_* mis-pairing bug the FE-811 runbook surfaced. Three
shapes compared (full ask_* collapse / single server-routed respond /
derive-don't-trust); chosen shape is B (keep present_* as the durable
recoverable anchor, collapse the four request_* into one respond whose UI
mode is server-derived from the pending present, deleting
respondsToPresentTool so mis-pairing becomes unrepresentable).
Captures rationale, the recoverability constraint (I23-L) the design must
preserve, why B dominates A (no unproven mid-tool-checkpoint dependency)
and C (prevents vs coerces), load-bearing claims, and the
respond-for-present_question tracer bullet. Not scheduled — post-runbook
structural work; the 95933e5f describe stopgaps are deleted when it lands.
* chore: retire TUI exchange-answer bugfix card (manual verification satisfied)
The fix landed in fed26506; the live ship-gate-runbook session confirmed
request_answer records the TUI editor answer ("new from scratch") rather
than queuing it as steering. Card exhausted.
* docs: fold runbook present-side + nested-payload findings into the design
The 2026-06-22 runbook surfaced two gaps the request-side collapse does
NOT close: (1) present-side selection error — present_question used for a
multiple-choice question (inverse of the original mis-pairing); the model
under-picks present_options. (2) review-set nested payload shape still
invisible — the 64fe9a41 top-level typing fix worked, exposing the next
layer (grounding-as-string, missing epistemicStatus). Both added to the
design doc's "Adjacent gaps" section with design implications (phase-2
present-side merge; standalone nested describe-pass).
PLAN: registered `structured-exchange-affordance` under Parallel as the
consolidated ln-induct candidate + designed follow-up, pointing at the
design doc, with the three separately-scoped pieces. Captures the
"enforced-but-untaught" theme for a later systematic pass; not
demo/alpha-blocking.
* FE-811: close demo block 4 — promote ship-gate runbook evidence
Card 2 closed on accumulated evidence (user decision). The live
fresh-cwd brunch --mode tui --open-web path composes end-to-end through
public entrypoints:
- capture→graph: seed LSN 2 (5 nodes) → LSN 4 (8 nodes), committing
CTX2/CTX3/A1 from a live elicitor turn via mutate_graph
- TUI answer recorded from the editor, not queued as steering
- D39-L seal verified: system-prompt-after.md has 0 ambient
APPEND_SYSTEM.md content in a real post-fix run
Promoted sample: .fixtures/runs/ship-gate-runbook/2026-06-22T15-33-01Z/
(report.json + session.jsonl + transcript + graph overview + debug
mirrors). The ship gate surfaced five real composition bugs over its
runs, all fixed on-branch; two quality residuals captured in
docs/design/STRUCTURED_EXCHANGE_COLLAPSE.md + PLAN.
PLAN: FE-811 marked done (Sequencing row, frontier Status, Recently
Completed). Scope file retired (both cards done).
* ln-sync: reconcile PLAN/SPEC after demo-lane delivery Collapse the delivered demo lower line in Sequencing, trim Recently Completed to the rolling window (older entries archived to PLAN_HISTORY.md), fix done-item drift (poc-live-ship-gate pointers, dependency-graph status), record the spec-structural-relief D3 deferral, and correct the stale SPEC verification-infrastructure line. Co-authored-by: Cursor <cursoragent@cursor.com> * feat(exchanges): collapse structured exchange to a single terminal + type mutate_graph.detail Materialize the discriminant-companion contract lens across the structured-exchange and graph-mutation surfaces so the legal companion shape is taught/derived at the point of choice instead of validated only downstream. Structured exchange (single terminal): - present_question is the merged prompt anchor (options[] presence + multiple derive the response kind); request_response is the sole terminal, dispatching answer / choice / choices / review from server-owned pending-present state. - Retire the present_options / request_answer / request_choice / request_choices / request_review tools; preserve their request_*/capture_* result-detail vocabulary. - request_response is a thin router on tool_meta.curr with exhaustive narrowing; collectors (answer/choice/choices/review) each own availability + formatting and share one typed StructuredExchangeUiContext. Graph mutation (typed detail): - graph/schema/nodes.ts owns NODE_DETAIL_JSON_SCHEMAS + NODE_KINDS_REQUIRING_DETAIL; command-validation.ts consumes the shared owner while preserving I37 diagnostics; mutate_graph tool schema and the dev-RPC mirror expose per-kind create_node detail instead of Type.Unknown(). Reconciles SPEC (I23-L, A30-L, D27-L, D86-L, lexicon), PLAN, the collapse design doc, and topology READMEs. Co-authored-by: Cursor <cursoragent@cursor.com> * feat(exchanges): teach review-set payload shape at boundary * feat(graph): teach read_graph mode companions * docs: mark discriminant companion lens graduated * Polish structured exchange TUI * Route transcripts to debug cache --------- Co-authored-by: Cursor <cursoragent@cursor.com>
* docs: capture ontology review protocol (thread audit + grilled scope)
Audit of the external GPT-Pro ontology thread against the current graph
model, plus the refined active scope from the design grill: edge renames
(witness/rationale/exclusion/cross_reference) + refinement, node adds
(unknown/entity/sketch), thesis→claim and vv_*/AC recodes. coverage and
the rest deferred or parked. Working artifact, not yet a SPEC decision.
Co-authored-by: Cursor <cursoragent@cursor.com>
* docs: reconcile ontology review protocol to grilled resolution
Reframe to the closure rule (methods are validation lenses, not sources of
kinds: spec.kind + detail.form + renderer + heuristic-set). Fix baseline
labels to actual NODE_KIND_METADATA codes. Mark the thread audit (§1-5)
historical and supersede §6-8 with the resolved scope: node/edge deltas,
detail.form mechanism, spec.kind scope model + story node, epistemic triad
+ given/theorem routing, witness/evidence naming, Gherkin mapping,
heuristics list, deferrals/ceilings, and follow-ons.
Co-authored-by: Cursor <cursoragent@cursor.com>
* ln-spec: propagate the multi-method ontology revision (FE-1052)
Record the grilled ontology resolution as canonical SPEC decisions:
- D87-L: closure rule (methods are validation lenses, not kinds); the
edge renames + refinement (8->9), node renames, and adds (entity,
sketch, story, unknown); thesis kept + sharpened; feature is spec.kind.
- D88-L: detail.form method-payload union on requirement/criterion/
invariant (kind drives behavior, form is inert payload).
- D89-L: spec.kind ownership relation; story as intra-spec grouping;
project graph + role deferred; readiness_band computed.
Cross-link D51-L/D54-L/D56-L/D61-L/D45-L; forward-note I37-L. Graduate
the deferred risk/unknown Future-Direction item to the unknown node add;
add the methods-as-lenses + heuristics-SoT follow-on. Lexicon: sharpen
Thesis, clarify Claim, Risk->Unknown, add Spec kind / Story / Node
detail form / Method as lens / Witness / Rationale / Refinement.
GRAPH_MODEL.md gets a forward-pointer banner only; its body and the
schema enums change during the FE-1052 build, not now.
Co-authored-by: Cursor <cursoragent@cursor.com>
* ln-plan: make ontology-revision (FE-1052) the single data-model frontier
Add the ontology-revision frontier (FE-1052) implementing SPEC
D87-L/D88-L/D89-L: edge renames + refinement (8->9), node renames/adds
(vv_*, entity, sketch, story, unknown; thesis sharpened), detail.form
union, spec.kind field. It absorbs the two other data-model/ontology
frontiers as accessory tasks: graph-model-doc-retirement (retire
GRAPH_MODEL.md, re-point ~15 citations) and graph--edge-impact-remodel
(affected+impactKind+stanceRequired). Scope principle: FE-1052 owns the
ontology shape; consumers (coherence, oracle/design/plan planes) stay
separate and depend on it. Update the active line, the absorbed frontier
notes, and the dependency graph accordingly.
Co-authored-by: Cursor <cursoragent@cursor.com>
* docs: reconcile edge-impact-remodel card to FE-1052 / D87-L vocabulary
The card is now an accessory task inside ontology-revision (FE-1052), not
a follow-on to a separate graph-model-doc-retirement frontier. Reconcile
its per-category table to the D87-L edge renames (witness/rationale/
exclusion/cross_reference), add the new refinement row as an explicit
DECIDE-in-build call (not a silently baked row), and update the stance
check and header framing to match. Core mechanism (affected + impactKind
+ stanceRequired replacing impactOn*Change) is unchanged.
Co-authored-by: Cursor <cursoragent@cursor.com>
* ln-scope: scope FE-1052 as a 5-card schema-migration slice sequence
Mode:slices scope file: card 1 (edge vocabulary + impact remodel, full,
next) -> 2 (node vocabulary) -> 3 (detail.form union) -> 4 (spec.kind +
story/unknown) -> 5 (GRAPH_MODEL.md retirement). Card 1 is fully scoped
as the thinnest atomic first slice and folds in the absorbed
graph--edge-impact-remodel (same graph/schema + policy files). Add a
Current execution pointer to the FE-1052 frontier definition.
Co-authored-by: Cursor <cursoragent@cursor.com>
* FE-1052: Rename graph edge vocabulary
* comparative architecture with pi-web
* FE-1052: Rename graph node vocabulary
Card 2 of the ontology-revision schema migration (D87-L node deltas):
rename validation_method->vv_method and obligation->vv_obligation;
add story/unknown (intent, elicitation band) and entity/sketch (design);
sharpen thesis to a testable/refutable/refinable bet without renaming it.
Updates NODE_KIND_METADATA, the intent kind-category derivation (new
elicitation category), web kind-display sections, regenerated seed
fixtures + the kind-band-spread graph-overview golden, and the
GRAPH_MODEL.md thesis rubric.
Co-authored-by: Cursor <cursoragent@cursor.com>
* FE-1052: detail.form union on claim kinds (card 3, D88-L)
Add the form-discriminated detail union (plain|gherkin|formal on
requirement/criterion/invariant; given on context) per D88-L. kind still
drives band/edge-legality/source-question; form is inert payload.
CommandExecutor validates per-form payloads and rejects non-allowed
forms + unknown fields; agent mutate_graph and dev-RPC boundaries
advertise the form companions table-driven from one source. Payloads
decided: gherkin {given?,when?,then[]}, formal {language,statement},
given {statement}, plain {}. Reconcile I37-L.
Co-authored-by: Cursor <cursoragent@cursor.com>
* FE-1052: strip the unused intentKindCategory axis (D56-L)
The basic|structural|reasoning intent-kind category had no code/test/
prompt reader (only a definition plus one re-export), and the I36-L
"covered by command-executor.test.ts" citation was to a test that does
not exist. Card 2 had begun extending it with a 4th value ('elicitation',
a readiness-band name) to place story/unknown, conflating the D56-L
category axis with the D64-L band axis. Rather than fix the conflation,
remove the axis: delete IntentKindCategory + intentKindCategory() from
nodes.ts and the graph/index re-export. Reconcile D56-L (no category
axis), both I36-L rows, the retired Lexicon entry, and D61-L/Claim (name
the truth-bearing kinds directly). Readiness band (D64-L) stays the only
live grouping over kinds. No property without a clear reader.
Co-authored-by: Cursor <cursoragent@cursor.com>
* FE-1052: spec.kind field + story/unknown wiring (card 4, D89-L)
Add SPEC_KINDS (product|feature|function) to the drizzle-free taxonomy
leaf and a specs.kind column (NOT NULL DEFAULT 'product', migration
0006) so existing createSpec({name,slug}) callers are untouched.
SpecRecord.kind / CreateSpecInput.kind thread through createSpec /
getSpec / listSpecs and the seed/export fixture contract. story/unknown
need no new wiring (card 2 landed the kinds; composition has no kind-pair
restriction) — added tests proving both are legal intent claims, unknown
spawns no elicitation_gap, and story->requirement reuses composition.
Deferred: project graph + role:main|alt; readiness_band stays computed.
Reconcile db/README + graph/README spec-row drift.
Co-authored-by: Cursor <cursoragent@cursor.com>
* docs: record three deferred ontology reflections (FE-1052 session)
Capture as Future Direction, none built in FE-1052:
- thesis -> pitch (annotated rename; later vocabulary pass)
- term may move to project/workspace level (with the deferred project graph)
- readiness-band re-mapping + new 'projection' band: a candidate D64-L
amendment (overturns the locked "differentiation grows typologies, not
bands" clause; re-assigns kinds across many live band readers), so it
needs its own ln-grill/ln-spec pass, not a mid-migration fold-in.
Co-authored-by: Cursor <cursoragent@cursor.com>
* ln-plan: add readiness-bands-interrogation frontier (proving)
A Next/parallel proving frontier to interrogate the D64-L readiness-band
model: is it earning its readers, or another instance of the
over-ambitious-gating pattern already retired three times (intentKindCategory
strip; readiness-grade gating D45-L/D74-L/D86-L)? Carries the candidate
projection-band amendment surfaced by the FE-1052 grill but is NOT
committed to building it — the product is the verdict. Enumerates every
live readinessBands reader, tries four hypotheses (incl. simplify/retire),
honors I31-L (readiness never bars work), and routes to ln-spec/ln-scope
only if a change is warranted. Independent of the FE-1052 spine.
Co-authored-by: Cursor <cursoragent@cursor.com>
* FE-1052: retire docs/design/GRAPH_MODEL.md (card 5)
Durable content was already homed by cards 1-4 (taxonomy -> NODE_KIND_METADATA
/ EDGE_CATEGORY_METADATA / schema/kinds.ts; invariants -> SPEC; policy ->
category-policy.ts; source-questions -> ELICITATION_QUESTIONS.md; edge teaching
-> tool-schemas .describe()). Rehome the two orphaned authoring heuristics
(interrogative normalization, context-promotion ladder) into the commit-graph
SKILL.md and fix its stale proof/support -> witness/rationale. Re-point every
citation (~16 SPEC, 10 src file-headers, CONTRIBUTING/protocol/seam-extensions/
elicitation-questions/review-sets/bilal-port), then delete the doc. Zero
dangling markdown links remain.
Co-authored-by: Cursor <cursoragent@cursor.com>
* ln-plan: close out ontology-revision (FE-1052) — all 5 cards landed
Move FE-1052 from Active to Recently Completed with a full card summary;
mark the frontier definition done and its dependency-graph node done;
delete the exhausted scope file memory/cards/ontology-revision--schema-migration.md.
Next chosen frontier is readiness-bands-interrogation (user tees it off
separately). Residual ELICITATION_QUESTIONS.md vocabulary drift noted as
an ln-sync candidate.
Co-authored-by: Cursor <cursoragent@cursor.com>
* FE-1052: finish boundary→exclusion rename (review-bot induction)
Close the homograph bleed and dangling refs left by the boundary→exclusion
edge-category rename, surfaced by Copilot review on #251 plus two unsampled
instances found by auditing the lens across the tree:
- tool-schemas.ts: ToolMutateCreateEdgeOp exclusion variant declared its
endpoint field as `exclusion` while the runtime schema builds it as
`boundary` (EDGE_CATEGORY_METADATA.exclusion.sourceRole) — a silent
type/runtime divergence for tool callers; thread the real `boundary` field.
- tool-schemas.ts / seed-fixtures.ts: header/description prose where the
English word "boundary" was blindly replaced ("adapter-exclusion",
"parameter schema exclusion", "mutation exclusion").
- labels.ts: comment "anchor is the exclusion" (role is `boundary`).
- REVIEW_SETS.md: stance rule + example still used retired proof/support
names (now witness/rationale).
Co-authored-by: Cursor <cursoragent@cursor.com>
* FE-1052: land #250 structured-exchange review findings on this branch
Apply the in-tree review-bot findings from #250 (fe-1053 is downstack/linear
under this branch; squash-merge makes a re-stack unnecessary):
- accepted-response.ts: the review terminal emitted toolName/toolCall
`request_review`, but exchanges/README §"Single terminal" makes
`request_response` the only terminal tool — `request_review` survives only
as a `tool_meta.curr` result-detail discriminant. Route the review flow
through `request_response`; details keep `curr: request_review`. Updates the
direct unit assertion in structured-exchange-loop.test.ts.
- params.ts: option ids round-trip through a per-line `<!-- option-id: … -->`
marker recovered by a regex that stops at `>`; constrain the id at the
params boundary to forbid `>` and line breaks so malformed ids fail loud
instead of silently dropping during markdown recovery.
- state.test.ts: drop the duplicate `present_question` in the floor-tools
arrayContaining assertion.
- prompting.test.ts: remove the retired `request_review` from both
getAllTools fixtures so the test env matches the registered tool set.
Co-authored-by: Cursor <cursoragent@cursor.com>
* weave setup
---------
Co-authored-by: Cursor <cursoragent@cursor.com>
* ln-plan: add subagent-reconciliation frontier (D90-L–D92-L, I49-L) Records the reconciliation of the sealed read-only subagent mechanism with the foreground agent model as a single planning move across SPEC and PLAN: - SPEC: D90-L (shared foreground/background AgentManifest + code-owned background discovery), D91-L (semi-permeable seal + assembled prompt + injected parent world), D92-L (sovereign per-agent tool grants gated by a code-owned op_mode delegatable-set allowlist), and I49-L (the delegatable-set allowlist is the write-safety boundary). Adds the subagent-reconciliation oracle battery to Verification Design plus two blind spots (digest quality, snapshot-at-spawn staleness); refines the D44-L pointer and graduates the Future Direction subagent-acquisition note. - PLAN: adds the subagent-reconciliation frontier (6-slice sequence, proving posture, oracle-designed verification) and marks subagent-adoption superseded/absorbed by it. Co-authored-by: Cursor <cursoragent@cursor.com> * ln-plan: fix canonical-doc path drift on subagent-reconciliation (PR #252 review) Resolves three copilot-pull-request-reviewer findings sharing one lens (canonical-doc path/precision drift): - SPEC D90-L: bare `agents/<id>/SYSTEM.md` -> canonical `src/.pi/agents/<id>/SYSTEM.md`; the Refines:D44-L clause now names the background-body migration onto that one convention so SPEC carries a single agent-body layout. - SPEC D91-L: bare `pi-subagents.ts` -> `src/app/pi-subagents.ts`. - PLAN: two further bare `pi-subagents.ts` shorthands upgraded to full repo-relative paths; `session.ts` -> `src/.pi/extensions/subagents/session.ts`. Finding 3 (two frontiers marked `next`) intentionally left as-is per user decision: readiness-bands-interrogation and subagent-reconciliation coexist as next candidates for now. Co-authored-by: Cursor <cursoragent@cursor.com> * ln-plan: harmonize foreground-agent model + add D93-L (op-mode/agent collapse) Establishes the single source of truth the subagent-reconciliation frontier delivers: - SPEC D93-L: operational mode and foreground agent collapse to one op-mode-keyed record (1:1), retiring the three-record fragmentation (kinds.ts enums + runtime-policy.ts mode/role/tool defs + state.ts prompt defs, which hand-sync duplicated model/thinking/strategy/lens). Roster: elicit->elicitor (now), execute->orchestrator (delegating write-quarantiner), code->pi-coder (direct Brunch-tooling-aware coder). - SPEC D90-L: canDelegate added to AgentManifest. - SPEC D92-L: refined by D93-L (op_mode-keyed allowlist becomes the per-agent canDelegate field; generalizes to background nesting). - SPEC D58-L: pi-coder instantiates the augment case; replace-for-other- roles stays open. - SPEC D23-L / item 26 / glossary: executor -> orchestrator; 1:1 stated. - PLAN: slice 1 widened to the full collapse; slice 6 reframed as the declarative colleague-owned execute/orchestrator + code/pi-coder build-out (record + SYSTEM.md + canDelegate, no machinery change); new single-source-of-truth acceptance criterion; D90-L–D93-L refs. Co-authored-by: Cursor <cursoragent@cursor.com> * ln-plan: complete D93-L roster reference in Operational-mode glossary Forward-scan straggler: the Operational-mode glossary row still named only elicit/execute. Names the full planned roster (elicit/execute/code) and the 1:1 op-mode<->foreground-agent source of truth (D93-L), so this branch's SPEC/PLAN delta is complete and the contention files need no further touches before implementation. I29-L and the Subagent glossary row are intentionally left as current- state (sealed read-only); they ride their implementing slice (3) per the README-owns-current-state / decision-owns-the-event split. Co-authored-by: Cursor <cursoragent@cursor.com> * FE-1054: shared AgentManifest + collapsed op-mode roster + code-owned discovery Slice 1 of subagent-reconciliation (D90-L / D93-L): - Add shared AgentManifest (kind: foreground|background) in src/session/schema/agent-manifest.ts - Collapse the three fragmented foreground definition sources into one op-mode-keyed FOREGROUND_AGENT_ROSTER (no more hand-synced elicitor fields) - Retire the readdir scan for an explicit BACKGROUND_SUBAGENT_IDS registry list - Oracle 2: a planted unlisted agents/*.md is not spawnable (D39-L preserved) - Add 'code' to PLANNED_OPERATIONAL_MODE_IDS; update mode-picker assertion Verified: npm run check clean; full vitest 1025 pass / 0 fail. * FE-1054: extract shared prompt-skill core for foreground+background reuse Slice 2 of subagent-reconciliation (D91-L): - Lift renderBrunchSkills + the skill-manifest loader (loadPromptResourceManifestEntries / skillToPromptResourceManifestEntry + PromptResourceManifestEntry/PromptManifests) into src/.pi/extensions/system-prompts/prompt-skills.ts, kind-agnostic - compose.ts and runtime/state.ts import from the shared module; eager STRATEGY/LENS/METHOD_RESOURCES constants keep identical import-time behavior - Oracle 1 (extraction purity): COMPOSE golden previews byte-identical (pure move) - Correct D91-L drift: composeAgentContextSeed already lives in src/session/agent-context-seed.ts; not re-extracted Verified: full vitest 1026 pass / 0 fail; npm run check clean. --------- Co-authored-by: Cursor <cursoragent@cursor.com>
…-L) (#255) * weave setup * ln-spec/ln-plan: readiness-band verdict — D94-L four-band derived model + I50-L Resolves the readiness-bands-interrogation verdict (D64-L amendment): - D94-L: four-band derived ladder (grounding/elicitation/projection/commitment) with two super-types — elicitation-bands gate gap.band, projection-bands gate nodes; band derived from plane + intent bisection + band-less set; capture-vs- projection stance rides existing basis (D63-L). H1+H2 confirmed, H4 rejected, H3 dissolved (D86-L/I31-L). - I50-L (planned): two-carrier anti-re-coupling guard (gap.band vs plane-derived node bands). - D64-L annotated Refined by D94-L; Future Direction candidate note flipped to DECIDED; REQ/AC plane move kept provisional with planning-process tripwire. - PLAN frontier transitioned proving→earned, implementation-ready for ln-scope. * FE-xxx: card 1 — four-band derived readiness model (D94-L) Materializes D94-L: adds 'projection' to READINESS_BANDS; removes stored NODE_KIND_METADATA.readinessBands; adds canonical bandsForKind(kind) deriving node band membership from plane + intent bisection + band-less set (example/sketch/term). Re-points direct readers (queries list_by_band + presence-coverage, graph-slice render with an 'unbanded' bucket, readiness estimate, prompt/specification previews, goldens) to the derived model. Reconciles D64-L body and the Future Direction note to MATERIALIZED. Card 2 (explicit I50-L two-carrier separation guard + advertisement/pass-through review) remains open. check + test + build green. * FE-1058: card 2 — I50-L two-carrier guard + four-band closure Moves ReadinessBand ownership to the drizzle-free leaf (kinds.ts); keeps readinessEstimate + elicitation-driver off node-band metadata and proves it with the I50-L source-separation guard (covered); read_graph advertises the closed four-band enum; projection is legal at the gap command boundary. Adds tests for derived band filtering, unbanded rendering, projection command- boundary legality, and I50-L source separation. Reconciles SPEC (I50-L covered, D64-L body) + PLAN (frontier done, FE-1058, Recently Completed) + scope card (Cards 1-3 done). Full test 1027 passed + check + build green.
…-L migration) (#256) * FE-1054: unify agent bodies under src/.pi/agents/<id>/ + renames (D90-L migration) Slice 3b of subagent-reconciliation (D90-L one agent-body layout): - Move background bodies to src/.pi/agents/<id>/SYSTEM.md (frontmatter kept as DX) - Rename scout->explorer, proposer->projector; reclassify reviewer fg->bg - BACKGROUND_SUBAGENT_IDS = [explorer, researcher, projector, reviewer] - Loader resolves from unified home; no readdir (D39-L code-owned discovery) - Oracle 2 carried forward: planted unlisted <id>/SYSTEM.md not spawnable - Side-task reviewer drain (D15-L/D25-L) untouched - build:pi-assets copies the six agent dirs from the unified home - SPEC/PLAN terminology reconciled to the new home (I29-L invariant + D91-L seal flip NOT touched — reserved for slice 3) Verified: full vitest 1030 pass / 0 fail; npm run check clean. * FE-1054: semi-permeable subagent seal — inject parent world + assembled prompt (D91-L) Slice 3 of subagent-reconciliation (D91-L): - New prompt-assembly.ts: assembled background prompt (control header + injected world snapshot + <brunch-skills> + router), minus foreground elicitation block - Thread injected parent world (GraphReaders scoped to parent specId, spec/workspace seed, session digest via getBranch()) app root -> pi-subagents.ts -> runSubagent - Extract createReadGraphTool; grant explorer read_graph when graph readers injected - Isolation by construction: graphReadersForSpec(graph, specId) binds parent specId; child cannot reach a sibling spec - Oracle 3: assembled prompt carries world snapshot; graph via tool not baked; sibling-spec excluded; ambient seal preserved (in-memory services, no ~/.pi) - FLIP I29-L invariant + glossary to semi-permeable; D91-L Supersedes reconciled - Fix: guard pi.appendEntry.bind in createReadGraphTool call (eager bind threw for mock pi without appendEntry — 6 graph-tool tests) Subagent registration stays dev-gated (context.dev); slice 6 wires the runnable path. Verified: full vitest 1032 pass / 0 fail; npm run check clean; tsc build clean. * FE-1054: code-owned delegatable-set gate for subagents (D92-L/I49-L) Slice 4 of subagent-reconciliation. The op_mode-keyed, code-owned delegatable-set allowlist is now the subagent write-safety boundary: registration/advertisement and execution are restricted to definitions ∩ the foreground agent's canDelegate set, so frontmatter can never self-author delegation. elicit.canDelegate carries the read-only background roster; sovereign child-tool grants are exposed via createSubagentToolCatalog. Narrowed the architecture guard to per-file forbidden needles: reviewer now legitimately appears in runtime-policy.ts's canDelegate (a non-write delegation target), while pi-coder stays out of the foreground registry. Verified: full vitest 1039 passed / 0 failed; npm run check clean. Co-authored-by: Cursor <cursoragent@cursor.com> * FE-1054: subagent tool renderCall/renderResult for TUI legibility Co-authored-by: Cursor <cursoragent@cursor.com> * FE-1054: stand up execute mode + orchestrator + stub tool (D93-L) Make `execute` a live operational mode mapped to a new `orchestrator` foreground agent, granted a code-owned `orchestrator_stub` tool (read-only plus the stub; bash/edit/write blocked). `code`/`pi-coder` stays planned. The orchestrator + stub register on the normal product extension path (not dev-gated); canDelegate is [] so no worker lands this branch. Retires HANDOFF.md and reconciles SPEC/PLAN + topology READMEs. Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com>
… proposal + present_candidates un-stub (#259) * weave setup * add treedocs tool speculatively * FE-1059: present_candidates pick-only un-stub (D96-L/I51-L) Un-stub the present_candidates structured-exchange seam: params schema, tool, projection, renderer, registration, and the request_response pick path (request_choice -> capture_candidate provenance). The tool carries no CommandExecutor/graph dependency, so candidate presentation never commits graph truth (I51-L). Fan-in is pick-only against the committed schema; the three-value pick/synthesize/compose mode (D96-L/A32-L) is a deferred follow-on. Records the materialization in SPEC/PLAN and the elicitor capability spine (D95-L). Co-authored-by: Cursor <cursoragent@cursor.com> * tooling: oxfmt ignores src/treedocs.yaml The speculatively-added treedocs tool config is not oxfmt-owned source; exclude it so fmt:check stays green without reformatting it. Co-authored-by: Cursor <cursoragent@cursor.com> * fix: restore extension-registry tests after restack auto-merge The FE-1059 restack's git auto-merge of extension-registry.test.ts dropped the capture-sweep-watermark test, mangled the prepareNextTurn body, and duplicated a test. Restore the FE-1054 version and re-apply the present_candidates import + registered-tools entry. Co-authored-by: Cursor <cursoragent@cursor.com> * FE-1059: intent-plane generate skill + present_candidates tool-grant (D96-L) Grant present_candidates to the generate-proposal method so the elicitor can actually call the fan-out tool landed in the un-stub; it joins present_review_set/request_response as a floor generate tool (D86-L). Enrich the generate-proposal skill with the shared fan-out -> present -> request_response spine and the intent-plane generative facet: grounding bundle, density-scaled output, epistemic honesty, and the single-pick fan-in (intent needs no fan_in_mode). Honors I51-L (picked candidates never auto-commit) and D97-L (cite ontology surfaces, do not copy vocab). Retires the consumed scope card. Co-authored-by: Cursor <cursoragent@cursor.com> * Fix direct Pi extension discovery * FE-1054: Bound subagent session digest * FE-1059: Preserve choice identity for duplicate labels * FE-1059: Add design-plane generate facet Co-authored-by: Cursor <cursoragent@cursor.com> * docs: reconcile design docs against post-FE-1052 ontology + present_candidates un-stub - ONTOLOGY_REVIEW_PROTOCOL: mark CONSUMED — resolved scope is now D87-L/D88-L/D89-L (FE-1052); note the thesis->claim reversal and the stale baseline. - STRUCTURED_EXCHANGE_COLLAPSE: correct the stale "present_candidates stub" claim; it is un-stubbed (9a6219e/be0b8765) and routed via collectChoiceFromUi. - SPEC_INITIATIVE_MODEL: fix broken brunch-next absolute file:// links -> relative. - ELICITATION_QUESTIONS: drift banner; defer the content refresh into elicitor-generate as a D97-L canonical heuristic-rendering pass (recorded in PLAN follow-ons). Co-authored-by: Cursor <cursoragent@cursor.com> * docs(plan): ln-sync weight-pass — archive FE-1052 ontology-revision definition Move the done ontology-revision (FE-1052) full frontier definition into docs/archive/PLAN_HISTORY.md (new 2026-06-24 sync section). In memory/PLAN.md: remove the retired definition block, relocate its Sequencing anchor into the "done anchors still carrying live edges" group (its -[unblocks]-> forward edges survive), and trim the overweight Recently Completed window (archive the 2026-06-22 request_answer fix + prompt-skill-topology entries). Durable architecture stays in SPEC D87-L/D88-L/D89-L. Co-authored-by: Cursor <cursoragent@cursor.com> * readme alpha update * FE-1059: Add oracle-plane generate facet + progressive-disclosure split Recompose generate-proposal into a shared spine with per-plane disclosed references/{intent,design,oracle}.md and a probes.md evaluation set. The oracle plane fan-in (compose) rides the existing present_candidates -> request_response -> present_review_set -> request_response -> acceptReviewSet path with no new schema, tool, or multi-select affordance (A31-L/A32-L partially validated; live-probe proof still pending). Materializes the first references/ progressive-disclosure sub-shape (D85-L closure (a)). Also retire all consumed scope cards (elicitor-generate oracle slice plus the landed subagent-reconciliation and readiness-bands cards). Co-authored-by: Cursor <cursoragent@cursor.com> * FE-1059: real-boot generate-activation check + regenerate stale compose goldens Add a tier-2 real-boot test proving the FE-1059 generate triad (present_candidates / present_review_set / request_response) is actually registered in the live tool registry and active under an oracle lens pin through the real runBrunchTui boot — the walks-on-its-own-bones check that state.test.ts (policy over a hand-maintained array) cannot give. Regenerate the four composeAgentPrompt goldens whose <brunch-skills> generate-proposal <description> drifted when the intent/design/oracle slices (be0b876 / 9e33f10 / d6ed800) rewrote the skill description without re-locking the previews. Diff is the description line only. Co-authored-by: Cursor <cursoragent@cursor.com> * FE-1059: Add generate fan-out witness harness Add the dev-only oracle-plane fan-out witness and pin Node 24 so native SQLite bindings run under the same ABI across shells and sandboxes. Co-authored-by: Cursor <cursoragent@cursor.com> * FE-1059: Run generate fan-out witness with real model config Co-authored-by: Cursor <cursoragent@cursor.com> * PLAN cleanup * FE-1059: Promote generate fan-out evidence Record the reviewed real-model fan-out witness as durable evidence so the generate frontier can close without claiming the separate fan-in proof. Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com>
* docs(skills): reconcile strategies/lenses READMEs to current state Remove the stale future-tense "M5 input" classification/ranking tables and the dead `INTENT_GRAPH_SEMANTICS.md` pointer from both axis READMEs; replace with a short Heuristic provenance note. The heuristics are authored and locked into each `<axis>/<name>/SKILL.md` body in distilled form (D97-L cite/distill), and graph vocabulary is owned by `src/graph/schema/kinds.ts`; the READMEs now own axis/lens membership only. Discharges the final residue of the skill-substrate arc. Co-authored-by: Cursor <cursoragent@cursor.com> * docs(plan): add initiative (arc) altitude + arc-completion trigger Introduce a thin in-PLAN.md `## Initiatives` index so multi-frontier architectural through-lines stay legible without a new tracker/branch altitude (frontiers remain flat). Seed three arcs: skill-substrate (done), elicitor-capability-spine, context-pipeline. Close the "standing obligation rides the triggering frontier = never" hole: an arc's done-definition must include topology-README reconciliation and residue discharge, and arc completion is itself a trigger. Govern the lifecycle across ln-plan (create/update + sanctioned-exception carve-out), ln-build (fire the done-definition when the last member frontier lands), and ln-sync (reconcile rosters, close only when the done-definition holds). Co-authored-by: Cursor <cursoragent@cursor.com> * feat(graph): generate kind→band ontology reference + drift guard First materialization of the `_generated/` mechanism (SPEC D87-L clause d): `src/graph/schema/generate-ontology-ref.ts` projects `NODE_KINDS` + `bandsForKind` into a read-only `src/graph/schema/_generated/ontology.md` table. `npm run generate:ontology` writes it; `npm run check:data-model` (wired into `npm run check`) fails on drift from the typed sources (D73-L). The `capture` method now cites the table instead of restating band membership (D97-L). Planning capture (foundation work; branch to be named later): - memory/PLAN.md — data-model-legibility frontier recorded: design verdict (Shape C), first tracer landed, remaining slices (edge/detail tables, authored judgment layer, subtypes→detail remodel) named. - memory/SPEC.md — D87-L (d) flipped deferred → materialized. Co-authored-by: Cursor <cursoragent@cursor.com> * docs(sync): ln-sync canonical pass — retire A30-L, reconcile graph schema topology Retire validated A30-L (structured-exchange request-side collapse; residue in D84-L/D86-L/I23-L) into the SPEC sync ledger. Reconcile src/graph/README.md to name the generate-ontology-ref.ts projector and _generated/ontology.md reference added this session, with the check:data-model drift guard. Co-authored-by: Cursor <cursoragent@cursor.com> * adapt to post-ontology-change legacy fixtures * update readme and plan * fix: keep verify gate clean Refresh stale prompt-shape assertions and preserve the Gherkin then field without triggering thenable lint warnings. Co-authored-by: Cursor <cursoragent@cursor.com> * consolidate pi extensions by area of concern * tool schema type hardening * src/agents/ centralization refactor step 1 * Move agent prompt bodies under agents * Move prompt resources under agents * Move agent runtime policy under agents * Move agent context seeds under agents * Move agent-visible renderers under agents * Promote adapter model text into agents contexts * Point prompt and context test scripts at agents * Guard agent context text ownership * Reconcile agent context topology docs * Characterize renderer moves at target owners * Move foreground runtime policy under agents * Delete projection runtime-policy bridge * Render related graph nodes semantically * Move print workspace rendering into app * Move transcript markdown into session * Retire renderers topology * Reconcile stale topology path fossils * stub knip config * Acknowledge Pi theme setting getter * Move capability readiness under agents runtime * Delete runtime affordance projection wrapper * Reconcile projection runtime topology * Reconcile prompt body path fossils * Rename context surface test scripts * Retire runtime topology refactor plan * Reconcile runtime topology references * Add Pi extension example notes, for upcoming dev * Harden Brunch Pi runtime tools * Extract Brunch Pi session option policy * Split Pi runtime tests from TUI boot * Reconcile app runtime topology notes * ad-hoc re-homing of all tests inside of src/.pi * first move for generative src/agents/contexts/references/ * move the shared resources in contexts * Adopt house style for graph seed renderers * Add graph authoring heuristics reference * Generate graph edge and detail reference tables * Enforce context import boundary * Reconcile ontology reference docs * Delete legacy edge repair bridge * Use direct Gherkin then keys * Correct graph command adapter ownership comment * Complete data model legibility verdict * Update prompt resource topology test --------- Co-authored-by: Cursor <cursoragent@cursor.com>
) * Plan renderer golden prompt assembly frontier * Close context reference harvest ledger * Plan graph-derived document outputs * Scope graph-derived document output rows * Canonicalize foreground executor prompt body * Lock background subagent body topology * Lock foreground prompt assembly wording * Lock before-agent-start prompt assembly path * Lock background subagent prompt assembly * Rename specification context home to spec * Add graph-derived spec markdown output * Add graph-derived plan markdown output * Reframe session runtime prompt resources * Document seed renderer invariant oracle * Cover elicitation context text * Cover exchange renderer inventory * Copy executor prompt asset in build * Reconcile renderer coverage completion * Reopen prompt topology flattening scope * Rebuild agent asset homes from flat sources * Cover generated agent asset topology * Reconcile plan-check scope to executor surface * Clarify current execute vocabulary in prompt prose * Lock executor prompt composition negative case * Gate prompt sections by foreground role * Flatten agent prompt topology * Harden topology test oracles * design brainstorm on context slicing/drafting Signed-off-by: Lu Nelson <ln@hash.ai> * massive new skill drafting Signed-off-by: Lu Nelson <ln@hash.ai> --------- Signed-off-by: Lu Nelson <ln@hash.ai>
* Refactor the dev launcher and curation tooling Amp-Thread-ID: https://ampcode.com/threads/T-019f0404-52b3-749d-9ec9-2126a549ceea Co-authored-by: Amp <amp@ampcode.com> * Rename faithful seeds to base variants Amp-Thread-ID: https://ampcode.com/threads/T-019f0404-52b3-749d-9ec9-2126a549ceea Co-authored-by: Amp <amp@ampcode.com> * Realign seed families and dev workbenches Amp-Thread-ID: https://ampcode.com/threads/T-019f0404-52b3-749d-9ec9-2126a549ceea Co-authored-by: Amp <amp@ampcode.com> * Fix interactive dev seeding and probe flags Amp-Thread-ID: https://ampcode.com/threads/T-019f0404-52b3-749d-9ec9-2126a549ceea Co-authored-by: Amp <amp@ampcode.com> * Characterize stacked PR contract drift. Co-authored-by: Cursor <cursoragent@cursor.com> * Align agent context helper topology docs. Co-authored-by: Cursor <cursoragent@cursor.com> * Reuse the Gherkin schema field owner. Co-authored-by: Cursor <cursoragent@cursor.com> * Align orchestrator stub output with its tool name. Co-authored-by: Cursor <cursoragent@cursor.com> * Repair dev launcher contract drift. Co-authored-by: Cursor <cursoragent@cursor.com> * Tighten characterization test formatting. Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Amp <amp@ampcode.com> Co-authored-by: Cursor <cursoragent@cursor.com>
) * Establish live elicitor topology. Co-authored-by: Cursor <cursoragent@cursor.com> * Add live elicitor prompt assembly. Co-authored-by: Cursor <cursoragent@cursor.com> * Route Pi prompting through live elicitor assembly. Co-authored-by: Cursor <cursoragent@cursor.com> * Fix live elicitor tool policy. Co-authored-by: Cursor <cursoragent@cursor.com> * Simplify the live elicitor prompt body. Co-authored-by: Cursor <cursoragent@cursor.com> * Quarantine legacy runtime controls. Co-authored-by: Cursor <cursoragent@cursor.com> * Simplify runtime state reporting. Co-authored-by: Cursor <cursoragent@cursor.com> * Move legacy prompt resources under suspended skills. Co-authored-by: Cursor <cursoragent@cursor.com> * Replace legacy prompt snapshots with live path goldens. Co-authored-by: Cursor <cursoragent@cursor.com> * Clean up suspended module boundaries. Co-authored-by: Cursor <cursoragent@cursor.com> * retire the refactor; add in SKILL.md files Signed-off-by: Lu Nelson <ln@hash.ai> * Name the source topology file convention. * Rename source topology documents. * Repair source topology references. * Remove stale topology README wording. * fixes and alignments Signed-off-by: Lu Nelson <ln@hash.ai> * Remove brittle static test sentinels and lean on renderer snapshots. Drop file-topology and prose-policing checks in agents and Pi tests, keep dynamic Markdown golden coverage, and assert behavior through structured outputs and active tool policy instead. * WIP a lot of churny moves Signed-off-by: Lu Nelson <ln@hash.ai> * move a lot of ingest/capture skill material closer to in place Signed-off-by: Lu Nelson <ln@hash.ai> * distribution of draft skills and skill refs in to right spots Signed-off-by: Lu Nelson <ln@hash.ai> * ln-sync pass with further fixes and cleanups Signed-off-by: Lu Nelson <ln@hash.ai> * re-plan, plan and spec thinning Signed-off-by: Lu Nelson <ln@hash.ai> * more fold ins Signed-off-by: Lu Nelson <ln@hash.ai> * consolidate praxis docs re testing Signed-off-by: Lu Nelson <ln@hash.ai> * characterize foreground runtime policy gaps * route foreground runtime through central policy * define executor foreground runtime policy * share blocked tool policy across runtime * remove executor prompt template placeholders * apply local review cleanups * reconcile foreground runtime topology * archive embedded POC architecture docs Move five POC-era architecture docs whose plans are now embedded in product + SPEC decisions to docs/archive/architecture/, with an index naming the superseding SPEC decisions and topology homes: - pi-ui-extension-patterns: frontier landed, verdicts proven; live state in src/tui-client + SPEC command-containment decisions - pi-wrapper-trust-and-resume-exit: closed finding; trust neutralized by sealed profile (D39-L) - pi-faux-provider-pattern: pattern embedded via D68-L dev-loop consolidation + src/dev faux harness - pi-web-comparative, pi-wrapper-comparative: external-baseline mirrors; guard-rails absorbed into SPEC (D33-L, R1/R8) Delete pi-extensions.md outright (stale verbatim copy of Pi's upstream docs/extensions.md, never Brunch architecture). Repair seven stale file:///brunch-next/ cross-links in prd.md and pi-seam-extensions.md to relative links or plain-text citations. Update docs/README.md with a re-entry pointer to the archive. pi-system-prompt-architecture.md stays live pending open D58-L; poc-live-ship-runbook.md stays as an active outer-loop runbook. --------- Signed-off-by: Lu Nelson <ln@hash.ai> Co-authored-by: Cursor <cursoragent@cursor.com>
|
|
||
| it('rejects asset traversal without reading outside the web asset root', async () => { | ||
| const assetRoot = await builtWebAssets(); | ||
| await writeFile(join(assetRoot, 'secret.txt'), 'outside asset root'); |
There was a problem hiding this comment.
Semgrep identified an issue in your code:
A hardcoded secret is identified. Store it properly in an environment variable.
To resolve this comment:
🔧 No guidance has been designated for this issue. Fix according to your organization's approved methods.
💬 Ignore this finding
Reply with Semgrep commands to ignore this finding.
/fp <comment>for false positive/ar <comment>for acceptable risk/other <comment>for all other reasons
Alternatively, triage in Semgrep AppSec Platform to ignore the finding created by node_secret.
You can view more details about this finding in the Semgrep AppSec Platform.
| }); | ||
|
|
||
| it('formats Brave LLM Context responses', async () => { | ||
| vi.stubEnv('BRAVE_API_KEY', 'test-key'); |
There was a problem hiding this comment.
Semgrep identified an issue in your code:
A hardcoded API Key is identified. Store it properly in an environment variable.
To resolve this comment:
🔧 No guidance has been designated for this issue. Fix according to your organization's approved methods.
💬 Ignore this finding
Reply with Semgrep commands to ignore this finding.
/fp <comment>for false positive/ar <comment>for acceptable risk/other <comment>for all other reasons
Alternatively, triage in Semgrep AppSec Platform to ignore the finding created by node_api_key.
You can view more details about this finding in the Semgrep AppSec Platform.
|
Semgrep found 1 Risk: Affected versions of esbuild are vulnerable to Origin Validation Error. esbuild's development server responds to every request, including Server-Sent Events connections, with Manual Review Advice: A vulnerability from this advisory is reachable if you run esbuild with the Fix: Upgrade this library to at least version 0.25.0 at brunch/package-lock.json:3112. Reference(s): GHSA-67mh-4wv8-2f99 |
* manual skill and prompt consolidation churn Signed-off-by: Lu Nelson <ln@hash.ai> * spec update and agentic consolidation re readiness bands Signed-off-by: Lu Nelson <ln@hash.ai> * WIP consolidations Signed-off-by: Lu Nelson <ln@hash.ai> * re-org top-level skills to have a single `map` procedure Signed-off-by: Lu Nelson <ln@hash.ai> * move agent reference material to 2nd level single home Signed-off-by: Lu Nelson <ln@hash.ai> * clarify map skill re other planes Signed-off-by: Lu Nelson <ln@hash.ai> * split intent mapping from others Signed-off-by: Lu Nelson <ln@hash.ai> * pre-refactor cleaning Signed-off-by: Lu Nelson <ln@hash.ai> * rewrite propose around generate spine * lift generate plane proposal references * trim inline proposal theory * clarify review-set drafting boundary * lift context reading into analyze * lift plane review heuristics * audit suspended acquisition methods * reconcile skill topology after salvage * fix elicitor exchange contract * audit suspended strategy prompts * audit suspended lens prompts * reconcile strategy lens audit notes * Cap topology docs under src Amp-Thread-ID: https://ampcode.com/threads/T-019f18e7-dfee-707e-8b4e-924836215180 Co-authored-by: Amp <amp@ampcode.com> * Retire suspended prompt-axis runtime Amp-Thread-ID: https://ampcode.com/threads/T-019f18e7-dfee-707e-8b4e-924836215180 Co-authored-by: Amp <amp@ampcode.com> * Sync canonical docs after prompt-axis retirement Amp-Thread-ID: https://ampcode.com/threads/T-019f1971-7e48-7080-a98b-b2639acabe23 Co-authored-by: Amp <amp@ampcode.com> * Scope FE-1085 project closeout Amp-Thread-ID: https://ampcode.com/threads/T-019f1971-7e48-7080-a98b-b2639acabe23 Co-authored-by: Amp <amp@ampcode.com> * FE-1085: Materialize project skill home --------- Signed-off-by: Lu Nelson <ln@hash.ai> Co-authored-by: Amp <amp@ampcode.com>
* Clarify remaining frontier order Amp-Thread-ID: https://ampcode.com/threads/T-019f1971-7e48-7080-a98b-b2639acabe23 Co-authored-by: Amp <amp@ampcode.com> * Merge exchange hardening frontiers Amp-Thread-ID: https://ampcode.com/threads/T-019f1971-7e48-7080-a98b-b2639acabe23 Co-authored-by: Amp <amp@ampcode.com> * Scope FE-1108 exchange hardening Amp-Thread-ID: https://ampcode.com/threads/T-019f1971-7e48-7080-a98b-b2639acabe23 Co-authored-by: Amp <amp@ampcode.com> * FE-1108 tighten exchange authoring guidance * Mark review-set companion teaching done * Trim exchange projection inventory * Stabilize live skill manifest paths * Document Gherkin then lint exception * FE-1108: validate rehydrated review-set details before RPC approval session.submitExchangeResponse review-set approval trusted the transcript-rehydrated pending reviewSet via an unsafe cast before constructing a ReviewSetProposalPayload, allowing malformed persisted details (e.g. corrupted custom_message entries) to throw at endpointRefFromDetails instead of failing loud as structural_illegal. Validate against the canonical zReviewSetDetailsPayload schema first and reuse its inferred type instead of a forked local interface. * FE-1085: package live skill SKILL.md resources into dist build:pi-assets created dist/agents/skills but never copied the eight first-level live skill markdown homes into it, so a published install would miss every runtime-loaded LIVE_BRUNCH_SKILL_IDS resource that registry.ts resolves relative to its own compiled location. scripts/copy-skill-resources.mjs derives the copy/cleanup list from the compiled registry (not a duplicated id list) and a new packaging test proves both the source and dist resources exist. * FE-1085: fold ingest's depth-4 TOPOLOGY.md into skills/ parent src/agents/skills/ingest/TOPOLOGY.md sat one segment past the AGENTS.md topology-depth ceiling; its ownership claim (source intake, digest, provenance, delegation to map/references) is already carried by the allowed src/agents/skills/TOPOLOGY.md layout sketch, routing table, and boundary rules, so only its SPEC decision citations needed folding up. * tooling: normalize promoted-run evidence and guard leaked workstation paths .fixtures/runs/** carried absolute developer-workstation paths (an old brunch-next-omega checkout's retired .pi/skills/* prompt resources, a brunch-next workbench cwd, node_modules, and an external repo brief path) baked into committed session.jsonl/report/markdown evidence, making it non-portable across machines. Normalized the five affected files to portable placeholders and added scripts/check-promoted-run-paths.mjs (wired into `npm run check`) so future promotions can't reintroduce the leak. .fixtures/seeds/** is untouched — separate seed-curation concern. * Close review residue: table-driven XML escaping, cached skill manifest, dedup topology prose Replaces the chained-replaceAll XML escaper with a table-driven single-pass escape, memoizes live skill manifest loading for the process lifetime so prompt composition no longer reparses SKILL.md files per call, and collapses the duplicated Owns paragraph in agents/runtime/TOPOLOGY.md into one sentence. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * Make skill manifest locations cwd-independent Skill manifest <location> was a hardcoded repo-relative src/... string handed to the model's read tool, which resolves under the user-workspace cwd (not the package root) — so skill loads failed off-checkout and in dist/-only installs. Thread the loader-resolved absolute Skill.filePath instead; delete the dead liveBrunchSkillRepoPath/bundledAgentBodyRepoPath builders; normalize the machine root to <PKG>/... in the two prompt goldens so committed evidence stays portable. ln-induct finding from PR #273. Graduates the 'repo-relative resource pointer handed to a runtime/model reader' contract lens and reconciles the SPEC 'Live-vs-harness wiring divergence' blind spot. --------- Co-authored-by: Amp <amp@ampcode.com> Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>

re-sync and add notes about server refactor
ln-sync updates
resolve threads and thread_context concepts
update spec skill to use username based id suffixes on items
design and contract additions around intent graph semantics
align and update convo runtime doc with cross-references
FE-700: scaffold relation policy registry
skill dirs cleanup
start a docs/next/ folder
Signed-off-by: Lu Nelson ln@hash.ai
remove tool results from transcript
Signed-off-by: Lu Nelson ln@hash.ai
Add Brunch POC architecture PRD
Amp-Thread-ID: https://ampcode.com/threads/T-019e3a39-ed43-7738-ba68-5ed42148be9a
Co-authored-by: Amp amp@ampcode.com
Refine next-line Brunch POC PRD
Amp-Thread-ID: https://ampcode.com/threads/T-019e3a39-ed43-7738-ba68-5ed42148be9a
Co-authored-by: Amp amp@ampcode.com
Synthesize next-line Brunch architecture PRD
Amp-Thread-ID: https://ampcode.com/threads/T-019e3a39-ed43-7738-ba68-5ed42148be9a
Co-authored-by: Amp amp@ampcode.com
Make next-line PRD JSONL-first for sessions
Amp-Thread-ID: https://ampcode.com/threads/T-019e3a39-ed43-7738-ba68-5ed42148be9a
Co-authored-by: Amp amp@ampcode.com
add design doc for extended workspace graphs: intent, design, oracle
add new docs and speculations re potential "next" version
Add pi JSONL session viability note
Amp-Thread-ID: https://ampcode.com/threads/T-019e3a39-ed43-7738-ba68-5ed42148be9a
Co-authored-by: Amp amp@ampcode.com
FE-700: add intent context snapshots
FE-700: drive cascade impact from relation policy
FE-700: share relation-policy edit impact
FE-700: sync relation-policy foundation status
add further notes on next poc
docs: finalize POC architecture, seam-extensions, and fixture strategy
Amp-Thread-ID: https://ampcode.com/threads/T-019e4462-0fbc-7552-8dd2-825eaba27afb
Co-authored-by: Amp amp@ampcode.com
chore: archive pre-POC docs and planning memory under archive/
Move legacy design, reference, schema, prototypes, and superseded next/
architecture notes to archive/. Move pre-POC SPEC.md, PLAN.md, and
SERVER_REFACTOR_NOTES.md to archive/memory/ in preparation for fresh
POC-targeted memory reset. Retain docs/design/BEHAVIORAL_KERNELS.md
as canonical input to the POC oracle plane.
Amp-Thread-ID: https://ampcode.com/threads/T-019e4462-0fbc-7552-8dd2-825eaba27afb
Co-authored-by: Amp amp@ampcode.com
chore: remove pre-POC implementation and build infra
Delete src/, drizzle/, bin/, scripts/agent-probes/, public/, .ladle/,
and all build/runtime config (package.json, tsconfig.json, vite, drizzle,
docker, oxlint/oxfmt, etc.) in preparation for a fresh POC scaffold
built thinly over pi-coding-agent. Skills, agent harness configs,
praxis docs, and the three canonical POC architecture docs remain.
Amp-Thread-ID: https://ampcode.com/threads/T-019e4462-0fbc-7552-8dd2-825eaba27afb
Co-authored-by: Amp amp@ampcode.com
docs(memory): reseed SPEC.md and PLAN.md from POC architecture docs
SPEC.md establishes product contract, capability requirements,
assumptions A1-L through A10-L, decisions D1-L through D14-L,
invariants I1-L through I10-L, future direction register, lexicon,
and verification stance — anchored on the three canonical POC
architecture docs.
PLAN.md sequences M0-M9 from the PRD as stable-id frontier items
on the active/next/horizon ladder, plus brief-library-curation and
fixture-strategy-evolution as parallel low-conflict work. walking-skeleton
is the single active frontier and absorbs Phase-3 infra bootstrap.
Amp-Thread-ID: https://ampcode.com/threads/T-019e4462-0fbc-7552-8dd2-825eaba27afb
Co-authored-by: Amp amp@ampcode.com
chore: bootstrap Phase 3 POC infra (walking-skeleton scaffold)
Minimal Node/TS scaffold over @earendil-works/pi-coding-agent:
scripts (fix/check/verify) per AGENTS.md verification harness
pi-coding-agent import chain resolves end-to-end
and SessionManager are present in the pi import surface
per docs/next/architecture/brunch-poc-fixture-strategy.md
docs, memory/SPEC.md + PLAN.md, .brunch-fixtures/, BEHAVIORAL_KERNELS,
and the praxis docs.
Verified: npm run verify (fmt:check + lint + test + build) green.
Amp-Thread-ID: https://ampcode.com/threads/T-019e4462-0fbc-7552-8dd2-825eaba27afb
Co-authored-by: Amp amp@ampcode.com
chore: remove stale .tours/ and config/ from pre-POC trunk
.tours/ contained three codetours describing the old client refactor
(progressive rendering boundaries, workspace controller, mutation
boundaries) — all referencing deleted src/client and src/server code.
config/ contained four Vite plugin configs (vite-client, vite-dev-server,
vite-react-scan, vite-server-runtime) tied to the removed React + Vite +
TanStack stack.
Amp-Thread-ID: https://ampcode.com/threads/T-019e4462-0fbc-7552-8dd2-825eaba27afb
Co-authored-by: Amp amp@ampcode.com
docs: flatten docs/next/ to docs/, drop brunch-poc- prefix
The docs/next/ subtree predates the next-baseline rebase; with the
pre-POC line archived, the 'next' sublabel no longer carries meaning.
Flatten:
docs/next/README.md -> docs/README.md
docs/next/architecture/brunch-poc-architecture-prd.md -> docs/architecture/prd.md
docs/next/architecture/brunch-poc-pi-seam-extensions.md -> docs/architecture/pi-seam-extensions.md
docs/next/architecture/brunch-poc-fixture-strategy.md -> docs/architecture/fixture-strategy.md
docs/next/architecture/artifacts/ -> docs/architecture/artifacts/
Update all cross-references in the moved docs, memory/SPEC.md,
memory/PLAN.md, and .brunch-fixtures/README.md. Rewrite stale
hashintel/brunch/ absolute paths in prd.md to brunch-next/, and
point SPEC_WORKSPACE_GRAPHS.md references at archive/ where the
file now lives.
Verified: npm run verify green.
Amp-Thread-ID: https://ampcode.com/threads/T-019e4462-0fbc-7552-8dd2-825eaba27afb
Co-authored-by: Amp amp@ampcode.com
Harden planning skills and reconcile memory
Amp-Thread-ID: https://ampcode.com/threads/T-019e44e3-7a5e-70ed-9623-2376c822373f
Co-authored-by: Amp amp@ampcode.com
Sharpen spec event and state framing
Amp-Thread-ID: https://ampcode.com/threads/T-019e44e3-7a5e-70ed-9623-2376c822373f
Co-authored-by: Amp amp@ampcode.com
design ideations re persistence and multi-spec data model
docs(plan): annotate walking-skeleton frontier with FE-729 and branch
Amp-Thread-ID: https://ampcode.com/threads/T-019e4462-0fbc-7552-8dd2-825eaba27afb
Co-authored-by: Amp amp@ampcode.com
FE-702: Walking skeleton — brunch binary + TUI over pi (M0) (#142)
significant spec/plan updates re thinness of layers
tighten the definition of command layer
more refinement around session coordination vs specification and boot
correct PLAN mismatches vs SPeC
add verification design
scope for M0
Signed-off-by: Lu Nelson ln@hash.ai
Add workspace session coordinator
Wire TUI boot through workspace coordinator
Exclude tests from build output
Fix session binding across pi flush and new sessions
Bind sessions from pi session start events
Flush session binding before agent starts
Fix Brunch session binding flush timing
Use Pi session header type
Project Brunch binding entry from Pi custom entry
Derive store oracle session summaries
Use Pi typed message start event directly
Project TUI extension test fakes from Pi types
Document Pi type ownership praxis
Mark walking skeleton complete
Signed-off-by: Lu Nelson ln@hash.ai
FE-735: Mode shell and fixture driver (M1) (#144)
FE-735: Add print snapshot transport shell
FE-735: Add named JSON-RPC stdio skeleton
FE-735: Project elicitation exchanges from JSONL
FE-735: Project real Pi JSONL exchanges
FE-735: Scope session exchange RPC to current session
FE-735: Add RPC print snapshot parity smoke
FE-735: Add fixture capture bundle skeleton
FE-735: Seed deterministic fixture briefs
FE-735: Scope capture seam review fixes
FE-735: Stabilize current session capture
FE-735: Reconcile fixture brief format docs
FE-735: Use Pi session entry types for exchange projection
FE-735: Report Brunch-owned fixture metadata version
FE-735: Capture scripted brief runs
FE-735: Bind scripted captures per brief
FE-735: Project tool results as prompt entries
FE-735: Add M1 verification runbook
FE-735: Reconcile M1 fixture verification
FE-736: JSONL session viability proof (M2) (#146)
FE-736: Start JSONL session viability frontier
test: prove coordinator JSONL reload parity
test: prove JSONL payload survival
fix: project elicitation exchanges from active branch
test: replay M1 fixtures through JSONL reload
sync op, closing out frontier M2
major agent-mode/-lens design session spec captures
Amp-Thread-ID: https://ampcode.com/threads/T-019e4a8e-0210-76fe-9f11-8aece6190fc9
Co-authored-by: Amp amp@ampcode.com
Amp-Thread-ID: https://ampcode.com/threads/T-019e4b15-7745-7201-9383-57779c7738b8
Co-authored-by: Amp amp@ampcode.com
Co-authored-by: Amp amp@ampcode.com
FE-737: Web shell over the same host (M3) (#147)
FE-737: Start web shell frontier
FE-737 reject non-linear transcript JSONL
FE-737 fail fast on non-linear session RPC
FE-737 block TUI branch flows
FE-737 clarify web-shell slice status
FE-737 enforce strict transcript reader shape
FE-737 centralize linear exchange projection
FE-737 add minimal web HTTP shell
FE-737 add web websocket RPC bridge
FE-737 render workspace snapshot in React shell
FE-737: Share JSON-RPC protocol helpers
FE-737: Add WebSocket RPC transport adapter
FE-737: Persist browser RPC client connection
FE-737: Serve canonical built web shell
FE-737: Stabilize React web runtime
FE-737: Target session projections explicitly
Harden explicit session projection reads
Share JSON-RPC dispatch failures
Harden browser RPC protocol failures
Constrain web asset paths
Reuse shared JSON-RPC response type
Render read-only web transcript projection
Share session binding codec
Require cwd for RPC handlers
Treat browser RPC socket errors as terminal
Render transcript display projection
Record M3 smoke postconditions
Validate explicit session self-description
Render elicitation prompt display rows
Tie off web shell M3
add ln-judo-review skill
Share Brunch session envelope reader
Use explicit transcript custom entry classifiers
Use typed web session projection target
Sync web shell closeout
Restore ln-judo-review skill
FE-744: Document Pi command containment evidence (#150)
FE-744: Document Pi command containment evidence
FE-744: Prove dynamic Brunch chrome wrapper
restore provisional plan
FE-744: Refresh provisional Pi UI handoff
Tighten ln-build artifact cleanup guardrails
capture brunch ANSI logo exploration and decision
FE-744: Add workspace launch inventory
FE-744: Activate workspace switch decisions
FE-744: Add workspace switcher decision UI
FE-744: Gate TUI startup on workspace switch
FE-744: Rename implicit coordinator operations
FE-744: Split coordinator caller interfaces
FE-744: Remove source-string boundary tests
FE-744: Require activated chrome session state
FE-744: Narrow coordinator test doubles
FE-744: Route fixture capture through RPC handlers
FE-744: Extract Brunch Pi extension entrypoint
FE-744: Split workspace switcher modules
FE-744: Replace shell source test with helpers
FE-744: Fix offline default env typing
FE-744: Retire exhausted refactor queue
FE-744: Split Brunch extension surfaces
FE-744: Allocate Brunch chrome surfaces
FE-744: Add in-session workspace switch command
FE-744: Add startup no-resume oracle
FE-744: Reconcile Pi UI extension memo
FE-744: Use default workspace custom UI
FE-744: Remove empty footer formatter
FE-744: Restore default working indicator
FE-744: Document simplified custom UI posture
FE-744: Delete inert working indicator seam
FE-744: Make Brunch extension shell explicit
do docs sync, to capture remaining critical UI issues
wip on brunch pi extensions
header and footer looking reasonable
brunch tool restrictions + autocomplete system prompt inject + docs updates
FE-744: Reconcile structured elicitation planning
add project identity discovery module
spec, plan and scope updates
FE-744 flatten pi extension shell
FE-744 move pi tui components
FE-744 add brunch menu shell
FE-744 merge honest chrome wrapper
FE-744 port operational mode policy
FE-744 port mention autocomplete
FE-744 port alternatives primitive
FE-744 retire pi probe runtime
interim draft scoping
stub a POC for modal brunch menu
FE-744 reconcile pi extension port cleanup
FE-744 project brunch agent runtime state
FE-744 apply brunch agent runtime posture
FE-744: Share Brunch workspace dialog
FE-744 persist brunch agent runtime switches
FE-744 reconcile runtime state cards
config housekeeping
WIP on workspace-dialog, essential style and flow is right
workspace menu ux refinement plan
Add hierarchical spec session selection model
Render hierarchical spec session picker
Expose RPC spec session activation
Retire workspace picker wording
Adjust spec session picker UX
Refine picker layout and in-session order
Hide illogical spec session picker options
Support ctrl-c in spec session picker
plan refinements for critical UI proof slices
Retire flat spec session picker API
Schema-validate spec session RPC activation
Restore rich Brunch chrome projection
Define structured question result payloads
Add structured question TUI adapter
Add structured question RPC editor fallback
spec and plan updates re compaction control
Characterize structured question terminal details
Prove structured question RPC editor fallback
Expose structured question RPC proof test
Project terminal structured question responses
Cover structured question JSONL projection
Reconcile structured question proof evidence
Retire structured question refactor queue
spec and plan re side- and sub-agents vs side-tasks
Characterize fixture mention mode
Characterize live chrome footer
Extract chrome formatting helpers
Recover chrome header summary
Reconcile chrome status ownership
Move chrome behavior tests to chrome module
Move mention autocomplete tests to feature module
Expose chrome footer telemetry projection
Narrow aggregate chrome exports
Hide fixture mention exports
Prune private chrome helper exports
big disambiguation sync re spec and session state, grades, postures, etc
plan adjustment re priority of falsification of assumptions
focus the next plan on proving structured exchanges
first pass on question tool refinements
Stabilize ask user question rendering
Keep ask user question tests out of extension loading
Move experimental question tool under structured exchange
spec/plan/cards for minimal questionnaire logic integration
Add structured exchange option notes
Add structured exchange editor fallback
Add structured exchange RPC proof
ln- skill pass on attacking uncertainty
Add public RPC method discovery
sharpening of ln- skills around tracer bullet convergent targets
Add deterministic elicitation start RPC
structured-exchange jit side mission
Replace option notes with inline JIT editor
Add pending elicitation exchange RPC
Add listed-option elicitation response RPC
Accept chunked startup title input
Expose ask user question in elicit mode
Move structured exchange into discoverable tui extension
Move Pi TUI modules under discoverable client tree
Colocate TUI client tests under pi test directory
Consolidate structured exchange tool
Record durable structured exchange rendering model
pi local settings
add topographic legibility as ln-review dimension
Move public RPC modules under rpc tree
Move probe harnesses under probes tree
Rename runbook checks to probe scripts
Remodel structured exchange tools
Prove structured exchange ordering
handoff state, as of resolved structured-exchange plan
Implement structured exchange request choices
Project structured exchange tuples
Move RPC elicitation onto tuple truth
Add public RPC parity proof
Harden public RPC parity exchange identity
Close pending exchange on terminal request status
Preserve option artifacts in RPC parity
Sync FE-744 RPC parity state
Add session transcript renderer
Discover prod-ready Brunch Pi extensions
Add public RPC parity probe artifacts
Harden parity artifact witness
Add parity report envelope
Render semantic transcripts by default
post semantic-transcripts sync
Restore explicit Brunch extension registry
Canonicalize fixture root
Retire stale brief fixture machinery
Bound public RPC parity to exchange permutations
Add web live updates for RPC exchanges
spec and scope capture re tool schemas, in great detail
Add Brunch prompt-pack topology
Add structured exchange schema contract README
Add structured exchange shared schemas
Add structured exchange present schemas
Add structured exchange request schemas
Add minimal structured exchange capture schemas
Export structured exchange schema surface
add pseudo skill + cross-links + living examples in PLAN.md
new pseudo skill: minimal notation typology for human-agent design
(tree, chain, graph, matrix, state-machine, data-shape, lanes) with
shared overlay grammar (#anchor, @owner, +/-/
/!/?, ->/>/x>) and arouting chain expressed in its own chain notation.
cross-link directives in ln-{spec,design,scope,plan,refactor,review,
sync,build} using a grep-able Notation aid. lead-in.
ln-sync directive explicitly preserves existing pseudo artifacts and
consolidates qualifying prose into them, so future sync runs do not
collapse pseudo back to prose.
PLAN.md updates as living examples:
(m5 -[optional]-> subagents, graph-plane -[on promotion]-> oracle)
visible and horizon items grouped under unconnected
(obligation decomposition) with each leaf individually testable
Amp-Thread-ID: https://ampcode.com/threads/T-019e77c1-cc1c-73db-a4ab-d1e9bec3be5e
Co-authored-by: Amp amp@ampcode.com
post-skill sync, after pseudo stuff added
FE-744: Extract Brunch TUI identity primitives
FE-744: Brand persistent TUI chrome
FE-744: Capture branded startup chrome evidence
FE-744: Reconcile chrome closeout
FE-744: Reconcile chrome title status
plan enhancements re graph extension
Co-authored-by: Amp amp@ampcode.com
FE-776: Graph Layer preps (#162)
add pi dev posture doc
FE-776: Add Brunch Pi profile boundary
FE-776: Seal Brunch Pi settings policy
FE-776: Prove runtime state transcript contract
FE-776: Wire runtime state posture tests
docs(archive): prune legacy-carryover and preface plan history
archive/docs/ is reduced from a full pre-next docs/ tree carryover to
the single load-bearing reference (SPEC_WORKSPACE_GRAPHS.md, still
linked from docs/architecture/prd.md). Legacy copies whose canonical
form lives on the brunch main branch are deleted; nothing unique is
lost.
docs/archive/PLAN_HISTORY.md gains a preface preserving the 2026-05-20
'Pre-POC archive and reseed' origin entry and the 2026-05-22 sync
archive (web-shell initial/hardening/tie-off/judo-review slices and
the original walking-skeleton brief), which only existed in the
carryover PLAN_HISTORY.md before this commit. The doubled
archive/archive/... link inside the jsonl-session-viability entry is
replaced with a plain main-branch pointer.
Amp-Thread-ID: https://ampcode.com/threads/T-019e7d8c-ab82-7507-b2e5-8351c5821202
Co-authored-by: Amp amp@ampcode.com
Consolidates the edge layer into a single canonical reference and the
minimal type stubs that present-design-claim it. Nodes are deferred
to Phase 2 and called out as such in the doc.
Eight closed structural edge categories (dependency, proof, support,
realization, boundary, composition, association, supersession) with
endpoint roles, single stance enum required only for proof and
support, and a binary basis (explicit | accepted_review_set) — no
status field, no inferred basis, no named-relation catalogue. The
agent chooses category; tuple-specific labels are derived at
projection time and cannot change category policy.
ReconciliationNeed is a separate substrate that references edges
(default) or node-pairs (for not-yet-existing relations like possible
duplicates). It is not itself a graph edge.
Files:
Retirements:
pointer to GRAPH_MODEL.md as canonical successor.
retired; the M4 named-relation catalogue (validates / instance_of /
produces / discharges / depends_on / derived_from / counterexample_for /
witnesses) maps into the eight categories per GRAPH_MODEL.md
§'Worked examples'. The oracle-plane node schemas in that doc are
not retired.
Drizzle table definitions, structural validators, the linkX command
surface, and projection builders all land in subsequent M4/M5 slices.
Verify: green (fmt:check, lint 0/0, typecheck, 253 tests, build).
Amp-Thread-ID: https://ampcode.com/threads/T-019e7d8c-ab82-7507-b2e5-8351c5821202
Co-authored-by: Amp amp@ampcode.com
Reconcile memory/SPEC.md and memory/PLAN.md to the Phase 1 edge
lock-and-materialize landed at 100585a and the canonical edge
contract in docs/design/GRAPH_MODEL.md.
SPEC.md:
Phase 2 node-shape concern.
add D51-L dependency.
retire "concerns-edge" wiring; refined by D51-L.
basis}, not free-form relation.
ReconciliationNeed substrate; canonical contract in
docs/design/GRAPH_MODEL.md; supersedes pi-seam-extensions §Edge
types, relation-policy registry, brainstormed edge taxonomy,
concerns-edge wiring.
replaced by node_pair target.
and immutable accepted-edge identity; reconciliation need points
at edge|node_pair target shape.
PLAN.md:
execution pointer reflects Phase 1 lock landed plus stubs under
src/graph/; Phase 2 nodes still pending.
Amp-Thread-ID: https://ampcode.com/threads/T-019e7d8c-ab82-7507-b2e5-8351c5821202
Co-authored-by: Amp amp@ampcode.com
to docs/archive/PLAN_HISTORY.md under a 2026-06-01 Sync archive section.
M4 prep envelope on ln/fe-776-graph-layer-prep-profile, carrying two
strands: (a) Pi harness sealing, (b) graph-model lock-and-materialize
(Phase 1 edges landed; Phase 2 nodes + A20-L Drizzle spike remaining).
the prep envelope.
updated to match active sequencing.
Amp-Thread-ID: https://ampcode.com/threads/T-019e7d8c-ab82-7507-b2e5-8351c5821202
Co-authored-by: Amp amp@ampcode.com
Amp-Thread-ID: https://ampcode.com/threads/T-019e82ff-d6d1-74fb-a574-ec31f359b31e
Co-authored-by: Amp amp@ampcode.com
New decisions:
with directed layer dependencies
Updated decisions:
New invariants:
Lexicon: commitGraph, propose-graph, project-graph
Future direction: agents/ axis layout (modes/strategies/lenses/contexts)
Amp-Thread-ID: https://ampcode.com/threads/T-019e830f-381b-755a-9437-cbed9c54d22e
Co-authored-by: Amp amp@ampcode.com
primary proof target, flag as highest-stakes assumption
source topology, graph snapshot readers (I35-L), numbered execution
pointer steps
commit-graph tool in layout, D52-L directory references, A14-L proof
as primary objective
Amp-Thread-ID: https://ampcode.com/threads/T-019e830f-381b-755a-9437-cbed9c54d22e
Co-authored-by: Amp amp@ampcode.com
New directories with README.md files documenting layer ownership,
dependency direction, target file layout, and migration notes:
GRAPH_MODEL.md: add commitGraph §Agent-facing command surface with
tool call shape, intra-batch/existing ref modes, CommandExecutor
processing steps, and all-or-nothing invariant (I34-L)
Amp-Thread-ID: https://ampcode.com/threads/T-019e830f-381b-755a-9437-cbed9c54d22e
Co-authored-by: Amp amp@ampcode.com
GRAPH_MODEL.md:
SPEC.md:
Amp-Thread-ID: https://ampcode.com/threads/T-019e835d-11aa-70d5-8095-d4531afe9c94
Co-authored-by: Amp amp@ampcode.com
IntentKind/OracleKind/DesignKind/PlanKind, IntentKindCategory,
DecisionDetail/TermDetail/ConstraintDetail, and intentKindCategory().
(change_log owns audit trail).
Amp-Thread-ID: https://ampcode.com/threads/T-019e835d-11aa-70d5-8095-d4531afe9c94
Co-authored-by: Amp amp@ampcode.com
Amp-Thread-ID: https://ampcode.com/threads/T-019e835d-11aa-70d5-8095-d4531afe9c94
Co-authored-by: Amp amp@ampcode.com
Amp-Thread-ID: https://ampcode.com/threads/T-019e835d-11aa-70d5-8095-d4531afe9c94
Co-authored-by: Amp amp@ampcode.com
Amp-Thread-ID: https://ampcode.com/threads/T-019e835d-11aa-70d5-8095-d4531afe9c94
Co-authored-by: Amp amp@ampcode.com
Amp-Thread-ID: https://ampcode.com/threads/T-019e835d-11aa-70d5-8095-d4531afe9c94
Co-authored-by: Amp amp@ampcode.com
Amp-Thread-ID: https://ampcode.com/threads/T-019e835d-11aa-70d5-8095-d4531afe9c94
Co-authored-by: Amp amp@ampcode.com
Amp-Thread-ID: https://ampcode.com/threads/T-019e835d-11aa-70d5-8095-d4531afe9c94
Co-authored-by: Amp amp@ampcode.com
Spike validated the persistence toolchain for graph-data-plane:
multi-edge, LSN allocation, change-log) atomic with full rollback
typebox v0.34) serve different roles; shared enum arrays bridge both
A20-L promoted to validated in SPEC. D16-L updated with settled stack.
PLAN execution pointer updated; session display names is the sole
remaining item before prep envelope tie-off.
Amp-Thread-ID: https://ampcode.com/threads/T-019e83af-1293-769a-a02e-a0df221c7318
Co-authored-by: Amp amp@ampcode.com
New sessions get a display name derived from spec title + session ordinal
(e.g. 'My spec — session 2'). The name is persisted as a Pi session_info
entry so it survives reload. chromeStateForWorkspace populates session.label
from the name, falling back to session id when absent. Resumed sessions
preserve their existing display name.
This is the last item in the sealing strand of sealed-pi-profile-runtime-state
(FE-776). The prep envelope is ready to tie off.
Amp-Thread-ID: https://ampcode.com/threads/T-019e83af-1293-769a-a02e-a0df221c7318
Co-authored-by: Amp amp@ampcode.com
Frontier marked done. Both strands complete. graph-data-plane (M4 CRUD)
status updated to next/unblocked. Recently Completed entry added.
Amp-Thread-ID: https://ampcode.com/threads/T-019e83af-1293-769a-a02e-a0df221c7318
Co-authored-by: Amp amp@ampcode.com
Stub db/schema.ts (Drizzle tables for nodes, edges, graph_clock,
change_log, reconciliation_need), db/connection.ts (better-sqlite3
lifecycle), and db/row-schemas.ts (drizzle-typebox derived schemas).
Graph domain types in graph/schema/edges.ts and graph/schema/nodes.ts
now derive EdgeCategory, EdgeStance, EdgeBasis, IntentKind, OracleKind,
DesignKind, PlanKind, and NodeBasis from db/schema.ts const arrays
instead of redeclaring string literal unions. Single enum source flows
from db/ → graph/ → Pi tool params (via typebox v1.x separately).
Amp-Thread-ID: https://ampcode.com/threads/T-019e83af-1293-769a-a02e-a0df221c7318
Co-authored-by: Amp amp@ampcode.com
Amp-Thread-ID: https://ampcode.com/threads/T-019e83af-1293-769a-a02e-a0df221c7318
Co-authored-by: Amp amp@ampcode.com
Stand up the CommandExecutor as the single public mutation boundary
for graph truth (D4-L, D20-L). One SQLite transaction per command:
structural validation → LSN allocation from graph_clock → node insert
→ change_log append → structured result return.
Acceptance:
policy_blocked, version_conflict (last three are M6 placeholders)
Schema corrections:
Verified: npm run verify (check + test + build) — 279 tests pass.
Amp-Thread-ID: https://ampcode.com/threads/T-019e83d7-3670-767f-b9b0-aa7e611abdc1
Co-authored-by: Amp amp@ampcode.com
Amp-Thread-ID: https://ampcode.com/threads/T-019e83d7-3670-767f-b9b0-aa7e611abdc1
Co-authored-by: Amp amp@ampcode.com
Add CommandExecutor.commitGraph — the propose-graph strategy's
load-bearing tool. One tool call creates an entire subgraph (nodes
and edges) in a single transaction with one LSN.
Processing pipeline:
verify existing-node refs → validate + resolve edges →
insert edges → append change_log → return success
Acceptance (22 new tests, 44 total):
iff proof/support, stance forbidden for other categories,
self-loop rejection, missing ref rejection
nodes — no partial writes, no LSN bump
New types: CommitGraphInput, CommitGraphSuccess, CommitGraphResult,
BatchNodeInput, BatchEdgeInput, BatchEdgeRef.
Verified: npm run verify (check + test + build) — 301 tests pass.
Amp-Thread-ID: https://ampcode.com/threads/T-019e83d7-3670-767f-b9b0-aa7e611abdc1
Co-authored-by: Amp amp@ampcode.com
Amp-Thread-ID: https://ampcode.com/threads/T-019e83d7-3670-767f-b9b0-aa7e611abdc1
Co-authored-by: Amp amp@ampcode.com
Two read functions in graph/snapshot.ts:
current LSN, and superseded-predecessor exclusion
supersession filtering, and not_found error shape
Types re-exported through graph/index.ts. 10 new tests (311 total).
Amp-Thread-ID: https://ampcode.com/threads/T-019e83f6-44c9-741a-a90a-9e9535774b3d
Co-authored-by: Amp amp@ampcode.com
Amp-Thread-ID: https://ampcode.com/threads/T-019e83f6-44c9-741a-a90a-9e9535774b3d
Co-authored-by: Amp amp@ampcode.com
CommandExecutor gains createReconciliationNeed (validates edge/node_pair
target existence, allocates LSN, appends change_log) and
resolveReconciliationNeed (rejects non-existent or already-resolved).
getOpenReconciliationNeeds reader in snapshot.ts returns typed domain
objects. Oracle-plane stub acceptance already met by existing createNode
Amp-Thread-ID: https://ampcode.com/threads/T-019e83f6-44c9-741a-a90a-9e9535774b3d
Co-authored-by: Amp amp@ampcode.com
Amp-Thread-ID: https://ampcode.com/threads/T-019e83f6-44c9-741a-a90a-9e9535774b3d
Co-authored-by: Amp amp@ampcode.com
Amp-Thread-ID: https://ampcode.com/threads/T-019e83f6-44c9-741a-a90a-9e9535774b3d
Co-authored-by: Amp amp@ampcode.com
Co-authored-by: Amp amp@ampcode.com
FE-785: M5 agent-graph-integration (#163)
Amp-Thread-ID: https://ampcode.com/threads/T-019e83f6-44c9-741a-a90a-9e9535774b3d
Co-authored-by: Amp amp@ampcode.com
Relocate Pi extension shell and all product extensions, components,
context builders, and tests from src/tui-client/ to src/.pi/ to
match the D52-L source topology: src/{.pi, agents, db, graph, session, rpc, web}.
Update all import paths, projectRoot() helpers, relative URL depths,
and the build:pi-assets script in package.json.
Amp-Thread-ID: https://ampcode.com/threads/T-019e840d-172b-736c-839e-e441f7308220
Co-authored-by: Amp amp@ampcode.com
M5 slice 1: A14-L proof-of-life — the agent can now call commit_graph
to atomically create nodes+edges and read_graph to inspect graph state.
and CommandResult → tool result text formatting
parameter schemas using StringEnum for enums
I34-L all-or-nothing rollback, not-found handling
Amp-Thread-ID: https://ampcode.com/threads/T-019e840d-172b-736c-839e-e441f7308220
Co-authored-by: Amp amp@ampcode.com
Update all src/tui-client/.pi/ path references to src/.pi/ in both
canonical planning docs. Mark agent-graph-integration as in-progress
with execution pointer noting the topology move and graph tool wiring.
Amp-Thread-ID: https://ampcode.com/threads/T-019e840d-172b-736c-839e-e441f7308220
Co-authored-by: Amp amp@ampcode.com
stubs for future
config and package updates, maybe breaking
format and lint fixes
vite react plugin v6
prep for spec-persistence-and-startup batch 1
Add spec persistence command boundary
Boot workspaces from DB-backed specs
Move src/ to D52-L topology; reconcile spec-persistence
projection-reader, transcript, elicitation/structured-exchange, project-identity)
src/web/, test-helpers to src/probes/; delete empty snapshot-{graph,nodes} stubs
web-host dist-web resolution for the new locations
SPEC: revise D25-L (orthogonal strategy/lens axes), D40-L (session-agent
record, role derived from op_mode); add D58-L (3-layer composition), D59-L
(goal axis), D60-L (snapshot pull/render/surface); rewrite §309/§311 to the
3-layer model; update I25-L; add Lexicon terms (Session agent, Goal, AUTO,
Capability/skill, Snapshot, Agent definition); retire legacy (lens-catalogue,
pinning posture, runtime bundle, flat composition prose).
PLAN: register agent-runtime-vocabulary (active) and agents-composition-layer
(next) frontiers with dependencies; sequence ahead of the M5 A14-L proof.
remove legacy brunch memory files
agent context composition re-spec I
agent context composition re-spec/-plan II
Collapse duplicate session entry predicate
Share transcript entry predicates
Handle unreadable session files
Lock agent-composition manifest model; reconcile SPEC/PLAN
(capability synonym retired); manifest {name,description,location}
metadata code-owned in agents/state.ts, not filesystem-discovered.
render layer, not a manifest resource family.
oracle design reconciled (already filed as I38-L), not owed.
D58-L manifest model (thin header + read-on-demand resources, not eager
packs), D40-L/D59-L state axes (op_mode + goal/strategy/lens, role derived),
D60-L contexts-as-render, and the concrete agents/ topology. Fixes stale
session.mode/agent vocab, modes/ dir, readiness-context, and the
.pi/context migration table.
Extract workspace boot session store classifier
Preserve session store oracle binding diagnostics
docs: reconcile workspace posture persistence
FE-789: Fix session-agent runtime vocabulary
FE-785: Prove propose-graph commit path
FE-785: Gate review-set proposals by dry-run validation
FE-785: Fold runtime vocabulary into graph integration plan
FE-785: Rename session-agent goals as objectives
Document public RPC exchange vocabulary
FE-785: Align review-set proposal state with RPC contract
Lock graph persistence topology
mega sync and archive of docs vs SPEC
FE-785: Reframe plan around POC delivery
Co-authored-by: Amp amp@ampcode.com
FE-795: Live selected-spec graph observer over web RPC (#166)
FE-795: Track live graph observer frontier
spec updates with nuance capture re prompt assembly
ln-scope: rewrite for multi-file scope storage under memory/cards/
(or dev--/tooling--/docs-- prefix when not a PLAN frontier)
sanctioned exception. Hard anti-speculation gate leads the section.
with overlapping primary write paths must be merged or reshaped.
(required) and light cards (when non-trivial), using pseudo tree
with + ~ - ? markers. Doubles as a manifest for parallel-agent
conflict-avoidance.
off to ln-build.
Pairs with subsequent ln-build rewrite (Card 2) and cross-reference
sweep (Card 3). Queue in memory/CARDS.md while the sweep is pending.
Amp-Thread-ID: https://ampcode.com/threads/T-019e8c75-8051-73ee-a611-00c58c546cbe
Co-authored-by: Amp amp@ampcode.com
file for current frontier → pick + announce; otherwise list
active scope files and ask via tool-ask-question. Never scan or
pick by mtime/alphabetical.
between each card in a chain. Even when ln-scope honored the
hard anti-speculation gate, implementation can still surprise.
Mark the rest of the chain stale and route back to ln-scope.
bulk on the directory or with globs. Honors AGENTS.md
file-scoped-invocations rule. Partial-done files stay in place.
Stale files get Status: superseded and survive for ln-sync.
all 8 serial-execution stop conditions; canonical reconciliation
discipline; cross-skill check before stopping.
is allowed with a note; significant divergence triggers
overlap-as-independence-test recheck against other active files
for the same frontier.
Pairs with ln-scope rewrite (Card 1, 76a2d9b). Cross-reference
sweep (Card 3) follows.
Amp-Thread-ID: https://ampcode.com/threads/T-019e8c75-8051-73ee-a611-00c58c546cbe
Co-authored-by: Amp amp@ampcode.com
Mechanical update propagating the storage seam established by Cards
1+2 (ln-scope and ln-build rewrites). All 18 references to
memory/CARDS.md across the family now point at scope files under
memory/cards/ with consistent terminology.
Touched files:
added so ln-sync respects AGENTS.md file-scoped-invocations)
scope files for one frontier do not imply multiple branches)
memory/CARDS.md (the queue file holding this work) is marked done.
Cleanup of that file is the final step; surfacing as user decision
per the card's 'user-call at execution time' wording.
Amp-Thread-ID: https://ampcode.com/threads/T-019e8c75-8051-73ee-a611-00c58c546cbe
Co-authored-by: Amp amp@ampcode.com
All three cards (ln-scope rewrite, ln-build rewrite, cross-reference
sweep) landed in 76a2d9b, 98537ea, ee05769. Under the new regime
this skill family established, scope files live under memory/cards/
and stale derivative queues are deleted per-file (ln-sync rule).
This file held the work that defined that rule; honoring it here is
the final tie-off. Rationale preserved in git history + thread
T-019e8c75-8051-73ee-a611-00c58c546cbe.
Amp-Thread-ID: https://ampcode.com/threads/T-019e8c75-8051-73ee-a611-00c58c546cbe
Co-authored-by: Amp amp@ampcode.com
Mise-en-place Card 1 of live-graph-observer. Renames the npm package and
its single bin entry to 'brunch-cli', bumps version to 0.1.0, and adds a
reusable in-repo workbench cwd under .fixtures/workbenches/live-graph-observer/
so manual TUI/web smoke runs scaffold .brunch/ there rather than at the
repo root. Adds src/package-identity.test.ts as a regression oracle for
package name, version floor, single-bin discipline, and shim
executability.
Amp-Thread-ID: https://ampcode.com/threads/T-019e8cc3-ac62-7596-b46d-dee2e8be729c
Co-authored-by: Amp amp@ampcode.com
Card 1 of live-graph-observer graph-rpc-spine. Establishes spec ownership
at storage, command, reader, tool, and runtime layers (D61-L). Every
graph projection and graph mutation now targets exactly one spec.
Storage:
nodes, edges, reconciliation_need all gain a NOT NULL spec_id FK to
specs.id. Initial drizzle migration regenerated as 0000_deep_maria_hill;
graph_clock seed re-added manually.
Domain:
GraphNode, GraphEdge, ReconciliationNeed carry specId. CommandExecutor
inputs (CreateNodeInput, CreateReconNeedInput, CommitGraphInput) now
require specId. commitGraph rejects existing refs whose spec_id differs
from the command spec (structural_illegal). validateAndResolveBatchEdge
emits explicit cross-spec diagnostics. createReconciliationNeed
validates that target edge / node-pair belongs to the command spec.
Readers:
getGraphOverview(db, specId), getNodeNeighborhood(db, specId, nodeId),
getOpenReconciliationNeeds(db, specId) are spec-scoped. Supersession
filtering is also spec-scoped. WorkspaceGraphRuntime.forSpec(specId)
returns SpecScopedReaders so callers bind once instead of threading
specId through every read.
Pi extension:
BrunchGraphDeps now requires {specId, commandExecutor, snapshots}.
Registrar binds specId from the selected session/spec at construction
time; commit_graph / read_graph tool schemas never receive specId from
the LLM. brunch-tui constructs graphDeps via graph.forSpec(workspace
.spec.id) before passing to the extension shell.
Tests:
New tracer src/graph/spec-ownership.test.ts proves the seven
acceptance criteria (ownership isolation, existing ref guard,
endpoint guard, reader guard, tool guard, schema guard).
command-executor.test.ts and snapshot.test.ts updated to seed a spec
in beforeEach and thread specId through all calls. Pi graph-tools and
review-set-proposal tests likewise updated.
Verified: npm run verify (358 tests, lint, fmt, build all green).
Co-authored-by: Amp amp@ampcode.com
Amp-Thread-ID: https://ampcode.com/threads/T-019e8cc3-ac62-7596-b46d-dee2e8be729c
add typescript-language-server
Harden selected-spec graph authority
straggling web architecture card
FE-795: Add selected-spec graph RPC reads
FE-795: Add product update notification bus
FE-795: Add web graph route topology
FE-795: Launch observer host from TUI
FE-795: Open active spec web sidecar route
FE-795: Keep spec route session-local
FE-795: Share CLI RPC update publisher
FE-795: Rename web sidecar scope language
FE-795: Align discovery wire schemas
FE-795: Split web sidecar RPC surface
FE-795: Add session runtime state RPC projection
refactor rpc lexicon
rename rpc method expectations
rename session rpc handlers
remove transcript display from product rpc
docs(architecture): add Pi wrapper comparative — howcode vs Brunch
Captures the comparison between howcode's 'wrap Pi as the product' Electron
shell and Brunch's 'wrap Pi as infrastructure' posture. Surfaces risks already
present in Brunch (private SessionManager flush dependency, RPC name drift,
implicit Pi lifecycle coupling, read-model discipline pressure) with severity
ratings and SPEC.md cross-references; lists rabbit holes to refuse by default;
and orders prioritary debts to pay down.
Amp-Thread-ID: https://ampcode.com/threads/T-019e8d96-8f2f-750c-82a9-30a18bc004ed
Co-authored-by: Amp amp@ampcode.com
introduce rpc method registry
select rpc surface by registry
extract workspace rpc methods
extract graph rpc methods
extract session rpc methods
update rpc refactor status
ln-* skills: treat src/**/README.md as canonical topology docs
Adds a new 'topology READMEs' section to AGENTS.md naming directory-level
README.md files under src/**/ as canonical documentation (alongside
memory/SPEC.md and memory/PLAN.md), defining their shape and drift sources.
Adds targeted hooks in the skills that touch canonical state:
check; topology READMEs added to cross-skill preservation check.
question); new 'Topology READMEs' update rule that triggers when the
topology question is yes; cross-skill check extended.
must be grepped and repaired in topology READMEs during the same pass.
covering ownership, SPEC IDs, dependency direction, layout sketches,
and migration notes.
the same commit as the topology change they describe; Decisions section
prompts naming touched READMEs.
Amp-Thread-ID: https://ampcode.com/threads/T-019e8dae-2e8a-72e3-9bb7-18c3a344848d
Co-authored-by: Amp amp@ampcode.com
tighten runtime state rpc schema
reconcile rpc refactor drift
FE-795 tighten session runtime discovery
FE-795 extract structured exchange loop
FE-795 render graph overview panel
rename session exchange projection lexicon
reconcile structured exchange lexicon
FE-795 sync RPC naming docs
minor fix to scope cards
FE-795 document browser feedback loop
skill updates re using browser tools inside agent-safehouse SB
Update FE-795 plan tie-off
Co-authored-by: Amp amp@ampcode.com
FE-806: Agent prompt-resource composition, runtime manifests, and snapshot contexts (#169)
Sync plan for FE-806 start
Port Bilal spec graphs as dev fixtures + interrogative normalization rule
Add a one-off port of three spec graphs (~916 nodes, ~1866 edges) from
Bilal's spec-elicitation prototype into brunch-shaped JSON fixtures
under .fixtures/seed-specs/bilal-port/. Intended as rich, real
development seed data for the dev SQLite database. Not a probe-run
artifact; sits alongside .fixtures/runs/ rather than inside it. The
porting script is co-located with its output (.fixtures/** is excluded
from the verification harness by project config).
Mapping highlights derived in conversation:
with detail.{chosen_option, rejected[], rationale}
as its realization parent
curation flags (derived-risk-or-question, derived-design-statement)
when target is observational (evidence/assumption)
to basis=accepted_review_set, others to basis=explicit, with
epistemic flavor concatenated into source
Add an interrogative-content-normalization subsection to
docs/design/GRAPH_MODEL.md under Prompting guidance, codifying the
rewrite rule that motivates the risk-to-context mapping: brunch has
no question kind because intent nodes are claims; questions are
rewritten into the latent declarative (assumption, criterion, or
unresolved-state context), and the discovery-to-resolution arc uses
decision -[supersession]-> context.
Amp-Thread-ID: https://ampcode.com/threads/T-019e91ee-aa39-73d2-a346-a0ae1e55e3b9
Co-authored-by: Amp amp@ampcode.com
FE-806: Add agent prompt manifest skeleton
FE-806: Render selected-spec agent contexts
FE-806: Retire legacy prompt context
FE-806: Prove runtime prompt posture
ln-* skills: split planning by certainty posture (proving | earned)
Adds ln-plan/references/{proving,earned}.md with posture-specific
sequencing doctrine and annotation field sets. ln-plan/SKILL.md gains
§Operating posture and Procedure Step 0 (read .pi/POSTURE.md + load
matching reference) in place of the old §Tracer-bullet sequencing.
ln-scope, ln-consult, and the praxis doc are updated to mirror the
posture split: Posture check / Posture-aware route override with
proving and earned branches.
The earned-mode reference introduces a closure move-set (materialize,
consolidate, name canonically, delete-as-progress, retire bridges,
take-the-bigger-step), a circling-recognition heuristic, sprawl
guardrails, and earned→proving regression handling. Boundaries with
ln-refactor (safe mechanics) and ln-sync (canonical GC) are explicit.
Plan-template adds mandatory Certainty: and Posture annotations:
fields to frontier definitions.
Amp-Thread-ID: https://ampcode.com/threads/T-019e91c8-a351-75ea-b7b0-29be68d448d2
Co-authored-by: Amp amp@ampcode.com
straggling lint fixes
Fix selected-spec prompt context refresh
Use session posture type in prompts
Unify method and tool posture policy
Surface node context in graph reads
Align tool policy boot expectation
design and spec updates re graph
Namespace Brunch slash commands as /brunch:*
Pi parses slash command names as everything between the leading / and
the first whitespace, so a command registered with the literal name
'brunch:switch' is invocable as /brunch:switch -- the same trick the
built-in /skill: registry uses.
Introduce src/.pi/extensions/commands.ts as the registration hub for
the /brunch:* namespace. It owns:
runBrunchWorkspaceAction helper that still lives
in workspace-dialog.ts as private impl).
points at /brunch:switch (Pi shortcut contexts cannot switch
sessions yet).
workspace-dialog.ts is reduced to its private dialog action helpers
(runBrunchWorkspaceAction / runBrunchWorkspaceCommand). The retired
BRUNCH_WORKSPACE_COMMAND / BRUNCH_WORKSPACE_SHORTCUT constants,
registerBrunchWorkspaceDialog wrapper, and unused notify-only default
export are removed (pre-release posture - no compat shim).
pi-extension-shell.ts wires registerBrunchCommands in place of
registerBrunchWorkspaceDialog and updates re-exports.
Tests follow the new shape: the extension-registry smoke test now
points at commands.ts instead of workspace-dialog.ts and asserts the
full 5-command registration order; brunch-tui.test.ts uses the new
constants and exercises each stub handler to confirm the notify path.
Amp-Thread-ID: https://ampcode.com/threads/T-019e9276-ae38-770d-92de-a4dcff8b378b
Co-authored-by: Amp amp@ampcode.com
Co-authored-by: Amp amp@ampcode.com
FE-808: Broaden direct graph-tool proof beyond the A14 happy path (#171)
FE-808 persist graph node ordinals
FE-808 normalize graph approval basis
FE-808 resolve graph references by code
FE-808 enforce supersession acyclicity
FE-808 split active graph projection
Align probe transcripts with Pi context rendering
Amp-Thread-ID: https://ampcode.com/threads/T-019e92bc-e43a-727f-8acf-0213915029ff
Co-authored-by: Amp amp@ampcode.com
FE-808 canonicalize graph tool handles
Stub projection and format topology for LLM context
Amp-Thread-ID: https://ampcode.com/threads/T-019e92bc-e43a-727f-8acf-0213915029ff
Co-authored-by: Amp amp@ampcode.com
Amp-Thread-ID: https://ampcode.com/threads/T-019e92bc-e43a-727f-8acf-0213915029ff
Co-authored-by: Amp amp@ampcode.com
Amp-Thread-ID: https://ampcode.com/threads/T-019e92bc-e43a-727f-8acf-0213915029ff
Co-authored-by: Amp amp@ampcode.com
FE-808: Normalize graph tool outcomes
FE-808: Add existing-code graph probe
FE-808: Add retry diagnostics graph probe
FE-808: Add ambiguity no-overcommit probe
FE-808: Close graph commit planner judo findings
Add fixture seed loader and consolidate Bilal-port seed fixtures
Restructure .fixtures/seed-specs/ into .fixtures/seeds/bilal-port/ with
vendored Bilal originals under _originals/, the throwaway port script, and
one consolidated .json per spec ({spec, nodes, edges}).
Fix the port script's basis mapping: epistemicStatus no longer maps to the
invalid 'accepted_review_set' basis (forbidden per GRAPH_MODEL.md). Bilal
authored each item directly, so every ported node is 'explicit'; the
epistemic flavor is preserved in source text instead.
Add src/graph/seed-fixtures.ts: a loader that commits each consolidated
fixture through CommandExecutor (createSpec + one explicit commitGraph
batch) so graph clock / change log / lsn stay coherent. Lives in graph/
(not db/) to respect the db/ <- graph/ dependency direction. Exposed via
'npm run seed'; covered by src/graph/seed-fixtures.test.ts.
Amp-Thread-ID: https://ampcode.com/threads/T-019e91ee-aa39-73d2-a346-a0ae1e55e3b9
Co-authored-by: Amp amp@ampcode.com
The port script now runs each assembled seed through seedFixture against a
throwaway in-memory DB before writing .json, reusing the exact
structural validation commitGraph enforces (planCommitGraph: node
kind/plane/detail + edge category/stance/ref/cycle checks). A seed that
would not commit cleanly aborts the run instead of producing an unloadable
fixture.
Amp-Thread-ID: https://ampcode.com/threads/T-019e91ee-aa39-73d2-a346-a0ae1e55e3b9
Co-authored-by: Amp amp@ampcode.com
Capture the landed seed-fixture substrate (consolidated {spec,nodes,edges}
contract, src/graph/seed-fixtures.ts loader, npm run seed, self-validating
port scripts) and the two enhancement ideas as backlog: (1) enrich
Bilal-port graphs through Brunch from the original briefs to recover
thesis/goal structure, (2) port + enhance the legacy product fixtures.
Notes manual-testing.md seed-doc drift for the doc-reconciliation track.
Amp-Thread-ID: https://ampcode.com/threads/T-019e91ee-aa39-73d2-a346-a0ae1e55e3b9
Co-authored-by: Amp amp@ampcode.com
FE-808 validate createNode basis
agent and skill guidance re not deleting stubs
FE-808: Sync graph resilience closeout
Co-authored-by: Amp amp@ampcode.com
FE-807: Structured response capture into selected-spec graph truth (#173)
Align chain-card stale status
Separate WebSocket transport request steps
Harden WebSocket request cleanup
Tighten web update validation
Avoid rebuilding graph node groups
Expose structured exchange request tools
Register pr