All notable changes to XYPH will be documented in this file.
searchCLI command — unified quest search with keyword matching (title, ID, description),--statusfiltering (including GRAVEYARD), and--statsmode for counts by status. Always includes graveyard quests so the full graph is searchable. Usage:xyph search "MCP",xyph search --status GRAVEYARD,xyph search --stats.- 9 invariants seeded into the WARP graph as content-attached nodes — graph-is-truth, principal-general-authority, deterministic-convergence, immutable-provenance, authorized-intent, substrate-boundary, policy-is-plastic, frontier-not-assignment, witness-before-done. Each carries the full METHOD structure (what must remain true / why it matters / how to check) and is readable from any branch via
xyph show invariant:*. - 5 legends (WARP, GOV, SURF, PROV, FLOW) with
protectsedges to invariants — eternal domains that span the project lifetime, replacing temporal campaign-based grouping. Each legend defines its sponsored human/agent roles, hills, and verification criteria. - First bearing set as a graph-native signpost —
bearing:currentcaptures direction, last shipped work, what's next, and what feels wrong. Updated at cycle boundaries. - 6 new schema prefixes (
invariant,legend,cycle,design,retro,bearing) and 3 new edge types (protects,contains,closes) preparing the graph ontology for METHOD-aligned cycle discipline.
- Backlog triaged from 158 open quests to 53 — 11 quests sealed as already completed, ~88 graveyarded with full "WHAT IT WAS" intent reconstructions, 24 stubs merged into 6 consolidated cycle-worthy items, 18 rethought (12 graveyarded, 1 reset, 5 reframed with new titles and descriptions reflecting METHOD adoption).
- Doctor no longer flags BACKLOG, GRAVEYARD, or DONE quests for readiness and governed-completion gaps — these scans now only check PLANNED/READY/IN_PROGRESS quests, eliminating 52 false diagnostics from graveyarded and sealed work. Doctor diagnostics went from 55 to 3 (all legitimate PLANNED quest work).
- DoctorService test fixture updated — governed-quest-incomplete test now uses PLANNED status instead of BACKLOG, correctly reflecting that BACKLOG quests should not trigger governance checks.
- Replaced
rgwithgrepin diagnostic logging acceptance test — the cycle 0022 test spawnedrg(ripgrep) directly, which isn't guaranteed on CI runners. When missing,spawnSyncreturnedundefinedstdout causing a TypeError.
-
README rewritten from the ground up — the README was a changelog masquerading as onboarding. It has been rewritten to lead with what XYPH is, move straight into a walkthrough, and present the full CLI/TUI/API surface grounded in what actually exists today. The 276-line worldlines substrate essay has been extracted to
docs/WORLDLINES.md. The CLI reference table now covers all 61 commands across 18 groups. The milestone table reflects current reality. The TUI section describes what a user actually sees, not accumulated patch-note deltas. -
The design corpus now captures the git-warp / XYPH substrate boundary more explicitly —
design/substrate-alignment.mdnow spells out the target model in which git-warp owns worldlines, observer-relative reads, working sets, speculative ticking, transfer/collapse primitives, and substrate receipts while XYPH owns policy, governance, cases, and product meaning. The invariants and product model now mirror that split, and a new cycle note,design/cycles/0004-substrate-alignment.md, captures the first bounded pivot slice so future work stops expanding XYPH's omnibus graph reconstruction by default. -
Governed cases now have a human page, durable decisions, and linked follow-on work — suggestion pages can now drill into an attached governed
case, the new case page shows the decision question, subject scope, attached briefs, and a receipt-like decision summary, and pressingdrecords a durable human decision that stays distinct from briefs while compiling follow-on work into existingquestorproposalprimitives by default. -
Cycle methodology now treats playbacks as a formal hill-measurement gate — the contributing guide and design corpus now make the four internal checkpoints explicit (
doctrine,spec,semantic,surface), allow local red iteration while requiring pushed work to be green, and define formal human and agent playbacks as the place where sponsor-actor outcomes and hills are actually judged. -
The design corpus now names the larger governed product loop XYPH is meant to embody —
design/product-loop.mdnow captures XYPH not just as a TUI or agent-native CLI, but as the governed conduit through which project shape is observed, suggested, elevated, prepared for judgment, decided, applied, verified, and reconciled. The document now scopes that loop to shape-changing decisions rather than routine execution, requires cases to carry a real decision question and subject scope, treats off-graph observations as valid once reified with provenance and uncertainty, trims the durable ontology down to a minimalcase -> brief -> decision -> linked follow-on workspine, keeps readiness/quorum/staleness as derived judgments until proven necessary, splits decision classification into orthogonal impact/risk/authority axes, prefers linked quests and existing execution primitives over minting fresh work nouns, adds decision receipts and non-linear transitions, and makes worldline-backed option sets part of serious judgment preparation instead of treating recommendations as prose only. -
Human and agent workflow doctrine is now explicit in the design corpus and contributing guide — the design corpus now says plainly that XYPH has one product with two operational lenses, that cycles should be designed from both perspectives, and that implementation should usually proceed through shared semantics and agent-native seams before the human page/TUI expression. The contributing guide now mirrors that rule as project methodology instead of leaving it implicit in chat.
-
Alignment sweep now removes stale planning docs and retires obsolete TUI backlog items — the unified design corpus plus the graph backlog are now the only active planning surfaces.
TASKS.md,docs/PLAN.md, anddocs/TUI-plan.mdare being removed instead of lingering as misleading secondary plans, the README milestone table now clearly reads as historical spine rather than active truth, and an alignment sweep record now captures the rationale. The sweep also retired obsolete backlog items that no longer fit the landing/page model or current product priorities, includingtask:tui-suggestion-tab,task:dashboard-suggestion-widget,task:tui-quest-modal, andtask:warp-explorer-view. -
Suggestion adoption now chooses a real work shape — accepting an AI suggestion no longer always lowers into a generic governed proposal. Quest-shaped suggestions now default into real backlog quests with visible provenance, while other suggestions can still be adopted as governed proposals, and
suggestion accept --as quest|proposalplus the suggestion-page adoption flow now make that choice explicit. -
Suggestion pages now support real adoption flows and
[AI]explainability — AI suggestion pages no longer stop at passive inspection. Operators can now adopt a suggestion into governed work, dismiss it with rationale, or mark it superseded by another artifact directly from the page-local action model, and pressingeopens a dedicated[AI]explainability modal instead of relying only on static transparency prose. -
TUI launch now has a first-class npm script —
npm run tuinow launchesxyph-dashboard.ts, so the interactive XYPH surface no longer depends on remembering the rawnpx tsxentrypoint. -
Suggestions now have TUI subviews and an in-app Ask-AI composer — the
Suggestionslane now cycles throughIncoming,Queued,Adopted, andDismissedsubviews withv, so advisory items are no longer one flat mixed queue. The cockpit also now exposesnas an in-app Ask-AI composer, letting operators queue ask-AI jobs directly from the TUI or an item page instead of dropping to the CLI. -
Suggestions are now easier to discover and track in the TUI — empty suggestion subviews now explain where the suggestions actually are and prompt operators to cycle views, suggestion rows now surface linked governed cases directly in the worklist, current-observer suggestions sort ahead of unrelated ones, and the
My Stuffdrawer now includes active suggestions so your own outstanding AI work stays visible. -
Suggestions now include explicit ask-AI jobs and agent pickup queues —
ask-aiis now a first-class AI suggestion kind,xyph ask-ainow queues explicit request artifacts for agent pickup, theSuggestionslane/page now distinguishes queued ask-AI jobs from ordinary advisory suggestions, and the agent surface now exposes those artifacts throughsuggestionQueueinbriefing, suggestion candidates innext, and shared suggestion semantics incontext. -
Security floor raised for
flatted— the dependency override now pinsflatted@3.4.2, clearing the high-severity prototype-pollution advisory from the ESLint cache stack without changing XYPH runtime behavior. -
Suggestions are now a first-class cockpit lane and page type — the landing shell now has seven lanes instead of six, with a dedicated
Suggestionslane betweenSettlementandCampaigns. Selecting a suggestion and pressingEnternow opens a breadcrumbed suggestion page with[AI]labeling, lifecycle/progress, graph context, AI transparency copy, and page-local commenting instead of forcing advisory artifacts through the landing inspector. -
XYPH product design now lives in a first-class
design/corpus — the old monolithicdocs/XYPH_PRODUCT_DESIGN.mdpath is now a compatibility pointer, while the canonical design source has been split intodesign/README.md,design/sponsor-actors.md,design/hills.md,design/playbacks.md,design/invariants.md, anddesign/product-model.md. This makes sponsor actors, hills, playbacks, and XYPH’s non-negotiable design invariants explicit top-level artifacts instead of long sections buried in one file. -
Agent-originated suggestions are now explicitly first-class in the product design — the unified design and agent protocol docs now state that explicit ask-AI jobs are one auditable request path, not the only lawful source of suggestions. Agents may also emit unsolicited advisory suggestions while working, as long as those suggestions are recorded as visible graph-native artifacts instead of silently mutating truth.
-
Agent governance packets now expose routed follow-up instead of inspect-only placeholders —
xyph context --jsonforcomparison-artifact:*,collapse-proposal:*, andattestation:*targets now includes governance-specificrecommendationRequestsplus richer recommended actions such as human-boundattest,collapse_preview, andcollapse_livecandidates.xyph briefing --jsonandxyph next --jsonnow surface the same governance follow-up semantics, andxyph act --jsonrejects those governance-only actions with explicithuman-only-actionenvelopes instead of vague unsupported-action failures. -
Agent work packets now cover submissions and governance end-to-end —
xyph context --jsonno longer stops at quest targets. It now emits typed work packets forsubmission:*,patchset:*,comparison-artifact:*,collapse-proposal:*, andattestation:*targets, including shared semantic judgments and recommended next actions.xyph briefing --jsonnow includes agovernanceQueue,xyph next --jsoncan surface governance inspect work, andxyph act --jsonnow carries the same shared submission semantics onreview/mergerefusal, dry-run, success, and partial-failure envelopes when XYPH can derive them honestly. -
Review pages are now real, and agent intake commands now speak the shared semantic packet too —
Reviewlane submissions now open a dedicated breadcrumbed review page instead of forcing submission governance through the landing inspector. That page now renders lifecycle/progress, blocker and missing-evidence judgments, next lawful actions, and page-local comment / approve / request-changes actions from shared domain semantics. In parallel,xyph briefing --jsonandxyph next --jsonnow carry compatible shared semantic packets for quest work and submission review candidates, joiningxyph context --jsonso the first human and agent verticals now speak one vocabulary (requirements,acceptanceCriteria,evidenceSummary,blockingReasons,missingEvidence,nextLawfulActions,claimability,expectedActor,attentionState). -
XYPH now defines a shared primitive model for the next human and agent verticals —
docs/XYPH_PRODUCT_DESIGN.mdnow explicitly models work primitives (requirements,acceptance criteria,evidence,quests,submissions), governance primitives (comparison-artifact,attestation,collapse-proposal,blockingReasons,nextLawfulActions,expectedActor,claimability), and agent-native packet semantics. The same doc now names Hill 3 (governance legibility) and Hill 6 (agent productivity without shell archaeology) as the next leverage-maximizing vertical slices, and the canonical agent/architecture docs now mirror those shared semantics. -
XYPH product design now covers the agent-native surface as a first-class product —
docs/XYPH_PRODUCT_DESIGN.mdno longer stops at the human cockpit. It now applies the same IBM-inspired design framing to sponsor agents, defines agent-oriented hills, unifies human and agent surfaces in one design source of truth, and adds product direction for suggestion queues, explicit ask-AI jobs, suggestion-backed quest creation, and a future live graph-feed mode. -
XYPH product design now defines AI suggestions and
[AI]transparency —docs/XYPH_PRODUCT_DESIGN.mdnow treats AI-generated suggestions as first-class advisory artifacts for both human and agent consumption, defines suggestion families and lifecycle expectations, and adds a dedicated[AI]component inspired by Carbon's AI label so AI-driven content is visibly marked and explainable instead of blending into ordinary graph truth. -
XYPH now has an explicit product-design source of truth — XYPH now defines the human-facing app through
docs/XYPH_PRODUCT_DESIGN.md, a new design document that adapts IBM Design Thinking to the XYPH human surface using sponsor users, hills, playbacks, landing-vs-page rules, a page taxonomy, an attention model, and a capability matrix. README, TUI planning, architecture, and active-direction docs now point at that document instead of competing to define the product independently. -
Quest item pages now expose real write actions instead of just context — drill-in quest pages now render an explicit action strip, support graph-native quest comments, expose
reopenfor graveyarded quests, and keep claim/promote/reject/review affordances visible in the page-local footer/help/palette so the landing cockpit can stay a triage surface instead of carrying every mutation affordance forever. -
XYPH now treats the cockpit as a landing page instead of a one-screen worldview — the TUI now keeps the lane rail/worklist/inspector shell as the landing surface, adds a sixth top-level
Graveyardlane for rejected/retired work, and lets operators pressEnteron quest-facing records to open a dedicated breadcrumbed item page.Esc/Backspacenow return from that page to the landing cockpit instead of forcing all detail into the inspector forever. -
ReviewandSettlementbadges now mean attention, not just recency — those two lanes no longer clear their hottest signal simply because you visited them once. XYPH now keeps persistent action-needed badges for open review work, stale/blocking governance artifacts, pending attestations, and ready-to-settle proposals, while the inspector explains the selected item with an explicitWhy hotreason. -
Freshness is now visit-aware instead of click-to-clear busywork — row-level freshness markers now disappear as soon as you actually highlight a row, while
Shift+Sremains the explicit “mark the whole lane seen” control. XYPH now persists per-item seen state alongside lane watermarks so visiting one row no longer lies about the rest of the lane. -
Help is now a contextual modal and the footer has one control row — the top footer line is back to status/selection only, the bottom footer line is now the sole keyboard-control line, and
?opens a scrollable in-app help modal built from the same context/global controls instead of replacing the cockpit with a disconnected BIJOU help screen. -
Cockpit lanes now remember what is new to each observer — the dashboard now persists per-lane “last seen” watermarks in
~/.xyph/dashboard-state.json, shows lane-level freshness badges in the rail, and marks newly-seen worklist rows so operators can tell what changed since they last left a lane instead of treating all recent state as equally fresh. -
The cockpit now speaks mouse as well as keyboard — the dashboard runtime now enables BIJOU mouse events, lane rail entries are clickable, worklist rows are selectable by click, wheel scrolling now works in the worklist, inspector, quest-tree modal, and
My Stuffdrawer, clicking outside the quest-tree modal dismisses it, and clicking outside the open drawer closes it. -
Selected quests now open a graph-native tree modal — press
ton a selected quest to open a lineage / dependency modal that shows sovereign intent lineage, campaign placement, submission/scroll settlement artifacts, upstream dependencies, and downstream dependents without leaving the cockpit. -
The
Nowlane now has a real recent-activity mode — pressvon theNowlane to switch between the forward-looking action queue and a chronological “what changed, who did it” stream built from quest, review, decision, and governance-artifact facts. The lane rail count, worklist chrome, inspector detail, command palette, and footer hints now all reflect the active mode instead of hiding recent activity in the drawer. -
Cockpit pane heights now honor the terminal viewport in both wide and narrow layouts — header boxes are now measured instead of guessed, pane body heights are derived from the actual rendered chrome, and the stacked narrow-layout branch now uses a real constrained column layout. This prevents worklist and inspector cards from drawing underneath the footer when the viewport gets tight.
-
The cockpit hero now anchors observer identity on the right — the top bar no longer treats surface, observer, and worldline as one mushy inline detail string. XYPH now renders product + active surface on the left and observer/worldline identity on the right so the operator always knows who is seeing what reality.
-
The “My Stuff” drawer is now a real wrapped side sheet instead of a truncation trap — opening the drawer now claims substantially more screen width, wraps quest/submission/activity text on whitespace, and includes governance events in the recent-activity feed so the side sheet can answer more of “what just happened and who did it?” without clipping every line down to fit.
-
The footer no longer splits controls across two competing lines — status lives on the upper footer line, controls live on the lower line, and the help modal now reflects that same source of truth so the keyboard story stops contradicting itself.
-
Footer chrome now hard-clamps to the terminal width — the status and hint bars no longer rely on terminal soft-wrap. Oversized footer text now truncates with an ellipsis instead of visually wrapping into the cockpit area and making the pane bottoms look clipped by the footer.
-
Scrollable cockpit panes now show explicit vertical scrollbars with interaction fade — the worklist and inspector lanes now render a real track with arrows and thumb when navigation wakes them, then fade back out once interaction stops. The rail now overlays the pane edge instead of reserving a dead gutter column, so content keeps its maximum width when the scrollbar is hidden.
-
The cockpit frame now takes its accent from the active lane —
Now,Plan,Review,Settlement, andCampaignseach now own a distinct lane color, and the hero border, pane headers, selected lane label, and focused worklist card all pick up that surface accent instead of sharing one global chrome color. -
Focused worklist cards now fill their full body instead of stopping at the last glyph — the selected-row background is now padded across the whole inner card width before BIJOU renders it, so the active card reads like a true block selection rather than a highlight that only hugs the occupied text.
-
Cockpit worklist rows now read as mini-cards across every lane — non-selected rows no longer collapse into bare text lines. Every row now carries an explicit bordered three-line shape, while the focused row still gets the stronger primary border and gradient title treatment. This also fixes a row-width accounting bug that could let metadata overflow its actual content column on tighter panes.
-
The cockpit inspector can now be toggled off —
inow hides or restores the right-hand inspector pane, letting the center worklist reclaim the width when the operator wants to scan lanes without detail chrome. -
Cockpit worklists now render as stable contained-list queues instead of fragile tables — the center pane no longer relies on BIJOU’s dense
navigableTable()rendering for long uneven rows. Each lane now uses a fixed-height queue row with stable selection, clearer hierarchy, and explicit paging, which removes the shifting/truncation artifacts that showed up most clearly inReviewandCampaigns. -
TUI hierarchy and navigation were tightened after first-flight feedback — low-contrast muted text is now used much more sparingly, inspector status headers no longer leak BIJOU surface objects as
[object Object],PgUp/PgDnnow page the center worklist, andShift+PgUp/Shift+PgDnscroll the inspector. -
The TUI was redesigned from the ground up as the XYPH cockpit landing shell — the old six-view dashboard shell has been replaced by a single operator landing surface with seven lanes (
Now,Plan,Review,Settlement,Suggestions,Campaigns,Graveyard), a persistent inspector, a command palette, and contextual mutation hotkeys. The TUI now reads more like one control plane than six unrelated screens. -
TUI floor raised to BIJOU
^3.1.0— XYPH now consumes the latest published@flyingrobots/bijou,@flyingrobots/bijou-node, and@flyingrobots/bijou-tuiline. The theme bridge, shader path, landing canvas, and string/surface seams in the CLI renderers were updated for BIJOU v3 semantics instead of keeping the dashboard pinned to the old^1.8.0contract. -
explainnow diagnoses governance artifacts directly — pointingxyph api explainat a durablecomparison-artifact:*,collapse-proposal:*, orattestation:*now returns stable reason codes plus suggested next commands, including the crucial distinction that approving acollapse-proposal:*does not satisfy the live execution gate when the boundcomparison-artifact:*still lacks approval. -
Substrate floor raised to
@git-stunts/git-warp@^14.16.2— XYPH now consumes the latest publishedgit-warppatch, which in turn refreshes itsgit-casfloor to^5.3.2and keeps the app pinned to the actually released substrate line. -
queryis now the first real governance read surface — the hidden admin command no longer falls through tonot_implemented. It now exposesgovernance.worklistfor actionable compare/collapse queues andgovernance.seriesfor durable artifact-lane history. -
Persisted governance artifacts now have readable lifecycle semantics —
observe(entity.detail)now computes XYPH governance detail for durablecomparison-artifact:*,collapse-proposal:*, andattestation:*nodes, including freshness, attestation summary, and execution-gate state where applicable, instead of exposing only raw graph properties. -
Durable compare/collapse artifacts now form explicit lineage — repeated persisted
comparison-artifact:*andcollapse-proposal:*records in the same governance lane now carry a stableartifact_series_key, and newer artifacts link to older ones throughsupersedesso XYPH can report whether an artifact is current or already superseded. -
collapse_worldlinenow settles committed content-clearing plans too — governed live collapse no longer fails closed when git-warp transfer planning emitsclear_node_contentorclear_edge_content. Those ops now lower through the published substrate clear-content primitives in the shared mutation kernel. -
collapse_worldlineis no longer preview-only — the command still defaults to dry-run preview, but now acceptsdryRun: falsefor governed live settlement intoworldline:livewhen approving attestations bind to a persistedcomparison-artifact:*. -
Collapse execution now gates on persisted comparison facts — live collapse no longer treats
collapse-proposal:*as the approval anchor. The current gate is one or more approvingattestation:*nodes targeting the durablecomparison-artifact:*returned bycompare_worldlines persist:true, keeping governance attached to the factual comparison baseline. -
Collapse artifact identity is now mode-stable instead of approval-shaped —
collapse-proposalartifact identity now varies by preview-vs-execution mode (dryRun) but no longer depends on whichattestationIdswere supplied, so governance approval metadata does not redefine the artifact itself. -
Runtime graph selection no longer hardcodes
xyph-roadmap— the CLI, TUI, coordinator daemon, graph inspection helper, ref-sync scripts, and maintenance scripts now resolve the runtime graph through a shared bootstrap resolver instead of assuming one baked-in graph name. -
Graph bootstrap now defaults to
xyphand fails loudly on ambiguity — XYPH now resolves graph bootstrap from local.xyph.json, then~/.xyph/config, then defaults. If the target repo already contains multiple git-warp graphs, or only a single non-default graph, XYPH now rejects startup untilgraph.nameis configured explicitly instead of silently picking or creating the wrong graph. -
Off-repo graph bootstrap no longer probes ref namespaces by default — when
repoPathpoints outside the current working repo, XYPH now requires an explicitgraph.nameinstead of scanning that repo’srefs/warp/*. Sidecar repos stay supported, but the bootstrap boundary is now explicit. -
Substrate floor raised to
@git-stunts/git-warp@^14.16.0— XYPH now consumes the published substrate release that adds first-class committed content-clear patch primitives, keeping governed collapse execution pinned to a real released substrate version. -
Worldline composition terminology stays braid-shaped in the public API — the active README and canonical control-plane docs continue to use
braid_worldlinesas the public composition verb for co-present worldline effects, explicitly rejecting branch/rebase vocabulary for this capability. -
Observation coordinates now make braid backing explicit — working-set-backed canonical derived-worldline reads now report the backing working-set ID plus overlay/braid details in
observation.backinginstead of only exposing a derived frontier digest. -
Braided conflict reads now warn on singleton self-erasure —
observe(conflicts)now adds an explicit structural warning when braided overlays compete on a singleton LWW property winner, because that application modeling pattern cannot honestly represent co-presence under braid. -
Compare/collapse freshness is now operationally scoped — XYPH now computes compare/collapse freshness over an explicit governance-excluding node-prefix scope while still carrying the raw whole-graph substrate fact for audit. Durable governance chatter on
worldline:liveno longer self-invalidates operational comparison baselines.
-
xyph suggestrecords visible advisory suggestion artifacts — XYPH now has a dedicated CLI entry point for emitting[AI]suggestion records with explicit kind, audience, target, related entities, evidence, and recommended next action fields. Suggestions can be requested or spontaneous, but they are always recorded as visible graph-native advisory content instead of silently mutating plan truth. -
Settlement lane in the new cockpit shell — the redesigned TUI now gives persisted
comparison-artifact:*,collapse-proposal:*, andattestation:*records a first-classSettlementlane inside the main cockpit, keeping compare/attest/collapse work on the same operator surface as quests, reviews, and campaigns. -
Governance artifacts in dashboard snapshots —
GraphSnapshotnow includes typed durable governance artifacts projected from the graph, so the TUI and future human-facing surfaces can consume the same freshness, attestation, and execution-state truth that already powersobserve(entity.detail),query, andexplain. -
Governed live
collapse_worldlineexecution —xyph api collapse_worldlinenow executes settlement intoworldline:livewhendryRun: falseand the request supplies approvingattestationIdsover the persistedcomparison-artifact:*baseline. Successful execution still lowers through the shared mutation kernel rather than a special collapse engine, including committed content-clearing transfer ops, and returns a terminal live observation plus mutation execution details. -
collapse_worldlinerunway over shared transfer planning —xyph api collapse_worldlinenow maps onto git-warp’s published coordinate transfer planning surface for canonical derived worldlines. The command requires a freshcomparisonArtifactDigest, recomputes the source-vs-target comparison to detect drift, supports settlement againstworldline:live, lowers the resulting transfer plan through the shared mutation kernel, and returns a typed XYPHcollapse-proposalwith per-side observations, sanitized transfer ops, substrate digests, and either mutation preview or mutation execution details. -
Durable
collapse-proposal:*governance records —xyph api collapse_worldlinenow acceptspersist: trueto record the current collapse artifact onworldline:live. The durable node stores indexed proposal metadata plus a deterministic JSON body containing the preview or execution payload and published git-warp fact exports, making the proposal a durable governance record without inventing new substrate serialization -
Durable
comparison-artifact:*governance records —xyph api compare_worldlinesnow acceptspersist: trueand records a deterministic comparison artifact onworldline:live, carrying both the XYPH operationally scoped git-warp fact and the raw whole-graph git-warp fact in the recorded body. -
Thin
braid_worldlinesmapping over published substrate braids —xyph api braid_worldlinesnow targets a canonical derived worldline, pins one or more canonical derivedsupportWorldlineIdsthrough git-warp’s published braid substrate, accepts optionalreadOnly, and returns XYPH-first braid/worldline metadata plus substrate backing identifiers. It changes co-present visibility without pretending merge, rebase, or collapse semantics -
Operationally scoped
compare_worldlinespreview —xyph api compare_worldlinesnow maps onto git-warp's published coordinate comparison surface twice: once for raw whole-graph audit truth and once for XYPH's operationally scoped freshness truth. The command returns a typed XYPHcomparison-artifactpreview with deterministic artifact identity, per-side observation coordinates, substrate-backed visible patch divergence, visible node/edge/property deltas, optional target-local comparison detail whentargetIdis provided, and durable recording support without self-perturbing tip-vs-tip freshness. -
Working-set-backed derived-worldline execution — canonical derived worldlines now support honest working-set-local
observe(graph.summary),observe(worldline.summary),observe(entity.detail),history,diff, andapply. These reads materialize the backing git-warp working set rather than the shared live graph, andapplylowers through the same mutation kernel as live writes while committing to the working-set overlay patch log. Observation coordinates across these commands now reflect the working-set-visible frontier instead of quietly reporting the live graph digest -
Braided derived-worldline parity across the canonical control-plane slice — braided canonical derived worldlines now stay internally consistent across
observe(graph.summary),observe(worldline.summary),observe(entity.detail),history,diff,apply, andobserve(conflicts), with integration coverage proving the selected braid yields one coherent execution surface. -
Working-set-backed
fork_worldline—xyph api fork_worldlinenow creates derived XYPH worldlines by delegating to git-warp working-set creation. The current slice is intentionally narrow: it supportsworldline:liveas the source worldline, accepts optionalat: { tick }as a current-frontier Lamport ceiling, and returns an XYPH worldline payload plus the backing git-warp working-set identifier without pretending arbitrary historical frontier or nested derived-worldline support already exists -
Worldline-aware substrate conflict projection —
xyph api observenow supportsprojection: "conflicts"backed bygit-warp's read-onlyanalyzeConflicts()surface for the live frontier or a canonical derived worldline's backing working set. The projection remains tip-only, accepts optionallamportCeilingand analyzer filters, and returns substrate conflict traces without inventing XYPH-side counterfactual truth -
Historical observation selectors and structured redaction —
xyph apilow-level reads now supportat/sincetick selectors forobserve(graph.summary),observe(worldline.summary),observe(entity.detail),history, anddiff, using isolated read graphs materialized at explicit ceiling ticks. Sealed observation now returns structuredredactionsmetadata for content-bearingentity.detailpayloads instead of treating partial withholding as total failure -
Per-request capability resolution for
xyph api— the sovereign control-plane now computes principal, observer profile, and effective capability grants per request instead of assuming one process-wide identity.apply,attest,propose,comment, and hidden admin/debug commands now flow through a shared capability resolver, and audit/observation metadata carry the resolved principal and capability context -
Sovereign control-plane foundation — added
xyph api, a versioned JSONL machine interface backed byControlPlaneServicewithobserve,history,diff,explain,fork_worldline,compare_worldlines,collapse_worldline,apply,comment,propose, andattestcommand support.queryandrewind_worldlineremain reserved without pretending they are implemented yet -
Generic mutation kernel — added
MutationKernelService, a single allowlisted primitive-op mutation path (add_node,remove_node,set_node_property,add_edge,remove_edge,set_edge_property,attach_node_content,clear_node_content,attach_edge_content,clear_edge_content) for sovereign control-plane writes and future collapse lowering -
Append-only proposal and attestation records — added
RecordServicesupport forproposal:*andattestation:*durable records, alongside comment creation routed through the same mutation kernel instead of ad hoc CLI patch logic -
Canonical artifact record helper —
RecordServicenow supports durable canonical control-plane artifact recording for XYPH-owned node families such ascollapse-proposal:*, keeping ontology/governance meaning in XYPH while reusing published git-warp fact exports in the recorded body -
Canonical sovereign-control-plane docs — public docs now state that XYPH's ontology is sovereign, that observer profiles do not grant authority by existing, and that Alfred-derived components may sit behind ports without leaking into XYPH's public API vocabulary
-
xyph doctorgraph health audit — new CLI command audits dangling edges (including incoming edges from missing nodes), orphaned workflow/narrative/traceability nodes, readiness contract gaps, sovereignty violations, and governed completion gaps. Supports both human-readable output and--jsonfor automation -
xyph doctor prescribedeterministic remediation view — doctor now derives structured prescriptions with category (structural-blocker,structural-defect,workflow-gap,hygiene-gap), blocked transitions, blocked task IDs, effective priority inheritance, and top remediation buckets for automation and agent-facing triage -
Doctor-backed recommendation work in the agent protocol —
briefing,next, andcontextnow surface doctor prescriptions as recommendation work instead of burying graph-health findings inside diagnostics only.briefingincludes arecommendationQueue,contextincludesrecommendationRequests, andnextcan surface urgent doctor-driveninspectcandidates -
Global "My Stuff" drawer — press
mfrom any screen to toggle an animated drawer showing agent's quests, submissions, and recent activity. Slides in from the right with a tween animation; content is agent-scoped whenXYPH_AGENT_IDis set. Replaces the fixed right column on the dashboard view -
Campaign DAG visualization — campaigns with inter-campaign dependencies are rendered as a mini-DAG using bijou's
dagLayout(), sorted topologically. Falls back to flat list when no dependencies exist -
Status bar progress bar — compact gradient progress bar added to the status line showing quest completion percentage
-
Graph algorithm ban enforcement —
scripts/check-graph-algorithms.shdetects userland BFS/DFS/topo-sort/Dijkstra patterns insrc/. Wired into CI (strict-policyjob) andpre-commithook. Enforces the rule that all graph traversals must use git-warp'sgraph.traverse.*API -
transitiveDownstreamin GraphSnapshot — pre-computed viagraph.traverse.bfs()in GraphContext; eliminates the last userland BFS incomputeTopBlockers()(DepAnalysis.ts)
- PR feedback hardening across summaries, quest detail, agent case work, and suggestion actions — control-plane summary counts now include milestones in the campaign census, analysis-profile snapshots retain governed case links for AI suggestions, milestone-backed quest detail reads preserve their parent context, missing criterion
verifiableflags now default totrueconsistently in quest detail, narrative/comment expansion now usesgraph.traverse.bfs()instead of hand-rolled queue walkers,next()now keeps an inspect fallback for cases that are ready for judgment but not briefable, and the TUI blocks empty adopt/supersede suggestion rationales before dispatching writes. - PR feedback hardening across derived reads, agent queues, and suggestion resolution — per-profile snapshot caches no longer let stale
fullsnapshots survive neweroperationalreads, derived worldline content detail no longer leaks mismatched live-tip bodies when the derived_contentOID diverges, agent briefing case queues now reuse the same operational read boundary as the briefing snapshot, Ask-AI from a governed case page now binds to the open case instead of the underlying lane selection, and both CLI/TUI suggestion adoption or supersession now require an explicit non-empty rationale. The lockfile was also refreshed to clear the current productionnpm auditfindings. - Derived worldline graph shims now use an explicit GraphContext read surface —
createGraphContextFromGraph()now accepts the smaller read-only surface it actually consumes,GraphContextguardssyncCoverage()explicitly instead of assuming every caller is a full live graph handle, and the derived control-plane adapter no longer suppresses the type system withas unknown as WarpGraphjust to satisfy entity-detail reads. - Inspector scroll status and confirm modal hint rendering were clarified — the inspector no longer shows BIJOU’s ambiguous raw
Line N/Mfooter label. XYPH now renders a clearerScroll N/Mstatus only when the inspector detail actually overflows, drives the inspector rail from wrapped pager line counts, and explicitly terminates styled confirm-hint segments so the quit modal border no longer inherits the final red cancel color. act mergenow fails loudly when decision recording does not land — if the git merge succeeds but XYPH cannot write the authoritative merge decision back into the graph, the agent action kernel now returns a non-success partial-failure outcome and the CLI exits with an error envelope instead of reporting the merge as fully successful. This keeps automation retryable and prevents silently “settled” submissions that never recorded their decision state- Trust test fixture is now tracked correctly —
.gitignorenow ignores only the repo-roottrust/and.xyph/directories, sotest/fixtures/trust/keyring.jsonis committed and available in CI. Fixes patch-ops matrix failures caused by missing public-key fixture data on clean checkouts - Blocker counts exclude GRAVEYARD tasks —
transitiveDownstreamBFS now excludes GRAVEYARD tasks from counts (matching DONE exclusion), andfilterSnapshot()strips GRAVEYARD keys from the map. Fixes inconsistency wheredirectCount(from filtered edges) andtransitiveCount(from unfiltered BFS) could diverge when--include-graveyardwas not set - Landing screen auto-dismiss —
showLandingis now set tofalsewhensnapshot-loadedfires, so the dashboard appears immediately after data loads. Previously required a throwaway keypress to dismiss the landing screen, making navigation appear broken - View cycling via
[/]— bracket keys cycle forward/backward through all 5 views from anywhere, matching bijou'screateFramedAppconvention ([/]= tabs, Tab = panes). Tab/Shift+Tab retained for panel switching within views - Transactional
updateKeyringAPI (KeyringStoragePort) — newupdateKeyring(mutator)method withKeyOpshandle; adapter records an undo log and rolls back private-key side-effects in reverse order on failure (KSP-001)
-
--jsonnow speaks JSONL stream semantics — CLI JSON mode can emit newline-delimited JSON event records before the terminal success/error envelope.xyph doctorandxyph doctor prescribenow streamstartandprogressrecords while long audits run; the final result record remains the existing success/error envelope shape -
Agent action validation now refuses structurally illegal transitions — the action kernel consults cached doctor prescriptions before
ready,submit,review,seal, andmerge; transitions blocked by impossible or broken graph state now fail withillegal-graph-stateinstead of limping forward -
Dashboard restyled to single-column layout — graph stats use bold primary labels instead of dim/muted text; health metrics (sovereignty, orphans, forked) merged into the stats area; "Inbox" label renamed to "Backlog"; Top Blockers rendered as
bijouTable()instead ofenumeratedList() -
Dashboard panel switching removed — Tab/Shift+Tab on dashboard is now a no-op. The right column content moved to the global drawer (
mkey) -
Upgrade bijou 1.3.0 → 1.8.0 — all three packages (
@flyingrobots/bijou,bijou-node,bijou-tui) bumped. Test helper imports updated to use@flyingrobots/bijou/adapters/testsubpath -
Upgrade git-warp 13.1.0 → 14.0.0 — major version bump, no breaking changes for current usage
-
Upgrade git-warp 14.0.0 → 14.2.0 — XYPH now consumes the published substrate conflict analyzer and raises its explicit dependency floor accordingly
-
Upgrade git-warp 14.2.0 → 14.3.0 — XYPH now tracks the published substrate release that expands the git-warp time-travel debug CLI and its debugger architecture/docs, keeping the dependency floor aligned with the released substrate toolchain
-
Upgrade git-warp 14.3.0 → 14.4.0 — XYPH now tracks the published substrate release that expands the built-in
git warp debugtime-travel CLI withcoordinateandtimelineinspection, keeping the released debugger surface aligned with the substrate version XYPH depends on -
Upgrade git-warp 14.4.0 → 14.5.0 — XYPH now tracks the published substrate release that adds the working-set foundation: explicit coordinate materialization plus durable
git warp working-setmanagement for pinned substrate coordinates, without forcing XYPH to consume unreleased git state -
GuildSealServicesimplified —generateKeypair()androtateKey()now delegate rollback toupdateKeyring(), removing hand-written try/catch rollback choreography from the domain layer -
Shared test helpers (
test/helpers/) —makeSnapshot(), entity builders (quest,intent,campaign,scroll,submission,review,decision),strip()ANSI helper,makeKey()/makeResize()keyboard factories, and mock port factories (mockGraphContext,mockIntakePort,mockGraphPort,mockSubmissionPort). Eliminates duplication across TUI test files -
Shared view helpers (
src/tui/view-helpers.ts) —sliceDate(),groupBy()eliminate repeated date formatting and array grouping patterns across render-status.ts and bijou view files -
assertNodeExists()validator (src/cli/validators.ts) — shared graph node existence check replacing 15 inlinehasNode() + throw NOT_FOUNDpatterns across 5 command files -
SecretPortinterface (src/ports/SecretPort.ts) — extractedSecretAdapterinterface from infrastructure to ports layer, fixing hexagonal architecture boundary violation (H3) -
KeyringStoragePort— new port abstracting keyring and private-key persistence (src/ports/KeyringStoragePort.ts), decouplingGuildSealServicefromnode:fs,node:path, andnode:crypto -
FsKeyringAdapter— filesystem-backed implementation ofKeyringStoragePort(src/infrastructure/adapters/FsKeyringAdapter.ts) -
TestParserPort— new port abstracting test-file parsing (src/ports/TestParserPort.ts), decoupling analysis pipeline from the TypeScript Compiler API -
TsCompilerTestParserAdapter— TS Compiler API implementation ofTestParserPort(src/infrastructure/adapters/TsCompilerTestParserAdapter.ts), containing logic previously insrc/domain/services/analysis/TestFileParser.ts -
scripts/under lint + typecheck —tsconfig.scripts.jsonand ESLint config now cover all TypeScript scripts;npm run lintchecks scripts alongside src/test -
Consolidated
wire-deps.ts— single idempotent dependency-wiring script replacing wave2/wave3/fixup; gracefully skips missing nodes, detects cycles and duplicates -
migrate-voc-001.ts— one-shot graph migration script, patched 116 legacyINBOXnodes toBACKLOG
- RoadmapPort split —
RoadmapQueryPort(reads),RoadmapMutationPort(writes),RoadmapSyncPort(sync) withRoadmapPortas their union for backward compat (S6/ISP) - GuildSealService refactored to port-based architecture — all filesystem and crypto RNG operations extracted to
KeyringStoragePort; domain service is now pure, depending only on the port interface (hex audit H1 fix) - TestFileParser moved to infrastructure layer — implementation relocated from
src/domain/services/analysis/toTsCompilerTestParserAdapter; domain file replaced with deprecation tombstone (hex audit H2 fix) - Keybindings standardized to bijou v1.6.0 vim conventions — all views now use
d/ufor half-page scroll,g/Gfor jump-to-top/bottom,spacetoggles accordion in lineage view. Reject in backlog rebound fromdtoD(shift+d) to avoid conflict with page-down. Command palette navigation changed fromj/ktoCtrl+N/DownandCtrl+P/Up(j/k now type filter characters). All view keymaps built on bijou preconfigured factories (navTableKeyMap,accordionKeyMap,commandPaletteKeyMap) - Upgrade bijou v1.3.0 → v1.6.0 — all three packages (
@flyingrobots/bijou,@flyingrobots/bijou-node,@flyingrobots/bijou-tui) bumped to v1.6.0. New capabilities include:interactiveAccordion(), transition shaders (7 built-in page transitions), preconfigured*KeyMap()factories for all building blocks,markdown()terminal renderer,hyperlink()(OSC 8),dagStats(),auditStyletest adapter, drawer with all 4 anchors, and DTCG theme interop - VOC-001: Vocabulary rename — raw graph statuses now match the domain model.
inboxcommand writesBACKLOG(wasINBOX),promotewritesPLANNED(wasBACKLOG),quest/quest-wizardwritePLANNED(wasBACKLOG),reopenwritesBACKLOG(wasINBOX).normalizeQuestStatus()retained as legacy shim for un-migrated nodes only - Reject from BACKLOG or PLANNED —
rejectcommand now accepts quests in BACKLOG or PLANNED status; adapter and domain service aligned - Scripts migrated to git-warp v13 API — all
props.get('key')calls inscripts/replaced with Record bracket notationprops['key'];Array<T>→T[], unused imports removed - Quest status lifecycle diagram — updated to reflect VOC-001 rename (no more INBOX state)
- WarpIntakeAdapter promote/reject guards — adapter and domain service now use the same status vocabulary; promote checks
BACKLOG, reject acceptsBACKLOG|PLANNED
VALID_RAW_STATUSES— no longer needed;normalizeQuestStatus()handles legacy values- task:BX-017 (HistoryPort) — graveyarded as redundant; git-warp v13 natively provides
patchesFor(),materializeSlice({ receipts: true }), andmaterialize({ ceiling }). Downstream quests (BX-009–016) call git-warp directly - 14 obsolete/duplicate quests graveyarded — VOC-002 (normalization already done), cli-backlog-add (duplicate of inbox), upstream-ink-fullscreen & bijou-v09-title-refactor & bijou-type-guards & e2e-dashboard-smoke (Ink removed), BKL-PRESET-SOT & inline-color-status (already satisfied), suggestion-calibrate & IDEA-TEMPORAL-TRACE & temporal-traceability-queries & IDEA-HEATMAP & traceability-heat-map & IDEA-SCAN-IMPL (duplicates)
- Key rotation —
GuildSealService.rotateKey(agentId)generates a new Ed25519 keypair, marks the previous key as retired (active: false), and registers the new key as the sole active key for the agent. Retired keys stay in the keyring for verification of historical signatures (WVR-006) - Pre-rendered SVG diagrams — 24 diagrams across 22 documentation files, rendered from Mermaid source (
.mmd) to SVG viammdc. Source files indocs/diagrams/*.mmd, rendered output indocs/diagrams/*.svg. Render script:scripts/render-diagrams.sh. Covers entity relationships, state machines, flowcharts, sequence diagrams, and architecture stacks (WVR-006) historycommand —xyph-actuator history <nodeId>shows all patches that touched a node via git-warp'spatchesFor()provenance API (Constitution Art. III compliance)- Multibase DID key encoding —
encodeBase58btc()andpublicKeyToDidKey()incrypto.ts; Ed25519 public keys are now encoded as spec-compliantdid:key:z6Mk...identifiers using the multicodec prefix0xed01+ base58btc multibase encoding (WVR-006) - Versioned keyring migration pipeline —
loadKeyring()transparently migrates older keyring formats on read via a sequential migration chain (v1 → v2 → ...); future schema changes (key rotation, expiry, multi-algorithm) slot in by appending a migration function (WVR-006) - Guild Seals documentation —
docs/GUILD_SEALS.mdcovers the full signing system top-to-bottom: key generation, DID key encoding, signing flow, verification, keyring schema, versioning, migration pipeline, trust directory layout, security considerations, and FAQ (WVR-006)
- Keyring schema v3 —
KeyringEntrygainsactiveboolean for key rotation support;loadKeyring()validates at-most-one active key per agent (multiple retired keys allowed); v2→v3 migration defaults all existing entries toactive: true(WVR-006) - Keyring schema v2 —
KeyringEntrygainsagentId(agent→key lookup) andlegacyKeyIds(alias resolution for backward-compatible verification);loadKeyring()indexes the Map by both canonical derived keyId and legacy aliases so old patches and new seals both resolve correctly (WVR-006) keyIdForAgent()derives real DID keys —GuildSealService.keyIdForAgent()now looks up the agent's public key from the keyring and derives a proper multibase-encodeddid:keyinstead of the previousdid:key:<agentId>placeholder (WVR-006)sign()derives keyId from private key —GuildSealService.sign()now computes the public key from the private key at sign time and derives the DID key directly, ensuring the seal'skeyIdalways matches the signing keygenerateKeypair()writes v2 keyrings — new keypairs are written with the deriveddid:key:z6Mk...as the canonical keyId and include theagentIdfield (WVR-006)- StylePort interface — dependency-injected styling abstraction (
StylePort) withBijouStyleAdapter(chalk-based) andPlainStyleAdapter(no-color) implementations; replaces the global theme singleton with explicit wiring through the composition root - Theme lab TUI — interactive design token exploration tool (
xyph-theme-lab.ts) for cycling through theme palettes in real time - Dark + light theme variants — automatic terminal background detection with distinct dark and light palettes; theme selection adapts to the user's terminal
- CLI pipeline uses StylePort DI — all CLI commands and TUI views receive
StylePortvia the composition root instead of importing a global theme module; threading flows fromxyph-actuator.ts→ commands → render functions
- Ink / React / JSX — removed
ink,react,@types/react,boxen, andcli-table3dependencies (all replaced by bijou). Removed JSX compiler options (jsx,jsxImportSource) from tsconfig. Renamedxyph-dashboard.tsx→xyph-dashboard.ts. No JSX or React code remains in the codebase. - Global theme bridge — deleted
src/tui/theme/bridge.tsand its tests. All styling now flows through the dependency-injectedStylePortinterface. - Dead theme barrel module — deleted orphaned
src/tui/theme/index.tsbarrel re-export
- Schema keyId pattern sync —
schemas/PATCH_OPS_SCHEMA.v1.jsonkeyId regex now matches the multibase Base58btc spec (z[1-9A-HJ-NP-Za-km-z]{10,100}), replacing the loosez6[A-Za-z0-9]+that accepted invalid multibase characters (WVR-006) - Schema deduplication —
docs/canonical/PATCH_OPS_SCHEMA.jsonreplaced with a symlink toschemas/PATCH_OPS_SCHEMA.v1.json; the runtime schema is now the single source of truth, eliminating a persistent drift trap (WVR-006) - Schema documentation — added
descriptiontobaseSnapshotDigestin the schema (advisory, not a concurrency gate); addeddeprecated+descriptiontorollbackPatchDigestin AUDIT_EVENT_SCHEMA.json (WVR-006) - Prose alignment with CRDT reality — replaced centralized-database vocabulary in README (atomicity/rollback), WHITEPAPER ("work is a transaction"), EXECUTIVE_SUMMARY (signed → attributed, 900→650 tests), AGENT_CHARTER (blockedBy → depends-on), ORCHESTRATION_SPEC (snapshot mismatch → entity conflict), PATCH_OPS_INVARIANTS (baseSnapshotDigest advisory note) (WVR-006)
- DashboardApp watching lifecycle —
startWatching()(graph.watch polling) now fires frominit()alongside the initialfetchSnapshot(), instead of being conditionally triggered on the firstsnapshot-loadedmessage; thewatchingmodel field still tracks state but no longer gates command emission - Test fixture type completeness — added missing
watching: falseto themakeModel()helper inviews.test.tsto match the updatedDashboardModeltype - graph.watch() process hang —
stopWatching()now clears the poll interval on quit, preventing the Node process from hanging after dashboard exit - Theme lab bridge bypass — theme lab creates its own
StylePortinstances directly instead of routing through the (now-deleted) global bridge - Stale .tsx doc comment — fixed leftover
.tsxreference inxyph-dashboard.ts - Coordinator daemon StylePort hoisting —
StylePortinstance lifted to module level incoordinator-daemon.tsto avoid repeated construction
- Lineage view hid orphan quests —
renderLineagereturned early whensnapshot.intents.length === 0, skipping orphan quest rendering; orphan detection now runs before the early return so sovereignty violations are always visible - Remote-change events dropped during fetch —
DashboardAppnow setsrefreshPending: truewhen aremote-changearrives while a snapshot fetch is in-flight, triggering a follow-up refresh on completion - Theme resolver read env var twice —
BijouStyleAdaptercreated a secondcreateThemeResolverthat re-readXYPH_THEME; now uses the already-resolved theme as fallback without re-reading - Gradient sample RangeError —
xyph-theme-lab.tscould pass negative value to'#'.repeat()on narrow terminals; clamped toMath.max(0, ...) - Double-styling in history command — removed
chalk.dim()insidectx.muted()incoordination.ts; styling now flows exclusively throughStylePort - Guild terminology in roadmap — replaced "tasks" with "Quests" in frontier blocked/waiting messages
- ARCHITECTURE.md diagram — updated
(TUI/Ink)label to(TUI/TEA)to match the bijou migration - Lint scope — added
xyph-theme-lab.tsto ESLint config, lint script, andtsconfig.jsonincludes; fixed unusedwparameters surfaced by strict compilation - Stale bridge.ts references — updated comments in
xyph-presets.tsto referenceBijouStyleAdapter - Theme brightness test — replaced packed-RGB comparison with W3C relative luminance formula
- Test header assertion — removed
toContain('Backlog')header text assertion per project test guidelines
DagAnalysis.ts— pure functions for DAG structure analysis: DAG width, greedy worker scheduling, and anti-chain groupingscripts/generate-work-dag.ts— generates comprehensive DAG visualization suite: full/per-campaign/backlog/graveyard SVGs in both LR and TB orientations, pluswork.mdanalysis document with topological sort, critical path, parallelism, scheduling, transitive reduction/closure, ancestry/impact, campaign grouping, and anti-chain wavesnpm run graph:work— runs the generator, outputs todocs/work/- 17 unit tests — unit tests for remaining DagAnalysis functions (diamond, linear, empty, single-node, isolated-node graphs)
- Upgraded git-warp to v13.1.0 —
@git-stunts/git-warpfrom v12.1.0 to v13.1.0; migrated allgetNodeProps()call sites fromMap<string, unknown>(.get()) toRecord<string, unknown>(bracket notation) - Delegated graph algorithms to git-warp traversals — removed userland
computeLevels(),transitiveReduction(),transitiveClosure(),reverseReachability(),computeProvenance()fromDagAnalysis.ts;generate-work-dag.tsnow callsgraph.traverse.levels(),.transitiveReduction(),.transitiveClosure(),.rootAncestors()directly;computeAntiChains()simplified to accept pre-computed levels - Upgraded bijou to v1.3.0 —
@flyingrobots/bijou,@flyingrobots/bijou-node,@flyingrobots/bijou-tuifrom v1.2.0 to v1.3.0 - Upgraded bijou to v1.2.0 —
@flyingrobots/bijou,@flyingrobots/bijou-node,@flyingrobots/bijou-tuifrom v0.10.0 to v1.2.0 - Roadmap DAG panel uses
dagPane()— replaced ~50 lines of manualdagLayout()+viewport()+ scroll-centering math with bijou v1.2.0'sdagPane()building block; auto-scroll-to-selection, keyboard-synced DAG highlight,DagPaneStatereplaces rawdagScrollX/dagScrollY - Dashboard columns use
focusArea()— replaced bareviewport()withfocusArea()for visual focus indication; focused column shows bright▎gutter, unfocused shows muted gutter - Default theme — switched from
cyan-magentatoteal-orange-pink
- Vitest config simplification — removed explicit
includeglobs fromvitest.config.tsand retained focusedexcluderules, using Vitest default test discovery for future*.spec.*/*.test.tsxcompatibility - CI audit vulnerability (
tar) — updated lockfile resolution fromtar@7.5.8totar@7.5.10(via transitive@mapbox/node-pre-gyp/node-gyp) sonpm audit --omit=devpasses with zero vulnerabilities
- Roadmap fallback paging restored — PageDown/PageUp now scroll the right roadmap panel even when a snapshot has no dependency edges; fallback viewport scroll is stateful instead of hardcoded to row 0
- DagPane always built when quests exist — snapshot refresh now creates
roadmap.dagPanefor quest-only graphs, while critical-path computation remains gated ondagEdges.length > 0 - Defensive DagPane sizing — DagPane width/height are clamped to positive minimums on both resize and snapshot rebuild paths
- Unused analysis arg removed — dropped the unused
sortedparameter frombuildAnalysisInputs()inscripts/generate-work-dag.tsand updated call sites - SVG ignore intent documented —
.gitignoretargets generated DAG artifacts (docs/assets/work-dag*.svg) and now includes inline rationale for the pattern
- DONE tasks inflated scheduling makespan —
scheduleWorkersnow treats DONE tasks as weight 0, matchingcomputeCriticalPathsemantics (Codex P1) - CI traceability job failure — added
fetch-depth: 0and git identity config to traceability workflow; shallow clones lack commit objects needed by git-warp materialization - Topological sort delegated to graph traversal API —
generate-work-dag.tsnow delegates tograph.traverse.topologicalSort()instead of using a hand-rolled Kahn implementation (P1-01) - Unused
reverseReachabilityimport — removed fromgenerate-work-dag.ts(P2-01) - Dead
allNodesset incomputeProvenance— removed unused variable construction loop (P2-02) - Non-null assertions — replaced
!assertions ingenerate-work-dag.tsandDagAnalysis.test.tswith guard patterns (P3-01/02/04) - Redundant
STATUS_COLORS['BACKLOG']!— extractedDEFAULT_COLORSconstant, eliminating non-null assertion (P3-03) - 237KB SVG tracked in repo — removed
docs/assets/work-dag.svgfrom index and added a generated-artifact ignore rule (docs/assets/work-dag*.svg) to.gitignore(P4-01)
- Git hooks —
scripts/hooks/pre-commit(lint gate) andscripts/hooks/pre-push(test gate); plain shell scripts, no Husky/lint-staged npm run graph:pull— fetches WARP writer refs from origin for local materializationnpm run graph:push— pushes WARP writer refs (refs/warp/xyph-roadmap/writers/*) to origin for CI and collaborator access; excludes checkpoint/coverage cache refs which are rebuilt locally- CI traceability job — new
traceabilityjob in.github/workflows/ci.ymlfetches WARP refs and runsanalyze --dry-run --jsonfor coverage reporting .xyph.jsonin.gitignore— local config file excluded from version control- Self-referential analyze baseline — ran
analyze --dry-runagainst XYPH's own 745-test suite; 49 files scanned, 0 graph targets (traceability chain not yet populated) - Backlog items — 10 new inbox tasks: soft-gate merge, TUI suggestion tab, dashboard suggestion widget, roadmap coverage badge, traceability heat map, production code scan annotations, temporal traceability queries, auto graph push hook, CI graph cache, suggestion calibration
- M11 Phase 3 design doc —
docs/M11-phase3-design.mdcovers computed status propagation, DoD policies, hard-gate seal/merge, and gap detection
- Evidence dedup uses
sourceFile—EvidenceNodenow exposessourceFilefrom graph props;analyzefilters existing evidence bysourceFile:criterionIdinstead ofproducedBy:criterionId(C-1) - Consolidated
LayerScoreinterface — single canonical definition inanalysis/types.ts, re-exported fromSuggestion.ts; eliminates duplicate interface (M-1) - Batch graph patches in
analyze— auto-link and suggestion writes use onegraph.patch()call each instead of per-item patches (M-2) - Batch graph patches in
suggestion accept-all— singlegraph.patch()for all accepted suggestions (M-3) - Removed double casts in
ConfigAdapter— exportedmergeWeights/mergeLlmfromConfigResolution, used to safely parse partial JSON from graph (m-2) - Type-safe
config set— replacedas nevercast with exhaustive switch on config key (m-3) - Inlined global regex in
TraceabilityScan—CRITERION_REFregex now local toscanAnnotations(), avoids stalelastIndexfrom global flag (m-4) - Removed duplicate
'should'in STOP_WORDS —ImportDescribeLayerhad'should'listed twice (N-2) - Fixed
renderAlltotal count — now includes submissions, reviews, decisions, stories, requirements, criteria, evidence, and suggestions (N-3) - Hardened
Suggestionconstructor — per-entryLayerScorevalidation (layer, score, evidence shape checks) and deep-freeze of individual layer objects - Hardened
GraphContextsuggestion parsing —Number.isFinite()guard on confidence, per-element shape validation on parsed layer JSON - Rendered rejected suggestions —
renderSuggestionsnow shows a Rejected section with rationale, parallel to Accepted - Campaign cardinality in orphan script —
assign-orphan-campaigns.tsnow validates campaign existence and skips quests already assigned to another campaign instead of adding duplicatebelongs-toedges - Hash-based evidence/suggestion IDs —
analyzenow uses SHA-256 hash oftestFile+targetIdinstead of slug truncation, preventing ID collisions across files - Removed unsafe casts in config CLI —
config get/set/listoutput no longer usesas unknown asdouble casts - Criterion validation in
scan—scancommand now validates criterion node existence before writing evidence edges, skips missing criteria with a warning, and batches writes into a single patch - TestFileParser handles modifiers —
getCallNamenow resolvesit.only,describe.skip,it.each(...)()to their root identifier - LLM adapter graceful fallback —
AnthropicLlmAdapter.getSecret()moved insidetry/catchso vault errors trigger graceful degradation instead of crashing - Evidence dedup for
implementsedges —EvidenceNodenow exposesrequirementIdfromimplementsedges;analyzededup filter covers bothverifies(criterion) andimplements(requirement) edges - Synced
package-lock.json— lock file now includes@anthropic-ai/sdk,@git-stunts/vault, and transitive deps; fixes all CInpm cifailures
- Config infrastructure — layered resolution (env >
.xyph.json> graph > defaults),config get/set/listCLI commands (ALK-001) suggestion:node type — auto-detected test→criterion/requirement links with PENDING/ACCEPTED/REJECTED lifecycle, LayerScore breakdown (ALK-002)- Suggestion lifecycle commands —
accept,reject,accept-allCLI commands with evidence materialization on accept (ALK-003) - Test file parser — TypeScript Compiler API extraction of imports, describe/it blocks, function/method calls (ALK-004)
- Heuristic scoring framework — ScoreCombiner with weighted averaging and automatic renormalization for missing layers (ALK-005)
- 4 heuristic layers — FileNameLayer (0.4–0.8), ImportDescribeLayer (0.3–0.7), AstLayer (0.7–0.9), SemanticLayer (Jaccard ×3) (ALK-006)
- LLM port + Vault integration — provider-agnostic LlmPort, VaultSecretAdapter for OS keychain, AnthropicLlmAdapter (ALK-007)
- LLM heuristic layer — batch test-target analysis with structured JSON matching, graceful fallback (ALK-008)
xyph analyzecommand — full orchestration: config→glob→parse→score→classify→write, with--dry-run,--layers,--min-confidence(ALK-009)status --view suggestions— pending/accepted/rejected suggestions with confidence and layer breakdown (ALK-010)suggestsedge type — suggestion→target linking in graph schema- 107 new tests — 10 test suites covering all new domain services, entities, and analysis layers
- Dependencies —
@git-stunts/vault1.0.1,@anthropic-ai/sdk0.78.0
story:node type — user stories with persona/goal/benefit,storyactuator command (TRC-001)req:node type — requirements with kind (functional/non-functional) and MoSCoW priority,requirementactuator command (TRC-001)criterion:node type — acceptance criteria attached to requirements,criterionactuator command (TRC-005)evidence:node type — verification evidence (test/benchmark/manual/screenshot) with pass/fail result,evidenceactuator command (TRC-005)decomposes-toedge type — intent→story and story→req decomposition,decomposeactuator command with cycle checks (TRC-002)has-criterionedge type — requirement→criterion attachment (TRC-005)verifiesedge type — evidence→criterion verification link (TRC-005)- GraphSnapshot extended —
stories[],requirements[],criteria[],evidence[]fields with full edge resolution (TRC-003, TRC-006) status --view trace— traceability chain renderer: stories→reqs→criteria→evidence with coverage stats (TRC-004)xyph scan— test annotation parser (// @xyph criterion:<id>) that writes evidence nodes automatically (TRC-007)- Completeness queries —
computeUnmetRequirements,computeUntestedCriteria,computeCoverageRatiopure functions (TRC-008) - 57 new tests — 4 entity unit tests, scan parser, analysis queries, full integration round-trip
intent:TRACEABILITY— sovereign intent for requirements, acceptance criteria, and evidence as first-class graph objects- 13 TRC quests (TRC-001..013) under
campaign:TRACE, spanning 4 phases: Foundation, Criteria & Evidence, Computed Status, Intelligence - 12 dependency edges wiring the TRC quest execution order
- Rejected
task:traceability-m11placeholder — superseded by the concrete decomposition
- 58 orphan quests assigned to campaigns via
scripts/assign-orphan-campaigns.ts:- 22 →
campaign:DASHBOARD(TUI, bijou, rendering) - 24 →
campaign:CLITOOL(CLI, CI, testing, theme) - 6 →
campaign:ECOSYSTEM(external integrations, scaling) - 4 →
campaign:AGENT(agent protocol) - 1 →
campaign:SUBMISSION, 1 →campaign:BEDROCK
- 22 →
- Zero orphan quests remaining (was 30% of all quests)
- Cross-type
dependguard —dependnow rejects edges between different type families (e.g.task:→campaign:); both nodes must be tasks, or both must be campaigns/milestones - CHANGELOG version ordering — restored
[Unreleased]→[alpha.12]→[alpha.11]sequence --jsondeps output —milestoneExecutionOrdernow included instatus --view deps --jsonoutput- Milestone frontier with zero dep edges —
computeFrontieris now always called for campaigns; previously returned empty frontier when nodepends-onedges existed, hiding actionable milestones
- Replaced unsafe
ascast inseed-milestone-deps.tswithtoNeighborEntries()runtime validator - Removed redundant optional-chaining in
render-status.tsmilestone sections (extracted to local const for proper narrowing) Array<[string, string]>→[string, string][]style fix in seed script
Campaign dependency graph:
CampaignNodenow carriesdescriptionanddependsOnfieldsGraphSnapshotincludessortedCampaignIds(topological order via git-warp traversal)dependcommand widened to acceptcampaign:andmilestone:nodes alongsidetask:nodes- Cycle detection works across all node types
Milestone frontier in deps view:
status --view depsnow shows Milestone Frontier (campaigns whose deps are all DONE) and Milestones Blocked tables--jsonoutput includesmilestoneFrontier,milestonesBlocked, andmilestonesfields- Dashboard campaigns section annotates blocked campaigns with
[blocked]indicator
Data migration:
- Seeded descriptions on all 13 campaigns, created missing
campaign:TRACE(M11) andcampaign:ECOSYSTEMnodes - Added 8 inter-milestone
depends-onedges - Fixed
campaign:WEAVERstatus from BACKLOG to DONE - Removed
docs/ROADMAP.md— milestone data now lives in the WARP graph
Navigation model rework:
- Number keys
1–5now jump directly to views (dashboard/roadmap/submissions/lineage/backlog), replacingTab/Shift+Tabview cycling Tabis rebound on the dashboard view to switch focus between left (In Progress) and right (My Quests) panelsPageDown/PageUpon the dashboard now scroll the focused column instead of toggling panels- Command palette shortcuts updated to show
1–5for view switching
Independent column scrolling:
- Dashboard left and right columns are now wrapped in
viewport()from bijou-tui, enabling vertical scrolling when content overflows the terminal height - New
leftScrollY/rightScrollYstate tracks scroll position per column independently - Health, Top Blockers, and Activity Feed sections are now reachable via
PageDownon tall dashboards
Confirm overlay:
confirmOverlay()now accepts an optional custom hint string (used by quit confirmation dialog)
Quit flow redesign:
- Double-press
qreplaced with a modal confirmation dialog (q→ confirmy/qor canceln/Esc)
Activity feed enrichment:
- Recent Activity events now show quest titles alongside truncated IDs for better scanability
- Alert bar: orphan/forked warning bar removed from dashboard header; diagnostic data moved to the Health section
- Brittle test assertions: rewrote ~34 string-matching assertions across 5 test files to assert on data (IDs, counts, domain constants) instead of UI labels, section headers, and empty-state prose — eliminates false failures from vocabulary changes
- Date formatting: replaced locale-dependent
toLocaleDateString()with deterministictoISOString().slice(0, 10)across all views (DashboardApp, render-status, submissions-view, lineage-view) - Single-campaign cardinality:
authorize/linknow removes existingbelongs-toedges before adding the new one, enforcing single-campaign assignment - DRY violation: extracted shared
statusVariant()andformatAge()intosrc/tui/view-helpers.ts; removed duplicate definitions from dashboard-view, submissions-view, and render-status - Triage loop performance: hoisted
WarpIntakeAdapterimport and instantiation outside the per-quest loop inwizards.ts - Quest terminology: replaced user-facing "task(s)" with "quest(s)" in backlog and deps view headers
- Array guard: guarded
lines[lines.length - 1]access in landing-view against empty arrays (strict TS) - Quit confirm overlay hidden: pressing
qfrom landing or help screen now clears those views before showing the confirm overlay - Non-domain terminology: renamed internal
my-issuespanel key tomy-questsfor Digital Guild consistency - Lint violation: fixed
Array<T>annotation toT[]in integration test
New bijou components adopted (TUI dashboard):
separator()— section dividers replace styled-header patterns across dashboardbadge()— status tags with visual weight in Pending Review, My Submissions, submission detailtimeline()— Recent Activity feed with status-colored event markersenumeratedList()— numbered Top Blockers liststepper()— submission lifecycle visualization (Submitted → Reviewed → Approved → Merged/Closed)
New data surfaced in dashboard:
- Top Blockers — calls existing
computeTopBlockers(), shown as numbered list (gated by deps) - Critical Path — calls existing
computeCriticalPath(), compact stat line (gated by deps) - Blocked Quests — surfaces
computeFrontier().blockedBywith waits-on detail (gated by deps) - Submission Age — relative age in submission detail panel
Replaced all legacy cli-table3 and boxen usage in the CLI status views with
bijou equivalents. Zero remaining imports of either package in src/.
- 11
cli-table3tables → bijoutable() - 6
boxensnapshot headers → bijouheaderBox() - Section headers →
separator() - Status tags →
badge()withstatusVariant()helper - Manual numbered lists →
enumeratedList()in deps view
- Command palette (
DashboardApp.ts)::or/opens a fuzzy-searchablecommandPalette()in amodal()overlay with context-aware actions per view (claim, promote, reject, expand, approve, request-changes). - Interactive wizards (
src/cli/commands/wizards.ts):quest-wizard,review-wizard,promote-wizard, andtriageCLI commands using bijoufilter(),select(),input(),textarea(), andconfirm()primitives. - Integration test suite (
integration.test.ts): 22 deterministic "drive" pattern tests for the full init → update → view cycle without async settling. - Drawer detail panel (
roadmap-view.ts): Quest detail now renders as a bijoudrawer()+composite()overlay; DAG takes full width when no quest is selected.
All three selectable views now use NavigableTableState for focus management
with circular j/k navigation and built-in scroll tracking.
- Backlog view: Already migrated (first wave). Uses
navigableTable()renderer. - Submissions view: Migrated from manual
selectedIndex+listScrollYtoNavigableTableState. List panel now usesnavigableTable()renderer. - Roadmap view: Migrated from manual
selectedIndextoNavigableTableStatefor focus tracking. Frontier panel rendering unchanged (custom grouped layout). RoadmapState.selectedIndex→RoadmapState.table: NavigableTableStateSubmissionsState.selectedIndex/listScrollY→SubmissionsState.table- Added
rebuildRoadmapTable()andrebuildSubmissionsTable()table builders. selectDelta()usesnavTableFocusNext/navTableFocusPrev(wrapping).buildPaletteItems()checkstable.rows.length > 0instead ofselectedIndex >= 0.- Lineage view retains manual selection (different interaction model with collapsible intents).
Upgraded @flyingrobots/bijou and @flyingrobots/bijou-tui from 0.6.0 to 0.10.0.
Replaced hand-rolled TUI primitives with bijou builtins where strictly better.
- Overlays (
overlays.ts): RewroteconfirmOverlay()andinputOverlay()to use bijoucomposite()+modal()— ANSI-safe cell-by-cell painting replaces manual line-splicing with box-drawing characters (~60 lines deleted). - Status bar (
DashboardApp.ts): ReplacedrenderStatusLine()with bijoustatusBar()(~20 lines deleted). - Toast notifications (
DashboardApp.ts): Toast is now a propercomposite()overlay anchored bottom-right instead of being embedded in the status bar. - Help system (
DashboardApp.ts): DeletedrenderHelp()andviewHints(), replaced by auto-generatedhelpView()/helpShort()from keymaps — help text always stays in sync with actual bindings. All keymap builders refactored to use.group()(~50 lines deleted). - Landing view (
landing-view.ts): Manual spiral + box compositing replaced by bijoucanvas()+spiralShader+composite()+modal()(~70 lines deleted). - Spiral shader (
spiral.ts): Extracted per-cellspiralShader: ShaderFnexport for use with bijoucanvas(), alongside the originalspiralFrame().
- Spiral shader (
src/tui/bijou/shaders/spiral.ts): Ported ertdfgcvb's "Spiral" ASCII shader — generates an animated full-screen character background driven byDate.now(), using the density ramp.·:;░▒▓█. - Solid content box: Logo, copyright, and status text render inside a
centered
┌─┐│ │└─┘bordered panel with 3-char horizontal / 1-line vertical padding. The spiral fills all space outside the box. - Full-width progress bar: Loading bar pinned to the absolute bottom row, stretching the full terminal width.
- Event loop yields (
GraphContext.ts): AddedsetImmediateyields between the 5 heaviestfetchSnapshot()pipeline stages (syncCoverage, materialize, checkpoint, queries, neighbor resolution) so animation frames fire between CPU-heavy steps instead of freezing for the entire load. - Backlog:
task:worker-thread-loading— offloadfetchSnapshotto aworker_threadsWorker for true zero-hitch loading (future).
computeTopBlockers()inDepAnalysis.ts: BFS-based analysis that ranks non-DONE tasks by transitive downstream impact (how many other tasks they block).depsCLI view: New "Top Blockers" table showing direct and transitive dependent counts per blocking task.- Roadmap TUI view: New "Top Blockers" section in the left panel between frontier and blocked lists.
- CLAUDE.md: Updated test count (60+ → 900+), added missing
reopencommand to reference. - README.md: Fixed TUI view cycle names (overview/inbox → dashboard/backlog),
added missing
reopencommand to CLI table, removed duplicate entry.
postinstallscript: Addedpatch-packagepostinstall hook topackage.json.- Roadmap audit: Identified and sealed 17 quests that were DONE but still marked PLANNED/IN_PROGRESS in the graph (WVR-001–005, BJU-004–008, DSH-005, DSH-007, BX-021, SUB-TUI-001, SUB-TUI-002, SUB-REFACTOR-001, inkstatus-type-safety).
- Closed 2 stale submissions: submission:0mm4fvum740cf37 (BJU-001) and submission:0mm4nm0oa510ca6 (BJU-002) — referenced commits already on main, branches diverged past patchset snapshots.
- Bijou v0.6.0 upgrade:
@flyingrobots/bijou,bijou-tui,bijou-nodeall upgraded from v0.5.1. New:navigableTable(),browsableList(),createInputStack(),helpView(),wizard(),filter(),dagStats(). No breaking changes. - GRAPH_SCHEMA.md rewritten (v1.0 → v2.0.0): All 21 prefixes, 16 edge types, 10 node property contracts, edge traversal diagram, LWW rules.
- DATA_CONTRACTS.md retired: M1-era speculation superseded by GRAPH_SCHEMA.md Section 4.
- AGENT_CHARTER.md: Added DRAFT status header (unimplemented 6-agent role architecture).
- Version fixes: README (alpha.8 → alpha.11), CLAUDE.md (git-warp v12.0.0 → v12.1.0), EXECUTIVE_SUMMARY.md (339 → 500 tests), ROADMAP.md (inbox count 33 → ~100).
- README.md: Updated TUI file tree (Ink → bijou architecture).
- ROADMAP.md: Moved Weaver to DONE, added M12 Agent Protocol milestone, updated CLI Tooling scope.
- New docs:
CLI-plan.md(interactive wizards, missing commands, agent protocol),docs/XYPH_Workflows.md(practical guide to all XYPH features). - New backlog items: 20 tasks filed across CLI wizards, missing commands, agent protocol, TUI enhancements, and doc rewrites.
- H-1: Shared selection ordering — Extracted
roadmapQuestIds,submissionIds,backlogQuestIds,lineageIntentIdsintoselection-order.ts. Both DashboardApp (j/k navigation) and view renderers import from the same module, preventing wrong-item-selected bugs from ordering divergence. - M-1: dagScrollY asymmetry — Vertical DAG scroll offset now applies as an offset from auto-center, matching the existing dagScrollX behavior.
- M-2: GRAVEYARD progress exclusion — Dashboard progress bar and orphan alert exclude GRAVEYARD quests (previously inflated denominator).
- M-3: filterSnapshot submissions —
filterSnapshot()now filters submissions for graveyard quests alongside scrolls and sortedTaskIds. - M-4: "Assigned Issues" rename — Dashboard right column header changed from "My Issues" to "Assigned Issues" for clarity.
- M-7: normalizeQuestStatus hardened — All known statuses now have explicit
switch cases;
defaultbranch is truly unreachable for valid input. - M-8: Write debounce — Added
writePendingflag to prevent double-writes while a graph mutation is in flight. Confirm/input handlers set the flag; write-success/error clear it; write actions short-circuit when true. - L-1/L-4: GRAVEYARD in roadmap — Added skull icon for GRAVEYARD status; excluded GRAVEYARD quests from selectable IDs in both deps and no-deps paths.
- L-3: OCP comment — Clarified that claim verification reads local state only.
- L-4: rejectQuest guard — Empty-rationale check added, matching promoteQuest.
- L-5: Clamp on reload — Per-view
selectedIndexis clamped when a new snapshot arrives, preventing stale indices after quest deletion. - L-6: Critical path phantom guard —
computeCriticalPathinner loop skips dependents not in the weight map, preventing NaN propagation from phantom edges. - L-8/N-7: Exhaustive defaults —
handleViewActionandviewRendererswitch statements now havedefault: neverguards for compile-time exhaustiveness.
- Upgraded
@flyingrobots/bijou,@flyingrobots/bijou-node, and@flyingrobots/bijou-tuito v0.5.1. Resolves dual-package context issue wherebijou-tuibundled a nested bijou v0.4.0 copy, causing[bijou] No default context configuredcrash at dashboard startup.
WarpRoadmapAdapter.getQuests()now usesgraph.query().match('task:*')instead of walking every node viagetNodes()+ per-nodegetNodeProps(). Reduces work from O(total_nodes) to O(task_nodes).- Upgraded
@flyingrobots/bijouto v0.5.0. - Roadmap DAG rendering now uses a
SlicedDagSourceadapter backed by the existingquestMapinstead of building an intermediateDagNode[]array. Graph data is read lazily via the source interface — no duplication.
- Removed manual
topoSort()(Kahn's algorithm) fromDepAnalysis.ts— git-warp already providesgraph.traverse.topologicalSort()with the same semantics. GraphContext.fetchSnapshot()now computessortedTaskIdsvia the engine (dir: 'in',labelFilter: 'depends-on') and includes it inGraphSnapshot.roadmap-view.tsreadssnap.sortedTaskIdsinstead of calling a manual sort.filterSnapshot()filterssortedTaskIdswhen excluding GRAVEYARD quests.- Removed 4
topoSortunit tests (coverage now lives in git-warp's own test suite).
- Roadmap frontier selection ordering now matches visual render order (frontier items first, then blocked, both sorted).
- Backlog write targets aligned with suggester-grouped render order, preventing wrong-target promote/reject operations.
- Toast dismissal uses tokenized
expiresAtto prevent stale timers from clearing newer toasts. promoteQuestvalidates intentId is non-empty before calling IntakePort.- Overlay dialog hint lines pad plain text before ANSI styling to fix visual width miscalculation.
- Landing progress bar width clamped to terminal width for narrow screens.
- Consolidated duplicate "### Removed" CHANGELOG sections.
- Extracted shared
normalizeQuestStatusandSUBMISSION_STATUS_ORDERconstants to domain entities, eliminating duplication across adapters. - Dashboard pending-review lookup optimized from O(n) find to Map.
INBOX→BACKLOG(suggestion pool),BACKLOG→PLANNED(vetted work).- Read-time normalization in
GraphContext(normalizeQuestStatus) ensures legacy graph data maps transparently — no graph migration needed. inbox-view.ts→backlog-view.ts; all references, tests, keybindings, and tab labels updated.IntakeServiceand adapters updated:sendToInbox()now writesBACKLOG;promote()transitionsBACKLOG → PLANNED.Questentity and status types reflect new vocabulary.- Theme presets:
INBOXtokens replaced withBACKLOG.
dashboard-view.ts: Full replacement foroverview-view.tsas the default landing view.- Project progress bar via bijou
progressBar()— DONE / non-backlog ratio. - Alert bar: warns on orphan quests (no intent) and forked patchsets.
- "In Progress" and "Pending Review" panels with top items.
- Campaign progress: per-campaign
progressBar()with done/total counts. - "Assigned Issues" panel (assigned, non-terminal quests).
- Health section: sovereignty audit ratio, orphan count, fork count.
- Graph meta section: max tick, writer count, tip SHA.
- Two-column flex layout (2:1 ratio).
- Intent descriptions surfaced from graph (
descriptionproperty on intent nodes, read inGraphContext). progressBar()completion stats per intent (DONE / total authorized quests).- Indented quest trees under each intent with status styling.
- Roadmap view upgraded to bijou
dagLayout()withviewport({ scrollX }). - Auto-centers on selected node when selection changes.
h/lkeybindings for horizontal DAG scrolling.
overview-view.ts— replaced bydashboard-view.ts.inbox-view.ts— replaced bybacklog-view.ts.all-view.ts— replaced byoverview-view.ts.
Review actions in submissions view:
a(approve) andx(request-changes) keybindings in submissions view.- Input mode prompts for review comment before dispatching.
- Validates tip patchset exists — shows error toast if missing.
reviewSubmission()write command factory with auto-generated review IDs.SubmissionPortwired intoWriteDepsandDashboardDeps.
Roadmap detail panel:
- Third flex column (28 cols) appears when a quest is selected.
- Shows: quest ID, title, status, hours, owner, campaign title, intent, dependency count with status icons, submission status, and scroll info.
- Hidden when no quest is selected — DAG takes full width.
DAG selected node highlighting:
- Selected quest node in DAG uses
primarytheme token, overriding the critical-path warning color for visual distinction.
Tests:
- 8 new tests: review keybindings (
a/xenter input mode), error toast on missing tip patchset, review input flow, detail panel content/deps/ submission status, hidden detail panel.
New views:
overview-view.ts: Summary dashboard with quest status counts, submission status counts, health metrics (sovereignty audit, orphan quests, forked patchsets), campaign list, and graph meta — replaces the raw-tableall-view.submissions-view.ts: Master-detail layout (35/65 flex split). Left panel shows submissions sorted by status priority (OPEN first); right panel shows expanded detail with patchset chain, reviews, and decisions.
Selection and navigation:
- Per-view state:
roadmap.selectedIndex,submissions.selectedIndex,inbox.selectedIndexwith j/k (or arrow keys) for navigation. - Roadmap frontier panel highlights selected quest with
▶indicator. - Inbox table highlights selected item with
▶indicator. - Submissions list highlights selected entry; Enter toggles detail expansion.
- View-specific hint bar shows available keybindings per view.
Write operations:
write-cmds.ts: Cmd factories forclaimQuest(OCP via direct graph patch),promoteQuest(IntakePort),rejectQuest(IntakePort).- Confirm mode:
con roadmap → confirm dialog (y/n) → claim quest → toast. - Input mode:
pon inbox → text input for intent ID → promote quest → toast.don inbox → text input for rationale → reject quest → toast. overlays.ts: Centered confirm dialog and text input overlays rendered over view content.- Toast notifications in status line (success=green, error=red, auto-dismiss 3s).
Architecture:
DashboardModelexpanded: per-view state objects, interaction modes (normal/confirm/input),PendingWriteaction type, toast state.DashboardMsgexpanded:write-success,write-error,dismiss-toast.DashboardDepsexpanded:graphPort: GraphPortfor direct graph patches.- Tab order: roadmap → submissions → lineage → overview → inbox (5 views).
- View-specific keymaps via separate
KeyMapinstances per view.
Tests:
- 57 new tests across
DashboardApp.test.tsandviews.test.ts: 5-view cycling, per-view state init, selection (j/k), confirm mode, input mode, toast lifecycle, submission expand/collapse, overview metrics, submissions detail rendering.
- Ported 4 dashboard views from stub placeholders to full rendering logic
using bijou
headerBox(),table(), andtree()components. roadmap-view.ts: quests grouped by campaign withtable().inbox-view.ts: INBOX quests grouped bysuggestedBywith per-suggestertable().all-view.ts: conditional sections (campaigns, intents, quests, scrolls, approvals) each withtable().lineage-view.ts: intent→quest→scroll hierarchy usingtree()with scroll marks (sealed/unsealed) and orphan quest detection.
- 20 new view tests in
views.test.tscovering null/empty/populated snapshots, orphan quests, scroll marks, truncated rejection rationale. - CI
strict-policyjob: grep-based gate rejectingeslint-disable,@ts-ignore,@ts-expect-error, and@ts-nocheckin all source files. - ESLint
noInlineConfig: true— inline lint bypass comments are now a hard error.
lineage-view.ts: orphan quests now shown even when no intents exist (previously hidden by early return).all-view.ts: node total now includes submissions, reviews, and decisions.
1.0.0-alpha.10 - 2026-02-26
Framework: Ink/React → bijou-tui TEA architecture
- Replaced the Ink/React
Dashboard.tsxcomponent tree with a pure-function TEA (The Elm Architecture) app powered by@flyingrobots/bijou-tui'srun(). - New
DashboardApp.ts:init()/update()/view()with immutableDashboardModel, typedDashboardMsgunion, andCmd<DashboardMsg>effects. - Keybindings via bijou-tui's
createKeyMap()—q,Tab,Shift+Tab,r,?. - Layout via
flex()(column direction) withtabs()tab bar from@flyingrobots/bijou.
Theme: local token system → bijou theme bridge
- Replaced
tokens.ts,presets.ts,resolve.ts,chalk-adapter.ts,gradient.ts, andink-adapter.tsxwith bijou's theme system. - New
xyph-presets.ts: extends bijou'sCYAN_MAGENTAandTEAL_ORANGE_PINKwith 15 XYPH status keys +intentHeaderUI key viaextendTheme(). - New
bridge.ts: lazy-init singleton that configures bijou's global context with XYPH presets, env-var theme selection (XYPH_THEME), and NO_COLOR support. theme/index.tsbarrel: init-guardedstyled()/styledStatus()wrappers that callensureXyphContext()before delegating to bijou.
Views: stub views for BJU-002 migration
- Five new bijou view functions (
roadmap-view.ts,lineage-view.ts,all-view.ts,inbox-view.ts,landing-view.ts) with summary stats and placeholder text for full rendering in BJU-002.
@flyingrobots/bijou^0.2.0,@flyingrobots/bijou-node^0.1.0,@flyingrobots/bijou-tui^0.1.0 as dependencies.- git-warp API reference section in CLAUDE.md.
- 17 old Ink/React files:
Dashboard.tsx,GraphProvider.tsx,HelpModal.tsx,QuestDetailPanel.tsx,Scrollbar.tsx,StatusLine.tsx, and all 5 view components (AllNodesView.tsx,InboxView.tsx,LandingView.tsx,LineageView.tsx,RoadmapView.tsx), plus 6 local theme modules. chalkFromToken()— replaced by bijou'sstyled().
- High: Ctrl+C was swallowed in landing (while loading) and help modes — hoisted Ctrl+C handler above mode-specific branches so it always quits.
- High:
qdid nothing in help mode despite help text listing it as quit — addedq→ quit handling in help mode to match displayed shortcuts. - High: Lint violations (
explicit-function-return-typeonmakeApp(),no-non-null-assertiononresolver!) — added return type annotation and replaced!with explicit guard + throw. - Medium:
initializedflag set beforecreateBijou()/createThemeResolver()completed — moved flag after success to prevent permanently broken state on init failure. - Medium: Refresh race condition — added monotonic
requestIdto model and snapshot messages; stale responses from superseded fetches are now discarded. - Medium:
styled()/styledStatus()re-exported without init safety — replaced raw re-exports with wrappers that callensureXyphContext()before delegating. - Medium:
_resetBridgeForTesting()did not reset bijou's global default context — now calls_resetDefaultContextForTesting()for full test isolation. - Low: Dead code removed —
dismiss-landingmessage type/handler, unreachabledismissaction, unusedwordmarkTextfield threaded through model and deps. - Low: Landing "Press any key" prompt shown during loading (when keys are ignored) — prompt now only appears after data loads or on error.
1.0.0-alpha.9 - 2026-02-25
Architecture: one WarpGraph instance per process
- Introduced
GraphPort(port) andWarpGraphAdapter(infrastructure) — a process-wide singleton for the sharedWarpGraphinstance. All adapters receive it via dependency injection instead of creating their ownWarpGraphHolder. - Rewired
WarpSubmissionAdapter,WarpIntakeAdapter,WarpRoadmapAdapter,coordinator-daemon,xyph-actuator, andxyph-dashboardto useGraphPortDI. - Eliminated WRITER_CAS_CONFLICT errors caused by multiple
WarpGraphHolderinstances sharing the samewriterId.
Architecture: kill the adapter-walks-every-node anti-pattern
- Replaced monolithic
WarpDashboardAdapter(542 LoC) +DashboardService(113 LoC) withGraphContext— a single shared gateway usinggraph.query()for typed node fetching andgraph.traversefor graph algorithms. - New
GraphProvider.tsx(React context) delivers theGraphContextto TUI components. - Extracted
DepAnalysis.ts— pure domain functions for frontier detection and critical-path DP, replacing the algorithmic parts ofWeaverService.
Performance: atomic graph.patch() for all writes
- Converted all adapters and
xyph-actuator.tsfrom manualsyncCoverage() + materialize() + createPatchSession() + commit()tograph.patch(p => { ... }). - Eliminated redundant
materialize()andsyncCoverage()calls —autoMaterialize: truemakes writes immediately visible to reads on the same instance. - Submission lifecycle integration test: 15s timeout → default 5s, actual runtime ~1.2s.
GraphContextcache invalidation: replacedhasFrontierChanged()(only detects external patches) with frontier key comparison that catches both in-processgraph.patch()writes and external mutations fromsyncCoverage().
WarpGraphHolder— replaced byWarpGraphAdapter.WarpDashboardAdapter,DashboardService,DashboardPort— replaced byGraphContext.WeaverService,WeaverPort,WarpWeaverAdapter— replaced byDepAnalysis+ directgraph.traversecalls.WarpDashboardAdapter.test.ts,DashboardService.test.ts,WeaverService.test.ts,WarpWeaverAdapter.test.ts— tests migrated toDepAnalysis.test.tsand existing integration suites.
Code review — 7 issues resolved (1 critical, 2 high, 2 medium, 2 low)
- Critical:
invalidateCache()no longer callsgraphPort.reset()— previous behavior orphaned the shared graph and violated the singleton invariant. Now only clearsGraphContext's own cached snapshot and frontier key. - High: Removed inconsistent
syncCoverage()call from thedependcommand — no other write command calls it post-refactor. - High: Inlined dead
getGraph()wrapper inxyph-actuator.ts— all ~7 call sites now usegraphPort.getGraph()directly; removed unusedWarpGraphtype import. - Medium: Reduced
getStateSnapshot()calls infetchSnapshot()from 3 to 2 — early call for cache check, post-materialize call for graphMeta and cached frontier key. - Medium:
batchNeighbors()now usesPromise.allinstead ofPromise.allSettled— neighbor resolution errors surface immediately instead of being silently swallowed. - Low: Batched separate
graph.patch()seed calls into single patches inWarpIntakeAdapter.test.tsandWarpSubmissionAdapter.test.ts. - Low: Fixed JSDoc in
GraphPort.ts— replaced reference to private_onPatchCommittedwith public description.
1.0.0-alpha.8 - 2026-02-25
Milestone 7: Weaver — Task Dependency Graph
depend <from> <to>CLI command: declaresdepends-onedges betweentask:nodes with cycle detection, self-dependency prevention, and existence validation.status --view deps: new dashboard view showing frontier (ready tasks), blocked tasks, topological execution order, and critical path with total hours.WeaverService(domain): pure validation and computation — frontier detection, topological ordering (via git-warp v12LogicalTraversal), critical path DP over dependency DAG.WeaverPort(port): write interface for dependency edge persistence.WarpWeaverAdapter(infrastructure): implements bothWeaverPortandWeaverReadModelusing git-warp v12'sgraph.traverse.isReachable(),graph.traverse.topologicalSort(), andgraph.getEdges().QuestNode.dependsOnfield in dashboard model;WarpDashboardAdapterreadsdepends-onedges during snapshot construction.renderDeps()renderer: frontier table, blocked-tasks table, numbered execution order, and critical path chain display.- CI workflow (
.github/workflows/ci.yml): enforces build, lint, and test gates on every PR and push to main as three parallel jobs. - CI
auditjob: runsnpm audit --omit=devto catch known vulnerabilities in production dependencies. - 31 new tests (23 unit + 8 integration), 369 total.
inspect-graph.ts: replaced unsafe inline type cast withtoNeighborEntries()runtime guard.
1.0.0-alpha.7 - 2026-02-24
TUI Overhaul: Fullscreen, Flicker-Free Rendering & Responsive Layout
Alternate screen + flicker-free rendering shim
xyph-dashboard.tsx: enters alternate screen buffer (\x1b[?1049h) on launch, restores on exit.- Patches
stdout.writeto replace Ink'sclearTerminal(erase + rewrite) with cursor-home + erase-to-EOL, eliminating full-screen flash on every render. - Proper cleanup on SIGINT/SIGTERM — always restores the original terminal.
git-warp verbose logging in the gutter
TuiLogger(src/tui/TuiLogger.ts): newLoggerPortimplementation that captures git-warp internal logs via a callback for display in the TUI.WarpGraphHolderandWarpDashboardAdapteraccept optionalLoggerPort, passed toWarpGraph.open().- Dashboard subscribes to logger with 150ms throttle to prevent rapid re-renders.
Persistent gutter on all screens
StatusLinenow renders on every screen (landing, loading, error, main views) — no more early returns that skip it.- Dashboard restructured: root
<Box height={rows}>wrapper withflexGrow={1}content area and pinned gutter. LandingViewusesflexGrow={1}+justifyContent="center"for vertical centering within the flex container.
Status line simplified
- Replaced
tick: 142 (8a062e1) | me: 122 | writers: 5witht=142— one number, the global frontier tick. - Dropped per-writer tick and writer count (implementation details, not user-facing).
- Gutter log line prefixed with
[warp(t=N)]showing the current graph tick when available.
Cold start performance
- Removed
syncCoverage()from first-load path —WarpGraph.open()discovers refs automatically. - Restored
syncCoverage()on refresh path — discovers external mutations committed since last materialize. - Added
createCheckpoint()aftermaterialize()— persists materialized state so subsequent launches load from checkpoint instead of replaying all patches. tipShanow derived fromcreateCheckpoint()return value (content hash of materialized state) instead of writer tip commit.
Responsive full-width table layout
- All four views (
RoadmapView,LineageView,AllNodesView,InboxView) now calculate column widths dynamically from terminal width. - Title columns absorb remaining width instead of using hardcoded
.padEnd()values. - Tables fill edge-to-edge on any terminal size (min 12 chars for title).
- Ghost content on title screen: erase-to-end-of-line (
\x1b[K) injected after each line during cursor-home redraws, preventing remnants from longer previous renders. - Full terminal height: root Box in Dashboard and LandingView now properly fills terminal via
height={rows}/flexGrow={1}.
Code review — 15 issues resolved (4 HIGH, 6 MEDIUM, 5 LOW)
- High:
TuiLogger.child()now delegatesonEntrythrough parent chain — children created beforeonEntryis set no longer get a permanentnullcallback. - High:
HelpModalrenders as the content area (replacing views) instead of appended belowStatusLine— no longer overflowsheight={rows}. - High:
WarpDashboardAdaptercallssyncCoverage()on refresh path (whencachedSnapshot !== null) to discover external mutations; skipped on first load whereWarpGraph.open()handles discovery. - High:
xyph-dashboard.tsxcleanup guard prevents double terminal-restore on SIGINT → exit handler chain. - Medium:
StatusLinealways renders 2 lines (empty second line when no logLine) — stabilizesgutterLinesconstant. - Medium: Log prefix changed from unstable
[warp(SHA)]to[warp(t=N)]using graph tick. - Medium:
LineageViewtrailing spaces (+4) added tolineageFixedW; status text padded to fixed 14 chars. - Medium:
AllNodesViewmagic10extracted toscrollSealWconstant with comment. - Medium:
package.jsonversion bumped to1.0.0-alpha.7. - Low:
TuiLogger.emit()nested ternary refactored to explicit if/else. - Low:
InboxViewsuggestedByusessuggestedByW - 2instead of hardcoded14. - Low:
AllNodesViewquestSuffixWcomponents documented with inline comments. - Low:
LineageViewintentIdWreverted from 32 to 30 (matches original behavior). - Low:
Dashboard.tsxcolsmoved inside else branch where it's actually used.
Codex review — 2 issues resolved (1 P1, 1 P2)
- P1:
WarpDashboardAdaptersyncCoverage()on refresh path — already addressed in H-3 above. - P2:
xyph-dashboard.tsxSIGINT/SIGTERM handlers now use conventional signal exit codes (130/143) instead ofexit(0), so shell wrappers and supervisors can distinguish cancel/kill from success.
CodeRabbit review — 6 issues resolved (1 major, 3 minor, 2 nit)
- Major:
WarpDashboardAdapter.createCheckpoint()wrapped in try/catch — checkpoint failures no longer block snapshot rendering; falls back totipSha='unknown'. - Minor:
CHANGELOG.mdunused[Unreleased]link reference resolved by adding## [Unreleased]section header (MD053). - Minor:
AllNodesViewsealedBycolumn now truncated before padding to prevent line wraps on long values. - Minor:
LandingViewlayout — full test suite (npm run build+npm run test:local) verified: 338/338 pass, lint clean. - Nit:
StatusLineexportsSTATUS_LINE_HEIGHTconstant;Dashboard.tsximports it instead of hardcodinggutterLines = 2. - Nit:
TuiLogger.onEntrysetter throws on child loggers — prevents silent misconfiguration sinceresolveOnEntry()always defers to root.
1.0.0-alpha.6 - 2026-02-22
Dashboard Performance & UX Improvements
Performance — parallel graph snapshot loading
WarpDashboardAdapter.fetchSnapshot(): batch-fetch all node props viaPromise.allinstead of sequential awaits (142 nodes).- Pre-fetch all outgoing
neighbors()calls in a single parallel batch, eliminating sequential I/O across 4 passes. buildSubmissionData()converted from async to synchronous — uses pre-fetched neighbors cache instead of live graph queries.
Loading UI — activity log on landing screen
DashboardPort.fetchSnapshot()now accepts optionalonProgresscallback for phase-level progress reporting.LandingViewdisplays a live activity log (last 10 lines) during graph loading, replacing the static "Loading…" message.
Copywriting — brand consistency
- "WARP GRAPH STATUS" → "XYPH GRAPH STATUS" on the landing screen.
- "Loading WARP graph snapshot…" → "Loading project graph snapshot…".
Tab cycling — defensive key guards
- Added explicit
returnafterkey.tabhandler inDashboard.tsxto prevent fall-through. - All 4 view components (
RoadmapView,LineageView,AllNodesView,InboxView) now explicitly ignorekey.tabat the top of theiruseInputhandlers, ensuring Tab keypresses are cleanly handled only by Dashboard's view-switching logic.
Code review — 31 issues resolved across 3 rounds
- High: Removed
getTheme/styledTUI imports from domain-layerTriageServiceandSovereigntyService— domain services now use plainconsole.log/console.warn(hexagonal architecture fix). - High: Changed
'Opening WARP graph…'→'Opening project graph…'inWarpDashboardAdapterprogress log (brand consistency). - High:
WarpDashboardAdapterbatch prop fetch changed fromPromise.all→Promise.allSettledfor partial-failure resilience. - High:
WarpDashboardAdapterbatch neighbor fetch changed fromPromise.all→Promise.allSettled(mirrors props pattern). - Medium: Added missing space after comma in 91
styled()calls inxyph-actuator.ts. - Medium: Removed redundant
syncCoverage()+materialize()fromWarpGraphHolder.initGraph(). - Medium:
TriageService.linkIntent()log moved after null guard to avoid misleading entries. - Medium: StatusLine prefix
/// WARP→/// XYPH; remaining WARP branding in STYLE_GUIDE updated. - Low:
ThemeProvidernow usesuseMemofor stable context value (prevents unnecessary re-renders). - Low: Exhaustive
nevercheck added tochalkFromTokenTextModifierswitch. - Low: NaN guard added to
gradient.tsfor duplicate stop positions. - Low:
WarpDashboardAdapterusesNeighborEntrytype instead of inline shape. - Low:
result.reasonsafely stringified in batch warning logs. - Low: Test hygiene —
warnSpywrapped intry/finally, hardcoded hex replaced with token lookup,vi.unstubAllEnvs()for env restoration,satisfiesassertion on status keys, status keys derived from theme. - Low:
Dashboard.tsxnow clearsloadLogstate when snapshot loads. - Low: Replaced inline token construction in
coordinator-daemon.ts. - Low: Re-indented
scripts/bar-demo.ts(project convention). - Low: CHANGELOG structure — merged
[Unreleased]into[1.0.0-alpha.6], added comparison link.
Theme Token System — Full Visual Layer Migration
Theme module (src/tui/theme/)
- New
tokens.ts:RGB,GradientStop,TextModifier,TokenValue,InkColor,StatusKey,Themetype definitions. All colors stored as#RRGGBBhex strings for deterministic cross-terminal rendering. - New
presets.ts:CYAN_MAGENTAtheme (matches all prior hardcoded values exactly) andTEAL_ORANGE_PINKtheme (new candidate palette from gradient experiment). Helpertv()for concise token definition. - New
gradient.ts:lerp3()N-stop linear interpolation extracted fromscripts/bar-demo.ts. - New
resolve.ts:isNoColor()(per no-color.org spec),getTheme()singleton withXYPH_THEMEenv var selection,resolveTheme()for React context,_resetThemeForTesting(). - New
chalk-adapter.ts:chalkFromToken(),styled(),styledStatus()— chalk from theme tokens with NO_COLOR support (hex skipped, modifiers preserved). - New
ink-adapter.tsx:ThemeProviderReact context component,useTheme()hook with singleton fallback for incremental migration. - New
index.ts: barrel re-exports. - Theme selection via
XYPH_THEMEenv var (e.g.,XYPH_THEME=teal-orange-pink). - NO_COLOR respected:
ink()returnsundefined→ Ink renders default terminal color;chalkFromToken()skips.hex()→ only modifiers apply.
Tests — 44 new tests (338 total, up from 249)
gradient.test.ts— 9 tests: boundary values, mid-stop interpolation, single-stop and empty-stop edge cases.presets.test.ts— 13 tests: all status keys defined in both presets, hex format validation, gradient stop ordering.resolve.test.ts— 11 tests: theme selection, NO_COLOR detection, singleton caching, unknown theme fallback with warning.chalk-adapter.test.ts— 11 tests: styled output, status rendering, modifier application, NO_COLOR mode.
TUI components — color literals → theme tokens (10 files)
Scrollbar.tsx:cyan/gray→ui.scrollThumb/scrollTrack.HelpModal.tsx:cyanborder →border.primary,yellowheadings →semantic.warning.QuestDetailPanel.tsx: droppedSTATUS_COLORimport, usesinkStatus()and semantic tokens.Dashboard.tsx:cyan/graytabs →ui.cursor/semantic.muted,yellow/redstates → semantic tokens.LandingView.tsx:greenprogress →semantic.success,cyanlogo →ui.logo,yellowmilestone →semantic.warning.RoadmapView.tsx:cyancursor →ui.cursor,bluecampaign headers →ui.sectionHeader, status lookups viainkStatus().LineageView.tsx:magentaintent headers →ui.intentHeader,cyancursor →ui.cursor.AllNodesView.tsx:greensection headers →semantic.success,cyancursor →ui.cursor.InboxView.tsx:magentaheaders →ui.intentHeader,cyan/yellow/redmodal borders →border.*.xyph-dashboard.tsx: wraps<Dashboard>in<ThemeProvider>.
CLI consumers — chalk → theme tokens (6 files)
xyph-actuator.ts: all 91chalk.*calls replaced withstyled(getTheme().theme.semantic.*, ...).render-status.ts: eliminated both localSTATUS_COLORmaps; allchalk.*calls →styled()/styledStatus().coordinator-daemon.ts: 10chalk.*calls →styled().inspect-graph.ts: 7chalk.*calls →styled().TriageService.ts:chalk.cyan→styled(semantic.info, ...)— also fixes hexagonal architecture violation (domain layer no longer imports chalk directly).SovereigntyService.ts:chalk.yellow→styled(semantic.warning, ...)— same hexagonal fix.
Gradient integration
scripts/bar-demo.ts: importslerp3fromsrc/tui/theme/gradient.jsand gradient presets fromsrc/tui/theme/presets.js; removed local duplicate definitions.
src/tui/status-colors.ts— replaced bytheme.status.*tokens. Both the TUIStatusColormap and the CLISTATUS_COLORfunction map are now unified in the theme presets.
Backlog Reconciliation & Roadmap Triage
- New
intent:CLI-FOUNDATION— sovereign intent for CLI tooling (identity, packaging, time-travel, ergonomics). - New
campaign:CLITOOL(Milestone 10: CLI Tooling) — 20 quests promoted from inbox.
- VISION_NORTH_STAR.md upgraded from v1.1.0 to v1.2.0: added history-first computing, stigmergic workflows, Git-as-settlement layering, expanded planning compiler and end state sections.
- Deleted
VISION_NORTH_STAR_v1.2_draft.md(promoted to authoritative). - README milestones table: Milestone 6 (SUBMISSION) marked DONE, Milestone 10 (CLI TOOLING) added.
- Full inbox triage: 31 items processed — 1 rejected (SUB-ENTITY-001, fixed in PR #10), 20 promoted to
campaign:CLITOOL, 10 promoted tocampaign:DASHBOARD.
Milestone 6: Native WARP Graph Submission & Review Workflow
Submission lifecycle (SUB-001)
- New graph node types:
submission:,patchset:,review:prefixes added to schema. - New edge types:
submits,has-patchset,supersedes,reviews,decides. SubmissionandPatchsetdomain entities with constructor validation (src/domain/entities/Submission.ts).- Three pure computed functions:
computeTipPatchset()(head selection from supersedes chain, fork detection),computeEffectiveVerdicts()(latest-per-reviewer, comment exclusion),computeStatus()(5-state derivation: OPEN → CHANGES_REQUESTED → APPROVED → MERGED | CLOSED). SubmissionServicedomain validation service withvalidateSubmit,validateRevise,validateReview,validateMerge,validateClose. Error codes:[FORBIDDEN],[INVALID_FROM],[NOT_FOUND],[MISSING_ARG],[CONFLICT],[AMBIGUOUS_TIP].
Ports & adapters (SUB-002)
SubmissionPortinterface:submit(),revise(),review(),decide()— graph-only persistence, caller-generated IDs.WorkspacePortinterface:getWorkspaceRef(),getCommitsSince(),getHeadCommit(),isMerged(),merge()— VCS abstraction (Git today, JIT tomorrow).WarpSubmissionAdapter: implements bothSubmissionPort(write) andSubmissionReadModel(read) against the WARP graph.GitWorkspaceAdapter: implementsWorkspacePortusing local git plumbing.
CLI commands (SUB-003)
xyph submit <quest-id> --description "..."— creates submission + first patchset, auto-fills workspace/head/commits from git.xyph revise <submission-id> --description "..."— adds new patchset superseding current tip.xyph review <patchset-id> --verdict approve|request-changes|comment --comment "..."— posts a review.xyph merge <submission-id> --rationale "..."— validates APPROVED status, performs git settlement, creates merge decision, auto-seals quest (scroll + GuildSeal + DONE).xyph close <submission-id> --rationale "..."— creates close decision without merging.
Dashboard (SUB-004)
SubmissionNode,ReviewNode,DecisionNodeview models added todashboard.ts.QuestNodegains optionalsubmissionIdfield.WarpDashboardAdapterclassifies submission/patchset/review/decision nodes and computes status using domain functions.- New
renderSubmissions()renderer; wired as--view submissions. - Submission status colors: OPEN (cyan), CHANGES_REQUESTED (yellow), APPROVED (green), MERGED (green), CLOSED (dim).
Integration safeguards (SUB-005)
sealcommand now warns if a non-terminal submission exists for the quest, suggestingmergeinstead.sealandmergeare independent paths to quest DONE — both remain valid.
Submission workflow jank fixes (6 items)
WarpSubmissionAdapter: replaced O(n) full-graph scans withgraph.neighbors(nodeId, 'incoming', edgeLabel)edge traversal ingetOpenSubmissionsForQuest,getPatchsetRefs,getReviewsForPatchset,getDecisionsForSubmission.WarpDashboardAdapter: extracted 170-line fourth pass (submission/review/decision assembly) into privatebuildSubmissionData()helper, reducingfetchSnapshot()from ~390 to ~240 lines.GitWorkspaceAdapter.merge(): saves current branch before checkout, restores infinallyblock to avoid silently switching the user's working branch.generateId(): zero-padded base36 timestamp to 9 chars (17-char fixed-length IDs), now lexicographically sortable by creation time.PatchsetRef.supersedesrenamed tosupersedesIdacross all files for clarity.- Added comments documenting the
decision:prefix collision guard (shared between old concept/decision nodes and new submission decisions;type === 'decision'discriminator already handles it).
Tests — 63 new tests (249 total)
test/unit/Submission.test.ts— 29 tests: entity constructors,computeTipPatchset(linear chain, forked heads, tie-breaking),computeEffectiveVerdicts(latest-per-reviewer, comment exclusion),computeStatus(all 5 rules, custom thresholds).test/unit/SubmissionService.test.ts— 24 tests: all validate* methods with error code coverage.test/integration/WarpSubmissionAdapter.test.ts— 6 tests: submit, revise, review, decide(close), full lifecycle (submit → request-changes → revise → approve → merge), getOpenSubmissionsForQuest terminal exclusion.
1.0.0-alpha.5 - 2026-02-20
Milestone 5: WARP Dashboard TUI Overhaul
Landing Screen (TUI-001)
- New
LandingViewcomponent displayed on startup before the main dashboard. - Shows a randomly selected compact ASCII logo (logos 2, 3, 7, 8, 9, 10 — ≤15 lines each).
- Stats panel: ASCII progress bar (
█░per-quest completion), current active milestone, next 3 BACKLOG/PLANNED quests. - Footer: copyright + GitHub link. Hint:
any key to continue · q to quit. xyph-dashboard.tsxreads logo file at launch viareadFileSync; falls back to'XYPH'on error.
Help Modal (TUI-002)
- New
HelpModalcomponent: full-screen cyan border overlay accessible from any view via?. - Contains XYPH glossary (Quest, Intent, Campaign, Scroll, Seal, Guild, WARP) and complete key bindings table.
- Closes on
Escor?.
Quest Detail Panel (TUI-003)
- New reusable
QuestDetailPanelcomponent showing full quest metadata: ID, title, status (colored), hours, agent, campaign (with title lookup), intent (with title lookup), scroll ✓, completedAt, suggestedBy/At, rejection history, reopen history. - Used by RoadmapView and AllNodesView detail modals.
RoadmapView: Fold/Unfold + Detail Modal (TUI-004)
- Unified
selectedVIdxnavigates both campaign headers and quest rows with↑↓. Spaceon a campaign header folds/unfolds that milestone; header shows▶(folded) or▼(expanded).Spaceon a quest opens a full-screenQuestDetailPanelmodal;Esccloses it.
AllNodesView: Quest Selection + Detail Modal (TUI-006)
↑↓now navigates through quest rows only (other node types are display-only).Spaceon a selected quest opens a full-screenQuestDetailPanelmodal;Esccloses it.- Status indicator text updated to include quest position and
Space: quest detailhint.
InboxView: Gmail-Style Rework (TUI-007)
- Replaced fixed
DETAIL_LINES = 10constant with proportional 40%/60% split: 40% list, 60% detail. - List rows enriched:
▶indicator, ID, title, suggestedBy, date,↩reopened marker. - Detail pane always visible (no toggle needed); shows full inbox lifecycle fields.
Logo Loader + XYPH Wordmark (TUI-008)
- New
src/tui/logo-loader.tsutility module:selectLogoSize()picks small/medium/large based on terminal dimensions;loadRandomLogo()reads.txtfiles from the reorganizedlogos/{family}/{size}/directory structure, trims leading and trailing blank lines, and falls back to plain'XYPH'on error. - Dimension-aware logo selection: logos are filtered by actual width/height against terminal constraints before random pick. If nothing in the preferred size fits, cascades down (large → medium → small) automatically.
- XYPH wordmark rendered in the upper-right corner of the dashboard header (dimmed). Hidden on narrow terminals (< 50 cols).
- All four views (
RoadmapView,LineageView,AllNodesView,InboxView) accept an optionalchromeLinesprop computed from actual header height, replacing the hardcodedCHROME_LINES = 4constant.
LineageView: INBOX Bug Fix + Selection (TUI-005)
- INBOX quests no longer appear in the orphan ("sovereignty violation") list — they haven't been promoted yet and genuinely lack an intent.
- Added
selectedVIdxstate with▶indicator highlighting the selected quest row.
TUI layout stability (TUI-009)
- Landing page logo centered as a single block instead of per-line centering — multi-width ASCII art lines no longer scatter horizontally.
- Dashboard header uses
alignItems="flex-start"and splits tab labels / hint text onto separate rows — wordmark position is now stable across all views. - LineageView intent-header, scroll-sub, and orphan rows now truncate long text to prevent terminal line wrapping that pushed the header off-screen.
- Quest detail modal (RoadmapView, AllNodesView) renders inside a fixed-height wrapper matching the normal list height — opening/closing the modal no longer causes layout shifts.
Lint compliance — 28 errors resolved
- Replaced
Array<T>withT[]syntax across 5 files (dashboard.ts, CoordinatorService.ts, GuildSealService.ts, WarpRoadmapAdapter.ts, RoadmapPort.ts). - Converted
OrchestrationFSMfrom static-only class to exported const object with standalone functions (no-extraneous-class). - Removed
as anycasts: ed25519hashes.sha512polyfill now uses typed API directly;loadKeyringuses properRecord<string, unknown>narrowing instead ofas any; ajv-formats/ajv-errors use typed CJS interop pattern. - Replaced non-null assertions (
!) with proper guards invalidatePatchOps.tsarray access andcrypto.tscanonicalize. - Added missing return types on 4 functions (crypto.ts
sha512, signPatchFixture.tssha512/generateTestKeypair, validatePatchOps.ts CLI IIFE). - Removed redundant type annotation (
no-inferrable-types) in RebalanceService constructor. - Removed stale
eslint-disable no-consoledirective from validatePatchOps.ts. - Added "own every failure" policy to CLAUDE.md — agents must fix broken things they encounter, never dismiss errors as pre-existing.
Code review — 5 CodeRabbit findings resolved
- Bug:
OrchestrationFSM.transitionToNormalizeeventIdnow uses injectedcontext.clock(now) instead ofnew Date(), fixing non-deterministic date fragments under frozen-time test scenarios. - Nit: minimatch override tightened from
>=10.2.1to^10.2.1— prevents accidental major version jumps. - Nit:
AjvPlugintype widened to accept optional options arg and returnAjvinstance (matches actual ajv-formats/ajv-errors Plugin signature). - Nit:
sha512polyfill exported fromcrypto.tsand imported insignPatchFixture.ts— eliminates copy-paste duplication and redundantcreateHashimport. - Nit:
computeDigestparameter narrowed fromRecord<string, unknown>toRecord<string, Json>— removes unsafeas Jsoncast, surfacing type constraint at call site.
README aligned with canonical documentation
- Replaced "Causal Operating System for Agentic Orchestration" tagline with "The Planning Compiler for Agentic Coordination" per VISION_NORTH_STAR.md.
- Rewrote "How XYPH Works (Part I)" — removed informal GitHub comparison, added the Planning Compiler paradigm (Source → IR → Target) and Agentic Coordination Problem framing. Added LWW conflict resolution mention.
- Added "How XYPH Works (Part II)" sections: Digital Guild Model (Quests, Campaigns, Intents, Scrolls, Guild Seals, Genealogy of Intent), Planning Pipeline (Mermaid state diagram with fail-closed/ROLLED_BACK paths), and Policy Engine (MUST/SHOULD/COULD three-tier table).
- Constitution section expanded from 2 articles to all 4: Law of Determinism (Art. I), Law of DAG Integrity (Art. II), Law of Provenance (Art. III), Law of Human Sovereignty (Art. IV).
- Canonical Docs listing expanded from 5 to all 21 documents, organized into 6 categories (Vision & Governance, Architecture & Pipeline, Data & Schema, Security & Audit, Quality & Policy, RFCs).
README rewritten with progressive-disclosure walkthrough
- Replaced flat "Core Concepts / For Humans / For Agents" structure with a narrative walkthrough: Ada (human) and Hal (agent) build a feature together, introducing domain vocabulary (Intent, Quest, Campaign, Scroll, Guild Seal, OCP, Genealogy of Intent) inline on first use.
- Dashboard keybindings and CLI commands moved to compact reference tables after the walkthrough.
- Expanded Constitution section with links to all canonical specifications.
CLAUDE.mdupdated: replaced stale "Current Status" with actuator-based planning workflow and full command reference.
Added CONTRIBUTING.md
- Development workflow, quality gates, Constitution summary, and full command reference table.
minimatch ReDoS vulnerability (CVE: GHSA-3ppc-4f35-3m26)
- Added npm
overridesto force all transitiveminimatchinstances to^10.2.1, patching a Regular Expression Denial of Service (ReDoS) vulnerability where patterns with many consecutive*wildcards cause exponential backtracking (O(4^N)). - All six affected instances (via eslint, eslint-plugin-import, @eslint/config-array, @eslint/eslintrc, @typescript-eslint/typescript-estree, glob) now resolve to
minimatch@10.2.2.
ajv ReDoS vulnerability (GHSA-2g4f-4pwh-qvx6)
- Bumped transitive
ajv(via@eslint/eslintrc,eslint) to patched versions vianpm audit fix.
Dependency upgrade
- Upgraded
@git-stunts/git-warpfrom11.3.3to11.5.0.
Code Review — 68 issues resolved (CR-001)
- Critical:
IngestServicerewritten —task:prefix guard,new Quest()in try/catch (skips invalid lines), clean formatting. - Critical:
package-lock.jsonsynced toalpha.4. - High: Eliminated actuator TOCTOU —
promote/reject/reopennow callWarpIntakeAdapterdirectly instead of dual-graph validate-then-write. - High: Added
reopen()toIntakePort+WarpIntakeAdapter; all intake methods now return commit SHA. - High:
syncCoverage() + materialize()added at top ofWarpIntakeAdapterandWarpDashboardAdapteroperations. - High: Cached
graphPromisecleared on rejection in both WARP adapters. - High: ESLint + lint script now covers
.tsxfiles. - High:
AllNodesViewquest detail modal now uses correctflatQuestsarray (was indexing intosnapshot.quests). - High:
Dashboard.tsxrefreshwrapped inuseCallback— removedeslint-disablecomment. - High:
RoadmapViewnavigableIndicesmoved intouseEffectbody with proper deps — removedeslint-disable. - High:
xyph-dashboard.tsxlogo index fallback?? 3. - Medium:
Quest.toProps()method;CoordinatorServicePhase 3 uses it instead of...qspread. - Medium:
RebalanceServiceis now a required constructor param (no hidden default). - Medium:
WarpDashboardAdapterskips scrolls with emptyquestId; cachesgetNodePropsacross passes. - Medium:
InboxView— modal state capturesquestIdat open time;detailHeightclamped; empty-inbox guard onp/x; arrow keys guarded in rationale modal; error state stored as parsed code+message. - Medium: Shared
status-colors.tsmodule — all views import from one source (includes INBOX). - Medium: Typed
QuestNode.statusasQuestStatus, addedCampaignStatusandApprovalGateStatustypes. - Medium:
graveyard-ghosts.mtsskipspatch.commit()when no mutations. - Low/Nit:
??instead of||for env reads; positive agentId regex;asciiBarfill clamped;ScrollbarthumbStart clamped; PageUp/PageDown in all scrollable views; trailing newlines on logo files; docs fixes (CHANGELOG formatting, README spacing, RFC milestone/author, model name). - Tests:
getOutgoingEdgesadded to mocks; service construction inbeforeEach; test names corrected; mock extraction type-narrowed; ordering dependency documented.
Wave 8 — Final review fixes (CR-005)
- Critical: Dashboard graph cache invalidation —
WarpDashboardAdapter.invalidateCache()clears cached graph viaWarpGraphHolder.reset(), called on every refresh so intake mutations (promote/reject) are visible immediately. AddedinvalidateCache?()toDashboardPort. - Major:
GuildSealService.generateKeypair()now usesloadKeyring()for validation parity withverify(), eliminating divergent schema checks. Orphaned.skfile rollback on keyring write failure prevents permanently broken state.verify()now catchesloadKeyring()errors gracefully (returnsfalseinstead of throwing). - Major:
LandingViewprogress bar now excludes GRAVEYARD quests (was only excluding INBOX), consistent with milestone detection logic. - Major: ESLint test block now references
tsconfig.test.json(wastsconfig.jsonwhich doesn't includetest/**). - Minor:
WarpIntakeAdaptervalidatestask:prefix onquestIdin all three methods (promote/reject/reopen).WarpRoadmapAdapter.getOutgoingEdges()now callssyncCoverage()/materialize()before reading edges. InboxView status bar clarifies only promote requireshuman.*. StaticrandomBytesimport inGuildSealService. - Fix: Restored
ajv,ajv-formats,ajv-errorstopackage.json— incorrectly removed in CR-003 (L-03/L-04) but still required byvalidatePatchOps.ts. CIverify-patch-opsnow passes. - Doc: Updated
CLAUDE-XYPH-PAUSE.md— DSH-004 marked resolved; DSH-001 remains sole pre-merge blocker. CHANGELOG version header updated to1.0.0-alpha.5.
Wave 7 — Continued review fixes (CR-004)
- Medium: Extracted shared
WarpGraphHolderhelper — eliminated triplicatedgetGraph()/initGraph()boilerplate across Dashboard, Intake, and Roadmap adapters (M-25). - Low: Added runtime
isNeighborEntry/toNeighborEntriestype guard — replaced unsafeas NeighborEntry[]casts in all adapters with validated filtering (L-20). 10 new unit tests. - Nit:
QuestDetailPanelno longer receives fullGraphSnapshot— callers pre-resolve campaign/intent titles (N-16). - Low: Added 2-line scroll margin to
moveSelectionin all 4 scrollable views — selection no longer sits at the very edge of the visible area (L-30). - Documented design decisions: campaign-aware rebalancing deferred to Milestone 6 (M-13);
isHumanPrincipalconvention-based, not security boundary (M-19);isActiveinput-focus architecture documented (M-26); view remount on tab switch acknowledged as Ink limitation (M-27);campaign:TRIAGE→ graveyardedroadmap:ROOTedge documented (L-08); agent-onlyrequestedByper Constitution Art. IV.2 (L-14); instant resolution intentionally allowed (L-15);trustDirCWD dependency documented in JSDoc (L-18); private key memory handling is a JS limitation (L-19);upsertQuestcan't unset properties, needs tombstone convention (L-24); hint text location clarified (N-21). N-02, N-03, N-04 were already addressed in CR-002. - All 113 code review issues resolved;
CODE-REVIEW-ISSUES.mdtracking file removed. 186 tests passing.
Wave 6 — 26 additional issues resolved (CR-003)
- High: Documented order-independent integration test design (H-10); each test now uses dedicated seed nodes.
- Medium: Removed
chalkfrom domain-layerCoordinatorService(M-12); validatedtask:prefix onquestCLI command (M-43); verified first quest upserted in partial-failure test (M-39); added modal staleness guard inInboxView(M-34); nearest-neighbor selection fallback inLineageView(M-36). - Low: ESLint now covers root-level entry points (L-02); removed dead dependencies
ts-node,ajv,ajv-errors,ajv-formats(L-03, L-04); explicit type narrowing ingraveyard-ghosts.mts(L-06); documented asymmetric heartbeat behavior (L-11); graceful daemon shutdown with 500ms drain (L-12);filterSnapshotnow removes scrolls referencing GRAVEYARD quests (L-17); documented zero-hour quests as intentional (L-16); negative hours clamped to 0 inWarpRoadmapAdapter(L-25);promote()verifies intentId/campaignId exist before creating edges (L-22); error state bypasses landing screen (L-27). - Nit: Documented
--campaign "none"escape hatch (N-24); clarifiednoUncheckedIndexedAccessguard comment (N-26). - 176 tests passing (was 172 pre-review).
NIT Remediation — 27 items resolved (CR-002)
- Config: Removed redundant
@typescript-eslint/eslint-pluginand@typescript-eslint/parserdevDependencies (bundled bytypescript-eslintv8+). Removed 8 redundant strict sub-options fromtsconfig.json(implied by"strict": true). - Type safety:
ApprovalNode.triggertyped asApprovalGateTrigger(wasstring);STATUS_COLORtyped asRecord<string, StatusColor>— removed allas StatusColorcasts.WarpDashboardAdapternow validates trigger values. - GuildSealService: Renamed
canonicalPayload→serializePayload; replacedscroll as unknown as Jsondouble-cast with explicit field mapping. - render-status.ts: Merged dual scroll maps into single iteration; fixed orphan tree connectors (
├─/└─). - TUI views: Spacer row keys use absolute index; removed redundant scroll-clamping
useEffectin all 4 views;LandingViewnextUp refactored to.slice(1).map(); fixed campaign selection removing empty-campaign false positive;InboxViewagentId truncated in error;onMutationEnd()called beforesetModal(null). - Entry points: Removed dead truthiness check on required
--campaign; renamed__filename/__dirnametocurrentFilePath/currentDir; addednoUncheckedIndexedAccesscomment on logo fallback. - Docs: CHANGELOG comparison links; README Milestone 6 cross-reference and Omega footnote; RFC_001
milestone:→campaign:taxonomy fix and Section 8 clarification; removed model attribution from pause notes. - Tests: Mock
addEdgereturnsPromise<string>;DashboardServicetest uses direct snapshot access instead of mock internals; added ApprovalGate boundary tests (instantaneous resolution, negative createdAt); removed duplicate IntakeService test.
1.0.0-alpha.4 - 2026-02-17
Full Orchestration Pipeline (PL-001)
- Integrated
TriageServiceandRebalanceServiceinto theCoordinatorServiceheartbeat and orchestration flow. - The
orchestratemethod now accepts an optionalcontextHash(BLAKE3) to link mutations back to their originating human intent. - Every quest produced in a batch now passes through the
RebalanceServicefor campaign-level resource constraint checking (160h limit).
Structured Ingestion (PL-002)
- Refactored
IngestServiceto defer entity validation to theNormalizeServicephase. - Replaced "Silent Failure" (regex
continueon invalid fields) with a permissive factory that allows the validation layer to provide structured error feedback. - Bypassed
Questconstructor validation during raw ingestion usingObject.create(Quest.prototype)to allow the full pipeline to report all violations at once.
Verification (PL-003)
- Added
test/unit/CoordinatorService.POWERLEVEL.test.ts: A high-fidelity test suite covering the Golden Path (Intent Linking), failure modes (Rebalance/Validation), and stress scenarios (Swarm orchestration).
1.0.0-alpha.3 - 2026-02-17
Intent node type & actuator command (SOV-001)
intent:prefix added to schemaPREFIXES.authorized-byedge type added to schemaEDGE_TYPES.- New
Intentdomain entity: enforcesintent:ID prefix, title ≥ 5 chars, andrequestedBymust start withhuman.(agents cannot be sovereign roots — Constitution Art. IV). xyph-actuator intent <id> --title "..." --requested-by human.<name>command declares a human-signed sovereign Intent node in the graph.xyph-actuator questgains optional--intent <id>flag to create anauthorized-byedge linking a Quest to its Intent root.
Constitutional enforcement — Genealogy of Intent (SOV-002)
RoadmapPortgainsgetOutgoingEdges(nodeId), implemented inWarpRoadmapAdapterviagraph.neighbors(id, 'outgoing').- New
SovereigntyService:checkQuestAncestry(questId)validates the presence of anauthorized-byedge to anintent:node;auditBacklog()scans all BACKLOG quests and returns violations. xyph-actuator questnow hard-rejects if--intentis absent (Constitution Art. IV — Genealogy of Intent). Exit 1 with a constitutional violation message.- New
xyph-actuator audit-sovereigntycommand: scans all BACKLOG quests and reports violations with remediation hint.
Approval gate node type (SOV-003)
approval:prefix added to schemaPREFIXES.approvesedge type added to schemaEDGE_TYPES.- New
ApprovalGateentity: enforcesapproval:ID prefix,requestedBymust be an agent (agent.),approvermust be a human (human.),resolvedAt ≥ createdAtwhen present, trigger must beCRITICAL_PATH_CHANGEorSCOPE_INCREASE_GT_5PCT(Constitution Art. IV.2).
Guild Seal cryptographic signing on scrolls (SOV-004)
- New
GuildSealService: Ed25519 keypair generation, detached signing, and verification of Scroll payloads. - Canonical payload:
{ artifactHash, questId, rationale, sealedBy, sealedAt }hashed with blake3. - Private keys stored in
trust/<agentId>.sk(gitignored, mode 0600); public keys registered intrust/keyring.json. xyph-actuator sealnow attachesguild_seal_alg,guild_seal_key_id,guild_seal_sig,sealed_by,sealed_at, andpayload_digestto every Scroll node. Warns (non-fatal) if no private key found.- New
xyph-actuator generate-keycommand generates and registers a keypair for the active agent. - Keypair generated and registered for
agent.james(did:key:agent.james).
Other
trust/*.skadded to.gitignore.- Declared
intent:SOVEREIGNTYas the root Intent for the entire project. - 30 new unit tests (Intent, SovereigntyService, ApprovalGate, GuildSealService). Total: 101 passing.
xyph-actuator questnow requires--intent <id>. Any quest creation without a sovereign Intent root is rejected with exit code 1.
1.0.0-alpha.2 - 2026-02-15
- Renamed
Taskentity toQuestwithQuestStatus,QuestType,QuestProps(Digital Guild terminology). Questconstructor now enforces invariants:task:prefix, title >= 5 chars, finite non-negative hours.RoadmapPortmethods renamed:getTasks→getQuests,getTask→getQuest,upsertTask→upsertQuest.RoadmapPort.addEdgenow usesEdgeTypeunion instead of barestring.- Added
tsconfig.test.jsonfor test-file type-checking. declarations.d.ts:executeStreamreturn type now matchesgit-warp's expectedStreamResultinterface.
- Merged duplicate
### Addedsections in CHANGELOG. - Dockerfile: non-root user,
--no-install-recommends, accurate CMD comment. - ESLint: added
ignoresfordist/**build artifacts. - Quoted lint glob in
package.jsonto prevent shell expansion. declarations.d.ts: fixed invalidstaticin interface, replacedanywithunknown.coordinator-daemon.ts: validatedINTERVAL_MS, added graceful shutdown (SIGINT/SIGTERM), circuit breaker on repeated failures.IngestService: removed unusedTaskStatusimport, derived checkbox status from regex capture group instead ofline.includes('[x]').NormalizeService:normalize()returns array directly instead of no-op.map().CoordinatorService: dependency injection via constructor, per-task error handling with result accumulation, properTaskimport instead of inlineimport()type.WarpRoadmapAdapter: extractedbuildTaskFromPropswith safe runtime type checks, fixed falsy checks onclaimedAt/completedAttimestamps.inspect-graph.ts: changedforEachcallback to block body to avoid implicit return.schema.ts: validate before casting invalidateNodeIdandvalidateEdgeType.xyph-actuator.ts: centralizedcreatePatchhelper, normalized default agent ID constant, added--hoursvalidation viaInvalidArgumentError.- Tests:
beforeEachmock reset to prevent state leaks,vi.mocked()instead of brittle double-cast, addedisClaimed()tests, expandedNormalizeServicetest coverage, renamed misleading test description.
1.0.0-alpha.1 - 2026-02-15
- Rebalance Service: Implemented
RebalanceServiceto enforce the 160-hour limit per campaign (Phase 4). - CodeRabbit Integration: Added
.coderabbit.yamlto enable AI code reviews on all branches, facilitating stacked PR workflows. - Triage Service: Introduced
TriageServicefor backlog auditing and linking tasks to human intent (origin_context). - Task Entity Expansion: Formalized
originContextproperty in the domain model and persistence layer. - Orchestration FSM: Integrated
IngestandNormalizeservices intoCoordinatorServiceto provide a full pipeline from raw input to graph mutation. - Canonical Corpus: Initialized
docs/canonical/with 15 foundational specifications (Constitution, Agent Charter, Orchestration Spec, etc.). - XYPH Actuator: Implemented
xyph-actuator.mjsfor Quest management (Initialize, Claim, Seal) using thegit-warpNode.js API. - Graph Schema: Formalized node/edge taxonomy and runtime validators in
src/schema.js. - Roadmap Bootstrap: Initialized
xyph-roadmapwith Milestone 1 (BEDROCK) tasks. - Squadron Integration: Formalized Digital Guild principles within the agentic workflow.
- Infrastructure Patch: Applied
@mapbox/node-pre-gyppatch to resolveDEP0169warnings in modern Node.js. - Inspection Tooling: Created
src/inspect-graph.jsfor deep graph state analysis.
- TS Execution Refinement: Switched from
ts-nodetotsxfor CLI execution to resolveDEP0180(fs.Stats) deprecation warnings in Node 22+. - Setup Script Improvements: Enhanced
scripts/setup-milestone-2.jswith idempotency checks and robust error propagation (non-zero exit codes). - Actuator Refinement: Added ESM shebang to
xyph-actuator.tsfor direct execution. - Normalize Service: Implemented
NormalizeServicefor task enrichment and constitutional validation (Phase 2). - Ingest Service: Implemented
IngestServicefor parsing Markdown-based task definitions into domain entities (Phase 1 of Orchestration Pipeline). - TypeScript Migration: Full project conversion to strict TypeScript with zero
anytolerance. - Hexagonal Architecture: Established clean boundaries with
RoadmapPortandWarpRoadmapAdapter. - Coordinator Daemon: Initial implementation of the
CoordinatorServiceand heartbeat loop. - Dockerized Testing: Integrated Vitest with a
node:22-slimDocker environment for isolated verification. - Strict Linting: Configured ESLint with
typescript-eslintstrict rules. - Refined Actuator
syncWithlogic to usesyncCoverage()for reliable multi-writer convergence.