Skip to content

re-sync and add notes about server refactor#277

Draft
kostandinang wants to merge 91 commits into
mainfrom
next
Draft

re-sync and add notes about server refactor#277
kostandinang wants to merge 91 commits into
mainfrom
next

Conversation

@kostandinang

Copy link
Copy Markdown
Contributor

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:

  • 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

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

  • tighten lens review-set planning contracts

Amp-Thread-ID: https://ampcode.com/threads/T-019e4b15-7745-7201-9383-57779c7738b8
Co-authored-by: Amp amp@ampcode.com

  • draft a new ln-witness skill

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 a
routing 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:

  • Dependencies block: hand-drawn tree -> pseudo graph with cross-edges
    (m5 -[optional]-> subagents, graph-plane -[on promotion]-> oracle)
    visible and horizon items grouped under unconnected
  • agent-graph-integration acceptance: paragraph -> pseudo tree
    (obligation decomposition) with each leaf individually testable
  • ln-judo-review: cross-link to pseudo for before/after artifacts of code-judo moves

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

  • graph(edges): lock and materialize Phase 1 edge model

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:

  • docs/design/GRAPH_MODEL.md canonical edge-layer reference
  • src/graph/atoms.ts NodeId / EdgeId / Lsn
  • src/graph/schema/edges.ts GraphEdge + closed enums
  • src/graph/schema/reconciliation-need.ts ReconciliationNeed shape
  • src/graph/policy/category-policy.ts per-category policy table
  • src/graph/index.ts public graph-layer exports

Retirements:

  • docs/design/GRAPH_EDGE_CATEGORIES.md moved to archive/ with a
    pointer to GRAPH_MODEL.md as canonical successor.
  • docs/architecture/pi-seam-extensions.md §'Edge types' annotated as
    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

  • docs(memory): ln-sync SPEC.md and PLAN.md to locked edge model

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:

  • A7-L: drop retired "relation policy" promotion path; reframe as
    Phase 2 node-shape concern.
  • A14-L: edge-draft wording is now category-typed per GRAPH_MODEL.md;
    add D51-L dependency.
  • D7-L: add Phase 2 hook for framing_as carrier question.
  • D8-L: recon-need targets {kind:'edge'} | {kind:'node_pair'};
    retire "concerns-edge" wiring; refined by D51-L.
  • D9-L: note decision stays a plain node (not hyper-edge) for POC.
  • D27-L: edge drafts use {category, sourceId, targetId, stance?,
    basis}, not free-form relation.
  • D51-L (new): closed eight-category edge set + separate
    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.
  • I6-L: recon-need target shape; impasse-needs-two-nodes rule
    replaced by node_pair target.
  • Lexicon: structural legality references closed edge categories
    and immutable accepted-edge identity; reconciliation need points
    at edge|node_pair target shape.

PLAN.md:

  • A7-L: same wording fix as SPEC.
  • A14-L: same wording fix as SPEC.
  • graph-data-plane: add GRAPH_MODEL.md to design docs; current
    execution pointer reflects Phase 1 lock landed plus stubs under
    src/graph/; Phase 2 nodes still pending.
  • Recently Completed: 2026-05-31 entry for Phase 1 edge lock.

Amp-Thread-ID: https://ampcode.com/threads/T-019e7d8c-ab82-7507-b2e5-8351c5821202
Co-authored-by: Amp amp@ampcode.com

  • docs(plan): ln-sync active frontier to prep envelope
  • FE-744 / pi-ui-extension-patterns tied off; detailed definition moved
    to docs/archive/PLAN_HISTORY.md under a 2026-06-01 Sync archive section.
  • sealed-pi-profile-runtime-state promoted to Active as the expanded
    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).
  • graph-data-plane narrowed to M4 CRUD proper, queued as Next behind
    the prep envelope.
  • Recently Completed trimmed to last three entries; dependencies block
    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

  • Reconcile graph planning docs

Amp-Thread-ID: https://ampcode.com/threads/T-019e82ff-d6d1-74fb-a574-ec31f359b31e
Co-authored-by: Amp amp@ampcode.com

  • spec: record grill findings — source topology (D52-L), commitGraph batch tool (D53-L), propose-graph direct-commit path, strategy/lens axis split

New decisions:

  • D52-L: source topology src/{.pi, agents, db, graph, session, rpc, web}
    with directed layer dependencies
  • D53-L: commitGraph atomic batch mutation with intra-batch refs

Updated decisions:

  • D25-L: strategy/lens axis split (interaction shape × topical focus)
  • D26-L: three commitment mechanisms (single-exchange, review-set, direct-commit)
  • A14-L: commitGraph as primary proof target

New invariants:

  • I34-L: commitGraph all-or-nothing batch validation
  • I35-L: multi-level graph context snapshots

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

  • plan: integrate grill findings into graph-data-plane and agent-graph-integration
  • Context: add architecture grill summary (D52-L, D53-L, D26-L, D25-L)
  • A14-L: rename to graph-mutation structural legality, commitGraph as
    primary proof target, flag as highest-stakes assumption
  • graph-data-plane: add commitGraph batch tool (D53-L, I34-L), D52-L
    source topology, graph snapshot readers (I35-L), numbered execution
    pointer steps
  • agent-graph-integration: add propose-graph direct-commit path,
    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

  • stub: D52-L source topology with README docs and commitGraph in GRAPH_MODEL

New directories with README.md files documenting layer ownership,
dependency direction, target file layout, and migration notes:

  • src/README.md — top-level topology diagram and dependency arrows
  • src/agents/README.md — strategy×lens table, context building diagram
  • src/db/README.md — persistence substrate scope and constraints
  • src/session/README.md — session domain with migration table
  • src/graph/README.md — current vs target state, commitGraph description

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

  • Phase 2 node lock: 10 intent kinds in 3 categories, common node shape with detail JSON column, provenance retired from edges and nodes, framing_as retired

GRAPH_MODEL.md:

  • Promote nodes from deferred to locked
  • GraphNode shape: id, plane, kind, title, body, basis, source, detail, LSN fields
  • Per-plane kind enums (intent: 10 kinds in basic/structural/reasoning)
  • Per-kind detail schemas (decision, term, constraint)
  • Drop provenance from GraphEdge (change_log owns audit)
  • Retire framing_as section
  • Update commitGraph example with detail field

SPEC.md:

  • D54-L: node shape locked
  • D55-L: provenance retired from edges and nodes
  • D56-L: intent kind categories (basic/structural/reasoning)
  • D57-L: grounding gate (LLM-judged + count floor)
  • I36-L: kind enum + category derivation invariant
  • I37-L: detail per-kind validation invariant
  • A7-L retired (framing_as absorbed)
  • D7-L retired (framing_as modality)
  • I7-L retired (framing_as matrix)
  • Lexicon: thesis, term, node source, node detail, intent kind category, posture
  • Future direction: framing_as resolved, posture noted as spec-level

Amp-Thread-ID: https://ampcode.com/threads/T-019e835d-11aa-70d5-8095-d4531afe9c94
Co-authored-by: Amp amp@ampcode.com

  • graph: Phase 2 node stubs, retire EdgeProvenance
  • Create src/graph/schema/nodes.ts with GraphNode, NodePlane, NodeKind,
    IntentKind/OracleKind/DesignKind/PlanKind, IntentKindCategory,
    DecisionDetail/TermDetail/ConstraintDetail, and intentKindCategory().
  • Remove EdgeProvenance interface and provenance field from GraphEdge
    (change_log owns audit trail).
  • Export all new node types from src/graph/index.ts.

Amp-Thread-ID: https://ampcode.com/threads/T-019e835d-11aa-70d5-8095-d4531afe9c94
Co-authored-by: Amp amp@ampcode.com

  • Promote invariant to first-class kind, drop ConstraintDetail, add modality/source-question rubric
  • invariant promoted from constraint subtype to structural-category kind
  • ConstraintDetail/ConstraintSubtype removed (body text carries subtlety)
  • GRAPH_MODEL.md: modality-of-claim + source-question table for agent prompting
  • GRAPH_MODEL.md: prompting guidance section (requirement duality, invariant vs constraint, thesis role)
  • D54-L, D56-L, I37-L updated to reflect invariant promotion and detail simplification
  • nodes.ts: IntentKind adds invariant, intentKindCategory maps it to structural
  • index.ts: ConstraintDetail/ConstraintSubtype exports removed

Amp-Thread-ID: https://ampcode.com/threads/T-019e835d-11aa-70d5-8095-d4531afe9c94
Co-authored-by: Amp amp@ampcode.com

  • Add context as basic-category intent kind with promotion heuristic
  • context: descriptive claim, last-resort basic bucket with promotion table
  • 11 intent kinds total (4 basic, 4 structural, 3 reasoning)
  • GRAPH_MODEL.md: kind table, promotion heuristic in prompting guidance
  • SPEC.md: D56-L updated, context lexicon entry added
  • nodes.ts: IntentKind + intentKindCategory updated

Amp-Thread-ID: https://ampcode.com/threads/T-019e835d-11aa-70d5-8095-d4531afe9c94
Co-authored-by: Amp amp@ampcode.com

  • ln-plan/ln-sync: Phase 2 node lock reflected in PLAN execution pointer and sequencing
  • Sequencing summary: both phases locked, only A20-L spike remains
  • Execution pointer: Phase 2 commits referenced, remaining items updated
  • Acceptance: Phase 2 marked done with commit range
  • A7-L assumption pressure: retired
  • Design doc reference: Phase 1 + Phase 2 locked

Amp-Thread-ID: https://ampcode.com/threads/T-019e835d-11aa-70d5-8095-d4531afe9c94
Co-authored-by: Amp amp@ampcode.com

  • Add decision-capture criteria to prompting guidance, fix commitGraph example residue
  • Decision guardrails: 5-point criteria + rejected.length >= 1 enforcement
  • Fix commitGraph example: constraint no longer carries subtype detail
  • Add invariant node to commitGraph example

Amp-Thread-ID: https://ampcode.com/threads/T-019e835d-11aa-70d5-8095-d4531afe9c94
Co-authored-by: Amp amp@ampcode.com

  • Stub strategies/ and lenses/ READMEs with M5 prompt-pack inputs
  • strategies/README.md: observer classification guide, translation table
  • lenses/README.md: topology-driven question ranking heuristics
  • Both reference archived INTENT_GRAPH_SEMANTICS.md as source material

Amp-Thread-ID: https://ampcode.com/threads/T-019e835d-11aa-70d5-8095-d4531afe9c94
Co-authored-by: Amp amp@ampcode.com

  • GRAPH_MODEL.md: add pointers to strategies/ and lenses/ for prompt-level guidance

Amp-Thread-ID: https://ampcode.com/threads/T-019e835d-11aa-70d5-8095-d4531afe9c94
Co-authored-by: Amp amp@ampcode.com

  • A20-L spike: validate Drizzle persistence seam for M4 CRUD

Spike validated the persistence toolchain for graph-data-plane:

  • drizzle-orm@0.45.2 + drizzle-kit@0.31.10 + better-sqlite3@12.8.0
  • drizzle-typebox@0.3.3 + @sinclair/typebox@0.34.14 for row schemas
  • Batch commitGraph-shaped transaction (multi-node, ref resolution,
    multi-edge, LSN allocation, change-log) atomic with full rollback
  • Pi tool params (typebox v1.x) and Drizzle row schemas (@sinclair/
    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

  • Session display names: generate, persist via session_info, render in chrome

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

  • Plan: tie off sealed-pi-profile-runtime-state (FE-776), unblock graph-data-plane

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/ persistence substrate; derive graph/ enum types from single source

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

  • Document enum-flow topology in db/README.md

Amp-Thread-ID: https://ampcode.com/threads/T-019e83af-1293-769a-a02e-a0df221c7318
Co-authored-by: Amp amp@ampcode.com

  • M4 skeleton: CommandExecutor with single-node proof-of-life

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:

  • createNode for all four planes with kind-per-plane validation
  • decision/term detail schema validation (closed, per GRAPH_MODEL.md)
  • CommandResult discriminants: success, structural_illegal, needs_human,
    policy_blocked, version_conflict (last three are M6 placeholders)
  • graph_clock seeded at lsn=0; monotonic increment per command
  • change_log entry per successful command with operation + payload
  • Transaction atomicity: validation failure writes nothing
  • I26-L architectural boundary test: no src/ outside graph/ imports db/

Schema corrections:

  • NodeId/EdgeId: string → number (matches SQLite auto-increment)
  • edges table: add missing updated_at_lsn column (per GRAPH_MODEL.md)
  • connection.ts: initSchema pushes DDL + seeds graph_clock

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

  • Plan: update graph-data-plane execution pointer — steps 1-2 landed

Amp-Thread-ID: https://ampcode.com/threads/T-019e83d7-3670-767f-b9b0-aa7e611abdc1
Co-authored-by: Amp amp@ampcode.com

  • commitGraph: atomic batch mutation with intra-batch ref resolution (D53-L, I34-L)

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:

  1. Validate all batch nodes structurally (reuses createNode validation)
  2. Check for duplicate batch refs
  3. Transaction: allocate LSN → insert nodes (build ref→id map) →
    verify existing-node refs → validate + resolve edges →
    insert edges → append change_log → return success
  4. On any failure: entire batch rejected, transaction rolled back

Acceptance (22 new tests, 44 total):

  • Intra-batch refs ("n1", "n2") resolve to real NodeIds
  • Existing refs ({ existing: id }) verified against database
  • Edge structural validation: closed category set, stance required
    iff proof/support, stance forbidden for other categories,
    self-loop rejection, missing ref rejection
  • I34-L all-or-nothing: edge validation failure rolls back inserted
    nodes — no partial writes, no LSN bump
  • Edge-only batches, node-only batches, empty batch rejection
  • Mixed intra-batch + existing refs in same edge
  • One LSN per batch, one change_log entry per batch

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

  • Plan: update graph-data-plane execution pointer — steps 1-4 landed

Amp-Thread-ID: https://ampcode.com/threads/T-019e83d7-3670-767f-b9b0-aa7e611abdc1
Co-authored-by: Amp amp@ampcode.com

  • add graph snapshot readers: cursory overview + node neighborhood (I35-L)

Two read functions in graph/snapshot.ts:

  • getGraphOverview: full-graph cursory overview with all nodes/edges,
    current LSN, and superseded-predecessor exclusion
  • getNodeNeighborhood: BFS traversal with configurable hop depth,
    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

  • plan: mark step 5 (I35-L snapshot readers) done in execution pointer

Amp-Thread-ID: https://ampcode.com/threads/T-019e83f6-44c9-741a-a90a-9e9535774b3d
Co-authored-by: Amp amp@ampcode.com

  • add reconciliation-need substrate: create, resolve, and query open needs

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

  • ORACLE_KINDS. 11 new tests (322 total).

Amp-Thread-ID: https://ampcode.com/threads/T-019e83f6-44c9-741a-a90a-9e9535774b3d
Co-authored-by: Amp amp@ampcode.com

  • plan: mark graph-data-plane (M4) done, advance sequencing to agent-graph-integration (M5)

Amp-Thread-ID: https://ampcode.com/threads/T-019e83f6-44c9-741a-a90a-9e9535774b3d
Co-authored-by: Amp amp@ampcode.com

  • sync: update invariant coverage (I26/34/35/36/37-L), trim PLAN recently-completed, add FE-785 for M5

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)

  • plan: add branch for M5 agent-graph-integration (FE-785)

Amp-Thread-ID: https://ampcode.com/threads/T-019e83f6-44c9-741a-a90a-9e9535774b3d
Co-authored-by: Amp amp@ampcode.com

  • move src/tui-client/.pi → src/.pi per D52-L source topology

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

  • wire commit_graph and read_graph Pi tools through CommandExecutor

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.

  • command-adapter.ts: Pi tool params → CommandExecutor input translation
    and CommandResult → tool result text formatting
  • graph/index.ts registrar: registerBrunchGraph with TypeBox v1.x
    parameter schemas using StringEnum for enums
  • Pre-bound GraphSnapshotReaders so extensions never import db/ (I26-L)
  • Re-export enum const arrays from graph/index.ts for I26-L compliance
  • Extension shell wires graph tools when options.graph is provided
  • 9 integration tests: translate, format, end-to-end commit+read,
    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

  • reconcile SPEC.md and PLAN.md: path refs → src/.pi/, M5 in-progress

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

  • Move session-domain files to src/session/ (coordinator, binding, envelope,
    projection-reader, transcript, elicitation/structured-exchange, project-identity)
  • Move web-host to src/rpc/, brunch-pi-profile to src/.pi/, web-client/ to
    src/web/, test-helpers to src/probes/; delete empty snapshot-{graph,nodes} stubs
  • Fix imports (tsc-driven), web entry path, source-path test reads, and
    web-host dist-web resolution for the new locations
  • Reconcile src/ and session/ READMEs; PLAN branch note; trim specTitle placeholder
  • Reconcile agent-composition model into SPEC; replan frontiers

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

  • D58-L: thin runtime header + gated prompt-resource manifest; methods
    (capability synonym retired); manifest {name,description,location}
    metadata code-owned in agents/state.ts, not filesystem-discovered.
  • D52-L/lexicon: agents/ topology = methods/; contexts/ is the D60-L
    render layer, not a manifest resource family.
  • SPEC: concrete agents/ topology (md/ts boundary); posture deferred.
  • PLAN: rewrite agents-composition-layer to the manifest model;
    oracle design reconciled (already filed as I38-L), not owed.
  • Align agents/ READMEs to locked composition model

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/

  • Storage: scope cards live in memory/cards/--.md
    (or dev--/tooling--/docs-- prefix when not a PLAN frontier)
  • File metadata header: Frontier, Status, Mode, Created
  • Multi-card scope files are a bias when conditions hold, not a
    sanctioned exception. Hard anti-speculation gate leads the section.
  • Overlap-as-independence-test: two proposed files for one frontier
    with overlapping primary write paths must be merged or reshaped.
  • Expected touched paths (tentative) section added to full cards
    (required) and light cards (when non-trivial), using pseudo tree
    with + ~ - ? markers. Doubles as a manifest for parallel-agent
    conflict-avoidance.
  • Routing updated to name scope file path explicitly when handing
    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

  • ln-build: rewrite for memory/cards/ consumption + stale-downstream rule
  • Hybrid selection policy: explicit path arg wins; single active
    file for current frontier → pick + announce; otherwise list
    active scope files and ask via tool-ask-question. Never scan or
    pick by mtime/alphabetical.
  • Stale-downstream invalidation: explicit re-orient checkpoint
    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.
  • Per-file deletion under memory/cards/: literal paths only; never
    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.
  • Preserves: no-op commit suppression when card is already green;
    all 8 serial-execution stop conditions; canonical reconciliation
    discipline; cross-skill check before stopping.
  • Expected touched paths from scope card are tentative — divergence
    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

  • ln-* skills + praxis docs: sweep cross-references to memory/cards/

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:

  • .agents/skills/ln-consult/SKILL.md (3 refs)
  • .agents/skills/ln-plan/SKILL.md (3 refs)
  • .agents/skills/ln-plan/assets/plan-template.md (1 ref)
  • .agents/skills/ln-handoff/SKILL.md (3 refs)
  • .agents/skills/ln-handoff/assets/handoff-template.md (1 ref)
  • .agents/skills/ln-sync/SKILL.md (5 refs; per-file deletion rule
    added so ln-sync respects AGENTS.md file-scoped-invocations)
  • .agents/skills/ln-oracles/SKILL.md (1 ref)
  • docs/praxis/ln-skills.md (1 ref)
  • docs/praxis/graphite-workflow.md (1 ref; clarified that multiple
    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

  • memory/CARDS.md: remove exhausted queue file

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

  • FE-795: rename package and bin to brunch-cli, add live-graph-observer workbench

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

  • FE-795: graph items are owned by spec (graph-rpc-spine Card 1)

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:

  • ln-sync: new row in document-roles table; new bullet in drift/ontology
    check; topology READMEs added to cross-skill preservation check.
  • ln-build: new bullet in the reconciliation question list (topology
    question); new 'Topology READMEs' update rule that triggers when the
    topology question is yes; cross-skill check extended.
  • ln-spec: new cross-reference integrity bullet — retired/renumbered IDs
    must be grepped and repaired in topology READMEs during the same pass.
  • ln-review: new 'Topology README accuracy' sub-check under topography,
    covering ownership, SPEC IDs, dependency direction, layout sketches,
    and migration notes.
  • ln-refactor: commit-ordering rule that topology README updates land in
    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:

  • decision hubs collapse hub-and-spoke into a single decision node
    with detail.{chosen_option, rejected[], rationale}
  • evidence ports to oracle plane with one synthetic per-spec check
    as its realization parent
  • risk and design semanticRoles port to context with source-field
    curation flags (derived-risk-or-question, derived-design-statement)
  • derived_from defaults to dependency, downgraded to support[for]
    when target is observational (evidence/assumption)
  • authority projects to brunch source; epistemicStatus=inferred maps
    to basis=accepted_review_set, others to basis=explicit, with
    epistemic flavor concatenated into source
  • displayId preserved as bracket suffix in source for traceability

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:

  • /brunch:switch - opens the spec/session picker (delegates to the
    runBrunchWorkspaceAction helper that still lives
    in workspace-dialog.ts as private impl).
  • /brunch:continue - notify-only stub for the recover/resume flow.
  • /brunch:lens - notify-only stub.
  • /brunch:strategy - notify-only stub.
  • /brunch:mode - notify-only stub.
  • ctrl+shift+b shortcut, preserved with a notify-only warning that
    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

  • graph layer spec/plan update pre 808

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

  • Thread representative LLM projection seams

Amp-Thread-ID: https://ampcode.com/threads/T-019e92bc-e43a-727f-8acf-0213915029ff
Co-authored-by: Amp amp@ampcode.com

  • Apply remaining context rendering cleanup

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

  • Self-validate ported seeds against the real loader before writing

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

  • plan: add dev-seed-fixtures parallel frontier

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

lunelson and others added 30 commits May 18, 2026 15:18
Signed-off-by: Lu Nelson <ln@hash.ai>
Signed-off-by: Lu Nelson <ln@hash.ai>
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>
lunelson and others added 20 commits June 19, 2026 10:47
* 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>

kostandinang commented Jul 1, 2026

Copy link
Copy Markdown
Contributor Author


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');

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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');

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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-code-hashintel

Copy link
Copy Markdown

Semgrep found 1 ssc-90df8fd1-2d4f-4e7b-a8aa-dfa15f51f5bf finding:

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 Access-Control-Allow-Origin: *. Any website a developer visits can therefore make cross-origin requests to the local dev server and read the responses, leaking bundled source code, source maps, and served file paths. Starting the dev server via serve() reaches the vulnerable code path.

Manual Review Advice: A vulnerability from this advisory is reachable if you run esbuild with the --serve flag to start the development server

Fix: Upgrade this library to at least version 0.25.0 at brunch/package-lock.json:3112.

Reference(s): GHSA-67mh-4wv8-2f99

lunelson and others added 2 commits July 1, 2026 13:44
* 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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants