FE-1575: Resume one Brunch workpiece and Petrinaut document across tabs - #9537
FE-1575: Resume one Brunch workpiece and Petrinaut document across tabs#9537lunelson wants to merge 29 commits into
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
PR SummaryMedium Risk Overview Workpiece and agent plumbing moves runbook-IR selection and hashing into shared AI SDK / Flue transport gains deterministic Local-storage demo adds preparation via tagged Flue dispatch, a settled manifest that advances only when workpiece, completed settlement, correlated successful Reviewed by Cursor Bugbot for commit 1e5315f. Bugbot is set up for automated code reviews on this repo. Configure here. |
There was a problem hiding this comment.
🟡 Changes recommended
One critical settlement revision bug and three moderate correctness/configuration issues remain unresolved.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
Adds a prepared Brunch/Petrinaut fixture that preserves its canonical conversation, Markdown workpiece, document mutation, and settled state across browser tabs.
Changes:
- Adds fixture-scoped workpiece recovery, Petrinaut tools, and idempotent Flue transport.
- Persists coherent document snapshots and settled manifests for cross-tab recovery.
- Adds focused tests, documentation, changesets, and browser evidence.
File summaries
| File | Description |
|---|---|
yarn.lock |
Records the hashing dependency. |
libs/@hashintel/petrinaut/src/ui/views/Editor/panels/ai-assistant-panel/apply-petrinaut-ai-mutation.ts |
Handles mutation outcomes and no-ops. |
libs/@hashintel/petrinaut/src/ui/views/Editor/panels/ai-assistant-panel/apply-petrinaut-ai-mutation.test.ts |
Tests mutation outcomes. |
libs/@hashintel/petrinaut/src/ui/views/Editor/panels/ai-assistant-panel.tsx |
Uses the extracted mutation helper. |
libs/@hashintel/petrinaut/docs/ai-assistant.md |
Documents prepared fixtures and settlement. |
libs/@hashintel/petrinaut-core/src/ai.ts |
Normalizes provider arc weights. |
libs/@hashintel/petrinaut-core/src/ai.test.ts |
Tests weight normalization. |
libs/@hashintel/brunch-agent/packages/transport-aisdk/test/ui-stream.test.ts |
Tests streamed input mapping. |
libs/@hashintel/brunch-agent/packages/transport-aisdk/test/client-tool-history.test.ts |
Tests call/result history extraction. |
libs/@hashintel/brunch-agent/packages/transport-aisdk/test/chat-transport.test.ts |
Tests deterministic admission keys. |
libs/@hashintel/brunch-agent/packages/transport-aisdk/src/ui-stream.ts |
Maps streamed client-tool inputs. |
libs/@hashintel/brunch-agent/packages/transport-aisdk/src/transcript.ts |
Maps hydrated client-tool inputs. |
libs/@hashintel/brunch-agent/packages/transport-aisdk/src/index.ts |
Exports history APIs and adds idempotency. |
libs/@hashintel/brunch-agent/packages/transport-aisdk/src/client-tool-history.ts |
Extracts canonical client-tool history. |
libs/@hashintel/brunch-agent/packages/plugin-sdcpn/test/construction-tools.test.ts |
Tests fixture tool restrictions. |
libs/@hashintel/brunch-agent/packages/plugin-sdcpn/src/tools/petrinaut-construction.ts |
Defines fixture construction tools and normalization. |
libs/@hashintel/brunch-agent/packages/plugin-sdcpn/src/flue.ts |
Mounts fixture-specific instructions and tools. |
libs/@hashintel/brunch-agent/packages/core/vite.config.ts |
Builds the workpiece subpath. |
libs/@hashintel/brunch-agent/packages/core/test/workpiece.test.ts |
Tests workpiece delivery and selection. |
libs/@hashintel/brunch-agent/packages/core/src/workpiece.ts |
Implements canonical workpiece recovery. |
libs/@hashintel/brunch-agent/packages/core/package.json |
Exports the workpiece API. |
libs/@hashintel/brunch-agent/docs/mission-drafts/9-traceable-projection.md |
Updates Mission 9 prerequisites. |
libs/@hashintel/brunch-agent/docs/mission-drafts/7-capture-backed-review.md |
Updates Mission 7 prerequisites. |
libs/@hashintel/brunch-agent/docs/evidence/implementations/fe-1575-resumable-workpiece-petrinaut.md |
Records implementation evidence. |
libs/@hashintel/brunch-agent/docs/evidence/implementations/fe-1575-outer-browser-witness-2026-09-04/witness.md |
Records the superseded witness. |
libs/@hashintel/brunch-agent/docs/evidence/implementations/fe-1575-outer-browser-witness-2026-09-04/tab-b-correlation.json |
Records resumed-tab correlation. |
libs/@hashintel/brunch-agent/docs/evidence/implementations/fe-1575-outer-browser-witness-2026-09-04/SHA256SUMS |
Protects witness integrity. |
libs/@hashintel/brunch-agent/docs/evidence/implementations/fe-1575-outer-browser-witness-2026-09-04/settled-manifest-tab-b.json |
Captures resumed settled state. |
libs/@hashintel/brunch-agent/docs/evidence/implementations/fe-1575-outer-browser-witness-2026-09-04/settled-manifest-before.json |
Captures initial settled state. |
libs/@hashintel/brunch-agent/docs/evidence/implementations/fe-1575-outer-browser-witness-2026-09-04/settled-manifest-after.json |
Captures mutated settled state. |
libs/@hashintel/brunch-agent/docs/evidence/implementations/fe-1575-outer-browser-witness-2026-09-04/route-evidence.json |
Records mounted-route evidence. |
libs/@hashintel/brunch-agent/docs/evidence/implementations/fe-1575-outer-browser-witness-2026-09-04/prepared-workpiece.md |
Retains prepared revision zero. |
libs/@hashintel/brunch-agent/docs/evidence/implementations/fe-1575-outer-browser-witness-2026-09-04/latest-workpiece.md |
Retains the revised workpiece. |
libs/@hashintel/brunch-agent/docs/evidence/implementations/fe-1575-outer-browser-witness-2026-09-04/definition-tab-b.json |
Retains resumed document state. |
libs/@hashintel/brunch-agent/docs/evidence/implementations/fe-1575-outer-browser-witness-2026-09-04/definition-before.json |
Retains initial document state. |
libs/@hashintel/brunch-agent/docs/evidence/implementations/fe-1575-outer-browser-witness-2026-09-04/definition-after.json |
Retains mutated document state. |
libs/@hashintel/brunch-agent/docs/evidence/implementations/fe-1575-outer-browser-witness-2026-09-04/cold-reader-records.json |
Retains adjudication inputs. |
libs/@hashintel/brunch-agent/docs/evidence/implementations/fe-1575-outer-browser-witness-2026-09-04/cold-reader-gate.md |
Defines the human gate. |
libs/@hashintel/brunch-agent/docs/evidence/implementations/fe-1575-outer-browser-witness-2026-09-04/call-result-correlation.json |
Records original tool correlation. |
libs/@hashintel/brunch-agent/docs/evidence/implementations/fe-1575-outer-browser-witness-2026-09-04-r2/witness.md |
Records the corrected witness. |
libs/@hashintel/brunch-agent/docs/evidence/implementations/fe-1575-outer-browser-witness-2026-09-04-r2/tab-b-correlation.json |
Records corrected resumed-tab correlation. |
libs/@hashintel/brunch-agent/docs/evidence/implementations/fe-1575-outer-browser-witness-2026-09-04-r2/SHA256SUMS |
Protects corrected witness integrity. |
libs/@hashintel/brunch-agent/docs/evidence/implementations/fe-1575-outer-browser-witness-2026-09-04-r2/settled-manifest-tab-b.json |
Captures corrected resumed state. |
libs/@hashintel/brunch-agent/docs/evidence/implementations/fe-1575-outer-browser-witness-2026-09-04-r2/settled-manifest-before.json |
Captures corrected initial state. |
libs/@hashintel/brunch-agent/docs/evidence/implementations/fe-1575-outer-browser-witness-2026-09-04-r2/settled-manifest-after.json |
Captures corrected mutated state. |
libs/@hashintel/brunch-agent/docs/evidence/implementations/fe-1575-outer-browser-witness-2026-09-04-r2/run-metadata.json |
Records corrected run inputs. |
libs/@hashintel/brunch-agent/docs/evidence/implementations/fe-1575-outer-browser-witness-2026-09-04-r2/route-evidence.json |
Records corrected route evidence. |
libs/@hashintel/brunch-agent/docs/evidence/implementations/fe-1575-outer-browser-witness-2026-09-04-r2/prepared-workpiece.md |
Retains corrected prepared input. |
libs/@hashintel/brunch-agent/docs/evidence/implementations/fe-1575-outer-browser-witness-2026-09-04-r2/latest-workpiece.md |
Retains the model-produced revision. |
libs/@hashintel/brunch-agent/docs/evidence/implementations/fe-1575-outer-browser-witness-2026-09-04-r2/flue-snapshot-before.json |
Captures initial canonical history. |
libs/@hashintel/brunch-agent/docs/evidence/implementations/fe-1575-outer-browser-witness-2026-09-04-r2/definition-tab-b.json |
Retains corrected resumed document state. |
libs/@hashintel/brunch-agent/docs/evidence/implementations/fe-1575-outer-browser-witness-2026-09-04-r2/definition-before.json |
Retains corrected initial document state. |
libs/@hashintel/brunch-agent/docs/evidence/implementations/fe-1575-outer-browser-witness-2026-09-04-r2/definition-after.json |
Retains corrected mutated document state. |
libs/@hashintel/brunch-agent/docs/evidence/implementations/fe-1575-outer-browser-witness-2026-09-04-r2/cold-reader-records.json |
Retains corrected adjudication records. |
libs/@hashintel/brunch-agent/docs/evidence/implementations/fe-1575-outer-browser-witness-2026-09-04-r2/cold-reader-gate.md |
Defines corrected human review. |
libs/@hashintel/brunch-agent/docs/evidence/implementations/fe-1575-outer-browser-witness-2026-09-04-r2/call-result-correlation.json |
Records normalized tool correlation. |
apps/petrinaut-website/src/main/app/voice-interview/voice-preview.integration.test.ts |
Updates Voice idempotency expectations. |
apps/petrinaut-website/src/main/app/local-storage-demo/use-prepare-crew-reservation-conversation.ts |
Prepares the fixture conversation. |
apps/petrinaut-website/src/main/app/local-storage-demo/use-prepare-crew-reservation-conversation.test.ts |
Tests preparation failures. |
apps/petrinaut-website/src/main/app/local-storage-demo/use-local-storage-sdcpns.ts |
Stores coherent document snapshots. |
apps/petrinaut-website/src/main/app/local-storage-demo/use-flue-chat-history.ts |
Exposes canonical history snapshots. |
apps/petrinaut-website/src/main/app/local-storage-demo/use-flue-chat-history.test.ts |
Tests canonical history projection. |
apps/petrinaut-website/src/main/app/local-storage-demo/use-crew-reservation-settled-manifest.ts |
Maintains settled bundle state. |
apps/petrinaut-website/src/main/app/local-storage-demo/use-crew-reservation-settled-manifest.test.ts |
Tests refusal and persistence behavior. |
apps/petrinaut-website/src/main/app/local-storage-demo/use-crew-reservation-fixture-session.ts |
Coordinates fixture preparation and settlement. |
apps/petrinaut-website/src/main/app/local-storage-demo/resolve-crew-reservation-bundle.ts |
Resolves coherent workpiece/document revisions. |
apps/petrinaut-website/src/main/app/local-storage-demo/resolve-crew-reservation-bundle.test.ts |
Tests coherent bundle resolution. |
apps/petrinaut-website/src/main/app/local-storage-demo/prepared-fixture-banner.tsx |
Displays fixture and settlement status. |
apps/petrinaut-website/src/main/app/local-storage-demo/prepared-fixture-banner.test.tsx |
Tests fixture status rendering. |
apps/petrinaut-website/src/main/app/local-storage-demo/prepared-crew-reservation-fixture.ts |
Defines the prepared fixture. |
apps/petrinaut-website/src/main/app/local-storage-demo/prepared-crew-reservation-fixture.test.ts |
Tests fixture boundaries and structure. |
apps/petrinaut-website/src/main/app/local-storage-demo/prepare-crew-reservation-conversation.ts |
Creates or recovers revision zero. |
apps/petrinaut-website/src/main/app/local-storage-demo/prepare-crew-reservation-conversation.test.ts |
Tests idempotent preparation. |
apps/petrinaut-website/src/main/app/local-storage-demo/local-storage-demo-app.tsx |
Integrates the fixture into the browser demo. |
apps/petrinaut-website/src/main/app/local-storage-demo/crew-reservation-history.ts |
Defines fixture history state. |
apps/petrinaut-website/src/main/app/local-storage-demo/brunch-panel-transport.ts |
Adds fixture-scoped transport options. |
apps/petrinaut-website/src/main/app/local-storage-demo/brunch-panel-transport.test.ts |
Tests fixture transport behavior. |
apps/petrinaut-website/package.json |
Adds browser SHA-256 support. |
apps/brunch-agent/test/workpiece.test.ts |
Tests hashed workpiece recovery. |
apps/brunch-agent/test/runbook-artifacts.test.ts |
Uses shared workpiece APIs. |
apps/brunch-agent/test/prepared-workpiece.integration.ts |
Exercises the built fixture workflow. |
apps/brunch-agent/test/prepared-workpiece.integration.test.ts |
Verifies the integration script. |
apps/brunch-agent/test/architecture/boundaries.test.ts |
Registers the architecture suite. |
apps/brunch-agent/test/architecture/boundaries.integration.ts |
Updates package-boundary expectations. |
apps/brunch-agent/src/evaluations/runbook/headless-petrinaut-client.ts |
Accepts an initial Petrinaut definition. |
apps/brunch-agent/src/evaluations/runbook/artifacts.ts |
Reuses canonical workpiece recovery. |
apps/brunch-agent/src/evaluations/persona/proof-artifacts.ts |
Uses the relocated recovery helper. |
apps/brunch-agent/src/conversation/workpiece.ts |
Adds Flue-specific workpiece hashing. |
apps/brunch-agent/src/conversation/client-tools.ts |
Registers fixture client tools. |
.changeset/resumable-petrinaut-workpiece.md |
Declares Petrinaut patch releases. |
Review details
- Files reviewed: 102/109 changed files
- Comments generated: 4
- Review effort level: Balanced
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
ec85958 to
23e19e6
Compare
Add dispositions G1 to G22 to the decision log, revise the mini spec to its third state with the settled-revision protocol, typed basis, verifiable transition record, document reconciliation, readiness ownership, and probe decision tables, and retain the follow-up review as design evidence. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ared basis Rewrite the Mission 7 draft at cut-level detail as the consolidated construct-and-explain mission with a two-step authority, probe decision tables, and a conversion map; recut Mission 9 as repeatable projection breadth over the Mission 7 seam; re-express Missions 10 and 11 over settled revisions, declared basis, and transition records with three-gate readiness for the handoff; and record the provenance relations and tool admission locks plus a lossless planning-content migration matrix in MISSION.next.md. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Point the Deferred section at the 2026-09-04 provenance replanning, carry the fixture-authorship and fenced-block admissions into the close record, and note in Status that no other section of the live authority changed. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Record dispositions H0 to H12 in the decision log, fix revision identity to the tool call id, make the transition record and elicited evidence relation precise, replace every oracle gap in the Step A leaves with an exact prospective test, artifact, or adjudication, classify probe outcomes as eligible, rework, or terminal stop under the owner's no-narrowing rule, give the two-step authority a lawful document shape, and add the pre-cut owner checklist and the ask/sweep keep-remove-archive inventory. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…revision numbering The index route now owns the brunch-fixture search key beside the shared example contract, so a selection write no longer drops the prepared fixture mid-session. The fixture selector and fixture URL fall back to the ordinary demo while Brunch is unconfigured, the fixture's browser tool catalog keeps the always-mounted docs reader answerable, workpiece revisions are numbered by the history rather than by manifest count, and an unchanged-document mutation result no longer claims the requested state already existed.
275d1f3 to
bf5e46e
Compare
| const runbookIrFencePattern = /```runbook-ir\s*\n([\s\S]*?)```/gu; | ||
|
|
||
| export const latestRunbookIrBlock = (text: string): string | undefined => { | ||
| const matches = [...text.matchAll(runbookIrFencePattern)]; |
kostandinang
left a comment
There was a problem hiding this comment.
This proves a useful end-to-end fixture path while keeping conversation, workpiece, and document identities explicit.
One boundary question: libs/@hashintel/brunch-agent/packages/core/src/workpiece.ts is described as substrate-neutral, but createPreparedWorkpieceDelivery and the preparedWorkpieceSignal* constants encode the Flue signal/delivery envelope and are consumed from plugin-sdcpn/src/flue.ts. Our current package boundary keeps Flue-native production resources behind ./flue. Is this an intentional new precedent? Could the delivery-specific pieces move under ./flue or remain fixture-local, leaving ./workpiece responsible only for workpiece parsing and selection?
kostandinang
left a comment
There was a problem hiding this comment.
Following a deeper pass, I found two issues that block the cross-tab coherence claim:
-
crew-reservation-settled-manifest.tsincludes the observer'ssettledAtand conversation offset inmanifestId, whileuse-crew-reservation-settled-manifest.tspersists the snapshot and manifest separately without rejecting revision or offset regression. Two tabs can derive different identities for the same logical bundle, and a stale writer can replace a newer manifest. Please derive identity from canonical bundle data and make publication monotonic or atomic. -
In
local-storage-demo-app.tsx, settlement reads the synchronized stored document while Petrinaut continues rendering the existing active handle until an explicit load/create replaces it. A tab can therefore show stale canvas state beside another tab's newer settled bundle. Please reconcile the active handle or visibly refuse the stale tab.
These need resolving before approval because they undermine the PR's central two-tab coherence proof.
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 1e5315f. Configure here.
| resumableAssistant.parts.push(...parts); | ||
| // Live continuations start a new step. Keep that boundary after reopen | ||
| // so completedClientToolResults still selects only the latest step. | ||
| resumableAssistant.parts.push({ type: "step-start" }, ...parts); |
There was a problem hiding this comment.
Step-start strands pending client tools
High Severity
Inserting step-start when folding a waiting assistant reply while a client tool is still pending creates a trailing step with no tool. After reopen, lastAssistantMessageIsCompleteWithToolCalls only inspects that last step, so the completed browser result is never auto-submitted and the turn stalls.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit 1e5315f. Configure here.


🌟 What is the purpose of this PR?
Determine whether one canonical Brunch conversation can maintain a useful Markdown workpiece, make one meaningful change to the Petrinaut document open in the browser, and resume the same coherent conversation/workpiece/document bundle in another tab.
This joins the real browser panel to the mounted Flue conversation route introduced by the parent PR. The retained two-tab witness establishes single-fixture browser-backed viability: one honestly labelled prepared crew-reservation case gained exactly one weight-1 input arc from
Dispatch crew availabletoStart final inspection, then reopened and continued without duplicate preparation, mutation, or identity drift.This does not establish automatic full-net projection, capture-backed provenance, broad scenario coverage, behavioral execution, remote durability, or concurrent collaboration.
🔗 Related links
🚫 Blocked by
🔍 What does this change?
addArcas mutation-side tools for this fixture (the docs reader and interactive-widget tools stay answerable), normalizes the narrow provider input exercised by the witness, and returns correlated client-tool results through the same Flue route.brunch-fixturesearch key on the index route so Petrinaut's URL writes keep the fixture selected, adds automatic local document persistence, same-fixture second-tab recovery, focused failure tests, user documentation, a Petrinaut changeset, and retained browser evidence.🏗️ Agent notes
Mission contract
Imperative: Determine whether one canonical Brunch conversation can maintain a useful Markdown workpiece and drive a meaningful browser-side Petrinaut change without reviving a comprehensive typed domain IR. The visible advance is: Brunch edits the net being viewed from the conversation, and the work survives closing the tab.
Throughline: Stable prepared-fixture selector → distinct fixture/document/conversation identities → idempotent tagged revision-zero dispatch → canonical Flue history hydration → latest eligible Markdown workpiece recovery → one realistic confirming turn → fixture-scoped canonical document read and
addArcrequest → browser validation/execution → original call-id result through the same Flue route → coherent settled manifest → second-tab reopen and real follow-up in the same conversation.Proof: The corrected production-browser witness records one prepared source, one model-produced revision, one canonical weight-1 input arc, one unique correlated successful mutation result, matching settled identities/hashes in Tab B, and a completed non-mutating follow-up without duplicate preparation or mutation. Focused tests cover preparation idempotency, append-only workpiece selection, tool scoping, call/result correlation, no-op and rejected mutations, mismatch refusal, and content-addressed fallback to the prior coherent document. The proof is limited to this prepared local fixture.
Constraints: Flue remains the canonical conversation log; Markdown remains the semantic workpiece; Petrinaut owns schemas, validation, mutation, and document state; fixture, conversation, workpiece, and document identities stay distinct; the browser uses the parent PR's mounted
/agents/chat/:instanceIdtransport; construction tools remain unavailable to unrelated conversations; no second event log, comprehensive process ontology, graph database, workflow engine, explicit Save flow, or remote durability claim is introduced.Fog-line: The narrow shallow
addArccarrier succeeded, including provider string-to-number normalization, but broader nested provider schemas remain unproved. The witness found message id plus SHA-256 sufficient for this fixture's workpiece revision and found localStorage mirroring sufficient for this same-browser two-tab path; neither result proves broader revision storage, concurrent editing, or cross-store transactions.Stop or reorient: Stop if preparation hides authorship, identities collapse, traffic bypasses the mounted Flue route, transcript prose replaces the workpiece as construction input, parser acceptance substitutes for semantic correspondence, call ids or document targeting are lost, partial state advances the settled manifest, stale Tab B state is silently selected, fixture-only mutations leak to ordinary conversations, or the work widens into later provenance/projection/deployment missions.
Deferred: Mission 7 owns capture-backed visible why/provenance and broken-link refusal. Mission 9 owns repeatable automatic projection and broader nested provider-schema classes. Remote replacement durability remains with Mission 8. Concurrent editing, cross-store commit machinery, and promotion of this prepared fixture re-enter only under observed strain or a named later consumer.
Implementation record
yarn dev:brunch, a fresh Playwright context, the mounted Flue route, a real configured provider credential, and?brunch-fixture=crew-reservation-v1.conv_01M1NV5WZETMYEGGMFXNYDSTRS.toolu_01BQukCZTAhJ64VNE7oC1CWG."1".normalizePetrinautAiToolInput(owned by petrinaut-core) coerces a finite numeric-stringweightto a number before canonical validation wherever theaddArctool is defined, including validated-construction mode; it is one narrow coercion, and no broader nested-input repair is claimed.r2witness corrects both issues.Pre-Merge Checklist 🚀
🚢 Has this modified a publishable library?
This PR:
📜 Does this require a change to the docs?
The changes in this PR:
🕸️ Does this require a change to the Turbo Graph?
The changes in this PR:
r2witness supersedes the first retained witness for acceptance.brunch-fixturesearch key so URL writes no longer drop the fixture; the selector and fixture URL fall back to the ordinary demo when Brunch is unconfigured; the fixture's browser tool catalog keeps the always-mounted docs reader answerable; workpiece revisions are numbered by the history rather than by manifest count, so a model revision that settles first is never labelled revision zero; and an unchanged-document mutation result no longer claims the requested state already existed. TheaddArcweight normalization was found to apply to the shared tool definition rather than the fixture alone; the description above now says so instead of the code being narrowed.Final review fixes (
ce0ac400b3): the index route keys the stateful demo by validated fixture mode, so an in-place query transition atomically opens the fixture document/handle; and a selected coherent manifest now reportsrevalidatingrather thanpreparingwhile canonical history reconnects, without claiming the workpiece is currently available. Focused route-identity, settlement-hook, and rendered-banner tests cover both cases.🐾 Next steps
🛡 What tests cover this?
❓ How to test this?
yarn dev:brunch.http://127.0.0.1:4915/?brunch-fixture=crew-reservation-v1.Dispatch crew availabletoStart final inspection.addArccall.📹 Demo
The corrected witness includes Tab A before/after and Tab B screenshots, canonical Flue snapshots, document definitions, settled manifests, correlation artifacts, workpieces, and checksums.