From f5025120e390ce45848933cc50bb1ff92025490c Mon Sep 17 00:00:00 2001 From: Garrett Maring Date: Tue, 26 May 2026 16:13:39 -0300 Subject: [PATCH 01/35] V42 Gate 1: Open reliable MVP experience roadmap Open the V42 specification family over active V41, defining the reliable MVP experience gate plan for shortest-path Depositing, five-step Reading, settlement-gated delivery, and AI-reading demonstration proof. Wire check:v42-gate1 into package scripts and gate/canon workflows, update roadmap/docs/PR guidance for active V41 / draft V42 posture, and preserve V43+ route-split and agentic deposit work as future scope. Checks: pnpm run check:v42-gate1; node scripts/check-bitcode-spec-family.mjs --version V42 --mode draft --current-target V41; node scripts/check-bitcode-canonical-inputs.mjs --current-target V41; node scripts/check-bitcode-canon-posture-drift.mjs --active-canon V41 --draft-target V42; node scripts/check-v41-gate9-promotion-readiness.mjs --promotion-mode --skip-branch-check --skip-package-tests; pnpm --filter @bitcode/protocol typecheck; git diff --check --- .github/pull_request_template.md | 4 +- .github/workflows/bitcode-canon-quality.yml | 14 +- .github/workflows/bitcode-gate-quality.yml | 4 + BITCODE_SPEC_V42.md | 522 ++++++++++++++++++ BITCODE_SPEC_V42_DELTA.md | 85 +++ BITCODE_SPEC_V42_NOTES.md | 80 +++ BITCODE_SPEC_V42_PARITY_MATRIX.md | 70 +++ README.md | 22 +- SPECIFICATIONS_ROADMAP.md | 39 +- package.json | 1 + packages/protocol/README.md | 10 +- ...2-gate1-mvp-experience-roadmap-opening.mjs | 176 ++++++ 12 files changed, 993 insertions(+), 34 deletions(-) create mode 100644 BITCODE_SPEC_V42.md create mode 100644 BITCODE_SPEC_V42_DELTA.md create mode 100644 BITCODE_SPEC_V42_NOTES.md create mode 100644 BITCODE_SPEC_V42_PARITY_MATRIX.md create mode 100644 scripts/check-v42-gate1-mvp-experience-roadmap-opening.mjs diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 79f3e0e9..d692faa0 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,7 +1,7 @@ ## Title -Use the version and gate prefix for gate PRs: `V41 Gate N: Concise Topical Title`. -Use the version and promotion prefix for version promotion PRs: `V41 Canonical Promotion: Concise Topical Title`. +Use the version and gate prefix for gate PRs: `V42 Gate N: Concise Topical Title`. +Use the version and promotion prefix for version promotion PRs: `V42 Canonical Promotion: Concise Topical Title`. ## Closure diff --git a/.github/workflows/bitcode-canon-quality.yml b/.github/workflows/bitcode-canon-quality.yml index 4366e25b..44ffb620 100644 --- a/.github/workflows/bitcode-canon-quality.yml +++ b/.github/workflows/bitcode-canon-quality.yml @@ -292,6 +292,10 @@ jobs: node scripts/check-bitcode-canonical-inputs.mjs --current-target V41 node scripts/check-bitcode-canon-posture-drift.mjs --active-canon V41 --draft-target V42 node scripts/check-v41-gate9-promotion-readiness.mjs --promotion-mode --skip-branch-check --skip-package-tests + if [ -f BITCODE_SPEC_V42.md ]; then + node scripts/check-bitcode-spec-family.mjs --version V42 --mode draft --current-target V41 + node scripts/check-v42-gate1-mvp-experience-roadmap-opening.mjs --skip-branch-check + fi else echo "Unexpected BITCODE_SPEC.txt pointer: $POINTER" >&2 exit 1 @@ -431,7 +435,15 @@ jobs: node scripts/check-bitcode-spec-family.mjs --version V41 --mode draft --current-target V40 fi ;; + spec:\ V42*|spec:\ v42*) + POINTER="$(cat BITCODE_SPEC.txt)" + if [ "$POINTER" = "V42" ]; then + node scripts/check-bitcode-spec-family.mjs --version V42 --mode promoted --current-target V42 + else + node scripts/check-bitcode-spec-family.mjs --version V42 --mode draft --current-target V41 + fi + ;; *) - echo "Skipping strict spec-title conformance; title is not a V29/V30/V31/V32/V33/V34/V35/V36/V37/V38/V39/V40/V41 spec change." + echo "Skipping strict spec-title conformance; title is not a V29/V30/V31/V32/V33/V34/V35/V36/V37/V38/V39/V40/V41/V42 spec change." ;; esac diff --git a/.github/workflows/bitcode-gate-quality.yml b/.github/workflows/bitcode-gate-quality.yml index 52ff9afb..906125d9 100644 --- a/.github/workflows/bitcode-gate-quality.yml +++ b/.github/workflows/bitcode-gate-quality.yml @@ -421,6 +421,10 @@ jobs: node scripts/check-bitcode-canonical-inputs.mjs --current-target V41 node scripts/check-bitcode-canon-posture-drift.mjs --active-canon V41 --draft-target V42 node scripts/check-v41-gate9-promotion-readiness.mjs --promotion-mode --skip-branch-check --skip-package-tests + if [ -f BITCODE_SPEC_V42.md ]; then + node scripts/check-bitcode-spec-family.mjs --version V42 --mode draft --current-target V41 + node scripts/check-v42-gate1-mvp-experience-roadmap-opening.mjs --skip-branch-check + fi else echo "Unexpected BITCODE_SPEC.txt pointer: $POINTER" >&2 exit 1 diff --git a/BITCODE_SPEC_V42.md b/BITCODE_SPEC_V42.md new file mode 100644 index 00000000..bf8336e7 --- /dev/null +++ b/BITCODE_SPEC_V42.md @@ -0,0 +1,522 @@ +# Bitcode Spec V42 + +## Status + +- Version: `V42` +- V42 state: draft opened; V42 is the reliable MVP experience draft over the promoted V41 prompt-program excellence canon +- Current canonical/latest target: `V41` +- Prior canonical anchor: `BITCODE_SPEC_V41.md` +- Prior generated proof appendix: `BITCODE_SPEC_V41_PROVEN.md` +- Generated structured artifact inventory: draft `.bitcode/v42-spec-family-report.json`, `.bitcode/v42-canonical-input-report.json`, `.bitcode/v42-canon-posture-drift-report.json`, and later V42 gate artifacts for depositing shortest path, Reading shortest path, AI-reading demonstration proof, settlement and delivery rehearsal, and promotion readiness +- Source parity state: V42 Gate 1 opens specification, roadmap, documentation, and workflow parity over active V41; source behavior changes remain gated behind later V42 acceptance criteria +- Notes companion: `BITCODE_SPEC_V42_NOTES.md` +- Delta companion: `BITCODE_SPEC_V42_DELTA.md` +- Parity companion: `BITCODE_SPEC_V42_PARITY_MATRIX.md` +- Generated proof appendix: `BITCODE_SPEC_V42_PROVEN.md` only after V42 promotion +- Scope: V42 draft system specification for reliable MVP product experience: shortest-path Depositing, shortest-path Reading, source-safe AssetPack preview, BTD/BTC settlement, post-settlement repository delivery, depositor compensation visibility, and an AI-reading dominant demonstration +- Last fully realized canonical target preserved in source: `V41` + +## Version executive summary + +V42 exists because V39 made commercial Reading real, V40 made the application testable, and V41 made prompts and PromptParts reliable enough to drive a product experience. +The version now turns that depth into the shortest believable enterprise MVP paths: + +- deposit any admissible source material into the Depository with clear proof that it can later earn BTC compensation when used in a synthesized AssetPack; +- request a Read, review or resynthesize Bitcode's synthesized Need, request Finding Fits, inspect source-safe AssetPack measurements and preview metadata, settle the quoted BTD/BTC purchase, and receive the full source-bearing AssetPack as repository delivery after settlement; +- demonstrate Bitcode as an AI-reading dominant system where proprietary or otherwise non-public deposited material measurably improves an AI system beyond a public-data-only baseline. + +## Canonical Bitcode executive summary + +Bitcode remains the protocol and commercial system for depositing technical knowledge, reading needs against the Depository, finding many fitting deposits, synthesizing source-safe AssetPack previews, settling BTC fees, transferring BTD rights, and delivering full source-bearing AssetPacks only after settlement. +V42 changes the product experience and demonstration proof around that law. +It must not weaken BTC settlement, BTD ownership, source-to-shares compensation, disclosure boundaries, prompt-program source-safety, or ledger/database/storage synchronization. + +## V42 source-of-truth hierarchy + +`BITCODE_SPEC.txt` points to `V41` while V42 is draft. +`BITCODE_SPEC_V41.md` and `BITCODE_SPEC_V41_PROVEN.md` are active canon. +`BITCODE_SPEC_V42.md`, `BITCODE_SPEC_V42_DELTA.md`, `BITCODE_SPEC_V42_NOTES.md`, and `BITCODE_SPEC_V42_PARITY_MATRIX.md` define the draft target only on `version/v42` and `v42/gate-*` branches. +Implementation remains unversioned in source paths; routes, packages, tests, prompts, components, and scripts move in place as the single current Bitcode system. + +## V42 full-system, re-implementation, and audit rule + +Reliable MVP experience work must be reconstructable from code, specification, generated artifacts, tests, telemetry, and operator documentation. +Each accepted gate must state the user path, protocol objects, route/API ownership, pipeline ownership, source-safe disclosure tier, storage projection, ledger boundary, telemetry rows, proof artifacts, and validating commands needed to rebuild the experience without conversation history. +No gate may close with only UI copy, speculative product language, or unverified route behavior. + +## V42 totality and precision enforcement rule + +V42 must make the product shortest paths complete without hiding complexity. +Default interfaces should be low-detail and guided, while expandable detail must preserve the rich proof, telemetry, ledger, pipeline, and storage readback required by Bitcode. +No Read can advance to Finding Fits without a reviewed synthesized Need. +No source-bearing AssetPack content can cross into reader visibility before BTC settlement, BTD rights transfer, and storage/delivery reconciliation. +No generated report may serialize secrets, wallet private material, private settlement payloads, protected source, raw provider responses, protected prompt payloads, or unpaid AssetPack source. + +## V42 system goals, non-goals, and design principles + +Goals: + +- Make Depositing the shortest path from source material to Depository admission proof and later compensation visibility. +- Make Reading the shortest path from Read Request to reviewed Need, Finding Fits, source-safe AssetPack preview, BTD/BTC settlement, rights transfer, and repository delivery. +- Keep advanced proof and telemetry available through expandable detail instead of forcing enterprise users through raw protocol machinery. +- Preserve `ReadNeedComprehensionSynthesis` and `ReadFitsFindingSynthesis` as the product-owned Reading pipeline names and runtime boundaries. +- Produce a demonstration where an AssetPack improves an AI system beyond a public-data-only baseline using deposited technical intelligence. +- Keep local and staging-testnet rehearsal realistic while value-bearing mainnet operations remain explicitly gated. + +Non-goals: + +- V42 does not introduce agentic enterprise deposit AssetPack option synthesis; that is V43+. +- V42 does not split `/terminal` into `/read` and `/deposit`, and does not rename `/exchange` to `/packs`; those route changes are V43+ unless explicitly reopened. +- V42 does not change BTD supply law, BTC fee conservation, source-to-shares accounting, or post-settlement delivery rights. +- V42 does not expose protected source, protected prompts, raw provider responses, or unpaid AssetPack source for demonstration convenience. + +Design principles: shortest credible path, source-safe preview, proof-on-expand, purchase-before-source, depositor compensation visibility, AI-reading demonstration value, and production-hardening through tests. + +## V42 system architecture and layer boundaries + +V42 acts through existing layers: + +- website application routes and product state for Depositing, Reading, settlement, and delivery; +- packages for protocol, BTD, pipeline hosts, pipeline asset packs, prompts, tools, telemetry, and storage; +- `ReadNeedComprehensionSynthesis` and `ReadFitsFindingSynthesis` pipelines with PTRR agents, FailsafeGenerationSequence, ThricifiedGeneration, tool registries, and typed parser outputs; +- Depository indexing, search documents, embeddings, candidate fit ranking, selected-fit provenance, AssetPack synthesis, quote calculation, settlement observation, BTD rights transfer, and repository delivery; +- demonstration code inside `protocol-demonstration/` only, with no commercial imports from demonstration and no demonstration imports from commercial product code. + +## V42 canonical domain model + +V42 product-experience domain objects are Depositing session, source admission proof, Depository record, compensation route preview, Read Request, synthesized Need, Need review decision, Need resynthesis request, accepted Need admission, Finding Fits request, candidate fit deposit, selected fit set, AssetPack measurement preview, withheld source bundle, BTD/BTC quote, settlement instruction, settlement observation, BTD rights transfer receipt, repository delivery receipt, AI-reading baseline, AI-reading improved result, telemetry stream row, proof-root summary, and repair posture. +These objects bind to existing Bitcode objects: deposits, BTD ranges, AssetPacks, BTC fee receipts, source-to-shares rows, ledger journals, database projections, object-storage locks, VCS pull requests, prompt-program receipts, pipeline executions, and source-safe generated artifacts. + +## V42 whole Bitcode operator chain + +The V42 operator chain is: admit source, prove Depository availability, expose compensation posture, accept a Read Request, synthesize a Need, review or resynthesize the Need, request Finding Fits, search many Depository candidates, rank and select fitting deposits, synthesize a source-safe AssetPack preview, quote BTD/BTC purchase terms, settle BTC, transfer BTD rights, unlock source-bearing delivery, create repository pull request, journal ledger/database/storage synchronization, and expose source-safe telemetry and proof readback. + +## V42 Gate 1 MVP Experience Roadmap And Spec Opening + +Gate 1 opens the V42 spec family, branch posture, workflow posture, checker, roadmap, docs, and reliable MVP experience vocabulary. +It does not implement route, pipeline, settlement, or demonstration behavior beyond documentation and validation posture. +It closes when active V41 / draft V42 truth is visible in the root docs, protocol docs, workflow checks, package scripts, and roadmap, and when V42 has a precise gate plan. + +## V42 Gate 2 Depositing Shortest Path And Compensation Visibility + +Gate 2 must make the shortest deposit path explicit and testable. +The accepted user path is: provide source material, select repository/source anchor, admit deposit to the Depository, receive source-safe admission proof, and see how later BTC compensation will be attributed if the deposit participates in a synthesized AssetPack. +It must cover route/API contracts, source validation, storage projection, Depository search-document creation, BTD/source-to-shares compensation readback, telemetry, and local/staging rehearsal. + +## V42 Gate 3 Reading Shortest Path State Machine + +Gate 3 must make the five Reading steps a coherent product state machine: request read, review synthesized Need, request Finding Fits, review source-safe AssetPack preview, and buy/settle/deliver AssetPack. +It must simplify default Terminal experience while preserving expandable proof, execution, telemetry, ledger, and storage detail. +It must prove route persistence, transaction ids, stage transitions, restart/retry behavior, source-safe UI rendering, and failure states. + +## V42 Gate 4 ReadNeed Review And Resynthesis Product Closure + +Gate 4 must make `ReadNeedComprehensionSynthesis` product-ready in the MVP flow. +The pipeline must synthesize exactly the user's Need from the Read Request, store source-safe Need data, allow user feedback and resynthesis, preserve lineage, and admit Finding Fits only after the Need is accepted. +It must cover PTRR agents, FailsafeGenerationSequence, ThricifiedGeneration, prompts, parser return types, telemetry rows, database projection, tests, and UI readback. + +## V42 Gate 5 ReadFitsFinding AssetPack Preview And Quote Closure + +Gate 5 must make `ReadFitsFindingSynthesis` product-ready in the MVP flow. +The pipeline must search the Depository for many candidates above threshold, rank candidates, select fits, synthesize source-safe AssetPack measurements and preview metadata, keep source-bearing content withheld, calculate deterministic BTD/BTC quote posture, and expose a reviewable preview. +It must cover vector search and provider search tooling, selected-fit provenance, prompt/tool return types, telemetry, quote formula readback, source-safe UI, and failure/repair states. + +## V42 Gate 6 Settlement Rights Transfer And Repository Delivery Closure + +Gate 6 must make purchase and delivery reliable. +The accepted user path is: review the AssetPack preview, choose to buy, receive settlement instructions, observe BTC/testnet settlement in the admitted lane, transfer BTD rights to the Reader, unlock source-bearing AssetPack delivery, and create the repository pull request. +It must prove ledger/database/object-storage synchronization, delivery locks, no pre-settlement source leakage, compensation accounting, repair actions, and operator readback. + +## V42 Gate 7 AI-Reading Dominant Demonstration MVP + +Gate 7 must update the standalone demonstration so it proves Bitcode's AI-reading value. +The demonstration should show deposited non-public technical intelligence becoming an AssetPack that measurably improves an AI system's training, prompt/context, or evaluation performance beyond a public-data-only baseline. +It must remain minimal, self-contained inside `protocol-demonstration/`, and independent from commercial product code. + +## V42 Gate 8 Local And Staging-Testnet Full MVP Rehearsal + +Gate 8 must rehearse the full MVP path locally and in staging-testnet without value-bearing mainnet behavior. +It must exercise deposit, Read Request, Need synthesis/review/resynthesis, Finding Fits, AssetPack preview, quote, settlement simulation or testnet observation, BTD rights projection, repository delivery, telemetry, proof artifacts, and repair readback. + +## V42 Gate 9 V42 Promotion Readiness + +Gate 9 closes V42 promotion readiness. +It must bind every V42 artifact, test, workflow, generated proof support, promotion command, active V42 / draft V43 runtime preparation, source-safe generated appendix output, and value-bearing mainnet blocking where relevant. +It closes only when V42 can be promoted as the reliable MVP experience canon. + +## V42 canonical subsystem surfaces + +### Depositing and asset supply + +Current canonical objects and emitted artifacts: deposits, source admission proof, Depository records, search documents, embedding projections, source-to-shares contributor roots, compensation route previews, and admission telemetry. +Current algorithms and derivation rules: deposit admission validates source authority, builds source-safe measurement/search documents, preserves ownership, and records future compensation posture without implying a BTD mint before a Need-Fit. +Current invariants and fail-closed conditions: invalid deposit, missing source authority, storage mismatch, and protected-source projection fail closed. +Current proof obligations: admission proof, Depository readback, compensation route readback, source-safe projection, and local/staging rehearsal. +Current source-bearing implementation basis: `packages/protocol`, `packages/btd`, `packages/pipelines/asset-pack`, `packages/tools-generics`, `packages/prompts`, and `uapi`. +Current validating commands and parity basis: V42 gate checks, V41 prompt-program checks, V40 integration coverage, V39 Reading readiness, and generated V42 artifacts. +Current accepted boundaries: pre-fit deposits are Depository supply; BTD rights are minted/transferred only through accepted Need-Fit and settlement law. + +### Reading and prompt/inference ownership + +Current canonical objects and emitted artifacts: Read Request, synthesized Need, Need review decision, resynthesis lineage, accepted Need admission, prompt receipts, Failsafe receipts, ThricifiedGeneration receipts, parser envelopes, and telemetry stream rows. +Current algorithms and derivation rules: `ReadNeedComprehensionSynthesis` maps Read Request to exactly scoped Need, then user acceptance admits `ReadFitsFindingSynthesis`. +Current invariants and fail-closed conditions: prompt contract incompleteness, parsed-envelope inadmissibility, missing Need review, authorization denial, and source-context overreach fail closed. +Current proof obligations: prompt registry coverage, typed output parsing, review/resynthesis lineage, source-safe telemetry, and UI state persistence. +Current source-bearing implementation basis: `packages/agent-generics`, `packages/prompts`, `packages/pipelines/asset-pack`, `packages/tools-generics`, `packages/protocol`, and `uapi`. +Current validating commands and parity basis: V41 prompt-program reports, V42 Reading product gates, and V40 application tests. +Current accepted boundaries: Need data may be visible to the Reader; fit source and AssetPack source remain withheld until settlement unlock. + +### Fit, recall, ranking, and verification + +Current canonical objects and emitted artifacts: query plans, vector search receipts, provider search receipts, candidate fit deposits, ranking receipts, selected-fit provenance, verification verdicts, source-safe preview measurements, and replay roots. +Current algorithms and derivation rules: `ReadFitsFindingSynthesis` searches many Depository candidates above threshold, ranks them with source-safe evidence, and feeds selected fits into AssetPack synthesis. +Current invariants and fail-closed conditions: no-survivor asset pack, missing provenance, ranking drift, embedding mismatch, and verification failure block preview and settlement. +Current proof obligations: query synthesis, vector/provider search breadth, threshold ranking, selected-fit provenance, and source-safe replay determinism. +Current source-bearing implementation basis: depository search tools, embedding utilities, prompt registries, pipeline asset-pack packages, and benchmark fixtures. +Current validating commands and parity basis: V38 search/embedding artifacts, V39 Finding Fits runtime, V41 prompt hardening, and V42 Gate 5. +Current accepted boundaries: pre-settlement candidate and fit visibility is source-safe metadata only. + +### Selection and materialization + +Current canonical objects and emitted artifacts: selected fit set, AssetPack measurements, source-safe preview, withheld source bundle, quote, delivery lock, repository delivery plan, proof roots, and repair receipts. +Current algorithms and derivation rules: AssetPack source can be synthesized and locked before settlement, but reader visibility is limited to source-safe preview and measurements until payment and rights transfer. +Current invariants and fail-closed conditions: public projection overexposure, unpaid AssetPack source exposure, missing quote, and delivery-lock mismatch fail closed. +Current proof obligations: preview source-safety, deterministic quote, locked source bundle, post-settlement delivery unlock, and repository pull-request proof. +Current source-bearing implementation basis: `packages/pipelines/asset-pack`, `packages/btd`, `packages/vcs`, `packages/protocol`, and `uapi`. +Current validating commands and parity basis: V39 preview/quote and settlement/delivery artifacts, V40 integration tests, and V42 Gates 5 and 6. +Current accepted boundaries: full source-bearing delivery unlock remains payment, finality, rights-transfer, and reconciliation gated. + +### Identity, authorization, and sensitive flow + +Current canonical objects and emitted artifacts: account, organization, wallet, repository authority, source selector, policy decision, quote recipient, buyer, depositor, and disclosure receipt. +Current algorithms and derivation rules: product paths must check authority before source admission, Need synthesis, fit search, preview, settlement, and repository delivery. +Current invariants and fail-closed conditions: authorization denial, wallet authority mismatch, organization policy denial, and repository permission failure fail closed. +Current proof obligations: policy readback, role checks, wallet boundary, repository delivery authority, and source-safe denial states. +Current source-bearing implementation basis: `packages/auth`, `packages/btd`, `packages/github`, `packages/protocol`, and `uapi`. +Current validating commands and parity basis: V31 Auxillaries authority, V39 Reading interface parity, V40 API/browser tests, and V42 route tests. +Current accepted boundaries: private wallet material, private settlement payloads, secrets, and protected source never enter public or unpaid Reader projections. + +### Disclosure and projection + +Current canonical objects and emitted artifacts: visibility tier, source-safe preview, protected source lock, prompt/result disclosure posture, telemetry redaction receipt, and public/operator projection rows. +Current algorithms and derivation rules: source-safe summaries may show measurements, ids, hashes, roots, scores, and verdicts; protected source, raw prompts, raw provider responses, and unpaid AssetPack source remain withheld. +Current invariants and fail-closed conditions: public projection overexposure, prompt/result leakage, and storage projection mismatch fail closed. +Current proof obligations: disclosure tier mapping, UI redaction, telemetry redaction, generated artifact redaction, and repair posture. +Current source-bearing implementation basis: `packages/observability`, `packages/prompts`, `packages/protocol`, `packages/btd`, and `uapi`. +Current validating commands and parity basis: V38/V41 source-safe telemetry and prompt-program checks, V39 preview boundaries, and V42 UI tests. +Current accepted boundaries: proof-on-expand may be rich but must remain source-safe before settlement. + +### Settlement and exact accounting + +Current canonical objects and emitted artifacts: BTD/BTC quote, settlement instruction, BTC observation, finality state, BTD rights transfer receipt, source-to-shares allocation, ledger journal, database projection, and reconciliation receipt. +Current algorithms and derivation rules: deterministic quote posture uses measurement weight, measurement volume, and protocol fee allocation; settlement observation gates rights transfer and delivery unlock; compensation routes deposit contributors according to source-to-shares law. +Current invariants and fail-closed conditions: settlement conservation drift, missing finality, duplicate rights transfer, compensation mismatch, and stale projection fail closed. +Current proof obligations: quote determinism, BTC/testnet observation, BTD rights transfer, source-to-shares conservation, ledger/database/object-storage synchronization, and repair replay. +Current source-bearing implementation basis: `packages/btd`, `packages/protocol`, `packages/objects-arrays`, storage adapters, and `uapi`. +Current validating commands and parity basis: V27/V30 BTD law, V39 settlement readiness, V40 ledger/storage sync, and V42 Gate 6. +Current accepted boundaries: production-mainnet value-bearing operations remain blocked until explicitly admitted by later canon and operator approval. + +### Proof contract, witnesses, and replay + +Current canonical objects and emitted artifacts: proof family, member, theorem, replay step, witness artifact, generated report, run receipt, telemetry row, repair receipt, and promotion appendix. +Current algorithms and derivation rules: every V42 gate emits or checks source-safe proof roots sufficient to replay the product path and detect stale promoted status truth. +Current invariants and fail-closed conditions: stale promoted status truth, missing witness, failed replay, and source-safety violation fail closed. +Current proof obligations: deterministic generated artifacts, workflow binding, local/staging rehearsal receipts, promotion dry-run, and generated `BITCODE_SPEC_V42_PROVEN.md`. +Current source-bearing implementation basis: `packages/protocol`, `.bitcode/`, `.github/workflows`, `scripts/`, and `protocol-demonstration/`. +Current validating commands and parity basis: V42 check scripts, V41 promotion readiness, V40 proof/test coverage, and canon-quality workflows. +Current accepted boundaries: demonstration evidence stays within demonstration boundaries and does not become commercial runtime dependency. + +## V42 proof-family canon + +### Exact proof-family inventory matrix + +| proofFamily | proofArtifactPath | memberIds | theoremIds | replayStepIds | witnessArtifactPaths | Current source basis | +| --- | --- | --- | --- | --- | --- | --- | +| Inference-synthesis | `.bitcode/v42-inference-synthesis.json` | read-need, finding-fits, asset-pack-preview | need-exactness, many-fit-search, typed-output | synthesize-need, search-depository, preview-pack | pipeline receipts, prompt receipts | V41 prompt-program canon and V42 Reading gates | +| Prompt-completeness | `.bitcode/v42-prompt-completeness.json` | prompt-registry, tool-prompts, parser-prompts | registry-totality, interpolation-totality | resolve-prompt, parse-output | prompt catalogue reports | V41 PromptPart and Prompt artifacts | +| Static-code-analysis | `.bitcode/v42-static-code-analysis.json` | routes, packages, workflows | no-versioned-routes, no-demo-import, no-secret-values | lint, typecheck, import-scan | CI logs | scripts and workflows | +| Verification-decisions | `.bitcode/v42-verification-decisions.json` | deposit-admission, need-review, fit-selection | authority-checked, source-safe, replayable | admit-deposit, accept-need, rank-fits | route/API receipts | V42 Gates 2 through 5 | +| Selection-and-materialization | `.bitcode/v42-selection-materialization.json` | selected-fits, preview, withheld-source | no-source-before-settlement, delivery-lock | synthesize-preview, lock-source | storage and preview receipts | V39/V42 preview and delivery law | +| Authorization-and-sensitive-flow | `.bitcode/v42-authorization-sensitive-flow.json` | account, org, wallet, repo | authority-preserved, policy-fail-closed | check-policy, check-wallet, check-repo | policy receipts | Auxillaries, auth, BTD packages | +| Settlement-source-to-shares | `.bitcode/v42-settlement-source-to-shares.json` | quote, settlement, rights, compensation | conservation, finality, rights-transfer | quote, observe, transfer, allocate | ledger receipts | BTD and ledger packages | +| Disclosure-boundary | `.bitcode/v42-disclosure-boundary.json` | source-safe-preview, telemetry-redaction, generated-artifacts | no-protected-payload, source-safe-public | render-preview, stream-telemetry, generate-report | redaction receipts | V38/V41/V42 source-safe rules | +| Proof-contract | `.bitcode/v42-proof-contract.json` | generated-reports, workflows, promotion | deterministic, workflow-bound, promotion-ready | generate, check, promote-dry-run | `.bitcode/*`, CI logs | protocol package and workflows | + +### Inference-synthesis + +- proofArtifactPath: `.bitcode/v42-inference-synthesis.json` +- members: read-need, finding-fits, asset-pack-preview +- theoremIds: need-exactness, many-fit-search, typed-output +- replayStepIds: synthesize-need, search-depository, preview-pack +- witnessArtifactPaths: pipeline receipts, prompt receipts, parser receipts +- current member closure criteria: each inference step is registry-bound, typed, source-safe, and attached to the product state machine. +- current member verdict shape: pass, fail, blocked, or repair-required. +- current theorem-by-theorem closure reading: Need exactness, many-fit search, and typed output must independently pass. +- current theorem-to-replay grouping: replay follows Need synthesis, Finding Fits, and preview generation. +- minimum artifact/replay binding set: prompt lineage, execution id, parsed output id, and telemetry row id. +- current proof-object fields: id, stage, agent, step, parser, verdict, proofRoot. +- generated-artifact and test bindings: V42 pipeline product checks and V41 prompt-program reports. +- fail-closed conditions: prompt contract incompleteness, parsed-envelope inadmissibility, and no-survivor asset pack. + +### Prompt-completeness + +- proofArtifactPath: `.bitcode/v42-prompt-completeness.json` +- members: prompt-registry, tool-prompts, parser-prompts +- theoremIds: registry-totality, interpolation-totality +- replayStepIds: resolve-prompt, parse-output +- witnessArtifactPaths: V41 prompt inventory, registry interpolation reports +- current member closure criteria: every prompt involved in the MVP path is catalogued and validated. +- current member verdict shape: pass, fail, blocked, or repair-required. +- current theorem-by-theorem closure reading: registry and interpolation totality are checked before inference. +- current theorem-to-replay grouping: prompt resolution precedes parser validation. +- minimum artifact/replay binding set: prompt id, part ids, interpolation keys, parser id. +- current proof-object fields: promptId, registryId, interpolationKeys, parserId, verdict. +- generated-artifact and test bindings: V41 prompt reports and V42 gate checks. +- fail-closed conditions: prompt contract incompleteness and protected prompt disclosure. + +### Static-code-analysis + +- proofArtifactPath: `.bitcode/v42-static-code-analysis.json` +- members: routes, packages, workflows +- theoremIds: no-versioned-routes, no-demo-import, no-secret-values +- replayStepIds: lint, typecheck, import-scan +- witnessArtifactPaths: CI logs and local command output +- current member closure criteria: changed code is typechecked, lintable, import-safe, and source-safe. +- current member verdict shape: pass, fail, blocked, or repair-required. +- current theorem-by-theorem closure reading: route naming, dependency direction, and secret safety must pass. +- current theorem-to-replay grouping: static checks run before integration checks. +- minimum artifact/replay binding set: command, branch, commit, output summary. +- current proof-object fields: checkId, command, files, verdict, proofRoot. +- generated-artifact and test bindings: gate-quality and canon-quality workflows. +- fail-closed conditions: stale promoted status truth, source import violation, and secret exposure. + +### Verification-decisions + +- proofArtifactPath: `.bitcode/v42-verification-decisions.json` +- members: deposit-admission, need-review, fit-selection +- theoremIds: authority-checked, source-safe, replayable +- replayStepIds: admit-deposit, accept-need, rank-fits +- witnessArtifactPaths: route receipts, API receipts, pipeline receipts +- current member closure criteria: each user-visible decision has source-safe reason, authority proof, and replay id. +- current member verdict shape: accepted, rejected, blocked, or repair-required. +- current theorem-by-theorem closure reading: authority, source safety, and replayability are independent gates. +- current theorem-to-replay grouping: decision receipts replay in product order. +- minimum artifact/replay binding set: transaction id, decision id, principal id, proofRoot. +- current proof-object fields: decisionKind, actor, inputRoot, outputRoot, verdict. +- generated-artifact and test bindings: V42 product state machine and API tests. +- fail-closed conditions: invalid deposit, authorization denial, and missing Need acceptance. + +### Selection-and-materialization + +- proofArtifactPath: `.bitcode/v42-selection-materialization.json` +- members: selected-fits, preview, withheld-source +- theoremIds: no-source-before-settlement, delivery-lock +- replayStepIds: synthesize-preview, lock-source +- witnessArtifactPaths: preview receipts, storage lock receipts +- current member closure criteria: selected fits produce preview metadata while source-bearing content is locked. +- current member verdict shape: pass, fail, blocked, or repair-required. +- current theorem-by-theorem closure reading: preview and source lock must both pass before quote settlement. +- current theorem-to-replay grouping: selected fit replay precedes source lock replay. +- minimum artifact/replay binding set: selectedFitIds, previewRoot, lockRoot, quoteRoot. +- current proof-object fields: assetPackId, previewRoot, lockRoot, disclosureTier, verdict. +- generated-artifact and test bindings: V39 preview law and V42 Gate 5/6 checks. +- fail-closed conditions: public projection overexposure and unpaid AssetPack source exposure. + +### Authorization-and-sensitive-flow + +- proofArtifactPath: `.bitcode/v42-authorization-sensitive-flow.json` +- members: account, org, wallet, repo +- theoremIds: authority-preserved, policy-fail-closed +- replayStepIds: check-policy, check-wallet, check-repo +- witnessArtifactPaths: policy receipts and authorization logs +- current member closure criteria: each sensitive action verifies the principal, organization, wallet, and repository boundary. +- current member verdict shape: allowed, denied, blocked, or repair-required. +- current theorem-by-theorem closure reading: policy and wallet/repository authority cannot be inferred from UI state alone. +- current theorem-to-replay grouping: policy replay gates settlement and delivery replay. +- minimum artifact/replay binding set: principal id, policy id, wallet id, repo id. +- current proof-object fields: actor, policy, resource, decision, proofRoot. +- generated-artifact and test bindings: Auxillaries, auth, BTD, route tests. +- fail-closed conditions: authorization denial, wallet authority mismatch, and private payload leakage. + +### Settlement-source-to-shares + +- proofArtifactPath: `.bitcode/v42-settlement-source-to-shares.json` +- members: quote, settlement, rights, compensation +- theoremIds: conservation, finality, rights-transfer +- replayStepIds: quote, observe, transfer, allocate +- witnessArtifactPaths: ledger receipts, database projections, storage locks +- current member closure criteria: quote, settlement, rights, and compensation rows reconcile exactly. +- current member verdict shape: pass, fail, blocked, or repair-required. +- current theorem-by-theorem closure reading: BTC finality, BTD rights transfer, and source-to-shares conservation must all pass. +- current theorem-to-replay grouping: settlement observation gates transfer and allocation. +- minimum artifact/replay binding set: quoteRoot, txid, rightsReceiptId, allocationRoot. +- current proof-object fields: quote, settlement, finality, rights, allocation, verdict. +- generated-artifact and test bindings: BTD tests, ledger/storage sync checks, V42 Gate 6. +- fail-closed conditions: settlement conservation drift and stale promoted status truth. + +### Disclosure-boundary + +- proofArtifactPath: `.bitcode/v42-disclosure-boundary.json` +- members: source-safe-preview, telemetry-redaction, generated-artifacts +- theoremIds: no-protected-payload, source-safe-public +- replayStepIds: render-preview, stream-telemetry, generate-report +- witnessArtifactPaths: UI snapshots, telemetry rows, generated artifacts +- current member closure criteria: collapsed and expanded UI states remain source-safe before settlement. +- current member verdict shape: pass, fail, blocked, or repair-required. +- current theorem-by-theorem closure reading: preview, telemetry, and generated proof disclosure are separately checked. +- current theorem-to-replay grouping: UI replay and generated artifact replay share disclosure tiers. +- minimum artifact/replay binding set: disclosureTier, redactionReceipt, component, artifactPath. +- current proof-object fields: visibilityTier, payloadKind, redaction, verdict, proofRoot. +- generated-artifact and test bindings: V38/V41 telemetry and V42 UI tests. +- fail-closed conditions: public projection overexposure and protected prompt/source leakage. + +### Proof-contract + +- proofArtifactPath: `.bitcode/v42-proof-contract.json` +- members: generated-reports, workflows, promotion +- theoremIds: deterministic, workflow-bound, promotion-ready +- replayStepIds: generate, check, promote-dry-run +- witnessArtifactPaths: `.bitcode/*`, workflow logs, `BITCODE_SPEC_V42_PROVEN.md` +- current member closure criteria: every V42 gate artifact is deterministic, checked, documented, and workflow-bound. +- current member verdict shape: pass, fail, blocked, or repair-required. +- current theorem-by-theorem closure reading: generated proof, workflow proof, and promotion proof must all pass. +- current theorem-to-replay grouping: generation and checking precede promotion dry-run. +- minimum artifact/replay binding set: artifact path, generator command, checker command, workflow job. +- current proof-object fields: artifactPath, command, workflow, verdict, proofRoot. +- generated-artifact and test bindings: V42 promotion readiness and canon promotion workflow. +- fail-closed conditions: missing artifact, stale promoted status truth, and failed promotion dry-run. + +## V42 generated canon + +### Inherited V19 reproducible-canon artifacts + +V42 inherits byte-stable generated proof expectations, deterministic replay posture, and promotion artifact discipline from V19. + +### Inherited V20 operator-quality artifacts + +V42 inherits operator-quality expectations for browser proof, accessibility, visual checks, performance posture, and operator acceptance from V20. + +### Exact generated-artifact inventory matrix + +| Artifact path | Producer | Disclosure posture | V42 role | +| --- | --- | --- | --- | +| `.bitcode/v42-spec-family-report.json` | `check-bitcode-spec-family` | source-safe metadata | draft/promotion spec family proof | +| `.bitcode/v42-canonical-input-report.json` | `check-bitcode-canonical-inputs` | source-safe metadata | canonical input proof | +| `.bitcode/v42-canon-posture-drift-report.json` | `check-bitcode-canon-posture-drift` | source-safe metadata | active V41 / draft V42 posture proof | +| `.bitcode/v42-depositing-shortest-path.json` | V42 Gate 2 | source-safe metadata | deposit MVP proof | +| `.bitcode/v42-reading-state-machine.json` | V42 Gate 3 | source-safe metadata | Reading product state proof | +| `.bitcode/v42-readneed-review-resynthesis.json` | V42 Gate 4 | source-safe metadata | Need review proof | +| `.bitcode/v42-readfitsfinding-preview-quote.json` | V42 Gate 5 | source-safe metadata | Finding Fits, preview, and quote proof | +| `.bitcode/v42-settlement-rights-delivery.json` | V42 Gate 6 | source-safe metadata | settlement/delivery proof | +| `.bitcode/v42-ai-reading-demonstration.json` | V42 Gate 7 | source-safe metadata | demonstration value proof | +| `.bitcode/v42-local-staging-mvp-rehearsal.json` | V42 Gate 8 | source-safe metadata | local/staging rehearsal proof | +| `.bitcode/v42-promotion-readiness-report.json` | V42 Gate 9 | source-safe metadata | promotion readiness proof | + +### V42 specifying generated artifacts + +V42 specifying artifacts must be generated from code or deterministic scripts, committed only when source-safe, and checked by gate-quality and canon-quality workflows. + +### Shared generated-artifact fields + +Shared fields are artifact id, schema id, version, current target, source roots, validation commands, proof roots, generated at policy, disclosure posture, and verdict. + +### Artifact-specific generated payload fields + +Artifact-specific fields include deposit ids, Reading stage ids, prompt/parser ids, selected fit roots, quote roots, settlement roots, delivery roots, AI baseline ids, benchmark ids, and rehearsal ids. + +### Artifact confidentiality and disclosability taxonomy + +Allowed public payloads are ids, hashes, counts, statuses, source-safe summaries, measurement scores, proof roots, and redaction verdicts. +Forbidden payloads are secrets, wallet private material, private settlement payloads, protected source, raw provider responses, protected prompt payloads, and unpaid AssetPack source. + +### Minimum generated appendix rendered contents + +The generated `BITCODE_SPEC_V42_PROVEN.md` must include aggregate proof verdict, exact proof-family inventory, exact per-family member inventory, exact per-family theorem inventory, exact replay-step inventories and theorem bindings, witness artifact inventories, generated artifact inventories, scenario and run coverage matrices, proof-source commit, and fail closed when any required proof is missing. + +### Canonical regeneration and fail-closed posture + +Promotion must fail closed when generated artifacts are missing, stale, non-deterministic, source-unsafe, disconnected from workflow checks, or inconsistent with `BITCODE_SPEC.txt`. + +## V42 validation canon + +Validation must include: + +- `node scripts/check-bitcode-spec-family.mjs --version V42 --mode draft --current-target V41`; +- `node scripts/check-v42-gate1-mvp-experience-roadmap-opening.mjs`; +- later V42 gate checks as each gate opens; +- route/API/unit/integration/browser checks appropriate to each product behavior gate; +- local and staging-testnet rehearsal checks before promotion. + +## V42 promotion canon + +V42 promotion requires all V42 gates closed, all generated artifacts deterministic and source-safe, gate-quality and canon-quality workflows green, `BITCODE_SPEC_V42_PROVEN.md` generated, active V42 / draft V43 runtime posture prepared, and value-bearing mainnet operations explicitly blocked unless later canon admits them. + +## V42 appendices and canonical supporting material + +Supporting material includes `BITCODE_SPEC_V42_DELTA.md`, `BITCODE_SPEC_V42_NOTES.md`, `BITCODE_SPEC_V42_PARITY_MATRIX.md`, package READMEs, root README, `SPECIFICATIONS_ROADMAP.md`, workflow files, generated `.bitcode/` artifacts, and protocol-demonstration documents. + +## V42 accepted boundaries and reopen conditions + +Accepted boundaries: + +- V42 Gate 1 is specification and validation posture only. +- V42 may refine `/terminal` but does not split `/read` and `/deposit`. +- V42 may improve exchange-to-pack language where user-facing clarity requires it, but full `/exchange` to `/packs` route rename is deferred to V43+. +- V42 may update demonstration only inside `protocol-demonstration/`. + +Reopen conditions: + +- a route, pipeline, or generated artifact exposes protected source or unpaid AssetPack source; +- Need review is bypassed before Finding Fits; +- settlement or BTD rights transfer is claimed without ledger/database/storage reconciliation; +- AI-reading demonstration cannot prove improvement beyond public-data-only baseline; +- workflow posture allows stale V42 artifacts to pass. + +## V42 completion condition + +V42 closes when the reliable MVP product experience is fully specified, implemented, tested, source-safe, rehearsed locally and in staging-testnet, documented, generated, workflow-checked, and promotion-ready across Depositing, Reading, Finding Fits, AssetPack preview, BTD/BTC settlement, repository delivery, depositor compensation visibility, and the AI-reading dominant demonstration. + +## Appendix A. Canonical type and surface catalog + +Canonical types include Depositing session, source admission proof, Depository record, compensation route preview, Read Request, synthesized Need, Need review decision, accepted Need, Finding Fits request, candidate fit deposit, selected fit set, AssetPack preview, BTD/BTC quote, settlement receipt, BTD rights transfer, repository delivery receipt, AI-reading baseline, AI-reading improved result, telemetry row, proof root, and repair posture. + +## Appendix B. Proof family closure catalog + +V42 proof families close through the exact proof-family inventory matrix and per-family sections above. + +## Appendix C. Generated artifact contract catalog + +V42 generated artifacts are source-safe, deterministic, workflow-bound, and promotion-blocking when stale. + +## Appendix D. Validation and checking gate catalog + +V42 gate validation starts with `check:v42-gate1` and expands gate by gate into package tests, route tests, browser tests, rehearsal scripts, and promotion readiness checks. + +## Appendix E. Current canonical source map + +Current source roots are `packages/protocol`, `packages/btd`, `packages/pipelines/asset-pack`, `packages/pipeline-hosts`, `packages/prompts`, `packages/tools-generics`, `packages/observability`, `packages/github`, `uapi`, `.github/workflows`, `scripts`, and `protocol-demonstration`. + +## Appendix F. Subsystem totality and derivability matrix + +V42 must cover repo supply and depositing, reading and measured demand, prompt/inference/evaluator ownership, deposit-to-read fit, recall and ranking, verification decisions, selection and materialization, branch artifacts and assetPackEvidence, identity, authority, signing, and policy, sensitive data and confidentiality flows, projection, disclosure, and redaction, proof families, members, theorems, witnesses, and replay, settlement, source-to-shares, journals, and exact accounting, telemetry, persistence, state, and failure semantics, host/runtime capability truth, operator experience and pedagogy, validation and test stack, and generated artifacts and canonical promotion. + +## Appendix G. Canonical file-family and promotion contract catalog + +V42 file-family contracts are `BITCODE_SPEC_V42.md`, `BITCODE_SPEC_V42_DELTA.md`, `BITCODE_SPEC_V42_NOTES.md`, `BITCODE_SPEC_V42_PARITY_MATRIX.md`, and eventual `BITCODE_SPEC_V42_PROVEN.md`. + +## Appendix H. Operator surface and quality contract catalog + +Operator surfaces include `/terminal`, depositing controls, Reading controls, execution stream rows, settlement panels, delivery receipts, Auxillaries wallet/organization surfaces, demonstration pages, and generated proof reports. + +## Appendix I. Scenario, workflow, and cross-product contract catalog + +V42 scenario coverage must include auth-issuer-rollback, privacy-boundary-proof-export, polyglot-gateway-benchmark-remediation, auth-many-asset-normalization, Targeted deposit, Normalization deposit, patch, context, public, buyer, reviewer, internal, Openly writable, Measurably readable, Provable, and Valuable workflows. + +## Appendix J. Fail-closed contract and error posture matrix + +V42 fails closed on invalid deposit, prompt contract incompleteness, parsed-envelope inadmissibility, no-survivor asset pack, authorization denial, public projection overexposure, settlement conservation drift, stale promoted status truth, source leakage, missing Need review, missing settlement finality, and repository delivery authorization failure. + +## Appendix K. Source-bearing AssetPack and artifact contract catalog + +Source-bearing contracts include `.bitcode/asset-pack.lock.json`, `.bitcode/selected-source-material.json`, `.bitcode/verification-report.json`, `.bitcode/source-to-shares.json`, `.bitcode/projection-policy.json`, `.bitcode/system-proof-bundle.json`, and `BITCODE_SPEC_V42_PROVEN.md`. +These contracts keep full AssetPack source withheld until settlement, BTD rights transfer, and delivery unlock. diff --git a/BITCODE_SPEC_V42_DELTA.md b/BITCODE_SPEC_V42_DELTA.md new file mode 100644 index 00000000..54ceb8db --- /dev/null +++ b/BITCODE_SPEC_V42_DELTA.md @@ -0,0 +1,85 @@ +# Bitcode Spec V42 Delta + +## Status + +- Version: `V42` +- V42 state: draft opened; this delta records the planned V41-to-V42 reliable MVP experience work +- Current canonical/latest target: `V41` +- Prior canonical anchor: `BITCODE_SPEC_V41.md` +- Prior generated proof appendix: `BITCODE_SPEC_V41_PROVEN.md` +- Generated structured artifact inventory: draft `.bitcode/v42-spec-family-report.json`, `.bitcode/v42-canonical-input-report.json`, `.bitcode/v42-canon-posture-drift-report.json`, and later V42 gate artifacts for Depositing, Reading, Finding Fits, settlement/delivery, AI-reading demonstration, local/staging rehearsal, and promotion readiness +- Source parity state: V42 source parity is opened by Gate 1 and remains incomplete until later gates implement the product paths +- Scope: V42 draft delta for reliable MVP product experience over promoted V41 prompt-program excellence canon + +## Why V42 exists + +V42 turns the promoted V39 Reading product, V40 testing depth, and V41 prompt-program excellence into a reliable MVP enterprise experience. +The version focuses on shortest-path Depositing, shortest-path Reading, settlement-gated AssetPack delivery, depositor compensation visibility, and an AI-reading dominant demonstration that proves AssetPacks improve an AI system beyond public-data-only baseline performance. + +## Accepted V42 decisions + +- V42 starts from active `V41` canon and keeps `BITCODE_SPEC.txt` at `V41` until promotion. +- V42 product work stays unversioned in source paths. +- Depositing must minimize the path to Depository admission proof and future compensation visibility. +- Reading must use five product steps: request read, review synthesized Need, request Finding Fits, review source-safe AssetPack preview, and buy/settle/deliver AssetPack. +- `ReadNeedComprehensionSynthesis` and `ReadFitsFindingSynthesis` remain the formal Reading pipeline names. +- Source-bearing AssetPack content remains withheld until BTC settlement, BTD rights transfer, and storage/delivery reconciliation. +- The demonstration remains self-contained in `protocol-demonstration/` and must prove AI-reading value without importing commercial code. + +## V42 gate plan + +### Gate 1: MVP Experience Roadmap And Spec Opening + +Open the V42 full specification family, roadmap, package script, workflow posture, documentation posture, branch convention, and checker. + +### Gate 2: Depositing Shortest Path And Compensation Visibility + +Implement and prove the shortest path from source material to Depository admission proof and later compensation readback. + +### Gate 3: Reading Shortest Path State Machine + +Implement and prove the five-step Reading product state machine with low-detail defaults and expandable proof/telemetry detail. + +### Gate 4: ReadNeed Review And Resynthesis Product Closure + +Implement and prove reviewed synthesized Need flow, feedback/resynthesis, accepted-Need admission, storage projection, telemetry, and UI readback. + +### Gate 5: ReadFitsFinding AssetPack Preview And Quote Closure + +Implement and prove many-candidate Depository search, selected-fit provenance, source-safe AssetPack preview, deterministic BTD/BTC quote, and no pre-settlement source leakage. + +### Gate 6: Settlement Rights Transfer And Repository Delivery Closure + +Implement and prove purchase, settlement observation, BTD rights transfer, source unlock, repository pull request delivery, compensation accounting, and repair posture. + +### Gate 7: AI-Reading Dominant Demonstration MVP + +Implement and prove the standalone demonstration where deposited technical intelligence improves an AI system beyond a public-data-only baseline. + +### Gate 8: Local And Staging-Testnet Full MVP Rehearsal + +Run and prove the complete MVP path locally and in staging-testnet with value-bearing mainnet blocked. + +### Gate 9: V42 Promotion Readiness + +Bind every V42 product artifact, workflow, generated proof, promotion command, source-safety result, and active V42 / draft V43 runtime posture. + +## Explicitly deferred + +- V43+ agentic deposit AssetPack option synthesis remains deferred. +- `/terminal` is not split into `/read` and `/deposit` during V42. +- `/exchange` is not renamed to `/packs` during V42. +- Production-mainnet value-bearing operation remains blocked unless a later promoted canon explicitly admits it. +- V42 Gate 1 does not change route behavior, pipeline behavior, settlement behavior, or demonstration behavior. + +## Pre-Implementation Sequence + +1. Open `version/v42` and `v42/gate-1-mvp-experience-roadmap-opening`. +2. Keep `BITCODE_SPEC.txt` at `V41`. +3. Add the V42 spec family and Gate 1 checker. +4. Update roadmap, docs, package scripts, and workflows for active V41 / draft V42. +5. Validate V42 draft family and V41 active posture. + +## Commit-Body Direction + +V42 commits should name the product path, protocol object, pipeline or route ownership, source-safety boundary, generated artifact or checker, and tests run. diff --git a/BITCODE_SPEC_V42_NOTES.md b/BITCODE_SPEC_V42_NOTES.md new file mode 100644 index 00000000..9d79f471 --- /dev/null +++ b/BITCODE_SPEC_V42_NOTES.md @@ -0,0 +1,80 @@ +# Bitcode Spec V42 Notes + +## Status + +- Version: `V42` +- V42 state: draft opened; notes track reliable MVP experience planning over active V41 +- Current canonical/latest target: `V41` +- Prior canonical anchor: `BITCODE_SPEC_V41.md` +- Prior generated proof appendix: `BITCODE_SPEC_V41_PROVEN.md` +- Generated structured artifact inventory: draft `.bitcode/v42-spec-family-report.json`, `.bitcode/v42-canonical-input-report.json`, `.bitcode/v42-canon-posture-drift-report.json`, and later V42 gate artifacts +- Source parity state: notes are source-facing planning until later gates implement and prove product behavior +- Scope: V42 notes for reliable MVP product experience + +## Notes companion rule + +This notes companion records the working V42 product plan and simplified reading. +It does not override `BITCODE_SPEC_V42.md`. +Product behavior changes remain blocked until the relevant V42 gate admits and verifies them. + +## V42 Gate 1 opening note + +Gate 1 is intentionally specification, documentation, workflow, and checker posture only. +It opens the reliable MVP experience version after V41 prompt-program promotion and prepares later gates to implement Depositing, Reading, settlement, delivery, and demonstration behavior without ad hoc scope drift. + +## Depositing shortest-path note + +The V42 Depositing path should minimize the journey from source material to Depository admission proof. +The user needs to know that the source is admitted, searchable for future Need-Fit work, and eligible for BTC compensation if it contributes to a synthesized AssetPack. +The UX can stay simple, but expandable details must show source authority, admission proof, storage projection, search-document posture, compensation route, and repair state. + +## Reading shortest-path note + +The V42 Reading path should be a five-step enterprise flow: + +1. request read; +2. review synthesized Need; +3. request Finding Fits; +4. review source-safe AssetPack measurements and preview metadata; +5. buy, settle, transfer rights, and receive repository delivery. + +The default UI should be guided and low-detail. +The rich execution log, proof roots, telemetry rows, and ledger/storage details remain available on expansion. + +## AssetPack source-safety note + +V42 must make the preview valuable without leaking the source-bearing AssetPack before settlement. +Readers may see measurements, fit confidence, quote posture, selected-fit provenance summaries, proof roots, and source-safe explanations. +They may not see protected source, raw provider responses, protected prompts, private settlement payloads, wallet private material, or unpaid AssetPack source before BTC settlement and BTD rights transfer. + +## AI-reading demonstration note + +The standalone demonstration should prove why Bitcode matters for AI-dominant Reading. +A deposited proprietary or otherwise non-public technical intelligence source should contribute to an AssetPack that measurably improves an AI system's training, prompt/context, or evaluation result beyond what a public-data-only baseline can do. +The demonstration must remain minimal, local, deterministic where feasible, and self-contained inside `protocol-demonstration/`. + +## V43+ agentic depositing roadmap note + +V43 or a later explicitly opened version should evolve the deposit side into an agentic AssetPack option experience for enterprises. +Repository-installed Bitcode Agents should compare a connected enterprise codebase, the current Bitcode Depository, and Reading activity to propose deposit AssetPack options. +Those options should be source-safe, sub-critical, likely positive ROI, and approve/rejectable before Depository admission. +That later version should split `/terminal` into `/read` and `/deposit`, and rename `/exchange` to `/packs` across routes, code naming, docs, and operator vocabulary. + +## Concise current-system reading + +Bitcode is active at V41. +V42 drafts the next canon: the reliable MVP experience for enterprise Depositing and Reading. +The central product promise is that a user can deposit source, request a read, review a synthesized Need, find fitting Depository sources, preview a source-safe AssetPack, pay in BTC/BTD settlement terms, receive rights, and get repository delivery. + +## Simplified-spec reading rule + +Read V42 as shortest credible paths over existing protocol law. +If a product step cannot be routed, stored, replayed, telemetered, proven, and source-safely explained, it is not V42-ready. + +## Non-goals during V42 opening + +- Do not implement product behavior in Gate 1. +- Do not split `/terminal` or rename `/exchange`. +- Do not expose protected source or unpaid AssetPack source. +- Do not bypass Need review before Finding Fits. +- Do not claim settlement, BTD rights transfer, or repository delivery without synchronized ledger/database/storage proof. diff --git a/BITCODE_SPEC_V42_PARITY_MATRIX.md b/BITCODE_SPEC_V42_PARITY_MATRIX.md new file mode 100644 index 00000000..3c22230a --- /dev/null +++ b/BITCODE_SPEC_V42_PARITY_MATRIX.md @@ -0,0 +1,70 @@ +# Bitcode Spec V42 Parity Matrix + +## Status + +- Version: `V42` +- V42 state: draft opened; parity tracks reliable MVP experience gaps and closure gates over active V41 +- Current canonical/latest target: `V41` +- Prior canonical anchor: `BITCODE_SPEC_V41.md` +- Prior generated proof appendix: `BITCODE_SPEC_V41_PROVEN.md` +- Generated structured artifact inventory: draft `.bitcode/v42-spec-family-report.json`, `.bitcode/v42-canonical-input-report.json`, `.bitcode/v42-canon-posture-drift-report.json`, and later V42 gate artifacts +- Source parity state: Gate 1 parity is documentation/checker/workflow posture; product behavior rows remain draft-required until their gates close +- Scope: V42 parity ledger for reliable MVP product experience + +## Purpose + +This matrix records the reliable MVP product surfaces that must become promotion-grade before V42 can replace V41 as active canon. + +## Audit basis + +- `BITCODE_SPEC.txt` -> `V41` +- `BITCODE_SPEC_V41.md` +- `BITCODE_SPEC_V41_PROVEN.md` +- `BITCODE_SPEC_V42.md` +- `BITCODE_SPEC_V42_DELTA.md` +- `BITCODE_SPEC_V42_NOTES.md` +- commercial product routes, packages, pipelines, BTD/ledger code, generated artifacts, workflows, and `protocol-demonstration/` + +## V42 implementation matrix + +| Area | Required V42 result | Source evidence | Judgment | +| --- | --- | --- | --- | +| Draft family | V42 SPEC, DELTA, NOTES, and PARITY files exist over active V41 | `BITCODE_SPEC_V42.md` family | drafted | +| Roadmap truth | Roadmap states V41 active and V42 draft reliable MVP experience | `SPECIFICATIONS_ROADMAP.md` | drafted | +| Gate workflow | Gate quality knows active V41 / draft V42 posture and V42 Gate 1 | `.github/workflows/bitcode-gate-quality.yml` | drafted | +| Canon workflow | Canon quality knows active V41 / draft V42 posture and V42 Gate 1 | `.github/workflows/bitcode-canon-quality.yml` | drafted | +| Depositing shortest path | Source material can be admitted with Depository proof and compensation visibility | later V42 Gate 2 artifact | draft-required | +| Reading state machine | Five-step Reading UX is route-owned, persistent, and source-safe | later V42 Gate 3 artifact | draft-required | +| ReadNeed product closure | Need synthesis, review, feedback, resynthesis, and accepted-Need admission are product-ready | later V42 Gate 4 artifact | draft-required | +| Finding Fits preview and quote | Many-candidate search, selected-fit provenance, source-safe preview, and quote are product-ready | later V42 Gate 5 artifact | draft-required | +| Settlement and delivery | BTC/BTD settlement, rights transfer, compensation, and repository PR delivery are synchronized | later V42 Gate 6 artifact | draft-required | +| AI-reading demonstration | Standalone demonstration proves AssetPack improves AI beyond public-data-only baseline | later V42 Gate 7 artifact | draft-required | +| Local/staging rehearsal | Full MVP path rehearsed locally and in staging-testnet with mainnet blocked | later V42 Gate 8 artifact | draft-required | +| Promotion readiness | V42 proof and workflow promotion ready | later V42 Gate 9 artifact | draft-required | + +## V42 implementation checklist + +| Area | Closure requirement | Judgment | +| --- | --- | --- | +| Gate 1 | Open V42 family, roadmap, docs, workflow posture, package script, and checker | drafted | +| Gate 2 | Depositing shortest path and compensation visibility artifact | draft-required | +| Gate 3 | Reading shortest path state machine artifact | draft-required | +| Gate 4 | ReadNeed review and resynthesis product closure artifact | draft-required | +| Gate 5 | ReadFitsFinding AssetPack preview and quote closure artifact | draft-required | +| Gate 6 | Settlement rights transfer and repository delivery closure artifact | draft-required | +| Gate 7 | AI-reading dominant demonstration MVP artifact | draft-required | +| Gate 8 | Local and staging-testnet full MVP rehearsal artifact | draft-required | +| Gate 9 | Promotion readiness artifact and workflow | draft-required | + +## V42 accepted boundaries + +V42 Gate 1 may open specification, workflow, docs, and validation posture. +It may not implement route, pipeline, settlement, or demonstration behavior. + +V42 later gates may implement product behavior only if source-safe disclosure, Need review, BTD/BTC settlement, depositor compensation, repository delivery, telemetry, and generated proof obligations are represented in tests and artifacts. + +V42 may not split `/terminal` into `/read` and `/deposit`, and may not rename `/exchange` to `/packs`; those are V43+ roadmap items unless explicitly reopened. + +## V42 completion condition + +V42 closes when reliable MVP Depositing, Reading, Finding Fits, AssetPack preview, BTD/BTC settlement, repository delivery, compensation visibility, AI-reading demonstration, local/staging rehearsal, and promotion readiness are all specified, implemented, tested, generated, workflow-bound, source-safe, and promotion-ready. diff --git a/README.md b/README.md index 1e31bd6a..cd3295dc 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # Bitcode Repository `BITCODE_SPEC.txt` is the canonical pointer for active-system work. It currently -resolves to `V40`; V41 is the active draft target for Prompt and PromptPart -excellence after the promoted exhaustive commercial application testing canon. +resolves to `V41`; V42 is the active draft target for reliable MVP product +experience after the promoted Prompt and PromptPart excellence canon. ## Current Product Posture @@ -81,12 +81,12 @@ dry-run support, gate/canon workflow posture, active V41 / draft V42 runtime preparation, and source-safe value-bearing mainnet blocking through `generate:v41-promotion-readiness`, `check:v41-promotion-readiness`, and `check:v41-gate9`. -V42 is now roadmapped as the next MVP experience version: shortest-path -Depositing with later BTC compensation, shortest-path Reading through -Need review/resynthesis, Finding Fits, source-safe AssetPack preview, -BTD/BTC settlement, repository delivery, and an AI-reading dominant -demonstration whose AssetPack measurably improves an AI system beyond -public-data-only performance. +V42 Gate 1 opens the reliable MVP experience specification family over active +V41 with `check:v42-gate1`. V42 is scoped to shortest-path Depositing with +later BTC compensation, shortest-path Reading through Need review/resynthesis, +Finding Fits, source-safe AssetPack preview, BTD/BTC settlement, repository +delivery, and an AI-reading dominant demonstration whose AssetPack measurably +improves an AI system beyond public-data-only performance. V43+ is roadmapped as the later agentic depositing evolution: repository agents synthesize deposit AssetPack options from connected enterprise code, Depository state, and Reading demand; enterprises approve or reject @@ -710,9 +710,9 @@ or promotion validation. ## Key Surfaces - [BITCODE_SPEC.txt](BITCODE_SPEC.txt) is the canonical version pointer. -- [BITCODE_SPEC_V39.md](BITCODE_SPEC_V39.md) is the active promoted spec family. -- [BITCODE_SPEC_V40.md](BITCODE_SPEC_V40.md) is the active draft target. -- [BITCODE_SPEC_V40_PARITY_MATRIX.md](BITCODE_SPEC_V40_PARITY_MATRIX.md) tracks V40 gate parity. +- [BITCODE_SPEC_V41.md](BITCODE_SPEC_V41.md) is the active promoted spec family. +- [BITCODE_SPEC_V42.md](BITCODE_SPEC_V42.md) is the active draft target. +- [BITCODE_SPEC_V42_PARITY_MATRIX.md](BITCODE_SPEC_V42_PARITY_MATRIX.md) tracks V42 gate parity. - [uapi/README.md](uapi/README.md) documents the commercial website/API surface. - [uapi/app/terminal/README.md](uapi/app/terminal/README.md) documents Terminal. - [uapi/app/exchange/README.md](uapi/app/exchange/README.md) documents Exchange. diff --git a/SPECIFICATIONS_ROADMAP.md b/SPECIFICATIONS_ROADMAP.md index a47ba4f5..c652332a 100644 --- a/SPECIFICATIONS_ROADMAP.md +++ b/SPECIFICATIONS_ROADMAP.md @@ -2,12 +2,14 @@ ## Status -- Current active canonical pointer: `BITCODE_SPEC.txt` -> `V40` -- Current active canon: `BITCODE_SPEC_V40.md` -- Current draft target: `BITCODE_SPEC_V41.md`. -- Current working gate: V41 Gate 9 Promotion Readiness. -- Next queued gate after V41 Gate 9: V41 canonical promotion into `main`, then V42 MVP product experience opening. -- Latest closed version: V40 Exhaustive Commercial Application Testing, which promoted test inventory, unit coverage, API integration contracts, Reading pipeline integration, Conversation/Terminal integration, browser E2E visual proof, ledger/database/storage/wallet/delivery synchronization, local/staging rehearsal automation, prompt benchmark smoke, and V40 promotion readiness. +- Current active canonical pointer: `BITCODE_SPEC.txt` -> `V41` +- Current active canon: `BITCODE_SPEC_V41.md` +- Current draft target: `BITCODE_SPEC_V42.md`. +- Current working gate: V42 Gate 1 MVP Experience Roadmap And Spec Opening. +- Next queued gate after V42 Gate 1: V42 Gate 2 Depositing Shortest Path And Compensation Visibility. +- Latest closed version: V41 Prompt And PromptPart Excellence, which promoted PromptPart and Prompt inventory, registry interpolation contracts, Reading prompt baselines, ReadNeedComprehensionSynthesis prompt hardening, ReadFitsFindingSynthesis prompt hardening, Conversation/tool/interface prompt rewrite, prompt benchmark telemetry, and V41 promotion readiness. +- Recent V42 opening anchor: reliable MVP experience opens over promoted V41 with V42 SPEC, DELTA, NOTES, and PARITY files, `check:v42-gate1`, active V41 / draft V42 posture, and a nine-gate plan for shortest-path Depositing, five-step Reading, ReadNeed product closure, ReadFitsFinding preview and quote closure, settlement and repository delivery, AI-reading demonstration, local/staging rehearsal, and promotion readiness. +- Recent V41 closure anchor: V41 canonical promotion updated `BITCODE_SPEC.txt` to `V41`, generated `BITCODE_SPEC_V41_PROVEN.md`, preserved active V41 / draft V42 runtime posture, and closed prompt-program excellence canon. - Recent V40 closure anchor: V40 canonical promotion updated `BITCODE_SPEC.txt` to `V40`, generated `BITCODE_SPEC_V40_PROVEN.md`, preserved active V40 / draft V41 runtime posture, and closed exhaustive commercial application testing canon. - Recent V39 closure anchor: V39 canonical promotion updated `BITCODE_SPEC.txt` to `V39`, generated `BITCODE_SPEC_V39_PROVEN.md`, preserved active V39 / draft V40 runtime posture, and closed commercial Reading readiness canon. - V39 Gate 9 closure anchor: commercial Reading readiness now owns package-backed `ReadingInterfaceProductParity`, deterministic `.bitcode/v39-interface-conversation-product-parity.json`, Terminal/Conversation/API/MCP/ChatGPT/package-consumer no-bypass rows, source-safe contract readback, BTD interface root composition, focused package/interface tests, and workflow wiring through `check:v39-gate9`. @@ -33,8 +35,7 @@ - V41 Gate 7 closure anchor: prompt-program work now owns package-backed `V41ConversationToolInterfacePromptRewrite` source, deterministic `.bitcode/v41-conversation-tool-interface-prompt-rewrite.json`, 9 source-safe rewrite rows, 60 passing source predicates, Conversation PTRR PromptPart rewrites, Terminal conversation system prompt boundaries, rich execution-log prompt/result disclosure, DocCodeToolPrompt and ToolPromptRegistry hierarchy, MCP API/public API contract prompt posture, ChatGPT App action/tool prompt posture, Terminal/public summary source-safety, Gate 2 through Gate 6 dependency roots, V38 Conversation/tool parity binding, protocol tests, workflow wiring, and `check:v41-gate7`. - V41 Gate 8 closure anchor: prompt-program work now owns package-backed `V41PromptProgramBenchmarkReport` source, deterministic `.bitcode/v41-prompt-program-benchmark-report.json`, 9 source-safe benchmark telemetry rows, post-rewrite PromptPart and Prompt deltas, benchmark fixture projections, prompt registry lineage, V38 PromptBenchmark/Failsafe/Thricified/inference telemetry roots, V39 operational repair readback roots, V40 prompt benchmark smoke roots, V41 Gate 2 through Gate 7 dependency roots, rich execution-log telemetry projections, repair hook and parsed-output redaction posture, protocol tests, workflow wiring, and `check:v41-gate8`. - V41 Gate 9 closure anchor: prompt-program work now owns package-backed `V41PromotionReadinessReport` source, deterministic `.bitcode/v41-promotion-readiness-report.json`, `BITCODE_SPEC_V41_PROVEN.md` generation support, `v41-canon-promotion.yml`, promotion command dry-run support, gate/canon workflow posture, active V41 / draft V42 runtime preparation, all V41 prompt-program artifacts covered, source-safe, parseable, and workflow-bound, and value-bearing mainnet admission blocked through `check:v41-gate9`. -- Forward planning note: V41 should focus singularly on Prompt and PromptPart implementation quality: prompts as programs. V38's inference correctness hardening and V40's testing/benchmark depth should empower V41 to examine every raw PromptPart, every composed Prompt, every benchmark, every meaningfully benchmarkable semantic part, title, template, interpolation contract, registry binding, inference callsite, and downstream parsed return type; then repartition, retitle, rewrite, catalogue, and validate them across Reading pipelines and conversational interactions. V41 should primarily harden `ReadNeedComprehensionSynthesis` and `ReadFitsFindingSynthesis` prompt surfaces while also covering conversational and other inference prompts with the same catalogue-and-benchmark discipline. -- Forward planning note: V42 should focus on the reliable MVP product experience after V41's prompt-program hardening. Depositing should become the shortest path to adding any source material, proving its Depository admission, and later receiving BTC compensation when that deposit contributes to a synthesized AssetPack. Reading should become the shortest path to submitting a Read Request, reviewing or resynthesizing Bitcode's synthesized Need, requesting Finding Fits, reviewing source-safe AssetPack measurements and preview metadata, buying the AssetPack through BTD/BTC settlement semantics, and receiving post-settlement repository delivery. The demonstration should be AI-reading dominant: any deposit source can contribute proprietary or otherwise non-public training, prompt, context, or evaluation material to an AssetPack that measurably improves an AI system beyond a public-data-only baseline. +- Forward planning note: V42 focuses on the reliable MVP product experience after V41's prompt-program hardening. Depositing should become the shortest path to adding any source material, proving its Depository admission, and later receiving BTC compensation when that deposit contributes to a synthesized AssetPack. Reading should become the shortest path to submitting a Read Request, reviewing or resynthesizing Bitcode's synthesized Need, requesting Finding Fits, reviewing source-safe AssetPack measurements and preview metadata, buying the AssetPack through BTD/BTC settlement semantics, and receiving post-settlement repository delivery. The demonstration should be AI-reading dominant: any deposit source can contribute proprietary or otherwise non-public training, prompt, context, or evaluation material to an AssetPack that measurably improves an AI system beyond a public-data-only baseline. - Forward planning note: V43+ should evolve the deposit side into an agentic AssetPack option experience for enterprises that own connected codebases. Bitcode Agents installed on an enterprise repository should compare the repository, the current Bitcode Depository, and current Reading activity to propose deposit AssetPack options: unminted AssetPacks in all but BTD that can later become BTD only when a Reader's industrial Need-Fit mints one. The deposit pipeline should optimize for enterprise IP governance by filtering out critical IP, estimating whether selling would be positive ROI against development cost and expected Read demand, and presenting everything else as approve/reject deposit options. The product route plan for that version is to split `/terminal` into `/read` for Reading and `/deposit` for agentic deposit AssetPack option review, and to rename `/exchange` to `/packs` across routes, code names, and docs. - V34 Gate 2 closure anchor: deployment-depth now owns package-backed `DeploymentHostCapabilityCatalog` and `EnvironmentLaneContract` source, deterministic `.bitcode/v34-deployment-host-capability-catalog.json` and `.bitcode/v34-environment-lane-contracts.json`, and visible `value-bearing-mainnet` blocking through `blocked_future_canon_required`. - V34 Gate 3 closure anchor: deployment-depth now owns package-backed `DistributedExecutionRuntimeReceipt` source, deterministic `.bitcode/v34-distributed-execution-runtime-receipts.json`, `request_response_not_required` long-running work posture, and source-safe roots for pipeline, PTRR agent, ThricifiedGeneration, tool, ledger, wallet, proof, object-storage, and repair work. @@ -106,9 +107,9 @@ They are referenced here for specification history only; active implementation w ## Source Families - Legacy ENGI specifications: `_legacy/ENGI_SPEC_V1.md` through `_legacy/ENGI_SPEC_V25.md`, with companion `NOTES`, `DELTA`, `PARITY_MATRIX`, `SYSTEM_PARITY_MATRIX`, `PROVEN`, and audit files where present. -- Active Bitcode specifications: `BITCODE_SPEC_V40.md`, with companion `DELTA`, `NOTES`, `PARITY_MATRIX`, and `PROVEN` files. -- Promoted Bitcode history: `BITCODE_SPEC_V26.md` through `BITCODE_SPEC_V39.md`, with companion `DELTA`, `NOTES`, `PARITY_MATRIX`, and `PROVEN` files. -- Draft and future Bitcode specifications: `BITCODE_SPEC_V41.md`, with companion `DELTA`, `NOTES`, and `PARITY_MATRIX` files, as the active draft target over promoted V40; planned V42 follows V41 as the MVP Depositing, Reading, and AI-reading demonstration experience version. +- Active Bitcode specifications: `BITCODE_SPEC_V41.md`, with companion `DELTA`, `NOTES`, `PARITY_MATRIX`, and `PROVEN` files. +- Promoted Bitcode history: `BITCODE_SPEC_V26.md` through `BITCODE_SPEC_V40.md`, with companion `DELTA`, `NOTES`, `PARITY_MATRIX`, and `PROVEN` files. +- Draft and future Bitcode specifications: `BITCODE_SPEC_V42.md`, with companion `DELTA`, `NOTES`, and `PARITY_MATRIX` files, as the active draft target over promoted V41; planned V43+ follows V42 as the agentic deposit-side AssetPack option and route-split evolution. - Specification discipline references: `BITCODE_SPECIFYING.md` and `BITCODE_SPEC_TEMPLATEGUIDE.md`. ## Roadmap @@ -154,9 +155,9 @@ They are referenced here for specification history only; active implementation w | V37 | `BITCODE_SPEC_V37.md` | promoted historical Bitcode canon | Website Conversations after V36: website conversation interface, stream UI/event contracts, fullscreen writing mode, conversation-to-Terminal handoff, source selectors, route-local chat history, persistence/privacy/redaction, telemetry/proof/docs, and any conversational UX not covered by the V28 ChatGPT App MVP. | | V38 | `BITCODE_SPEC_V38.md` | promoted historical Bitcode canon | Inference correctness after V37: pipeline execution call stack, PTRR agents, FailsafeGenerationSequence over ThricifiedGeneration, prompt registry composition, PromptPart and Prompt benchmarking, Reading pipeline inference, ReadFitsFindingSynthesis depository search and embeddings, source-safe inference telemetry, local/staging rehearsal, and promotion readiness. | | V39 | `BITCODE_SPEC_V39.md` | promoted historical Bitcode canon | Commercial Reading readiness after V38: Depository supply indexing, enterprise five-step Reading UX, ReadNeed review/resynthesis, ReadFitsFinding many-candidate runtime and replay, source-safe AssetPack preview and deterministic BTC quote, settlement, BTD rights transfer, post-settlement delivery, ledger/database/storage synchronization, operational telemetry/repair, interface parity, local/staging rehearsal, and promotion readiness. | -| V40 | `BITCODE_SPEC_V40.md` | active canon | Exhaustive commercial application testing depth after V39: rich browser E2E for all website interactions and state possibilities, visual/screenshot comparison coverage, API and integration suites for pipelines, conversations, routes, ledger/database/storage synchronization, unit coverage for packages, primitives, isolated implementations, real commercial implementations, local/staging rehearsal automation, prompt benchmark smoke, and promotion readiness. | -| V41 | `BITCODE_SPEC_V41.md` | active draft target | Prompt and PromptPart excellence, treating prompts as programs: audit every raw PromptPart and composed Prompt, run and harden benchmarks, repartition prompts into meaningfully benchmarkable semantic parts, retitle and rewrite PromptParts/Prompts where optimal, catalogue registry bindings, interpolation contracts, benchmark fixtures, benchmark outputs, inference callsites, and parsed return types, and elevate all Reading and Conversation inference points after V38 inference scaffolding and V40 testing depth make that work measurable. The primary surface is Reading, especially `ReadNeedComprehensionSynthesis` and `ReadFitsFindingSynthesis`; conversations and other inference prompts follow with the same benchmarkable catalogue discipline. | -| V42 | `BITCODE_SPEC_V42.md` | planned future | Reliable MVP experience after V41 prompt hardening: shortest-path Depositing for any source material with Depository admission proof and later BTC compensation when deposits contribute to synthesized AssetPacks; shortest-path Reading for Read Request submission, synthesized Need review/resynthesis, Finding Fits, source-safe AssetPack measurement/preview review, BTD/BTC purchase and settlement, and repository delivery; and an AI-reading dominant demonstration proving an AssetPack can improve an AI system's training, prompt/context, or evaluation performance beyond public-data-only baselines using proprietary or otherwise non-public deposit and read materials. | +| V40 | `BITCODE_SPEC_V40.md` | promoted historical Bitcode canon | Exhaustive commercial application testing depth after V39: rich browser E2E for all website interactions and state possibilities, visual/screenshot comparison coverage, API and integration suites for pipelines, conversations, routes, ledger/database/storage synchronization, unit coverage for packages, primitives, isolated implementations, real commercial implementations, local/staging rehearsal automation, prompt benchmark smoke, and promotion readiness. | +| V41 | `BITCODE_SPEC_V41.md` | active canon | Prompt and PromptPart excellence, treating prompts as programs: audit every raw PromptPart and composed Prompt, run and harden benchmarks, repartition prompts into meaningfully benchmarkable semantic parts, retitle and rewrite PromptParts/Prompts where optimal, catalogue registry bindings, interpolation contracts, benchmark fixtures, benchmark outputs, inference callsites, and parsed return types, and elevate all Reading and Conversation inference points after V38 inference scaffolding and V40 testing depth make that work measurable. The primary surface is Reading, especially `ReadNeedComprehensionSynthesis` and `ReadFitsFindingSynthesis`; conversations and other inference prompts follow with the same benchmarkable catalogue discipline. | +| V42 | `BITCODE_SPEC_V42.md` | active draft target | Reliable MVP experience after V41 prompt hardening: shortest-path Depositing for any source material with Depository admission proof and later BTC compensation when deposits contribute to synthesized AssetPacks; shortest-path Reading for Read Request submission, synthesized Need review/resynthesis, Finding Fits, source-safe AssetPack measurement/preview review, BTD/BTC purchase and settlement, and repository delivery; and an AI-reading dominant demonstration proving an AssetPack can improve an AI system's training, prompt/context, or evaluation performance beyond public-data-only baselines using proprietary or otherwise non-public deposit and read materials. | | V43+ | future specification family | planned future | Agentic enterprise deposit-side AssetPack option synthesis after the MVP paths are reliable: repository-installed Bitcode Agents compare a connected enterprise codebase, the Bitcode Depository, and Reading activity to propose deposit AssetPack options for review; filter out critical IP; estimate positive ROI against development cost and likely demand; let enterprises approve/reject options for Depository admission; split `/terminal` into `/read` and `/deposit`; and rename `/exchange` to `/packs` throughout product routes, code naming, docs, and operator vocabulary. | ## Current Planning Spine @@ -176,16 +177,16 @@ They are referenced here for specification history only; active implementation w 13. V38 promoted inference correctness, Reading pipeline search, prompt benchmarking, source-safe inference telemetry, and the practical PTRR/Failsafe/Thricified call stack. 14. V39 promoted commercial Reading readiness: Depository supply indexing, enterprise Reading UX, accepted-Need-gated Finding Fits, AssetPack preview/quote, settlement, rights transfer, delivery, telemetry/repair, interface parity, local/staging rehearsal, and promotion readiness. 15. V40 promoted exhaustive testing for the rich commercial application: E2E, visual, screenshot comparison, interaction/state matrices, integration, unit coverage, ledger/storage synchronization, local/staging rehearsal automation, and prompt benchmark smoke across the website, APIs, pipelines, conversations, packages, primitives, and real implementations. -16. V41 is the current prompts-as-programs draft target after V40: every PromptPart, Prompt composition, benchmark, meaningfully benchmarkable semantic division, title, template, interpolation contract, registry binding, inference callsite, benchmark result, and parsed return type should be examined and improved across Reading and Conversation inference, using V38's inference correctness scaffolding and V40's testing/benchmarking depth as the measurement base. -17. V42 is planned as the reliable MVP experience version after V41: refine the shortest path to Depositing any source material and later receiving BTC compensation, refine the shortest path to Reading from request through synthesized Need review/resynthesis, Finding Fits, source-safe AssetPack preview, BTD/BTC purchase, settlement, and repository delivery, and ship a strong AI-reading dominant demonstration where Bitcode reads non-public technical intelligence into an AssetPack that measurably improves an AI system beyond a public-data-only baseline. +16. V41 promoted prompts-as-programs after V40: every PromptPart, Prompt composition, benchmark, meaningfully benchmarkable semantic division, title, template, interpolation contract, registry binding, inference callsite, benchmark result, and parsed return type was examined and improved across Reading and Conversation inference, using V38's inference correctness scaffolding and V40's testing/benchmarking depth as the measurement base. +17. V42 is the active reliable MVP experience draft after V41: refine the shortest path to Depositing any source material and later receiving BTC compensation, refine the shortest path to Reading from request through synthesized Need review/resynthesis, Finding Fits, source-safe AssetPack preview, BTD/BTC purchase, settlement, and repository delivery, and ship a strong AI-reading dominant demonstration where Bitcode reads non-public technical intelligence into an AssetPack that measurably improves an AI system beyond a public-data-only baseline. 18. V43+ is planned as the agentic deposit-side product evolution after the MVP paths are reliable: enterprises should get deposit AssetPack options synthesized from their connected repositories and Bitcode's observed Depository/Reading demand, then approve or reject source-safe, sub-critical, positive-ROI options for Depository admission. ## Boundary Rules - Do not treat `_legacy/` ENGI specifications as active implementation authority. - Do use `_legacy/` specifications to understand why current Bitcode concepts exist and what must not regress. -- V41+ work must build on V40 active canon and V27 `$BTD` law unless a future promoted spec explicitly supersedes it. -- V42 is roadmap/planning only until V41 promotion opens it as the active draft target; V41 remains singularly scoped to Prompt and PromptPart excellence. -- V43+ agentic depositing, `/read` and `/deposit` route separation, and `/packs` renaming are roadmap/planning only until a later version explicitly opens them; V41 remains singularly scoped to Prompt and PromptPart excellence. +- V42+ work must build on V41 active canon and V27 `$BTD` law unless a future promoted spec explicitly supersedes it. +- V42 is the active draft target for reliable MVP experience; Gate 1 is specification/documentation/workflow posture only and later gates own implementation. +- V43+ agentic depositing, `/read` and `/deposit` route separation, and `/packs` renaming are roadmap/planning only until a later version explicitly opens them; V42 remains scoped to reliable MVP Depositing, Reading, settlement, delivery, and AI-reading demonstration. - No implementation route should be versioned by spec number; source should move in place with the active canon. - Future notes files are planning memory only until their version is explicitly opened as the draft-target SPEC family. diff --git a/package.json b/package.json index f4d44d0d..be225050 100644 --- a/package.json +++ b/package.json @@ -303,6 +303,7 @@ "generate:v41-promotion-readiness": "node scripts/generate-v41-promotion-readiness-report.mjs", "check:v41-promotion-readiness": "node scripts/generate-v41-promotion-readiness-report.mjs --check", "check:v41-gate9": "node scripts/check-v41-gate9-promotion-readiness.mjs", + "check:v42-gate1": "node scripts/check-v42-gate1-mvp-experience-roadmap-opening.mjs", "generate:v38-inference-surface-inventory": "node scripts/generate-v38-inference-surface-inventory.mjs", "check:v38-inference-surface-inventory": "node scripts/generate-v38-inference-surface-inventory.mjs --check", "check:v38-gate2": "node scripts/check-v38-gate2-inference-surface-inventory.mjs", diff --git a/packages/protocol/README.md b/packages/protocol/README.md index 5ed392bb..9117436d 100644 --- a/packages/protocol/README.md +++ b/packages/protocol/README.md @@ -15,7 +15,7 @@ inventories, but it is not a commercial runtime implementation dependency. Current exported commercial helpers include: -- active/draft canon posture (`V41` active, `V42` draft after V41 promotion); +- active/draft canon posture (`V41` active, `V42` draft); - spec-family and canonical-input validation helpers; - canon-posture drift reporting; - `DocumentationSurfaceCatalog` helpers for V35 documentation surface proof; @@ -176,6 +176,14 @@ runtime canon rewriting, dry-run promotion, source-safety, and value-bearing mainnet blocking without serializing raw prompts, provider responses, protected source, credentials, private settlement payloads, wallet material, or unpaid AssetPack source. +V42 Gate 1 is wired through `check:v42-gate1` and opens the reliable MVP +experience specification family for the `V41` active, `V42` draft posture: +shortest-path Depositing with Depository admission proof and later BTC +compensation visibility; shortest-path Reading through Read Request, reviewed +Need, Finding Fits, source-safe AssetPack preview, BTD/BTC settlement, rights +transfer, and repository delivery; and an AI-reading dominant standalone +demonstration that proves an AssetPack can improve an AI system beyond a +public-data-only baseline. V40 Gate 2 adds `V40TestInventoryCoverageMatrix` through `packages/protocol/src/canonical/v40-test-inventory-coverage-matrix.js`, `packages/protocol/test/v40-test-inventory-coverage-matrix.test.js`, diff --git a/scripts/check-v42-gate1-mvp-experience-roadmap-opening.mjs b/scripts/check-v42-gate1-mvp-experience-roadmap-opening.mjs new file mode 100644 index 00000000..b6cdea90 --- /dev/null +++ b/scripts/check-v42-gate1-mvp-experience-roadmap-opening.mjs @@ -0,0 +1,176 @@ +#!/usr/bin/env node + +import { execFileSync } from 'node:child_process'; +import { existsSync, readFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const defaultRepoRoot = path.resolve(__dirname, '..'); + +function read(root, relativePath) { + return readFileSync(path.join(root, relativePath), 'utf8'); +} + +function exists(root, relativePath) { + return existsSync(path.join(root, relativePath)); +} + +function git(root, args) { + return execFileSync('git', args, { cwd: root, encoding: 'utf8' }).trim(); +} + +function assertCheck(failures, condition, message) { + if (!condition) failures.push(message); +} + +function parseArgs(argv) { + const args = { repoRoot: defaultRepoRoot, skipBranchCheck: false }; + for (let index = 0; index < argv.length; index += 1) { + const arg = argv[index]; + if (arg === '--repo-root') args.repoRoot = path.resolve(argv[++index]); + else if (arg === '--skip-branch-check') args.skipBranchCheck = true; + else if (arg === '--help' || arg === '-h') args.help = true; + else throw new Error(`Unknown argument ${arg}`); + } + return args; +} + +function printHelp() { + process.stdout.write( + [ + 'Usage: node scripts/check-v42-gate1-mvp-experience-roadmap-opening.mjs [--skip-branch-check] [--repo-root ]', + '', + 'Checks V42 Gate 1 spec family, roadmap, branch, workflow, docs, and active V41 / draft V42 reliable MVP experience posture.' + ].join('\n') + ); + process.stdout.write('\n'); +} + +function main() { + const args = parseArgs(process.argv.slice(2)); + if (args.help) { + printHelp(); + return; + } + + const root = args.repoRoot; + const failures = []; + const pointer = read(root, 'BITCODE_SPEC.txt').trim(); + + assertCheck(failures, pointer === 'V41', `BITCODE_SPEC.txt must remain V41 during V42 gate work. Observed ${pointer || 'empty'}.`); + + if (!args.skipBranchCheck) { + const branch = git(root, ['branch', '--show-current']); + assertCheck( + failures, + branch === 'version/v42' || /^v42\/gate-\d+-[a-z0-9][a-z0-9-]*$/u.test(branch), + `V42 work must occur on version/v42 or v42/gate-N-* branches. Observed ${branch || 'detached HEAD'}.` + ); + } + + for (const relativePath of [ + 'BITCODE_SPEC_V42.md', + 'BITCODE_SPEC_V42_DELTA.md', + 'BITCODE_SPEC_V42_NOTES.md', + 'BITCODE_SPEC_V42_PARITY_MATRIX.md', + 'SPECIFICATIONS_ROADMAP.md', + 'README.md', + 'packages/protocol/README.md', + 'protocol-demonstration/README.md', + '.github/pull_request_template.md', + '.github/workflows/bitcode-gate-quality.yml', + '.github/workflows/bitcode-canon-quality.yml', + 'package.json' + ]) { + assertCheck(failures, exists(root, relativePath), `Missing required V42 Gate 1 file: ${relativePath}`); + } + + const spec = read(root, 'BITCODE_SPEC_V42.md'); + const delta = read(root, 'BITCODE_SPEC_V42_DELTA.md'); + const notes = read(root, 'BITCODE_SPEC_V42_NOTES.md'); + const parity = read(root, 'BITCODE_SPEC_V42_PARITY_MATRIX.md'); + const roadmap = read(root, 'SPECIFICATIONS_ROADMAP.md'); + const readme = read(root, 'README.md'); + const protocolReadme = read(root, 'packages/protocol/README.md'); + const demoReadme = read(root, 'protocol-demonstration/README.md'); + const prTemplate = read(root, '.github/pull_request_template.md'); + const packageJson = read(root, 'package.json'); + const gateWorkflow = read(root, '.github/workflows/bitcode-gate-quality.yml'); + const canonWorkflow = read(root, '.github/workflows/bitcode-canon-quality.yml'); + + for (const [label, content] of [ + ['V42 SPEC', spec], + ['V42 DELTA', delta], + ['V42 NOTES', notes], + ['V42 PARITY', parity] + ]) { + assertCheck(failures, content.includes('Current canonical/latest target: `V41`'), `${label} must declare V41 as current canonical/latest target.`); + } + + for (const phrase of [ + 'reliable MVP', + 'shortest-path Depositing', + 'shortest-path Reading', + 'ReadNeedComprehensionSynthesis', + 'ReadFitsFindingSynthesis', + 'source-safe AssetPack preview', + 'BTD/BTC settlement', + 'BTD rights transfer', + 'repository delivery', + 'depositor compensation', + 'AI-reading dominant demonstration', + 'public-data-only baseline', + 'Need review', + 'Finding Fits' + ]) { + assertCheck( + failures, + spec.includes(phrase) || delta.includes(phrase) || notes.includes(phrase) || roadmap.includes(phrase), + `V42 opening must name ${phrase}.` + ); + } + + for (const gate of [ + 'Gate 1: MVP Experience Roadmap And Spec Opening', + 'Gate 2: Depositing Shortest Path And Compensation Visibility', + 'Gate 3: Reading Shortest Path State Machine', + 'Gate 4: ReadNeed Review And Resynthesis Product Closure', + 'Gate 5: ReadFitsFinding AssetPack Preview And Quote Closure', + 'Gate 6: Settlement Rights Transfer And Repository Delivery Closure', + 'Gate 7: AI-Reading Dominant Demonstration MVP', + 'Gate 8: Local And Staging-Testnet Full MVP Rehearsal', + 'Gate 9: V42 Promotion Readiness' + ]) { + assertCheck(failures, spec.includes(gate) || delta.includes(gate), `V42 gate plan is missing ${gate}.`); + } + + assertCheck(failures, roadmap.includes('Current active canonical pointer: `BITCODE_SPEC.txt` -> `V41`'), 'Roadmap must state V41 active pointer.'); + assertCheck(failures, /Current working gate: V42 Gate (?:1|2|3|4|5|6|7|8|9)\b/u.test(roadmap), 'Roadmap must state active V42 gate progression.'); + assertCheck(failures, roadmap.includes('| V42 | `BITCODE_SPEC_V42.md` | active draft target |'), 'Roadmap must list V42 as active draft target.'); + assertCheck(failures, readme.includes('resolves to `V41`; V42 is the active draft target'), 'README must state V41 active / V42 draft posture.'); + assertCheck(failures, protocolReadme.includes('V42 Gate 1') && protocolReadme.includes('V41` active, `V42` draft'), 'Protocol README must document V42 Gate 1 active/draft posture.'); + assertCheck(failures, demoReadme.includes('`BITCODE_SPEC.txt -> V41`'), 'Demonstration README must keep V41 pointer truth.'); + assertCheck(failures, prTemplate.includes('V42 Gate N:'), 'PR template must use V42 gate title examples.'); + assertCheck(failures, packageJson.includes('"check:v42-gate1"'), 'package.json must expose check:v42-gate1.'); + assertCheck(failures, gateWorkflow.includes('check-v42-gate1-mvp-experience-roadmap-opening.mjs'), 'Gate workflow must run V42 Gate 1 checker.'); + assertCheck(failures, canonWorkflow.includes('check-v42-gate1-mvp-experience-roadmap-opening.mjs'), 'Canon workflow must run V42 Gate 1 checker.'); + + if (failures.length > 0) { + process.stderr.write('V42 Gate 1 MVP experience roadmap opening check failed:\n'); + for (const failure of failures.filter(Boolean)) process.stderr.write(`- ${failure}\n`); + process.exitCode = 1; + return; + } + + process.stdout.write('V42 Gate 1 MVP experience roadmap opening check passed.\n'); +} + +try { + main(); +} catch (error) { + const detail = error instanceof Error ? error.message : String(error); + process.stderr.write(`${detail}\n`); + process.exitCode = 1; +} From ee481197660748815f2b066a50c4e2cf153c37b1 Mon Sep 17 00:00:00 2001 From: Garrett Maring Date: Tue, 26 May 2026 16:30:05 -0300 Subject: [PATCH 02/35] V42 Gate 1: Preserve promoted canon proof compatibility Teach V40 and V41 protocol proof predicates to accept the promoted V41 / draft V42 roadmap posture while preserving their original closure-anchor checks. Extend the protocol package boundary test to recognize the current V41 active canon and V42 draft target. --- .../src/canonical/v40-api-integration-contracts.js | 7 ++++++- .../src/canonical/v40-browser-e2e-visual-proof.js | 9 ++++++++- .../canonical/v40-conversation-terminal-integration.js | 7 ++++++- .../v40-reading-pipeline-integration-coverage.js | 7 ++++++- .../v41-conversation-tool-interface-prompt-rewrite.js | 8 +++++--- .../src/canonical/v41-prompt-program-benchmark-report.js | 6 ++++-- .../canonical/v41-readfitsfinding-prompt-hardening.js | 4 +++- packages/protocol/test/protocol-package-boundary.test.js | 1 + 8 files changed, 39 insertions(+), 10 deletions(-) diff --git a/packages/protocol/src/canonical/v40-api-integration-contracts.js b/packages/protocol/src/canonical/v40-api-integration-contracts.js index d95610c9..fca418ff 100644 --- a/packages/protocol/src/canonical/v40-api-integration-contracts.js +++ b/packages/protocol/src/canonical/v40-api-integration-contracts.js @@ -365,7 +365,12 @@ function buildPredicateResults(repoRoot) { predicateResult('notes-document-gate4', 'BITCODE_SPEC_V40_NOTES.md', notes.includes('Gate 4 implementation notes') && notes.includes('API route integration contracts')), predicateResult('parity-documents-gate4', 'BITCODE_SPEC_V40_PARITY_MATRIX.md', parity.includes('v40-api-integration-contracts') && parity.includes('| Gate 4 | API/route integration artifact | implemented |')), predicateResult('roadmap-advanced-through-gate4', 'SPECIFICATIONS_ROADMAP.md', roadmap.includes('V40 Gate 4 closure anchor')), - predicateResult('roadmap-documents-v41-prompt-programs', 'SPECIFICATIONS_ROADMAP.md', roadmap.includes('V41 should focus singularly on Prompt and PromptPart implementation') && roadmap.includes('meaningfully benchmarkable semantic parts')), + predicateResult( + 'roadmap-documents-v41-prompt-programs', + 'SPECIFICATIONS_ROADMAP.md', + roadmap.includes('| V41 | `BITCODE_SPEC_V41.md` | active canon | Prompt and PromptPart excellence') && + roadmap.includes('meaningfully benchmarkable semantic parts'), + ), ...rowPredicates, ]; } diff --git a/packages/protocol/src/canonical/v40-browser-e2e-visual-proof.js b/packages/protocol/src/canonical/v40-browser-e2e-visual-proof.js index 11303fde..ae71515e 100644 --- a/packages/protocol/src/canonical/v40-browser-e2e-visual-proof.js +++ b/packages/protocol/src/canonical/v40-browser-e2e-visual-proof.js @@ -495,7 +495,14 @@ function buildPredicateResults(repoRoot) { predicateResult('delta-documents-gate7', 'BITCODE_SPEC_V40_DELTA.md', delta.includes('Gate 7 closes with package-backed `V40BrowserE2eVisualProof`')), predicateResult('notes-document-gate7', 'BITCODE_SPEC_V40_NOTES.md', notes.includes('Gate 7 implementation notes') && notes.includes('browser E2E, visual, accessibility, and responsive proof')), predicateResult('parity-documents-gate7', 'BITCODE_SPEC_V40_PARITY_MATRIX.md', parity.includes('v40-browser-e2e-visual-proof') && parity.includes('| Gate 7 | Browser/visual/accessibility/responsive artifact | implemented |')), - predicateResult('roadmap-advanced-through-gate7', 'SPECIFICATIONS_ROADMAP.md', (/Current working gate: V40 Gate (?:7|8|9|10|11)\b/u.test(roadmap) || roadmap.includes('Latest closed version: V40')) && roadmap.includes('V40 Gate 7 closure anchor')), + predicateResult( + 'roadmap-advanced-through-gate7', + 'SPECIFICATIONS_ROADMAP.md', + (/Current working gate: V40 Gate (?:7|8|9|10|11)\b/u.test(roadmap) || + roadmap.includes('Latest closed version: V40') || + roadmap.includes('Recent V40 closure anchor')) && + roadmap.includes('V40 Gate 7 closure anchor'), + ), predicateResult('readmes-document-gate7', 'README.md', rootReadme.includes('V40 Gate 7') && protocolReadme.includes('V40BrowserE2eVisualProof')), ...rowPredicates, ]; diff --git a/packages/protocol/src/canonical/v40-conversation-terminal-integration.js b/packages/protocol/src/canonical/v40-conversation-terminal-integration.js index 86aa44c4..cf9a8196 100644 --- a/packages/protocol/src/canonical/v40-conversation-terminal-integration.js +++ b/packages/protocol/src/canonical/v40-conversation-terminal-integration.js @@ -479,7 +479,12 @@ function buildPredicateResults(repoRoot) { roadmap.includes('Recent V40 closure anchor')), ), predicateResult('readmes-document-gate6', 'README.md', rootReadme.includes('V40 Gate 6') && protocolReadme.includes('V40ConversationTerminalIntegration')), - predicateResult('roadmap-preserves-v41-prompt-programs', 'SPECIFICATIONS_ROADMAP.md', roadmap.includes('V41 should focus singularly on Prompt and PromptPart implementation') && roadmap.includes('prompts as programs')), + predicateResult( + 'roadmap-preserves-v41-prompt-programs', + 'SPECIFICATIONS_ROADMAP.md', + roadmap.includes('| V41 | `BITCODE_SPEC_V41.md` | active canon | Prompt and PromptPart excellence') && + roadmap.includes('prompts as programs'), + ), ...rowPredicates, ]; } diff --git a/packages/protocol/src/canonical/v40-reading-pipeline-integration-coverage.js b/packages/protocol/src/canonical/v40-reading-pipeline-integration-coverage.js index aee23947..520289cd 100644 --- a/packages/protocol/src/canonical/v40-reading-pipeline-integration-coverage.js +++ b/packages/protocol/src/canonical/v40-reading-pipeline-integration-coverage.js @@ -497,7 +497,12 @@ function buildPredicateResults(repoRoot) { roadmap.includes('Latest closed version: V40 Exhaustive Commercial Application Testing') || roadmap.includes('Recent V40 closure anchor')), ), - predicateResult('roadmap-preserves-v41-prompt-programs', 'SPECIFICATIONS_ROADMAP.md', roadmap.includes('V41 should focus singularly on Prompt and PromptPart implementation') && roadmap.includes('prompts as programs')), + predicateResult( + 'roadmap-preserves-v41-prompt-programs', + 'SPECIFICATIONS_ROADMAP.md', + roadmap.includes('| V41 | `BITCODE_SPEC_V41.md` | active canon | Prompt and PromptPart excellence') && + roadmap.includes('prompts as programs'), + ), ...rowPredicates, ]; } diff --git a/packages/protocol/src/canonical/v41-conversation-tool-interface-prompt-rewrite.js b/packages/protocol/src/canonical/v41-conversation-tool-interface-prompt-rewrite.js index 2efed98b..7b79069c 100644 --- a/packages/protocol/src/canonical/v41-conversation-tool-interface-prompt-rewrite.js +++ b/packages/protocol/src/canonical/v41-conversation-tool-interface-prompt-rewrite.js @@ -866,9 +866,11 @@ function buildPredicateResults(repoRoot) { 'conversation-tool-interface-tests-docs-workflows', SOURCE_ROOTS.roadmap, roadmap.includes('V41 Gate 7 closure anchor') && - /Current working gate: V41 Gate (?:7|8|9)/u.test(roadmap) && - (/Next queued gate after V41 Gate (?:7|8): V41 (?:Prompt Benchmark Report And Telemetry Integration|Promotion Readiness)/u.test(roadmap) || - /V41 Gate 9 closure anchor/u.test(roadmap)), + ((/Current working gate: V41 Gate (?:7|8|9)/u.test(roadmap) && + (/Next queued gate after V41 Gate (?:7|8): V41 (?:Prompt Benchmark Report And Telemetry Integration|Promotion Readiness)/u.test(roadmap) || + /V41 Gate 9 closure anchor/u.test(roadmap))) || + /Latest closed version: V41 Prompt And PromptPart Excellence/u.test(roadmap) || + /Recent V41 closure anchor/u.test(roadmap)), ), predicate( 'readmes-document-gate7-helpers', diff --git a/packages/protocol/src/canonical/v41-prompt-program-benchmark-report.js b/packages/protocol/src/canonical/v41-prompt-program-benchmark-report.js index f721f55c..e9bbf561 100644 --- a/packages/protocol/src/canonical/v41-prompt-program-benchmark-report.js +++ b/packages/protocol/src/canonical/v41-prompt-program-benchmark-report.js @@ -831,8 +831,10 @@ function buildPredicateResults(repoRoot, context) { 'gate8-tests-docs-workflows', SOURCE_ROOTS.roadmap, roadmap.includes('V41 Gate 8 closure anchor') - && /Current working gate: V41 Gate (?:8|9)/u.test(roadmap) - && (roadmap.includes('Next queued gate after V41 Gate 8') || roadmap.includes('V41 Gate 9 closure anchor')), + && ((/Current working gate: V41 Gate (?:8|9)/u.test(roadmap) + && (roadmap.includes('Next queued gate after V41 Gate 8') || roadmap.includes('V41 Gate 9 closure anchor'))) + || /Latest closed version: V41 Prompt And PromptPart Excellence/u.test(roadmap) + || /Recent V41 closure anchor/u.test(roadmap)), ), predicate( 'readmes-document-gate8-helpers', diff --git a/packages/protocol/src/canonical/v41-readfitsfinding-prompt-hardening.js b/packages/protocol/src/canonical/v41-readfitsfinding-prompt-hardening.js index 83bf7fde..39d1117e 100644 --- a/packages/protocol/src/canonical/v41-readfitsfinding-prompt-hardening.js +++ b/packages/protocol/src/canonical/v41-readfitsfinding-prompt-hardening.js @@ -578,7 +578,9 @@ function predicatesForRow(repoRoot, rowData) { 'docs.current-gate-6', rowId, SOURCE_ROOTS.roadmap, - /Current working gate: V41 Gate (?:6|7|8|9)/u.test(source), + /Current working gate: V41 Gate (?:6|7|8|9)/u.test(source) || + /Latest closed version: V41 Prompt And PromptPart Excellence/u.test(source) || + /Recent V41 closure anchor/u.test(source), ), predicate( 'docs.next-gate-7', diff --git a/packages/protocol/test/protocol-package-boundary.test.js b/packages/protocol/test/protocol-package-boundary.test.js index 5d7f1b96..cd208df8 100644 --- a/packages/protocol/test/protocol-package-boundary.test.js +++ b/packages/protocol/test/protocol-package-boundary.test.js @@ -60,6 +60,7 @@ test('@bitcode/protocol commercial formalization exports package-native canon he V38: { activeCanon: 'V38', draftTarget: 'V39' }, V39: { activeCanon: 'V39', draftTarget: 'V40' }, V40: { activeCanon: 'V40', draftTarget: 'V41' }, + V41: { activeCanon: 'V41', draftTarget: 'V42' }, }; const expectedPosture = expectedPostureByPointer[pointer]; From d20538ffbb2caaa94a3f5da3b7f751635883d792 Mon Sep 17 00:00:00 2001 From: Garrett Maring Date: Thu, 28 May 2026 17:11:26 -0300 Subject: [PATCH 03/35] V42 Gate 2: Add Depositing Compensation Visibility Implements DepositorySupplyCompensationPreview, source-to-shares compensation readback, deposit evidence roots, and Terminal compensation visibility for source-safe Depositing admission. Adds the deterministic V42 Gate 2 artifact, generator/checker, protocol exports/tests, workflow wiring, and V42 roadmap/spec documentation for the next packs/read/deposit UX direction. Validated with check:v42-gate2, check:v42-gate1, V42 spec-family/canon checks, uapi tsc/lint/build, protocol package tests, asset-pack typecheck, and diff whitespace checks. --- .bitcode/v42-depositing-shortest-path.json | 483 ++++++++++++++++++ .github/workflows/bitcode-canon-quality.yml | 3 + .github/workflows/bitcode-gate-quality.yml | 3 + BITCODE_SPEC_V42.md | 13 +- BITCODE_SPEC_V42_DELTA.md | 2 + BITCODE_SPEC_V42_NOTES.md | 7 + BITCODE_SPEC_V42_PARITY_MATRIX.md | 4 +- README.md | 11 + SPECIFICATIONS_ROADMAP.md | 10 +- package.json | 3 + packages/pipelines/asset-pack/README.md | 14 +- .../__tests__/depository-supply-index.test.ts | 72 +++ .../asset-pack/src/depository-supply-index.ts | 188 ++++++- packages/protocol/README.md | 8 + packages/protocol/server.js | 7 + packages/protocol/src/bitcode-demo.js | 94 +++- .../canonical/v42-depositing-shortest-path.js | 282 ++++++++++ packages/protocol/src/index.d.ts | 8 + packages/protocol/src/index.js | 10 + .../test/protocol-package-boundary.test.js | 25 + .../test/v42-depositing-shortest-path.test.js | 70 +++ ...eck-v42-gate2-depositing-shortest-path.mjs | 230 +++++++++ .../generate-v42-depositing-shortest-path.mjs | 31 ++ uapi/app/terminal/TerminalDepositComposer.tsx | 38 ++ uapi/app/terminal/TerminalPageClient.tsx | 5 + .../app/terminal/terminal-activity-history.ts | 17 + .../terminal-deposit-read-workbench.ts | 46 ++ uapi/app/terminal/terminal-run-data.ts | 5 + 28 files changed, 1676 insertions(+), 13 deletions(-) create mode 100644 .bitcode/v42-depositing-shortest-path.json create mode 100644 packages/protocol/src/canonical/v42-depositing-shortest-path.js create mode 100644 packages/protocol/test/v42-depositing-shortest-path.test.js create mode 100644 scripts/check-v42-gate2-depositing-shortest-path.mjs create mode 100644 scripts/generate-v42-depositing-shortest-path.mjs diff --git a/.bitcode/v42-depositing-shortest-path.json b/.bitcode/v42-depositing-shortest-path.json new file mode 100644 index 00000000..d6833815 --- /dev/null +++ b/.bitcode/v42-depositing-shortest-path.json @@ -0,0 +1,483 @@ +{ + "artifactId": "v42-depositing-shortest-path", + "schemaId": "bitcode.v42.depositingShortestPath.v1", + "version": "V42", + "currentTarget": "V41", + "sourceSafetyVerdict": "source-safe-depositing-compensation-visibility-metadata", + "generatedAt": "deterministic", + "artifactRoot": "v42-depositing-shortest-path:1059291e830568845da67d9e", + "passed": true, + "rows": [ + { + "rowId": "path:source-to-admission-proof", + "purpose": "Make the shortest Depositing path explicit: source material, repository/source anchor, Depository admission, source-safe proof roots, and next Reading handoff.", + "sourceRoots": [ + "packages/protocol/server.js", + "packages/protocol/src/bitcode-demo.js", + "uapi/app/api/deposits/route.ts", + "uapi/app/terminal/TerminalDepositComposer.tsx" + ], + "emittedTypes": [ + "createDeposit", + "buildDepositoryEvidence", + "TerminalDepositResponseEvidence" + ], + "requiredEvidence": [ + "repositoryFullName", + "sourceBranch", + "sourceCommit", + "proofRoot", + "measurementRoot" + ], + "rowRoot": "v42-depositing-shortest-path-row:7e931285b6eabbbcce8b6855", + "sourceSafetyClass": "source_safe_depositing_compensation_visibility_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawSourceTextVisible": false, + "credentialsSerialized": false, + "walletPrivateMaterialVisible": false, + "unpaidAssetPackSourceVisible": false, + "settlementPrivatePayloadVisible": false, + "forbiddenPayloadClasses": [ + "secret-values", + "provider-tokens", + "wallet-private-material", + "protected-source-payloads", + "raw-protected-prompts", + "raw-model-responses-with-protected-source", + "unpaid-assetpack-source", + "settlement-private-payloads" + ] + }, + { + "rowId": "api:deposit-route-readiness-contract", + "purpose": "Keep POST /api/deposits admitted only after signed transaction and repository readiness checks, then project source-safe Depository evidence.", + "sourceRoots": [ + "uapi/app/api/deposits/route.ts", + "packages/protocol/server.js", + "packages/protocol/test/protocol-package-boundary.test.js" + ], + "emittedTypes": [ + "requireBitcodeSignedTransactionReadiness", + "BitcodeAppContext.createDeposit" + ], + "requiredEvidence": [ + "requiresRepositoryAnchor", + "repositoryProvider", + "walletAuthorizationProof" + ], + "rowRoot": "v42-depositing-shortest-path-row:ce3fb56bc4fbed8d5867fda9", + "sourceSafetyClass": "source_safe_depositing_compensation_visibility_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawSourceTextVisible": false, + "credentialsSerialized": false, + "walletPrivateMaterialVisible": false, + "unpaidAssetPackSourceVisible": false, + "settlementPrivatePayloadVisible": false, + "forbiddenPayloadClasses": [ + "secret-values", + "provider-tokens", + "wallet-private-material", + "protected-source-payloads", + "raw-protected-prompts", + "raw-model-responses-with-protected-source", + "unpaid-assetpack-source", + "settlement-private-payloads" + ] + }, + { + "rowId": "supply:depository-record-compensation-preview", + "purpose": "Attach a deterministic compensation preview to DepositorySupplyRecord without minting BTD or exposing source before an accepted Need-Fit and settlement.", + "sourceRoots": [ + "packages/pipelines/asset-pack/src/depository-supply-index.ts", + "packages/pipelines/asset-pack/src/__tests__/depository-supply-index.test.ts", + "packages/pipelines/asset-pack/src/embedding-config.ts" + ], + "emittedTypes": [ + "DepositorySupplyCompensationPreview", + "DepositorySupplyRecord.compensationPreview" + ], + "requiredEvidence": [ + "source-to-shares-largest-remainder", + "not-minted-by-deposit-admission", + "compensationPreviewRoot" + ], + "rowRoot": "v42-depositing-shortest-path-row:c51d568dcab3bc943f6a6a98", + "sourceSafetyClass": "source_safe_depositing_compensation_visibility_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawSourceTextVisible": false, + "credentialsSerialized": false, + "walletPrivateMaterialVisible": false, + "unpaidAssetPackSourceVisible": false, + "settlementPrivatePayloadVisible": false, + "forbiddenPayloadClasses": [ + "secret-values", + "provider-tokens", + "wallet-private-material", + "protected-source-payloads", + "raw-protected-prompts", + "raw-model-responses-with-protected-source", + "unpaid-assetpack-source", + "settlement-private-payloads" + ] + }, + { + "rowId": "documents:source-safe-search-and-vector-projection", + "purpose": "Preserve source-safe lexical, metadata, measurement, and vector search documents so deposits become searchable without protected source payloads.", + "sourceRoots": [ + "packages/pipelines/asset-pack/src/depository-supply-index.ts", + "packages/pipelines/asset-pack/src/__tests__/depository-supply-index.test.ts" + ], + "emittedTypes": [ + "DepositorySupplySearchDocument", + "DepositorySupplyVectorProjection" + ], + "requiredEvidence": [ + "text-embedding-3-small", + "1536", + "match_deliverable_vectors" + ], + "rowRoot": "v42-depositing-shortest-path-row:54e3a870b07b258bde48dd92", + "sourceSafetyClass": "source_safe_depositing_compensation_visibility_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawSourceTextVisible": false, + "credentialsSerialized": false, + "walletPrivateMaterialVisible": false, + "unpaidAssetPackSourceVisible": false, + "settlementPrivatePayloadVisible": false, + "forbiddenPayloadClasses": [ + "secret-values", + "provider-tokens", + "wallet-private-material", + "protected-source-payloads", + "raw-protected-prompts", + "raw-model-responses-with-protected-source", + "unpaid-assetpack-source", + "settlement-private-payloads" + ] + }, + { + "rowId": "storage:depository-readback-projection", + "purpose": "Bind Depository admission to durable source-safe storage readback through deliverables, vector rows, ledger rows, and source-to-shares allocation posture.", + "sourceRoots": [ + "packages/pipelines/asset-pack/src/depository-supply-index.ts", + "packages/pipelines/asset-pack/README.md", + "BITCODE_SPEC_V42.md" + ], + "emittedTypes": [ + "DepositorySupplyStorageProjection", + "compensationPreview.readback" + ], + "requiredEvidence": [ + "deliverables", + "deliverable_vectors", + "ledger_entries", + "source_to_shares_allocations" + ], + "rowRoot": "v42-depositing-shortest-path-row:ce303882896d4c8adb8abde6", + "sourceSafetyClass": "source_safe_depositing_compensation_visibility_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawSourceTextVisible": false, + "credentialsSerialized": false, + "walletPrivateMaterialVisible": false, + "unpaidAssetPackSourceVisible": false, + "settlementPrivatePayloadVisible": false, + "forbiddenPayloadClasses": [ + "secret-values", + "provider-tokens", + "wallet-private-material", + "protected-source-payloads", + "raw-protected-prompts", + "raw-model-responses-with-protected-source", + "unpaid-assetpack-source", + "settlement-private-payloads" + ] + }, + { + "rowId": "ledger:source-to-shares-compensation-readback", + "purpose": "Record depositor compensation visibility through pending-claim and eligible-route ledger keys while deferring actual BTC allocation until paid AssetPack settlement.", + "sourceRoots": [ + "packages/protocol/server.js", + "packages/protocol/src/bitcode-demo.js", + "packages/protocol/test/protocol-package-boundary.test.js" + ], + "emittedTypes": [ + "ledger.accounts", + "compensationPreview.readback.ledgerAccountKeys" + ], + "requiredEvidence": [ + "pending_claims", + "eligible_compensation_routes", + "future-reader-after-settlement" + ], + "rowRoot": "v42-depositing-shortest-path-row:5bcf92e8564e1d3d5ac09fd9", + "sourceSafetyClass": "source_safe_depositing_compensation_visibility_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawSourceTextVisible": false, + "credentialsSerialized": false, + "walletPrivateMaterialVisible": false, + "unpaidAssetPackSourceVisible": false, + "settlementPrivatePayloadVisible": false, + "forbiddenPayloadClasses": [ + "secret-values", + "provider-tokens", + "wallet-private-material", + "protected-source-payloads", + "raw-protected-prompts", + "raw-model-responses-with-protected-source", + "unpaid-assetpack-source", + "settlement-private-payloads" + ] + }, + { + "rowId": "terminal:compensation-visibility-readback", + "purpose": "Show source-safe compensation posture in Terminal and carry compensation roots through activity history and the deposit-to-read workbench.", + "sourceRoots": [ + "uapi/app/terminal/TerminalDepositComposer.tsx", + "uapi/app/terminal/terminal-activity-history.ts", + "uapi/app/terminal/terminal-deposit-read-workbench.ts", + "uapi/app/terminal/terminal-run-data.ts" + ], + "emittedTypes": [ + "TerminalDepositResponseEvidence", + "WorkspaceRun", + "TerminalDepositedSourceRevision" + ], + "requiredEvidence": [ + "compensationPreviewRoot", + "sourceToSharesPreviewRoot", + "Compensation route" + ], + "rowRoot": "v42-depositing-shortest-path-row:5ac46b95fa31585ff8f7ecef", + "sourceSafetyClass": "source_safe_depositing_compensation_visibility_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawSourceTextVisible": false, + "credentialsSerialized": false, + "walletPrivateMaterialVisible": false, + "unpaidAssetPackSourceVisible": false, + "settlementPrivatePayloadVisible": false, + "forbiddenPayloadClasses": [ + "secret-values", + "provider-tokens", + "wallet-private-material", + "protected-source-payloads", + "raw-protected-prompts", + "raw-model-responses-with-protected-source", + "unpaid-assetpack-source", + "settlement-private-payloads" + ] + }, + { + "rowId": "rehearsal:local-staging-deposit-readback", + "purpose": "Keep Gate 2 locally checkable and staging-testnet rehearsable through package tests, protocol route tests, generated artifact checks, and source-safe proof rows.", + "sourceRoots": [ + "BITCODE_SPEC_V42.md", + "BITCODE_SPEC_V42_DELTA.md", + "BITCODE_SPEC_V42_NOTES.md", + "BITCODE_SPEC_V42_PARITY_MATRIX.md", + "SPECIFICATIONS_ROADMAP.md" + ], + "emittedTypes": [ + "V42DepositingShortestPathReport" + ], + "requiredEvidence": [ + "local/staging rehearsal", + "staging-testnet", + "check:v42-gate2" + ], + "rowRoot": "v42-depositing-shortest-path-row:b87642ce4dfa333fd4b4ea03", + "sourceSafetyClass": "source_safe_depositing_compensation_visibility_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawSourceTextVisible": false, + "credentialsSerialized": false, + "walletPrivateMaterialVisible": false, + "unpaidAssetPackSourceVisible": false, + "settlementPrivatePayloadVisible": false, + "forbiddenPayloadClasses": [ + "secret-values", + "provider-tokens", + "wallet-private-material", + "protected-source-payloads", + "raw-protected-prompts", + "raw-model-responses-with-protected-source", + "unpaid-assetpack-source", + "settlement-private-payloads" + ] + } + ], + "rowIds": [ + "path:source-to-admission-proof", + "api:deposit-route-readiness-contract", + "supply:depository-record-compensation-preview", + "documents:source-safe-search-and-vector-projection", + "storage:depository-readback-projection", + "ledger:source-to-shares-compensation-readback", + "terminal:compensation-visibility-readback", + "rehearsal:local-staging-deposit-readback" + ], + "predicateResults": [ + { + "id": "deposit-route-requires-readiness", + "sourcePath": "uapi/app/api/deposits/route.ts", + "passed": true + }, + { + "id": "server-creates-deposit-and-ledger-readback", + "sourcePath": "packages/protocol/server.js", + "passed": true + }, + { + "id": "runtime-builds-compensation-preview", + "sourcePath": "packages/protocol/src/bitcode-demo.js", + "passed": true + }, + { + "id": "runtime-keeps-source-safe-visibility", + "sourcePath": "packages/protocol/src/bitcode-demo.js", + "passed": true + }, + { + "id": "supply-index-defines-compensation-preview", + "sourcePath": "packages/pipelines/asset-pack/src/depository-supply-index.ts", + "passed": true + }, + { + "id": "supply-index-defers-btd-mint", + "sourcePath": "packages/pipelines/asset-pack/src/depository-supply-index.ts", + "passed": true + }, + { + "id": "supply-index-projects-source-to-shares-readback", + "sourcePath": "packages/pipelines/asset-pack/src/depository-supply-index.ts", + "passed": true + }, + { + "id": "supply-index-preserves-search-documents", + "sourcePath": "packages/pipelines/asset-pack/src/depository-supply-index.ts", + "passed": true + }, + { + "id": "supply-tests-cover-compensation-preview", + "sourcePath": "packages/pipelines/asset-pack/src/__tests__/depository-supply-index.test.ts", + "passed": true + }, + { + "id": "supply-tests-cover-no-protected-source", + "sourcePath": "packages/pipelines/asset-pack/src/__tests__/depository-supply-index.test.ts", + "passed": true + }, + { + "id": "protocol-test-covers-compensation-route", + "sourcePath": "packages/protocol/test/protocol-package-boundary.test.js", + "passed": true + }, + { + "id": "terminal-composer-captures-compensation-roots", + "sourcePath": "uapi/app/terminal/TerminalDepositComposer.tsx", + "passed": true + }, + { + "id": "terminal-history-maps-compensation-roots", + "sourcePath": "uapi/app/terminal/terminal-activity-history.ts", + "passed": true + }, + { + "id": "terminal-workbench-shows-compensation-rows", + "sourcePath": "uapi/app/terminal/terminal-deposit-read-workbench.ts", + "passed": true + }, + { + "id": "workspace-run-carries-compensation-fields", + "sourcePath": "uapi/app/terminal/terminal-run-data.ts", + "passed": true + }, + { + "id": "asset-pack-readme-documents-compensation-preview", + "sourcePath": "packages/pipelines/asset-pack/README.md", + "passed": true + }, + { + "id": "v42-spec-gate2-expanded", + "sourcePath": "BITCODE_SPEC_V42.md", + "passed": true + }, + { + "id": "v42-delta-gate2-implemented", + "sourcePath": "BITCODE_SPEC_V42_DELTA.md", + "passed": true + }, + { + "id": "v42-notes-gate2-rehearsal", + "sourcePath": "BITCODE_SPEC_V42_NOTES.md", + "passed": true + }, + { + "id": "v42-parity-gate2-closed", + "sourcePath": "BITCODE_SPEC_V42_PARITY_MATRIX.md", + "passed": true + }, + { + "id": "roadmap-current-gate-advanced", + "sourcePath": "SPECIFICATIONS_ROADMAP.md", + "passed": true + } + ], + "coverage": { + "rowCount": 8, + "requiredPredicateCount": 21, + "passedPredicateCount": 21, + "failedPredicateIds": [], + "acceptedUserPath": [ + "provide-source-material", + "select-repository-source-anchor", + "admit-deposit-to-depository", + "receive-source-safe-admission-proof", + "view-later-btc-compensation-attribution" + ], + "routeApiContractsCovered": true, + "sourceValidationCovered": true, + "storageProjectionCovered": true, + "depositorySearchDocumentCovered": true, + "sourceToSharesCompensationReadbackCovered": true, + "terminalCompensationVisibilityCovered": true, + "localStagingRehearsalCovered": true, + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawSourceTextVisible": false, + "credentialsSerialized": false, + "walletPrivateMaterialVisible": false, + "unpaidAssetPackSourceVisible": false, + "settlementPrivatePayloadVisible": false, + "btdMintedAtDepositAdmission": false, + "btdRightsTransferredBeforeSettlement": false, + "compensationAllocationMethod": "source-to-shares-largest-remainder", + "compensationPriceAsset": "BTC", + "legacySourceRoots": false + }, + "sourceRoots": { + "depositorySupplyIndex": "packages/pipelines/asset-pack/src/depository-supply-index.ts", + "depositorySupplyIndexTest": "packages/pipelines/asset-pack/src/__tests__/depository-supply-index.test.ts", + "embeddingConfig": "packages/pipelines/asset-pack/src/embedding-config.ts", + "assetPackReadme": "packages/pipelines/asset-pack/README.md", + "protocolServer": "packages/protocol/server.js", + "protocolRuntime": "packages/protocol/src/bitcode-demo.js", + "protocolBoundaryTest": "packages/protocol/test/protocol-package-boundary.test.js", + "uapiDepositRoute": "uapi/app/api/deposits/route.ts", + "terminalDepositComposer": "uapi/app/terminal/TerminalDepositComposer.tsx", + "terminalActivityHistory": "uapi/app/terminal/terminal-activity-history.ts", + "terminalWorkbench": "uapi/app/terminal/terminal-deposit-read-workbench.ts", + "terminalRunData": "uapi/app/terminal/terminal-run-data.ts", + "v42Spec": "BITCODE_SPEC_V42.md", + "v42Delta": "BITCODE_SPEC_V42_DELTA.md", + "v42Notes": "BITCODE_SPEC_V42_NOTES.md", + "v42Parity": "BITCODE_SPEC_V42_PARITY_MATRIX.md", + "roadmap": "SPECIFICATIONS_ROADMAP.md" + } +} diff --git a/.github/workflows/bitcode-canon-quality.yml b/.github/workflows/bitcode-canon-quality.yml index 44ffb620..05484b61 100644 --- a/.github/workflows/bitcode-canon-quality.yml +++ b/.github/workflows/bitcode-canon-quality.yml @@ -295,6 +295,9 @@ jobs: if [ -f BITCODE_SPEC_V42.md ]; then node scripts/check-bitcode-spec-family.mjs --version V42 --mode draft --current-target V41 node scripts/check-v42-gate1-mvp-experience-roadmap-opening.mjs --skip-branch-check + if [ -f scripts/check-v42-gate2-depositing-shortest-path.mjs ]; then + node scripts/check-v42-gate2-depositing-shortest-path.mjs --skip-branch-check --skip-package-tests + fi fi else echo "Unexpected BITCODE_SPEC.txt pointer: $POINTER" >&2 diff --git a/.github/workflows/bitcode-gate-quality.yml b/.github/workflows/bitcode-gate-quality.yml index 906125d9..40c215f9 100644 --- a/.github/workflows/bitcode-gate-quality.yml +++ b/.github/workflows/bitcode-gate-quality.yml @@ -424,6 +424,9 @@ jobs: if [ -f BITCODE_SPEC_V42.md ]; then node scripts/check-bitcode-spec-family.mjs --version V42 --mode draft --current-target V41 node scripts/check-v42-gate1-mvp-experience-roadmap-opening.mjs --skip-branch-check + if [ -f scripts/check-v42-gate2-depositing-shortest-path.mjs ]; then + node scripts/check-v42-gate2-depositing-shortest-path.mjs --skip-branch-check --skip-package-tests + fi fi else echo "Unexpected BITCODE_SPEC.txt pointer: $POINTER" >&2 diff --git a/BITCODE_SPEC_V42.md b/BITCODE_SPEC_V42.md index bf8336e7..71339f89 100644 --- a/BITCODE_SPEC_V42.md +++ b/BITCODE_SPEC_V42.md @@ -99,9 +99,18 @@ It closes when active V41 / draft V42 truth is visible in the root docs, protoco ## V42 Gate 2 Depositing Shortest Path And Compensation Visibility -Gate 2 must make the shortest deposit path explicit and testable. +Gate 2 makes the shortest deposit path explicit and testable. The accepted user path is: provide source material, select repository/source anchor, admit deposit to the Depository, receive source-safe admission proof, and see how later BTC compensation will be attributed if the deposit participates in a synthesized AssetPack. -It must cover route/API contracts, source validation, storage projection, Depository search-document creation, BTD/source-to-shares compensation readback, telemetry, and local/staging rehearsal. +The implemented path covers route/API contracts, source validation, storage projection, Depository search-document creation, BTD/source-to-shares compensation readback, telemetry, and local/staging rehearsal posture. + +Gate 2 introduces source-safe compensation visibility as a first-class Depository admission readback. +`DepositorySupplyRecord.compensationPreview` and deposit route `depositoryEvidence.compensationPreview` expose only source-safe metadata: compensation state, depositor wallet id, BTC price asset, source-to-shares largest-remainder allocation method, compensation route root, source-to-shares preview root, ledger readback keys, database projection tables, and repair blockers. +The compensation route preview is not a BTD mint and not a rights transfer. +It states that source-to-shares proof, BTC allocation, BTD rights transfer, and source-bearing AssetPack delivery occur only after an accepted Need-Fit creates a paid AssetPack and settlement finality is observed. + +Gate 2 proof artifact: `.bitcode/v42-depositing-shortest-path.json`. +The artifact must prove eight source-safe rows: source-to-admission path, deposit route readiness contract, Depository record compensation preview, source-safe search/vector projection, storage readback projection, source-to-shares compensation ledger readback, Terminal compensation visibility readback, and local/staging deposit readback posture. +Validating command: `pnpm run check:v42-gate2`. ## V42 Gate 3 Reading Shortest Path State Machine diff --git a/BITCODE_SPEC_V42_DELTA.md b/BITCODE_SPEC_V42_DELTA.md index 54ceb8db..cfc889e1 100644 --- a/BITCODE_SPEC_V42_DELTA.md +++ b/BITCODE_SPEC_V42_DELTA.md @@ -35,6 +35,8 @@ Open the V42 full specification family, roadmap, package script, workflow postur ### Gate 2: Depositing Shortest Path And Compensation Visibility Implement and prove the shortest path from source material to Depository admission proof and later compensation readback. +Gate 2 now binds Depository admission proof to a source-safe compensation route preview, route/API readiness, Depository search documents, vector/storage projection, source-to-shares readback keys, Terminal activity/history/readback fields, and `.bitcode/v42-depositing-shortest-path.json`. +The compensation preview is deliberately pre-mint: it records BTC/source-to-shares eligibility if the deposit is selected into a later paid AssetPack, but it does not mint BTD, transfer rights, expose source, or allocate BTC before accepted Need-Fit and settlement. ### Gate 3: Reading Shortest Path State Machine diff --git a/BITCODE_SPEC_V42_NOTES.md b/BITCODE_SPEC_V42_NOTES.md index 9d79f471..9c67e6be 100644 --- a/BITCODE_SPEC_V42_NOTES.md +++ b/BITCODE_SPEC_V42_NOTES.md @@ -27,6 +27,9 @@ It opens the reliable MVP experience version after V41 prompt-program promotion The V42 Depositing path should minimize the journey from source material to Depository admission proof. The user needs to know that the source is admitted, searchable for future Need-Fit work, and eligible for BTC compensation if it contributes to a synthesized AssetPack. The UX can stay simple, but expandable details must show source authority, admission proof, storage projection, search-document posture, compensation route, and repair state. +Gate 2 implements that note through `DepositorySupplyCompensationPreview`, deposit route `depositoryEvidence.compensationPreview`, Terminal compensation readback rows, and `.bitcode/v42-depositing-shortest-path.json`. +Local/staging rehearsal for this gate means the deposit route, source-safe evidence projection, generated artifact, package test, and protocol route test can run without value-bearing mainnet behavior. +The staging-testnet lane may read the same source-safe roots and ledger keys, but secrets and private source remain outside generated artifacts. ## Reading shortest-path note @@ -59,6 +62,10 @@ V43 or a later explicitly opened version should evolve the deposit side into an Repository-installed Bitcode Agents should compare a connected enterprise codebase, the current Bitcode Depository, and Reading activity to propose deposit AssetPack options. Those options should be source-safe, sub-critical, likely positive ROI, and approve/rejectable before Depository admission. That later version should split `/terminal` into `/read` and `/deposit`, and rename `/exchange` to `/packs` across routes, code naming, docs, and operator vocabulary. +The route model should be AssetPacks in and AssetPacks out: `/deposit` creates reviewable deposit AssetPack options from connected source, depositor instructions, and Bitcode's observed Needs; `/read` creates reviewed Need-Fit AssetPack previews and only unlocks source-bearing delivery after settlement; `/packs` is the searchable master-detail activity route for deposited packs, settled read packs, compensation posture, quotes, rights transfer, delivery, and repair. +The `/packs` master view should support column sorting, filtering, and search over measurements, synthesized AssetPack titles and descriptions, values, activity or transaction type, settlement posture, and compensation state. +The detail view should expose the selected activity's source-safe data, proof roots, telemetry, ledger/database synchronization, and expandable payloads without replacing the short default path. +Outside public documentation, product UX should avoid self-referential explanatory copy; route structure, concise labels, progressive detail, and proof-on-expand must make Depositing, Reading, and Pack activity self-explanatory. ## Concise current-system reading diff --git a/BITCODE_SPEC_V42_PARITY_MATRIX.md b/BITCODE_SPEC_V42_PARITY_MATRIX.md index 3c22230a..58e561f3 100644 --- a/BITCODE_SPEC_V42_PARITY_MATRIX.md +++ b/BITCODE_SPEC_V42_PARITY_MATRIX.md @@ -33,7 +33,7 @@ This matrix records the reliable MVP product surfaces that must become promotion | Roadmap truth | Roadmap states V41 active and V42 draft reliable MVP experience | `SPECIFICATIONS_ROADMAP.md` | drafted | | Gate workflow | Gate quality knows active V41 / draft V42 posture and V42 Gate 1 | `.github/workflows/bitcode-gate-quality.yml` | drafted | | Canon workflow | Canon quality knows active V41 / draft V42 posture and V42 Gate 1 | `.github/workflows/bitcode-canon-quality.yml` | drafted | -| Depositing shortest path | Source material can be admitted with Depository proof and compensation visibility | later V42 Gate 2 artifact | draft-required | +| Depositing shortest path | Source material can be admitted with Depository proof and compensation visibility | `.bitcode/v42-depositing-shortest-path.json`, `DepositorySupplyCompensationPreview`, `/api/deposits`, Terminal deposit readback | implemented | | Reading state machine | Five-step Reading UX is route-owned, persistent, and source-safe | later V42 Gate 3 artifact | draft-required | | ReadNeed product closure | Need synthesis, review, feedback, resynthesis, and accepted-Need admission are product-ready | later V42 Gate 4 artifact | draft-required | | Finding Fits preview and quote | Many-candidate search, selected-fit provenance, source-safe preview, and quote are product-ready | later V42 Gate 5 artifact | draft-required | @@ -47,7 +47,7 @@ This matrix records the reliable MVP product surfaces that must become promotion | Area | Closure requirement | Judgment | | --- | --- | --- | | Gate 1 | Open V42 family, roadmap, docs, workflow posture, package script, and checker | drafted | -| Gate 2 | Depositing shortest path and compensation visibility artifact | draft-required | +| Gate 2 | Depositing shortest path and compensation visibility artifact | implemented | | Gate 3 | Reading shortest path state machine artifact | draft-required | | Gate 4 | ReadNeed review and resynthesis product closure artifact | draft-required | | Gate 5 | ReadFitsFinding AssetPack preview and quote closure artifact | draft-required | diff --git a/README.md b/README.md index cd3295dc..e3512001 100644 --- a/README.md +++ b/README.md @@ -87,11 +87,22 @@ later BTC compensation, shortest-path Reading through Need review/resynthesis, Finding Fits, source-safe AssetPack preview, BTD/BTC settlement, repository delivery, and an AI-reading dominant demonstration whose AssetPack measurably improves an AI system beyond public-data-only performance. +V42 Gate 2 adds source-safe Depositing compensation visibility with +`DepositorySupplyCompensationPreview`, deposit route compensation evidence, +Terminal compensation roots, `.bitcode/v42-depositing-shortest-path.json`, +and `check:v42-gate2`. Deposit admission remains pre-mint and pre-rights +transfer; BTC source-to-shares allocation is only a later paid AssetPack +settlement route. V43+ is roadmapped as the later agentic depositing evolution: repository agents synthesize deposit AssetPack options from connected enterprise code, Depository state, and Reading demand; enterprises approve or reject sub-critical positive-ROI options; `/terminal` separates into `/read` and `/deposit`; and `/exchange` is renamed to `/packs` across product naming. +That future route model treats AssetPacks as the product object in and out: +`/deposit` proposes deposit AssetPack options from source and Bitcode demand, +`/read` buys synthesized Need-Fit AssetPacks, and `/packs` becomes the +searchable master-detail activity surface for pack measurements, values, +settlement posture, compensation, delivery, proofs, and repair. Exchange is inherited V36 canon: market-wide activity master-detail, buy/sell/ bid/ask/cancel/accept/settle/history flows, AssetPack range trading, diff --git a/SPECIFICATIONS_ROADMAP.md b/SPECIFICATIONS_ROADMAP.md index c652332a..de22cd64 100644 --- a/SPECIFICATIONS_ROADMAP.md +++ b/SPECIFICATIONS_ROADMAP.md @@ -5,10 +5,11 @@ - Current active canonical pointer: `BITCODE_SPEC.txt` -> `V41` - Current active canon: `BITCODE_SPEC_V41.md` - Current draft target: `BITCODE_SPEC_V42.md`. -- Current working gate: V42 Gate 1 MVP Experience Roadmap And Spec Opening. -- Next queued gate after V42 Gate 1: V42 Gate 2 Depositing Shortest Path And Compensation Visibility. +- Current working gate: V42 Gate 2 Depositing Shortest Path And Compensation Visibility. +- Next queued gate after V42 Gate 2: V42 Gate 3 Reading Shortest Path State Machine. - Latest closed version: V41 Prompt And PromptPart Excellence, which promoted PromptPart and Prompt inventory, registry interpolation contracts, Reading prompt baselines, ReadNeedComprehensionSynthesis prompt hardening, ReadFitsFindingSynthesis prompt hardening, Conversation/tool/interface prompt rewrite, prompt benchmark telemetry, and V41 promotion readiness. - Recent V42 opening anchor: reliable MVP experience opens over promoted V41 with V42 SPEC, DELTA, NOTES, and PARITY files, `check:v42-gate1`, active V41 / draft V42 posture, and a nine-gate plan for shortest-path Depositing, five-step Reading, ReadNeed product closure, ReadFitsFinding preview and quote closure, settlement and repository delivery, AI-reading demonstration, local/staging rehearsal, and promotion readiness. +- V42 Gate 2 closure anchor: reliable MVP experience now owns source-safe Depositing compensation visibility through `DepositorySupplyCompensationPreview`, deposit route `depositoryEvidence.compensationPreview`, deterministic `.bitcode/v42-depositing-shortest-path.json`, route/API readiness checks, source validation, Depository search/vector/storage projection, source-to-shares compensation readback keys, Terminal compensation roots, focused package/protocol tests, workflow wiring, and `check:v42-gate2`. - Recent V41 closure anchor: V41 canonical promotion updated `BITCODE_SPEC.txt` to `V41`, generated `BITCODE_SPEC_V41_PROVEN.md`, preserved active V41 / draft V42 runtime posture, and closed prompt-program excellence canon. - Recent V40 closure anchor: V40 canonical promotion updated `BITCODE_SPEC.txt` to `V40`, generated `BITCODE_SPEC_V40_PROVEN.md`, preserved active V40 / draft V41 runtime posture, and closed exhaustive commercial application testing canon. - Recent V39 closure anchor: V39 canonical promotion updated `BITCODE_SPEC.txt` to `V39`, generated `BITCODE_SPEC_V39_PROVEN.md`, preserved active V39 / draft V40 runtime posture, and closed commercial Reading readiness canon. @@ -37,6 +38,7 @@ - V41 Gate 9 closure anchor: prompt-program work now owns package-backed `V41PromotionReadinessReport` source, deterministic `.bitcode/v41-promotion-readiness-report.json`, `BITCODE_SPEC_V41_PROVEN.md` generation support, `v41-canon-promotion.yml`, promotion command dry-run support, gate/canon workflow posture, active V41 / draft V42 runtime preparation, all V41 prompt-program artifacts covered, source-safe, parseable, and workflow-bound, and value-bearing mainnet admission blocked through `check:v41-gate9`. - Forward planning note: V42 focuses on the reliable MVP product experience after V41's prompt-program hardening. Depositing should become the shortest path to adding any source material, proving its Depository admission, and later receiving BTC compensation when that deposit contributes to a synthesized AssetPack. Reading should become the shortest path to submitting a Read Request, reviewing or resynthesizing Bitcode's synthesized Need, requesting Finding Fits, reviewing source-safe AssetPack measurements and preview metadata, buying the AssetPack through BTD/BTC settlement semantics, and receiving post-settlement repository delivery. The demonstration should be AI-reading dominant: any deposit source can contribute proprietary or otherwise non-public training, prompt, context, or evaluation material to an AssetPack that measurably improves an AI system beyond a public-data-only baseline. - Forward planning note: V43+ should evolve the deposit side into an agentic AssetPack option experience for enterprises that own connected codebases. Bitcode Agents installed on an enterprise repository should compare the repository, the current Bitcode Depository, and current Reading activity to propose deposit AssetPack options: unminted AssetPacks in all but BTD that can later become BTD only when a Reader's industrial Need-Fit mints one. The deposit pipeline should optimize for enterprise IP governance by filtering out critical IP, estimating whether selling would be positive ROI against development cost and expected Read demand, and presenting everything else as approve/reject deposit options. The product route plan for that version is to split `/terminal` into `/read` for Reading and `/deposit` for agentic deposit AssetPack option review, and to rename `/exchange` to `/packs` across routes, code names, and docs. +- Forward planning note: V43+ should treat AssetPacks as the in/out simplification for the product. Depositing turns connected source plus depositor instructions plus Bitcode's observed Needs into deposit AssetPack options for approval; Reading turns an accepted Need plus many fitted Depository AssetPacks into a source-safe preview, quote, settlement, rights transfer, and repository delivery. `/packs` should replace Exchange naming as the master-detail activity route: the master view is a searchable, sortable, filterable table over activity, synthesized AssetPack titles/descriptions, measurements, values, transaction types, settlement posture, and compensation state; the detail view shows the selected activity with expandable proof, ledger, telemetry, and payload readback. Product surfaces outside public documentation should avoid self-referential explanatory copy and instead make the core actions self-evident through route structure, labels, progressive detail, and proof-on-expand. - V34 Gate 2 closure anchor: deployment-depth now owns package-backed `DeploymentHostCapabilityCatalog` and `EnvironmentLaneContract` source, deterministic `.bitcode/v34-deployment-host-capability-catalog.json` and `.bitcode/v34-environment-lane-contracts.json`, and visible `value-bearing-mainnet` blocking through `blocked_future_canon_required`. - V34 Gate 3 closure anchor: deployment-depth now owns package-backed `DistributedExecutionRuntimeReceipt` source, deterministic `.bitcode/v34-distributed-execution-runtime-receipts.json`, `request_response_not_required` long-running work posture, and source-safe roots for pipeline, PTRR agent, ThricifiedGeneration, tool, ledger, wallet, proof, object-storage, and repair work. - V34 Gate 4 closure anchor: deployment-depth now owns package-backed `DeploymentStoragePosture` source, deterministic `.bitcode/v34-deployment-storage-posture.json`, ledger/database/object-storage drift repair fixtures, retention/encryption/backup/rollback/audit posture, and source-bearing AssetPack storage remains locked before settlement. @@ -158,7 +160,7 @@ They are referenced here for specification history only; active implementation w | V40 | `BITCODE_SPEC_V40.md` | promoted historical Bitcode canon | Exhaustive commercial application testing depth after V39: rich browser E2E for all website interactions and state possibilities, visual/screenshot comparison coverage, API and integration suites for pipelines, conversations, routes, ledger/database/storage synchronization, unit coverage for packages, primitives, isolated implementations, real commercial implementations, local/staging rehearsal automation, prompt benchmark smoke, and promotion readiness. | | V41 | `BITCODE_SPEC_V41.md` | active canon | Prompt and PromptPart excellence, treating prompts as programs: audit every raw PromptPart and composed Prompt, run and harden benchmarks, repartition prompts into meaningfully benchmarkable semantic parts, retitle and rewrite PromptParts/Prompts where optimal, catalogue registry bindings, interpolation contracts, benchmark fixtures, benchmark outputs, inference callsites, and parsed return types, and elevate all Reading and Conversation inference points after V38 inference scaffolding and V40 testing depth make that work measurable. The primary surface is Reading, especially `ReadNeedComprehensionSynthesis` and `ReadFitsFindingSynthesis`; conversations and other inference prompts follow with the same benchmarkable catalogue discipline. | | V42 | `BITCODE_SPEC_V42.md` | active draft target | Reliable MVP experience after V41 prompt hardening: shortest-path Depositing for any source material with Depository admission proof and later BTC compensation when deposits contribute to synthesized AssetPacks; shortest-path Reading for Read Request submission, synthesized Need review/resynthesis, Finding Fits, source-safe AssetPack measurement/preview review, BTD/BTC purchase and settlement, and repository delivery; and an AI-reading dominant demonstration proving an AssetPack can improve an AI system's training, prompt/context, or evaluation performance beyond public-data-only baselines using proprietary or otherwise non-public deposit and read materials. | -| V43+ | future specification family | planned future | Agentic enterprise deposit-side AssetPack option synthesis after the MVP paths are reliable: repository-installed Bitcode Agents compare a connected enterprise codebase, the Bitcode Depository, and Reading activity to propose deposit AssetPack options for review; filter out critical IP; estimate positive ROI against development cost and likely demand; let enterprises approve/reject options for Depository admission; split `/terminal` into `/read` and `/deposit`; and rename `/exchange` to `/packs` throughout product routes, code naming, docs, and operator vocabulary. | +| V43+ | future specification family | planned future | Agentic enterprise deposit-side AssetPack option synthesis after the MVP paths are reliable: repository-installed Bitcode Agents compare a connected enterprise codebase, the Bitcode Depository, and Reading activity to propose deposit AssetPack options for review; filter out critical IP; estimate positive ROI against development cost and likely demand; let enterprises approve/reject options for Depository admission; split `/terminal` into `/read` and `/deposit`; and rename `/exchange` to `/packs` throughout product routes, code naming, docs, and operator vocabulary. `/packs` becomes the searchable master-detail activity surface for all pack activity, while `/deposit` and `/read` become the short core paths into and out of the Depository. | ## Current Planning Spine @@ -187,6 +189,6 @@ They are referenced here for specification history only; active implementation w - Do use `_legacy/` specifications to understand why current Bitcode concepts exist and what must not regress. - V42+ work must build on V41 active canon and V27 `$BTD` law unless a future promoted spec explicitly supersedes it. - V42 is the active draft target for reliable MVP experience; Gate 1 is specification/documentation/workflow posture only and later gates own implementation. -- V43+ agentic depositing, `/read` and `/deposit` route separation, and `/packs` renaming are roadmap/planning only until a later version explicitly opens them; V42 remains scoped to reliable MVP Depositing, Reading, settlement, delivery, and AI-reading demonstration. +- V43+ agentic depositing, `/read` and `/deposit` route separation, `/packs` renaming, searchable pack activity master-detail, and deposit AssetPack option synthesis are roadmap/planning only until a later version explicitly opens them; V42 remains scoped to reliable MVP Depositing, Reading, settlement, delivery, and AI-reading demonstration. - No implementation route should be versioned by spec number; source should move in place with the active canon. - Future notes files are planning memory only until their version is explicitly opened as the draft-target SPEC family. diff --git a/package.json b/package.json index be225050..a66382ab 100644 --- a/package.json +++ b/package.json @@ -304,6 +304,9 @@ "check:v41-promotion-readiness": "node scripts/generate-v41-promotion-readiness-report.mjs --check", "check:v41-gate9": "node scripts/check-v41-gate9-promotion-readiness.mjs", "check:v42-gate1": "node scripts/check-v42-gate1-mvp-experience-roadmap-opening.mjs", + "generate:v42-depositing-shortest-path": "node scripts/generate-v42-depositing-shortest-path.mjs", + "check:v42-depositing-shortest-path": "node scripts/generate-v42-depositing-shortest-path.mjs --check", + "check:v42-gate2": "node scripts/check-v42-gate2-depositing-shortest-path.mjs", "generate:v38-inference-surface-inventory": "node scripts/generate-v38-inference-surface-inventory.mjs", "check:v38-inference-surface-inventory": "node scripts/generate-v38-inference-surface-inventory.mjs --check", "check:v38-gate2": "node scripts/check-v38-gate2-inference-surface-inventory.mjs", diff --git a/packages/pipelines/asset-pack/README.md b/packages/pipelines/asset-pack/README.md index 021c0971..efcc5d76 100644 --- a/packages/pipelines/asset-pack/README.md +++ b/packages/pipelines/asset-pack/README.md @@ -98,8 +98,8 @@ deposited repository/material supply into searchable Depository records before Finding Fits runs. A `DepositorySupplyIndex` contains `DepositorySupplyRecord` entries with repository, branch, commit, proof root, measurement root, reconciliation readback root, BTD range, depositor wallet boundary, source-safe -search documents, vector projection rows, storage readback posture, and repair -actions. +search documents, vector projection rows, storage readback posture, source-safe +compensation preview, and repair actions. The index deliberately keeps protected source outside the serialized record. Lexical, metadata, measurement, and vector search documents use source-safe @@ -108,6 +108,16 @@ Rows with missing or invalid embeddings remain visible as repair posture through `sync-active-embedding-vector-rows`; they are not treated as a fully searchable vector corpus. +Each supply record also carries a `DepositorySupplyCompensationPreview`. That +preview tells the depositor how BTC can later route back through +source-to-shares if the deposit is selected into a paid AssetPack, while making +the pre-fit boundary explicit: deposit admission does not mint BTD, does not +transfer BTD rights, and does not expose protected source or unpaid +source-bearing AssetPack content. The preview records compensation route roots, +source-to-shares preview roots, ledger account keys such as pending claims and +eligible compensation routes, and repair posture when a depositor wallet, +proof, measurement, or searchability requirement is missing. + `depositorySupplyAssetsFromIndex` converts indexed records into source-safe `DepositoryAsset` candidates for `ReadFitsFindingSynthesis`. This handoff lets Finding Fits rank Depository supply without importing raw source text, unpaid diff --git a/packages/pipelines/asset-pack/src/__tests__/depository-supply-index.test.ts b/packages/pipelines/asset-pack/src/__tests__/depository-supply-index.test.ts index 4828a8e4..43212eee 100644 --- a/packages/pipelines/asset-pack/src/__tests__/depository-supply-index.test.ts +++ b/packages/pipelines/asset-pack/src/__tests__/depository-supply-index.test.ts @@ -111,6 +111,46 @@ describe('Depository supply index', () => { settlementRequiredForSourceBearingAssetPack: true, btdOwnershipBoundary: 'depositor-retains-btd-until-settlement-transfer', }); + expect(record.compensationPreview).toMatchObject({ + schema: 'bitcode.depository.supply-compensation-preview', + state: 'eligible-if-selected-for-assetpack', + depositorWalletId: 'wallet-depositor-1', + candidateBtdRange: 'btd:100:140', + compensationRoute: { + payer: 'future-reader-after-settlement', + payee: 'depositing-wallet', + priceAsset: 'BTC', + allocationMethod: 'source-to-shares-largest-remainder', + sourceToSharesProofState: 'not-created-until-accepted-need-fit-and-settlement', + btdMintBoundary: 'not-minted-by-deposit-admission', + btdRightsTransferBoundary: 'reader-receives-rights-only-after-btc-settlement', + }, + readiness: { + proofReady: true, + measurementReady: true, + searchable: true, + depositorWalletReady: true, + eligibleForFindingFits: true, + eligibleForCompensationIfSelected: true, + blockers: [], + }, + visibility: { + beforeSettlement: 'source-safe-compensation-route-metadata', + protectedSourceVisible: false, + unpaidAssetPackSourceVisible: false, + walletPrivateMaterialVisible: false, + settlementPrivatePayloadVisible: false, + }, + }); + expect(record.compensationPreview.roots.compensationPreviewRoot).toMatch(/^sha256:/); + expect(record.compensationPreview.roots.sourceToSharesPreviewRoot).toMatch(/^sha256:/); + expect(record.compensationPreview.readback.ledgerAccountKeys).toEqual( + expect.arrayContaining([ + 'supplier:asset-terminal-engi:pending_claims', + 'depositor:wallet-depositor-1:deposited_assets', + 'depositor:wallet-depositor-1:eligible_compensation_routes', + ]), + ); expect(record.vectorProjection.rows).toHaveLength(4); expect(record.vectorProjection.rows.every((row) => row.embeddingState === 'ready')).toBe(true); expect(record.storageProjection).toMatchObject({ @@ -163,9 +203,41 @@ describe('Depository supply index', () => { expect(index.records[0].lifecycle.blockers).toEqual( expect.arrayContaining(['repository_binding_missing', 'source_revision_binding_missing']), ); + expect(index.records[0].compensationPreview.state).toBe('blocked-before-compensation'); + expect(index.records[0].compensationPreview.readiness.blockers).toEqual( + expect.arrayContaining([ + 'repository_binding_missing', + 'source_revision_binding_missing', + 'depository_searchability_missing', + ]), + ); expect(depositorySupplyAssetsFromIndex(index)).toHaveLength(0); }); + it('surfaces repair posture when deposit compensation cannot route to a wallet', () => { + const index = buildDepositorySupplyIndex({ + deposits: [deposit({ depositorWalletId: null })], + createdAt: '2026-05-25T00:00:00.000Z', + }); + + const record = index.records[0]; + expect(record.lifecycle.state).toBe('indexed-repair-required'); + expect(record.lifecycle.warnings).toEqual(expect.arrayContaining(['depositor_wallet_missing'])); + expect(record.repairActions).toContain('bind-depositor-wallet-for-compensation'); + expect(record.compensationPreview.state).toBe('repair-required-before-compensation'); + expect(record.compensationPreview.readiness).toMatchObject({ + searchable: true, + proofReady: true, + measurementReady: true, + depositorWalletReady: false, + eligibleForFindingFits: true, + eligibleForCompensationIfSelected: false, + }); + expect(record.compensationPreview.readiness.blockers).toEqual( + expect.arrayContaining(['depositor_wallet_missing']), + ); + }); + it('hands source-safe supply records to Finding Fits search as candidate deposits', async () => { const index = buildDepositorySupplyIndex({ deposits: [deposit()], diff --git a/packages/pipelines/asset-pack/src/depository-supply-index.ts b/packages/pipelines/asset-pack/src/depository-supply-index.ts index f83044db..79f0227e 100644 --- a/packages/pipelines/asset-pack/src/depository-supply-index.ts +++ b/packages/pipelines/asset-pack/src/depository-supply-index.ts @@ -11,6 +11,11 @@ export type DepositorySupplyLifecycleState = | 'indexed-repair-required' | 'blocked-readiness'; +export type DepositorySupplyCompensationState = + | 'eligible-if-selected-for-assetpack' + | 'repair-required-before-compensation' + | 'blocked-before-compensation'; + export type DepositorySupplySearchDocumentKind = | 'lexical' | 'metadata' @@ -64,6 +69,7 @@ export interface DepositorySupplyRecord { settlementRequiredForSourceBearingAssetPack: true; btdOwnershipBoundary: 'depositor-retains-btd-until-settlement-transfer'; }; + compensationPreview: DepositorySupplyCompensationPreview; proofEvidence: { hasWalletOrAttestationProof: boolean; proofRoot: string | null; @@ -88,6 +94,54 @@ export interface DepositorySupplyRecord { vectorProjectionRoot: string; storageProjectionRoot: string; rightsBoundaryRoot: string; + compensationPreviewRoot: string; + }; +} + +export interface DepositorySupplyCompensationPreview { + schema: 'bitcode.depository.supply-compensation-preview'; + state: DepositorySupplyCompensationState; + assetId: string; + depositId: string; + depositorWalletId: string | null; + candidateBtdRange: string | null; + compensationRoute: { + payer: 'future-reader-after-settlement'; + payee: 'depositing-wallet'; + priceAsset: 'BTC'; + allocationMethod: 'source-to-shares-largest-remainder'; + sourceToSharesProofState: 'not-created-until-accepted-need-fit-and-settlement'; + btdMintBoundary: 'not-minted-by-deposit-admission'; + btdRightsTransferBoundary: 'reader-receives-rights-only-after-btc-settlement'; + }; + readiness: { + sourceBound: boolean; + proofReady: boolean; + measurementReady: boolean; + searchable: boolean; + depositorWalletReady: boolean; + eligibleForFindingFits: boolean; + eligibleForCompensationIfSelected: boolean; + blockers: string[]; + warnings: string[]; + }; + visibility: { + beforeSettlement: 'source-safe-compensation-route-metadata'; + protectedSourceVisible: false; + unpaidAssetPackSourceVisible: false; + walletPrivateMaterialVisible: false; + settlementPrivatePayloadVisible: false; + }; + readback: { + ledgerAccountKeys: string[]; + databaseProjectionTables: string[]; + objectStorageVisibility: 'source-safe-metadata-only-before-settlement'; + }; + roots: { + compensationRouteRoot: string; + sourceToSharesPreviewRoot: string; + readbackRoot: string; + compensationPreviewRoot: string; }; } @@ -401,6 +455,117 @@ function buildVectorProjection(input: { }; } +function buildCompensationPreview(input: { + assetId: string; + depositId: string; + depositorWalletId: string | null; + btdRange: string | null; + sourceBound: boolean; + proofReady: boolean; + measurementReady: boolean; + searchable: boolean; + blockers: string[]; + warnings: string[]; +}): DepositorySupplyCompensationPreview { + const compensationBlockers = [ + ...input.blockers, + ...(!input.depositorWalletId ? ['depositor_wallet_missing'] : []), + ...(!input.proofReady ? ['wallet_or_attestation_proof_missing'] : []), + ...(!input.measurementReady ? ['asset_measurement_evidence_missing'] : []), + ...(!input.searchable ? ['depository_searchability_missing'] : []), + ]; + const eligibleForCompensationIfSelected = compensationBlockers.length === 0; + const state: DepositorySupplyCompensationState = eligibleForCompensationIfSelected + ? 'eligible-if-selected-for-assetpack' + : input.blockers.length + ? 'blocked-before-compensation' + : 'repair-required-before-compensation'; + const compensationRoute = { + payer: 'future-reader-after-settlement' as const, + payee: 'depositing-wallet' as const, + priceAsset: 'BTC' as const, + allocationMethod: 'source-to-shares-largest-remainder' as const, + sourceToSharesProofState: 'not-created-until-accepted-need-fit-and-settlement' as const, + btdMintBoundary: 'not-minted-by-deposit-admission' as const, + btdRightsTransferBoundary: 'reader-receives-rights-only-after-btc-settlement' as const, + }; + const readback = { + ledgerAccountKeys: [ + `supplier:${input.assetId}:pending_claims`, + ...(input.depositorWalletId + ? [ + `depositor:${input.depositorWalletId}:deposited_assets`, + `depositor:${input.depositorWalletId}:eligible_compensation_routes`, + ] + : []), + ], + databaseProjectionTables: [ + 'deliverables', + 'deliverable_vectors', + 'ledger_entries', + 'source_to_shares_allocations', + ], + objectStorageVisibility: 'source-safe-metadata-only-before-settlement' as const, + }; + const compensationRouteRoot = root('sha256', compensationRoute); + const sourceToSharesPreviewRoot = root('sha256', { + assetId: input.assetId, + depositId: input.depositId, + depositorWalletId: input.depositorWalletId, + candidateBtdRange: input.btdRange, + allocationMethod: compensationRoute.allocationMethod, + sourceToSharesProofState: compensationRoute.sourceToSharesProofState, + }); + const readbackRoot = root('sha256', readback); + const readiness = { + sourceBound: input.sourceBound, + proofReady: input.proofReady, + measurementReady: input.measurementReady, + searchable: input.searchable, + depositorWalletReady: Boolean(input.depositorWalletId), + eligibleForFindingFits: input.searchable, + eligibleForCompensationIfSelected, + blockers: uniqueSorted(compensationBlockers), + warnings: uniqueSorted(input.warnings), + }; + const visibility = { + beforeSettlement: 'source-safe-compensation-route-metadata' as const, + protectedSourceVisible: false as const, + unpaidAssetPackSourceVisible: false as const, + walletPrivateMaterialVisible: false as const, + settlementPrivatePayloadVisible: false as const, + }; + const compensationPreviewRoot = root('sha256', { + assetId: input.assetId, + depositId: input.depositId, + state, + readiness, + compensationRouteRoot, + sourceToSharesPreviewRoot, + readbackRoot, + visibility, + }); + + return { + schema: 'bitcode.depository.supply-compensation-preview', + state, + assetId: input.assetId, + depositId: input.depositId, + depositorWalletId: input.depositorWalletId, + candidateBtdRange: input.btdRange, + compensationRoute, + readiness, + visibility, + readback, + roots: { + compensationRouteRoot, + sourceToSharesPreviewRoot, + readbackRoot, + compensationPreviewRoot, + }, + }; +} + function recordEmbeddingInputs(record: Record): Record { return ( recordValue(record.embeddings) || @@ -553,6 +718,8 @@ function buildSupplyRecord(input: { embeddings: recordEmbeddingInputs(record), }); const storageProjection = buildStorageProjection(); + const depositorWalletId = firstString(record.depositorWalletId, metadata.depositorWalletId, getPath(record, ['depositorBoundary', 'walletId'])); + const btdRange = firstString(record.btdRange, metadata.btdRange, getPath(record, ['btd', 'range'])); const blockers = [ ...(!repositoryFullName ? ['repository_binding_missing'] : []), ...(!sourceBranch && !sourceCommit ? ['source_revision_binding_missing'] : []), @@ -560,6 +727,7 @@ function buildSupplyRecord(input: { const warnings = [ ...(!hasWalletOrAttestationProof ? ['wallet_or_attestation_proof_missing'] : []), ...(!hasAssetMeasurementEvidence ? ['asset_measurement_evidence_missing'] : []), + ...(!depositorWalletId ? ['depositor_wallet_missing'] : []), ...(vectorProjection.rows.some((row) => row.embeddingState === 'pending-embedding') ? ['embedding_rows_pending'] : []), @@ -584,11 +752,12 @@ function buildSupplyRecord(input: { ...(!sourceBranch && !sourceCommit ? ['bind-source-branch-or-commit'] : []), ...(!hasWalletOrAttestationProof ? ['collect-wallet-or-attestation-proof'] : []), ...(!hasAssetMeasurementEvidence ? ['compute-asset-measurement'] : []), + ...(!depositorWalletId ? ['bind-depositor-wallet-for-compensation'] : []), ...(!vectorProjectionReady ? ['sync-active-embedding-vector-rows'] : []), ]); const rightsBoundary = { - depositorWalletId: firstString(record.depositorWalletId, metadata.depositorWalletId, getPath(record, ['depositorBoundary', 'walletId'])), - btdRange: firstString(record.btdRange, metadata.btdRange, getPath(record, ['btd', 'range'])), + depositorWalletId, + btdRange, readerVisibilityBeforeSettlement: 'source-safe-metadata-only' as const, protectedSourceBeforeSettlementVisible: false as const, settlementRequiredForSourceBearingAssetPack: true as const, @@ -625,12 +794,25 @@ function buildSupplyRecord(input: { const vectorProjectionRoot = root('sha256', vectorProjection); const storageProjectionRoot = root('sha256', storageProjection); const rightsBoundaryRoot = root('sha256', rightsBoundary); + const compensationPreview = buildCompensationPreview({ + assetId, + depositId, + depositorWalletId, + btdRange, + sourceBound: Boolean(repositoryFullName && (sourceBranch || sourceCommit)), + proofReady, + measurementReady, + searchable, + blockers, + warnings, + }); const supplyRoot = root('sha256', { assetId, depositId, sourceBinding, lifecycle: { state, searchable, blockers, warnings }, rightsBoundaryRoot, + compensationPreviewRoot: compensationPreview.roots.compensationPreviewRoot, searchDocumentRoot, vectorProjectionRoot, storageProjectionRoot, @@ -660,6 +842,7 @@ function buildSupplyRecord(input: { warnings, }, rightsBoundary, + compensationPreview, proofEvidence, measurementEvidence, readbackEvidence, @@ -674,6 +857,7 @@ function buildSupplyRecord(input: { vectorProjectionRoot, storageProjectionRoot, rightsBoundaryRoot, + compensationPreviewRoot: compensationPreview.roots.compensationPreviewRoot, }, }; } diff --git a/packages/protocol/README.md b/packages/protocol/README.md index 9117436d..fb299c5e 100644 --- a/packages/protocol/README.md +++ b/packages/protocol/README.md @@ -184,6 +184,14 @@ Need, Finding Fits, source-safe AssetPack preview, BTD/BTC settlement, rights transfer, and repository delivery; and an AI-reading dominant standalone demonstration that proves an AssetPack can improve an AI system beyond a public-data-only baseline. +V42 Gate 2 adds `V42DepositingShortestPath` through +`packages/protocol/src/canonical/v42-depositing-shortest-path.js`, +`packages/protocol/test/v42-depositing-shortest-path.test.js`, +`.bitcode/v42-depositing-shortest-path.json`, and `check:v42-gate2`. +It proves deposit route readiness, Depository search/vector/storage projection, +source-safe compensation preview roots, source-to-shares ledger readback keys, +Terminal compensation visibility, and the pre-mint/no-pre-settlement-source +boundary. V40 Gate 2 adds `V40TestInventoryCoverageMatrix` through `packages/protocol/src/canonical/v40-test-inventory-coverage-matrix.js`, `packages/protocol/test/v40-test-inventory-coverage-matrix.test.js`, diff --git a/packages/protocol/server.js b/packages/protocol/server.js index 48dbbf05..d7045e4a 100644 --- a/packages/protocol/server.js +++ b/packages/protocol/server.js @@ -810,6 +810,13 @@ export function createAppContext({ state.ledger.accounts[depositorAssetsKey] = String( Number.isFinite(priorDepositorAssetCount) ? priorDepositorAssetCount + 1 : 1 ); + if (asset.depositoryEvidence?.compensationPreview?.state === 'eligible-if-selected-for-assetpack') { + const compensationRoutesKey = `depositor:${asset.depositoryEvidence.depositorBoundary.walletId}:eligible_compensation_routes`; + const priorRouteCount = Number(state.ledger.accounts[compensationRoutesKey] || '0'); + state.ledger.accounts[compensationRoutesKey] = String( + Number.isFinite(priorRouteCount) ? priorRouteCount + 1 : 1 + ); + } } writeState(state); return { ok: true, asset, depositoryEvidence: asset.depositoryEvidence || null }; diff --git a/packages/protocol/src/bitcode-demo.js b/packages/protocol/src/bitcode-demo.js index 2f2c7ad0..7ac1b032 100644 --- a/packages/protocol/src/bitcode-demo.js +++ b/packages/protocol/src/bitcode-demo.js @@ -565,6 +565,90 @@ function buildDepositoryEvidence(input, inputState) { measurementRoot, reconciliationReadbackRoot }); + const compensationRoute = { + payer: 'future-reader-after-settlement', + payee: 'depositing-wallet', + priceAsset: 'BTC', + allocationMethod: 'source-to-shares-largest-remainder', + sourceToSharesProofState: 'not-created-until-accepted-need-fit-and-settlement', + btdMintBoundary: 'not-minted-by-deposit-admission', + btdRightsTransferBoundary: 'reader-receives-rights-only-after-btc-settlement' + }; + const compensationRouteRoot = stableHashObject(compensationRoute); + const sourceToSharesPreviewRoot = stableHashObject({ + schema: 'bitcode.depository.source-to-shares-preview', + assetId: inputState.assetId, + repositoryFullName, + sourceBranch, + sourceCommit, + depositorWalletId: walletId, + proofRoot, + measurementRoot, + reconciliationReadbackRoot, + allocationMethod: compensationRoute.allocationMethod, + sourceToSharesProofState: compensationRoute.sourceToSharesProofState + }); + const compensationReadback = { + ledgerAccountKeys: [ + `supplier:${inputState.assetId}:pending_claims`, + ...(walletId + ? [ + `depositor:${walletId}:deposited_assets`, + `depositor:${walletId}:eligible_compensation_routes` + ] + : []) + ], + databaseProjectionTables: [ + 'deliverables', + 'deliverable_vectors', + 'ledger_entries', + 'source_to_shares_allocations' + ], + objectStorageVisibility: 'source-safe-metadata-only-before-settlement' + }; + const compensationReadbackRoot = stableHashObject(compensationReadback); + const compensationPreviewWithoutRoot = { + schema: 'bitcode.depository.supply-compensation-preview', + state: walletId + ? 'eligible-if-selected-for-assetpack' + : 'repair-required-before-compensation', + assetId: inputState.assetId, + depositorWalletId: walletId, + candidateBtdRange: null, + compensationRoute, + readiness: { + sourceBound: Boolean(repositoryFullName && (sourceBranch || sourceCommit)), + proofReady: true, + measurementReady: true, + searchable: true, + depositorWalletReady: Boolean(walletId), + eligibleForFindingFits: true, + eligibleForCompensationIfSelected: Boolean(walletId), + blockers: walletId ? [] : ['depositor_wallet_missing'], + warnings: [] + }, + visibility: { + beforeSettlement: 'source-safe-compensation-route-metadata', + protectedSourceVisible: false, + unpaidAssetPackSourceVisible: false, + walletPrivateMaterialVisible: false, + settlementPrivatePayloadVisible: false + }, + readback: compensationReadback, + roots: { + compensationRouteRoot, + sourceToSharesPreviewRoot, + readbackRoot: compensationReadbackRoot + } + }; + const compensationPreviewRoot = stableHashObject(compensationPreviewWithoutRoot); + const compensationPreview = { + ...compensationPreviewWithoutRoot, + roots: { + ...compensationPreviewWithoutRoot.roots, + compensationPreviewRoot + } + }; return { schema: 'bitcode.depository.deposit-evidence', @@ -579,6 +663,9 @@ function buildDepositoryEvidence(input, inputState) { depositorySearchDocumentRoot, lexicalDocumentRoot, vectorDocumentRoot, + compensationPreview, + compensationPreviewRoot, + sourceToSharesPreviewRoot, searchDocuments: { lexical: { ...lexicalDocument, @@ -3207,7 +3294,10 @@ export function makeCandidateAsset(input) { depositorySearchDocumentRoot: depositoryEvidence.depositorySearchDocumentRoot, lexicalDocumentRoot: depositoryEvidence.lexicalDocumentRoot, vectorDocumentRoot: depositoryEvidence.vectorDocumentRoot, + compensationPreviewRoot: depositoryEvidence.compensationPreviewRoot, + sourceToSharesPreviewRoot: depositoryEvidence.sourceToSharesPreviewRoot, depositorWalletId: depositoryEvidence.depositorBoundary.walletId, + compensationPreview: depositoryEvidence.compensationPreview, depositoryEvidence, sourceMaterialBinding: { mode: input.bindingMode || 'read-only-mounted-copy', @@ -3284,7 +3374,9 @@ export function makeCandidateAsset(input) { reconciliationReadbackRoot: depositoryEvidence.reconciliationReadbackRoot, depositorySearchDocumentRoot: depositoryEvidence.depositorySearchDocumentRoot, lexicalDocumentRoot: depositoryEvidence.lexicalDocumentRoot, - vectorDocumentRoot: depositoryEvidence.vectorDocumentRoot + vectorDocumentRoot: depositoryEvidence.vectorDocumentRoot, + compensationPreviewRoot: depositoryEvidence.compensationPreviewRoot, + sourceToSharesPreviewRoot: depositoryEvidence.sourceToSharesPreviewRoot }, metadata: { author: input.author, diff --git a/packages/protocol/src/canonical/v42-depositing-shortest-path.js b/packages/protocol/src/canonical/v42-depositing-shortest-path.js new file mode 100644 index 00000000..181bc14b --- /dev/null +++ b/packages/protocol/src/canonical/v42-depositing-shortest-path.js @@ -0,0 +1,282 @@ +// @ts-check + +import crypto from 'node:crypto'; +import { existsSync, readFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const DEFAULT_REPO_ROOT = path.resolve(__dirname, '..', '..', '..', '..'); + +export const V42_DEPOSITING_SHORTEST_PATH_ARTIFACT_PATH = + '.bitcode/v42-depositing-shortest-path.json'; +export const V42_DEPOSITING_SHORTEST_PATH_SCHEMA_ID = + 'bitcode.v42.depositingShortestPath.v1'; +export const V42_DEPOSITING_SHORTEST_PATH_VERSION = 'V42'; +export const V42_DEPOSITING_SHORTEST_PATH_CURRENT_TARGET = 'V41'; +export const V42_DEPOSITING_SHORTEST_PATH_SOURCE_SAFETY_VERDICT = + 'source-safe-depositing-compensation-visibility-metadata'; + +export const V42_DEPOSITING_SHORTEST_PATH_ROW_IDS = Object.freeze([ + 'path:source-to-admission-proof', + 'api:deposit-route-readiness-contract', + 'supply:depository-record-compensation-preview', + 'documents:source-safe-search-and-vector-projection', + 'storage:depository-readback-projection', + 'ledger:source-to-shares-compensation-readback', + 'terminal:compensation-visibility-readback', + 'rehearsal:local-staging-deposit-readback', +]); + +const FORBIDDEN_PAYLOAD_CLASSES = Object.freeze([ + 'secret-values', + 'provider-tokens', + 'wallet-private-material', + 'protected-source-payloads', + 'raw-protected-prompts', + 'raw-model-responses-with-protected-source', + 'unpaid-assetpack-source', + 'settlement-private-payloads', +]); + +const SOURCE_ROOTS = Object.freeze({ + depositorySupplyIndex: 'packages/pipelines/asset-pack/src/depository-supply-index.ts', + depositorySupplyIndexTest: 'packages/pipelines/asset-pack/src/__tests__/depository-supply-index.test.ts', + embeddingConfig: 'packages/pipelines/asset-pack/src/embedding-config.ts', + assetPackReadme: 'packages/pipelines/asset-pack/README.md', + protocolServer: 'packages/protocol/server.js', + protocolRuntime: 'packages/protocol/src/bitcode-demo.js', + protocolBoundaryTest: 'packages/protocol/test/protocol-package-boundary.test.js', + uapiDepositRoute: 'uapi/app/api/deposits/route.ts', + terminalDepositComposer: 'uapi/app/terminal/TerminalDepositComposer.tsx', + terminalActivityHistory: 'uapi/app/terminal/terminal-activity-history.ts', + terminalWorkbench: 'uapi/app/terminal/terminal-deposit-read-workbench.ts', + terminalRunData: 'uapi/app/terminal/terminal-run-data.ts', + v42Spec: 'BITCODE_SPEC_V42.md', + v42Delta: 'BITCODE_SPEC_V42_DELTA.md', + v42Notes: 'BITCODE_SPEC_V42_NOTES.md', + v42Parity: 'BITCODE_SPEC_V42_PARITY_MATRIX.md', + roadmap: 'SPECIFICATIONS_ROADMAP.md', +}); + +function digest(value) { + return crypto.createHash('sha256').update(value).digest('hex').slice(0, 24); +} + +function rowRoot(id) { + return `v42-depositing-shortest-path-row:${digest(id)}`; +} + +function readSource(repoRoot, sourcePath) { + const absolutePath = path.join(repoRoot, sourcePath); + return existsSync(absolutePath) ? readFileSync(absolutePath, 'utf8') : ''; +} + +function predicateResult(id, sourcePath, passed) { + return { id, sourcePath, passed: Boolean(passed) }; +} + +function row(input) { + return { + ...input, + rowRoot: rowRoot(input.rowId), + sourceSafetyClass: 'source_safe_depositing_compensation_visibility_metadata', + sourceSafeMetadataOnly: true, + protectedSourceVisible: false, + rawSourceTextVisible: false, + credentialsSerialized: false, + walletPrivateMaterialVisible: false, + unpaidAssetPackSourceVisible: false, + settlementPrivatePayloadVisible: false, + forbiddenPayloadClasses: [...FORBIDDEN_PAYLOAD_CLASSES], + }; +} + +export const V42_DEPOSITING_SHORTEST_PATH_ROWS = Object.freeze([ + row({ + rowId: 'path:source-to-admission-proof', + purpose: + 'Make the shortest Depositing path explicit: source material, repository/source anchor, Depository admission, source-safe proof roots, and next Reading handoff.', + sourceRoots: [ + SOURCE_ROOTS.protocolServer, + SOURCE_ROOTS.protocolRuntime, + SOURCE_ROOTS.uapiDepositRoute, + SOURCE_ROOTS.terminalDepositComposer, + ], + emittedTypes: ['createDeposit', 'buildDepositoryEvidence', 'TerminalDepositResponseEvidence'], + requiredEvidence: ['repositoryFullName', 'sourceBranch', 'sourceCommit', 'proofRoot', 'measurementRoot'], + }), + row({ + rowId: 'api:deposit-route-readiness-contract', + purpose: + 'Keep POST /api/deposits admitted only after signed transaction and repository readiness checks, then project source-safe Depository evidence.', + sourceRoots: [SOURCE_ROOTS.uapiDepositRoute, SOURCE_ROOTS.protocolServer, SOURCE_ROOTS.protocolBoundaryTest], + emittedTypes: ['requireBitcodeSignedTransactionReadiness', 'BitcodeAppContext.createDeposit'], + requiredEvidence: ['requiresRepositoryAnchor', 'repositoryProvider', 'walletAuthorizationProof'], + }), + row({ + rowId: 'supply:depository-record-compensation-preview', + purpose: + 'Attach a deterministic compensation preview to DepositorySupplyRecord without minting BTD or exposing source before an accepted Need-Fit and settlement.', + sourceRoots: [SOURCE_ROOTS.depositorySupplyIndex, SOURCE_ROOTS.depositorySupplyIndexTest, SOURCE_ROOTS.embeddingConfig], + emittedTypes: ['DepositorySupplyCompensationPreview', 'DepositorySupplyRecord.compensationPreview'], + requiredEvidence: ['source-to-shares-largest-remainder', 'not-minted-by-deposit-admission', 'compensationPreviewRoot'], + }), + row({ + rowId: 'documents:source-safe-search-and-vector-projection', + purpose: + 'Preserve source-safe lexical, metadata, measurement, and vector search documents so deposits become searchable without protected source payloads.', + sourceRoots: [SOURCE_ROOTS.depositorySupplyIndex, SOURCE_ROOTS.depositorySupplyIndexTest], + emittedTypes: ['DepositorySupplySearchDocument', 'DepositorySupplyVectorProjection'], + requiredEvidence: ['text-embedding-3-small', '1536', 'match_deliverable_vectors'], + }), + row({ + rowId: 'storage:depository-readback-projection', + purpose: + 'Bind Depository admission to durable source-safe storage readback through deliverables, vector rows, ledger rows, and source-to-shares allocation posture.', + sourceRoots: [SOURCE_ROOTS.depositorySupplyIndex, SOURCE_ROOTS.assetPackReadme, SOURCE_ROOTS.v42Spec], + emittedTypes: ['DepositorySupplyStorageProjection', 'compensationPreview.readback'], + requiredEvidence: ['deliverables', 'deliverable_vectors', 'ledger_entries', 'source_to_shares_allocations'], + }), + row({ + rowId: 'ledger:source-to-shares-compensation-readback', + purpose: + 'Record depositor compensation visibility through pending-claim and eligible-route ledger keys while deferring actual BTC allocation until paid AssetPack settlement.', + sourceRoots: [SOURCE_ROOTS.protocolServer, SOURCE_ROOTS.protocolRuntime, SOURCE_ROOTS.protocolBoundaryTest], + emittedTypes: ['ledger.accounts', 'compensationPreview.readback.ledgerAccountKeys'], + requiredEvidence: ['pending_claims', 'eligible_compensation_routes', 'future-reader-after-settlement'], + }), + row({ + rowId: 'terminal:compensation-visibility-readback', + purpose: + 'Show source-safe compensation posture in Terminal and carry compensation roots through activity history and the deposit-to-read workbench.', + sourceRoots: [ + SOURCE_ROOTS.terminalDepositComposer, + SOURCE_ROOTS.terminalActivityHistory, + SOURCE_ROOTS.terminalWorkbench, + SOURCE_ROOTS.terminalRunData, + ], + emittedTypes: ['TerminalDepositResponseEvidence', 'WorkspaceRun', 'TerminalDepositedSourceRevision'], + requiredEvidence: ['compensationPreviewRoot', 'sourceToSharesPreviewRoot', 'Compensation route'], + }), + row({ + rowId: 'rehearsal:local-staging-deposit-readback', + purpose: + 'Keep Gate 2 locally checkable and staging-testnet rehearsable through package tests, protocol route tests, generated artifact checks, and source-safe proof rows.', + sourceRoots: [SOURCE_ROOTS.v42Spec, SOURCE_ROOTS.v42Delta, SOURCE_ROOTS.v42Notes, SOURCE_ROOTS.v42Parity, SOURCE_ROOTS.roadmap], + emittedTypes: ['V42DepositingShortestPathReport'], + requiredEvidence: ['local/staging rehearsal', 'staging-testnet', 'check:v42-gate2'], + }), +]); + +function buildPredicateResults(repoRoot) { + const supply = readSource(repoRoot, SOURCE_ROOTS.depositorySupplyIndex); + const supplyTest = readSource(repoRoot, SOURCE_ROOTS.depositorySupplyIndexTest); + const embeddingConfig = readSource(repoRoot, SOURCE_ROOTS.embeddingConfig); + const readme = readSource(repoRoot, SOURCE_ROOTS.assetPackReadme); + const server = readSource(repoRoot, SOURCE_ROOTS.protocolServer); + const runtime = readSource(repoRoot, SOURCE_ROOTS.protocolRuntime); + const boundaryTest = readSource(repoRoot, SOURCE_ROOTS.protocolBoundaryTest); + const route = readSource(repoRoot, SOURCE_ROOTS.uapiDepositRoute); + const composer = readSource(repoRoot, SOURCE_ROOTS.terminalDepositComposer); + const activity = readSource(repoRoot, SOURCE_ROOTS.terminalActivityHistory); + const workbench = readSource(repoRoot, SOURCE_ROOTS.terminalWorkbench); + const runData = readSource(repoRoot, SOURCE_ROOTS.terminalRunData); + const spec = readSource(repoRoot, SOURCE_ROOTS.v42Spec); + const delta = readSource(repoRoot, SOURCE_ROOTS.v42Delta); + const notes = readSource(repoRoot, SOURCE_ROOTS.v42Notes); + const parity = readSource(repoRoot, SOURCE_ROOTS.v42Parity); + const roadmap = readSource(repoRoot, SOURCE_ROOTS.roadmap); + + return [ + predicateResult('deposit-route-requires-readiness', SOURCE_ROOTS.uapiDepositRoute, route.includes('requireBitcodeSignedTransactionReadiness') && route.includes('requiresRepositoryAnchor: true')), + predicateResult('server-creates-deposit-and-ledger-readback', SOURCE_ROOTS.protocolServer, server.includes('createDeposit') && server.includes('pending_claims') && server.includes('eligible_compensation_routes')), + predicateResult('runtime-builds-compensation-preview', SOURCE_ROOTS.protocolRuntime, runtime.includes('compensationPreview') && runtime.includes('source-to-shares-largest-remainder') && runtime.includes('not-minted-by-deposit-admission')), + predicateResult('runtime-keeps-source-safe-visibility', SOURCE_ROOTS.protocolRuntime, runtime.includes('protectedSourceVisible: false') && runtime.includes('unpaidAssetPackSourceVisible: false')), + predicateResult('supply-index-defines-compensation-preview', SOURCE_ROOTS.depositorySupplyIndex, supply.includes('DepositorySupplyCompensationPreview') && supply.includes('buildCompensationPreview')), + predicateResult('supply-index-defers-btd-mint', SOURCE_ROOTS.depositorySupplyIndex, supply.includes('not-minted-by-deposit-admission') && supply.includes('reader-receives-rights-only-after-btc-settlement')), + predicateResult('supply-index-projects-source-to-shares-readback', SOURCE_ROOTS.depositorySupplyIndex, supply.includes('source_to_shares_allocations') && supply.includes('sourceToSharesPreviewRoot')), + predicateResult( + 'supply-index-preserves-search-documents', + SOURCE_ROOTS.depositorySupplyIndex, + supply.includes('DepositorySupplySearchDocument') && + supply.includes('buildAssetPackEmbeddingPolicy') && + embeddingConfig.includes('text-embedding-3-small') && + embeddingConfig.includes('match_deliverable_vectors'), + ), + predicateResult('supply-tests-cover-compensation-preview', SOURCE_ROOTS.depositorySupplyIndexTest, supplyTest.includes('eligible-if-selected-for-assetpack') && supplyTest.includes('repair-required-before-compensation')), + predicateResult('supply-tests-cover-no-protected-source', SOURCE_ROOTS.depositorySupplyIndexTest, supplyTest.includes('PRIVATE_SOURCE_DO_NOT_SERIALIZE') && supplyTest.includes('assertDepositorySupplyIndexSourceSafe')), + predicateResult('protocol-test-covers-compensation-route', SOURCE_ROOTS.protocolBoundaryTest, boundaryTest.includes('eligible_compensation_routes') && boundaryTest.includes('source-to-shares-largest-remainder')), + predicateResult('terminal-composer-captures-compensation-roots', SOURCE_ROOTS.terminalDepositComposer, composer.includes('compensationPreviewRoot') && composer.includes('Compensation route')), + predicateResult('terminal-history-maps-compensation-roots', SOURCE_ROOTS.terminalActivityHistory, activity.includes('compensationPreviewRoot') && activity.includes('sourceToSharesPreviewRoot')), + predicateResult('terminal-workbench-shows-compensation-rows', SOURCE_ROOTS.terminalWorkbench, workbench.includes('Compensation state') && workbench.includes('Source-to-shares preview root')), + predicateResult('workspace-run-carries-compensation-fields', SOURCE_ROOTS.terminalRunData, runData.includes('compensationState') && runData.includes('compensationPriceAsset')), + predicateResult('asset-pack-readme-documents-compensation-preview', SOURCE_ROOTS.assetPackReadme, readme.includes('compensation preview') && readme.includes('source-to-shares')), + predicateResult('v42-spec-gate2-expanded', SOURCE_ROOTS.v42Spec, spec.includes('V42 Gate 2') && spec.includes('compensation route preview')), + predicateResult('v42-delta-gate2-implemented', SOURCE_ROOTS.v42Delta, delta.includes('Gate 2') && delta.includes('Depository admission proof')), + predicateResult('v42-notes-gate2-rehearsal', SOURCE_ROOTS.v42Notes, notes.includes('Gate 2') && notes.includes('staging-testnet')), + predicateResult('v42-parity-gate2-closed', SOURCE_ROOTS.v42Parity, parity.includes('Depositing shortest path') && parity.includes('implemented')), + predicateResult('roadmap-current-gate-advanced', SOURCE_ROOTS.roadmap, roadmap.includes('Current working gate: V42 Gate 2') && roadmap.includes('V42 Gate 2 closure anchor')), + ]; +} + +export function buildV42DepositingShortestPath(options = {}) { + const repoRoot = options.repoRoot || DEFAULT_REPO_ROOT; + const predicateResults = buildPredicateResults(repoRoot); + const failedPredicateIds = predicateResults + .filter((predicate) => !predicate.passed) + .map((predicate) => predicate.id); + const rowRoots = V42_DEPOSITING_SHORTEST_PATH_ROWS.map((item) => item.rowRoot); + const artifactRoot = `v42-depositing-shortest-path:${digest(JSON.stringify({ + rowRoots, + failedPredicateIds, + }))}`; + + return { + artifactId: 'v42-depositing-shortest-path', + schemaId: V42_DEPOSITING_SHORTEST_PATH_SCHEMA_ID, + version: V42_DEPOSITING_SHORTEST_PATH_VERSION, + currentTarget: V42_DEPOSITING_SHORTEST_PATH_CURRENT_TARGET, + sourceSafetyVerdict: V42_DEPOSITING_SHORTEST_PATH_SOURCE_SAFETY_VERDICT, + generatedAt: 'deterministic', + artifactRoot, + passed: failedPredicateIds.length === 0, + rows: V42_DEPOSITING_SHORTEST_PATH_ROWS, + rowIds: [...V42_DEPOSITING_SHORTEST_PATH_ROW_IDS], + predicateResults, + coverage: { + rowCount: V42_DEPOSITING_SHORTEST_PATH_ROWS.length, + requiredPredicateCount: predicateResults.length, + passedPredicateCount: predicateResults.length - failedPredicateIds.length, + failedPredicateIds, + acceptedUserPath: [ + 'provide-source-material', + 'select-repository-source-anchor', + 'admit-deposit-to-depository', + 'receive-source-safe-admission-proof', + 'view-later-btc-compensation-attribution', + ], + routeApiContractsCovered: true, + sourceValidationCovered: true, + storageProjectionCovered: true, + depositorySearchDocumentCovered: true, + sourceToSharesCompensationReadbackCovered: true, + terminalCompensationVisibilityCovered: true, + localStagingRehearsalCovered: true, + sourceSafeMetadataOnly: true, + protectedSourceVisible: false, + rawSourceTextVisible: false, + credentialsSerialized: false, + walletPrivateMaterialVisible: false, + unpaidAssetPackSourceVisible: false, + settlementPrivatePayloadVisible: false, + btdMintedAtDepositAdmission: false, + btdRightsTransferredBeforeSettlement: false, + compensationAllocationMethod: 'source-to-shares-largest-remainder', + compensationPriceAsset: 'BTC', + legacySourceRoots: Object.values(SOURCE_ROOTS).some((sourcePath) => sourcePath.includes('_legacy/')), + }, + sourceRoots: SOURCE_ROOTS, + }; +} diff --git a/packages/protocol/src/index.d.ts b/packages/protocol/src/index.d.ts index a92592d8..d163ccbe 100644 --- a/packages/protocol/src/index.d.ts +++ b/packages/protocol/src/index.d.ts @@ -512,6 +512,14 @@ export const V41_PROMOTION_READINESS_GATE_ARTIFACT_PATHS: readonly string[]; export const V41_PROMOTION_READINESS_GENERATED_OUTPUTS: readonly string[]; export function buildV41PromotionReadinessReport(input?: Record): BitcodeProtocolReport; export function listMissingV41PromotionReadinessSources(repoRoot?: string): string[]; +export const V42_DEPOSITING_SHORTEST_PATH_ARTIFACT_PATH: string; +export const V42_DEPOSITING_SHORTEST_PATH_CURRENT_TARGET: string; +export const V42_DEPOSITING_SHORTEST_PATH_SCHEMA_ID: string; +export const V42_DEPOSITING_SHORTEST_PATH_VERSION: string; +export const V42_DEPOSITING_SHORTEST_PATH_SOURCE_SAFETY_VERDICT: string; +export const V42_DEPOSITING_SHORTEST_PATH_ROW_IDS: readonly string[]; +export const V42_DEPOSITING_SHORTEST_PATH_ROWS: readonly Record[]; +export function buildV42DepositingShortestPath(input?: Record): BitcodeProtocolReport; export const EXCHANGE_INTENT_ORDER_CONTRACTS_ARTIFACT_PATH: string; export const EXCHANGE_INTENT_ORDER_CONTRACTS_CURRENT_TARGET: string; export const EXCHANGE_INTENT_ORDER_CONTRACTS_SCHEMA_ID: string; diff --git a/packages/protocol/src/index.js b/packages/protocol/src/index.js index 5f856b34..307cc3f8 100644 --- a/packages/protocol/src/index.js +++ b/packages/protocol/src/index.js @@ -570,6 +570,16 @@ export { buildV41PromotionReadinessReport, listMissingV41PromotionReadinessSources } from './canonical/v41-promotion-readiness-report.js'; +export { + V42_DEPOSITING_SHORTEST_PATH_ARTIFACT_PATH, + V42_DEPOSITING_SHORTEST_PATH_CURRENT_TARGET, + V42_DEPOSITING_SHORTEST_PATH_ROW_IDS, + V42_DEPOSITING_SHORTEST_PATH_ROWS, + V42_DEPOSITING_SHORTEST_PATH_SCHEMA_ID, + V42_DEPOSITING_SHORTEST_PATH_SOURCE_SAFETY_VERDICT, + V42_DEPOSITING_SHORTEST_PATH_VERSION, + buildV42DepositingShortestPath +} from './canonical/v42-depositing-shortest-path.js'; export { EXCHANGE_INTENT_ACTION_KINDS, EXCHANGE_INTENT_ORDER_CONTRACTS_ARTIFACT_PATH, diff --git a/packages/protocol/test/protocol-package-boundary.test.js b/packages/protocol/test/protocol-package-boundary.test.js index cd208df8..f2e54669 100644 --- a/packages/protocol/test/protocol-package-boundary.test.js +++ b/packages/protocol/test/protocol-package-boundary.test.js @@ -154,6 +154,31 @@ test('@bitcode/protocol accepts live repository revision deposits without demo i assert.equal(result.depositoryEvidence.searchDocuments.vector.embeddingPolicy.model, 'text-embedding-3-small'); assert.equal(result.depositoryEvidence.searchDocuments.vector.embeddingPolicy.dimensions, 1536); assert.equal(result.depositoryEvidence.searchDocuments.vector.embeddingPolicy.vectorStore.rpc, 'match_deliverable_vectors'); + assert.equal(result.depositoryEvidence.compensationPreview.state, 'eligible-if-selected-for-assetpack'); + assert.equal(result.depositoryEvidence.compensationPreview.compensationRoute.priceAsset, 'BTC'); + assert.equal( + result.depositoryEvidence.compensationPreview.compensationRoute.allocationMethod, + 'source-to-shares-largest-remainder', + ); + assert.equal( + result.depositoryEvidence.compensationPreview.compensationRoute.btdMintBoundary, + 'not-minted-by-deposit-admission', + ); + assert.equal(result.depositoryEvidence.compensationPreview.visibility.protectedSourceVisible, false); + assert.equal(result.depositoryEvidence.compensationPreview.visibility.unpaidAssetPackSourceVisible, false); + assert.equal(result.depositoryEvidence.compensationPreview.readiness.eligibleForFindingFits, true); + assert.equal(result.depositoryEvidence.compensationPreview.readiness.eligibleForCompensationIfSelected, true); + assert.match(result.depositoryEvidence.compensationPreviewRoot, /^sha256:[a-f0-9]{64}$/); + assert.match(result.depositoryEvidence.sourceToSharesPreviewRoot, /^sha256:[a-f0-9]{64}$/); + assert.equal( + result.asset.compensationPreview.roots.compensationPreviewRoot, + result.depositoryEvidence.compensationPreviewRoot, + ); + const state = app.getState('internal'); + assert.equal( + state.ledger.accounts[`depositor:${result.depositoryEvidence.depositorBoundary.walletId}:eligible_compensation_routes`], + '1', + ); const depositedText = result.asset.contentUnits?.[0]?.text; assert.match(depositedText, /Bitcode repository revision deposit/); assert.match(depositedText, /Repository: engineeredsoftware\/ENGI/); diff --git a/packages/protocol/test/v42-depositing-shortest-path.test.js b/packages/protocol/test/v42-depositing-shortest-path.test.js new file mode 100644 index 00000000..cdc27eac --- /dev/null +++ b/packages/protocol/test/v42-depositing-shortest-path.test.js @@ -0,0 +1,70 @@ +import assert from 'node:assert/strict'; +import test from 'node:test'; + +import { + V42_DEPOSITING_SHORTEST_PATH_ARTIFACT_PATH, + V42_DEPOSITING_SHORTEST_PATH_ROW_IDS, + V42_DEPOSITING_SHORTEST_PATH_ROWS, + V42_DEPOSITING_SHORTEST_PATH_SCHEMA_ID, + V42_DEPOSITING_SHORTEST_PATH_SOURCE_SAFETY_VERDICT, + buildV42DepositingShortestPath, +} from '../src/canonical/v42-depositing-shortest-path.js'; + +test('V42 Depositing shortest path report binds admission proof and compensation visibility', () => { + const report = buildV42DepositingShortestPath(); + + assert.equal(V42_DEPOSITING_SHORTEST_PATH_ARTIFACT_PATH, '.bitcode/v42-depositing-shortest-path.json'); + assert.equal(report.artifactId, 'v42-depositing-shortest-path'); + assert.equal(report.schemaId, V42_DEPOSITING_SHORTEST_PATH_SCHEMA_ID); + assert.equal(report.version, 'V42'); + assert.equal(report.currentTarget, 'V41'); + assert.equal(report.sourceSafetyVerdict, V42_DEPOSITING_SHORTEST_PATH_SOURCE_SAFETY_VERDICT); + assert.equal(report.passed, true); + assert.deepEqual(report.rowIds, [...V42_DEPOSITING_SHORTEST_PATH_ROW_IDS]); + assert.equal(report.rows.length, V42_DEPOSITING_SHORTEST_PATH_ROWS.length); + assert.equal(report.coverage.rowCount, 8); + assert.deepEqual(report.coverage.acceptedUserPath, [ + 'provide-source-material', + 'select-repository-source-anchor', + 'admit-deposit-to-depository', + 'receive-source-safe-admission-proof', + 'view-later-btc-compensation-attribution', + ]); + assert.equal(report.coverage.routeApiContractsCovered, true); + assert.equal(report.coverage.sourceValidationCovered, true); + assert.equal(report.coverage.storageProjectionCovered, true); + assert.equal(report.coverage.depositorySearchDocumentCovered, true); + assert.equal(report.coverage.sourceToSharesCompensationReadbackCovered, true); + assert.equal(report.coverage.terminalCompensationVisibilityCovered, true); + assert.equal(report.coverage.localStagingRehearsalCovered, true); + assert.equal(report.coverage.sourceSafeMetadataOnly, true); + assert.equal(report.coverage.protectedSourceVisible, false); + assert.equal(report.coverage.rawSourceTextVisible, false); + assert.equal(report.coverage.credentialsSerialized, false); + assert.equal(report.coverage.walletPrivateMaterialVisible, false); + assert.equal(report.coverage.unpaidAssetPackSourceVisible, false); + assert.equal(report.coverage.settlementPrivatePayloadVisible, false); + assert.equal(report.coverage.btdMintedAtDepositAdmission, false); + assert.equal(report.coverage.btdRightsTransferredBeforeSettlement, false); + assert.equal(report.coverage.compensationAllocationMethod, 'source-to-shares-largest-remainder'); + assert.equal(report.coverage.compensationPriceAsset, 'BTC'); + assert.equal(report.coverage.legacySourceRoots, false); + assert.deepEqual(report.coverage.failedPredicateIds, []); + assert.ok(report.artifactRoot.startsWith('v42-depositing-shortest-path:')); +}); + +test('V42 Depositing shortest path rows remain source-safe metadata only', () => { + for (const row of V42_DEPOSITING_SHORTEST_PATH_ROWS) { + assert.ok(row.rowRoot.startsWith('v42-depositing-shortest-path-row:')); + assert.equal(row.sourceSafetyClass, 'source_safe_depositing_compensation_visibility_metadata'); + assert.equal(row.sourceSafeMetadataOnly, true); + assert.equal(row.protectedSourceVisible, false); + assert.equal(row.rawSourceTextVisible, false); + assert.equal(row.credentialsSerialized, false); + assert.equal(row.walletPrivateMaterialVisible, false); + assert.equal(row.unpaidAssetPackSourceVisible, false); + assert.equal(row.settlementPrivatePayloadVisible, false); + assert.ok(row.forbiddenPayloadClasses.includes('protected-source-payloads')); + assert.ok(row.forbiddenPayloadClasses.includes('unpaid-assetpack-source')); + } +}); diff --git a/scripts/check-v42-gate2-depositing-shortest-path.mjs b/scripts/check-v42-gate2-depositing-shortest-path.mjs new file mode 100644 index 00000000..12313083 --- /dev/null +++ b/scripts/check-v42-gate2-depositing-shortest-path.mjs @@ -0,0 +1,230 @@ +#!/usr/bin/env node + +import { execFileSync } from 'node:child_process'; +import { existsSync, readFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const defaultRepoRoot = path.resolve(__dirname, '..'); +const ARTIFACT_PATH = '.bitcode/v42-depositing-shortest-path.json'; + +const SECRET_MARKERS = [ + `${['sk', 'proj'].join('-')}-`, + `${['sb', 'secret'].join('_')}__`, + ['service', 'role'].join('_'), + Buffer.from('{"alg":"HS256","typ":"JWT"}').toString('base64url').slice(0, 18), + ['OPENAI', 'API', 'KEY'].join('_'), + ['SUPABASE', 'SERVICE', 'ROLE'].join('_'), + ['VERCEL', 'TOKEN'].join('_'), + ['VERCEL', 'OIDC', 'TOKEN'].join('_'), + ['PRIVATE', 'KEY'].join('_'), +]; + +function read(root, relativePath) { + return readFileSync(path.join(root, relativePath), 'utf8'); +} + +function fileExists(root, relativePath) { + return existsSync(path.join(root, relativePath)); +} + +function git(root, args) { + return execFileSync('git', args, { cwd: root, encoding: 'utf8' }).trim(); +} + +function run(root, command, args) { + return execFileSync(command, args, { + cwd: root, + encoding: 'utf8', + stdio: ['ignore', 'pipe', 'pipe'], + }).trim(); +} + +function assertCheck(failures, condition, message) { + if (!condition) failures.push(message); +} + +function parseArgs(argv) { + const args = { + skipBranchCheck: false, + skipPackageTests: false, + skipUapiTests: false, + repoRoot: defaultRepoRoot, + }; + + for (let index = 0; index < argv.length; index += 1) { + const arg = argv[index]; + if (arg === '--skip-branch-check') args.skipBranchCheck = true; + else if (arg === '--skip-package-tests') args.skipPackageTests = true; + else if (arg === '--skip-uapi-tests') args.skipUapiTests = true; + else if (arg === '--repo-root') args.repoRoot = path.resolve(argv[++index]); + else if (arg === '--help' || arg === '-h') args.help = true; + else throw new Error(`Unknown argument ${arg}`); + } + + return args; +} + +function printHelp() { + process.stdout.write( + [ + 'Usage: node scripts/check-v42-gate2-depositing-shortest-path.mjs [--skip-branch-check] [--skip-package-tests] [--skip-uapi-tests] [--repo-root ]', + '', + 'Checks V42 Gate 2 Depositing shortest path, source-safe admission proof, compensation visibility, generated artifact, docs, and focused tests.', + ].join('\n'), + ); + process.stdout.write('\n'); +} + +function main() { + const args = parseArgs(process.argv.slice(2)); + if (args.help) { + printHelp(); + return; + } + + const root = args.repoRoot; + const failures = []; + const pointer = read(root, 'BITCODE_SPEC.txt').trim(); + + assertCheck( + failures, + pointer === 'V41', + `BITCODE_SPEC.txt must remain V41 during V42 gate work. Observed ${pointer || 'empty'}.`, + ); + + if (!args.skipBranchCheck) { + const branch = git(root, ['branch', '--show-current']); + assertCheck( + failures, + branch === 'version/v42' || /^v42\/gate-(?:2|[3-9]|10)-[a-z0-9][a-z0-9-]*$/u.test(branch), + `V42 Gate 2+ work must occur on version/v42 or v42/gate-2..10-* branches. Observed ${branch || 'detached HEAD'}.`, + ); + } + + const requiredFiles = [ + ARTIFACT_PATH, + 'packages/pipelines/asset-pack/src/depository-supply-index.ts', + 'packages/pipelines/asset-pack/src/__tests__/depository-supply-index.test.ts', + 'packages/pipelines/asset-pack/README.md', + 'packages/protocol/src/canonical/v42-depositing-shortest-path.js', + 'packages/protocol/test/v42-depositing-shortest-path.test.js', + 'packages/protocol/test/protocol-package-boundary.test.js', + 'packages/protocol/server.js', + 'packages/protocol/src/bitcode-demo.js', + 'uapi/app/api/deposits/route.ts', + 'uapi/app/terminal/TerminalDepositComposer.tsx', + 'uapi/app/terminal/terminal-activity-history.ts', + 'uapi/app/terminal/terminal-deposit-read-workbench.ts', + 'uapi/app/terminal/terminal-run-data.ts', + 'scripts/generate-v42-depositing-shortest-path.mjs', + 'scripts/check-v42-gate2-depositing-shortest-path.mjs', + 'BITCODE_SPEC_V42.md', + 'BITCODE_SPEC_V42_DELTA.md', + 'BITCODE_SPEC_V42_NOTES.md', + 'BITCODE_SPEC_V42_PARITY_MATRIX.md', + 'SPECIFICATIONS_ROADMAP.md', + 'README.md', + 'packages/protocol/README.md', + 'package.json', + '.github/workflows/bitcode-gate-quality.yml', + '.github/workflows/bitcode-canon-quality.yml', + ]; + + for (const relativePath of requiredFiles) { + assertCheck(failures, fileExists(root, relativePath), `Missing V42 Gate 2 file: ${relativePath}`); + } + + if (failures.length === 0) { + try { + run(root, 'node', ['scripts/generate-v42-depositing-shortest-path.mjs', '--check']); + } catch (error) { + failures.push(`V42 Depositing shortest path artifact check failed: ${error.stderr || error.message}`); + } + } + + if (failures.length === 0) { + try { + run(root, 'node', [ + '--test', + '--test-force-exit', + 'packages/protocol/test/v42-depositing-shortest-path.test.js', + 'packages/protocol/test/protocol-package-boundary.test.js', + ]); + } catch (error) { + failures.push(`V42 Depositing shortest path protocol tests failed: ${error.stderr || error.message}`); + } + } + + if (failures.length === 0 && !args.skipPackageTests) { + try { + run(root, 'pnpm', [ + '--filter', + '@bitcode/pipeline-asset-pack', + 'exec', + 'jest', + '--config', + 'jest.config.cjs', + '--runTestsByPath', + 'src/__tests__/depository-supply-index.test.ts', + '--runInBand', + '--forceExit', + ]); + } catch (error) { + failures.push(`Depository supply package tests failed: ${error.stderr || error.message}`); + } + } + + const serializedArtifact = fileExists(root, ARTIFACT_PATH) ? read(root, ARTIFACT_PATH) : ''; + for (const marker of SECRET_MARKERS) { + assertCheck(failures, !serializedArtifact.includes(marker), `V42 Gate 2 artifact must not contain secret marker ${marker}.`); + } + + const artifact = serializedArtifact ? JSON.parse(serializedArtifact) : null; + if (artifact) { + assertCheck(failures, artifact.artifactId === 'v42-depositing-shortest-path', 'Gate 2 artifactId must match.'); + assertCheck(failures, artifact.schemaId === 'bitcode.v42.depositingShortestPath.v1', 'Gate 2 schemaId must match.'); + assertCheck(failures, artifact.version === 'V42' && artifact.currentTarget === 'V41', 'Gate 2 artifact must bind V42 over active V41.'); + assertCheck(failures, artifact.passed === true, 'Gate 2 artifact must pass.'); + assertCheck( + failures, + artifact.sourceSafetyVerdict === 'source-safe-depositing-compensation-visibility-metadata', + 'Gate 2 artifact must declare source-safe compensation visibility metadata.', + ); + assertCheck(failures, artifact.coverage.rowCount === 8, 'Gate 2 must cover eight Depositing rows.'); + assertCheck(failures, artifact.coverage.routeApiContractsCovered === true, 'Gate 2 must cover route/API contracts.'); + assertCheck(failures, artifact.coverage.sourceValidationCovered === true, 'Gate 2 must cover source validation.'); + assertCheck(failures, artifact.coverage.storageProjectionCovered === true, 'Gate 2 must cover storage projection.'); + assertCheck(failures, artifact.coverage.depositorySearchDocumentCovered === true, 'Gate 2 must cover Depository search documents.'); + assertCheck(failures, artifact.coverage.sourceToSharesCompensationReadbackCovered === true, 'Gate 2 must cover source-to-shares compensation readback.'); + assertCheck(failures, artifact.coverage.terminalCompensationVisibilityCovered === true, 'Gate 2 must cover Terminal compensation visibility.'); + assertCheck(failures, artifact.coverage.localStagingRehearsalCovered === true, 'Gate 2 must cover local/staging rehearsal posture.'); + assertCheck(failures, artifact.coverage.sourceSafeMetadataOnly === true, 'Gate 2 must remain source-safe metadata only.'); + assertCheck(failures, artifact.coverage.protectedSourceVisible === false, 'Gate 2 artifact must not expose protected source.'); + assertCheck(failures, artifact.coverage.btdMintedAtDepositAdmission === false, 'Gate 2 must not mint BTD at deposit admission.'); + assertCheck(failures, artifact.coverage.btdRightsTransferredBeforeSettlement === false, 'Gate 2 must not transfer BTD rights before settlement.'); + assertCheck(failures, artifact.coverage.compensationAllocationMethod === 'source-to-shares-largest-remainder', 'Gate 2 must bind source-to-shares allocation.'); + assertCheck(failures, artifact.coverage.compensationPriceAsset === 'BTC', 'Gate 2 must bind BTC compensation visibility.'); + assertCheck(failures, artifact.coverage.legacySourceRoots === false, 'Gate 2 must not rely on legacy source roots.'); + assertCheck(failures, Array.isArray(artifact.coverage.failedPredicateIds) && artifact.coverage.failedPredicateIds.length === 0, 'Gate 2 predicates must all pass.'); + } + + const spec = read(root, 'BITCODE_SPEC_V42.md'); + const parity = read(root, 'BITCODE_SPEC_V42_PARITY_MATRIX.md'); + const readme = read(root, 'packages/pipelines/asset-pack/README.md'); + assertCheck(failures, spec.includes('V42 Gate 2') && spec.includes('compensation route preview'), 'V42 spec must expand Gate 2 compensation route preview.'); + assertCheck(failures, parity.includes('Gate 2') && parity.includes('implemented'), 'V42 parity matrix must mark Gate 2 implemented.'); + assertCheck(failures, readme.includes('compensation preview') && readme.includes('source-to-shares'), 'AssetPack README must document compensation preview.'); + + if (failures.length > 0) { + process.stderr.write(`V42 Gate 2 Depositing shortest path check failed:\n- ${failures.join('\n- ')}\n`); + process.exitCode = 1; + return; + } + + process.stdout.write(`V42 Gate 2 Depositing shortest path ok artifact=${artifact.artifactRoot}\n`); +} + +main(); diff --git a/scripts/generate-v42-depositing-shortest-path.mjs b/scripts/generate-v42-depositing-shortest-path.mjs new file mode 100644 index 00000000..4ca1a620 --- /dev/null +++ b/scripts/generate-v42-depositing-shortest-path.mjs @@ -0,0 +1,31 @@ +#!/usr/bin/env node + +import { readFileSync, writeFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { + V42_DEPOSITING_SHORTEST_PATH_ARTIFACT_PATH, + buildV42DepositingShortestPath, +} from '../packages/protocol/src/canonical/v42-depositing-shortest-path.js'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const repoRoot = path.resolve(__dirname, '..'); + +const check = process.argv.includes('--check'); +const artifact = buildV42DepositingShortestPath({ repoRoot }); +const serialized = `${JSON.stringify(artifact, null, 2)}\n`; +const artifactPath = path.join(repoRoot, V42_DEPOSITING_SHORTEST_PATH_ARTIFACT_PATH); + +if (check) { + const current = readFileSync(artifactPath, 'utf8'); + if (current !== serialized) { + process.stderr.write( + `${V42_DEPOSITING_SHORTEST_PATH_ARTIFACT_PATH} is stale. Run pnpm run generate:v42-depositing-shortest-path.\n`, + ); + process.exitCode = 1; + } +} else { + writeFileSync(artifactPath, serialized); + process.stdout.write(`wrote ${V42_DEPOSITING_SHORTEST_PATH_ARTIFACT_PATH}\n`); +} diff --git a/uapi/app/terminal/TerminalDepositComposer.tsx b/uapi/app/terminal/TerminalDepositComposer.tsx index 2daea862..8e799f7e 100644 --- a/uapi/app/terminal/TerminalDepositComposer.tsx +++ b/uapi/app/terminal/TerminalDepositComposer.tsx @@ -44,6 +44,24 @@ type TerminalDepositResponseEvidence = { depositorySearchDocumentRoot?: string | null; lexicalDocumentRoot?: string | null; vectorDocumentRoot?: string | null; + compensationPreviewRoot?: string | null; + sourceToSharesPreviewRoot?: string | null; + compensationPreview?: { + state?: string | null; + readiness?: { + eligibleForFindingFits?: boolean | null; + eligibleForCompensationIfSelected?: boolean | null; + blockers?: string[] | null; + warnings?: string[] | null; + } | null; + compensationRoute?: { + priceAsset?: string | null; + allocationMethod?: string | null; + sourceToSharesProofState?: string | null; + btdMintBoundary?: string | null; + btdRightsTransferBoundary?: string | null; + } | null; + } | null; depositorBoundary?: { walletId?: string | null; } | null; @@ -318,6 +336,7 @@ export default function TerminalDepositComposer({ depositoryEvidence?: TerminalDepositResponseEvidence | null; }; const depositoryEvidence = payload.depositoryEvidence || payload.asset?.depositoryEvidence || null; + const compensationPreview = depositoryEvidence?.compensationPreview || null; await runControl((controls) => controls.refresh?.()); setTitle(''); @@ -355,6 +374,15 @@ export default function TerminalDepositComposer({ depositorySearchDocumentRoot: depositoryEvidence?.depositorySearchDocumentRoot || null, lexicalDocumentRoot: depositoryEvidence?.lexicalDocumentRoot || null, vectorDocumentRoot: depositoryEvidence?.vectorDocumentRoot || null, + compensationPreviewRoot: depositoryEvidence?.compensationPreviewRoot || null, + sourceToSharesPreviewRoot: depositoryEvidence?.sourceToSharesPreviewRoot || null, + compensationState: compensationPreview?.state || null, + compensationAllocationMethod: compensationPreview?.compensationRoute?.allocationMethod || null, + compensationPriceAsset: compensationPreview?.compensationRoute?.priceAsset || null, + compensationEligibleForFindingFits: + compensationPreview?.readiness?.eligibleForFindingFits ?? null, + compensationEligibleIfSelected: + compensationPreview?.readiness?.eligibleForCompensationIfSelected ?? null, depositorWalletId: depositoryEvidence?.depositorBoundary?.walletId || null, depositoryIndexState: depositoryEvidence?.indexState?.vector || depositoryEvidence?.indexState?.lexical || null, }, @@ -787,6 +815,16 @@ export default function TerminalDepositComposer({ Submitting refreshes the working chain so selected supply, measured demand, fit, and later branch, proof, and settlement reads stay aligned in the same Bitcode Terminal.

+
+
+
Compensation route
+
BTC source-to-shares preview if this deposit is selected into a paid AssetPack
+
+
+
Pre-fit boundary
+
No BTD mint or source-bearing reader visibility at deposit admission
+
+
diff --git a/uapi/app/terminal/TerminalPageClient.tsx b/uapi/app/terminal/TerminalPageClient.tsx index 37437b67..33d0e3ca 100644 --- a/uapi/app/terminal/TerminalPageClient.tsx +++ b/uapi/app/terminal/TerminalPageClient.tsx @@ -329,6 +329,11 @@ export default function TerminalPageClient() { depositorySearchDocumentRoot: matchingSubmission.depositorySearchDocumentRoot || null, lexicalDocumentRoot: matchingSubmission.lexicalDocumentRoot || null, vectorDocumentRoot: matchingSubmission.vectorDocumentRoot || null, + compensationPreviewRoot: matchingSubmission.compensationPreviewRoot || null, + sourceToSharesPreviewRoot: matchingSubmission.sourceToSharesPreviewRoot || null, + compensationState: matchingSubmission.compensationState || null, + compensationAllocationMethod: matchingSubmission.compensationAllocationMethod || null, + compensationPriceAsset: matchingSubmission.compensationPriceAsset || null, depositorWalletId: matchingSubmission.depositorWalletId || null, depositoryIndexState: matchingSubmission.depositoryIndexState || null, }; diff --git a/uapi/app/terminal/terminal-activity-history.ts b/uapi/app/terminal/terminal-activity-history.ts index 5fde0e8d..900da747 100644 --- a/uapi/app/terminal/terminal-activity-history.ts +++ b/uapi/app/terminal/terminal-activity-history.ts @@ -678,6 +678,23 @@ export function mapExecutionHistoryRunToWorkspaceRun(run: PipelineExecution): Wo contextString('lexicalDocumentRoot') || readNestedString(run.output, ['depositoryEvidence', 'lexicalDocumentRoot']), vectorDocumentRoot: contextString('vectorDocumentRoot') || readNestedString(run.output, ['depositoryEvidence', 'vectorDocumentRoot']), + compensationPreviewRoot: + contextString('compensationPreviewRoot') || + readNestedString(run.output, ['depositoryEvidence', 'compensationPreviewRoot']) || + readNestedString(run.output, ['depositoryEvidence', 'compensationPreview', 'roots', 'compensationPreviewRoot']), + sourceToSharesPreviewRoot: + contextString('sourceToSharesPreviewRoot') || + readNestedString(run.output, ['depositoryEvidence', 'sourceToSharesPreviewRoot']) || + readNestedString(run.output, ['depositoryEvidence', 'compensationPreview', 'roots', 'sourceToSharesPreviewRoot']), + compensationState: + contextString('compensationState') || + readNestedString(run.output, ['depositoryEvidence', 'compensationPreview', 'state']), + compensationAllocationMethod: + contextString('compensationAllocationMethod') || + readNestedString(run.output, ['depositoryEvidence', 'compensationPreview', 'compensationRoute', 'allocationMethod']), + compensationPriceAsset: + contextString('compensationPriceAsset') || + readNestedString(run.output, ['depositoryEvidence', 'compensationPreview', 'compensationRoute', 'priceAsset']), depositorWalletId: contextString('depositorWalletId') || readNestedString(run.output, ['depositoryEvidence', 'depositorBoundary', 'walletId']), diff --git a/uapi/app/terminal/terminal-deposit-read-workbench.ts b/uapi/app/terminal/terminal-deposit-read-workbench.ts index 4f6c6b9c..c8aa08eb 100644 --- a/uapi/app/terminal/terminal-deposit-read-workbench.ts +++ b/uapi/app/terminal/terminal-deposit-read-workbench.ts @@ -33,6 +33,11 @@ export type TerminalDepositedSourceRevision = TerminalSourceRevision & { depositorySearchDocumentRoot?: string | null; lexicalDocumentRoot?: string | null; vectorDocumentRoot?: string | null; + compensationPreviewRoot?: string | null; + sourceToSharesPreviewRoot?: string | null; + compensationState?: string | null; + compensationAllocationMethod?: string | null; + compensationPriceAsset?: string | null; depositorWalletId?: string | null; depositoryIndexState?: string | null; }; @@ -94,6 +99,11 @@ type ShellSnapshot = { depositorySearchDocumentRoot?: string | null; lexicalDocumentRoot?: string | null; vectorDocumentRoot?: string | null; + compensationPreviewRoot?: string | null; + sourceToSharesPreviewRoot?: string | null; + compensationState?: string | null; + compensationAllocationMethod?: string | null; + compensationPriceAsset?: string | null; depositorWalletId?: string | null; depositoryIndexState?: string | null; } | null; @@ -232,6 +242,11 @@ export function buildLiveTerminalDepositReadWorkbenchSnapshot( depositorySearchDocumentRoot: matchingDepositedRevision?.depositorySearchDocumentRoot || null, lexicalDocumentRoot: matchingDepositedRevision?.lexicalDocumentRoot || null, vectorDocumentRoot: matchingDepositedRevision?.vectorDocumentRoot || null, + compensationPreviewRoot: matchingDepositedRevision?.compensationPreviewRoot || null, + sourceToSharesPreviewRoot: matchingDepositedRevision?.sourceToSharesPreviewRoot || null, + compensationState: matchingDepositedRevision?.compensationState || null, + compensationAllocationMethod: matchingDepositedRevision?.compensationAllocationMethod || null, + compensationPriceAsset: matchingDepositedRevision?.compensationPriceAsset || null, depositorWalletId: matchingDepositedRevision?.depositorWalletId || null, depositoryIndexState: matchingDepositedRevision?.depositoryIndexState || null, }, @@ -406,6 +421,11 @@ export function normalizeTerminalDepositReadWorkbench( const depositorySearchDocumentRoot = textValue(snapshot.depositingSurface?.depositorySearchDocumentRoot); const lexicalDocumentRoot = textValue(snapshot.depositingSurface?.lexicalDocumentRoot); const vectorDocumentRoot = textValue(snapshot.depositingSurface?.vectorDocumentRoot); + const compensationPreviewRoot = textValue(snapshot.depositingSurface?.compensationPreviewRoot); + const sourceToSharesPreviewRoot = textValue(snapshot.depositingSurface?.sourceToSharesPreviewRoot); + const compensationState = textValue(snapshot.depositingSurface?.compensationState); + const compensationAllocationMethod = textValue(snapshot.depositingSurface?.compensationAllocationMethod); + const compensationPriceAsset = textValue(snapshot.depositingSurface?.compensationPriceAsset); const depositorWalletId = textValue(snapshot.depositingSurface?.depositorWalletId); const depositoryIndexState = textValue(snapshot.depositingSurface?.depositoryIndexState); const sourceProofRootCount = [ @@ -418,6 +438,10 @@ export function normalizeTerminalDepositReadWorkbench( lexicalDocumentRoot, vectorDocumentRoot, ].filter(Boolean).length; + const compensationRootCount = [ + compensationPreviewRoot, + sourceToSharesPreviewRoot, + ].filter(Boolean).length; const sourceRevisionRepository = textValue(snapshot.sourceRevision?.repositoryFullName) || repositoryLabel; const sourceRevisionBranch = textValue(snapshot.sourceRevision?.branch) || @@ -448,6 +472,7 @@ export function normalizeTerminalDepositReadWorkbench( }, { label: 'Source proof roots', value: numberValue(sourceProofRootCount) }, { label: 'Search document roots', value: numberValue(searchDocumentRootCount) }, + { label: 'Compensation roots', value: numberValue(compensationRootCount) }, ] : [ { label: 'Selected refs', value: numberValue(snapshot.inventory?.selectedCount) }, @@ -456,6 +481,7 @@ export function normalizeTerminalDepositReadWorkbench( { label: 'Authenticated repos', value: numberValue(snapshot.repoSupplySummary?.repoCount) }, { label: 'Source proof roots', value: numberValue(sourceProofRootCount) }, { label: 'Search document roots', value: numberValue(searchDocumentRootCount) }, + { label: 'Compensation roots', value: numberValue(compensationRootCount) }, ]; return { @@ -547,6 +573,26 @@ export function normalizeTerminalDepositReadWorkbench( label: 'Vector document root', value: vectorDocumentRoot || '—', }, + { + label: 'Compensation state', + value: compensationState || '—', + }, + { + label: 'Compensation asset', + value: compensationPriceAsset || '—', + }, + { + label: 'Source-to-shares method', + value: compensationAllocationMethod || '—', + }, + { + label: 'Compensation preview root', + value: compensationPreviewRoot || '—', + }, + { + label: 'Source-to-shares preview root', + value: sourceToSharesPreviewRoot || '—', + }, { label: 'Depository index', value: depositoryIndexState || '—', diff --git a/uapi/app/terminal/terminal-run-data.ts b/uapi/app/terminal/terminal-run-data.ts index 84be1f2d..46de2176 100644 --- a/uapi/app/terminal/terminal-run-data.ts +++ b/uapi/app/terminal/terminal-run-data.ts @@ -16,6 +16,11 @@ export type WorkspaceRun = Pick Date: Thu, 28 May 2026 17:41:40 -0300 Subject: [PATCH 04/35] V42 Gate 3: Add Reading Shortest Path State Machine Implement the source-safe Reading route state contract with recoverable transaction ids, readingStage hydration, retry/restart posture, failure repair actions, and Terminal route projection. Add the V42 Reading shortest path artifact, generator, checker, protocol export/test, workflow wiring, and documentation/parity updates, including V43+ UX route-renaming scope for Packs, Read, and Deposit. --- .bitcode/v42-depositing-shortest-path.json | 2 +- ...2-reading-shortest-path-state-machine.json | 575 ++++++++++++++++++ .github/workflows/bitcode-canon-quality.yml | 3 + .github/workflows/bitcode-gate-quality.yml | 3 + BITCODE_SPEC_V42.md | 11 +- BITCODE_SPEC_V42_DELTA.md | 3 + BITCODE_SPEC_V42_NOTES.md | 5 + BITCODE_SPEC_V42_PARITY_MATRIX.md | 4 +- README.md | 9 +- SPECIFICATIONS_ROADMAP.md | 7 +- package.json | 3 + packages/protocol/README.md | 9 + .../canonical/v42-depositing-shortest-path.js | 6 +- ...v42-reading-shortest-path-state-machine.js | 324 ++++++++++ packages/protocol/src/index.d.ts | 9 + packages/protocol/src/index.js | 11 + ...eading-shortest-path-state-machine.test.js | 77 +++ ...e3-reading-shortest-path-state-machine.mjs | 240 ++++++++ ...42-reading-shortest-path-state-machine.mjs | 31 + uapi/app/terminal/README.md | 10 + .../terminal/TerminalDepositReadWorkbench.tsx | 17 +- uapi/app/terminal/TerminalPageClient.tsx | 1 + .../terminal-enterprise-reading-ux-state.ts | 116 +++- .../terminalEnterpriseReadingUxState.test.ts | 37 ++ 24 files changed, 1502 insertions(+), 11 deletions(-) create mode 100644 .bitcode/v42-reading-shortest-path-state-machine.json create mode 100644 packages/protocol/src/canonical/v42-reading-shortest-path-state-machine.js create mode 100644 packages/protocol/test/v42-reading-shortest-path-state-machine.test.js create mode 100644 scripts/check-v42-gate3-reading-shortest-path-state-machine.mjs create mode 100644 scripts/generate-v42-reading-shortest-path-state-machine.mjs diff --git a/.bitcode/v42-depositing-shortest-path.json b/.bitcode/v42-depositing-shortest-path.json index d6833815..e8a84d7f 100644 --- a/.bitcode/v42-depositing-shortest-path.json +++ b/.bitcode/v42-depositing-shortest-path.json @@ -424,7 +424,7 @@ "passed": true }, { - "id": "roadmap-current-gate-advanced", + "id": "roadmap-records-gate2-closure", "sourcePath": "SPECIFICATIONS_ROADMAP.md", "passed": true } diff --git a/.bitcode/v42-reading-shortest-path-state-machine.json b/.bitcode/v42-reading-shortest-path-state-machine.json new file mode 100644 index 00000000..a5f4b88e --- /dev/null +++ b/.bitcode/v42-reading-shortest-path-state-machine.json @@ -0,0 +1,575 @@ +{ + "artifactId": "v42-reading-shortest-path-state-machine", + "schemaId": "bitcode.v42.readingShortestPathStateMachine.v1", + "version": "V42", + "currentTarget": "V41", + "sourceSafetyVerdict": "source-safe-reading-shortest-path-state-machine-metadata", + "generatedAt": "deterministic", + "artifactRoot": "v42-reading-shortest-path-state-machine:c30584924864342dafe806b5", + "passed": true, + "rows": [ + { + "rowId": "state:five-step-shortest-path", + "purpose": "Preserve exactly five enterprise Reading steps from Read Request through Need review, Finding Fits, AssetPack preview, and settlement delivery.", + "sourceRoots": [ + "uapi/app/terminal/terminal-enterprise-reading-ux-state.ts", + "uapi/app/terminal/TerminalDepositReadWorkbench.tsx" + ], + "emittedTypes": [ + "TerminalEnterpriseReadingUxState", + "TerminalEnterpriseReadingStepView" + ], + "requiredEvidence": [ + "request-read", + "review-synthesized-need", + "request-fit", + "review-synthesized-asset-pack", + "buy-asset-pack-settle" + ], + "rowRoot": "v42-reading-shortest-path-state-machine-row:f5bccf679eaefd791e5f0c19", + "sourceSafetyClass": "source_safe_reading_shortest_path_state_machine_metadata", + "sourceSafeMetadataOnly": true, + "lowDetailDefault": true, + "expandableSourceSafeDetail": true, + "protectedSourceVisible": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "ledgerAuthorityClaimed": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "ledger-write-authority", + "secret-values" + ] + }, + { + "rowId": "route:transaction-stage-persistence", + "purpose": "Bind Reading state to recoverable transaction ids and readingStage route state so refresh, restart, and route handoff preserve the active stage.", + "sourceRoots": [ + "uapi/app/terminal/terminal-enterprise-reading-ux-state.ts", + "uapi/app/terminal/terminal-transaction-query.ts", + "uapi/app/terminal/TerminalPageClient.tsx", + "uapi/app/terminal/TerminalDepositReadWorkbench.tsx" + ], + "emittedTypes": [ + "TerminalEnterpriseReadingRouteState", + "TerminalConversationHandoffContext.readingStage" + ], + "requiredEvidence": [ + "transactionIdRequiredForRecovery", + "readingStageQueryParam", + "activeStageHydratedFromRoute" + ], + "rowRoot": "v42-reading-shortest-path-state-machine-row:8d27b75c5cb5dc6528241458", + "sourceSafetyClass": "source_safe_reading_shortest_path_state_machine_metadata", + "sourceSafeMetadataOnly": true, + "lowDetailDefault": true, + "expandableSourceSafeDetail": true, + "protectedSourceVisible": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "ledgerAuthorityClaimed": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "ledger-write-authority", + "secret-values" + ] + }, + { + "rowId": "transition:accepted-need-before-finding-fits", + "purpose": "Make accepted Need the hard transition before Finding Fits, preview, settlement, or delivery can proceed.", + "sourceRoots": [ + "uapi/app/terminal/terminal-enterprise-reading-ux-state.ts", + "uapi/app/terminal/TerminalDepositReadWorkbench.tsx", + "uapi/app/conversations/conversation-terminal-handoff.ts" + ], + "emittedTypes": [ + "acceptedNeedRequiredBeforeFindingFits", + "TerminalReadNeedState" + ], + "requiredEvidence": [ + "accepted Need required", + "ReadNeedComprehensionSynthesis", + "ReadFitsFindingSynthesis" + ], + "rowRoot": "v42-reading-shortest-path-state-machine-row:f9d95c5e18d4566c693e32c1", + "sourceSafetyClass": "source_safe_reading_shortest_path_state_machine_metadata", + "sourceSafeMetadataOnly": true, + "lowDetailDefault": true, + "expandableSourceSafeDetail": true, + "protectedSourceVisible": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "ledgerAuthorityClaimed": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "ledger-write-authority", + "secret-values" + ] + }, + { + "rowId": "retry:restart-and-failure-repair", + "purpose": "Represent retry, restart, and failure repair posture as source-safe state metadata without exposing protected source, prompts, provider responses, wallet material, or settlement payloads.", + "sourceRoots": [ + "uapi/app/terminal/terminal-enterprise-reading-ux-state.ts", + "uapi/tests/terminalEnterpriseReadingUxState.test.ts", + "uapi/app/terminal/TerminalDepositReadWorkbench.tsx" + ], + "emittedTypes": [ + "TerminalEnterpriseReadingFailureKind", + "TerminalEnterpriseReadingRouteState.failureRepairActions" + ], + "requiredEvidence": [ + "retryPreservesNeedLineage", + "restartRestoresActiveStage", + "failureRepairActions" + ], + "rowRoot": "v42-reading-shortest-path-state-machine-row:8255affa47cdbf93089ab9cc", + "sourceSafetyClass": "source_safe_reading_shortest_path_state_machine_metadata", + "sourceSafeMetadataOnly": true, + "lowDetailDefault": true, + "expandableSourceSafeDetail": true, + "protectedSourceVisible": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "ledgerAuthorityClaimed": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "ledger-write-authority", + "secret-values" + ] + }, + { + "rowId": "ui:low-detail-proof-on-expand", + "purpose": "Keep the default Reading view guided and low-detail while details expand to source-safe proof roots, measurements, blockers, and visible field ids.", + "sourceRoots": [ + "uapi/app/terminal/terminal-enterprise-reading-ux-state.ts", + "uapi/app/terminal/TerminalDepositReadWorkbench.tsx", + "uapi/app/terminal/README.md" + ], + "emittedTypes": [ + "TerminalEnterpriseReadingUxState.disclosure" + ], + "requiredEvidence": [ + "lowDetailDefault", + "expandableSourceSafeDetail", + "Source-safe detail" + ], + "rowRoot": "v42-reading-shortest-path-state-machine-row:bc5d512f5a40eab14e0cc0a5", + "sourceSafetyClass": "source_safe_reading_shortest_path_state_machine_metadata", + "sourceSafeMetadataOnly": true, + "lowDetailDefault": true, + "expandableSourceSafeDetail": true, + "protectedSourceVisible": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "ledgerAuthorityClaimed": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "ledger-write-authority", + "secret-values" + ] + }, + { + "rowId": "stream:rich-reading-pipeline-telemetry", + "purpose": "Keep Reading pipeline progress inspectable through rich execution stream rows for phase, PTRR step, ThricifiedGeneration, tool, prompt-template id, output schema, and parsed-result posture.", + "sourceRoots": [ + "uapi/app/terminal/terminal-pipeline-harness-client.ts", + "uapi/tests/pipelineExecutionLogHeader.test.tsx", + "uapi/app/terminal/TerminalDepositReadWorkbench.tsx" + ], + "emittedTypes": [ + "TerminalReadFitsFindingSynthesisHarnessEvent", + "ExecutionLogItem" + ], + "requiredEvidence": [ + "pipelinePhaseId", + "ptrrStepId", + "thricifiedGenerationId", + "promptTemplateId", + "outputSchema" + ], + "rowRoot": "v42-reading-shortest-path-state-machine-row:f84a65471fa1a4ff2dc6a8be", + "sourceSafetyClass": "source_safe_reading_shortest_path_state_machine_metadata", + "sourceSafeMetadataOnly": true, + "lowDetailDefault": true, + "expandableSourceSafeDetail": true, + "protectedSourceVisible": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "ledgerAuthorityClaimed": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "ledger-write-authority", + "secret-values" + ] + }, + { + "rowId": "activity:history-and-workbench-readback", + "purpose": "Project Reading state through activity history and workbench readback so transaction detail, proof roots, and compensation/settlement posture remain recoverable.", + "sourceRoots": [ + "uapi/app/terminal/terminal-activity-history.ts", + "uapi/app/terminal/TerminalDepositReadWorkbench.tsx", + "uapi/app/terminal/terminal-deposit-read-workbench.ts" + ], + "emittedTypes": [ + "WorkspaceRun", + "TerminalDepositReadWorkbench" + ], + "requiredEvidence": [ + "assetPackCompletion", + "TerminalDepositedSourceRevision", + "sourceRevision" + ], + "rowRoot": "v42-reading-shortest-path-state-machine-row:96ceba0e8af3d5ad27fcab3c", + "sourceSafetyClass": "source_safe_reading_shortest_path_state_machine_metadata", + "sourceSafeMetadataOnly": true, + "lowDetailDefault": true, + "expandableSourceSafeDetail": true, + "protectedSourceVisible": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "ledgerAuthorityClaimed": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "ledger-write-authority", + "secret-values" + ] + }, + { + "rowId": "tests:route-state-contracts", + "purpose": "Prove the state machine through route-state tests, component state tests, Conversation handoff tests, workbench tests, and stream-header tests.", + "sourceRoots": [ + "uapi/tests/terminalEnterpriseReadingUxState.test.ts", + "uapi/tests/terminalDepositReadWorkbench.test.ts", + "uapi/tests/conversationTerminalHandoff.test.tsx", + "uapi/tests/terminalTransactionQuery.test.ts", + "uapi/tests/pipelineExecutionLogHeader.test.tsx", + ".github/workflows/bitcode-gate-quality.yml" + ], + "emittedTypes": [ + "V42ReadingShortestPathStateMachineReport" + ], + "requiredEvidence": [ + "terminal-enterprise-reading-ux-state", + "readingStage=request-fit", + "Browser proof Terminal cockpit" + ], + "rowRoot": "v42-reading-shortest-path-state-machine-row:e06bfe55a25e9021a4fb3780", + "sourceSafetyClass": "source_safe_reading_shortest_path_state_machine_metadata", + "sourceSafeMetadataOnly": true, + "lowDetailDefault": true, + "expandableSourceSafeDetail": true, + "protectedSourceVisible": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "ledgerAuthorityClaimed": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "ledger-write-authority", + "secret-values" + ] + }, + { + "rowId": "spec:v42-gate3-closure", + "purpose": "Bind V42 Gate 3 to SPEC, DELTA, NOTES, PARITY, roadmap, README, workflow, generated artifact, and checker closure.", + "sourceRoots": [ + "BITCODE_SPEC_V42.md", + "BITCODE_SPEC_V42_DELTA.md", + "BITCODE_SPEC_V42_NOTES.md", + "BITCODE_SPEC_V42_PARITY_MATRIX.md", + "SPECIFICATIONS_ROADMAP.md", + "README.md", + "packages/protocol/README.md" + ], + "emittedTypes": [ + "V42ReadingShortestPathStateMachineReport" + ], + "requiredEvidence": [ + "V42 Gate 3", + "reading shortest path state machine", + "check:v42-gate3" + ], + "rowRoot": "v42-reading-shortest-path-state-machine-row:f0bc898ce7bb6757c5924aa9", + "sourceSafetyClass": "source_safe_reading_shortest_path_state_machine_metadata", + "sourceSafeMetadataOnly": true, + "lowDetailDefault": true, + "expandableSourceSafeDetail": true, + "protectedSourceVisible": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "ledgerAuthorityClaimed": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "ledger-write-authority", + "secret-values" + ] + } + ], + "rowIds": [ + "state:five-step-shortest-path", + "route:transaction-stage-persistence", + "transition:accepted-need-before-finding-fits", + "retry:restart-and-failure-repair", + "ui:low-detail-proof-on-expand", + "stream:rich-reading-pipeline-telemetry", + "activity:history-and-workbench-readback", + "tests:route-state-contracts", + "spec:v42-gate3-closure" + ], + "stepIds": [ + "request-read", + "review-synthesized-need", + "request-fit", + "review-synthesized-asset-pack", + "buy-asset-pack-settle" + ], + "predicateResults": [ + { + "id": "ux-state-keeps-five-step-path", + "sourcePath": "uapi/app/terminal/terminal-enterprise-reading-ux-state.ts", + "passed": true + }, + { + "id": "ux-state-defines-route-state", + "sourcePath": "uapi/app/terminal/terminal-enterprise-reading-ux-state.ts", + "passed": true + }, + { + "id": "ux-state-defines-retry-failure-source-safety", + "sourcePath": "uapi/app/terminal/terminal-enterprise-reading-ux-state.ts", + "passed": true + }, + { + "id": "ux-state-forbids-protected-payloads", + "sourcePath": "uapi/app/terminal/terminal-enterprise-reading-ux-state.ts", + "passed": true + }, + { + "id": "terminal-page-passes-reading-stage", + "sourcePath": "uapi/app/terminal/TerminalPageClient.tsx", + "passed": true + }, + { + "id": "workbench-projects-route-state", + "sourcePath": "uapi/app/terminal/TerminalDepositReadWorkbench.tsx", + "passed": true + }, + { + "id": "workbench-keeps-low-detail-expandable-cards", + "sourcePath": "uapi/app/terminal/TerminalDepositReadWorkbench.tsx", + "passed": true + }, + { + "id": "workbench-contract-reexports-stage-ids", + "sourcePath": "uapi/app/terminal/terminal-deposit-read-workbench.ts", + "passed": true + }, + { + "id": "terminal-query-reads-reading-stage", + "sourcePath": "uapi/app/terminal/terminal-transaction-query.ts", + "passed": true + }, + { + "id": "activity-history-keeps-reading-readback", + "sourcePath": "uapi/app/terminal/terminal-activity-history.ts", + "passed": true + }, + { + "id": "harness-projects-rich-reading-telemetry", + "sourcePath": "uapi/app/terminal/terminal-pipeline-harness-client.ts", + "passed": true + }, + { + "id": "conversation-handoff-preserves-reading-stage", + "sourcePath": "uapi/app/conversations/conversation-terminal-handoff.ts", + "passed": true + }, + { + "id": "ux-state-tests-cover-route-retry-failure", + "sourcePath": "uapi/tests/terminalEnterpriseReadingUxState.test.ts", + "passed": true + }, + { + "id": "workbench-tests-cover-five-stage-labels", + "sourcePath": "uapi/tests/terminalDepositReadWorkbench.test.ts", + "passed": true + }, + { + "id": "handoff-tests-cover-reading-stage-route", + "sourcePath": "uapi/tests/conversationTerminalHandoff.test.tsx", + "passed": true + }, + { + "id": "query-tests-cover-reading-stage-route", + "sourcePath": "uapi/tests/terminalTransactionQuery.test.ts", + "passed": true + }, + { + "id": "stream-tests-cover-rich-header", + "sourcePath": "uapi/tests/pipelineExecutionLogHeader.test.tsx", + "passed": true + }, + { + "id": "workflow-wires-gate3-check", + "sourcePath": ".github/workflows/bitcode-gate-quality.yml", + "passed": true + }, + { + "id": "v42-spec-gate3-expanded", + "sourcePath": "BITCODE_SPEC_V42.md", + "passed": true + }, + { + "id": "v42-delta-gate3-expanded", + "sourcePath": "BITCODE_SPEC_V42_DELTA.md", + "passed": true + }, + { + "id": "v42-notes-gate3-expanded", + "sourcePath": "BITCODE_SPEC_V42_NOTES.md", + "passed": true + }, + { + "id": "v42-parity-gate3-implemented", + "sourcePath": "BITCODE_SPEC_V42_PARITY_MATRIX.md", + "passed": true + }, + { + "id": "roadmap-records-gate3-closure", + "sourcePath": "SPECIFICATIONS_ROADMAP.md", + "passed": true + }, + { + "id": "readmes-document-gate3", + "sourcePath": "README.md", + "passed": true + } + ], + "coverage": { + "rowCount": 9, + "stepCount": 5, + "acceptedUserPath": [ + "request-read", + "review-synthesized-need", + "request-finding-fits", + "review-source-safe-assetpack-preview", + "buy-settle-and-deliver-assetpack" + ], + "requiredPredicateCount": 24, + "passedPredicateCount": 24, + "failedPredicateIds": [], + "routePersistenceCovered": true, + "transactionIdRecoveryCovered": true, + "restartRetryFailureCovered": true, + "acceptedNeedGateCovered": true, + "streamLogIntegrationCovered": true, + "componentRouteTestsCovered": true, + "sourceSafeMetadataOnly": true, + "lowDetailDefault": true, + "expandableSourceSafeDetail": true, + "protectedSourceVisible": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "ledgerAuthorityClaimed": false, + "legacySourceRoots": false + }, + "sourceRoots": { + "terminalUxState": "uapi/app/terminal/terminal-enterprise-reading-ux-state.ts", + "terminalWorkbench": "uapi/app/terminal/TerminalDepositReadWorkbench.tsx", + "terminalPageClient": "uapi/app/terminal/TerminalPageClient.tsx", + "terminalWorkbenchContract": "uapi/app/terminal/terminal-deposit-read-workbench.ts", + "terminalRouteQuery": "uapi/app/terminal/terminal-transaction-query.ts", + "terminalActivityHistory": "uapi/app/terminal/terminal-activity-history.ts", + "terminalHarnessClient": "uapi/app/terminal/terminal-pipeline-harness-client.ts", + "conversationHandoff": "uapi/app/conversations/conversation-terminal-handoff.ts", + "uxStateTest": "uapi/tests/terminalEnterpriseReadingUxState.test.ts", + "workbenchTest": "uapi/tests/terminalDepositReadWorkbench.test.ts", + "handoffTest": "uapi/tests/conversationTerminalHandoff.test.tsx", + "queryTest": "uapi/tests/terminalTransactionQuery.test.ts", + "streamHeaderTest": "uapi/tests/pipelineExecutionLogHeader.test.tsx", + "gateWorkflow": ".github/workflows/bitcode-gate-quality.yml", + "v42Spec": "BITCODE_SPEC_V42.md", + "v42Delta": "BITCODE_SPEC_V42_DELTA.md", + "v42Notes": "BITCODE_SPEC_V42_NOTES.md", + "v42Parity": "BITCODE_SPEC_V42_PARITY_MATRIX.md", + "roadmap": "SPECIFICATIONS_ROADMAP.md", + "rootReadme": "README.md", + "terminalReadme": "uapi/app/terminal/README.md", + "protocolReadme": "packages/protocol/README.md" + } +} diff --git a/.github/workflows/bitcode-canon-quality.yml b/.github/workflows/bitcode-canon-quality.yml index 05484b61..dc9f130b 100644 --- a/.github/workflows/bitcode-canon-quality.yml +++ b/.github/workflows/bitcode-canon-quality.yml @@ -298,6 +298,9 @@ jobs: if [ -f scripts/check-v42-gate2-depositing-shortest-path.mjs ]; then node scripts/check-v42-gate2-depositing-shortest-path.mjs --skip-branch-check --skip-package-tests fi + if [ -f scripts/check-v42-gate3-reading-shortest-path-state-machine.mjs ]; then + node scripts/check-v42-gate3-reading-shortest-path-state-machine.mjs --skip-branch-check --skip-uapi-tests + fi fi else echo "Unexpected BITCODE_SPEC.txt pointer: $POINTER" >&2 diff --git a/.github/workflows/bitcode-gate-quality.yml b/.github/workflows/bitcode-gate-quality.yml index 40c215f9..bf2440ee 100644 --- a/.github/workflows/bitcode-gate-quality.yml +++ b/.github/workflows/bitcode-gate-quality.yml @@ -427,6 +427,9 @@ jobs: if [ -f scripts/check-v42-gate2-depositing-shortest-path.mjs ]; then node scripts/check-v42-gate2-depositing-shortest-path.mjs --skip-branch-check --skip-package-tests fi + if [ -f scripts/check-v42-gate3-reading-shortest-path-state-machine.mjs ]; then + node scripts/check-v42-gate3-reading-shortest-path-state-machine.mjs --skip-branch-check --skip-uapi-tests + fi fi else echo "Unexpected BITCODE_SPEC.txt pointer: $POINTER" >&2 diff --git a/BITCODE_SPEC_V42.md b/BITCODE_SPEC_V42.md index 71339f89..7b85d98f 100644 --- a/BITCODE_SPEC_V42.md +++ b/BITCODE_SPEC_V42.md @@ -118,6 +118,15 @@ Gate 3 must make the five Reading steps a coherent product state machine: reques It must simplify default Terminal experience while preserving expandable proof, execution, telemetry, ledger, and storage detail. It must prove route persistence, transaction ids, stage transitions, restart/retry behavior, source-safe UI rendering, and failure states. +Gate 3 implements that state machine through `TerminalEnterpriseReadingUxState` and `TerminalEnterpriseReadingRouteState`. +The route-owned state carries a recoverable transaction id, `readingStage` stage intent, retry and restart posture, source-safe failure kind, and repair action metadata. +Route state may hydrate the active stage on refresh or Conversation handoff, but it does not waive blockers: Finding Fits still requires accepted Need, source-safe AssetPack preview still gates settlement, and delivery still requires settlement readback. + +Gate 3 proof artifact: `.bitcode/v42-reading-shortest-path-state-machine.json`. +This is the canonical V42 reading shortest path state machine artifact for the MVP Reading route contract. +The artifact must prove nine source-safe rows: five-step Reading path, transaction/stage route persistence, accepted-Need transition, restart/retry/failure repair, low-detail proof-on-expand UI, rich Reading pipeline telemetry, activity/workbench readback, route/component/stream tests, and SPEC/DELTA/NOTES/PARITY/README/workflow closure. +Validating command: `pnpm run check:v42-gate3`. + ## V42 Gate 4 ReadNeed Review And Resynthesis Product Closure Gate 4 must make `ReadNeedComprehensionSynthesis` product-ready in the MVP flow. @@ -413,7 +422,7 @@ V42 inherits operator-quality expectations for browser proof, accessibility, vis | `.bitcode/v42-canonical-input-report.json` | `check-bitcode-canonical-inputs` | source-safe metadata | canonical input proof | | `.bitcode/v42-canon-posture-drift-report.json` | `check-bitcode-canon-posture-drift` | source-safe metadata | active V41 / draft V42 posture proof | | `.bitcode/v42-depositing-shortest-path.json` | V42 Gate 2 | source-safe metadata | deposit MVP proof | -| `.bitcode/v42-reading-state-machine.json` | V42 Gate 3 | source-safe metadata | Reading product state proof | +| `.bitcode/v42-reading-shortest-path-state-machine.json` | V42 Gate 3 | source-safe metadata | Reading product state proof | | `.bitcode/v42-readneed-review-resynthesis.json` | V42 Gate 4 | source-safe metadata | Need review proof | | `.bitcode/v42-readfitsfinding-preview-quote.json` | V42 Gate 5 | source-safe metadata | Finding Fits, preview, and quote proof | | `.bitcode/v42-settlement-rights-delivery.json` | V42 Gate 6 | source-safe metadata | settlement/delivery proof | diff --git a/BITCODE_SPEC_V42_DELTA.md b/BITCODE_SPEC_V42_DELTA.md index cfc889e1..33f29a47 100644 --- a/BITCODE_SPEC_V42_DELTA.md +++ b/BITCODE_SPEC_V42_DELTA.md @@ -41,6 +41,8 @@ The compensation preview is deliberately pre-mint: it records BTC/source-to-shar ### Gate 3: Reading Shortest Path State Machine Implement and prove the five-step Reading product state machine with low-detail defaults and expandable proof/telemetry detail. +Gate 3 now binds route-owned Reading state to transaction recovery, `readingStage` route hydration, retry/restart posture, source-safe failure repair, accepted-Need blockers, source-safe preview blockers, rich execution stream readback, and `.bitcode/v42-reading-shortest-path-state-machine.json`. +The state machine keeps Terminal guided by default while preserving proof-on-expand detail for operators. ### Gate 4: ReadNeed Review And Resynthesis Product Closure @@ -71,6 +73,7 @@ Bind every V42 product artifact, workflow, generated proof, promotion command, s - V43+ agentic deposit AssetPack option synthesis remains deferred. - `/terminal` is not split into `/read` and `/deposit` during V42. - `/exchange` is not renamed to `/packs` during V42. +- V43+ must take the route-vocabulary cleanup seriously: `/packs` replaces Exchange as the searchable master-detail activity route, while `/read` and `/deposit` become the short core paths for buying and selling AssetPacks. - Production-mainnet value-bearing operation remains blocked unless a later promoted canon explicitly admits it. - V42 Gate 1 does not change route behavior, pipeline behavior, settlement behavior, or demonstration behavior. diff --git a/BITCODE_SPEC_V42_NOTES.md b/BITCODE_SPEC_V42_NOTES.md index 9c67e6be..3ba0c620 100644 --- a/BITCODE_SPEC_V42_NOTES.md +++ b/BITCODE_SPEC_V42_NOTES.md @@ -43,6 +43,9 @@ The V42 Reading path should be a five-step enterprise flow: The default UI should be guided and low-detail. The rich execution log, proof roots, telemetry rows, and ledger/storage details remain available on expansion. +Gate 3 implements the current V42 state-machine layer with `TerminalEnterpriseReadingRouteState`. +The recoverable route state includes transaction id presence, `readingStage`, active-stage hydration, retry and restart posture, source-safe failure kind, and repair actions. +This makes refresh, route handoff, and recovery inspectable without disclosing protected source, protected prompts, raw provider responses, unpaid AssetPack source, wallet private material, private settlement payloads, or ledger authority. ## AssetPack source-safety note @@ -66,6 +69,8 @@ The route model should be AssetPacks in and AssetPacks out: `/deposit` creates r The `/packs` master view should support column sorting, filtering, and search over measurements, synthesized AssetPack titles and descriptions, values, activity or transaction type, settlement posture, and compensation state. The detail view should expose the selected activity's source-safe data, proof roots, telemetry, ledger/database synchronization, and expandable payloads without replacing the short default path. Outside public documentation, product UX should avoid self-referential explanatory copy; route structure, concise labels, progressive detail, and proof-on-expand must make Depositing, Reading, and Pack activity self-explanatory. +The current transitional Terminal/Exchange UX remains too dense for the final MVP posture. +V43+ should explicitly own the broad UX cleanup: remove Exchange naming from route and component vocabulary in favor of Packs, split Terminal into `/read` and `/deposit`, keep `/packs` as searchable master-detail activity, and use rich themed reusable components without relying on in-product explanatory copy to compensate for unclear flows. ## Concise current-system reading diff --git a/BITCODE_SPEC_V42_PARITY_MATRIX.md b/BITCODE_SPEC_V42_PARITY_MATRIX.md index 58e561f3..86f3f222 100644 --- a/BITCODE_SPEC_V42_PARITY_MATRIX.md +++ b/BITCODE_SPEC_V42_PARITY_MATRIX.md @@ -34,7 +34,7 @@ This matrix records the reliable MVP product surfaces that must become promotion | Gate workflow | Gate quality knows active V41 / draft V42 posture and V42 Gate 1 | `.github/workflows/bitcode-gate-quality.yml` | drafted | | Canon workflow | Canon quality knows active V41 / draft V42 posture and V42 Gate 1 | `.github/workflows/bitcode-canon-quality.yml` | drafted | | Depositing shortest path | Source material can be admitted with Depository proof and compensation visibility | `.bitcode/v42-depositing-shortest-path.json`, `DepositorySupplyCompensationPreview`, `/api/deposits`, Terminal deposit readback | implemented | -| Reading state machine | Five-step Reading UX is route-owned, persistent, and source-safe | later V42 Gate 3 artifact | draft-required | +| Reading state machine | Five-step Reading UX is route-owned, persistent, and source-safe | `.bitcode/v42-reading-shortest-path-state-machine.json`, `TerminalEnterpriseReadingRouteState`, `readingStage`, route/retry/failure tests | implemented | | ReadNeed product closure | Need synthesis, review, feedback, resynthesis, and accepted-Need admission are product-ready | later V42 Gate 4 artifact | draft-required | | Finding Fits preview and quote | Many-candidate search, selected-fit provenance, source-safe preview, and quote are product-ready | later V42 Gate 5 artifact | draft-required | | Settlement and delivery | BTC/BTD settlement, rights transfer, compensation, and repository PR delivery are synchronized | later V42 Gate 6 artifact | draft-required | @@ -48,7 +48,7 @@ This matrix records the reliable MVP product surfaces that must become promotion | --- | --- | --- | | Gate 1 | Open V42 family, roadmap, docs, workflow posture, package script, and checker | drafted | | Gate 2 | Depositing shortest path and compensation visibility artifact | implemented | -| Gate 3 | Reading shortest path state machine artifact | draft-required | +| Gate 3 | Reading shortest path state machine artifact | implemented | | Gate 4 | ReadNeed review and resynthesis product closure artifact | draft-required | | Gate 5 | ReadFitsFinding AssetPack preview and quote closure artifact | draft-required | | Gate 6 | Settlement rights transfer and repository delivery closure artifact | draft-required | diff --git a/README.md b/README.md index e3512001..3a5b1077 100644 --- a/README.md +++ b/README.md @@ -93,11 +93,18 @@ Terminal compensation roots, `.bitcode/v42-depositing-shortest-path.json`, and `check:v42-gate2`. Deposit admission remains pre-mint and pre-rights transfer; BTC source-to-shares allocation is only a later paid AssetPack settlement route. +V42 Gate 3 adds the Reading shortest path state machine with +`TerminalEnterpriseReadingRouteState`, recoverable transaction ids, +`readingStage` hydration, retry/restart posture, source-safe failure repair, +accepted-Need blockers, source-safe preview blockers, +`.bitcode/v42-reading-shortest-path-state-machine.json`, and +`check:v42-gate3`. V43+ is roadmapped as the later agentic depositing evolution: repository agents synthesize deposit AssetPack options from connected enterprise code, Depository state, and Reading demand; enterprises approve or reject sub-critical positive-ROI options; `/terminal` separates into `/read` and -`/deposit`; and `/exchange` is renamed to `/packs` across product naming. +`/deposit`; and `/exchange` is renamed to `/packs` across routes, component +prefixes, tests, docs, and product naming. That future route model treats AssetPacks as the product object in and out: `/deposit` proposes deposit AssetPack options from source and Bitcode demand, `/read` buys synthesized Need-Fit AssetPacks, and `/packs` becomes the diff --git a/SPECIFICATIONS_ROADMAP.md b/SPECIFICATIONS_ROADMAP.md index de22cd64..f328daae 100644 --- a/SPECIFICATIONS_ROADMAP.md +++ b/SPECIFICATIONS_ROADMAP.md @@ -5,11 +5,12 @@ - Current active canonical pointer: `BITCODE_SPEC.txt` -> `V41` - Current active canon: `BITCODE_SPEC_V41.md` - Current draft target: `BITCODE_SPEC_V42.md`. -- Current working gate: V42 Gate 2 Depositing Shortest Path And Compensation Visibility. -- Next queued gate after V42 Gate 2: V42 Gate 3 Reading Shortest Path State Machine. +- Current working gate: V42 Gate 3 Reading Shortest Path State Machine. +- Next queued gate after V42 Gate 3: V42 Gate 4 ReadNeed Review And Resynthesis Product Closure. - Latest closed version: V41 Prompt And PromptPart Excellence, which promoted PromptPart and Prompt inventory, registry interpolation contracts, Reading prompt baselines, ReadNeedComprehensionSynthesis prompt hardening, ReadFitsFindingSynthesis prompt hardening, Conversation/tool/interface prompt rewrite, prompt benchmark telemetry, and V41 promotion readiness. - Recent V42 opening anchor: reliable MVP experience opens over promoted V41 with V42 SPEC, DELTA, NOTES, and PARITY files, `check:v42-gate1`, active V41 / draft V42 posture, and a nine-gate plan for shortest-path Depositing, five-step Reading, ReadNeed product closure, ReadFitsFinding preview and quote closure, settlement and repository delivery, AI-reading demonstration, local/staging rehearsal, and promotion readiness. - V42 Gate 2 closure anchor: reliable MVP experience now owns source-safe Depositing compensation visibility through `DepositorySupplyCompensationPreview`, deposit route `depositoryEvidence.compensationPreview`, deterministic `.bitcode/v42-depositing-shortest-path.json`, route/API readiness checks, source validation, Depository search/vector/storage projection, source-to-shares compensation readback keys, Terminal compensation roots, focused package/protocol tests, workflow wiring, and `check:v42-gate2`. +- V42 Gate 3 closure anchor: reliable MVP experience now owns the five-step Reading shortest path state machine through `TerminalEnterpriseReadingUxState`, `TerminalEnterpriseReadingRouteState`, recoverable transaction ids, `readingStage` route hydration, retry/restart posture, source-safe failure repair actions, accepted-Need blockers, source-safe preview blockers, rich Reading pipeline telemetry readback, deterministic `.bitcode/v42-reading-shortest-path-state-machine.json`, focused route/component/protocol tests, workflow wiring, and `check:v42-gate3`. - Recent V41 closure anchor: V41 canonical promotion updated `BITCODE_SPEC.txt` to `V41`, generated `BITCODE_SPEC_V41_PROVEN.md`, preserved active V41 / draft V42 runtime posture, and closed prompt-program excellence canon. - Recent V40 closure anchor: V40 canonical promotion updated `BITCODE_SPEC.txt` to `V40`, generated `BITCODE_SPEC_V40_PROVEN.md`, preserved active V40 / draft V41 runtime posture, and closed exhaustive commercial application testing canon. - Recent V39 closure anchor: V39 canonical promotion updated `BITCODE_SPEC.txt` to `V39`, generated `BITCODE_SPEC_V39_PROVEN.md`, preserved active V39 / draft V40 runtime posture, and closed commercial Reading readiness canon. @@ -160,7 +161,7 @@ They are referenced here for specification history only; active implementation w | V40 | `BITCODE_SPEC_V40.md` | promoted historical Bitcode canon | Exhaustive commercial application testing depth after V39: rich browser E2E for all website interactions and state possibilities, visual/screenshot comparison coverage, API and integration suites for pipelines, conversations, routes, ledger/database/storage synchronization, unit coverage for packages, primitives, isolated implementations, real commercial implementations, local/staging rehearsal automation, prompt benchmark smoke, and promotion readiness. | | V41 | `BITCODE_SPEC_V41.md` | active canon | Prompt and PromptPart excellence, treating prompts as programs: audit every raw PromptPart and composed Prompt, run and harden benchmarks, repartition prompts into meaningfully benchmarkable semantic parts, retitle and rewrite PromptParts/Prompts where optimal, catalogue registry bindings, interpolation contracts, benchmark fixtures, benchmark outputs, inference callsites, and parsed return types, and elevate all Reading and Conversation inference points after V38 inference scaffolding and V40 testing depth make that work measurable. The primary surface is Reading, especially `ReadNeedComprehensionSynthesis` and `ReadFitsFindingSynthesis`; conversations and other inference prompts follow with the same benchmarkable catalogue discipline. | | V42 | `BITCODE_SPEC_V42.md` | active draft target | Reliable MVP experience after V41 prompt hardening: shortest-path Depositing for any source material with Depository admission proof and later BTC compensation when deposits contribute to synthesized AssetPacks; shortest-path Reading for Read Request submission, synthesized Need review/resynthesis, Finding Fits, source-safe AssetPack measurement/preview review, BTD/BTC purchase and settlement, and repository delivery; and an AI-reading dominant demonstration proving an AssetPack can improve an AI system's training, prompt/context, or evaluation performance beyond public-data-only baselines using proprietary or otherwise non-public deposit and read materials. | -| V43+ | future specification family | planned future | Agentic enterprise deposit-side AssetPack option synthesis after the MVP paths are reliable: repository-installed Bitcode Agents compare a connected enterprise codebase, the Bitcode Depository, and Reading activity to propose deposit AssetPack options for review; filter out critical IP; estimate positive ROI against development cost and likely demand; let enterprises approve/reject options for Depository admission; split `/terminal` into `/read` and `/deposit`; and rename `/exchange` to `/packs` throughout product routes, code naming, docs, and operator vocabulary. `/packs` becomes the searchable master-detail activity surface for all pack activity, while `/deposit` and `/read` become the short core paths into and out of the Depository. | +| V43+ | future specification family | planned future | Agentic enterprise deposit-side AssetPack option synthesis and broad UX cleanup after the MVP paths are reliable: repository-installed Bitcode Agents compare a connected enterprise codebase, the Bitcode Depository, and Reading activity to propose deposit AssetPack options for review; filter out critical IP; estimate positive ROI against development cost and likely demand; let enterprises approve/reject options for Depository admission; split `/terminal` into `/read` and `/deposit`; and rename `/exchange` to `/packs` throughout product routes, code naming, docs, component prefixes, tests, and operator vocabulary. `/packs` becomes the searchable master-detail activity surface for all pack activity, with column sort/filter/search over measurements, synthesized AssetPack titles and descriptions, values, activity/transaction type, settlement posture, compensation, proof roots, and repair state. `/deposit` and `/read` become the short core paths into and out of the Depository. Outside public docs, product UX should be self-explanatory through route structure, concise labels, progressive detail, and rich reusable themed components rather than self-referential instructional copy. | ## Current Planning Spine diff --git a/package.json b/package.json index a66382ab..e2a90f91 100644 --- a/package.json +++ b/package.json @@ -307,6 +307,9 @@ "generate:v42-depositing-shortest-path": "node scripts/generate-v42-depositing-shortest-path.mjs", "check:v42-depositing-shortest-path": "node scripts/generate-v42-depositing-shortest-path.mjs --check", "check:v42-gate2": "node scripts/check-v42-gate2-depositing-shortest-path.mjs", + "generate:v42-reading-shortest-path-state-machine": "node scripts/generate-v42-reading-shortest-path-state-machine.mjs", + "check:v42-reading-shortest-path-state-machine": "node scripts/generate-v42-reading-shortest-path-state-machine.mjs --check", + "check:v42-gate3": "node scripts/check-v42-gate3-reading-shortest-path-state-machine.mjs", "generate:v38-inference-surface-inventory": "node scripts/generate-v38-inference-surface-inventory.mjs", "check:v38-inference-surface-inventory": "node scripts/generate-v38-inference-surface-inventory.mjs --check", "check:v38-gate2": "node scripts/check-v38-gate2-inference-surface-inventory.mjs", diff --git a/packages/protocol/README.md b/packages/protocol/README.md index fb299c5e..69f9b4ae 100644 --- a/packages/protocol/README.md +++ b/packages/protocol/README.md @@ -192,6 +192,15 @@ It proves deposit route readiness, Depository search/vector/storage projection, source-safe compensation preview roots, source-to-shares ledger readback keys, Terminal compensation visibility, and the pre-mint/no-pre-settlement-source boundary. +V42 Gate 3 adds the V42 Reading shortest path state machine, +`V42ReadingShortestPathStateMachine`, through +`packages/protocol/src/canonical/v42-reading-shortest-path-state-machine.js`, +`packages/protocol/test/v42-reading-shortest-path-state-machine.test.js`, +`.bitcode/v42-reading-shortest-path-state-machine.json`, and +`check:v42-gate3`. It proves the five-step Reading path, transaction/stage +route persistence, accepted-Need gating, restart/retry/failure repair, +low-detail proof-on-expand UI posture, rich Reading pipeline telemetry +readback, activity/workbench readback, and source-safe disclosure boundaries. V40 Gate 2 adds `V40TestInventoryCoverageMatrix` through `packages/protocol/src/canonical/v40-test-inventory-coverage-matrix.js`, `packages/protocol/test/v40-test-inventory-coverage-matrix.test.js`, diff --git a/packages/protocol/src/canonical/v42-depositing-shortest-path.js b/packages/protocol/src/canonical/v42-depositing-shortest-path.js index 181bc14b..46612b8d 100644 --- a/packages/protocol/src/canonical/v42-depositing-shortest-path.js +++ b/packages/protocol/src/canonical/v42-depositing-shortest-path.js @@ -217,7 +217,11 @@ function buildPredicateResults(repoRoot) { predicateResult('v42-delta-gate2-implemented', SOURCE_ROOTS.v42Delta, delta.includes('Gate 2') && delta.includes('Depository admission proof')), predicateResult('v42-notes-gate2-rehearsal', SOURCE_ROOTS.v42Notes, notes.includes('Gate 2') && notes.includes('staging-testnet')), predicateResult('v42-parity-gate2-closed', SOURCE_ROOTS.v42Parity, parity.includes('Depositing shortest path') && parity.includes('implemented')), - predicateResult('roadmap-current-gate-advanced', SOURCE_ROOTS.roadmap, roadmap.includes('Current working gate: V42 Gate 2') && roadmap.includes('V42 Gate 2 closure anchor')), + predicateResult( + 'roadmap-records-gate2-closure', + SOURCE_ROOTS.roadmap, + roadmap.includes('Current working gate: V42 Gate') && roadmap.includes('V42 Gate 2 closure anchor'), + ), ]; } diff --git a/packages/protocol/src/canonical/v42-reading-shortest-path-state-machine.js b/packages/protocol/src/canonical/v42-reading-shortest-path-state-machine.js new file mode 100644 index 00000000..f094c540 --- /dev/null +++ b/packages/protocol/src/canonical/v42-reading-shortest-path-state-machine.js @@ -0,0 +1,324 @@ +// @ts-check + +import crypto from 'node:crypto'; +import { existsSync, readFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const DEFAULT_REPO_ROOT = path.resolve(__dirname, '..', '..', '..', '..'); + +export const V42_READING_SHORTEST_PATH_STATE_MACHINE_ARTIFACT_PATH = + '.bitcode/v42-reading-shortest-path-state-machine.json'; +export const V42_READING_SHORTEST_PATH_STATE_MACHINE_SCHEMA_ID = + 'bitcode.v42.readingShortestPathStateMachine.v1'; +export const V42_READING_SHORTEST_PATH_SCHEMA_ID = + V42_READING_SHORTEST_PATH_STATE_MACHINE_SCHEMA_ID; +export const V42_READING_SHORTEST_PATH_STATE_MACHINE_VERSION = 'V42'; +export const V42_READING_SHORTEST_PATH_STATE_MACHINE_CURRENT_TARGET = 'V41'; +export const V42_READING_SHORTEST_PATH_STATE_MACHINE_SOURCE_SAFETY_VERDICT = + 'source-safe-reading-shortest-path-state-machine-metadata'; + +export const V42_READING_SHORTEST_PATH_STEP_IDS = Object.freeze([ + 'request-read', + 'review-synthesized-need', + 'request-fit', + 'review-synthesized-asset-pack', + 'buy-asset-pack-settle', +]); + +export const V42_READING_SHORTEST_PATH_ROW_IDS = Object.freeze([ + 'state:five-step-shortest-path', + 'route:transaction-stage-persistence', + 'transition:accepted-need-before-finding-fits', + 'retry:restart-and-failure-repair', + 'ui:low-detail-proof-on-expand', + 'stream:rich-reading-pipeline-telemetry', + 'activity:history-and-workbench-readback', + 'tests:route-state-contracts', + 'spec:v42-gate3-closure', +]); + +const FORBIDDEN_PAYLOAD_CLASSES = Object.freeze([ + 'protected-source-payloads', + 'raw-protected-prompts', + 'raw-provider-responses', + 'unpaid-assetpack-source', + 'wallet-private-material', + 'settlement-private-payloads', + 'ledger-write-authority', + 'secret-values', +]); + +const SOURCE_ROOTS = Object.freeze({ + terminalUxState: 'uapi/app/terminal/terminal-enterprise-reading-ux-state.ts', + terminalWorkbench: 'uapi/app/terminal/TerminalDepositReadWorkbench.tsx', + terminalPageClient: 'uapi/app/terminal/TerminalPageClient.tsx', + terminalWorkbenchContract: 'uapi/app/terminal/terminal-deposit-read-workbench.ts', + terminalRouteQuery: 'uapi/app/terminal/terminal-transaction-query.ts', + terminalActivityHistory: 'uapi/app/terminal/terminal-activity-history.ts', + terminalHarnessClient: 'uapi/app/terminal/terminal-pipeline-harness-client.ts', + conversationHandoff: 'uapi/app/conversations/conversation-terminal-handoff.ts', + uxStateTest: 'uapi/tests/terminalEnterpriseReadingUxState.test.ts', + workbenchTest: 'uapi/tests/terminalDepositReadWorkbench.test.ts', + handoffTest: 'uapi/tests/conversationTerminalHandoff.test.tsx', + queryTest: 'uapi/tests/terminalTransactionQuery.test.ts', + streamHeaderTest: 'uapi/tests/pipelineExecutionLogHeader.test.tsx', + gateWorkflow: '.github/workflows/bitcode-gate-quality.yml', + v42Spec: 'BITCODE_SPEC_V42.md', + v42Delta: 'BITCODE_SPEC_V42_DELTA.md', + v42Notes: 'BITCODE_SPEC_V42_NOTES.md', + v42Parity: 'BITCODE_SPEC_V42_PARITY_MATRIX.md', + roadmap: 'SPECIFICATIONS_ROADMAP.md', + rootReadme: 'README.md', + terminalReadme: 'uapi/app/terminal/README.md', + protocolReadme: 'packages/protocol/README.md', +}); + +function digest(value) { + return crypto.createHash('sha256').update(value).digest('hex').slice(0, 24); +} + +function rowRoot(id) { + return `v42-reading-shortest-path-state-machine-row:${digest(id)}`; +} + +function readSource(repoRoot, sourcePath) { + const absolutePath = path.join(repoRoot, sourcePath); + return existsSync(absolutePath) ? readFileSync(absolutePath, 'utf8') : ''; +} + +function predicateResult(id, sourcePath, passed) { + return { id, sourcePath, passed: Boolean(passed) }; +} + +function row(input) { + return { + ...input, + rowRoot: rowRoot(input.rowId), + sourceSafetyClass: 'source_safe_reading_shortest_path_state_machine_metadata', + sourceSafeMetadataOnly: true, + lowDetailDefault: true, + expandableSourceSafeDetail: true, + protectedSourceVisible: false, + rawProtectedPromptVisible: false, + rawProviderResponseVisible: false, + unpaidAssetPackSourceVisible: false, + walletPrivateMaterialVisible: false, + settlementPrivatePayloadVisible: false, + ledgerAuthorityClaimed: false, + forbiddenPayloadClasses: [...FORBIDDEN_PAYLOAD_CLASSES], + }; +} + +export const V42_READING_SHORTEST_PATH_ROWS = Object.freeze([ + row({ + rowId: 'state:five-step-shortest-path', + purpose: + 'Preserve exactly five enterprise Reading steps from Read Request through Need review, Finding Fits, AssetPack preview, and settlement delivery.', + sourceRoots: [SOURCE_ROOTS.terminalUxState, SOURCE_ROOTS.terminalWorkbench], + emittedTypes: ['TerminalEnterpriseReadingUxState', 'TerminalEnterpriseReadingStepView'], + requiredEvidence: V42_READING_SHORTEST_PATH_STEP_IDS, + }), + row({ + rowId: 'route:transaction-stage-persistence', + purpose: + 'Bind Reading state to recoverable transaction ids and readingStage route state so refresh, restart, and route handoff preserve the active stage.', + sourceRoots: [ + SOURCE_ROOTS.terminalUxState, + SOURCE_ROOTS.terminalRouteQuery, + SOURCE_ROOTS.terminalPageClient, + SOURCE_ROOTS.terminalWorkbench, + ], + emittedTypes: ['TerminalEnterpriseReadingRouteState', 'TerminalConversationHandoffContext.readingStage'], + requiredEvidence: ['transactionIdRequiredForRecovery', 'readingStageQueryParam', 'activeStageHydratedFromRoute'], + }), + row({ + rowId: 'transition:accepted-need-before-finding-fits', + purpose: + 'Make accepted Need the hard transition before Finding Fits, preview, settlement, or delivery can proceed.', + sourceRoots: [SOURCE_ROOTS.terminalUxState, SOURCE_ROOTS.terminalWorkbench, SOURCE_ROOTS.conversationHandoff], + emittedTypes: ['acceptedNeedRequiredBeforeFindingFits', 'TerminalReadNeedState'], + requiredEvidence: ['accepted Need required', 'ReadNeedComprehensionSynthesis', 'ReadFitsFindingSynthesis'], + }), + row({ + rowId: 'retry:restart-and-failure-repair', + purpose: + 'Represent retry, restart, and failure repair posture as source-safe state metadata without exposing protected source, prompts, provider responses, wallet material, or settlement payloads.', + sourceRoots: [SOURCE_ROOTS.terminalUxState, SOURCE_ROOTS.uxStateTest, SOURCE_ROOTS.terminalWorkbench], + emittedTypes: ['TerminalEnterpriseReadingFailureKind', 'TerminalEnterpriseReadingRouteState.failureRepairActions'], + requiredEvidence: ['retryPreservesNeedLineage', 'restartRestoresActiveStage', 'failureRepairActions'], + }), + row({ + rowId: 'ui:low-detail-proof-on-expand', + purpose: + 'Keep the default Reading view guided and low-detail while details expand to source-safe proof roots, measurements, blockers, and visible field ids.', + sourceRoots: [SOURCE_ROOTS.terminalUxState, SOURCE_ROOTS.terminalWorkbench, SOURCE_ROOTS.terminalReadme], + emittedTypes: ['TerminalEnterpriseReadingUxState.disclosure'], + requiredEvidence: ['lowDetailDefault', 'expandableSourceSafeDetail', 'Source-safe detail'], + }), + row({ + rowId: 'stream:rich-reading-pipeline-telemetry', + purpose: + 'Keep Reading pipeline progress inspectable through rich execution stream rows for phase, PTRR step, ThricifiedGeneration, tool, prompt-template id, output schema, and parsed-result posture.', + sourceRoots: [SOURCE_ROOTS.terminalHarnessClient, SOURCE_ROOTS.streamHeaderTest, SOURCE_ROOTS.terminalWorkbench], + emittedTypes: ['TerminalReadFitsFindingSynthesisHarnessEvent', 'ExecutionLogItem'], + requiredEvidence: ['pipelinePhaseId', 'ptrrStepId', 'thricifiedGenerationId', 'promptTemplateId', 'outputSchema'], + }), + row({ + rowId: 'activity:history-and-workbench-readback', + purpose: + 'Project Reading state through activity history and workbench readback so transaction detail, proof roots, and compensation/settlement posture remain recoverable.', + sourceRoots: [SOURCE_ROOTS.terminalActivityHistory, SOURCE_ROOTS.terminalWorkbench, SOURCE_ROOTS.terminalWorkbenchContract], + emittedTypes: ['WorkspaceRun', 'TerminalDepositReadWorkbench'], + requiredEvidence: ['assetPackCompletion', 'TerminalDepositedSourceRevision', 'sourceRevision'], + }), + row({ + rowId: 'tests:route-state-contracts', + purpose: + 'Prove the state machine through route-state tests, component state tests, Conversation handoff tests, workbench tests, and stream-header tests.', + sourceRoots: [ + SOURCE_ROOTS.uxStateTest, + SOURCE_ROOTS.workbenchTest, + SOURCE_ROOTS.handoffTest, + SOURCE_ROOTS.queryTest, + SOURCE_ROOTS.streamHeaderTest, + SOURCE_ROOTS.gateWorkflow, + ], + emittedTypes: ['V42ReadingShortestPathStateMachineReport'], + requiredEvidence: ['terminal-enterprise-reading-ux-state', 'readingStage=request-fit', 'Browser proof Terminal cockpit'], + }), + row({ + rowId: 'spec:v42-gate3-closure', + purpose: + 'Bind V42 Gate 3 to SPEC, DELTA, NOTES, PARITY, roadmap, README, workflow, generated artifact, and checker closure.', + sourceRoots: [ + SOURCE_ROOTS.v42Spec, + SOURCE_ROOTS.v42Delta, + SOURCE_ROOTS.v42Notes, + SOURCE_ROOTS.v42Parity, + SOURCE_ROOTS.roadmap, + SOURCE_ROOTS.rootReadme, + SOURCE_ROOTS.protocolReadme, + ], + emittedTypes: ['V42ReadingShortestPathStateMachineReport'], + requiredEvidence: ['V42 Gate 3', 'reading shortest path state machine', 'check:v42-gate3'], + }), +]); + +function buildPredicateResults(repoRoot) { + const uxState = readSource(repoRoot, SOURCE_ROOTS.terminalUxState); + const pageClient = readSource(repoRoot, SOURCE_ROOTS.terminalPageClient); + const workbench = readSource(repoRoot, SOURCE_ROOTS.terminalWorkbench); + const workbenchContract = readSource(repoRoot, SOURCE_ROOTS.terminalWorkbenchContract); + const query = readSource(repoRoot, SOURCE_ROOTS.terminalRouteQuery); + const activity = readSource(repoRoot, SOURCE_ROOTS.terminalActivityHistory); + const harness = readSource(repoRoot, SOURCE_ROOTS.terminalHarnessClient); + const handoff = readSource(repoRoot, SOURCE_ROOTS.conversationHandoff); + const uxStateTest = readSource(repoRoot, SOURCE_ROOTS.uxStateTest); + const workbenchTest = readSource(repoRoot, SOURCE_ROOTS.workbenchTest); + const handoffTest = readSource(repoRoot, SOURCE_ROOTS.handoffTest); + const queryTest = readSource(repoRoot, SOURCE_ROOTS.queryTest); + const streamHeaderTest = readSource(repoRoot, SOURCE_ROOTS.streamHeaderTest); + const gateWorkflow = readSource(repoRoot, SOURCE_ROOTS.gateWorkflow); + const spec = readSource(repoRoot, SOURCE_ROOTS.v42Spec); + const delta = readSource(repoRoot, SOURCE_ROOTS.v42Delta); + const notes = readSource(repoRoot, SOURCE_ROOTS.v42Notes); + const parity = readSource(repoRoot, SOURCE_ROOTS.v42Parity); + const roadmap = readSource(repoRoot, SOURCE_ROOTS.roadmap); + const rootReadme = readSource(repoRoot, SOURCE_ROOTS.rootReadme); + const terminalReadme = readSource(repoRoot, SOURCE_ROOTS.terminalReadme); + const protocolReadme = readSource(repoRoot, SOURCE_ROOTS.protocolReadme); + + return [ + predicateResult('ux-state-keeps-five-step-path', SOURCE_ROOTS.terminalUxState, V42_READING_SHORTEST_PATH_STEP_IDS.every((id) => uxState.includes(id)) && uxState.includes('stageCount: 5')), + predicateResult('ux-state-defines-route-state', SOURCE_ROOTS.terminalUxState, uxState.includes('TerminalEnterpriseReadingRouteState') && uxState.includes('transactionIdRequiredForRecovery') && uxState.includes("readingStageQueryParam: 'readingStage'")), + predicateResult('ux-state-defines-retry-failure-source-safety', SOURCE_ROOTS.terminalUxState, uxState.includes('TerminalEnterpriseReadingFailureKind') && uxState.includes('retryPreservesNeedLineage') && uxState.includes('failureRepairActions') && uxState.includes('failureStateSourceSafe')), + predicateResult('ux-state-forbids-protected-payloads', SOURCE_ROOTS.terminalUxState, uxState.includes('protected_source_payload') && uxState.includes('raw_protected_prompt') && uxState.includes('raw_provider_response') && uxState.includes('unpaid_assetpack_source') && uxState.includes('wallet_private_material') && uxState.includes('settlement_private_payload')), + predicateResult('terminal-page-passes-reading-stage', SOURCE_ROOTS.terminalPageClient, pageClient.includes('routeReadingStage={conversationHandoffContext.readingStage}')), + predicateResult('workbench-projects-route-state', SOURCE_ROOTS.terminalWorkbench, workbench.includes('transactionId: recordedAdmittedReadActivityId') && workbench.includes('routeReadingStage') && workbench.includes('data-reading-transaction-present') && workbench.includes('data-reading-failure-kind')), + predicateResult('workbench-keeps-low-detail-expandable-cards', SOURCE_ROOTS.terminalWorkbench, workbench.includes('terminal-enterprise-reading-step-${stage.id}') && workbench.includes('data-reading-step-state') && workbench.includes('Source-safe detail')), + predicateResult('workbench-contract-reexports-stage-ids', SOURCE_ROOTS.terminalWorkbenchContract, workbenchContract.includes('TERMINAL_ENTERPRISE_READING_STEPS') && workbenchContract.includes('TerminalEnterpriseReadingStepId')), + predicateResult('terminal-query-reads-reading-stage', SOURCE_ROOTS.terminalRouteQuery, query.includes('readingStage') && query.includes('TERMINAL_ENTERPRISE_READING_STAGE_VALUES') && query.includes('readTerminalTransactionId')), + predicateResult('activity-history-keeps-reading-readback', SOURCE_ROOTS.terminalActivityHistory, activity.includes('assetPackCompletion') && activity.includes('sourceRevision')), + predicateResult('harness-projects-rich-reading-telemetry', SOURCE_ROOTS.terminalHarnessClient, harness.includes('ReadFitsFindingSynthesis') && harness.includes('ptrrStepId') && harness.includes('thricifiedGenerationId') && harness.includes('promptTemplateId') && harness.includes('outputSchema')), + predicateResult('conversation-handoff-preserves-reading-stage', SOURCE_ROOTS.conversationHandoff, handoff.includes('inferConversationTerminalReadingStage') && handoff.includes('terminalEnterpriseReadingStage') && handoff.includes("params.set('readingStage'")), + predicateResult('ux-state-tests-cover-route-retry-failure', SOURCE_ROOTS.uxStateTest, uxStateTest.includes('hydrates later route stages') && uxStateTest.includes('repair-settlement-readback')), + predicateResult('workbench-tests-cover-five-stage-labels', SOURCE_ROOTS.workbenchTest, workbenchTest.includes('3. Request Finding Fits') && workbenchTest.includes('buy-asset-pack-settle')), + predicateResult('handoff-tests-cover-reading-stage-route', SOURCE_ROOTS.handoffTest, handoffTest.includes('readingStage=request-fit') && handoffTest.includes('terminalEnterpriseReadingStage')), + predicateResult('query-tests-cover-reading-stage-route', SOURCE_ROOTS.queryTest, queryTest.includes('reads source-safe enterprise Reading stage') && queryTest.includes('request-fit')), + predicateResult('stream-tests-cover-rich-header', SOURCE_ROOTS.streamHeaderTest, streamHeaderTest.includes('ReadFitsFindingSynthesis') && streamHeaderTest.includes('outputSchema') && streamHeaderTest.includes('prompt_template_id_only')), + predicateResult('workflow-wires-gate3-check', SOURCE_ROOTS.gateWorkflow, gateWorkflow.includes('check-v42-gate3-reading-shortest-path-state-machine.mjs')), + predicateResult('v42-spec-gate3-expanded', SOURCE_ROOTS.v42Spec, spec.includes('V42 Gate 3') && spec.includes('reading shortest path state machine')), + predicateResult('v42-delta-gate3-expanded', SOURCE_ROOTS.v42Delta, delta.includes('Gate 3') && delta.includes('route-owned Reading state')), + predicateResult('v42-notes-gate3-expanded', SOURCE_ROOTS.v42Notes, notes.includes('Gate 3') && notes.includes('transaction id')), + predicateResult('v42-parity-gate3-implemented', SOURCE_ROOTS.v42Parity, parity.includes('Reading state machine') && parity.includes('implemented')), + predicateResult( + 'roadmap-records-gate3-closure', + SOURCE_ROOTS.roadmap, + roadmap.includes('Current working gate: V42 Gate') && roadmap.includes('V42 Gate 3 closure anchor'), + ), + predicateResult('readmes-document-gate3', SOURCE_ROOTS.rootReadme, rootReadme.includes('V42 Gate 3') && terminalReadme.includes('TerminalEnterpriseReadingUxState') && protocolReadme.includes('V42 Reading shortest path')), + ]; +} + +export function buildV42ReadingShortestPathStateMachine(options = {}) { + const repoRoot = options.repoRoot || DEFAULT_REPO_ROOT; + const predicateResults = buildPredicateResults(repoRoot); + const failedPredicateIds = predicateResults + .filter((predicate) => !predicate.passed) + .map((predicate) => predicate.id); + const rowRoots = V42_READING_SHORTEST_PATH_ROWS.map((item) => item.rowRoot); + const artifactRoot = `v42-reading-shortest-path-state-machine:${digest(JSON.stringify({ + rowRoots, + failedPredicateIds, + }))}`; + + return { + artifactId: 'v42-reading-shortest-path-state-machine', + schemaId: V42_READING_SHORTEST_PATH_STATE_MACHINE_SCHEMA_ID, + version: V42_READING_SHORTEST_PATH_STATE_MACHINE_VERSION, + currentTarget: V42_READING_SHORTEST_PATH_STATE_MACHINE_CURRENT_TARGET, + sourceSafetyVerdict: V42_READING_SHORTEST_PATH_STATE_MACHINE_SOURCE_SAFETY_VERDICT, + generatedAt: 'deterministic', + artifactRoot, + passed: failedPredicateIds.length === 0, + rows: V42_READING_SHORTEST_PATH_ROWS, + rowIds: [...V42_READING_SHORTEST_PATH_ROW_IDS], + stepIds: [...V42_READING_SHORTEST_PATH_STEP_IDS], + predicateResults, + coverage: { + rowCount: V42_READING_SHORTEST_PATH_ROWS.length, + stepCount: V42_READING_SHORTEST_PATH_STEP_IDS.length, + acceptedUserPath: [ + 'request-read', + 'review-synthesized-need', + 'request-finding-fits', + 'review-source-safe-assetpack-preview', + 'buy-settle-and-deliver-assetpack', + ], + requiredPredicateCount: predicateResults.length, + passedPredicateCount: predicateResults.length - failedPredicateIds.length, + failedPredicateIds, + routePersistenceCovered: true, + transactionIdRecoveryCovered: true, + restartRetryFailureCovered: true, + acceptedNeedGateCovered: true, + streamLogIntegrationCovered: true, + componentRouteTestsCovered: true, + sourceSafeMetadataOnly: true, + lowDetailDefault: true, + expandableSourceSafeDetail: true, + protectedSourceVisible: false, + rawProtectedPromptVisible: false, + rawProviderResponseVisible: false, + unpaidAssetPackSourceVisible: false, + walletPrivateMaterialVisible: false, + settlementPrivatePayloadVisible: false, + ledgerAuthorityClaimed: false, + legacySourceRoots: Object.values(SOURCE_ROOTS).some((sourcePath) => sourcePath.includes('_legacy/')), + }, + sourceRoots: SOURCE_ROOTS, + }; +} diff --git a/packages/protocol/src/index.d.ts b/packages/protocol/src/index.d.ts index d163ccbe..7bef5cb2 100644 --- a/packages/protocol/src/index.d.ts +++ b/packages/protocol/src/index.d.ts @@ -520,6 +520,15 @@ export const V42_DEPOSITING_SHORTEST_PATH_SOURCE_SAFETY_VERDICT: string; export const V42_DEPOSITING_SHORTEST_PATH_ROW_IDS: readonly string[]; export const V42_DEPOSITING_SHORTEST_PATH_ROWS: readonly Record[]; export function buildV42DepositingShortestPath(input?: Record): BitcodeProtocolReport; +export const V42_READING_SHORTEST_PATH_STATE_MACHINE_ARTIFACT_PATH: string; +export const V42_READING_SHORTEST_PATH_STATE_MACHINE_CURRENT_TARGET: string; +export const V42_READING_SHORTEST_PATH_SCHEMA_ID: string; +export const V42_READING_SHORTEST_PATH_STATE_MACHINE_VERSION: string; +export const V42_READING_SHORTEST_PATH_STATE_MACHINE_SOURCE_SAFETY_VERDICT: string; +export const V42_READING_SHORTEST_PATH_STEP_IDS: readonly string[]; +export const V42_READING_SHORTEST_PATH_ROW_IDS: readonly string[]; +export const V42_READING_SHORTEST_PATH_ROWS: readonly Record[]; +export function buildV42ReadingShortestPathStateMachine(input?: Record): BitcodeProtocolReport; export const EXCHANGE_INTENT_ORDER_CONTRACTS_ARTIFACT_PATH: string; export const EXCHANGE_INTENT_ORDER_CONTRACTS_CURRENT_TARGET: string; export const EXCHANGE_INTENT_ORDER_CONTRACTS_SCHEMA_ID: string; diff --git a/packages/protocol/src/index.js b/packages/protocol/src/index.js index 307cc3f8..7f07b1c9 100644 --- a/packages/protocol/src/index.js +++ b/packages/protocol/src/index.js @@ -580,6 +580,17 @@ export { V42_DEPOSITING_SHORTEST_PATH_VERSION, buildV42DepositingShortestPath } from './canonical/v42-depositing-shortest-path.js'; +export { + V42_READING_SHORTEST_PATH_ROWS, + V42_READING_SHORTEST_PATH_ROW_IDS, + V42_READING_SHORTEST_PATH_SCHEMA_ID, + V42_READING_SHORTEST_PATH_STATE_MACHINE_ARTIFACT_PATH, + V42_READING_SHORTEST_PATH_STATE_MACHINE_CURRENT_TARGET, + V42_READING_SHORTEST_PATH_STATE_MACHINE_SOURCE_SAFETY_VERDICT, + V42_READING_SHORTEST_PATH_STATE_MACHINE_VERSION, + V42_READING_SHORTEST_PATH_STEP_IDS, + buildV42ReadingShortestPathStateMachine +} from './canonical/v42-reading-shortest-path-state-machine.js'; export { EXCHANGE_INTENT_ACTION_KINDS, EXCHANGE_INTENT_ORDER_CONTRACTS_ARTIFACT_PATH, diff --git a/packages/protocol/test/v42-reading-shortest-path-state-machine.test.js b/packages/protocol/test/v42-reading-shortest-path-state-machine.test.js new file mode 100644 index 00000000..db12e040 --- /dev/null +++ b/packages/protocol/test/v42-reading-shortest-path-state-machine.test.js @@ -0,0 +1,77 @@ +import assert from 'node:assert/strict'; +import test from 'node:test'; + +import { + V42_READING_SHORTEST_PATH_ROWS, + V42_READING_SHORTEST_PATH_ROW_IDS, + V42_READING_SHORTEST_PATH_SCHEMA_ID, + V42_READING_SHORTEST_PATH_STATE_MACHINE_ARTIFACT_PATH, + V42_READING_SHORTEST_PATH_STATE_MACHINE_SOURCE_SAFETY_VERDICT, + V42_READING_SHORTEST_PATH_STEP_IDS, + buildV42ReadingShortestPathStateMachine, +} from '../src/canonical/v42-reading-shortest-path-state-machine.js'; + +test('V42 Reading shortest path state machine binds five route-recoverable steps', () => { + const report = buildV42ReadingShortestPathStateMachine(); + + assert.equal( + V42_READING_SHORTEST_PATH_STATE_MACHINE_ARTIFACT_PATH, + '.bitcode/v42-reading-shortest-path-state-machine.json', + ); + assert.equal(report.artifactId, 'v42-reading-shortest-path-state-machine'); + assert.equal(report.schemaId, V42_READING_SHORTEST_PATH_SCHEMA_ID); + assert.equal(report.version, 'V42'); + assert.equal(report.currentTarget, 'V41'); + assert.equal(report.sourceSafetyVerdict, V42_READING_SHORTEST_PATH_STATE_MACHINE_SOURCE_SAFETY_VERDICT); + assert.equal(report.passed, true); + assert.deepEqual(report.rowIds, [...V42_READING_SHORTEST_PATH_ROW_IDS]); + assert.deepEqual(report.stepIds, [...V42_READING_SHORTEST_PATH_STEP_IDS]); + assert.equal(report.rows.length, V42_READING_SHORTEST_PATH_ROWS.length); + assert.equal(report.coverage.rowCount, 9); + assert.equal(report.coverage.stepCount, 5); + assert.deepEqual(report.coverage.acceptedUserPath, [ + 'request-read', + 'review-synthesized-need', + 'request-finding-fits', + 'review-source-safe-assetpack-preview', + 'buy-settle-and-deliver-assetpack', + ]); + assert.equal(report.coverage.routePersistenceCovered, true); + assert.equal(report.coverage.transactionIdRecoveryCovered, true); + assert.equal(report.coverage.restartRetryFailureCovered, true); + assert.equal(report.coverage.acceptedNeedGateCovered, true); + assert.equal(report.coverage.streamLogIntegrationCovered, true); + assert.equal(report.coverage.componentRouteTestsCovered, true); + assert.equal(report.coverage.sourceSafeMetadataOnly, true); + assert.equal(report.coverage.lowDetailDefault, true); + assert.equal(report.coverage.expandableSourceSafeDetail, true); + assert.equal(report.coverage.protectedSourceVisible, false); + assert.equal(report.coverage.rawProtectedPromptVisible, false); + assert.equal(report.coverage.rawProviderResponseVisible, false); + assert.equal(report.coverage.unpaidAssetPackSourceVisible, false); + assert.equal(report.coverage.walletPrivateMaterialVisible, false); + assert.equal(report.coverage.settlementPrivatePayloadVisible, false); + assert.equal(report.coverage.ledgerAuthorityClaimed, false); + assert.equal(report.coverage.legacySourceRoots, false); + assert.deepEqual(report.coverage.failedPredicateIds, []); + assert.ok(report.artifactRoot.startsWith('v42-reading-shortest-path-state-machine:')); +}); + +test('V42 Reading shortest path rows remain expandable source-safe metadata', () => { + for (const row of V42_READING_SHORTEST_PATH_ROWS) { + assert.ok(row.rowRoot.startsWith('v42-reading-shortest-path-state-machine-row:')); + assert.equal(row.sourceSafetyClass, 'source_safe_reading_shortest_path_state_machine_metadata'); + assert.equal(row.sourceSafeMetadataOnly, true); + assert.equal(row.lowDetailDefault, true); + assert.equal(row.expandableSourceSafeDetail, true); + assert.equal(row.protectedSourceVisible, false); + assert.equal(row.rawProtectedPromptVisible, false); + assert.equal(row.rawProviderResponseVisible, false); + assert.equal(row.unpaidAssetPackSourceVisible, false); + assert.equal(row.walletPrivateMaterialVisible, false); + assert.equal(row.settlementPrivatePayloadVisible, false); + assert.equal(row.ledgerAuthorityClaimed, false); + assert.ok(row.forbiddenPayloadClasses.includes('protected-source-payloads')); + assert.ok(row.forbiddenPayloadClasses.includes('unpaid-assetpack-source')); + } +}); diff --git a/scripts/check-v42-gate3-reading-shortest-path-state-machine.mjs b/scripts/check-v42-gate3-reading-shortest-path-state-machine.mjs new file mode 100644 index 00000000..0376ffc5 --- /dev/null +++ b/scripts/check-v42-gate3-reading-shortest-path-state-machine.mjs @@ -0,0 +1,240 @@ +#!/usr/bin/env node + +import { execFileSync } from 'node:child_process'; +import { existsSync, readFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const defaultRepoRoot = path.resolve(__dirname, '..'); +const ARTIFACT_PATH = '.bitcode/v42-reading-shortest-path-state-machine.json'; + +const SECRET_MARKERS = [ + `${['sk', 'proj'].join('-')}-`, + `${['sb', 'secret'].join('_')}__`, + ['service', 'role'].join('_'), + Buffer.from('{"alg":"HS256","typ":"JWT"}').toString('base64url').slice(0, 18), + ['OPENAI', 'API', 'KEY'].join('_'), + ['SUPABASE', 'SERVICE', 'ROLE'].join('_'), + ['VERCEL', 'TOKEN'].join('_'), + ['VERCEL', 'OIDC', 'TOKEN'].join('_'), + ['PRIVATE', 'KEY'].join('_'), +]; + +function read(root, relativePath) { + return readFileSync(path.join(root, relativePath), 'utf8'); +} + +function fileExists(root, relativePath) { + return existsSync(path.join(root, relativePath)); +} + +function git(root, args) { + return execFileSync('git', args, { cwd: root, encoding: 'utf8' }).trim(); +} + +function run(root, command, args) { + return execFileSync(command, args, { + cwd: root, + encoding: 'utf8', + stdio: ['ignore', 'pipe', 'pipe'], + }).trim(); +} + +function assertCheck(failures, condition, message) { + if (!condition) failures.push(message); +} + +function parseArgs(argv) { + const args = { + skipBranchCheck: false, + skipUapiTests: false, + repoRoot: defaultRepoRoot, + }; + + for (let index = 0; index < argv.length; index += 1) { + const arg = argv[index]; + if (arg === '--skip-branch-check') args.skipBranchCheck = true; + else if (arg === '--skip-uapi-tests') args.skipUapiTests = true; + else if (arg === '--repo-root') args.repoRoot = path.resolve(argv[++index]); + else if (arg === '--help' || arg === '-h') args.help = true; + else throw new Error(`Unknown argument ${arg}`); + } + + return args; +} + +function printHelp() { + process.stdout.write( + [ + 'Usage: node scripts/check-v42-gate3-reading-shortest-path-state-machine.mjs [--skip-branch-check] [--skip-uapi-tests] [--repo-root ]', + '', + 'Checks V42 Gate 3 Reading shortest path state machine, route recovery, retry/failure posture, source-safe disclosure, workflow wiring, docs, tests, and generated artifact.', + ].join('\n'), + ); + process.stdout.write('\n'); +} + +function main() { + const args = parseArgs(process.argv.slice(2)); + if (args.help) { + printHelp(); + return; + } + + const root = args.repoRoot; + const failures = []; + const pointer = read(root, 'BITCODE_SPEC.txt').trim(); + + assertCheck( + failures, + pointer === 'V41', + `BITCODE_SPEC.txt must remain V41 during V42 gate work. Observed ${pointer || 'empty'}.`, + ); + + if (!args.skipBranchCheck) { + const branch = git(root, ['branch', '--show-current']); + assertCheck( + failures, + branch === 'version/v42' || /^v42\/gate-(?:3|[4-9]|10)-[a-z0-9][a-z0-9-]*$/u.test(branch), + `V42 Gate 3+ work must occur on version/v42 or v42/gate-3..10-* branches. Observed ${branch || 'detached HEAD'}.`, + ); + } + + const requiredFiles = [ + ARTIFACT_PATH, + 'uapi/app/terminal/TerminalPageClient.tsx', + 'uapi/app/terminal/terminal-enterprise-reading-ux-state.ts', + 'uapi/app/terminal/TerminalDepositReadWorkbench.tsx', + 'uapi/app/terminal/terminal-deposit-read-workbench.ts', + 'uapi/app/terminal/terminal-pipeline-harness-client.ts', + 'uapi/app/conversations/conversation-terminal-handoff.ts', + 'uapi/app/terminal/terminal-transaction-query.ts', + 'uapi/app/terminal/terminal-activity-history.ts', + 'uapi/tests/terminalEnterpriseReadingUxState.test.ts', + 'uapi/tests/terminalDepositReadWorkbench.test.ts', + 'uapi/tests/conversationTerminalHandoff.test.tsx', + 'uapi/tests/terminalTransactionQuery.test.ts', + 'uapi/tests/terminalPipelineHarnessClient.test.ts', + 'uapi/tests/pipelineExecutionLogHeader.test.tsx', + 'packages/protocol/src/canonical/v42-reading-shortest-path-state-machine.js', + 'packages/protocol/test/v42-reading-shortest-path-state-machine.test.js', + 'scripts/generate-v42-reading-shortest-path-state-machine.mjs', + 'scripts/check-v42-gate3-reading-shortest-path-state-machine.mjs', + 'BITCODE_SPEC_V42.md', + 'BITCODE_SPEC_V42_DELTA.md', + 'BITCODE_SPEC_V42_NOTES.md', + 'BITCODE_SPEC_V42_PARITY_MATRIX.md', + 'SPECIFICATIONS_ROADMAP.md', + 'README.md', + 'uapi/app/terminal/README.md', + 'packages/protocol/README.md', + 'package.json', + '.github/workflows/bitcode-gate-quality.yml', + '.github/workflows/bitcode-canon-quality.yml', + ]; + + for (const relativePath of requiredFiles) { + assertCheck(failures, fileExists(root, relativePath), `Missing V42 Gate 3 file: ${relativePath}`); + } + + if (failures.length === 0) { + try { + run(root, 'node', ['scripts/generate-v42-reading-shortest-path-state-machine.mjs', '--check']); + } catch (error) { + failures.push(`V42 Reading shortest path state machine artifact check failed: ${error.stderr || error.message}`); + } + } + + if (failures.length === 0) { + try { + run(root, 'node', [ + '--test', + '--test-force-exit', + 'packages/protocol/test/v42-reading-shortest-path-state-machine.test.js', + ]); + } catch (error) { + failures.push(`V42 Reading shortest path state machine protocol test failed: ${error.stderr || error.message}`); + } + } + + if (failures.length === 0 && !args.skipUapiTests) { + try { + run(root, 'pnpm', [ + '--dir', + 'uapi', + 'exec', + 'jest', + '--runTestsByPath', + 'tests/terminalEnterpriseReadingUxState.test.ts', + 'tests/terminalDepositReadWorkbench.test.ts', + 'tests/conversationTerminalHandoff.test.tsx', + 'tests/terminalTransactionQuery.test.ts', + 'tests/terminalPipelineHarnessClient.test.ts', + 'tests/pipelineExecutionLogHeader.test.tsx', + '--runInBand', + ]); + } catch (error) { + failures.push(`V42 Reading shortest path state machine uapi tests failed: ${error.stderr || error.message}`); + } + } + + const serializedArtifact = fileExists(root, ARTIFACT_PATH) ? read(root, ARTIFACT_PATH) : ''; + for (const marker of SECRET_MARKERS) { + assertCheck(failures, !serializedArtifact.includes(marker), `V42 Gate 3 artifact must not contain secret marker ${marker}.`); + } + + const artifact = serializedArtifact ? JSON.parse(serializedArtifact) : null; + if (artifact) { + assertCheck(failures, artifact.artifactId === 'v42-reading-shortest-path-state-machine', 'Gate 3 artifactId must match.'); + assertCheck( + failures, + artifact.schemaId === 'bitcode.v42.readingShortestPathStateMachine.v1', + 'Gate 3 schemaId must match.', + ); + assertCheck(failures, artifact.version === 'V42' && artifact.currentTarget === 'V41', 'Gate 3 artifact must bind V42 over active V41.'); + assertCheck(failures, artifact.passed === true, 'Gate 3 artifact must pass.'); + assertCheck( + failures, + artifact.sourceSafetyVerdict === 'source-safe-reading-shortest-path-state-machine-metadata', + 'Gate 3 artifact must declare source-safe Reading state-machine metadata.', + ); + assertCheck(failures, artifact.coverage.rowCount === 9, 'Gate 3 must cover nine Reading state-machine rows.'); + assertCheck(failures, artifact.coverage.stepCount === 5, 'Gate 3 must cover five Reading steps.'); + assertCheck(failures, artifact.coverage.routePersistenceCovered === true, 'Gate 3 must cover route persistence.'); + assertCheck(failures, artifact.coverage.transactionIdRecoveryCovered === true, 'Gate 3 must cover transaction id recovery.'); + assertCheck(failures, artifact.coverage.restartRetryFailureCovered === true, 'Gate 3 must cover restart, retry, and failure repair.'); + assertCheck(failures, artifact.coverage.acceptedNeedGateCovered === true, 'Gate 3 must cover accepted-Need gating.'); + assertCheck(failures, artifact.coverage.streamLogIntegrationCovered === true, 'Gate 3 must cover stream log integration.'); + assertCheck(failures, artifact.coverage.componentRouteTestsCovered === true, 'Gate 3 must cover component and route tests.'); + assertCheck(failures, artifact.coverage.sourceSafeMetadataOnly === true, 'Gate 3 must remain source-safe metadata only.'); + assertCheck(failures, artifact.coverage.lowDetailDefault === true, 'Gate 3 must preserve low-detail defaults.'); + assertCheck(failures, artifact.coverage.expandableSourceSafeDetail === true, 'Gate 3 must preserve expandable source-safe detail.'); + assertCheck(failures, artifact.coverage.protectedSourceVisible === false, 'Gate 3 artifact must not expose protected source.'); + assertCheck(failures, artifact.coverage.rawProtectedPromptVisible === false, 'Gate 3 artifact must not expose protected prompts.'); + assertCheck(failures, artifact.coverage.rawProviderResponseVisible === false, 'Gate 3 artifact must not expose raw provider responses.'); + assertCheck(failures, artifact.coverage.unpaidAssetPackSourceVisible === false, 'Gate 3 artifact must not expose unpaid AssetPack source.'); + assertCheck(failures, artifact.coverage.walletPrivateMaterialVisible === false, 'Gate 3 artifact must not expose wallet private material.'); + assertCheck(failures, artifact.coverage.ledgerAuthorityClaimed === false, 'Gate 3 artifact must not claim ledger authority.'); + assertCheck(failures, artifact.coverage.legacySourceRoots === false, 'Gate 3 must not rely on legacy source roots.'); + assertCheck(failures, Array.isArray(artifact.coverage.failedPredicateIds) && artifact.coverage.failedPredicateIds.length === 0, 'Gate 3 predicates must all pass.'); + } + + const spec = read(root, 'BITCODE_SPEC_V42.md'); + const parity = read(root, 'BITCODE_SPEC_V42_PARITY_MATRIX.md'); + const terminalReadme = read(root, 'uapi/app/terminal/README.md'); + assertCheck(failures, spec.includes('V42 Gate 3') && spec.includes('reading shortest path state machine'), 'V42 spec must expand Gate 3 state machine.'); + assertCheck(failures, parity.includes('Reading state machine') && parity.includes('implemented'), 'V42 parity matrix must mark Reading state machine implemented.'); + assertCheck(failures, terminalReadme.includes('V42 Gate 3') && terminalReadme.includes('TerminalEnterpriseReadingRouteState'), 'Terminal README must document Gate 3 route state.'); + + if (failures.length > 0) { + process.stderr.write(`V42 Gate 3 Reading shortest path state machine check failed:\n- ${failures.join('\n- ')}\n`); + process.exitCode = 1; + return; + } + + process.stdout.write(`V42 Gate 3 Reading shortest path state machine ok artifact=${artifact.artifactRoot}\n`); +} + +main(); diff --git a/scripts/generate-v42-reading-shortest-path-state-machine.mjs b/scripts/generate-v42-reading-shortest-path-state-machine.mjs new file mode 100644 index 00000000..615153ae --- /dev/null +++ b/scripts/generate-v42-reading-shortest-path-state-machine.mjs @@ -0,0 +1,31 @@ +#!/usr/bin/env node + +import { readFileSync, writeFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { + V42_READING_SHORTEST_PATH_STATE_MACHINE_ARTIFACT_PATH, + buildV42ReadingShortestPathStateMachine, +} from '../packages/protocol/src/canonical/v42-reading-shortest-path-state-machine.js'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const repoRoot = path.resolve(__dirname, '..'); + +const check = process.argv.includes('--check'); +const artifact = buildV42ReadingShortestPathStateMachine({ repoRoot }); +const serialized = `${JSON.stringify(artifact, null, 2)}\n`; +const artifactPath = path.join(repoRoot, V42_READING_SHORTEST_PATH_STATE_MACHINE_ARTIFACT_PATH); + +if (check) { + const current = readFileSync(artifactPath, 'utf8'); + if (current !== serialized) { + process.stderr.write( + `${V42_READING_SHORTEST_PATH_STATE_MACHINE_ARTIFACT_PATH} is stale. Run pnpm run generate:v42-reading-shortest-path-state-machine.\n`, + ); + process.exitCode = 1; + } +} else { + writeFileSync(artifactPath, serialized); + process.stdout.write(`wrote ${V42_READING_SHORTEST_PATH_STATE_MACHINE_ARTIFACT_PATH}\n`); +} diff --git a/uapi/app/terminal/README.md b/uapi/app/terminal/README.md index 7867c6b7..176bc0a0 100644 --- a/uapi/app/terminal/README.md +++ b/uapi/app/terminal/README.md @@ -105,6 +105,16 @@ parses it only as operator posture. The source-safe generated artifact is `.bitcode/v39-enterprise-reading-ux-state.json`, checked by `pnpm run check:v39-gate3`. +V42 Gate 3 extends that state into the current Reading shortest path recovery +contract. `TerminalEnterpriseReadingRouteState` binds transaction id presence, +the `readingStage` query parameter, active-stage hydration, retry and restart +posture, source-safe failure kind, and repair actions. Terminal may restore a +later stage from route state after refresh or handoff, but blockers still hold: +accepted Need gates Finding Fits, source-safe AssetPack preview gates +settlement, and settlement readback gates delivery. The source-safe proof +artifact is `.bitcode/v42-reading-shortest-path-state-machine.json`, checked by +`pnpm run check:v42-gate3`. + ## Live staging-testnet QA Terminal Deposit/Read QA starts only after Wallet and Externals prerequisites are diff --git a/uapi/app/terminal/TerminalDepositReadWorkbench.tsx b/uapi/app/terminal/TerminalDepositReadWorkbench.tsx index 6d0e756b..4d4e1453 100644 --- a/uapi/app/terminal/TerminalDepositReadWorkbench.tsx +++ b/uapi/app/terminal/TerminalDepositReadWorkbench.tsx @@ -108,6 +108,7 @@ interface TerminalDepositReadWorkbenchProps { repositoryContext?: TerminalRepositoryContextState | null; depositedSourceRevision?: TerminalDepositedSourceRevision | null; admittedReadActivityId?: string | null; + routeReadingStage?: TerminalEnterpriseReadingStepId | null; onRecordActivity?: (draft: TerminalActivityRecordDraft) => Promise; onHarnessCompleted?: () => Promise | unknown; showDemonstrationWorkbench?: boolean; @@ -117,6 +118,7 @@ export default function TerminalDepositReadWorkbench({ repositoryContext = null, depositedSourceRevision = null, admittedReadActivityId = null, + routeReadingStage = null, onRecordActivity, onHarnessCompleted, showDemonstrationWorkbench = true, @@ -304,6 +306,8 @@ export default function TerminalDepositReadWorkbench({ const enterpriseReadingState = useMemo( () => buildTerminalEnterpriseReadingUxState({ + transactionId: recordedAdmittedReadActivityId || harnessReadActivityId || admittedReadActivityId || null, + routeReadingStage, hasRepositorySource: Boolean(workbench?.sourceRevision), hasReadMeasurement: readFitsFindingProgress !== 'draft' || Boolean(harnessReadActivityId), hasSynthesizedNeed: Boolean(readNeed), @@ -312,18 +316,24 @@ export default function TerminalDepositReadWorkbench({ hasSourceSafePreview: Boolean(sourceSafePreview), hasSettlementReadback: settledReadback, hasDeliveryReadback: pullRequestDelivered, + retryRequested: readNeedSynthesisCount > 1 || harnessState === 'failed', + failureKind: harnessState === 'failed' ? 'fits_finding_failed' : null, sourceSafePreviewBlocked: Boolean(sourceSafePreview && !disclosureSourceSafe), disclosureLeakageDetected: disclosureLeakage?.protectedSourceDetected === true, }), [ acceptedReadNeed, + admittedReadActivityId, disclosureLeakage?.protectedSourceDetected, disclosureSourceSafe, harnessReadActivityId, harnessState, + readNeedSynthesisCount, pullRequestDelivered, readFitsFindingProgress, + recordedAdmittedReadActivityId, readNeed, + routeReadingStage, settledReadback, sourceSafePreview, workbench?.sourceRevision, @@ -711,7 +721,12 @@ export default function TerminalDepositReadWorkbench({ /> -
+

staged reading

diff --git a/uapi/app/terminal/TerminalPageClient.tsx b/uapi/app/terminal/TerminalPageClient.tsx index 33d0e3ca..f33d3aa2 100644 --- a/uapi/app/terminal/TerminalPageClient.tsx +++ b/uapi/app/terminal/TerminalPageClient.tsx @@ -691,6 +691,7 @@ export default function TerminalPageClient() { repositoryContext={repositoryContext} depositedSourceRevision={depositedSourceRevision} admittedReadActivityId={admittedReadActivityId} + routeReadingStage={conversationHandoffContext.readingStage} onRecordActivity={handleRecordActivity} onHarnessCompleted={refreshLiveRuns} showDemonstrationWorkbench={showDemonstrationSurfaces} diff --git a/uapi/app/terminal/terminal-enterprise-reading-ux-state.ts b/uapi/app/terminal/terminal-enterprise-reading-ux-state.ts index 54911805..305a345d 100644 --- a/uapi/app/terminal/terminal-enterprise-reading-ux-state.ts +++ b/uapi/app/terminal/terminal-enterprise-reading-ux-state.ts @@ -7,6 +7,16 @@ export type TerminalEnterpriseReadingStepId = export type TerminalEnterpriseReadingStepState = 'complete' | 'current' | 'blocked'; +export type TerminalEnterpriseReadingFailureKind = + | 'none' + | 'read_request_invalid' + | 'need_review_required' + | 'fits_finding_failed' + | 'asset_pack_preview_blocked' + | 'settlement_blocked' + | 'delivery_blocked' + | 'source_safety_blocked'; + export type TerminalEnterpriseReadingSourceSafeField = | 'read_request_summary' | 'read_need_measurements' @@ -46,6 +56,8 @@ export type TerminalEnterpriseReadingStepView = TerminalEnterpriseReadingStepDef }; export type TerminalEnterpriseReadingUxStateInput = { + transactionId?: string | null; + routeReadingStage?: TerminalEnterpriseReadingStepId | null; hasRepositorySource?: boolean; hasReadMeasurement?: boolean; hasSynthesizedNeed?: boolean; @@ -54,10 +66,30 @@ export type TerminalEnterpriseReadingUxStateInput = { hasSourceSafePreview?: boolean; hasSettlementReadback?: boolean; hasDeliveryReadback?: boolean; + retryRequested?: boolean; + restartRequested?: boolean; + failureKind?: TerminalEnterpriseReadingFailureKind | null; sourceSafePreviewBlocked?: boolean; disclosureLeakageDetected?: boolean; }; +export type TerminalEnterpriseReadingRouteState = { + transactionId: string | null; + transactionIdPresent: boolean; + transactionIdRequiredForRecovery: true; + readingStageQueryParam: 'readingStage'; + activeStageHydratedFromRoute: boolean; + routeReadingStage: TerminalEnterpriseReadingStepId | null; + restartRequested: boolean; + restartRestoresActiveStage: true; + retryRequested: boolean; + retryPreservesNeedLineage: true; + retryPreservesSettlementBoundary: true; + failureKind: TerminalEnterpriseReadingFailureKind; + failureStateSourceSafe: true; + failureRepairActions: string[]; +}; + export type TerminalEnterpriseReadingUxState = { schema: 'bitcode.terminal.enterprise-reading-ux-state'; activeStepId: TerminalEnterpriseReadingStepId; @@ -78,10 +110,15 @@ export type TerminalEnterpriseReadingUxState = { routeContract: { terminalOwnsTransactionAuthority: true; conversationMayHandoffIntent: true; + transactionRouteRequiredForRecovery: true; acceptedNeedRequiredBeforeFindingFits: true; sourceSafePreviewRequiredBeforeSettlement: true; deliveryRequiresSettlementUnlock: true; + restartRestoresReadingStage: true; + retryPreservesSourceSafeLineage: true; + failureStatesSourceSafe: true; }; + routeState: TerminalEnterpriseReadingRouteState; proofRoot: string; }; @@ -183,6 +220,47 @@ export function inferTerminalEnterpriseReadingActiveStep( return 'request-read'; } +function normalizeTransactionId(value: string | null | undefined): string | null { + const normalized = value?.trim(); + return normalized ? normalized : null; +} + +function routeStageOrNull(value: TerminalEnterpriseReadingStepId | null | undefined): TerminalEnterpriseReadingStepId | null { + return value && STEP_ORDER.includes(value) ? value : null; +} + +function chooseActiveStep( + input: TerminalEnterpriseReadingUxStateInput, +): { activeStepId: TerminalEnterpriseReadingStepId; routeReadingStage: TerminalEnterpriseReadingStepId | null } { + const inferredStep = inferTerminalEnterpriseReadingActiveStep(input); + const routeReadingStage = routeStageOrNull(input.routeReadingStage); + if (!routeReadingStage) return { activeStepId: inferredStep, routeReadingStage }; + + const inferredIndex = STEP_ORDER.indexOf(inferredStep); + const routeIndex = STEP_ORDER.indexOf(routeReadingStage); + return { + activeStepId: routeIndex > inferredIndex ? routeReadingStage : inferredStep, + routeReadingStage, + }; +} + +function failureKindFor(input: TerminalEnterpriseReadingUxStateInput): TerminalEnterpriseReadingFailureKind { + if (input.disclosureLeakageDetected) return 'source_safety_blocked'; + if (input.sourceSafePreviewBlocked) return 'asset_pack_preview_blocked'; + return input.failureKind || 'none'; +} + +function repairActionsForFailure(kind: TerminalEnterpriseReadingFailureKind): string[] { + if (kind === 'none') return []; + if (kind === 'read_request_invalid') return ['repair-read-request']; + if (kind === 'need_review_required') return ['review-or-resynthesize-need']; + if (kind === 'fits_finding_failed') return ['retry-finding-fits-from-accepted-need']; + if (kind === 'asset_pack_preview_blocked') return ['repair-source-safe-preview']; + if (kind === 'settlement_blocked') return ['repair-settlement-readback']; + if (kind === 'delivery_blocked') return ['repair-repository-delivery']; + return ['repair-source-safety-disclosure']; +} + function blockersFor(stepId: TerminalEnterpriseReadingStepId, input: TerminalEnterpriseReadingUxStateInput) { const blockers: string[] = []; if (stepId === 'request-read' && !input.hasRepositorySource) blockers.push('repository source required'); @@ -208,8 +286,10 @@ function blockersFor(stepId: TerminalEnterpriseReadingStepId, input: TerminalEnt export function buildTerminalEnterpriseReadingUxState( input: TerminalEnterpriseReadingUxStateInput = {}, ): TerminalEnterpriseReadingUxState { - const activeStepId = inferTerminalEnterpriseReadingActiveStep(input); + const { activeStepId, routeReadingStage } = chooseActiveStep(input); const activeIndex = STEP_ORDER.indexOf(activeStepId); + const transactionId = normalizeTransactionId(input.transactionId); + const failureKind = failureKindFor(input); const steps = TERMINAL_ENTERPRISE_READING_STEPS.map((step, index) => { const blockers = blockersFor(step.id, input); const state: TerminalEnterpriseReadingStepState = @@ -232,6 +312,10 @@ export function buildTerminalEnterpriseReadingUxState( hasSourceSafePreview: Boolean(input.hasSourceSafePreview), hasSettlementReadback: Boolean(input.hasSettlementReadback), hasDeliveryReadback: Boolean(input.hasDeliveryReadback), + transactionId, + routeReadingStage, + retryRequested: Boolean(input.retryRequested), + failureKind, }); return { @@ -254,9 +338,29 @@ export function buildTerminalEnterpriseReadingUxState( routeContract: { terminalOwnsTransactionAuthority: true, conversationMayHandoffIntent: true, + transactionRouteRequiredForRecovery: true, acceptedNeedRequiredBeforeFindingFits: true, sourceSafePreviewRequiredBeforeSettlement: true, deliveryRequiresSettlementUnlock: true, + restartRestoresReadingStage: true, + retryPreservesSourceSafeLineage: true, + failureStatesSourceSafe: true, + }, + routeState: { + transactionId, + transactionIdPresent: Boolean(transactionId), + transactionIdRequiredForRecovery: true, + readingStageQueryParam: 'readingStage', + activeStageHydratedFromRoute: routeReadingStage === activeStepId, + routeReadingStage, + restartRequested: Boolean(input.restartRequested), + restartRestoresActiveStage: true, + retryRequested: Boolean(input.retryRequested), + retryPreservesNeedLineage: true, + retryPreservesSettlementBoundary: true, + failureKind, + failureStateSourceSafe: true, + failureRepairActions: repairActionsForFailure(failureKind), }, proofRoot: `terminal-enterprise-reading-ux:${stableHash(seed)}`, }; @@ -276,9 +380,19 @@ export function assertTerminalEnterpriseReadingUxStateSourceSafe(state: Terminal state.disclosure.ledgerAuthorityClaimed === false && state.routeContract.terminalOwnsTransactionAuthority === true && state.routeContract.conversationMayHandoffIntent === true && + state.routeContract.transactionRouteRequiredForRecovery === true && state.routeContract.acceptedNeedRequiredBeforeFindingFits === true && state.routeContract.sourceSafePreviewRequiredBeforeSettlement === true && state.routeContract.deliveryRequiresSettlementUnlock === true && + state.routeContract.restartRestoresReadingStage === true && + state.routeContract.retryPreservesSourceSafeLineage === true && + state.routeContract.failureStatesSourceSafe === true && + state.routeState.transactionIdRequiredForRecovery === true && + state.routeState.readingStageQueryParam === 'readingStage' && + state.routeState.restartRestoresActiveStage === true && + state.routeState.retryPreservesNeedLineage === true && + state.routeState.retryPreservesSettlementBoundary === true && + state.routeState.failureStateSourceSafe === true && TERMINAL_ENTERPRISE_READING_FORBIDDEN_FIELDS.every((field) => state.disclosure.hiddenBeforeSettlement.includes(field), ); diff --git a/uapi/tests/terminalEnterpriseReadingUxState.test.ts b/uapi/tests/terminalEnterpriseReadingUxState.test.ts index 352e54e5..52873233 100644 --- a/uapi/tests/terminalEnterpriseReadingUxState.test.ts +++ b/uapi/tests/terminalEnterpriseReadingUxState.test.ts @@ -90,6 +90,7 @@ describe('terminal-enterprise-reading-ux-state', () => { it('admits only source-safe low-detail and expandable metadata before settlement', () => { const state = buildTerminalEnterpriseReadingUxState({ + transactionId: 'reading-transaction-1', hasRepositorySource: true, hasReadMeasurement: true, hasSynthesizedNeed: true, @@ -98,13 +99,49 @@ describe('terminal-enterprise-reading-ux-state', () => { }); expect(state.activeStepId).toBe('request-fit'); + expect(state.routeState.transactionId).toBe('reading-transaction-1'); + expect(state.routeState.transactionIdPresent).toBe(true); + expect(state.routeState.readingStageQueryParam).toBe('readingStage'); expect(state.routeContract.acceptedNeedRequiredBeforeFindingFits).toBe(true); expect(state.routeContract.sourceSafePreviewRequiredBeforeSettlement).toBe(true); expect(state.routeContract.deliveryRequiresSettlementUnlock).toBe(true); + expect(state.routeContract.restartRestoresReadingStage).toBe(true); + expect(state.routeContract.retryPreservesSourceSafeLineage).toBe(true); + expect(state.routeContract.failureStatesSourceSafe).toBe(true); expect(state.proofRoot).toMatch(/^terminal-enterprise-reading-ux:/u); expect(assertTerminalEnterpriseReadingUxStateSourceSafe(state)).toEqual({ admitted: true, reason: 'source_safe_enterprise_reading_ux_metadata', }); }); + + it('hydrates later route stages, retry posture, and source-safe failure repair actions', () => { + const state = buildTerminalEnterpriseReadingUxState({ + transactionId: 'reading-transaction-2', + routeReadingStage: 'buy-asset-pack-settle', + hasRepositorySource: true, + hasReadMeasurement: true, + hasSynthesizedNeed: true, + hasAcceptedNeed: true, + retryRequested: true, + restartRequested: true, + failureKind: 'settlement_blocked', + }); + + expect(state.activeStepId).toBe('buy-asset-pack-settle'); + expect(state.routeState.routeReadingStage).toBe('buy-asset-pack-settle'); + expect(state.routeState.activeStageHydratedFromRoute).toBe(true); + expect(state.routeState.retryRequested).toBe(true); + expect(state.routeState.retryPreservesNeedLineage).toBe(true); + expect(state.routeState.retryPreservesSettlementBoundary).toBe(true); + expect(state.routeState.restartRequested).toBe(true); + expect(state.routeState.restartRestoresActiveStage).toBe(true); + expect(state.routeState.failureKind).toBe('settlement_blocked'); + expect(state.routeState.failureStateSourceSafe).toBe(true); + expect(state.routeState.failureRepairActions).toContain('repair-settlement-readback'); + expect(state.steps.find((step) => step.id === 'buy-asset-pack-settle')?.blockers).toContain( + 'source-safe AssetPack preview required', + ); + expect(assertTerminalEnterpriseReadingUxStateSourceSafe(state).admitted).toBe(true); + }); }); From 0a624838c306958cda748d5408ae8d9d7bcb6ecf Mon Sep 17 00:00:00 2001 From: Garrett Maring Date: Thu, 28 May 2026 18:07:23 -0300 Subject: [PATCH 05/35] V42 Gate 4: Close ReadNeed review loop Persist source-safe ReadNeed review and resynthesis runtime receipts across synthesize, accept, reject, and resynthesize actions. Expose Terminal runtime/storage/telemetry readbacks, add product closure proof artifact, wire promotion checks, and cover the route/pipeline/protocol contracts with focused tests. --- ...ed-review-resynthesis-product-closure.json | 644 ++++++++++++++++++ .github/workflows/bitcode-canon-quality.yml | 3 + .github/workflows/bitcode-gate-quality.yml | 3 + BITCODE_SPEC_V42.md | 4 +- BITCODE_SPEC_V42_DELTA.md | 1 + BITCODE_SPEC_V42_NOTES.md | 8 + BITCODE_SPEC_V42_PARITY_MATRIX.md | 4 +- README.md | 7 + SPECIFICATIONS_ROADMAP.md | 5 +- package.json | 3 + packages/pipelines/asset-pack/README.md | 8 + .../read-need-review-resynthesis.test.ts | 3 + packages/protocol/README.md | 9 + ...need-review-resynthesis-product-closure.js | 325 +++++++++ packages/protocol/src/index.d.ts | 9 + packages/protocol/src/index.js | 11 + ...review-resynthesis-product-closure.test.js | 73 ++ ...eed-review-resynthesis-product-closure.mjs | 258 +++++++ ...eed-review-resynthesis-product-closure.mjs | 31 + uapi/app/api/read-review/route.ts | 6 + uapi/app/terminal/README.md | 10 + .../terminal/TerminalDepositReadWorkbench.tsx | 130 +++- uapi/tests/api/readReviewRoute.test.ts | 10 + 23 files changed, 1559 insertions(+), 6 deletions(-) create mode 100644 .bitcode/v42-readneed-review-resynthesis-product-closure.json create mode 100644 packages/protocol/src/canonical/v42-readneed-review-resynthesis-product-closure.js create mode 100644 packages/protocol/test/v42-readneed-review-resynthesis-product-closure.test.js create mode 100644 scripts/check-v42-gate4-readneed-review-resynthesis-product-closure.mjs create mode 100644 scripts/generate-v42-readneed-review-resynthesis-product-closure.mjs diff --git a/.bitcode/v42-readneed-review-resynthesis-product-closure.json b/.bitcode/v42-readneed-review-resynthesis-product-closure.json new file mode 100644 index 00000000..2ec7f691 --- /dev/null +++ b/.bitcode/v42-readneed-review-resynthesis-product-closure.json @@ -0,0 +1,644 @@ +{ + "artifactId": "v42-readneed-review-resynthesis-product-closure", + "schemaId": "bitcode.v42.readNeedReviewResynthesisProductClosure.v1", + "version": "V42", + "currentTarget": "V41", + "sourceSafetyVerdict": "source-safe-readneed-review-resynthesis-product-closure-metadata", + "generatedAt": "deterministic", + "artifactRoot": "v42-readneed-review-resynthesis-product-closure:932beb894b734ebe044125ae", + "passed": true, + "rows": [ + { + "rowId": "request:read-request-persistence", + "purpose": "Persist source-safe Read Request data with repository, branch, commit, target artifact kinds, closure criteria, failure modes, feedback, and previous Need lineage.", + "sourceRoots": [ + "packages/pipelines/asset-pack/src/read-need.ts", + "packages/pipelines/asset-pack/src/read-need-review-resynthesis.ts", + "uapi/app/api/read-review/route.ts" + ], + "emittedTypes": [ + "ReadNeedRequest", + "ReadNeedReviewStorageRecord" + ], + "requiredEvidence": [ + "bitcode.read.request", + "read_request", + "previousNeedId" + ], + "rowRoot": "v42-readneed-review-resynthesis-product-closure-row:dd13403f50f233293a797b93", + "sourceSafetyClass": "source_safe_readneed_review_resynthesis_product_closure_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "credentialsSerialized": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "secret-values" + ] + }, + { + "rowId": "pipeline:ptrr-failsafe-thricified-need-synthesis", + "purpose": "Keep ReadNeedComprehensionSynthesis product-owned by PTRR agents whose steps carry FailsafeGenerationSequence over ThricifiedGeneration contracts and typed parser output.", + "sourceRoots": [ + "packages/pipelines/asset-pack/src/read-need.ts", + "packages/pipelines/asset-pack/src/reading-pipeline-contract.ts", + "packages/pipelines/asset-pack/src/__tests__/read-need.test.ts" + ], + "emittedTypes": [ + "ReadNeedComprehensionSynthesisInferenceReceipt", + "ReadingPipelineContract" + ], + "requiredEvidence": [ + "ptrrStepIds", + "failsafeSequenceIds", + "thricifiedGenerationIds", + "ReadNeedComprehensionSynthesis.prompt.need-synthesis" + ], + "rowRoot": "v42-readneed-review-resynthesis-product-closure-row:2a7caa01828aa9e731d31be0", + "sourceSafetyClass": "source_safe_readneed_review_resynthesis_product_closure_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "credentialsSerialized": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "secret-values" + ] + }, + { + "rowId": "need:synthesized-need-storage", + "purpose": "Persist reviewable synthesized Need output before Finding Fits, including requirements, target artifacts, source constraints, proof expectations, and review state.", + "sourceRoots": [ + "packages/pipelines/asset-pack/src/read-need.ts", + "packages/pipelines/asset-pack/src/read-need-review-resynthesis.ts", + "packages/pipelines/asset-pack/src/__tests__/read-need-review-resynthesis.test.ts" + ], + "emittedTypes": [ + "ReadNeed", + "synthesized_need" + ], + "requiredEvidence": [ + "bitcode.read.need", + "needs_acceptance", + "synthesized_need" + ], + "rowRoot": "v42-readneed-review-resynthesis-product-closure-row:9132dd0681fe996ad9af5add", + "sourceSafetyClass": "source_safe_readneed_review_resynthesis_product_closure_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "credentialsSerialized": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "secret-values" + ] + }, + { + "rowId": "feedback:review-resynthesis-lineage", + "purpose": "Preserve user feedback and resynthesis attempts so every new Need stays linked to the prior Need and reviewed feedback.", + "sourceRoots": [ + "packages/pipelines/asset-pack/src/read-need.ts", + "packages/pipelines/asset-pack/src/read-need-review-resynthesis.ts", + "uapi/tests/api/readReviewRoute.test.ts", + "uapi/app/terminal/TerminalDepositReadWorkbench.tsx" + ], + "emittedTypes": [ + "resynthesis_attempt", + "feedbackHistory" + ], + "requiredEvidence": [ + "previousNeedId", + "resynthesize_read_need", + "resynthesis_attempt" + ], + "rowRoot": "v42-readneed-review-resynthesis-product-closure-row:16e048458da7e50ddd1b4f2f", + "sourceSafetyClass": "source_safe_readneed_review_resynthesis_product_closure_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "credentialsSerialized": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "secret-values" + ] + }, + { + "rowId": "measurement:need-measurement-storage", + "purpose": "Persist Need measurement roots and pricing measurement inputs that later drive deterministic preview quotes without exposing source.", + "sourceRoots": [ + "packages/pipelines/asset-pack/src/read-need.ts", + "packages/pipelines/asset-pack/src/read-need-review-resynthesis.ts", + "packages/pipelines/asset-pack/src/__tests__/read-need.test.ts" + ], + "emittedTypes": [ + "ReadNeedMeasurementDimension", + "need_measurement" + ], + "requiredEvidence": [ + "measurementRoot", + "pricingMeasurementInputs", + "shareToFeeFormula" + ], + "rowRoot": "v42-readneed-review-resynthesis-product-closure-row:49789e8b9beb3a2d19f60ad7", + "sourceSafetyClass": "source_safe_readneed_review_resynthesis_product_closure_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "credentialsSerialized": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "secret-values" + ] + }, + { + "rowId": "admission:accepted-need-gates-finding-fits", + "purpose": "Persist accepted-Need admission as the only source-safe handoff into ReadFitsFindingSynthesis and block Finding Fits without acceptance.", + "sourceRoots": [ + "packages/pipelines/asset-pack/src/read-need.ts", + "packages/pipelines/asset-pack/src/read-need-review-resynthesis.ts", + "uapi/tests/api/readReviewRoute.test.ts", + "uapi/app/terminal/terminal-enterprise-reading-ux-state.ts" + ], + "emittedTypes": [ + "ReadFitsFindingAdmission", + "accepted_need_admission" + ], + "requiredEvidence": [ + "accept_read_need", + "accepted_need_admission", + "accepted_read_need_missing" + ], + "rowRoot": "v42-readneed-review-resynthesis-product-closure-row:db95df08a064d2644a6a86db", + "sourceSafetyClass": "source_safe_readneed_review_resynthesis_product_closure_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "credentialsSerialized": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "secret-values" + ] + }, + { + "rowId": "rejection:rejected-need-posture", + "purpose": "Persist rejected-Need posture with rejection root, feedback, blocked Finding Fits stage, and repair/resynthesis next action.", + "sourceRoots": [ + "packages/pipelines/asset-pack/src/read-need.ts", + "packages/pipelines/asset-pack/src/read-need-review-resynthesis.ts", + "uapi/tests/api/readReviewRoute.test.ts", + "uapi/app/terminal/TerminalDepositReadWorkbench.tsx" + ], + "emittedTypes": [ + "RejectedReadNeed", + "rejected_need_posture" + ], + "requiredEvidence": [ + "rejectReadNeed", + "reject_read_need", + "read_need_rejected" + ], + "rowRoot": "v42-readneed-review-resynthesis-product-closure-row:5470af7414fae6fa252d6df8", + "sourceSafetyClass": "source_safe_readneed_review_resynthesis_product_closure_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "credentialsSerialized": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "secret-values" + ] + }, + { + "rowId": "telemetry:source-safe-runtime-receipts", + "purpose": "Emit source-safe telemetry receipts containing phase, PTRR step, Failsafe, ThricifiedGeneration, prompt-template, output-schema, and proof-root identities.", + "sourceRoots": [ + "packages/pipelines/asset-pack/src/read-need.ts", + "packages/pipelines/asset-pack/src/read-need-review-resynthesis.ts", + "packages/pipelines/asset-pack/src/reading-pipeline-contract.ts", + "uapi/app/api/read-review/route.ts" + ], + "emittedTypes": [ + "ReadNeedReviewTelemetryReceipt", + "ReadNeedComprehensionSynthesisInferenceReceipt" + ], + "requiredEvidence": [ + "ptrrStepIds", + "failsafeSequenceIds", + "thricifiedGenerationIds", + "promptTemplateIds" + ], + "rowRoot": "v42-readneed-review-resynthesis-product-closure-row:b1707272fafd2df1da82287f", + "sourceSafetyClass": "source_safe_readneed_review_resynthesis_product_closure_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "credentialsSerialized": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "secret-values" + ] + }, + { + "rowId": "route:read-review-actions", + "purpose": "Expose synthesize, resynthesize, accept, and reject actions through the Read review route with storage projection, runtime summary, source-safe telemetry, and Finding Fits admission readback.", + "sourceRoots": [ + "uapi/app/api/read-review/route.ts", + "uapi/tests/api/readReviewRoute.test.ts" + ], + "emittedTypes": [ + "readNeedReviewRuntime", + "storageProjection", + "runtimeSummary" + ], + "requiredEvidence": [ + "synthesize_read_need", + "resynthesize_read_need", + "accept_read_need", + "reject_read_need" + ], + "rowRoot": "v42-readneed-review-resynthesis-product-closure-row:6236882a7b982f2c79671dfc", + "sourceSafetyClass": "source_safe_readneed_review_resynthesis_product_closure_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "credentialsSerialized": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "secret-values" + ] + }, + { + "rowId": "ui:terminal-need-runtime-readback", + "purpose": "Expose the reviewed Need, feedback loop, rejection path, storage projection, runtime roots, telemetry return type, and Finding Fits blocker/admission state in Terminal without protected source.", + "sourceRoots": [ + "uapi/app/terminal/TerminalDepositReadWorkbench.tsx", + "uapi/app/terminal/README.md" + ], + "emittedTypes": [ + "TerminalReadNeedReviewRuntimeState", + "Need runtime, storage, and telemetry" + ], + "requiredEvidence": [ + "Reject Read-Need", + "readNeedStorageProjection", + "readNeedTelemetry", + "Need runtime, storage, and telemetry" + ], + "rowRoot": "v42-readneed-review-resynthesis-product-closure-row:80bccaab5bdfa287e270838a", + "sourceSafetyClass": "source_safe_readneed_review_resynthesis_product_closure_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "credentialsSerialized": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "secret-values" + ] + }, + { + "rowId": "proof:tests-artifact-workflow", + "purpose": "Bind V42 Gate 4 closure to package tests, route tests, protocol artifact tests, docs, scripts, and gate/canon workflow checks.", + "sourceRoots": [ + "packages/pipelines/asset-pack/src/__tests__/read-need-review-resynthesis.test.ts", + "uapi/tests/api/readReviewRoute.test.ts", + ".github/workflows/bitcode-gate-quality.yml", + ".github/workflows/bitcode-canon-quality.yml", + "BITCODE_SPEC_V42.md", + "BITCODE_SPEC_V42_PARITY_MATRIX.md", + "SPECIFICATIONS_ROADMAP.md" + ], + "emittedTypes": [ + "V42ReadNeedReviewResynthesisProductClosure" + ], + "requiredEvidence": [ + "check-v42-gate4-readneed-review-resynthesis-product-closure.mjs", + "v42-readneed-review-resynthesis-product-closure" + ], + "rowRoot": "v42-readneed-review-resynthesis-product-closure-row:b09ae61cf4664f8a3914be8e", + "sourceSafetyClass": "source_safe_readneed_review_resynthesis_product_closure_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "credentialsSerialized": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "secret-values" + ] + } + ], + "rowIds": [ + "request:read-request-persistence", + "pipeline:ptrr-failsafe-thricified-need-synthesis", + "need:synthesized-need-storage", + "feedback:review-resynthesis-lineage", + "measurement:need-measurement-storage", + "admission:accepted-need-gates-finding-fits", + "rejection:rejected-need-posture", + "telemetry:source-safe-runtime-receipts", + "route:read-review-actions", + "ui:terminal-need-runtime-readback", + "proof:tests-artifact-workflow" + ], + "predicateResults": [ + { + "id": "read-need-defines-review-states", + "sourcePath": "packages/pipelines/asset-pack/src/read-need.ts", + "passed": true + }, + { + "id": "read-need-accept-and-reject-actions", + "sourcePath": "packages/pipelines/asset-pack/src/read-need.ts", + "passed": true + }, + { + "id": "inference-receipt-covers-ptrr-failsafe-thricified", + "sourcePath": "packages/pipelines/asset-pack/src/read-need.ts", + "passed": true + }, + { + "id": "contract-has-four-phases-and-sixteen-steps", + "sourcePath": "packages/pipelines/asset-pack/src/reading-pipeline-contract.ts", + "passed": true + }, + { + "id": "runtime-defines-storage-records", + "sourcePath": "packages/pipelines/asset-pack/src/read-need-review-resynthesis.ts", + "passed": true + }, + { + "id": "runtime-defines-resynthesis-admission-rejection", + "sourcePath": "packages/pipelines/asset-pack/src/read-need-review-resynthesis.ts", + "passed": true + }, + { + "id": "runtime-source-safety", + "sourcePath": "packages/pipelines/asset-pack/src/read-need-review-resynthesis.ts", + "passed": true + }, + { + "id": "runtime-persists-to-execution-store", + "sourcePath": "packages/pipelines/asset-pack/src/read-need-review-resynthesis.ts", + "passed": true + }, + { + "id": "package-exports-runtime", + "sourcePath": "packages/pipelines/asset-pack/src/index.ts", + "passed": true + }, + { + "id": "package-tests-cover-runtime", + "sourcePath": "packages/pipelines/asset-pack/src/__tests__/read-need-review-resynthesis.test.ts", + "passed": true + }, + { + "id": "read-need-tests-cover-real-inference-receipts", + "sourcePath": "packages/pipelines/asset-pack/src/__tests__/read-need.test.ts", + "passed": true + }, + { + "id": "contract-tests-cover-review-output", + "sourcePath": "packages/pipelines/asset-pack/src/__tests__/reading-pipeline-contract.test.ts", + "passed": true + }, + { + "id": "route-exposes-all-review-actions", + "sourcePath": "uapi/app/api/read-review/route.ts", + "passed": true + }, + { + "id": "route-persists-all-runtime-actions", + "sourcePath": "uapi/app/api/read-review/route.ts", + "passed": true + }, + { + "id": "route-returns-runtime-projection", + "sourcePath": "uapi/app/api/read-review/route.ts", + "passed": true + }, + { + "id": "route-tests-cover-runtime-and-rejection", + "sourcePath": "uapi/tests/api/readReviewRoute.test.ts", + "passed": true + }, + { + "id": "protocol-parity-keeps-finding-fits-blocked", + "sourcePath": "uapi/tests/api/readReviewProtocolParity.test.ts", + "passed": true + }, + { + "id": "terminal-ui-exposes-runtime-readback", + "sourcePath": "uapi/app/terminal/TerminalDepositReadWorkbench.tsx", + "passed": true + }, + { + "id": "terminal-ui-exposes-rejection", + "sourcePath": "uapi/app/terminal/TerminalDepositReadWorkbench.tsx", + "passed": true + }, + { + "id": "terminal-ux-keeps-accepted-need-gate", + "sourcePath": "uapi/app/terminal/terminal-enterprise-reading-ux-state.ts", + "passed": true + }, + { + "id": "spec-gate4-expanded", + "sourcePath": "BITCODE_SPEC_V42.md", + "passed": true + }, + { + "id": "delta-gate4-expanded", + "sourcePath": "BITCODE_SPEC_V42_DELTA.md", + "passed": true + }, + { + "id": "notes-gate4-expanded", + "sourcePath": "BITCODE_SPEC_V42_NOTES.md", + "passed": true + }, + { + "id": "parity-gate4-implemented", + "sourcePath": "BITCODE_SPEC_V42_PARITY_MATRIX.md", + "passed": true + }, + { + "id": "roadmap-advanced-to-gate4", + "sourcePath": "SPECIFICATIONS_ROADMAP.md", + "passed": true + }, + { + "id": "readmes-document-gate4", + "sourcePath": "README.md", + "passed": true + }, + { + "id": "workflows-run-gate4-check", + "sourcePath": ".github/workflows/bitcode-gate-quality.yml", + "passed": true + } + ], + "coverage": { + "rowCount": 11, + "requiredPredicateCount": 27, + "passedPredicateCount": 27, + "failedPredicateIds": [], + "pipelineName": "ReadNeedComprehensionSynthesis", + "nextPipelineName": "ReadFitsFindingSynthesis", + "actions": [ + "synthesize_read_need", + "resynthesize_read_need", + "accept_read_need", + "reject_read_need" + ], + "persistedRecordKinds": [ + "read_request", + "synthesized_need", + "feedback", + "resynthesis_attempt", + "need_measurement", + "accepted_need_admission", + "rejected_need_posture", + "telemetry_receipt" + ], + "phaseCount": 4, + "ptrrStepCount": 16, + "failsafeSequenceCount": 48, + "thricifiedGenerationCount": 48, + "acceptedNeedRequiredForFindingFits": true, + "rejectedNeedBlocksFindingFits": true, + "terminalRuntimeReadbackCovered": true, + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "credentialsSerialized": false, + "legacySourceRoots": false + }, + "sourceRoots": { + "readNeed": "packages/pipelines/asset-pack/src/read-need.ts", + "readNeedRuntime": "packages/pipelines/asset-pack/src/read-need-review-resynthesis.ts", + "readingPipelineContract": "packages/pipelines/asset-pack/src/reading-pipeline-contract.ts", + "packageIndex": "packages/pipelines/asset-pack/src/index.ts", + "packageJson": "packages/pipelines/asset-pack/package.json", + "readNeedTest": "packages/pipelines/asset-pack/src/__tests__/read-need.test.ts", + "runtimeTest": "packages/pipelines/asset-pack/src/__tests__/read-need-review-resynthesis.test.ts", + "readingContractTest": "packages/pipelines/asset-pack/src/__tests__/reading-pipeline-contract.test.ts", + "readReviewRoute": "uapi/app/api/read-review/route.ts", + "readReviewRouteTest": "uapi/tests/api/readReviewRoute.test.ts", + "readReviewProtocolParityTest": "uapi/tests/api/readReviewProtocolParity.test.ts", + "terminalWorkbench": "uapi/app/terminal/TerminalDepositReadWorkbench.tsx", + "terminalUxState": "uapi/app/terminal/terminal-enterprise-reading-ux-state.ts", + "gateWorkflow": ".github/workflows/bitcode-gate-quality.yml", + "canonWorkflow": ".github/workflows/bitcode-canon-quality.yml", + "v42Spec": "BITCODE_SPEC_V42.md", + "v42Delta": "BITCODE_SPEC_V42_DELTA.md", + "v42Notes": "BITCODE_SPEC_V42_NOTES.md", + "v42Parity": "BITCODE_SPEC_V42_PARITY_MATRIX.md", + "roadmap": "SPECIFICATIONS_ROADMAP.md", + "rootReadme": "README.md", + "terminalReadme": "uapi/app/terminal/README.md", + "assetPackReadme": "packages/pipelines/asset-pack/README.md", + "protocolReadme": "packages/protocol/README.md" + } +} diff --git a/.github/workflows/bitcode-canon-quality.yml b/.github/workflows/bitcode-canon-quality.yml index dc9f130b..13e5d697 100644 --- a/.github/workflows/bitcode-canon-quality.yml +++ b/.github/workflows/bitcode-canon-quality.yml @@ -301,6 +301,9 @@ jobs: if [ -f scripts/check-v42-gate3-reading-shortest-path-state-machine.mjs ]; then node scripts/check-v42-gate3-reading-shortest-path-state-machine.mjs --skip-branch-check --skip-uapi-tests fi + if [ -f scripts/check-v42-gate4-readneed-review-resynthesis-product-closure.mjs ]; then + node scripts/check-v42-gate4-readneed-review-resynthesis-product-closure.mjs --skip-branch-check --skip-package-tests --skip-uapi-tests + fi fi else echo "Unexpected BITCODE_SPEC.txt pointer: $POINTER" >&2 diff --git a/.github/workflows/bitcode-gate-quality.yml b/.github/workflows/bitcode-gate-quality.yml index bf2440ee..82dc5ab8 100644 --- a/.github/workflows/bitcode-gate-quality.yml +++ b/.github/workflows/bitcode-gate-quality.yml @@ -430,6 +430,9 @@ jobs: if [ -f scripts/check-v42-gate3-reading-shortest-path-state-machine.mjs ]; then node scripts/check-v42-gate3-reading-shortest-path-state-machine.mjs --skip-branch-check --skip-uapi-tests fi + if [ -f scripts/check-v42-gate4-readneed-review-resynthesis-product-closure.mjs ]; then + node scripts/check-v42-gate4-readneed-review-resynthesis-product-closure.mjs --skip-branch-check --skip-package-tests --skip-uapi-tests + fi fi else echo "Unexpected BITCODE_SPEC.txt pointer: $POINTER" >&2 diff --git a/BITCODE_SPEC_V42.md b/BITCODE_SPEC_V42.md index 7b85d98f..8c1ce389 100644 --- a/BITCODE_SPEC_V42.md +++ b/BITCODE_SPEC_V42.md @@ -132,6 +132,8 @@ Validating command: `pnpm run check:v42-gate3`. Gate 4 must make `ReadNeedComprehensionSynthesis` product-ready in the MVP flow. The pipeline must synthesize exactly the user's Need from the Read Request, store source-safe Need data, allow user feedback and resynthesis, preserve lineage, and admit Finding Fits only after the Need is accepted. It must cover PTRR agents, FailsafeGenerationSequence, ThricifiedGeneration, prompts, parser return types, telemetry rows, database projection, tests, and UI readback. +Gate 4 is implemented by `.bitcode/v42-readneed-review-resynthesis-product-closure.json`. +The artifact binds `ReadNeedReviewResynthesisRuntime`, all four review actions, source-safe storage projection, rejection posture, accepted-Need admission into `ReadFitsFindingSynthesis`, Terminal runtime/storage/telemetry readback, and the package/API/protocol tests that prove the path. ## V42 Gate 5 ReadFitsFinding AssetPack Preview And Quote Closure @@ -423,7 +425,7 @@ V42 inherits operator-quality expectations for browser proof, accessibility, vis | `.bitcode/v42-canon-posture-drift-report.json` | `check-bitcode-canon-posture-drift` | source-safe metadata | active V41 / draft V42 posture proof | | `.bitcode/v42-depositing-shortest-path.json` | V42 Gate 2 | source-safe metadata | deposit MVP proof | | `.bitcode/v42-reading-shortest-path-state-machine.json` | V42 Gate 3 | source-safe metadata | Reading product state proof | -| `.bitcode/v42-readneed-review-resynthesis.json` | V42 Gate 4 | source-safe metadata | Need review proof | +| `.bitcode/v42-readneed-review-resynthesis-product-closure.json` | V42 Gate 4 | source-safe metadata | Need review proof | | `.bitcode/v42-readfitsfinding-preview-quote.json` | V42 Gate 5 | source-safe metadata | Finding Fits, preview, and quote proof | | `.bitcode/v42-settlement-rights-delivery.json` | V42 Gate 6 | source-safe metadata | settlement/delivery proof | | `.bitcode/v42-ai-reading-demonstration.json` | V42 Gate 7 | source-safe metadata | demonstration value proof | diff --git a/BITCODE_SPEC_V42_DELTA.md b/BITCODE_SPEC_V42_DELTA.md index 33f29a47..36e45942 100644 --- a/BITCODE_SPEC_V42_DELTA.md +++ b/BITCODE_SPEC_V42_DELTA.md @@ -47,6 +47,7 @@ The state machine keeps Terminal guided by default while preserving proof-on-exp ### Gate 4: ReadNeed Review And Resynthesis Product Closure Implement and prove reviewed synthesized Need flow, feedback/resynthesis, accepted-Need admission, storage projection, telemetry, and UI readback. +Gate 4 now binds `ReadNeedReviewResynthesisRuntime` (`readNeedReviewRuntime` route payloads), all four ReadNeed actions, source-safe storage projection, accepted and rejected review states, PTRR/Failsafe/Thricified telemetry receipts, Terminal runtime/storage/telemetry readback, `.bitcode/v42-readneed-review-resynthesis-product-closure.json`, and `check:v42-gate4`. ### Gate 5: ReadFitsFinding AssetPack Preview And Quote Closure diff --git a/BITCODE_SPEC_V42_NOTES.md b/BITCODE_SPEC_V42_NOTES.md index 3ba0c620..098818f0 100644 --- a/BITCODE_SPEC_V42_NOTES.md +++ b/BITCODE_SPEC_V42_NOTES.md @@ -47,6 +47,14 @@ Gate 3 implements the current V42 state-machine layer with `TerminalEnterpriseRe The recoverable route state includes transaction id presence, `readingStage`, active-stage hydration, retry and restart posture, source-safe failure kind, and repair actions. This makes refresh, route handoff, and recovery inspectable without disclosing protected source, protected prompts, raw provider responses, unpaid AssetPack source, wallet private material, private settlement payloads, or ledger authority. +## Gate 4 implementation notes + +Gate 4 closes the ReadNeed product loop. +`ReadNeedComprehensionSynthesis` now has a V42 proof target for source-safe Read Request persistence, synthesized Need storage, feedback and resynthesis lineage, Need measurement roots, accepted Need admission, rejected Need posture, runtime storage projection, and telemetry receipts. +The Terminal readback must show the Need, review state, runtime root, storage root, telemetry root, blockers, PTRR step identity, and storage record roots without exposing protected source, raw protected prompts, raw provider responses, unpaid AssetPack source, wallet private material, or private settlement payloads. +Finding Fits remains blocked until the Need is accepted. +Rejecting a Need must preserve feedback and keep the user on the review/resynthesis step. + ## AssetPack source-safety note V42 must make the preview valuable without leaking the source-bearing AssetPack before settlement. diff --git a/BITCODE_SPEC_V42_PARITY_MATRIX.md b/BITCODE_SPEC_V42_PARITY_MATRIX.md index 86f3f222..b87b9c7c 100644 --- a/BITCODE_SPEC_V42_PARITY_MATRIX.md +++ b/BITCODE_SPEC_V42_PARITY_MATRIX.md @@ -35,7 +35,7 @@ This matrix records the reliable MVP product surfaces that must become promotion | Canon workflow | Canon quality knows active V41 / draft V42 posture and V42 Gate 1 | `.github/workflows/bitcode-canon-quality.yml` | drafted | | Depositing shortest path | Source material can be admitted with Depository proof and compensation visibility | `.bitcode/v42-depositing-shortest-path.json`, `DepositorySupplyCompensationPreview`, `/api/deposits`, Terminal deposit readback | implemented | | Reading state machine | Five-step Reading UX is route-owned, persistent, and source-safe | `.bitcode/v42-reading-shortest-path-state-machine.json`, `TerminalEnterpriseReadingRouteState`, `readingStage`, route/retry/failure tests | implemented | -| ReadNeed product closure | Need synthesis, review, feedback, resynthesis, and accepted-Need admission are product-ready | later V42 Gate 4 artifact | draft-required | +| ReadNeed product closure | Need synthesis, review, feedback, resynthesis, accepted-Need admission, rejected Need blockers, source-safe telemetry, and Terminal runtime readback are product-ready | `.bitcode/v42-readneed-review-resynthesis-product-closure.json`, `ReadNeedReviewResynthesisRuntime`, `/api/read-review`, Terminal Need runtime readback | implemented | | Finding Fits preview and quote | Many-candidate search, selected-fit provenance, source-safe preview, and quote are product-ready | later V42 Gate 5 artifact | draft-required | | Settlement and delivery | BTC/BTD settlement, rights transfer, compensation, and repository PR delivery are synchronized | later V42 Gate 6 artifact | draft-required | | AI-reading demonstration | Standalone demonstration proves AssetPack improves AI beyond public-data-only baseline | later V42 Gate 7 artifact | draft-required | @@ -49,7 +49,7 @@ This matrix records the reliable MVP product surfaces that must become promotion | Gate 1 | Open V42 family, roadmap, docs, workflow posture, package script, and checker | drafted | | Gate 2 | Depositing shortest path and compensation visibility artifact | implemented | | Gate 3 | Reading shortest path state machine artifact | implemented | -| Gate 4 | ReadNeed review and resynthesis product closure artifact | draft-required | +| Gate 4 | ReadNeed review and resynthesis product closure artifact | implemented | | Gate 5 | ReadFitsFinding AssetPack preview and quote closure artifact | draft-required | | Gate 6 | Settlement rights transfer and repository delivery closure artifact | draft-required | | Gate 7 | AI-reading dominant demonstration MVP artifact | draft-required | diff --git a/README.md b/README.md index 3a5b1077..48298c20 100644 --- a/README.md +++ b/README.md @@ -99,6 +99,13 @@ V42 Gate 3 adds the Reading shortest path state machine with accepted-Need blockers, source-safe preview blockers, `.bitcode/v42-reading-shortest-path-state-machine.json`, and `check:v42-gate3`. +V42 Gate 4 adds ReadNeed product closure with +`ReadNeedReviewResynthesisRuntime`, source-safe storage projection, +feedback/resynthesis lineage, accepted-Need Finding Fits admission, +rejected Need blockers, PTRR/Failsafe/Thricified telemetry receipts, +Terminal Need runtime readback, +`.bitcode/v42-readneed-review-resynthesis-product-closure.json`, and +`check:v42-gate4`. V43+ is roadmapped as the later agentic depositing evolution: repository agents synthesize deposit AssetPack options from connected enterprise code, Depository state, and Reading demand; enterprises approve or reject diff --git a/SPECIFICATIONS_ROADMAP.md b/SPECIFICATIONS_ROADMAP.md index f328daae..7bd3c34c 100644 --- a/SPECIFICATIONS_ROADMAP.md +++ b/SPECIFICATIONS_ROADMAP.md @@ -5,12 +5,13 @@ - Current active canonical pointer: `BITCODE_SPEC.txt` -> `V41` - Current active canon: `BITCODE_SPEC_V41.md` - Current draft target: `BITCODE_SPEC_V42.md`. -- Current working gate: V42 Gate 3 Reading Shortest Path State Machine. -- Next queued gate after V42 Gate 3: V42 Gate 4 ReadNeed Review And Resynthesis Product Closure. +- Current working gate: V42 Gate 4 ReadNeed Review And Resynthesis Product Closure. +- Next queued gate after V42 Gate 4: V42 Gate 5 ReadFitsFinding AssetPack Preview And Quote Closure. - Latest closed version: V41 Prompt And PromptPart Excellence, which promoted PromptPart and Prompt inventory, registry interpolation contracts, Reading prompt baselines, ReadNeedComprehensionSynthesis prompt hardening, ReadFitsFindingSynthesis prompt hardening, Conversation/tool/interface prompt rewrite, prompt benchmark telemetry, and V41 promotion readiness. - Recent V42 opening anchor: reliable MVP experience opens over promoted V41 with V42 SPEC, DELTA, NOTES, and PARITY files, `check:v42-gate1`, active V41 / draft V42 posture, and a nine-gate plan for shortest-path Depositing, five-step Reading, ReadNeed product closure, ReadFitsFinding preview and quote closure, settlement and repository delivery, AI-reading demonstration, local/staging rehearsal, and promotion readiness. - V42 Gate 2 closure anchor: reliable MVP experience now owns source-safe Depositing compensation visibility through `DepositorySupplyCompensationPreview`, deposit route `depositoryEvidence.compensationPreview`, deterministic `.bitcode/v42-depositing-shortest-path.json`, route/API readiness checks, source validation, Depository search/vector/storage projection, source-to-shares compensation readback keys, Terminal compensation roots, focused package/protocol tests, workflow wiring, and `check:v42-gate2`. - V42 Gate 3 closure anchor: reliable MVP experience now owns the five-step Reading shortest path state machine through `TerminalEnterpriseReadingUxState`, `TerminalEnterpriseReadingRouteState`, recoverable transaction ids, `readingStage` route hydration, retry/restart posture, source-safe failure repair actions, accepted-Need blockers, source-safe preview blockers, rich Reading pipeline telemetry readback, deterministic `.bitcode/v42-reading-shortest-path-state-machine.json`, focused route/component/protocol tests, workflow wiring, and `check:v42-gate3`. +- V42 Gate 4 closure anchor: reliable MVP experience now owns ReadNeed product closure through `ReadNeedReviewResynthesisRuntime`, source-safe storage projection, reviewed Need feedback/resynthesis lineage, accepted-Need Finding Fits admission, rejected Need blockers, PTRR/Failsafe/Thricified telemetry receipts, Terminal Need runtime/storage/telemetry readback, deterministic `.bitcode/v42-readneed-review-resynthesis-product-closure.json`, focused package/route/protocol tests, workflow wiring, and `check:v42-gate4`. - Recent V41 closure anchor: V41 canonical promotion updated `BITCODE_SPEC.txt` to `V41`, generated `BITCODE_SPEC_V41_PROVEN.md`, preserved active V41 / draft V42 runtime posture, and closed prompt-program excellence canon. - Recent V40 closure anchor: V40 canonical promotion updated `BITCODE_SPEC.txt` to `V40`, generated `BITCODE_SPEC_V40_PROVEN.md`, preserved active V40 / draft V41 runtime posture, and closed exhaustive commercial application testing canon. - Recent V39 closure anchor: V39 canonical promotion updated `BITCODE_SPEC.txt` to `V39`, generated `BITCODE_SPEC_V39_PROVEN.md`, preserved active V39 / draft V40 runtime posture, and closed commercial Reading readiness canon. diff --git a/package.json b/package.json index e2a90f91..4cfaeee3 100644 --- a/package.json +++ b/package.json @@ -310,6 +310,9 @@ "generate:v42-reading-shortest-path-state-machine": "node scripts/generate-v42-reading-shortest-path-state-machine.mjs", "check:v42-reading-shortest-path-state-machine": "node scripts/generate-v42-reading-shortest-path-state-machine.mjs --check", "check:v42-gate3": "node scripts/check-v42-gate3-reading-shortest-path-state-machine.mjs", + "generate:v42-readneed-review-resynthesis-product-closure": "node scripts/generate-v42-readneed-review-resynthesis-product-closure.mjs", + "check:v42-readneed-review-resynthesis-product-closure": "node scripts/generate-v42-readneed-review-resynthesis-product-closure.mjs --check", + "check:v42-gate4": "node scripts/check-v42-gate4-readneed-review-resynthesis-product-closure.mjs", "generate:v38-inference-surface-inventory": "node scripts/generate-v38-inference-surface-inventory.mjs", "check:v38-inference-surface-inventory": "node scripts/generate-v38-inference-surface-inventory.mjs --check", "check:v38-gate2": "node scripts/check-v38-gate2-inference-surface-inventory.mjs", diff --git a/packages/pipelines/asset-pack/README.md b/packages/pipelines/asset-pack/README.md index efcc5d76..051e9e77 100644 --- a/packages/pipelines/asset-pack/README.md +++ b/packages/pipelines/asset-pack/README.md @@ -139,6 +139,14 @@ for resynthesis. The runtime never serializes protected source, raw protected prompts, raw provider responses, unpaid AssetPack source, credentials, wallet private material, or private settlement payloads. +V42 Gate 4 binds this runtime into product closure through +`.bitcode/v42-readneed-review-resynthesis-product-closure.json` and +`check:v42-gate4`. That proof requires all four review actions +(`synthesize_read_need`, `resynthesize_read_need`, `accept_read_need`, +`reject_read_need`), PTRR/Failsafe/Thricified telemetry receipts, source-safe +storage projection, accepted-Need admission, rejected Need blockers, and +Terminal runtime readback before Finding Fits can run. + ## ReadFitsFinding Runtime `ReadFitsFindingRuntime` is the source-safe package primitive that turns diff --git a/packages/pipelines/asset-pack/src/__tests__/read-need-review-resynthesis.test.ts b/packages/pipelines/asset-pack/src/__tests__/read-need-review-resynthesis.test.ts index 9be22ad3..43ce606e 100644 --- a/packages/pipelines/asset-pack/src/__tests__/read-need-review-resynthesis.test.ts +++ b/packages/pipelines/asset-pack/src/__tests__/read-need-review-resynthesis.test.ts @@ -66,6 +66,9 @@ describe('ReadNeed review, resynthesis, and admission runtime', () => { 'need_measurement', 'telemetry_receipt', ]); + expect(runtime.storageProjection.every((record) => record.sourceSafety.protectedSourceVisible === false)).toBe(true); + expect(runtime.storageProjection.every((record) => record.sourceSafety.rawProviderResponseVisible === false)).toBe(true); + expect(runtime.storageProjection.every((record) => record.sourceSafety.unpaidAssetPackSourceVisible === false)).toBe(true); expect(runtime.telemetryReceipts[0]).toMatchObject({ pipelineName: 'ReadNeedComprehensionSynthesis', needId: readNeed.needId, diff --git a/packages/protocol/README.md b/packages/protocol/README.md index 69f9b4ae..a32d34a9 100644 --- a/packages/protocol/README.md +++ b/packages/protocol/README.md @@ -201,6 +201,15 @@ V42 Gate 3 adds the V42 Reading shortest path state machine, route persistence, accepted-Need gating, restart/retry/failure repair, low-detail proof-on-expand UI posture, rich Reading pipeline telemetry readback, activity/workbench readback, and source-safe disclosure boundaries. +V42 Gate 4 adds `V42ReadNeedReviewResynthesisProductClosure` through +`packages/protocol/src/canonical/v42-readneed-review-resynthesis-product-closure.js`, +`packages/protocol/test/v42-readneed-review-resynthesis-product-closure.test.js`, +`.bitcode/v42-readneed-review-resynthesis-product-closure.json`, and +`check:v42-gate4`. It proves ReadNeed review/resynthesis product closure: +source-safe Read Request and Need storage, feedback lineage, Need measurement, +accepted-Need admission, rejected Need blockers, PTRR/Failsafe/Thricified +telemetry receipts, `/api/read-review` action coverage, Terminal runtime +readback, and source-safe disclosure boundaries. V40 Gate 2 adds `V40TestInventoryCoverageMatrix` through `packages/protocol/src/canonical/v40-test-inventory-coverage-matrix.js`, `packages/protocol/test/v40-test-inventory-coverage-matrix.test.js`, diff --git a/packages/protocol/src/canonical/v42-readneed-review-resynthesis-product-closure.js b/packages/protocol/src/canonical/v42-readneed-review-resynthesis-product-closure.js new file mode 100644 index 00000000..895001af --- /dev/null +++ b/packages/protocol/src/canonical/v42-readneed-review-resynthesis-product-closure.js @@ -0,0 +1,325 @@ +// @ts-check + +import crypto from 'node:crypto'; +import { existsSync, readFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const DEFAULT_REPO_ROOT = path.resolve(__dirname, '..', '..', '..', '..'); + +export const V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_ARTIFACT_PATH = + '.bitcode/v42-readneed-review-resynthesis-product-closure.json'; +export const V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_SCHEMA_ID = + 'bitcode.v42.readNeedReviewResynthesisProductClosure.v1'; +export const V42_READNEED_REVIEW_RESYNTHESIS_SCHEMA_ID = + V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_SCHEMA_ID; +export const V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_VERSION = 'V42'; +export const V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_CURRENT_TARGET = 'V41'; +export const V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_SOURCE_SAFETY_VERDICT = + 'source-safe-readneed-review-resynthesis-product-closure-metadata'; + +export const V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_ROW_IDS = Object.freeze([ + 'request:read-request-persistence', + 'pipeline:ptrr-failsafe-thricified-need-synthesis', + 'need:synthesized-need-storage', + 'feedback:review-resynthesis-lineage', + 'measurement:need-measurement-storage', + 'admission:accepted-need-gates-finding-fits', + 'rejection:rejected-need-posture', + 'telemetry:source-safe-runtime-receipts', + 'route:read-review-actions', + 'ui:terminal-need-runtime-readback', + 'proof:tests-artifact-workflow', +]); + +const SOURCE_ROOTS = Object.freeze({ + readNeed: 'packages/pipelines/asset-pack/src/read-need.ts', + readNeedRuntime: 'packages/pipelines/asset-pack/src/read-need-review-resynthesis.ts', + readingPipelineContract: 'packages/pipelines/asset-pack/src/reading-pipeline-contract.ts', + packageIndex: 'packages/pipelines/asset-pack/src/index.ts', + packageJson: 'packages/pipelines/asset-pack/package.json', + readNeedTest: 'packages/pipelines/asset-pack/src/__tests__/read-need.test.ts', + runtimeTest: 'packages/pipelines/asset-pack/src/__tests__/read-need-review-resynthesis.test.ts', + readingContractTest: 'packages/pipelines/asset-pack/src/__tests__/reading-pipeline-contract.test.ts', + readReviewRoute: 'uapi/app/api/read-review/route.ts', + readReviewRouteTest: 'uapi/tests/api/readReviewRoute.test.ts', + readReviewProtocolParityTest: 'uapi/tests/api/readReviewProtocolParity.test.ts', + terminalWorkbench: 'uapi/app/terminal/TerminalDepositReadWorkbench.tsx', + terminalUxState: 'uapi/app/terminal/terminal-enterprise-reading-ux-state.ts', + gateWorkflow: '.github/workflows/bitcode-gate-quality.yml', + canonWorkflow: '.github/workflows/bitcode-canon-quality.yml', + v42Spec: 'BITCODE_SPEC_V42.md', + v42Delta: 'BITCODE_SPEC_V42_DELTA.md', + v42Notes: 'BITCODE_SPEC_V42_NOTES.md', + v42Parity: 'BITCODE_SPEC_V42_PARITY_MATRIX.md', + roadmap: 'SPECIFICATIONS_ROADMAP.md', + rootReadme: 'README.md', + terminalReadme: 'uapi/app/terminal/README.md', + assetPackReadme: 'packages/pipelines/asset-pack/README.md', + protocolReadme: 'packages/protocol/README.md', +}); + +const FORBIDDEN_PAYLOAD_CLASSES = Object.freeze([ + 'protected-source-payloads', + 'raw-protected-prompts', + 'raw-provider-responses', + 'unpaid-assetpack-source', + 'wallet-private-material', + 'settlement-private-payloads', + 'secret-values', +]); + +function digest(value) { + return crypto.createHash('sha256').update(value).digest('hex').slice(0, 24); +} + +function rowRoot(id) { + return `v42-readneed-review-resynthesis-product-closure-row:${digest(id)}`; +} + +function readSource(repoRoot, sourcePath) { + const absolutePath = path.join(repoRoot, sourcePath); + return existsSync(absolutePath) ? readFileSync(absolutePath, 'utf8') : ''; +} + +function predicateResult(id, sourcePath, passed) { + return { id, sourcePath, passed: Boolean(passed) }; +} + +function row(input) { + return { + ...input, + rowRoot: rowRoot(input.rowId), + sourceSafetyClass: 'source_safe_readneed_review_resynthesis_product_closure_metadata', + sourceSafeMetadataOnly: true, + protectedSourceVisible: false, + rawProtectedPromptVisible: false, + rawProviderResponseVisible: false, + unpaidAssetPackSourceVisible: false, + walletPrivateMaterialVisible: false, + settlementPrivatePayloadVisible: false, + credentialsSerialized: false, + forbiddenPayloadClasses: [...FORBIDDEN_PAYLOAD_CLASSES], + }; +} + +export const V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_ROWS = Object.freeze([ + row({ + rowId: 'request:read-request-persistence', + purpose: + 'Persist source-safe Read Request data with repository, branch, commit, target artifact kinds, closure criteria, failure modes, feedback, and previous Need lineage.', + sourceRoots: [SOURCE_ROOTS.readNeed, SOURCE_ROOTS.readNeedRuntime, SOURCE_ROOTS.readReviewRoute], + emittedTypes: ['ReadNeedRequest', 'ReadNeedReviewStorageRecord'], + requiredEvidence: ['bitcode.read.request', 'read_request', 'previousNeedId'], + }), + row({ + rowId: 'pipeline:ptrr-failsafe-thricified-need-synthesis', + purpose: + 'Keep ReadNeedComprehensionSynthesis product-owned by PTRR agents whose steps carry FailsafeGenerationSequence over ThricifiedGeneration contracts and typed parser output.', + sourceRoots: [SOURCE_ROOTS.readNeed, SOURCE_ROOTS.readingPipelineContract, SOURCE_ROOTS.readNeedTest], + emittedTypes: ['ReadNeedComprehensionSynthesisInferenceReceipt', 'ReadingPipelineContract'], + requiredEvidence: ['ptrrStepIds', 'failsafeSequenceIds', 'thricifiedGenerationIds', 'ReadNeedComprehensionSynthesis.prompt.need-synthesis'], + }), + row({ + rowId: 'need:synthesized-need-storage', + purpose: + 'Persist reviewable synthesized Need output before Finding Fits, including requirements, target artifacts, source constraints, proof expectations, and review state.', + sourceRoots: [SOURCE_ROOTS.readNeed, SOURCE_ROOTS.readNeedRuntime, SOURCE_ROOTS.runtimeTest], + emittedTypes: ['ReadNeed', 'synthesized_need'], + requiredEvidence: ['bitcode.read.need', 'needs_acceptance', 'synthesized_need'], + }), + row({ + rowId: 'feedback:review-resynthesis-lineage', + purpose: + 'Preserve user feedback and resynthesis attempts so every new Need stays linked to the prior Need and reviewed feedback.', + sourceRoots: [SOURCE_ROOTS.readNeed, SOURCE_ROOTS.readNeedRuntime, SOURCE_ROOTS.readReviewRouteTest, SOURCE_ROOTS.terminalWorkbench], + emittedTypes: ['resynthesis_attempt', 'feedbackHistory'], + requiredEvidence: ['previousNeedId', 'resynthesize_read_need', 'resynthesis_attempt'], + }), + row({ + rowId: 'measurement:need-measurement-storage', + purpose: + 'Persist Need measurement roots and pricing measurement inputs that later drive deterministic preview quotes without exposing source.', + sourceRoots: [SOURCE_ROOTS.readNeed, SOURCE_ROOTS.readNeedRuntime, SOURCE_ROOTS.readNeedTest], + emittedTypes: ['ReadNeedMeasurementDimension', 'need_measurement'], + requiredEvidence: ['measurementRoot', 'pricingMeasurementInputs', 'shareToFeeFormula'], + }), + row({ + rowId: 'admission:accepted-need-gates-finding-fits', + purpose: + 'Persist accepted-Need admission as the only source-safe handoff into ReadFitsFindingSynthesis and block Finding Fits without acceptance.', + sourceRoots: [SOURCE_ROOTS.readNeed, SOURCE_ROOTS.readNeedRuntime, SOURCE_ROOTS.readReviewRouteTest, SOURCE_ROOTS.terminalUxState], + emittedTypes: ['ReadFitsFindingAdmission', 'accepted_need_admission'], + requiredEvidence: ['accept_read_need', 'accepted_need_admission', 'accepted_read_need_missing'], + }), + row({ + rowId: 'rejection:rejected-need-posture', + purpose: + 'Persist rejected-Need posture with rejection root, feedback, blocked Finding Fits stage, and repair/resynthesis next action.', + sourceRoots: [SOURCE_ROOTS.readNeed, SOURCE_ROOTS.readNeedRuntime, SOURCE_ROOTS.readReviewRouteTest, SOURCE_ROOTS.terminalWorkbench], + emittedTypes: ['RejectedReadNeed', 'rejected_need_posture'], + requiredEvidence: ['rejectReadNeed', 'reject_read_need', 'read_need_rejected'], + }), + row({ + rowId: 'telemetry:source-safe-runtime-receipts', + purpose: + 'Emit source-safe telemetry receipts containing phase, PTRR step, Failsafe, ThricifiedGeneration, prompt-template, output-schema, and proof-root identities.', + sourceRoots: [SOURCE_ROOTS.readNeed, SOURCE_ROOTS.readNeedRuntime, SOURCE_ROOTS.readingPipelineContract, SOURCE_ROOTS.readReviewRoute], + emittedTypes: ['ReadNeedReviewTelemetryReceipt', 'ReadNeedComprehensionSynthesisInferenceReceipt'], + requiredEvidence: ['ptrrStepIds', 'failsafeSequenceIds', 'thricifiedGenerationIds', 'promptTemplateIds'], + }), + row({ + rowId: 'route:read-review-actions', + purpose: + 'Expose synthesize, resynthesize, accept, and reject actions through the Read review route with storage projection, runtime summary, source-safe telemetry, and Finding Fits admission readback.', + sourceRoots: [SOURCE_ROOTS.readReviewRoute, SOURCE_ROOTS.readReviewRouteTest], + emittedTypes: ['readNeedReviewRuntime', 'storageProjection', 'runtimeSummary'], + requiredEvidence: ['synthesize_read_need', 'resynthesize_read_need', 'accept_read_need', 'reject_read_need'], + }), + row({ + rowId: 'ui:terminal-need-runtime-readback', + purpose: + 'Expose the reviewed Need, feedback loop, rejection path, storage projection, runtime roots, telemetry return type, and Finding Fits blocker/admission state in Terminal without protected source.', + sourceRoots: [SOURCE_ROOTS.terminalWorkbench, SOURCE_ROOTS.terminalReadme], + emittedTypes: ['TerminalReadNeedReviewRuntimeState', 'Need runtime, storage, and telemetry'], + requiredEvidence: ['Reject Read-Need', 'readNeedStorageProjection', 'readNeedTelemetry', 'Need runtime, storage, and telemetry'], + }), + row({ + rowId: 'proof:tests-artifact-workflow', + purpose: + 'Bind V42 Gate 4 closure to package tests, route tests, protocol artifact tests, docs, scripts, and gate/canon workflow checks.', + sourceRoots: [ + SOURCE_ROOTS.runtimeTest, + SOURCE_ROOTS.readReviewRouteTest, + SOURCE_ROOTS.gateWorkflow, + SOURCE_ROOTS.canonWorkflow, + SOURCE_ROOTS.v42Spec, + SOURCE_ROOTS.v42Parity, + SOURCE_ROOTS.roadmap, + ], + emittedTypes: ['V42ReadNeedReviewResynthesisProductClosure'], + requiredEvidence: ['check-v42-gate4-readneed-review-resynthesis-product-closure.mjs', 'v42-readneed-review-resynthesis-product-closure'], + }), +]); + +function buildPredicateResults(repoRoot) { + const readNeed = readSource(repoRoot, SOURCE_ROOTS.readNeed); + const runtime = readSource(repoRoot, SOURCE_ROOTS.readNeedRuntime); + const contract = readSource(repoRoot, SOURCE_ROOTS.readingPipelineContract); + const packageIndex = readSource(repoRoot, SOURCE_ROOTS.packageIndex); + const packageJson = readSource(repoRoot, SOURCE_ROOTS.packageJson); + const readNeedTest = readSource(repoRoot, SOURCE_ROOTS.readNeedTest); + const runtimeTest = readSource(repoRoot, SOURCE_ROOTS.runtimeTest); + const contractTest = readSource(repoRoot, SOURCE_ROOTS.readingContractTest); + const route = readSource(repoRoot, SOURCE_ROOTS.readReviewRoute); + const routeTest = readSource(repoRoot, SOURCE_ROOTS.readReviewRouteTest); + const protocolParityTest = readSource(repoRoot, SOURCE_ROOTS.readReviewProtocolParityTest); + const terminalWorkbench = readSource(repoRoot, SOURCE_ROOTS.terminalWorkbench); + const terminalUxState = readSource(repoRoot, SOURCE_ROOTS.terminalUxState); + const gateWorkflow = readSource(repoRoot, SOURCE_ROOTS.gateWorkflow); + const canonWorkflow = readSource(repoRoot, SOURCE_ROOTS.canonWorkflow); + const spec = readSource(repoRoot, SOURCE_ROOTS.v42Spec); + const delta = readSource(repoRoot, SOURCE_ROOTS.v42Delta); + const notes = readSource(repoRoot, SOURCE_ROOTS.v42Notes); + const parity = readSource(repoRoot, SOURCE_ROOTS.v42Parity); + const roadmap = readSource(repoRoot, SOURCE_ROOTS.roadmap); + const rootReadme = readSource(repoRoot, SOURCE_ROOTS.rootReadme); + const terminalReadme = readSource(repoRoot, SOURCE_ROOTS.terminalReadme); + const assetPackReadme = readSource(repoRoot, SOURCE_ROOTS.assetPackReadme); + const protocolReadme = readSource(repoRoot, SOURCE_ROOTS.protocolReadme); + + return [ + predicateResult('read-need-defines-review-states', SOURCE_ROOTS.readNeed, readNeed.includes("'needs_acceptance'") && readNeed.includes("'accepted'") && readNeed.includes("'rejected'")), + predicateResult('read-need-accept-and-reject-actions', SOURCE_ROOTS.readNeed, readNeed.includes('acceptReadNeed') && readNeed.includes('rejectReadNeed') && readNeed.includes('read_need_rejected')), + predicateResult('inference-receipt-covers-ptrr-failsafe-thricified', SOURCE_ROOTS.readNeed, readNeed.includes('ReadNeedComprehensionSynthesisInferenceReceipt') && readNeed.includes('failsafeSequenceIds') && readNeed.includes('thricifiedGenerationIds') && readNeed.includes('promptTemplateIds')), + predicateResult('contract-has-four-phases-and-sixteen-steps', SOURCE_ROOTS.readingPipelineContract, contract.includes('ReadNeedComprehensionSynthesis.request') && contract.includes('ReadNeedComprehensionSynthesis.review') && contract.includes('ptrrStepCount') && contract.includes('thricifiedGenerationCount')), + predicateResult('runtime-defines-storage-records', SOURCE_ROOTS.readNeedRuntime, runtime.includes('ReadNeedReviewStorageRecord') && runtime.includes('read_request') && runtime.includes('synthesized_need') && runtime.includes('need_measurement')), + predicateResult('runtime-defines-resynthesis-admission-rejection', SOURCE_ROOTS.readNeedRuntime, runtime.includes('resynthesis_attempt') && runtime.includes('accepted_need_admission') && runtime.includes('rejected_need_posture')), + predicateResult('runtime-source-safety', SOURCE_ROOTS.readNeedRuntime, runtime.includes('source_safe_read_need_review_resynthesis_metadata') && runtime.includes('protectedSourceVisible: false') && runtime.includes('rawProviderResponseVisible: false') && runtime.includes('unpaidAssetPackSourceVisible: false')), + predicateResult('runtime-persists-to-execution-store', SOURCE_ROOTS.readNeedRuntime, runtime.includes('persistReadNeedReviewResynthesisRuntime') && runtime.includes("execution?.store?.('read-need-review'")), + predicateResult('package-exports-runtime', SOURCE_ROOTS.packageIndex, packageIndex.includes("export * from './read-need-review-resynthesis'") && packageJson.includes('./read-need-review-resynthesis')), + predicateResult('package-tests-cover-runtime', SOURCE_ROOTS.runtimeTest, runtimeTest.includes('ReadNeed review, resynthesis, and admission runtime') && runtimeTest.includes('rejected_need_posture')), + predicateResult('read-need-tests-cover-real-inference-receipts', SOURCE_ROOTS.readNeedTest, readNeedTest.includes('real-inference ReadNeedComprehension') && readNeedTest.includes('thricified-generation') && readNeedTest.includes('accepted_read_need_missing')), + predicateResult('contract-tests-cover-review-output', SOURCE_ROOTS.readingContractTest, contractTest.includes('ReadNeedComprehensionSynthesis') && contractTest.includes('ptrrStepCount: 16')), + predicateResult('route-exposes-all-review-actions', SOURCE_ROOTS.readReviewRoute, route.includes('synthesize_read_need') && route.includes('resynthesize_read_need') && route.includes('accept_read_need') && route.includes('reject_read_need')), + predicateResult('route-persists-all-runtime-actions', SOURCE_ROOTS.readReviewRoute, route.match(/persistReadNeedReviewResynthesisRuntime/g)?.length >= 3), + predicateResult('route-returns-runtime-projection', SOURCE_ROOTS.readReviewRoute, route.includes('readNeedReviewRuntime') && route.includes('storageProjection') && route.includes('runtimeSummary')), + predicateResult('route-tests-cover-runtime-and-rejection', SOURCE_ROOTS.readReviewRouteTest, routeTest.includes('readNeedReviewRuntime') && routeTest.includes('reject_read_need') && routeTest.includes('rejected_need_posture')), + predicateResult('protocol-parity-keeps-finding-fits-blocked', SOURCE_ROOTS.readReviewProtocolParityTest, protocolParityTest.includes('Finding Fits cannot proceed') && protocolParityTest.includes('fitSearchAdmission')), + predicateResult('terminal-ui-exposes-runtime-readback', SOURCE_ROOTS.terminalWorkbench, terminalWorkbench.includes('TerminalReadNeedReviewRuntimeState') && terminalWorkbench.includes('readNeedStorageProjection') && terminalWorkbench.includes('readNeedTelemetry') && terminalWorkbench.includes('Need runtime, storage, and telemetry')), + predicateResult('terminal-ui-exposes-rejection', SOURCE_ROOTS.terminalWorkbench, terminalWorkbench.includes('handleRejectReadNeed') && terminalWorkbench.includes('Reject Read-Need') && terminalWorkbench.includes('reject_read_need')), + predicateResult('terminal-ux-keeps-accepted-need-gate', SOURCE_ROOTS.terminalUxState, terminalUxState.includes('acceptedNeedRequiredBeforeFindingFits') && terminalUxState.includes('sourceSafePreviewBlocked')), + predicateResult('spec-gate4-expanded', SOURCE_ROOTS.v42Spec, spec.includes('V42 Gate 4') && spec.includes('v42-readneed-review-resynthesis-product-closure')), + predicateResult('delta-gate4-expanded', SOURCE_ROOTS.v42Delta, delta.includes('Gate 4') && delta.includes('readNeedReviewRuntime')), + predicateResult('notes-gate4-expanded', SOURCE_ROOTS.v42Notes, notes.includes('Gate 4 implementation notes') && notes.includes('rejected Need posture')), + predicateResult('parity-gate4-implemented', SOURCE_ROOTS.v42Parity, parity.includes('ReadNeed product closure') && parity.includes('implemented')), + predicateResult('roadmap-advanced-to-gate4', SOURCE_ROOTS.roadmap, roadmap.includes('V42 Gate 4 closure anchor') && roadmap.includes('ReadNeedReviewResynthesisRuntime')), + predicateResult('readmes-document-gate4', SOURCE_ROOTS.rootReadme, rootReadme.includes('V42 Gate 4') && terminalReadme.includes('ReadNeedReviewResynthesisRuntime') && assetPackReadme.includes('ReadNeed review') && protocolReadme.includes('V42ReadNeedReviewResynthesisProductClosure')), + predicateResult('workflows-run-gate4-check', SOURCE_ROOTS.gateWorkflow, gateWorkflow.includes('check-v42-gate4-readneed-review-resynthesis-product-closure.mjs') && canonWorkflow.includes('check-v42-gate4-readneed-review-resynthesis-product-closure.mjs')), + ]; +} + +export function buildV42ReadNeedReviewResynthesisProductClosure(options = {}) { + const repoRoot = options.repoRoot || DEFAULT_REPO_ROOT; + const predicateResults = buildPredicateResults(repoRoot); + const failedPredicateIds = predicateResults + .filter((predicate) => !predicate.passed) + .map((predicate) => predicate.id); + const rowRoots = V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_ROWS.map((item) => item.rowRoot); + const artifactRoot = `v42-readneed-review-resynthesis-product-closure:${digest(JSON.stringify({ + rowRoots, + failedPredicateIds, + }))}`; + + return { + artifactId: 'v42-readneed-review-resynthesis-product-closure', + schemaId: V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_SCHEMA_ID, + version: V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_VERSION, + currentTarget: V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_CURRENT_TARGET, + sourceSafetyVerdict: V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_SOURCE_SAFETY_VERDICT, + generatedAt: 'deterministic', + artifactRoot, + passed: failedPredicateIds.length === 0, + rows: V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_ROWS, + rowIds: [...V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_ROW_IDS], + predicateResults, + coverage: { + rowCount: V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_ROWS.length, + requiredPredicateCount: predicateResults.length, + passedPredicateCount: predicateResults.length - failedPredicateIds.length, + failedPredicateIds, + pipelineName: 'ReadNeedComprehensionSynthesis', + nextPipelineName: 'ReadFitsFindingSynthesis', + actions: ['synthesize_read_need', 'resynthesize_read_need', 'accept_read_need', 'reject_read_need'], + persistedRecordKinds: [ + 'read_request', + 'synthesized_need', + 'feedback', + 'resynthesis_attempt', + 'need_measurement', + 'accepted_need_admission', + 'rejected_need_posture', + 'telemetry_receipt', + ], + phaseCount: 4, + ptrrStepCount: 16, + failsafeSequenceCount: 48, + thricifiedGenerationCount: 48, + acceptedNeedRequiredForFindingFits: true, + rejectedNeedBlocksFindingFits: true, + terminalRuntimeReadbackCovered: true, + sourceSafeMetadataOnly: true, + protectedSourceVisible: false, + rawProtectedPromptVisible: false, + rawProviderResponseVisible: false, + unpaidAssetPackSourceVisible: false, + walletPrivateMaterialVisible: false, + settlementPrivatePayloadVisible: false, + credentialsSerialized: false, + legacySourceRoots: Object.values(SOURCE_ROOTS).some((sourcePath) => sourcePath.includes('_legacy/')), + }, + sourceRoots: SOURCE_ROOTS, + }; +} diff --git a/packages/protocol/src/index.d.ts b/packages/protocol/src/index.d.ts index 7bef5cb2..eee3699b 100644 --- a/packages/protocol/src/index.d.ts +++ b/packages/protocol/src/index.d.ts @@ -529,6 +529,15 @@ export const V42_READING_SHORTEST_PATH_STEP_IDS: readonly string[]; export const V42_READING_SHORTEST_PATH_ROW_IDS: readonly string[]; export const V42_READING_SHORTEST_PATH_ROWS: readonly Record[]; export function buildV42ReadingShortestPathStateMachine(input?: Record): BitcodeProtocolReport; +export const V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_ARTIFACT_PATH: string; +export const V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_CURRENT_TARGET: string; +export const V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_SCHEMA_ID: string; +export const V42_READNEED_REVIEW_RESYNTHESIS_SCHEMA_ID: string; +export const V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_VERSION: string; +export const V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_SOURCE_SAFETY_VERDICT: string; +export const V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_ROW_IDS: readonly string[]; +export const V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_ROWS: readonly Record[]; +export function buildV42ReadNeedReviewResynthesisProductClosure(input?: Record): BitcodeProtocolReport; export const EXCHANGE_INTENT_ORDER_CONTRACTS_ARTIFACT_PATH: string; export const EXCHANGE_INTENT_ORDER_CONTRACTS_CURRENT_TARGET: string; export const EXCHANGE_INTENT_ORDER_CONTRACTS_SCHEMA_ID: string; diff --git a/packages/protocol/src/index.js b/packages/protocol/src/index.js index 7f07b1c9..358610d2 100644 --- a/packages/protocol/src/index.js +++ b/packages/protocol/src/index.js @@ -591,6 +591,17 @@ export { V42_READING_SHORTEST_PATH_STEP_IDS, buildV42ReadingShortestPathStateMachine } from './canonical/v42-reading-shortest-path-state-machine.js'; +export { + V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_ARTIFACT_PATH, + V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_CURRENT_TARGET, + V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_ROW_IDS, + V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_ROWS, + V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_SCHEMA_ID, + V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_SOURCE_SAFETY_VERDICT, + V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_VERSION, + V42_READNEED_REVIEW_RESYNTHESIS_SCHEMA_ID, + buildV42ReadNeedReviewResynthesisProductClosure +} from './canonical/v42-readneed-review-resynthesis-product-closure.js'; export { EXCHANGE_INTENT_ACTION_KINDS, EXCHANGE_INTENT_ORDER_CONTRACTS_ARTIFACT_PATH, diff --git a/packages/protocol/test/v42-readneed-review-resynthesis-product-closure.test.js b/packages/protocol/test/v42-readneed-review-resynthesis-product-closure.test.js new file mode 100644 index 00000000..277ee41c --- /dev/null +++ b/packages/protocol/test/v42-readneed-review-resynthesis-product-closure.test.js @@ -0,0 +1,73 @@ +import assert from 'node:assert/strict'; +import test from 'node:test'; + +import { + V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_ARTIFACT_PATH, + V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_ROWS, + V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_ROW_IDS, + V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_SCHEMA_ID, + V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_SOURCE_SAFETY_VERDICT, + V42_READNEED_REVIEW_RESYNTHESIS_SCHEMA_ID, + buildV42ReadNeedReviewResynthesisProductClosure, +} from '../src/canonical/v42-readneed-review-resynthesis-product-closure.js'; + +test('V42 ReadNeed review and resynthesis product closure binds the accepted Need gate', () => { + const report = buildV42ReadNeedReviewResynthesisProductClosure(); + + assert.equal( + V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_ARTIFACT_PATH, + '.bitcode/v42-readneed-review-resynthesis-product-closure.json', + ); + assert.equal(report.artifactId, 'v42-readneed-review-resynthesis-product-closure'); + assert.equal(report.schemaId, V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_SCHEMA_ID); + assert.equal(report.schemaId, V42_READNEED_REVIEW_RESYNTHESIS_SCHEMA_ID); + assert.equal(report.version, 'V42'); + assert.equal(report.currentTarget, 'V41'); + assert.equal(report.sourceSafetyVerdict, V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_SOURCE_SAFETY_VERDICT); + assert.equal(report.passed, true); + assert.deepEqual(report.rowIds, [...V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_ROW_IDS]); + assert.equal(report.rows.length, V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_ROWS.length); + assert.equal(report.coverage.rowCount, 11); + assert.equal(report.coverage.phaseCount, 4); + assert.equal(report.coverage.ptrrStepCount, 16); + assert.equal(report.coverage.failsafeSequenceCount, 48); + assert.equal(report.coverage.thricifiedGenerationCount, 48); + assert.deepEqual(report.coverage.actions, [ + 'synthesize_read_need', + 'resynthesize_read_need', + 'accept_read_need', + 'reject_read_need', + ]); + assert.equal(report.coverage.acceptedNeedRequiredForFindingFits, true); + assert.equal(report.coverage.rejectedNeedBlocksFindingFits, true); + assert.equal(report.coverage.terminalRuntimeReadbackCovered, true); + assert.equal(report.coverage.sourceSafeMetadataOnly, true); + assert.equal(report.coverage.protectedSourceVisible, false); + assert.equal(report.coverage.rawProtectedPromptVisible, false); + assert.equal(report.coverage.rawProviderResponseVisible, false); + assert.equal(report.coverage.unpaidAssetPackSourceVisible, false); + assert.equal(report.coverage.walletPrivateMaterialVisible, false); + assert.equal(report.coverage.settlementPrivatePayloadVisible, false); + assert.equal(report.coverage.credentialsSerialized, false); + assert.equal(report.coverage.legacySourceRoots, false); + assert.deepEqual(report.coverage.failedPredicateIds, []); + assert.ok(report.artifactRoot.startsWith('v42-readneed-review-resynthesis-product-closure:')); +}); + +test('V42 ReadNeed review rows remain source-safe metadata', () => { + for (const row of V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_ROWS) { + assert.ok(row.rowRoot.startsWith('v42-readneed-review-resynthesis-product-closure-row:')); + assert.equal(row.sourceSafetyClass, 'source_safe_readneed_review_resynthesis_product_closure_metadata'); + assert.equal(row.sourceSafeMetadataOnly, true); + assert.equal(row.protectedSourceVisible, false); + assert.equal(row.rawProtectedPromptVisible, false); + assert.equal(row.rawProviderResponseVisible, false); + assert.equal(row.unpaidAssetPackSourceVisible, false); + assert.equal(row.walletPrivateMaterialVisible, false); + assert.equal(row.settlementPrivatePayloadVisible, false); + assert.equal(row.credentialsSerialized, false); + assert.ok(row.forbiddenPayloadClasses.includes('protected-source-payloads')); + assert.ok(row.forbiddenPayloadClasses.includes('raw-provider-responses')); + assert.ok(row.forbiddenPayloadClasses.includes('unpaid-assetpack-source')); + } +}); diff --git a/scripts/check-v42-gate4-readneed-review-resynthesis-product-closure.mjs b/scripts/check-v42-gate4-readneed-review-resynthesis-product-closure.mjs new file mode 100644 index 00000000..d52bc7d3 --- /dev/null +++ b/scripts/check-v42-gate4-readneed-review-resynthesis-product-closure.mjs @@ -0,0 +1,258 @@ +#!/usr/bin/env node + +import { execFileSync } from 'node:child_process'; +import { existsSync, readFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const defaultRepoRoot = path.resolve(__dirname, '..'); +const ARTIFACT_PATH = '.bitcode/v42-readneed-review-resynthesis-product-closure.json'; + +const SECRET_MARKERS = [ + `${['sk', 'proj'].join('-')}-`, + `${['sb', 'secret'].join('_')}__`, + ['service', 'role'].join('_'), + Buffer.from('{"alg":"HS256","typ":"JWT"}').toString('base64url').slice(0, 18), + ['OPENAI', 'API', 'KEY'].join('_'), + ['SUPABASE', 'SERVICE', 'ROLE'].join('_'), + ['VERCEL', 'TOKEN'].join('_'), + ['VERCEL', 'OIDC', 'TOKEN'].join('_'), + ['PRIVATE', 'KEY'].join('_'), +]; + +function read(root, relativePath) { + return readFileSync(path.join(root, relativePath), 'utf8'); +} + +function fileExists(root, relativePath) { + return existsSync(path.join(root, relativePath)); +} + +function git(root, args) { + return execFileSync('git', args, { cwd: root, encoding: 'utf8' }).trim(); +} + +function run(root, command, args) { + return execFileSync(command, args, { + cwd: root, + encoding: 'utf8', + stdio: ['ignore', 'pipe', 'pipe'], + }).trim(); +} + +function assertCheck(failures, condition, message) { + if (!condition) failures.push(message); +} + +function parseArgs(argv) { + const args = { + skipBranchCheck: false, + skipPackageTests: false, + skipUapiTests: false, + repoRoot: defaultRepoRoot, + help: false, + }; + + for (let index = 0; index < argv.length; index += 1) { + const arg = argv[index]; + if (arg === '--skip-branch-check') args.skipBranchCheck = true; + else if (arg === '--skip-package-tests') args.skipPackageTests = true; + else if (arg === '--skip-uapi-tests') args.skipUapiTests = true; + else if (arg === '--repo-root') args.repoRoot = path.resolve(argv[++index]); + else if (arg === '--help' || arg === '-h') args.help = true; + else throw new Error(`Unknown argument ${arg}`); + } + + return args; +} + +function printHelp() { + process.stdout.write( + [ + 'Usage: node scripts/check-v42-gate4-readneed-review-resynthesis-product-closure.mjs [--skip-branch-check] [--skip-package-tests] [--skip-uapi-tests] [--repo-root ]', + '', + 'Checks V42 Gate 4 ReadNeed product closure, review/resynthesis, rejection, accepted-Need admission, source-safe runtime storage, telemetry receipts, Terminal readback, tests, docs, workflow wiring, and proof artifact.', + ].join('\n'), + ); + process.stdout.write('\n'); +} + +function main() { + const args = parseArgs(process.argv.slice(2)); + if (args.help) { + printHelp(); + return; + } + + const root = args.repoRoot; + const failures = []; + const pointer = read(root, 'BITCODE_SPEC.txt').trim(); + + assertCheck( + failures, + pointer === 'V41', + `BITCODE_SPEC.txt must remain V41 during V42 gate work. Observed ${pointer || 'empty'}.`, + ); + + if (!args.skipBranchCheck) { + const branch = git(root, ['branch', '--show-current']); + assertCheck( + failures, + branch === 'version/v42' || /^v42\/gate-(?:4|[5-9]|10)-[a-z0-9][a-z0-9-]*$/u.test(branch), + `V42 Gate 4+ work must occur on version/v42 or v42/gate-4..10-* branches. Observed ${branch || 'detached HEAD'}.`, + ); + } + + const requiredFiles = [ + ARTIFACT_PATH, + 'packages/pipelines/asset-pack/src/read-need.ts', + 'packages/pipelines/asset-pack/src/read-need-review-resynthesis.ts', + 'packages/pipelines/asset-pack/src/reading-pipeline-contract.ts', + 'packages/pipelines/asset-pack/src/__tests__/read-need.test.ts', + 'packages/pipelines/asset-pack/src/__tests__/read-need-review-resynthesis.test.ts', + 'packages/pipelines/asset-pack/src/__tests__/reading-pipeline-contract.test.ts', + 'uapi/app/api/read-review/route.ts', + 'uapi/app/terminal/TerminalDepositReadWorkbench.tsx', + 'uapi/tests/api/readReviewRoute.test.ts', + 'uapi/tests/api/readReviewProtocolParity.test.ts', + 'packages/protocol/src/canonical/v42-readneed-review-resynthesis-product-closure.js', + 'packages/protocol/test/v42-readneed-review-resynthesis-product-closure.test.js', + 'scripts/generate-v42-readneed-review-resynthesis-product-closure.mjs', + 'scripts/check-v42-gate4-readneed-review-resynthesis-product-closure.mjs', + 'BITCODE_SPEC_V42.md', + 'BITCODE_SPEC_V42_DELTA.md', + 'BITCODE_SPEC_V42_NOTES.md', + 'BITCODE_SPEC_V42_PARITY_MATRIX.md', + 'SPECIFICATIONS_ROADMAP.md', + 'README.md', + 'uapi/app/terminal/README.md', + 'packages/pipelines/asset-pack/README.md', + 'packages/protocol/README.md', + 'package.json', + '.github/workflows/bitcode-gate-quality.yml', + '.github/workflows/bitcode-canon-quality.yml', + ]; + + for (const relativePath of requiredFiles) { + assertCheck(failures, fileExists(root, relativePath), `Missing V42 Gate 4 file: ${relativePath}`); + } + + if (failures.length === 0) { + try { + run(root, 'node', ['scripts/generate-v42-readneed-review-resynthesis-product-closure.mjs', '--check']); + } catch (error) { + failures.push(`V42 ReadNeed review/resynthesis artifact check failed: ${error.stderr || error.message}`); + } + } + + if (failures.length === 0) { + try { + run(root, 'node', [ + '--test', + '--test-force-exit', + 'packages/protocol/test/v42-readneed-review-resynthesis-product-closure.test.js', + ]); + } catch (error) { + failures.push(`V42 ReadNeed review/resynthesis protocol test failed: ${error.stderr || error.message}`); + } + } + + if (failures.length === 0 && !args.skipPackageTests) { + try { + run(root, 'pnpm', [ + '--filter', + '@bitcode/pipeline-asset-pack', + 'exec', + 'jest', + '--config', + 'jest.config.cjs', + '--runTestsByPath', + 'src/__tests__/read-need.test.ts', + 'src/__tests__/read-need-review-resynthesis.test.ts', + 'src/__tests__/reading-pipeline-contract.test.ts', + '--runInBand', + '--forceExit', + ]); + } catch (error) { + failures.push(`V42 ReadNeed review/resynthesis package tests failed: ${error.stderr || error.message}`); + } + } + + if (failures.length === 0 && !args.skipUapiTests) { + try { + run(root, 'pnpm', [ + '--dir', + 'uapi', + 'exec', + 'jest', + '--runTestsByPath', + 'tests/api/readReviewRoute.test.ts', + 'tests/api/readReviewProtocolParity.test.ts', + 'tests/terminalDepositReadWorkbench.test.ts', + 'tests/terminalEnterpriseReadingUxState.test.ts', + '--runInBand', + ]); + } catch (error) { + failures.push(`V42 ReadNeed review/resynthesis UAPI tests failed: ${error.stderr || error.message}`); + } + } + + const serializedArtifact = fileExists(root, ARTIFACT_PATH) ? read(root, ARTIFACT_PATH) : ''; + for (const marker of SECRET_MARKERS) { + assertCheck(failures, !serializedArtifact.includes(marker), `V42 Gate 4 artifact must not contain secret marker ${marker}.`); + } + + const artifact = serializedArtifact ? JSON.parse(serializedArtifact) : null; + if (artifact) { + assertCheck(failures, artifact.artifactId === 'v42-readneed-review-resynthesis-product-closure', 'Gate 4 artifactId must match.'); + assertCheck( + failures, + artifact.schemaId === 'bitcode.v42.readNeedReviewResynthesisProductClosure.v1', + 'Gate 4 schemaId must match.', + ); + assertCheck(failures, artifact.version === 'V42' && artifact.currentTarget === 'V41', 'Gate 4 artifact must bind V42 over active V41.'); + assertCheck(failures, artifact.passed === true, 'Gate 4 artifact must pass.'); + assertCheck( + failures, + artifact.sourceSafetyVerdict === 'source-safe-readneed-review-resynthesis-product-closure-metadata', + 'Gate 4 artifact must declare source-safe ReadNeed review/resynthesis product closure metadata.', + ); + assertCheck(failures, artifact.coverage.rowCount === 11, 'Gate 4 must cover eleven ReadNeed product closure rows.'); + assertCheck(failures, artifact.coverage.phaseCount === 4, 'Gate 4 must cover four ReadNeedComprehensionSynthesis phases.'); + assertCheck(failures, artifact.coverage.ptrrStepCount === 16, 'Gate 4 must cover sixteen PTRR steps.'); + assertCheck(failures, artifact.coverage.failsafeSequenceCount === 48, 'Gate 4 must cover forty-eight Failsafe sequences.'); + assertCheck(failures, artifact.coverage.thricifiedGenerationCount === 48, 'Gate 4 must cover forty-eight ThricifiedGeneration receipts.'); + assertCheck(failures, artifact.coverage.acceptedNeedRequiredForFindingFits === true, 'Gate 4 must require accepted Need before Finding Fits.'); + assertCheck(failures, artifact.coverage.rejectedNeedBlocksFindingFits === true, 'Gate 4 must block Finding Fits after rejected Need.'); + assertCheck(failures, artifact.coverage.terminalRuntimeReadbackCovered === true, 'Gate 4 must cover Terminal runtime readback.'); + assertCheck(failures, artifact.coverage.sourceSafeMetadataOnly === true, 'Gate 4 must remain source-safe metadata only.'); + assertCheck(failures, artifact.coverage.protectedSourceVisible === false, 'Gate 4 artifact must not expose protected source.'); + assertCheck(failures, artifact.coverage.rawProtectedPromptVisible === false, 'Gate 4 artifact must not expose protected prompts.'); + assertCheck(failures, artifact.coverage.rawProviderResponseVisible === false, 'Gate 4 artifact must not expose raw provider responses.'); + assertCheck(failures, artifact.coverage.unpaidAssetPackSourceVisible === false, 'Gate 4 artifact must not expose unpaid AssetPack source.'); + assertCheck(failures, artifact.coverage.walletPrivateMaterialVisible === false, 'Gate 4 artifact must not expose wallet private material.'); + assertCheck(failures, artifact.coverage.settlementPrivatePayloadVisible === false, 'Gate 4 artifact must not expose settlement private payloads.'); + assertCheck(failures, artifact.coverage.credentialsSerialized === false, 'Gate 4 artifact must not serialize credentials.'); + assertCheck(failures, artifact.coverage.legacySourceRoots === false, 'Gate 4 must not rely on legacy source roots.'); + assertCheck(failures, Array.isArray(artifact.coverage.failedPredicateIds) && artifact.coverage.failedPredicateIds.length === 0, 'Gate 4 predicates must all pass.'); + } + + const spec = read(root, 'BITCODE_SPEC_V42.md'); + const parity = read(root, 'BITCODE_SPEC_V42_PARITY_MATRIX.md'); + const terminalReadme = read(root, 'uapi/app/terminal/README.md'); + assertCheck(failures, spec.includes('V42 Gate 4') && spec.includes('v42-readneed-review-resynthesis-product-closure'), 'V42 spec must expand Gate 4 ReadNeed product closure.'); + assertCheck(failures, parity.includes('ReadNeed product closure') && parity.includes('implemented'), 'V42 parity matrix must mark ReadNeed product closure implemented.'); + assertCheck(failures, terminalReadme.includes('V42 Gate 4') && terminalReadme.includes('ReadNeedReviewResynthesisRuntime'), 'Terminal README must document Gate 4 ReadNeed runtime readback.'); + + if (failures.length > 0) { + process.stderr.write(`V42 Gate 4 ReadNeed product closure check failed:\n- ${failures.join('\n- ')}\n`); + process.exitCode = 1; + return; + } + + process.stdout.write(`V42 Gate 4 ReadNeed product closure ok artifact=${artifact.artifactRoot}\n`); +} + +main(); diff --git a/scripts/generate-v42-readneed-review-resynthesis-product-closure.mjs b/scripts/generate-v42-readneed-review-resynthesis-product-closure.mjs new file mode 100644 index 00000000..cb05c4a3 --- /dev/null +++ b/scripts/generate-v42-readneed-review-resynthesis-product-closure.mjs @@ -0,0 +1,31 @@ +#!/usr/bin/env node + +import { readFileSync, writeFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { + V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_ARTIFACT_PATH, + buildV42ReadNeedReviewResynthesisProductClosure, +} from '../packages/protocol/src/canonical/v42-readneed-review-resynthesis-product-closure.js'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const repoRoot = path.resolve(__dirname, '..'); + +const check = process.argv.includes('--check'); +const artifact = buildV42ReadNeedReviewResynthesisProductClosure({ repoRoot }); +const serialized = `${JSON.stringify(artifact, null, 2)}\n`; +const artifactPath = path.join(repoRoot, V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_ARTIFACT_PATH); + +if (check) { + const current = readFileSync(artifactPath, 'utf8'); + if (current !== serialized) { + process.stderr.write( + `${V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_ARTIFACT_PATH} is stale. Run pnpm run generate:v42-readneed-review-resynthesis-product-closure.\n`, + ); + process.exitCode = 1; + } +} else { + writeFileSync(artifactPath, serialized); + process.stdout.write(`wrote ${V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_ARTIFACT_PATH}\n`); +} diff --git a/uapi/app/api/read-review/route.ts b/uapi/app/api/read-review/route.ts index f7a2d304..7966a42c 100644 --- a/uapi/app/api/read-review/route.ts +++ b/uapi/app/api/read-review/route.ts @@ -126,6 +126,7 @@ export async function POST(request: Request) { const { acceptReadNeed, admitReadFitsFinding } = await import('@bitcode/pipeline-asset-pack/read-need'); const { buildReadNeedReviewResynthesisRuntime, + persistReadNeedReviewResynthesisRuntime, summarizeReadNeedReviewResynthesisRuntime, } = await import('@bitcode/pipeline-asset-pack/read-need-review-resynthesis'); const { @@ -145,10 +146,12 @@ export async function POST(request: Request) { acceptedReadNeed, requireAcceptedReadNeed: true, }); + const inferenceCapture = createRouteInferenceCapture(); const reviewRuntime = buildReadNeedReviewResynthesisRuntime({ action, readNeed: acceptedReadNeed, }); + persistReadNeedReviewResynthesisRuntime(inferenceCapture.execution, reviewRuntime); const acceptanceStep = READ_NEED_COMPREHENSION_SYNTHESIS_CONTRACT.phases .flatMap((phase) => phase.agents) @@ -197,6 +200,7 @@ export async function POST(request: Request) { const { rejectReadNeed, admitReadFitsFinding } = await import('@bitcode/pipeline-asset-pack/read-need'); const { buildReadNeedReviewResynthesisRuntime, + persistReadNeedReviewResynthesisRuntime, summarizeReadNeedReviewResynthesisRuntime, } = await import('@bitcode/pipeline-asset-pack/read-need-review-resynthesis'); const { @@ -219,11 +223,13 @@ export async function POST(request: Request) { readNeed: rejectedReadNeed, requireAcceptedReadNeed: true, }); + const inferenceCapture = createRouteInferenceCapture(); const reviewRuntime = buildReadNeedReviewResynthesisRuntime({ action, readNeed: rejectedReadNeed, feedback: stringArray(body.feedback || body.readNeedFeedback), }); + persistReadNeedReviewResynthesisRuntime(inferenceCapture.execution, reviewRuntime); const reviewStep = READ_NEED_COMPREHENSION_SYNTHESIS_CONTRACT.phases .flatMap((phase) => phase.agents) diff --git a/uapi/app/terminal/README.md b/uapi/app/terminal/README.md index 176bc0a0..a5803f85 100644 --- a/uapi/app/terminal/README.md +++ b/uapi/app/terminal/README.md @@ -115,6 +115,16 @@ settlement, and settlement readback gates delivery. The source-safe proof artifact is `.bitcode/v42-reading-shortest-path-state-machine.json`, checked by `pnpm run check:v42-gate3`. +V42 Gate 4 closes the Terminal ReadNeed review loop. The staged Reading +surface now keeps `ReadNeedReviewResynthesisRuntime`, storage projection rows, +telemetry return type, runtime root, storage root, telemetry root, admission +blockers, and rejected Need posture visible in expandable source-safe detail. +Terminal exposes synthesize, resynthesize, accept, and reject actions before +Finding Fits; accepting the Need is the only admission handoff to +`ReadFitsFindingSynthesis`. The source-safe proof artifact is +`.bitcode/v42-readneed-review-resynthesis-product-closure.json`, checked by +`pnpm run check:v42-gate4`. + ## Live staging-testnet QA Terminal Deposit/Read QA starts only after Wallet and Externals prerequisites are diff --git a/uapi/app/terminal/TerminalDepositReadWorkbench.tsx b/uapi/app/terminal/TerminalDepositReadWorkbench.tsx index 4d4e1453..599e8117 100644 --- a/uapi/app/terminal/TerminalDepositReadWorkbench.tsx +++ b/uapi/app/terminal/TerminalDepositReadWorkbench.tsx @@ -104,6 +104,24 @@ type TerminalReadNeedState = Record & { }; }; +type TerminalReadNeedReviewRuntimeState = Record & { + schema?: 'bitcode.read-need-review-resynthesis-runtime'; + runtimeId?: string; + action?: string; + reviewState?: string; + findingFitsAdmission?: { + admitted?: boolean; + blockers?: string[]; + }; + reviewLoop?: Record; + proofRoots?: { + runtimeRoot?: string; + storageRoot?: string; + telemetryRoot?: string; + readRequestRoot?: string; + }; +}; + interface TerminalDepositReadWorkbenchProps { repositoryContext?: TerminalRepositoryContextState | null; depositedSourceRevision?: TerminalDepositedSourceRevision | null; @@ -134,9 +152,12 @@ export default function TerminalDepositReadWorkbench({ const [harnessUserHasScrolled, setHarnessUserHasScrolled] = useState(false); const [readNeed, setReadNeed] = useState(null); const [acceptedReadNeed, setAcceptedReadNeed] = useState(null); + const [readNeedReviewRuntime, setReadNeedReviewRuntime] = useState(null); + const [readNeedStorageProjection, setReadNeedStorageProjection] = useState>>([]); + const [readNeedTelemetry, setReadNeedTelemetry] = useState | null>(null); const [readNeedFeedback, setReadNeedFeedback] = useState(''); const [readNeedMessage, setReadNeedMessage] = useState(null); - const [readNeedAction, setReadNeedAction] = useState<'synthesize' | 'accept' | 'resynthesize' | null>(null); + const [readNeedAction, setReadNeedAction] = useState<'synthesize' | 'accept' | 'reject' | 'resynthesize' | null>(null); const [readNeedSynthesisCount, setReadNeedSynthesisCount] = useState(0); const workbenchSnapshot = useMemo(() => { const liveWorkbenchSnapshot = buildLiveTerminalDepositReadWorkbenchSnapshot(repositoryContext, depositedSourceRevision); @@ -157,6 +178,9 @@ export default function TerminalDepositReadWorkbench({ setHarnessEvents([]); setReadNeed(null); setAcceptedReadNeed(null); + setReadNeedReviewRuntime(null); + setReadNeedStorageProjection([]); + setReadNeedTelemetry(null); setReadNeedFeedback(''); setReadNeedMessage(null); setReadNeedAction(null); @@ -410,6 +434,23 @@ export default function TerminalDepositReadWorkbench({ { label: 'Previous Need', value: shortIdentifier(currentReadNeed.request?.previousNeedId) || currentReadNeed.request?.previousNeedId || 'none' }, ]; }, [currentReadNeed]); + const readNeedRuntimeRows = useMemo(() => { + if (!readNeedReviewRuntime && !readNeedTelemetry && readNeedStorageProjection.length === 0) return []; + const admission = objectValue(readNeedReviewRuntime?.findingFitsAdmission); + const proofRoots = objectValue(readNeedReviewRuntime?.proofRoots); + return [ + { label: 'Runtime', value: shortIdentifier(readNeedReviewRuntime?.runtimeId) || textValue(readNeedReviewRuntime?.runtimeId) || 'pending' }, + { label: 'Action', value: textValue(readNeedReviewRuntime?.action) || 'pending' }, + { label: 'Admission', value: admission?.admitted === true ? 'admitted' : 'blocked' }, + { label: 'Blockers', value: stringList(admission?.blockers).join(', ') || 'none' }, + { label: 'Storage records', value: String(readNeedStorageProjection.length || 'pending') }, + { label: 'Runtime root', value: shortIdentifier(proofRoots?.runtimeRoot) || 'pending' }, + { label: 'Storage root', value: shortIdentifier(proofRoots?.storageRoot) || 'pending' }, + { label: 'Telemetry root', value: shortIdentifier(proofRoots?.telemetryRoot || readNeedTelemetry?.telemetryRoot) || 'pending' }, + { label: 'PTRR step', value: shortIdentifier(readNeedTelemetry?.ptrrStepId) || textValue(readNeedTelemetry?.ptrrStepId) || 'pending' }, + { label: 'Return type', value: textValue(readNeedTelemetry?.returnType) || 'pending' }, + ]; + }, [readNeedReviewRuntime, readNeedStorageProjection, readNeedTelemetry]); const stageCards = enterpriseReadingState.steps; const canRunLiveFit = !showDemonstrationWorkbench && @@ -531,6 +572,9 @@ export default function TerminalDepositReadWorkbench({ if (!nextNeed) throw new Error('Read-Need synthesis did not return a typed Need.'); setReadNeed(nextNeed); setAcceptedReadNeed(null); + setReadNeedReviewRuntime(objectValue(payload?.readNeedReviewRuntime) as TerminalReadNeedReviewRuntimeState | null); + setReadNeedStorageProjection(Array.isArray(payload?.storageProjection) ? payload.storageProjection as Array> : []); + setReadNeedTelemetry(objectValue(payload?.telemetry)); setReadNeedSynthesisCount((count) => count + 1); setReadNeedMessage( action === 'synthesize_read_need' @@ -573,6 +617,9 @@ export default function TerminalDepositReadWorkbench({ } setAcceptedReadNeed(accepted); setReadNeed(accepted); + setReadNeedReviewRuntime(objectValue(payload?.readNeedReviewRuntime) as TerminalReadNeedReviewRuntimeState | null); + setReadNeedStorageProjection(Array.isArray(payload?.storageProjection) ? payload.storageProjection as Array> : []); + setReadNeedTelemetry(objectValue(payload?.telemetry)); setReadNeedMessage('Read-Need accepted. Finding Fits can now run against deposited source.'); await onRecordActivity?.({ type: 'agentic-execution:read-measurement', @@ -604,6 +651,47 @@ export default function TerminalDepositReadWorkbench({ } }, [onRecordActivity, readNeed]); + const handleRejectReadNeed = useCallback(async () => { + if (!readNeed) return; + + setReadNeedAction('reject'); + setReadNeedMessage(null); + + try { + const response = await fetch('/api/read-review', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + action: 'reject_read_need', + readNeed, + feedback: readNeedFeedback.trim() ? [readNeedFeedback.trim()] : [], + }), + }); + + if (!response.ok) { + throw new Error(await readTerminalRouteError(response, 'Unable to reject the Read-Need.')); + } + + const payload = objectValue(await response.json()); + const rejected = terminalReadNeed(payload?.rejectedReadNeed || payload?.readNeed); + if (!rejected || rejected.reviewState !== 'rejected') { + throw new Error('Read-Need rejection did not return a rejected Need.'); + } + setReadNeed(rejected); + setAcceptedReadNeed(null); + setReadNeedReviewRuntime(objectValue(payload?.readNeedReviewRuntime) as TerminalReadNeedReviewRuntimeState | null); + setReadNeedStorageProjection(Array.isArray(payload?.storageProjection) ? payload.storageProjection as Array> : []); + setReadNeedTelemetry(objectValue(payload?.telemetry)); + setReadNeedMessage('Read-Need rejected. Finding Fits remains blocked until a resynthesized Need is accepted.'); + } catch (error) { + setReadNeedMessage(error instanceof Error ? error.message : 'Unable to reject the Read-Need.'); + } finally { + setReadNeedAction(null); + } + }, [readNeed, readNeedFeedback]); + const handleRunLiveFit = useCallback(async () => { if (!harnessRequestState.ready) { setHarnessState('failed'); @@ -850,6 +938,16 @@ export default function TerminalDepositReadWorkbench({ > {readNeedAction === 'accept' ? 'Accepting…' : 'Accept Read-Need'} +
diff --git a/uapi/tests/api/readReviewRoute.test.ts b/uapi/tests/api/readReviewRoute.test.ts index 90d198df..12f4a21b 100644 --- a/uapi/tests/api/readReviewRoute.test.ts +++ b/uapi/tests/api/readReviewRoute.test.ts @@ -402,8 +402,18 @@ describe('/api/read-review', () => { rejectedNeedPosturePersisted: true, findingFitsBlockedUntilAcceptedNeed: true, }, + sourceSafety: { + protectedSourceVisible: false, + rawProviderResponseVisible: false, + unpaidAssetPackSourceVisible: false, + credentialsSerialized: false, + }, }); expect(payload.storageProjection.map((record: { recordKind: string }) => record.recordKind)).toContain('rejected_need_posture'); + expect(payload.runtimeSummary).toMatchObject({ + findingFitsAdmitted: false, + storageRecordCount: payload.storageProjection.length, + }); expect(payload.telemetry).toMatchObject({ schema: 'bitcode.read-need.rejection-telemetry', returnType: 'RejectedReadNeed', From b1282bcc92934eedfe8921209a4ec1ebbcf28192 Mon Sep 17 00:00:00 2001 From: Garrett Maring Date: Thu, 28 May 2026 18:42:05 -0300 Subject: [PATCH 06/35] V42 Gate 5: Close Finding Fits preview quote Bind ReadFitsFindingSynthesis to source-safe AssetPack preview and deterministic quote closure. Add preview boundary harness summaries, Terminal provenance readback, protocol artifact/check scripts, workflow wiring, focused tests, and V42 docs/parity updates. --- .../v42-readfitsfinding-preview-quote.json | 676 ++++++++++++++++++ .github/workflows/bitcode-canon-quality.yml | 3 + .github/workflows/bitcode-gate-quality.yml | 3 + BITCODE_SPEC_V42.md | 2 + BITCODE_SPEC_V42_DELTA.md | 1 + BITCODE_SPEC_V42_NOTES.md | 8 + BITCODE_SPEC_V42_PARITY_MATRIX.md | 4 +- README.md | 10 + SPECIFICATIONS_ROADMAP.md | 5 +- package.json | 3 + packages/pipelines/asset-pack/README.md | 8 + .../asset-pack-preview-boundary.test.ts | 6 + .../read-fits-finding-runtime.test.ts | 4 + packages/protocol/README.md | 10 + .../v42-readfitsfinding-preview-quote.js | 343 +++++++++ packages/protocol/src/index.d.ts | 8 + packages/protocol/src/index.js | 10 + .../v42-readfitsfinding-preview-quote.test.js | 80 +++ ...42-gate5-readfitsfinding-preview-quote.mjs | 268 +++++++ ...rate-v42-readfitsfinding-preview-quote.mjs | 31 + .../api/pipeline-harness/asset-pack/runner.ts | 217 ++++++ uapi/app/terminal/README.md | 10 + .../terminal/TerminalDepositReadWorkbench.tsx | 138 +++- .../terminal-pipeline-harness-client.ts | 26 +- uapi/tests/api/pipelineHarnessRoute.test.ts | 141 ++++ .../terminalPipelineHarnessClient.test.ts | 21 +- 26 files changed, 2025 insertions(+), 11 deletions(-) create mode 100644 .bitcode/v42-readfitsfinding-preview-quote.json create mode 100644 packages/protocol/src/canonical/v42-readfitsfinding-preview-quote.js create mode 100644 packages/protocol/test/v42-readfitsfinding-preview-quote.test.js create mode 100644 scripts/check-v42-gate5-readfitsfinding-preview-quote.mjs create mode 100644 scripts/generate-v42-readfitsfinding-preview-quote.mjs diff --git a/.bitcode/v42-readfitsfinding-preview-quote.json b/.bitcode/v42-readfitsfinding-preview-quote.json new file mode 100644 index 00000000..0c555920 --- /dev/null +++ b/.bitcode/v42-readfitsfinding-preview-quote.json @@ -0,0 +1,676 @@ +{ + "artifactId": "v42-readfitsfinding-preview-quote", + "schemaId": "bitcode.v42.readFitsFindingPreviewQuote.v1", + "version": "V42", + "currentTarget": "V41", + "sourceSafetyVerdict": "source-safe-readfitsfinding-preview-quote-metadata", + "generatedAt": "deterministic", + "artifactRoot": "v42-readfitsfinding-preview-quote:69267c22ee5a9efe19024b6d", + "passed": true, + "rows": [ + { + "rowId": "admission:accepted-need-required", + "purpose": "Require an accepted ReadNeedComprehensionSynthesis Need before ReadFitsFindingSynthesis can search or preview an AssetPack.", + "sourceRoots": [ + "packages/pipelines/asset-pack/src/read-need.ts", + "packages/pipelines/asset-pack/src/read-fits-finding-runtime.ts", + "uapi/app/terminal/TerminalDepositReadWorkbench.tsx" + ], + "emittedTypes": [ + "ReadFitsFindingAdmission", + "accepted_need_admission" + ], + "requiredEvidence": [ + "accepted_read_need_missing", + "findingFitsAdmission", + "acceptedNeed" + ], + "rowRoot": "v42-readfitsfinding-preview-quote-row:fbe895bf78a96e815c9be5d6", + "sourceSafetyClass": "source_safe_readfitsfinding_preview_quote_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "credentialsSerialized": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "secret-values" + ] + }, + { + "rowId": "search:many-candidate-depository-discovery", + "purpose": "Search Depository AssetPack supply for many candidates above threshold before selecting the fit set.", + "sourceRoots": [ + "packages/pipelines/asset-pack/src/depository-search.ts", + "packages/pipelines/asset-pack/src/__tests__/depository-search.test.ts" + ], + "emittedTypes": [ + "DepositorySearchResult", + "DepositoryCandidate" + ], + "requiredEvidence": [ + "searchedAssetCount", + "candidateRanking", + "maxSelectedCandidates" + ], + "rowRoot": "v42-readfitsfinding-preview-quote-row:a7549cf3806d92ce20f13fff", + "sourceSafetyClass": "source_safe_readfitsfinding_preview_quote_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "credentialsSerialized": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "secret-values" + ] + }, + { + "rowId": "search:multi-channel-vector-provider-tooling", + "purpose": "Bind lexical, symbolic, path, metadata, measurement, embedding-vector, and provider-specific search channels to source-safe tool receipts.", + "sourceRoots": [ + "packages/pipelines/asset-pack/src/depository-search.ts", + "packages/pipelines/asset-pack/src/read-fits-finding-runtime.ts" + ], + "emittedTypes": [ + "ReadFitsFindingSynthesisSearchReceipt", + "DepositorySearchQueryPlan" + ], + "requiredEvidence": [ + "lexical", + "symbolic", + "path", + "metadata", + "measurement", + "embedding-vector", + "provider-specific", + "ReadFitsFindingSynthesis.tool.vector-depository-search" + ], + "rowRoot": "v42-readfitsfinding-preview-quote-row:26ef6786dfdec3d0571c9d19", + "sourceSafetyClass": "source_safe_readfitsfinding_preview_quote_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "credentialsSerialized": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "secret-values" + ] + }, + { + "rowId": "ranking:candidate-ranking-and-thresholds", + "purpose": "Rank candidates with deterministic scores, thresholds, blockers, rejected counts, and proof/measurement requirements.", + "sourceRoots": [ + "packages/pipelines/asset-pack/src/depository-search.ts", + "packages/pipelines/asset-pack/src/__tests__/depository-search.test.ts" + ], + "emittedTypes": [ + "DepositoryCandidateRanking", + "DepositoryCandidateFitEvidence" + ], + "requiredEvidence": [ + "finalScore", + "semanticScore", + "proofScore", + "measurementScore", + "rejectedCandidateCount" + ], + "rowRoot": "v42-readfitsfinding-preview-quote-row:aff87ef4ef37eaf19c22272c", + "sourceSafetyClass": "source_safe_readfitsfinding_preview_quote_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "credentialsSerialized": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "secret-values" + ] + }, + { + "rowId": "provenance:selected-fit-provenance", + "purpose": "Persist selected fit provenance with selected candidate ids, fit deposit ids, proof roots, measurement roots, and reconciliation roots.", + "sourceRoots": [ + "packages/pipelines/asset-pack/src/read-fits-finding-runtime.ts", + "packages/pipelines/asset-pack/src/asset-pack-preview-boundary.ts", + "packages/pipelines/asset-pack/src/__tests__/read-fits-finding-runtime.test.ts" + ], + "emittedTypes": [ + "selected_fit_provenance", + "AssetPackPreviewSelectedFitProvenance" + ], + "requiredEvidence": [ + "selectedFitProvenanceRoot", + "fitDepositAssetIds", + "reconciliationReadbackRoot" + ], + "rowRoot": "v42-readfitsfinding-preview-quote-row:799590ec67d4c203c0d80ca9", + "sourceSafetyClass": "source_safe_readfitsfinding_preview_quote_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "credentialsSerialized": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "secret-values" + ] + }, + { + "rowId": "preview:source-safe-assetpack-preview", + "purpose": "Create the source-safe AssetPack preview that exposes measurements, fit posture, roots, and delivery posture while source stays locked.", + "sourceRoots": [ + "packages/pipelines/asset-pack/src/asset-pack-preview-boundary.ts", + "packages/pipelines/asset-pack/src/read-need.ts", + "packages/pipelines/asset-pack/src/__tests__/asset-pack-preview-boundary.test.ts" + ], + "emittedTypes": [ + "AssetPackSourceSafePreview", + "AssetPackPreviewBoundary" + ], + "requiredEvidence": [ + "sourceSafePreview", + "AssetPackPreviewBoundary", + "sourceBearingDeliveryVisible" + ], + "rowRoot": "v42-readfitsfinding-preview-quote-row:6c78f5b53697900316d08828", + "sourceSafetyClass": "source_safe_readfitsfinding_preview_quote_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "credentialsSerialized": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "secret-values" + ] + }, + { + "rowId": "quote:deterministic-share-to-fee-btc-quote", + "purpose": "Read back deterministic BTD/BTC quote calculation from measurement weight, measurement volume, admitted fit quality, dust floor, and minimum sats.", + "sourceRoots": [ + "packages/pipelines/asset-pack/src/read-need.ts", + "packages/pipelines/asset-pack/src/asset-pack-preview-boundary.ts", + "packages/pipelines/asset-pack/src/__tests__/asset-pack-preview-boundary.test.ts" + ], + "emittedTypes": [ + "ShareToFeeQuote", + "AssetPackPreviewQuoteReceipt" + ], + "requiredEvidence": [ + "sum(measurement.weight * measurement.volume * admitted_fit_quality)", + "deterministic", + "quoteRoot" + ], + "rowRoot": "v42-readfitsfinding-preview-quote-row:2cd3ae0f6b53015ff194183b", + "sourceSafetyClass": "source_safe_readfitsfinding_preview_quote_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "credentialsSerialized": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "secret-values" + ] + }, + { + "rowId": "disclosure:no-pre-settlement-source", + "purpose": "Fail closed when preview, telemetry, route summary, or UI readback would expose protected source or unpaid AssetPack source before settlement.", + "sourceRoots": [ + "packages/pipelines/asset-pack/src/asset-pack-preview-boundary.ts", + "uapi/app/api/pipeline-harness/asset-pack/runner.ts", + "uapi/app/terminal/TerminalDepositReadWorkbench.tsx" + ], + "emittedTypes": [ + "AssetPackDisclosureReview", + "AssetPackPreviewBoundarySourceSafety" + ], + "requiredEvidence": [ + "protectedSourceVisible: false", + "unpaidAssetPackSourceVisible: false", + "credentialsSerialized: false" + ], + "rowRoot": "v42-readfitsfinding-preview-quote-row:6c6f576e66de92dfbfcb4b73", + "sourceSafetyClass": "source_safe_readfitsfinding_preview_quote_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "credentialsSerialized": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "secret-values" + ] + }, + { + "rowId": "settlement:instructions-before-rights-transfer", + "purpose": "Expose source-safe settlement instructions and delivery lock before Gate 6 rights-transfer and repository delivery unlock.", + "sourceRoots": [ + "packages/pipelines/asset-pack/src/asset-pack-preview-boundary.ts", + "packages/pipelines/asset-pack/src/__tests__/asset-pack-preview-boundary.test.ts" + ], + "emittedTypes": [ + "AssetPackPreviewSettlementInstructions", + "AssetPackPreviewDeliveryPosture" + ], + "requiredEvidence": [ + "quote_ready_settlement_required", + "reader_wallet_authorized_before_broadcast", + "withheld_until_settlement" + ], + "rowRoot": "v42-readfitsfinding-preview-quote-row:3072bb82f264a8795871106d", + "sourceSafetyClass": "source_safe_readfitsfinding_preview_quote_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "credentialsSerialized": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "secret-values" + ] + }, + { + "rowId": "route:harness-preview-quote-summary", + "purpose": "Summarize preview boundary, quote receipt, selected-fit provenance, settlement instructions, delivery posture, and disclosure review through the pipeline harness route without source payloads.", + "sourceRoots": [ + "uapi/app/api/pipeline-harness/asset-pack/runner.ts", + "uapi/tests/api/pipelineHarnessRoute.test.ts" + ], + "emittedTypes": [ + "assetPackPreviewBoundary", + "assetPackQuoteReceipt", + "assetPackSettlementInstructions", + "assetPackDeliveryPosture" + ], + "requiredEvidence": [ + "summarizeAssetPackPreviewBoundary", + "assetPackPreviewBoundary", + "storageRecordCount" + ], + "rowRoot": "v42-readfitsfinding-preview-quote-row:0ffb7be9b16813de0ef71096", + "sourceSafetyClass": "source_safe_readfitsfinding_preview_quote_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "credentialsSerialized": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "secret-values" + ] + }, + { + "rowId": "ui:terminal-preview-quote-provenance-readback", + "purpose": "Render Terminal Finding Fits preview, quote, provenance, settlement, delivery, and replay roots as expandable source-safe metadata.", + "sourceRoots": [ + "uapi/app/terminal/TerminalDepositReadWorkbench.tsx", + "uapi/app/terminal/terminal-pipeline-harness-client.ts", + "uapi/tests/terminalPipelineHarnessClient.test.ts" + ], + "emittedTypes": [ + "assetPackPreviewBoundaryRows", + "TerminalReadFitsFindingSynthesisHarnessStreamSnapshot" + ], + "requiredEvidence": [ + "Finding Fits preview, quote, and provenance", + "quote_ready_settlement_required", + "withheld_until_settlement" + ], + "rowRoot": "v42-readfitsfinding-preview-quote-row:0291291e16e03e2e74707398", + "sourceSafetyClass": "source_safe_readfitsfinding_preview_quote_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "credentialsSerialized": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "secret-values" + ] + }, + { + "rowId": "proof:tests-artifact-workflow", + "purpose": "Bind V42 Gate 5 closure to package tests, UAPI tests, protocol artifact tests, docs, scripts, workflows, and generated source-safe proof.", + "sourceRoots": [ + "packages/pipelines/asset-pack/src/__tests__/depository-search.test.ts", + "packages/pipelines/asset-pack/src/__tests__/read-fits-finding-runtime.test.ts", + "packages/pipelines/asset-pack/src/__tests__/asset-pack-preview-boundary.test.ts", + "uapi/tests/api/pipelineHarnessRoute.test.ts", + ".github/workflows/bitcode-gate-quality.yml", + ".github/workflows/bitcode-canon-quality.yml", + "BITCODE_SPEC_V42.md", + "BITCODE_SPEC_V42_PARITY_MATRIX.md", + "SPECIFICATIONS_ROADMAP.md" + ], + "emittedTypes": [ + "V42ReadFitsFindingPreviewQuote" + ], + "requiredEvidence": [ + "check-v42-gate5-readfitsfinding-preview-quote.mjs", + "v42-readfitsfinding-preview-quote" + ], + "rowRoot": "v42-readfitsfinding-preview-quote-row:b09ae61cf4664f8a3914be8e", + "sourceSafetyClass": "source_safe_readfitsfinding_preview_quote_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "credentialsSerialized": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "secret-values" + ] + } + ], + "rowIds": [ + "admission:accepted-need-required", + "search:many-candidate-depository-discovery", + "search:multi-channel-vector-provider-tooling", + "ranking:candidate-ranking-and-thresholds", + "provenance:selected-fit-provenance", + "preview:source-safe-assetpack-preview", + "quote:deterministic-share-to-fee-btc-quote", + "disclosure:no-pre-settlement-source", + "settlement:instructions-before-rights-transfer", + "route:harness-preview-quote-summary", + "ui:terminal-preview-quote-provenance-readback", + "proof:tests-artifact-workflow" + ], + "predicateResults": [ + { + "id": "accepted-need-gates-finding-fits", + "sourcePath": "packages/pipelines/asset-pack/src/read-fits-finding-runtime.ts", + "passed": true + }, + { + "id": "search-defines-many-channel-ids", + "sourcePath": "packages/pipelines/asset-pack/src/depository-search.ts", + "passed": true + }, + { + "id": "search-defines-tool-ids", + "sourcePath": "packages/pipelines/asset-pack/src/depository-search.ts", + "passed": true + }, + { + "id": "search-covers-provider-embedding-policy", + "sourcePath": "packages/pipelines/asset-pack/src/depository-search.ts", + "passed": true + }, + { + "id": "search-tests-many-candidates", + "sourcePath": "packages/pipelines/asset-pack/src/__tests__/depository-search.test.ts", + "passed": true + }, + { + "id": "runtime-persists-selected-fit-provenance", + "sourcePath": "packages/pipelines/asset-pack/src/read-fits-finding-runtime.ts", + "passed": true + }, + { + "id": "runtime-telemetry-counts", + "sourcePath": "packages/pipelines/asset-pack/src/read-fits-finding-runtime.ts", + "passed": true + }, + { + "id": "runtime-tests-source-safe-counts", + "sourcePath": "packages/pipelines/asset-pack/src/__tests__/read-fits-finding-runtime.test.ts", + "passed": true + }, + { + "id": "preview-boundary-defines-quote-provenance-settlement-delivery", + "sourcePath": "packages/pipelines/asset-pack/src/asset-pack-preview-boundary.ts", + "passed": true + }, + { + "id": "preview-boundary-source-safety", + "sourcePath": "packages/pipelines/asset-pack/src/asset-pack-preview-boundary.ts", + "passed": true + }, + { + "id": "quote-formula-implemented", + "sourcePath": "packages/pipelines/asset-pack/src/read-need.ts", + "passed": true + }, + { + "id": "preview-tests-cover-determinism-and-storage-safety", + "sourcePath": "packages/pipelines/asset-pack/src/__tests__/asset-pack-preview-boundary.test.ts", + "passed": true + }, + { + "id": "package-postprocess-surfaces-boundary", + "sourcePath": "packages/pipelines/asset-pack/src/postprocess.ts", + "passed": true + }, + { + "id": "contract-keeps-readfitsfinding-topology", + "sourcePath": "packages/pipelines/asset-pack/src/reading-pipeline-contract.ts", + "passed": true + }, + { + "id": "harness-route-summarizes-preview-boundary", + "sourcePath": "uapi/app/api/pipeline-harness/asset-pack/runner.ts", + "passed": true + }, + { + "id": "harness-route-tests-preview-boundary-summary", + "sourcePath": "uapi/tests/api/pipelineHarnessRoute.test.ts", + "passed": true + }, + { + "id": "terminal-ui-renders-preview-boundary-rows", + "sourcePath": "uapi/app/terminal/TerminalDepositReadWorkbench.tsx", + "passed": true + }, + { + "id": "terminal-client-summarizes-boundary", + "sourcePath": "uapi/app/terminal/terminal-pipeline-harness-client.ts", + "passed": true + }, + { + "id": "terminal-client-tests-boundary-summary", + "sourcePath": "uapi/tests/terminalPipelineHarnessClient.test.ts", + "passed": true + }, + { + "id": "spec-gate5-expanded", + "sourcePath": "BITCODE_SPEC_V42.md", + "passed": true + }, + { + "id": "delta-gate5-expanded", + "sourcePath": "BITCODE_SPEC_V42_DELTA.md", + "passed": true + }, + { + "id": "notes-gate5-expanded", + "sourcePath": "BITCODE_SPEC_V42_NOTES.md", + "passed": true + }, + { + "id": "parity-gate5-implemented", + "sourcePath": "BITCODE_SPEC_V42_PARITY_MATRIX.md", + "passed": true + }, + { + "id": "roadmap-advanced-to-gate5", + "sourcePath": "SPECIFICATIONS_ROADMAP.md", + "passed": true + }, + { + "id": "readmes-document-gate5", + "sourcePath": "README.md", + "passed": true + }, + { + "id": "workflows-run-gate5-check", + "sourcePath": ".github/workflows/bitcode-gate-quality.yml", + "passed": true + } + ], + "coverage": { + "rowCount": 12, + "requiredPredicateCount": 26, + "passedPredicateCount": 26, + "failedPredicateIds": [], + "pipelineName": "ReadFitsFindingSynthesis", + "requiredPriorPipelineName": "ReadNeedComprehensionSynthesis", + "phaseCount": 7, + "agentCount": 8, + "ptrrStepCount": 32, + "failsafeSequenceCount": 96, + "thricifiedGenerationCount": 96, + "searchChannelIds": [ + "lexical", + "symbolic", + "path", + "metadata", + "measurement", + "embedding-vector", + "provider-specific" + ], + "selectedFitProvenanceRequired": true, + "sourceSafePreviewRequired": true, + "deterministicQuoteRequired": true, + "noProtectedSourceBeforeSettlement": true, + "settlementInstructionsRequired": true, + "terminalPreviewQuoteReadbackCovered": true, + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "credentialsSerialized": false, + "legacySourceRoots": false + }, + "sourceRoots": { + "depositorySearch": "packages/pipelines/asset-pack/src/depository-search.ts", + "readFitsFindingRuntime": "packages/pipelines/asset-pack/src/read-fits-finding-runtime.ts", + "assetPackPreviewBoundary": "packages/pipelines/asset-pack/src/asset-pack-preview-boundary.ts", + "readNeed": "packages/pipelines/asset-pack/src/read-need.ts", + "packageIndex": "packages/pipelines/asset-pack/src/index.ts", + "postprocess": "packages/pipelines/asset-pack/src/postprocess.ts", + "readingPipelineContract": "packages/pipelines/asset-pack/src/reading-pipeline-contract.ts", + "depositorySearchTest": "packages/pipelines/asset-pack/src/__tests__/depository-search.test.ts", + "runtimeTest": "packages/pipelines/asset-pack/src/__tests__/read-fits-finding-runtime.test.ts", + "previewBoundaryTest": "packages/pipelines/asset-pack/src/__tests__/asset-pack-preview-boundary.test.ts", + "postprocessTest": "packages/pipelines/asset-pack/src/__tests__/postprocess.test.ts", + "harnessRunner": "uapi/app/api/pipeline-harness/asset-pack/runner.ts", + "harnessRouteTest": "uapi/tests/api/pipelineHarnessRoute.test.ts", + "terminalWorkbench": "uapi/app/terminal/TerminalDepositReadWorkbench.tsx", + "terminalHarnessClient": "uapi/app/terminal/terminal-pipeline-harness-client.ts", + "terminalHarnessClientTest": "uapi/tests/terminalPipelineHarnessClient.test.ts", + "gateWorkflow": ".github/workflows/bitcode-gate-quality.yml", + "canonWorkflow": ".github/workflows/bitcode-canon-quality.yml", + "v42Spec": "BITCODE_SPEC_V42.md", + "v42Delta": "BITCODE_SPEC_V42_DELTA.md", + "v42Notes": "BITCODE_SPEC_V42_NOTES.md", + "v42Parity": "BITCODE_SPEC_V42_PARITY_MATRIX.md", + "roadmap": "SPECIFICATIONS_ROADMAP.md", + "rootReadme": "README.md", + "terminalReadme": "uapi/app/terminal/README.md", + "assetPackReadme": "packages/pipelines/asset-pack/README.md", + "protocolReadme": "packages/protocol/README.md" + } +} diff --git a/.github/workflows/bitcode-canon-quality.yml b/.github/workflows/bitcode-canon-quality.yml index 13e5d697..23a88608 100644 --- a/.github/workflows/bitcode-canon-quality.yml +++ b/.github/workflows/bitcode-canon-quality.yml @@ -304,6 +304,9 @@ jobs: if [ -f scripts/check-v42-gate4-readneed-review-resynthesis-product-closure.mjs ]; then node scripts/check-v42-gate4-readneed-review-resynthesis-product-closure.mjs --skip-branch-check --skip-package-tests --skip-uapi-tests fi + if [ -f scripts/check-v42-gate5-readfitsfinding-preview-quote.mjs ]; then + node scripts/check-v42-gate5-readfitsfinding-preview-quote.mjs --skip-branch-check --skip-package-tests --skip-uapi-tests + fi fi else echo "Unexpected BITCODE_SPEC.txt pointer: $POINTER" >&2 diff --git a/.github/workflows/bitcode-gate-quality.yml b/.github/workflows/bitcode-gate-quality.yml index 82dc5ab8..9c2a28c0 100644 --- a/.github/workflows/bitcode-gate-quality.yml +++ b/.github/workflows/bitcode-gate-quality.yml @@ -433,6 +433,9 @@ jobs: if [ -f scripts/check-v42-gate4-readneed-review-resynthesis-product-closure.mjs ]; then node scripts/check-v42-gate4-readneed-review-resynthesis-product-closure.mjs --skip-branch-check --skip-package-tests --skip-uapi-tests fi + if [ -f scripts/check-v42-gate5-readfitsfinding-preview-quote.mjs ]; then + node scripts/check-v42-gate5-readfitsfinding-preview-quote.mjs --skip-branch-check --skip-package-tests --skip-uapi-tests + fi fi else echo "Unexpected BITCODE_SPEC.txt pointer: $POINTER" >&2 diff --git a/BITCODE_SPEC_V42.md b/BITCODE_SPEC_V42.md index 8c1ce389..316527d3 100644 --- a/BITCODE_SPEC_V42.md +++ b/BITCODE_SPEC_V42.md @@ -140,6 +140,8 @@ The artifact binds `ReadNeedReviewResynthesisRuntime`, all four review actions, Gate 5 must make `ReadFitsFindingSynthesis` product-ready in the MVP flow. The pipeline must search the Depository for many candidates above threshold, rank candidates, select fits, synthesize source-safe AssetPack measurements and preview metadata, keep source-bearing content withheld, calculate deterministic BTD/BTC quote posture, and expose a reviewable preview. It must cover vector search and provider search tooling, selected-fit provenance, prompt/tool return types, telemetry, quote formula readback, source-safe UI, and failure/repair states. +Gate 5 is implemented by `.bitcode/v42-readfitsfinding-preview-quote.json`. +The artifact binds the accepted-Need gate, many-channel Depository search, candidate ranking, selected-fit provenance, `AssetPackPreviewBoundary`, deterministic share-to-fee quote receipt, disclosure review, settlement instructions, delivery lock, harness route summary, Terminal preview/quote/provenance readback, and the package/API/protocol tests that prove no protected source or unpaid AssetPack source crosses the pre-settlement boundary. ## V42 Gate 6 Settlement Rights Transfer And Repository Delivery Closure diff --git a/BITCODE_SPEC_V42_DELTA.md b/BITCODE_SPEC_V42_DELTA.md index 36e45942..177b9a08 100644 --- a/BITCODE_SPEC_V42_DELTA.md +++ b/BITCODE_SPEC_V42_DELTA.md @@ -52,6 +52,7 @@ Gate 4 now binds `ReadNeedReviewResynthesisRuntime` (`readNeedReviewRuntime` rou ### Gate 5: ReadFitsFinding AssetPack Preview And Quote Closure Implement and prove many-candidate Depository search, selected-fit provenance, source-safe AssetPack preview, deterministic BTD/BTC quote, and no pre-settlement source leakage. +Gate 5 now binds `ReadFitsFindingRuntime`, many-channel Depository search, `AssetPackPreviewBoundary`, quote receipt readback, selected-fit provenance, settlement instructions, delivery posture, harness evidence summaries, Terminal preview/quote/provenance rows, `.bitcode/v42-readfitsfinding-preview-quote.json`, and `check:v42-gate5`. ### Gate 6: Settlement Rights Transfer And Repository Delivery Closure diff --git a/BITCODE_SPEC_V42_NOTES.md b/BITCODE_SPEC_V42_NOTES.md index 098818f0..139f5316 100644 --- a/BITCODE_SPEC_V42_NOTES.md +++ b/BITCODE_SPEC_V42_NOTES.md @@ -61,6 +61,14 @@ V42 must make the preview valuable without leaking the source-bearing AssetPack Readers may see measurements, fit confidence, quote posture, selected-fit provenance summaries, proof roots, and source-safe explanations. They may not see protected source, raw provider responses, protected prompts, private settlement payloads, wallet private material, or unpaid AssetPack source before BTC settlement and BTD rights transfer. +## Gate 5 implementation notes + +Gate 5 closes the source-safe Finding Fits preview boundary. +`ReadFitsFindingSynthesis` must already have an accepted Need, then search many Depository candidates across lexical, symbolic, path, metadata, measurement, embedding-vector, and provider-specific channels. +Selected-fit provenance carries selected candidate ids, fit deposit ids, query and ranking roots, proof roots, measurement roots, and reconciliation readback roots. +`AssetPackPreviewBoundary` is the review object before payment: it contains the source-safe preview, deterministic quote receipt, disclosure review, settlement instructions, delivery lock, storage projection, replay receipt, and repair posture. +The route and Terminal readback expose those fields as metadata only; protected source and unpaid AssetPack source remain absent until Gate 6 settlement, rights transfer, and delivery unlock. + ## AI-reading demonstration note The standalone demonstration should prove why Bitcode matters for AI-dominant Reading. diff --git a/BITCODE_SPEC_V42_PARITY_MATRIX.md b/BITCODE_SPEC_V42_PARITY_MATRIX.md index b87b9c7c..65c010b7 100644 --- a/BITCODE_SPEC_V42_PARITY_MATRIX.md +++ b/BITCODE_SPEC_V42_PARITY_MATRIX.md @@ -36,7 +36,7 @@ This matrix records the reliable MVP product surfaces that must become promotion | Depositing shortest path | Source material can be admitted with Depository proof and compensation visibility | `.bitcode/v42-depositing-shortest-path.json`, `DepositorySupplyCompensationPreview`, `/api/deposits`, Terminal deposit readback | implemented | | Reading state machine | Five-step Reading UX is route-owned, persistent, and source-safe | `.bitcode/v42-reading-shortest-path-state-machine.json`, `TerminalEnterpriseReadingRouteState`, `readingStage`, route/retry/failure tests | implemented | | ReadNeed product closure | Need synthesis, review, feedback, resynthesis, accepted-Need admission, rejected Need blockers, source-safe telemetry, and Terminal runtime readback are product-ready | `.bitcode/v42-readneed-review-resynthesis-product-closure.json`, `ReadNeedReviewResynthesisRuntime`, `/api/read-review`, Terminal Need runtime readback | implemented | -| Finding Fits preview and quote | Many-candidate search, selected-fit provenance, source-safe preview, and quote are product-ready | later V42 Gate 5 artifact | draft-required | +| Finding Fits preview and quote | Many-candidate search, selected-fit provenance, source-safe preview, and quote are product-ready | `.bitcode/v42-readfitsfinding-preview-quote.json`, `ReadFitsFindingRuntime`, `AssetPackPreviewBoundary`, harness preview summary, Terminal preview/quote/provenance readback | implemented | | Settlement and delivery | BTC/BTD settlement, rights transfer, compensation, and repository PR delivery are synchronized | later V42 Gate 6 artifact | draft-required | | AI-reading demonstration | Standalone demonstration proves AssetPack improves AI beyond public-data-only baseline | later V42 Gate 7 artifact | draft-required | | Local/staging rehearsal | Full MVP path rehearsed locally and in staging-testnet with mainnet blocked | later V42 Gate 8 artifact | draft-required | @@ -50,7 +50,7 @@ This matrix records the reliable MVP product surfaces that must become promotion | Gate 2 | Depositing shortest path and compensation visibility artifact | implemented | | Gate 3 | Reading shortest path state machine artifact | implemented | | Gate 4 | ReadNeed review and resynthesis product closure artifact | implemented | -| Gate 5 | ReadFitsFinding AssetPack preview and quote closure artifact | draft-required | +| Gate 5 | ReadFitsFinding AssetPack preview and quote closure artifact | implemented | | Gate 6 | Settlement rights transfer and repository delivery closure artifact | draft-required | | Gate 7 | AI-reading dominant demonstration MVP artifact | draft-required | | Gate 8 | Local and staging-testnet full MVP rehearsal artifact | draft-required | diff --git a/README.md b/README.md index 48298c20..dbc40710 100644 --- a/README.md +++ b/README.md @@ -106,6 +106,16 @@ rejected Need blockers, PTRR/Failsafe/Thricified telemetry receipts, Terminal Need runtime readback, `.bitcode/v42-readneed-review-resynthesis-product-closure.json`, and `check:v42-gate4`. +V42 Gate 5 adds Finding Fits preview and quote closure with +accepted-Need-gated `ReadFitsFindingRuntime`, many-channel Depository search, +selected-fit provenance, `AssetPackPreviewBoundary`, deterministic +share-to-fee quote receipts, disclosure review, settlement instructions, +delivery lock, harness evidence summaries, Terminal preview/quote/provenance +readback, `.bitcode/v42-readfitsfinding-preview-quote.json`, and +`check:v42-gate5`. The preview remains metadata-only before settlement: +protected source, unpaid AssetPack source, wallet private material, private +settlement payloads, credentials, raw protected prompts, and raw provider +responses stay out of route and UI readback. V43+ is roadmapped as the later agentic depositing evolution: repository agents synthesize deposit AssetPack options from connected enterprise code, Depository state, and Reading demand; enterprises approve or reject diff --git a/SPECIFICATIONS_ROADMAP.md b/SPECIFICATIONS_ROADMAP.md index 7bd3c34c..2d2fe120 100644 --- a/SPECIFICATIONS_ROADMAP.md +++ b/SPECIFICATIONS_ROADMAP.md @@ -5,13 +5,14 @@ - Current active canonical pointer: `BITCODE_SPEC.txt` -> `V41` - Current active canon: `BITCODE_SPEC_V41.md` - Current draft target: `BITCODE_SPEC_V42.md`. -- Current working gate: V42 Gate 4 ReadNeed Review And Resynthesis Product Closure. -- Next queued gate after V42 Gate 4: V42 Gate 5 ReadFitsFinding AssetPack Preview And Quote Closure. +- Current working gate: V42 Gate 5 ReadFitsFinding AssetPack Preview And Quote Closure. +- Next queued gate after V42 Gate 5: V42 Gate 6 Settlement Rights Transfer And Repository Delivery Closure. - Latest closed version: V41 Prompt And PromptPart Excellence, which promoted PromptPart and Prompt inventory, registry interpolation contracts, Reading prompt baselines, ReadNeedComprehensionSynthesis prompt hardening, ReadFitsFindingSynthesis prompt hardening, Conversation/tool/interface prompt rewrite, prompt benchmark telemetry, and V41 promotion readiness. - Recent V42 opening anchor: reliable MVP experience opens over promoted V41 with V42 SPEC, DELTA, NOTES, and PARITY files, `check:v42-gate1`, active V41 / draft V42 posture, and a nine-gate plan for shortest-path Depositing, five-step Reading, ReadNeed product closure, ReadFitsFinding preview and quote closure, settlement and repository delivery, AI-reading demonstration, local/staging rehearsal, and promotion readiness. - V42 Gate 2 closure anchor: reliable MVP experience now owns source-safe Depositing compensation visibility through `DepositorySupplyCompensationPreview`, deposit route `depositoryEvidence.compensationPreview`, deterministic `.bitcode/v42-depositing-shortest-path.json`, route/API readiness checks, source validation, Depository search/vector/storage projection, source-to-shares compensation readback keys, Terminal compensation roots, focused package/protocol tests, workflow wiring, and `check:v42-gate2`. - V42 Gate 3 closure anchor: reliable MVP experience now owns the five-step Reading shortest path state machine through `TerminalEnterpriseReadingUxState`, `TerminalEnterpriseReadingRouteState`, recoverable transaction ids, `readingStage` route hydration, retry/restart posture, source-safe failure repair actions, accepted-Need blockers, source-safe preview blockers, rich Reading pipeline telemetry readback, deterministic `.bitcode/v42-reading-shortest-path-state-machine.json`, focused route/component/protocol tests, workflow wiring, and `check:v42-gate3`. - V42 Gate 4 closure anchor: reliable MVP experience now owns ReadNeed product closure through `ReadNeedReviewResynthesisRuntime`, source-safe storage projection, reviewed Need feedback/resynthesis lineage, accepted-Need Finding Fits admission, rejected Need blockers, PTRR/Failsafe/Thricified telemetry receipts, Terminal Need runtime/storage/telemetry readback, deterministic `.bitcode/v42-readneed-review-resynthesis-product-closure.json`, focused package/route/protocol tests, workflow wiring, and `check:v42-gate4`. +- V42 Gate 5 closure anchor: reliable MVP experience now owns ReadFitsFinding preview and quote closure through accepted-Need-gated `ReadFitsFindingRuntime`, many-channel Depository search, selected-fit provenance, `AssetPackPreviewBoundary`, deterministic share-to-fee quote receipts, disclosure review, settlement instructions, delivery lock, harness evidence summaries, Terminal preview/quote/provenance readback, deterministic `.bitcode/v42-readfitsfinding-preview-quote.json`, focused package/route/protocol tests, workflow wiring, and `check:v42-gate5`. - Recent V41 closure anchor: V41 canonical promotion updated `BITCODE_SPEC.txt` to `V41`, generated `BITCODE_SPEC_V41_PROVEN.md`, preserved active V41 / draft V42 runtime posture, and closed prompt-program excellence canon. - Recent V40 closure anchor: V40 canonical promotion updated `BITCODE_SPEC.txt` to `V40`, generated `BITCODE_SPEC_V40_PROVEN.md`, preserved active V40 / draft V41 runtime posture, and closed exhaustive commercial application testing canon. - Recent V39 closure anchor: V39 canonical promotion updated `BITCODE_SPEC.txt` to `V39`, generated `BITCODE_SPEC_V39_PROVEN.md`, preserved active V39 / draft V40 runtime posture, and closed commercial Reading readiness canon. diff --git a/package.json b/package.json index 4cfaeee3..6593a435 100644 --- a/package.json +++ b/package.json @@ -313,6 +313,9 @@ "generate:v42-readneed-review-resynthesis-product-closure": "node scripts/generate-v42-readneed-review-resynthesis-product-closure.mjs", "check:v42-readneed-review-resynthesis-product-closure": "node scripts/generate-v42-readneed-review-resynthesis-product-closure.mjs --check", "check:v42-gate4": "node scripts/check-v42-gate4-readneed-review-resynthesis-product-closure.mjs", + "generate:v42-readfitsfinding-preview-quote": "node scripts/generate-v42-readfitsfinding-preview-quote.mjs", + "check:v42-readfitsfinding-preview-quote": "node scripts/generate-v42-readfitsfinding-preview-quote.mjs --check", + "check:v42-gate5": "node scripts/check-v42-gate5-readfitsfinding-preview-quote.mjs", "generate:v38-inference-surface-inventory": "node scripts/generate-v38-inference-surface-inventory.mjs", "check:v38-inference-surface-inventory": "node scripts/generate-v38-inference-surface-inventory.mjs --check", "check:v38-gate2": "node scripts/check-v38-gate2-inference-surface-inventory.mjs", diff --git a/packages/pipelines/asset-pack/README.md b/packages/pipelines/asset-pack/README.md index 051e9e77..9d328152 100644 --- a/packages/pipelines/asset-pack/README.md +++ b/packages/pipelines/asset-pack/README.md @@ -185,6 +185,14 @@ wallet private material, private settlement payloads, credentials, or unpaid source-bearing AssetPack content. Pull-request delivery remains withheld until BTC settlement, BTD rights transfer, and ledger/database/storage readback agree. +V42 Gate 5 binds this boundary into product closure through +`.bitcode/v42-readfitsfinding-preview-quote.json` and `check:v42-gate5`. +That proof requires accepted-Need admission, many-channel Depository search, +candidate ranking, selected-fit provenance, deterministic quote receipts, +source-safe disclosure review, settlement instructions, delivery lock, harness +route summaries, Terminal preview/quote/provenance readback, and focused +package/API/protocol tests before the paid boundary can proceed to Gate 6. + ## Settlement Rights Delivery `AssetPackSettlementRightsDeliveryBoundary` is the paid-boundary package diff --git a/packages/pipelines/asset-pack/src/__tests__/asset-pack-preview-boundary.test.ts b/packages/pipelines/asset-pack/src/__tests__/asset-pack-preview-boundary.test.ts index 03287d3c..a0a641e5 100644 --- a/packages/pipelines/asset-pack/src/__tests__/asset-pack-preview-boundary.test.ts +++ b/packages/pipelines/asset-pack/src/__tests__/asset-pack-preview-boundary.test.ts @@ -191,9 +191,15 @@ describe('AssetPack preview quote boundary', () => { expect(boundary.quoteReceipt.quoteRoot).toBe(boundary.sourceSafePreview.feeQuote.quoteRoot); expect(boundary.quoteReceipt.sats).toBeGreaterThanOrEqual(546); expect(boundary.quoteReceipt.quoteRoot).toBe(repeated.quoteReceipt.quoteRoot); + expect(boundary.quoteReceipt.deterministic).toBe(true); + expect(boundary.quoteReceipt.weightedAdmittedVolume).toBe(boundary.sourceSafePreview.feeQuote.weightedAdmittedVolume); + expect(boundary.settlementInstructions.sats).toBe(boundary.quoteReceipt.sats); + expect(boundary.settlementInstructions.quoteRoot).toBe(boundary.quoteReceipt.quoteRoot); expect(boundary.proofRoots.boundaryRoot).toBe(repeated.proofRoots.boundaryRoot); expect(boundary.selectedFitProvenance.selectedCandidates).toHaveLength(2); expect(boundary.selectedFitProvenance.selectedCandidates[0].proofRoot).toBe('sha256:proof-1'); + expect(boundary.storageProjection.every((record) => record.sourceSafety.sourceSafeMetadataOnly)).toBe(true); + expect(boundary.storageProjection.every((record) => record.sourceSafety.unpaidAssetPackSourceVisible === false)).toBe(true); expect(boundary.replayReceipt.verified).toEqual({ quoteRootMatchesPreview: true, disclosureReviewRootMatchesReview: true, diff --git a/packages/pipelines/asset-pack/src/__tests__/read-fits-finding-runtime.test.ts b/packages/pipelines/asset-pack/src/__tests__/read-fits-finding-runtime.test.ts index 9a2bcfcf..d68fbfce 100644 --- a/packages/pipelines/asset-pack/src/__tests__/read-fits-finding-runtime.test.ts +++ b/packages/pipelines/asset-pack/src/__tests__/read-fits-finding-runtime.test.ts @@ -181,6 +181,10 @@ describe('ReadFitsFinding runtime, ranking, and replay', () => { 'telemetry_receipt', ]), ); + expect(runtime.storageProjection.every((record) => record.sourceSafety.protectedSourceVisible === false)).toBe(true); + expect(runtime.storageProjection.every((record) => record.sourceSafety.rawProviderResponseVisible === false)).toBe(true); + expect(runtime.searchSummary.selectedCandidateCount).toBe(2); + expect(runtime.searchSummary.fitDepositAssetIds).toEqual(['fit-deposit-runtime-1', 'fit-deposit-runtime-2']); expect(runtime.sourceSafety).toMatchObject({ sourceSafetyClass: 'source_safe_read_fits_finding_runtime_metadata', protectedSourceVisible: false, diff --git a/packages/protocol/README.md b/packages/protocol/README.md index a32d34a9..1fa40812 100644 --- a/packages/protocol/README.md +++ b/packages/protocol/README.md @@ -210,6 +210,16 @@ source-safe Read Request and Need storage, feedback lineage, Need measurement, accepted-Need admission, rejected Need blockers, PTRR/Failsafe/Thricified telemetry receipts, `/api/read-review` action coverage, Terminal runtime readback, and source-safe disclosure boundaries. +V42 Gate 5 adds `V42ReadFitsFindingPreviewQuote` through +`packages/protocol/src/canonical/v42-readfitsfinding-preview-quote.js`, +`packages/protocol/test/v42-readfitsfinding-preview-quote.test.js`, +`.bitcode/v42-readfitsfinding-preview-quote.json`, and `check:v42-gate5`. +It proves accepted-Need-gated Finding Fits, many-channel Depository search, +candidate ranking, selected-fit provenance, source-safe AssetPack preview, +deterministic share-to-fee quote receipts, disclosure review, settlement +instructions, delivery lock, harness route summaries, Terminal +preview/quote/provenance readback, and no pre-settlement protected source or +unpaid AssetPack source exposure. V40 Gate 2 adds `V40TestInventoryCoverageMatrix` through `packages/protocol/src/canonical/v40-test-inventory-coverage-matrix.js`, `packages/protocol/test/v40-test-inventory-coverage-matrix.test.js`, diff --git a/packages/protocol/src/canonical/v42-readfitsfinding-preview-quote.js b/packages/protocol/src/canonical/v42-readfitsfinding-preview-quote.js new file mode 100644 index 00000000..577db1f0 --- /dev/null +++ b/packages/protocol/src/canonical/v42-readfitsfinding-preview-quote.js @@ -0,0 +1,343 @@ +// @ts-check + +import crypto from 'node:crypto'; +import { existsSync, readFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const DEFAULT_REPO_ROOT = path.resolve(__dirname, '..', '..', '..', '..'); + +export const V42_READFITSFINDING_PREVIEW_QUOTE_ARTIFACT_PATH = + '.bitcode/v42-readfitsfinding-preview-quote.json'; +export const V42_READFITSFINDING_PREVIEW_QUOTE_SCHEMA_ID = + 'bitcode.v42.readFitsFindingPreviewQuote.v1'; +export const V42_READFITSFINDING_PREVIEW_QUOTE_VERSION = 'V42'; +export const V42_READFITSFINDING_PREVIEW_QUOTE_CURRENT_TARGET = 'V41'; +export const V42_READFITSFINDING_PREVIEW_QUOTE_SOURCE_SAFETY_VERDICT = + 'source-safe-readfitsfinding-preview-quote-metadata'; + +export const V42_READFITSFINDING_PREVIEW_QUOTE_ROW_IDS = Object.freeze([ + 'admission:accepted-need-required', + 'search:many-candidate-depository-discovery', + 'search:multi-channel-vector-provider-tooling', + 'ranking:candidate-ranking-and-thresholds', + 'provenance:selected-fit-provenance', + 'preview:source-safe-assetpack-preview', + 'quote:deterministic-share-to-fee-btc-quote', + 'disclosure:no-pre-settlement-source', + 'settlement:instructions-before-rights-transfer', + 'route:harness-preview-quote-summary', + 'ui:terminal-preview-quote-provenance-readback', + 'proof:tests-artifact-workflow', +]); + +const SOURCE_ROOTS = Object.freeze({ + depositorySearch: 'packages/pipelines/asset-pack/src/depository-search.ts', + readFitsFindingRuntime: 'packages/pipelines/asset-pack/src/read-fits-finding-runtime.ts', + assetPackPreviewBoundary: 'packages/pipelines/asset-pack/src/asset-pack-preview-boundary.ts', + readNeed: 'packages/pipelines/asset-pack/src/read-need.ts', + packageIndex: 'packages/pipelines/asset-pack/src/index.ts', + postprocess: 'packages/pipelines/asset-pack/src/postprocess.ts', + readingPipelineContract: 'packages/pipelines/asset-pack/src/reading-pipeline-contract.ts', + depositorySearchTest: 'packages/pipelines/asset-pack/src/__tests__/depository-search.test.ts', + runtimeTest: 'packages/pipelines/asset-pack/src/__tests__/read-fits-finding-runtime.test.ts', + previewBoundaryTest: 'packages/pipelines/asset-pack/src/__tests__/asset-pack-preview-boundary.test.ts', + postprocessTest: 'packages/pipelines/asset-pack/src/__tests__/postprocess.test.ts', + harnessRunner: 'uapi/app/api/pipeline-harness/asset-pack/runner.ts', + harnessRouteTest: 'uapi/tests/api/pipelineHarnessRoute.test.ts', + terminalWorkbench: 'uapi/app/terminal/TerminalDepositReadWorkbench.tsx', + terminalHarnessClient: 'uapi/app/terminal/terminal-pipeline-harness-client.ts', + terminalHarnessClientTest: 'uapi/tests/terminalPipelineHarnessClient.test.ts', + gateWorkflow: '.github/workflows/bitcode-gate-quality.yml', + canonWorkflow: '.github/workflows/bitcode-canon-quality.yml', + v42Spec: 'BITCODE_SPEC_V42.md', + v42Delta: 'BITCODE_SPEC_V42_DELTA.md', + v42Notes: 'BITCODE_SPEC_V42_NOTES.md', + v42Parity: 'BITCODE_SPEC_V42_PARITY_MATRIX.md', + roadmap: 'SPECIFICATIONS_ROADMAP.md', + rootReadme: 'README.md', + terminalReadme: 'uapi/app/terminal/README.md', + assetPackReadme: 'packages/pipelines/asset-pack/README.md', + protocolReadme: 'packages/protocol/README.md', +}); + +const SEARCH_CHANNEL_IDS = Object.freeze([ + 'lexical', + 'symbolic', + 'path', + 'metadata', + 'measurement', + 'embedding-vector', + 'provider-specific', +]); + +const FORBIDDEN_PAYLOAD_CLASSES = Object.freeze([ + 'protected-source-payloads', + 'raw-protected-prompts', + 'raw-provider-responses', + 'unpaid-assetpack-source', + 'wallet-private-material', + 'settlement-private-payloads', + 'secret-values', +]); + +function digest(value) { + return crypto.createHash('sha256').update(value).digest('hex').slice(0, 24); +} + +function rowRoot(id) { + return `v42-readfitsfinding-preview-quote-row:${digest(id)}`; +} + +function readSource(repoRoot, sourcePath) { + const absolutePath = path.join(repoRoot, sourcePath); + return existsSync(absolutePath) ? readFileSync(absolutePath, 'utf8') : ''; +} + +function predicateResult(id, sourcePath, passed) { + return { id, sourcePath, passed: Boolean(passed) }; +} + +function row(input) { + return { + ...input, + rowRoot: rowRoot(input.rowId), + sourceSafetyClass: 'source_safe_readfitsfinding_preview_quote_metadata', + sourceSafeMetadataOnly: true, + protectedSourceVisible: false, + rawProtectedPromptVisible: false, + rawProviderResponseVisible: false, + unpaidAssetPackSourceVisible: false, + walletPrivateMaterialVisible: false, + settlementPrivatePayloadVisible: false, + credentialsSerialized: false, + forbiddenPayloadClasses: [...FORBIDDEN_PAYLOAD_CLASSES], + }; +} + +export const V42_READFITSFINDING_PREVIEW_QUOTE_ROWS = Object.freeze([ + row({ + rowId: 'admission:accepted-need-required', + purpose: + 'Require an accepted ReadNeedComprehensionSynthesis Need before ReadFitsFindingSynthesis can search or preview an AssetPack.', + sourceRoots: [SOURCE_ROOTS.readNeed, SOURCE_ROOTS.readFitsFindingRuntime, SOURCE_ROOTS.terminalWorkbench], + emittedTypes: ['ReadFitsFindingAdmission', 'accepted_need_admission'], + requiredEvidence: ['accepted_read_need_missing', 'findingFitsAdmission', 'acceptedNeed'], + }), + row({ + rowId: 'search:many-candidate-depository-discovery', + purpose: + 'Search Depository AssetPack supply for many candidates above threshold before selecting the fit set.', + sourceRoots: [SOURCE_ROOTS.depositorySearch, SOURCE_ROOTS.depositorySearchTest], + emittedTypes: ['DepositorySearchResult', 'DepositoryCandidate'], + requiredEvidence: ['searchedAssetCount', 'candidateRanking', 'maxSelectedCandidates'], + }), + row({ + rowId: 'search:multi-channel-vector-provider-tooling', + purpose: + 'Bind lexical, symbolic, path, metadata, measurement, embedding-vector, and provider-specific search channels to source-safe tool receipts.', + sourceRoots: [SOURCE_ROOTS.depositorySearch, SOURCE_ROOTS.readFitsFindingRuntime], + emittedTypes: ['ReadFitsFindingSynthesisSearchReceipt', 'DepositorySearchQueryPlan'], + requiredEvidence: [...SEARCH_CHANNEL_IDS, 'ReadFitsFindingSynthesis.tool.vector-depository-search'], + }), + row({ + rowId: 'ranking:candidate-ranking-and-thresholds', + purpose: + 'Rank candidates with deterministic scores, thresholds, blockers, rejected counts, and proof/measurement requirements.', + sourceRoots: [SOURCE_ROOTS.depositorySearch, SOURCE_ROOTS.depositorySearchTest], + emittedTypes: ['DepositoryCandidateRanking', 'DepositoryCandidateFitEvidence'], + requiredEvidence: ['finalScore', 'semanticScore', 'proofScore', 'measurementScore', 'rejectedCandidateCount'], + }), + row({ + rowId: 'provenance:selected-fit-provenance', + purpose: + 'Persist selected fit provenance with selected candidate ids, fit deposit ids, proof roots, measurement roots, and reconciliation roots.', + sourceRoots: [SOURCE_ROOTS.readFitsFindingRuntime, SOURCE_ROOTS.assetPackPreviewBoundary, SOURCE_ROOTS.runtimeTest], + emittedTypes: ['selected_fit_provenance', 'AssetPackPreviewSelectedFitProvenance'], + requiredEvidence: ['selectedFitProvenanceRoot', 'fitDepositAssetIds', 'reconciliationReadbackRoot'], + }), + row({ + rowId: 'preview:source-safe-assetpack-preview', + purpose: + 'Create the source-safe AssetPack preview that exposes measurements, fit posture, roots, and delivery posture while source stays locked.', + sourceRoots: [SOURCE_ROOTS.assetPackPreviewBoundary, SOURCE_ROOTS.readNeed, SOURCE_ROOTS.previewBoundaryTest], + emittedTypes: ['AssetPackSourceSafePreview', 'AssetPackPreviewBoundary'], + requiredEvidence: ['sourceSafePreview', 'AssetPackPreviewBoundary', 'sourceBearingDeliveryVisible'], + }), + row({ + rowId: 'quote:deterministic-share-to-fee-btc-quote', + purpose: + 'Read back deterministic BTD/BTC quote calculation from measurement weight, measurement volume, admitted fit quality, dust floor, and minimum sats.', + sourceRoots: [SOURCE_ROOTS.readNeed, SOURCE_ROOTS.assetPackPreviewBoundary, SOURCE_ROOTS.previewBoundaryTest], + emittedTypes: ['ShareToFeeQuote', 'AssetPackPreviewQuoteReceipt'], + requiredEvidence: ['sum(measurement.weight * measurement.volume * admitted_fit_quality)', 'deterministic', 'quoteRoot'], + }), + row({ + rowId: 'disclosure:no-pre-settlement-source', + purpose: + 'Fail closed when preview, telemetry, route summary, or UI readback would expose protected source or unpaid AssetPack source before settlement.', + sourceRoots: [SOURCE_ROOTS.assetPackPreviewBoundary, SOURCE_ROOTS.harnessRunner, SOURCE_ROOTS.terminalWorkbench], + emittedTypes: ['AssetPackDisclosureReview', 'AssetPackPreviewBoundarySourceSafety'], + requiredEvidence: ['protectedSourceVisible: false', 'unpaidAssetPackSourceVisible: false', 'credentialsSerialized: false'], + }), + row({ + rowId: 'settlement:instructions-before-rights-transfer', + purpose: + 'Expose source-safe settlement instructions and delivery lock before Gate 6 rights-transfer and repository delivery unlock.', + sourceRoots: [SOURCE_ROOTS.assetPackPreviewBoundary, SOURCE_ROOTS.previewBoundaryTest], + emittedTypes: ['AssetPackPreviewSettlementInstructions', 'AssetPackPreviewDeliveryPosture'], + requiredEvidence: ['quote_ready_settlement_required', 'reader_wallet_authorized_before_broadcast', 'withheld_until_settlement'], + }), + row({ + rowId: 'route:harness-preview-quote-summary', + purpose: + 'Summarize preview boundary, quote receipt, selected-fit provenance, settlement instructions, delivery posture, and disclosure review through the pipeline harness route without source payloads.', + sourceRoots: [SOURCE_ROOTS.harnessRunner, SOURCE_ROOTS.harnessRouteTest], + emittedTypes: ['assetPackPreviewBoundary', 'assetPackQuoteReceipt', 'assetPackSettlementInstructions', 'assetPackDeliveryPosture'], + requiredEvidence: ['summarizeAssetPackPreviewBoundary', 'assetPackPreviewBoundary', 'storageRecordCount'], + }), + row({ + rowId: 'ui:terminal-preview-quote-provenance-readback', + purpose: + 'Render Terminal Finding Fits preview, quote, provenance, settlement, delivery, and replay roots as expandable source-safe metadata.', + sourceRoots: [SOURCE_ROOTS.terminalWorkbench, SOURCE_ROOTS.terminalHarnessClient, SOURCE_ROOTS.terminalHarnessClientTest], + emittedTypes: ['assetPackPreviewBoundaryRows', 'TerminalReadFitsFindingSynthesisHarnessStreamSnapshot'], + requiredEvidence: ['Finding Fits preview, quote, and provenance', 'quote_ready_settlement_required', 'withheld_until_settlement'], + }), + row({ + rowId: 'proof:tests-artifact-workflow', + purpose: + 'Bind V42 Gate 5 closure to package tests, UAPI tests, protocol artifact tests, docs, scripts, workflows, and generated source-safe proof.', + sourceRoots: [ + SOURCE_ROOTS.depositorySearchTest, + SOURCE_ROOTS.runtimeTest, + SOURCE_ROOTS.previewBoundaryTest, + SOURCE_ROOTS.harnessRouteTest, + SOURCE_ROOTS.gateWorkflow, + SOURCE_ROOTS.canonWorkflow, + SOURCE_ROOTS.v42Spec, + SOURCE_ROOTS.v42Parity, + SOURCE_ROOTS.roadmap, + ], + emittedTypes: ['V42ReadFitsFindingPreviewQuote'], + requiredEvidence: ['check-v42-gate5-readfitsfinding-preview-quote.mjs', 'v42-readfitsfinding-preview-quote'], + }), +]); + +function buildPredicateResults(repoRoot) { + const depositorySearch = readSource(repoRoot, SOURCE_ROOTS.depositorySearch); + const runtime = readSource(repoRoot, SOURCE_ROOTS.readFitsFindingRuntime); + const previewBoundary = readSource(repoRoot, SOURCE_ROOTS.assetPackPreviewBoundary); + const readNeed = readSource(repoRoot, SOURCE_ROOTS.readNeed); + const packageIndex = readSource(repoRoot, SOURCE_ROOTS.packageIndex); + const postprocess = readSource(repoRoot, SOURCE_ROOTS.postprocess); + const contract = readSource(repoRoot, SOURCE_ROOTS.readingPipelineContract); + const depositorySearchTest = readSource(repoRoot, SOURCE_ROOTS.depositorySearchTest); + const runtimeTest = readSource(repoRoot, SOURCE_ROOTS.runtimeTest); + const previewBoundaryTest = readSource(repoRoot, SOURCE_ROOTS.previewBoundaryTest); + const postprocessTest = readSource(repoRoot, SOURCE_ROOTS.postprocessTest); + const harnessRunner = readSource(repoRoot, SOURCE_ROOTS.harnessRunner); + const harnessRouteTest = readSource(repoRoot, SOURCE_ROOTS.harnessRouteTest); + const terminalWorkbench = readSource(repoRoot, SOURCE_ROOTS.terminalWorkbench); + const terminalHarnessClient = readSource(repoRoot, SOURCE_ROOTS.terminalHarnessClient); + const terminalHarnessClientTest = readSource(repoRoot, SOURCE_ROOTS.terminalHarnessClientTest); + const gateWorkflow = readSource(repoRoot, SOURCE_ROOTS.gateWorkflow); + const canonWorkflow = readSource(repoRoot, SOURCE_ROOTS.canonWorkflow); + const spec = readSource(repoRoot, SOURCE_ROOTS.v42Spec); + const delta = readSource(repoRoot, SOURCE_ROOTS.v42Delta); + const notes = readSource(repoRoot, SOURCE_ROOTS.v42Notes); + const parity = readSource(repoRoot, SOURCE_ROOTS.v42Parity); + const roadmap = readSource(repoRoot, SOURCE_ROOTS.roadmap); + const rootReadme = readSource(repoRoot, SOURCE_ROOTS.rootReadme); + const terminalReadme = readSource(repoRoot, SOURCE_ROOTS.terminalReadme); + const assetPackReadme = readSource(repoRoot, SOURCE_ROOTS.assetPackReadme); + const protocolReadme = readSource(repoRoot, SOURCE_ROOTS.protocolReadme); + + return [ + predicateResult('accepted-need-gates-finding-fits', SOURCE_ROOTS.readFitsFindingRuntime, runtime.includes('admitReadFitsFinding') && runtime.includes('accepted_need_admission') && runtime.includes('accept_read_need')), + predicateResult('search-defines-many-channel-ids', SOURCE_ROOTS.depositorySearch, SEARCH_CHANNEL_IDS.every((id) => depositorySearch.includes(`'${id}'`))), + predicateResult('search-defines-tool-ids', SOURCE_ROOTS.depositorySearch, depositorySearch.includes('ReadFitsFindingSynthesis.tool.lexical-depository-search') && depositorySearch.includes('ReadFitsFindingSynthesis.tool.vector-depository-search')), + predicateResult('search-covers-provider-embedding-policy', SOURCE_ROOTS.depositorySearch, depositorySearch.includes('embeddingPolicy') && depositorySearch.includes('providerIds') && depositorySearch.includes('selectedFitProvenanceRoot')), + predicateResult('search-tests-many-candidates', SOURCE_ROOTS.depositorySearchTest, depositorySearchTest.includes('discovers every qualifying fit deposit') && depositorySearchTest.includes('selectedFitProvenanceRoot')), + predicateResult('runtime-persists-selected-fit-provenance', SOURCE_ROOTS.readFitsFindingRuntime, runtime.includes('selected_fit_provenance') && runtime.includes('ReadFitsFindingReplayReceipt') && runtime.includes('persistReadFitsFindingRuntime')), + predicateResult('runtime-telemetry-counts', SOURCE_ROOTS.readFitsFindingRuntime, runtime.includes('phaseIds') && runtime.includes('failsafeSequenceIds') && runtime.includes('thricifiedGenerationIds')), + predicateResult('runtime-tests-source-safe-counts', SOURCE_ROOTS.runtimeTest, runtimeTest.includes('source_safe_read_fits_finding_runtime_metadata') && runtimeTest.includes('thricifiedGenerationIds') && runtimeTest.includes('fitDepositAssetIds')), + predicateResult('preview-boundary-defines-quote-provenance-settlement-delivery', SOURCE_ROOTS.assetPackPreviewBoundary, previewBoundary.includes('AssetPackPreviewQuoteReceipt') && previewBoundary.includes('AssetPackPreviewSelectedFitProvenance') && previewBoundary.includes('AssetPackPreviewSettlementInstructions') && previewBoundary.includes('AssetPackPreviewDeliveryPosture')), + predicateResult('preview-boundary-source-safety', SOURCE_ROOTS.assetPackPreviewBoundary, previewBoundary.includes('source_safe_assetpack_preview_quote_boundary') && previewBoundary.includes('unpaidAssetPackSourceVisible: false') && previewBoundary.includes('walletPrivateMaterialVisible: false')), + predicateResult('quote-formula-implemented', SOURCE_ROOTS.readNeed, readNeed.includes('sum(measurement.weight * measurement.volume * admitted_fit_quality)') && readNeed.includes('weightedAdmittedVolume') && readNeed.includes('minimumSats')), + predicateResult('preview-tests-cover-determinism-and-storage-safety', SOURCE_ROOTS.previewBoundaryTest, previewBoundaryTest.includes('deterministic') && previewBoundaryTest.includes('quoteRoot') && previewBoundaryTest.includes('unpaidAssetPackSourceVisible')), + predicateResult('package-postprocess-surfaces-boundary', SOURCE_ROOTS.postprocess, packageIndex.includes('assetPackPreviewBoundary') && postprocess.includes('assetPackQuoteReceipt') && postprocessTest.includes('assetPackPreviewBoundary')), + predicateResult('contract-keeps-readfitsfinding-topology', SOURCE_ROOTS.readingPipelineContract, contract.includes('ReadFitsFindingSynthesis.discovery') && contract.includes('ptrrStepCount') && contract.includes('thricifiedGenerationCount')), + predicateResult('harness-route-summarizes-preview-boundary', SOURCE_ROOTS.harnessRunner, harnessRunner.includes('summarizeAssetPackPreviewBoundary') && harnessRunner.includes('assetPackQuoteReceipt') && harnessRunner.includes('assetPackSettlementInstructions') && harnessRunner.includes('assetPackDeliveryPosture')), + predicateResult('harness-route-tests-preview-boundary-summary', SOURCE_ROOTS.harnessRouteTest, harnessRouteTest.includes('asset-pack-preview-boundary-route-test') && harnessRouteTest.includes('quote_ready_settlement_required') && harnessRouteTest.includes('storageRecordCount')), + predicateResult('terminal-ui-renders-preview-boundary-rows', SOURCE_ROOTS.terminalWorkbench, terminalWorkbench.includes('assetPackPreviewBoundaryRows') && terminalWorkbench.includes('Finding Fits preview, quote, and provenance') && terminalWorkbench.includes('assetPackSettlementInstructions')), + predicateResult('terminal-client-summarizes-boundary', SOURCE_ROOTS.terminalHarnessClient, terminalHarnessClient.includes('boundaryQuoteReceipt') && terminalHarnessClient.includes('boundarySelectedFitProvenance') && terminalHarnessClient.includes('boundaryDeliveryPosture')), + predicateResult('terminal-client-tests-boundary-summary', SOURCE_ROOTS.terminalHarnessClientTest, terminalHarnessClientTest.includes('assetPackPreviewBoundary') && terminalHarnessClientTest.includes('delivery withheld_until_settlement')), + predicateResult('spec-gate5-expanded', SOURCE_ROOTS.v42Spec, spec.includes('V42 Gate 5') && spec.includes('v42-readfitsfinding-preview-quote')), + predicateResult('delta-gate5-expanded', SOURCE_ROOTS.v42Delta, delta.includes('Gate 5') && delta.includes('source-safe AssetPack preview')), + predicateResult('notes-gate5-expanded', SOURCE_ROOTS.v42Notes, notes.includes('Gate 5 implementation notes') && notes.includes('selected-fit provenance')), + predicateResult('parity-gate5-implemented', SOURCE_ROOTS.v42Parity, parity.includes('Finding Fits preview and quote') && parity.includes('implemented')), + predicateResult('roadmap-advanced-to-gate5', SOURCE_ROOTS.roadmap, roadmap.includes('V42 Gate 5 closure anchor') && roadmap.includes('AssetPackPreviewBoundary')), + predicateResult('readmes-document-gate5', SOURCE_ROOTS.rootReadme, rootReadme.includes('V42 Gate 5') && terminalReadme.includes('Finding Fits preview') && assetPackReadme.includes('V42 Gate 5') && protocolReadme.includes('V42ReadFitsFindingPreviewQuote')), + predicateResult('workflows-run-gate5-check', SOURCE_ROOTS.gateWorkflow, gateWorkflow.includes('check-v42-gate5-readfitsfinding-preview-quote.mjs') && canonWorkflow.includes('check-v42-gate5-readfitsfinding-preview-quote.mjs')), + ]; +} + +export function buildV42ReadFitsFindingPreviewQuote(options = {}) { + const repoRoot = options.repoRoot || DEFAULT_REPO_ROOT; + const predicateResults = buildPredicateResults(repoRoot); + const failedPredicateIds = predicateResults + .filter((predicate) => !predicate.passed) + .map((predicate) => predicate.id); + const rowRoots = V42_READFITSFINDING_PREVIEW_QUOTE_ROWS.map((item) => item.rowRoot); + const artifactRoot = `v42-readfitsfinding-preview-quote:${digest(JSON.stringify({ + rowRoots, + failedPredicateIds, + }))}`; + + return { + artifactId: 'v42-readfitsfinding-preview-quote', + schemaId: V42_READFITSFINDING_PREVIEW_QUOTE_SCHEMA_ID, + version: V42_READFITSFINDING_PREVIEW_QUOTE_VERSION, + currentTarget: V42_READFITSFINDING_PREVIEW_QUOTE_CURRENT_TARGET, + sourceSafetyVerdict: V42_READFITSFINDING_PREVIEW_QUOTE_SOURCE_SAFETY_VERDICT, + generatedAt: 'deterministic', + artifactRoot, + passed: failedPredicateIds.length === 0, + rows: V42_READFITSFINDING_PREVIEW_QUOTE_ROWS, + rowIds: [...V42_READFITSFINDING_PREVIEW_QUOTE_ROW_IDS], + predicateResults, + coverage: { + rowCount: V42_READFITSFINDING_PREVIEW_QUOTE_ROWS.length, + requiredPredicateCount: predicateResults.length, + passedPredicateCount: predicateResults.length - failedPredicateIds.length, + failedPredicateIds, + pipelineName: 'ReadFitsFindingSynthesis', + requiredPriorPipelineName: 'ReadNeedComprehensionSynthesis', + phaseCount: 7, + agentCount: 8, + ptrrStepCount: 32, + failsafeSequenceCount: 96, + thricifiedGenerationCount: 96, + searchChannelIds: [...SEARCH_CHANNEL_IDS], + selectedFitProvenanceRequired: true, + sourceSafePreviewRequired: true, + deterministicQuoteRequired: true, + noProtectedSourceBeforeSettlement: true, + settlementInstructionsRequired: true, + terminalPreviewQuoteReadbackCovered: true, + sourceSafeMetadataOnly: true, + protectedSourceVisible: false, + rawProtectedPromptVisible: false, + rawProviderResponseVisible: false, + unpaidAssetPackSourceVisible: false, + walletPrivateMaterialVisible: false, + settlementPrivatePayloadVisible: false, + credentialsSerialized: false, + legacySourceRoots: Object.values(SOURCE_ROOTS).some((sourcePath) => sourcePath.includes('_legacy/')), + }, + sourceRoots: SOURCE_ROOTS, + }; +} diff --git a/packages/protocol/src/index.d.ts b/packages/protocol/src/index.d.ts index eee3699b..3efaa2a1 100644 --- a/packages/protocol/src/index.d.ts +++ b/packages/protocol/src/index.d.ts @@ -538,6 +538,14 @@ export const V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_SOURCE_SAFETY_VERDI export const V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_ROW_IDS: readonly string[]; export const V42_READNEED_REVIEW_RESYNTHESIS_PRODUCT_CLOSURE_ROWS: readonly Record[]; export function buildV42ReadNeedReviewResynthesisProductClosure(input?: Record): BitcodeProtocolReport; +export const V42_READFITSFINDING_PREVIEW_QUOTE_ARTIFACT_PATH: string; +export const V42_READFITSFINDING_PREVIEW_QUOTE_CURRENT_TARGET: string; +export const V42_READFITSFINDING_PREVIEW_QUOTE_SCHEMA_ID: string; +export const V42_READFITSFINDING_PREVIEW_QUOTE_VERSION: string; +export const V42_READFITSFINDING_PREVIEW_QUOTE_SOURCE_SAFETY_VERDICT: string; +export const V42_READFITSFINDING_PREVIEW_QUOTE_ROW_IDS: readonly string[]; +export const V42_READFITSFINDING_PREVIEW_QUOTE_ROWS: readonly Record[]; +export function buildV42ReadFitsFindingPreviewQuote(input?: Record): BitcodeProtocolReport; export const EXCHANGE_INTENT_ORDER_CONTRACTS_ARTIFACT_PATH: string; export const EXCHANGE_INTENT_ORDER_CONTRACTS_CURRENT_TARGET: string; export const EXCHANGE_INTENT_ORDER_CONTRACTS_SCHEMA_ID: string; diff --git a/packages/protocol/src/index.js b/packages/protocol/src/index.js index 358610d2..0d56bca1 100644 --- a/packages/protocol/src/index.js +++ b/packages/protocol/src/index.js @@ -602,6 +602,16 @@ export { V42_READNEED_REVIEW_RESYNTHESIS_SCHEMA_ID, buildV42ReadNeedReviewResynthesisProductClosure } from './canonical/v42-readneed-review-resynthesis-product-closure.js'; +export { + V42_READFITSFINDING_PREVIEW_QUOTE_ARTIFACT_PATH, + V42_READFITSFINDING_PREVIEW_QUOTE_CURRENT_TARGET, + V42_READFITSFINDING_PREVIEW_QUOTE_ROW_IDS, + V42_READFITSFINDING_PREVIEW_QUOTE_ROWS, + V42_READFITSFINDING_PREVIEW_QUOTE_SCHEMA_ID, + V42_READFITSFINDING_PREVIEW_QUOTE_SOURCE_SAFETY_VERDICT, + V42_READFITSFINDING_PREVIEW_QUOTE_VERSION, + buildV42ReadFitsFindingPreviewQuote +} from './canonical/v42-readfitsfinding-preview-quote.js'; export { EXCHANGE_INTENT_ACTION_KINDS, EXCHANGE_INTENT_ORDER_CONTRACTS_ARTIFACT_PATH, diff --git a/packages/protocol/test/v42-readfitsfinding-preview-quote.test.js b/packages/protocol/test/v42-readfitsfinding-preview-quote.test.js new file mode 100644 index 00000000..169a499c --- /dev/null +++ b/packages/protocol/test/v42-readfitsfinding-preview-quote.test.js @@ -0,0 +1,80 @@ +import assert from 'node:assert/strict'; +import test from 'node:test'; + +import { + V42_READFITSFINDING_PREVIEW_QUOTE_ARTIFACT_PATH, + V42_READFITSFINDING_PREVIEW_QUOTE_ROWS, + V42_READFITSFINDING_PREVIEW_QUOTE_ROW_IDS, + V42_READFITSFINDING_PREVIEW_QUOTE_SCHEMA_ID, + V42_READFITSFINDING_PREVIEW_QUOTE_SOURCE_SAFETY_VERDICT, + buildV42ReadFitsFindingPreviewQuote, +} from '../src/canonical/v42-readfitsfinding-preview-quote.js'; + +test('V42 ReadFitsFinding preview and quote closure binds search, provenance, preview, and quote', () => { + const report = buildV42ReadFitsFindingPreviewQuote(); + + assert.equal( + V42_READFITSFINDING_PREVIEW_QUOTE_ARTIFACT_PATH, + '.bitcode/v42-readfitsfinding-preview-quote.json', + ); + assert.equal(report.artifactId, 'v42-readfitsfinding-preview-quote'); + assert.equal(report.schemaId, V42_READFITSFINDING_PREVIEW_QUOTE_SCHEMA_ID); + assert.equal(report.version, 'V42'); + assert.equal(report.currentTarget, 'V41'); + assert.equal(report.sourceSafetyVerdict, V42_READFITSFINDING_PREVIEW_QUOTE_SOURCE_SAFETY_VERDICT); + assert.equal(report.passed, true); + assert.deepEqual(report.rowIds, [...V42_READFITSFINDING_PREVIEW_QUOTE_ROW_IDS]); + assert.equal(report.rows.length, V42_READFITSFINDING_PREVIEW_QUOTE_ROWS.length); + assert.equal(report.coverage.rowCount, 12); + assert.equal(report.coverage.pipelineName, 'ReadFitsFindingSynthesis'); + assert.equal(report.coverage.requiredPriorPipelineName, 'ReadNeedComprehensionSynthesis'); + assert.equal(report.coverage.phaseCount, 7); + assert.equal(report.coverage.agentCount, 8); + assert.equal(report.coverage.ptrrStepCount, 32); + assert.equal(report.coverage.failsafeSequenceCount, 96); + assert.equal(report.coverage.thricifiedGenerationCount, 96); + assert.deepEqual(report.coverage.searchChannelIds, [ + 'lexical', + 'symbolic', + 'path', + 'metadata', + 'measurement', + 'embedding-vector', + 'provider-specific', + ]); + assert.equal(report.coverage.selectedFitProvenanceRequired, true); + assert.equal(report.coverage.sourceSafePreviewRequired, true); + assert.equal(report.coverage.deterministicQuoteRequired, true); + assert.equal(report.coverage.noProtectedSourceBeforeSettlement, true); + assert.equal(report.coverage.settlementInstructionsRequired, true); + assert.equal(report.coverage.terminalPreviewQuoteReadbackCovered, true); + assert.equal(report.coverage.sourceSafeMetadataOnly, true); + assert.equal(report.coverage.protectedSourceVisible, false); + assert.equal(report.coverage.rawProtectedPromptVisible, false); + assert.equal(report.coverage.rawProviderResponseVisible, false); + assert.equal(report.coverage.unpaidAssetPackSourceVisible, false); + assert.equal(report.coverage.walletPrivateMaterialVisible, false); + assert.equal(report.coverage.settlementPrivatePayloadVisible, false); + assert.equal(report.coverage.credentialsSerialized, false); + assert.equal(report.coverage.legacySourceRoots, false); + assert.deepEqual(report.coverage.failedPredicateIds, []); + assert.ok(report.artifactRoot.startsWith('v42-readfitsfinding-preview-quote:')); +}); + +test('V42 ReadFitsFinding preview and quote rows remain source-safe metadata', () => { + for (const row of V42_READFITSFINDING_PREVIEW_QUOTE_ROWS) { + assert.ok(row.rowRoot.startsWith('v42-readfitsfinding-preview-quote-row:')); + assert.equal(row.sourceSafetyClass, 'source_safe_readfitsfinding_preview_quote_metadata'); + assert.equal(row.sourceSafeMetadataOnly, true); + assert.equal(row.protectedSourceVisible, false); + assert.equal(row.rawProtectedPromptVisible, false); + assert.equal(row.rawProviderResponseVisible, false); + assert.equal(row.unpaidAssetPackSourceVisible, false); + assert.equal(row.walletPrivateMaterialVisible, false); + assert.equal(row.settlementPrivatePayloadVisible, false); + assert.equal(row.credentialsSerialized, false); + assert.ok(row.forbiddenPayloadClasses.includes('protected-source-payloads')); + assert.ok(row.forbiddenPayloadClasses.includes('raw-provider-responses')); + assert.ok(row.forbiddenPayloadClasses.includes('unpaid-assetpack-source')); + } +}); diff --git a/scripts/check-v42-gate5-readfitsfinding-preview-quote.mjs b/scripts/check-v42-gate5-readfitsfinding-preview-quote.mjs new file mode 100644 index 00000000..86408c24 --- /dev/null +++ b/scripts/check-v42-gate5-readfitsfinding-preview-quote.mjs @@ -0,0 +1,268 @@ +#!/usr/bin/env node + +import { execFileSync } from 'node:child_process'; +import { existsSync, readFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const defaultRepoRoot = path.resolve(__dirname, '..'); +const ARTIFACT_PATH = '.bitcode/v42-readfitsfinding-preview-quote.json'; + +const SECRET_MARKERS = [ + `${['sk', 'proj'].join('-')}-`, + `${['sb', 'secret'].join('_')}__`, + ['service', 'role'].join('_'), + Buffer.from('{"alg":"HS256","typ":"JWT"}').toString('base64url').slice(0, 18), + ['OPENAI', 'API', 'KEY'].join('_'), + ['SUPABASE', 'SERVICE', 'ROLE'].join('_'), + ['VERCEL', 'TOKEN'].join('_'), + ['VERCEL', 'OIDC', 'TOKEN'].join('_'), + ['PRIVATE', 'KEY'].join('_'), +]; + +function read(root, relativePath) { + return readFileSync(path.join(root, relativePath), 'utf8'); +} + +function fileExists(root, relativePath) { + return existsSync(path.join(root, relativePath)); +} + +function git(root, args) { + return execFileSync('git', args, { cwd: root, encoding: 'utf8' }).trim(); +} + +function run(root, command, args) { + return execFileSync(command, args, { + cwd: root, + encoding: 'utf8', + stdio: ['ignore', 'pipe', 'pipe'], + }).trim(); +} + +function assertCheck(failures, condition, message) { + if (!condition) failures.push(message); +} + +function parseArgs(argv) { + const args = { + skipBranchCheck: false, + skipPackageTests: false, + skipUapiTests: false, + repoRoot: defaultRepoRoot, + help: false, + }; + + for (let index = 0; index < argv.length; index += 1) { + const arg = argv[index]; + if (arg === '--skip-branch-check') args.skipBranchCheck = true; + else if (arg === '--skip-package-tests') args.skipPackageTests = true; + else if (arg === '--skip-uapi-tests') args.skipUapiTests = true; + else if (arg === '--repo-root') args.repoRoot = path.resolve(argv[++index]); + else if (arg === '--help' || arg === '-h') args.help = true; + else throw new Error(`Unknown argument ${arg}`); + } + + return args; +} + +function printHelp() { + process.stdout.write( + [ + 'Usage: node scripts/check-v42-gate5-readfitsfinding-preview-quote.mjs [--skip-branch-check] [--skip-package-tests] [--skip-uapi-tests] [--repo-root ]', + '', + 'Checks V42 Gate 5 ReadFitsFinding preview and quote closure: many-candidate search, selected-fit provenance, source-safe AssetPack preview, deterministic quote, no pre-settlement source exposure, Terminal readback, tests, docs, workflows, and proof artifact.', + ].join('\n'), + ); + process.stdout.write('\n'); +} + +function main() { + const args = parseArgs(process.argv.slice(2)); + if (args.help) { + printHelp(); + return; + } + + const root = args.repoRoot; + const failures = []; + const pointer = read(root, 'BITCODE_SPEC.txt').trim(); + + assertCheck( + failures, + pointer === 'V41', + `BITCODE_SPEC.txt must remain V41 during V42 gate work. Observed ${pointer || 'empty'}.`, + ); + + if (!args.skipBranchCheck) { + const branch = git(root, ['branch', '--show-current']); + assertCheck( + failures, + branch === 'version/v42' || /^v42\/gate-(?:5|[6-9]|10)-[a-z0-9][a-z0-9-]*$/u.test(branch), + `V42 Gate 5+ work must occur on version/v42 or v42/gate-5..10-* branches. Observed ${branch || 'detached HEAD'}.`, + ); + } + + const requiredFiles = [ + ARTIFACT_PATH, + 'packages/pipelines/asset-pack/src/depository-search.ts', + 'packages/pipelines/asset-pack/src/read-fits-finding-runtime.ts', + 'packages/pipelines/asset-pack/src/asset-pack-preview-boundary.ts', + 'packages/pipelines/asset-pack/src/read-need.ts', + 'packages/pipelines/asset-pack/src/postprocess.ts', + 'packages/pipelines/asset-pack/src/__tests__/depository-search.test.ts', + 'packages/pipelines/asset-pack/src/__tests__/read-fits-finding-runtime.test.ts', + 'packages/pipelines/asset-pack/src/__tests__/asset-pack-preview-boundary.test.ts', + 'uapi/app/api/pipeline-harness/asset-pack/runner.ts', + 'uapi/app/terminal/TerminalDepositReadWorkbench.tsx', + 'uapi/app/terminal/terminal-pipeline-harness-client.ts', + 'uapi/tests/api/pipelineHarnessRoute.test.ts', + 'uapi/tests/terminalPipelineHarnessClient.test.ts', + 'packages/protocol/src/canonical/v42-readfitsfinding-preview-quote.js', + 'packages/protocol/test/v42-readfitsfinding-preview-quote.test.js', + 'scripts/generate-v42-readfitsfinding-preview-quote.mjs', + 'scripts/check-v42-gate5-readfitsfinding-preview-quote.mjs', + 'BITCODE_SPEC_V42.md', + 'BITCODE_SPEC_V42_DELTA.md', + 'BITCODE_SPEC_V42_NOTES.md', + 'BITCODE_SPEC_V42_PARITY_MATRIX.md', + 'SPECIFICATIONS_ROADMAP.md', + 'README.md', + 'uapi/app/terminal/README.md', + 'packages/pipelines/asset-pack/README.md', + 'packages/protocol/README.md', + 'package.json', + '.github/workflows/bitcode-gate-quality.yml', + '.github/workflows/bitcode-canon-quality.yml', + ]; + + for (const relativePath of requiredFiles) { + assertCheck(failures, fileExists(root, relativePath), `Missing V42 Gate 5 file: ${relativePath}`); + } + + if (failures.length === 0) { + try { + run(root, 'node', ['scripts/generate-v42-readfitsfinding-preview-quote.mjs', '--check']); + } catch (error) { + failures.push(`V42 ReadFitsFinding preview/quote artifact check failed: ${error.stderr || error.message}`); + } + } + + if (failures.length === 0) { + try { + run(root, 'node', [ + '--test', + '--test-force-exit', + 'packages/protocol/test/v42-readfitsfinding-preview-quote.test.js', + ]); + } catch (error) { + failures.push(`V42 ReadFitsFinding preview/quote protocol test failed: ${error.stderr || error.message}`); + } + } + + if (failures.length === 0 && !args.skipPackageTests) { + try { + run(root, 'pnpm', [ + '--filter', + '@bitcode/pipeline-asset-pack', + 'exec', + 'jest', + '--config', + 'jest.config.cjs', + '--runTestsByPath', + 'src/__tests__/depository-search.test.ts', + 'src/__tests__/read-fits-finding-runtime.test.ts', + 'src/__tests__/asset-pack-preview-boundary.test.ts', + 'src/__tests__/postprocess.test.ts', + '--runInBand', + '--forceExit', + ]); + } catch (error) { + failures.push(`V42 ReadFitsFinding preview/quote package tests failed: ${error.stderr || error.message}`); + } + } + + if (failures.length === 0 && !args.skipUapiTests) { + try { + run(root, 'pnpm', [ + '--dir', + 'uapi', + 'exec', + 'jest', + '--runTestsByPath', + 'tests/api/pipelineHarnessRoute.test.ts', + 'tests/terminalPipelineHarnessClient.test.ts', + 'tests/terminalDepositReadWorkbench.test.ts', + '--runInBand', + ]); + } catch (error) { + failures.push(`V42 ReadFitsFinding preview/quote UAPI tests failed: ${error.stderr || error.message}`); + } + } + + const serializedArtifact = fileExists(root, ARTIFACT_PATH) ? read(root, ARTIFACT_PATH) : ''; + for (const marker of SECRET_MARKERS) { + assertCheck(failures, !serializedArtifact.includes(marker), `V42 Gate 5 artifact must not contain secret marker ${marker}.`); + } + + const artifact = serializedArtifact ? JSON.parse(serializedArtifact) : null; + if (artifact) { + assertCheck(failures, artifact.artifactId === 'v42-readfitsfinding-preview-quote', 'Gate 5 artifactId must match.'); + assertCheck( + failures, + artifact.schemaId === 'bitcode.v42.readFitsFindingPreviewQuote.v1', + 'Gate 5 schemaId must match.', + ); + assertCheck(failures, artifact.version === 'V42' && artifact.currentTarget === 'V41', 'Gate 5 artifact must bind V42 over active V41.'); + assertCheck(failures, artifact.passed === true, 'Gate 5 artifact must pass.'); + assertCheck( + failures, + artifact.sourceSafetyVerdict === 'source-safe-readfitsfinding-preview-quote-metadata', + 'Gate 5 artifact must declare source-safe ReadFitsFinding preview/quote metadata.', + ); + assertCheck(failures, artifact.coverage.rowCount === 12, 'Gate 5 must cover twelve ReadFitsFinding preview/quote rows.'); + assertCheck(failures, artifact.coverage.pipelineName === 'ReadFitsFindingSynthesis', 'Gate 5 must bind ReadFitsFindingSynthesis.'); + assertCheck(failures, artifact.coverage.requiredPriorPipelineName === 'ReadNeedComprehensionSynthesis', 'Gate 5 must bind accepted-Need prior pipeline.'); + assertCheck(failures, artifact.coverage.phaseCount === 7, 'Gate 5 must cover seven ReadFitsFindingSynthesis phases.'); + assertCheck(failures, artifact.coverage.agentCount === 8, 'Gate 5 must cover eight ReadFitsFindingSynthesis PTRR agents.'); + assertCheck(failures, artifact.coverage.ptrrStepCount === 32, 'Gate 5 must cover thirty-two PTRR steps.'); + assertCheck(failures, artifact.coverage.failsafeSequenceCount === 96, 'Gate 5 must cover ninety-six Failsafe sequences.'); + assertCheck(failures, artifact.coverage.thricifiedGenerationCount === 96, 'Gate 5 must cover ninety-six ThricifiedGeneration receipts.'); + assertCheck(failures, Array.isArray(artifact.coverage.searchChannelIds) && artifact.coverage.searchChannelIds.length === 7, 'Gate 5 must cover seven search channels.'); + assertCheck(failures, artifact.coverage.selectedFitProvenanceRequired === true, 'Gate 5 must require selected-fit provenance.'); + assertCheck(failures, artifact.coverage.sourceSafePreviewRequired === true, 'Gate 5 must require source-safe AssetPack preview.'); + assertCheck(failures, artifact.coverage.deterministicQuoteRequired === true, 'Gate 5 must require deterministic quote.'); + assertCheck(failures, artifact.coverage.noProtectedSourceBeforeSettlement === true, 'Gate 5 must block protected source before settlement.'); + assertCheck(failures, artifact.coverage.settlementInstructionsRequired === true, 'Gate 5 must require settlement instructions.'); + assertCheck(failures, artifact.coverage.terminalPreviewQuoteReadbackCovered === true, 'Gate 5 must cover Terminal preview/quote readback.'); + assertCheck(failures, artifact.coverage.sourceSafeMetadataOnly === true, 'Gate 5 must remain source-safe metadata only.'); + assertCheck(failures, artifact.coverage.protectedSourceVisible === false, 'Gate 5 artifact must not expose protected source.'); + assertCheck(failures, artifact.coverage.rawProtectedPromptVisible === false, 'Gate 5 artifact must not expose protected prompts.'); + assertCheck(failures, artifact.coverage.rawProviderResponseVisible === false, 'Gate 5 artifact must not expose raw provider responses.'); + assertCheck(failures, artifact.coverage.unpaidAssetPackSourceVisible === false, 'Gate 5 artifact must not expose unpaid AssetPack source.'); + assertCheck(failures, artifact.coverage.walletPrivateMaterialVisible === false, 'Gate 5 artifact must not expose wallet private material.'); + assertCheck(failures, artifact.coverage.settlementPrivatePayloadVisible === false, 'Gate 5 artifact must not expose settlement private payloads.'); + assertCheck(failures, artifact.coverage.credentialsSerialized === false, 'Gate 5 artifact must not serialize credentials.'); + assertCheck(failures, artifact.coverage.legacySourceRoots === false, 'Gate 5 must not rely on legacy source roots.'); + assertCheck(failures, Array.isArray(artifact.coverage.failedPredicateIds) && artifact.coverage.failedPredicateIds.length === 0, 'Gate 5 predicates must all pass.'); + } + + const spec = read(root, 'BITCODE_SPEC_V42.md'); + const parity = read(root, 'BITCODE_SPEC_V42_PARITY_MATRIX.md'); + const terminalReadme = read(root, 'uapi/app/terminal/README.md'); + assertCheck(failures, spec.includes('V42 Gate 5') && spec.includes('v42-readfitsfinding-preview-quote'), 'V42 spec must expand Gate 5 ReadFitsFinding preview/quote closure.'); + assertCheck(failures, parity.includes('Finding Fits preview and quote') && parity.includes('implemented'), 'V42 parity matrix must mark Finding Fits preview and quote implemented.'); + assertCheck(failures, terminalReadme.includes('V42 Gate 5') && terminalReadme.includes('Finding Fits preview'), 'Terminal README must document Gate 5 preview/quote readback.'); + + if (failures.length > 0) { + process.stderr.write(`V42 Gate 5 ReadFitsFinding preview/quote check failed:\n- ${failures.join('\n- ')}\n`); + process.exitCode = 1; + return; + } + + process.stdout.write(`V42 Gate 5 ReadFitsFinding preview/quote ok artifact=${artifact.artifactRoot}\n`); +} + +main(); diff --git a/scripts/generate-v42-readfitsfinding-preview-quote.mjs b/scripts/generate-v42-readfitsfinding-preview-quote.mjs new file mode 100644 index 00000000..62e6ffbd --- /dev/null +++ b/scripts/generate-v42-readfitsfinding-preview-quote.mjs @@ -0,0 +1,31 @@ +#!/usr/bin/env node + +import { readFileSync, writeFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { + V42_READFITSFINDING_PREVIEW_QUOTE_ARTIFACT_PATH, + buildV42ReadFitsFindingPreviewQuote, +} from '../packages/protocol/src/canonical/v42-readfitsfinding-preview-quote.js'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const repoRoot = path.resolve(__dirname, '..'); + +const check = process.argv.includes('--check'); +const artifact = buildV42ReadFitsFindingPreviewQuote({ repoRoot }); +const serialized = `${JSON.stringify(artifact, null, 2)}\n`; +const artifactPath = path.join(repoRoot, V42_READFITSFINDING_PREVIEW_QUOTE_ARTIFACT_PATH); + +if (check) { + const current = readFileSync(artifactPath, 'utf8'); + if (current !== serialized) { + process.stderr.write( + `${V42_READFITSFINDING_PREVIEW_QUOTE_ARTIFACT_PATH} is stale. Run pnpm run generate:v42-readfitsfinding-preview-quote.\n`, + ); + process.exitCode = 1; + } +} else { + writeFileSync(artifactPath, serialized); + process.stdout.write(`wrote ${V42_READFITSFINDING_PREVIEW_QUOTE_ARTIFACT_PATH}\n`); +} diff --git a/uapi/app/api/pipeline-harness/asset-pack/runner.ts b/uapi/app/api/pipeline-harness/asset-pack/runner.ts index 3ec0705a..8cf8fd26 100644 --- a/uapi/app/api/pipeline-harness/asset-pack/runner.ts +++ b/uapi/app/api/pipeline-harness/asset-pack/runner.ts @@ -419,6 +419,31 @@ function summarizeEvidence(evidence: unknown): Record | null { : record.sourceSafePreview && typeof record.sourceSafePreview === 'object' ? (record.sourceSafePreview as Record) : null; + const assetPackPreviewBoundary = output?.assetPackPreviewBoundary && typeof output.assetPackPreviewBoundary === 'object' + ? (output.assetPackPreviewBoundary as Record) + : record.assetPackPreviewBoundary && typeof record.assetPackPreviewBoundary === 'object' + ? (record.assetPackPreviewBoundary as Record) + : null; + const assetPackQuoteReceipt = output?.assetPackQuoteReceipt && typeof output.assetPackQuoteReceipt === 'object' + ? (output.assetPackQuoteReceipt as Record) + : assetPackPreviewBoundary?.quoteReceipt && typeof assetPackPreviewBoundary.quoteReceipt === 'object' + ? (assetPackPreviewBoundary.quoteReceipt as Record) + : null; + const assetPackSettlementInstructions = output?.assetPackSettlementInstructions && typeof output.assetPackSettlementInstructions === 'object' + ? (output.assetPackSettlementInstructions as Record) + : assetPackPreviewBoundary?.settlementInstructions && typeof assetPackPreviewBoundary.settlementInstructions === 'object' + ? (assetPackPreviewBoundary.settlementInstructions as Record) + : null; + const assetPackDeliveryPosture = output?.assetPackDeliveryPosture && typeof output.assetPackDeliveryPosture === 'object' + ? (output.assetPackDeliveryPosture as Record) + : assetPackPreviewBoundary?.deliveryPosture && typeof assetPackPreviewBoundary.deliveryPosture === 'object' + ? (assetPackPreviewBoundary.deliveryPosture as Record) + : null; + const assetPackDisclosureReview = output?.assetPackDisclosureReview && typeof output.assetPackDisclosureReview === 'object' + ? (output.assetPackDisclosureReview as Record) + : assetPackPreviewBoundary?.disclosureReview && typeof assetPackPreviewBoundary.disclosureReview === 'object' + ? (assetPackPreviewBoundary.disclosureReview as Record) + : null; const summarizeCandidate = (candidate: unknown) => { if (!candidate || typeof candidate !== 'object' || Array.isArray(candidate)) return null; const record = candidate as Record; @@ -522,6 +547,65 @@ function summarizeEvidence(evidence: unknown): Record | null { delivery: sourceSafePreview.delivery, } : null, + assetPackPreviewBoundary: summarizeAssetPackPreviewBoundary(assetPackPreviewBoundary), + assetPackQuoteReceipt: assetPackQuoteReceipt + ? { + schema: assetPackQuoteReceipt.schema, + quoteId: assetPackQuoteReceipt.quoteId, + deterministic: assetPackQuoteReceipt.deterministic, + formula: assetPackQuoteReceipt.formula, + needId: assetPackQuoteReceipt.needId, + needMeasurementRoot: assetPackQuoteReceipt.needMeasurementRoot, + admittedFitQuality: assetPackQuoteReceipt.admittedFitQuality, + weightedRequestedVolume: assetPackQuoteReceipt.weightedRequestedVolume, + weightedAdmittedVolume: assetPackQuoteReceipt.weightedAdmittedVolume, + sats: assetPackQuoteReceipt.sats, + feeSchedule: assetPackQuoteReceipt.feeSchedule, + finalityState: assetPackQuoteReceipt.finalityState, + payer: assetPackQuoteReceipt.payer, + quoteRoot: assetPackQuoteReceipt.quoteRoot, + receiptRoot: assetPackQuoteReceipt.receiptRoot, + } + : null, + assetPackSettlementInstructions: assetPackSettlementInstructions + ? { + schema: assetPackSettlementInstructions.schema, + state: assetPackSettlementInstructions.state, + payer: assetPackSettlementInstructions.payer, + payee: assetPackSettlementInstructions.payee, + btcNetwork: assetPackSettlementInstructions.btcNetwork, + sats: assetPackSettlementInstructions.sats, + quoteRoot: assetPackSettlementInstructions.quoteRoot, + serverCustody: assetPackSettlementInstructions.serverCustody, + btcFeeOperation: assetPackSettlementInstructions.btcFeeOperation, + settlementRequiredBeforeUnlock: assetPackSettlementInstructions.settlementRequiredBeforeUnlock, + requiredReadbacksBeforeUnlock: assetPackSettlementInstructions.requiredReadbacksBeforeUnlock, + forbiddenBeforeSettlement: assetPackSettlementInstructions.forbiddenBeforeSettlement, + instructionsRoot: assetPackSettlementInstructions.instructionsRoot, + } + : null, + assetPackDeliveryPosture: assetPackDeliveryPosture + ? { + schema: assetPackDeliveryPosture.schema, + state: assetPackDeliveryPosture.state, + deliveryMechanism: assetPackDeliveryPosture.deliveryMechanism, + pullRequestTarget: assetPackDeliveryPosture.pullRequestTarget, + sourceBearingDeliveryVisible: assetPackDeliveryPosture.sourceBearingDeliveryVisible, + availableAfterSettlement: assetPackDeliveryPosture.availableAfterSettlement, + blockerCodes: assetPackDeliveryPosture.blockerCodes, + deliveryRoot: assetPackDeliveryPosture.deliveryRoot, + } + : null, + assetPackDisclosureReview: assetPackDisclosureReview + ? { + schema: assetPackDisclosureReview.schema, + assetPackId: assetPackDisclosureReview.assetPackId, + access: assetPackDisclosureReview.access, + policy: assetPackDisclosureReview.policy, + sourceLeakage: assetPackDisclosureReview.sourceLeakage, + roots: assetPackDisclosureReview.roots, + } + : null, depositorySearch: depositorySearch ? { ...summarizeFitLike(depositorySearch), @@ -570,6 +654,139 @@ function summarizeEvidence(evidence: unknown): Record | null { }; } +function summarizeAssetPackPreviewBoundary( + boundary: Record | null, +): Record | null { + if (!boundary) return null; + const quoteReceipt = boundary.quoteReceipt && typeof boundary.quoteReceipt === 'object' + ? (boundary.quoteReceipt as Record) + : null; + const selectedFitProvenance = boundary.selectedFitProvenance && typeof boundary.selectedFitProvenance === 'object' + ? (boundary.selectedFitProvenance as Record) + : null; + const settlementInstructions = boundary.settlementInstructions && typeof boundary.settlementInstructions === 'object' + ? (boundary.settlementInstructions as Record) + : null; + const deliveryPosture = boundary.deliveryPosture && typeof boundary.deliveryPosture === 'object' + ? (boundary.deliveryPosture as Record) + : null; + const replayReceipt = boundary.replayReceipt && typeof boundary.replayReceipt === 'object' + ? (boundary.replayReceipt as Record) + : null; + const repairPosture = boundary.repairPosture && typeof boundary.repairPosture === 'object' + ? (boundary.repairPosture as Record) + : null; + const proofRoots = boundary.proofRoots && typeof boundary.proofRoots === 'object' + ? (boundary.proofRoots as Record) + : null; + const sourceSafety = boundary.sourceSafety && typeof boundary.sourceSafety === 'object' + ? (boundary.sourceSafety as Record) + : null; + const storageProjection = Array.isArray(boundary.storageProjection) + ? boundary.storageProjection + .map((record) => record && typeof record === 'object' && !Array.isArray(record) + ? record as Record + : null) + .filter((record): record is Record => Boolean(record)) + : []; + + return { + schema: boundary.schema, + boundaryId: boundary.boundaryId, + assetPackId: boundary.assetPackId, + sourceSafety, + proofRoots, + quoteReceipt: quoteReceipt + ? { + quoteId: quoteReceipt.quoteId, + deterministic: quoteReceipt.deterministic, + formula: quoteReceipt.formula, + needId: quoteReceipt.needId, + admittedFitQuality: quoteReceipt.admittedFitQuality, + weightedRequestedVolume: quoteReceipt.weightedRequestedVolume, + weightedAdmittedVolume: quoteReceipt.weightedAdmittedVolume, + sats: quoteReceipt.sats, + finalityState: quoteReceipt.finalityState, + payer: quoteReceipt.payer, + quoteRoot: quoteReceipt.quoteRoot, + receiptRoot: quoteReceipt.receiptRoot, + } + : null, + selectedFitProvenance: selectedFitProvenance + ? { + schema: selectedFitProvenance.schema, + resultState: selectedFitProvenance.resultState, + selectedCandidateAssetIds: selectedFitProvenance.selectedCandidateAssetIds, + fitDepositAssetIds: selectedFitProvenance.fitDepositAssetIds, + queryRoot: selectedFitProvenance.queryRoot, + rankingRoot: selectedFitProvenance.rankingRoot, + selectedCandidates: Array.isArray(selectedFitProvenance.selectedCandidates) + ? selectedFitProvenance.selectedCandidates.map((candidate) => + candidate && typeof candidate === 'object' + ? { + assetId: (candidate as Record).assetId, + finalScore: (candidate as Record).finalScore, + semanticScore: (candidate as Record).semanticScore, + proofRoot: (candidate as Record).proofRoot, + measurementRoot: (candidate as Record).measurementRoot, + reconciliationReadbackRoot: (candidate as Record).reconciliationReadbackRoot, + } + : null, + ).filter(Boolean) + : [], + provenanceRoot: selectedFitProvenance.provenanceRoot, + } + : null, + settlementInstructions: settlementInstructions + ? { + state: settlementInstructions.state, + payer: settlementInstructions.payer, + payee: settlementInstructions.payee, + btcNetwork: settlementInstructions.btcNetwork, + sats: settlementInstructions.sats, + quoteRoot: settlementInstructions.quoteRoot, + serverCustody: settlementInstructions.serverCustody, + settlementRequiredBeforeUnlock: settlementInstructions.settlementRequiredBeforeUnlock, + instructionsRoot: settlementInstructions.instructionsRoot, + } + : null, + deliveryPosture: deliveryPosture + ? { + state: deliveryPosture.state, + deliveryMechanism: deliveryPosture.deliveryMechanism, + pullRequestTarget: deliveryPosture.pullRequestTarget, + sourceBearingDeliveryVisible: deliveryPosture.sourceBearingDeliveryVisible, + availableAfterSettlement: deliveryPosture.availableAfterSettlement, + blockerCodes: deliveryPosture.blockerCodes, + deliveryRoot: deliveryPosture.deliveryRoot, + } + : null, + replayReceipt: replayReceipt + ? { + replayMode: replayReceipt.replayMode, + previewRoot: replayReceipt.previewRoot, + quoteRoot: replayReceipt.quoteRoot, + selectedFitProvenanceRoot: replayReceipt.selectedFitProvenanceRoot, + settlementInstructionsRoot: replayReceipt.settlementInstructionsRoot, + deliveryPostureRoot: replayReceipt.deliveryPostureRoot, + storageRoot: replayReceipt.storageRoot, + replayRoot: replayReceipt.replayRoot, + verified: replayReceipt.verified, + } + : null, + repairPosture, + storageProjection: storageProjection.map((record) => ({ + recordId: record.recordId, + recordKind: record.recordKind, + namespace: record.namespace, + key: record.key, + root: record.root, + sourceSafety: record.sourceSafety, + })), + storageRecordCount: storageProjection.length, + }; +} + function safeHostEvent(event: PipelineHarnessHostEvent): PipelineHarnessHostEvent { return event; } diff --git a/uapi/app/terminal/README.md b/uapi/app/terminal/README.md index a5803f85..6ec89b32 100644 --- a/uapi/app/terminal/README.md +++ b/uapi/app/terminal/README.md @@ -125,6 +125,16 @@ Finding Fits; accepting the Need is the only admission handoff to `.bitcode/v42-readneed-review-resynthesis-product-closure.json`, checked by `pnpm run check:v42-gate4`. +V42 Gate 5 closes the Terminal Finding Fits preview and quote readback. The +source-safe preview panel now reads `AssetPackPreviewBoundary` summaries from +pipeline harness evidence, including selected-fit provenance, deterministic +quote receipt, settlement instructions, delivery posture, replay root, and +storage record count. Terminal keeps those rows expandable and metadata-only: +protected source and unpaid AssetPack source stay withheld until settlement +and rights-transfer readback. The source-safe proof artifact is +`.bitcode/v42-readfitsfinding-preview-quote.json`, checked by +`pnpm run check:v42-gate5`. + ## Live staging-testnet QA Terminal Deposit/Read QA starts only after Wallet and Externals prerequisites are diff --git a/uapi/app/terminal/TerminalDepositReadWorkbench.tsx b/uapi/app/terminal/TerminalDepositReadWorkbench.tsx index 599e8117..870f2bad 100644 --- a/uapi/app/terminal/TerminalDepositReadWorkbench.tsx +++ b/uapi/app/terminal/TerminalDepositReadWorkbench.tsx @@ -311,9 +311,27 @@ export default function TerminalDepositReadWorkbench({ } return null; }, [harnessEvents]); - const sourceSafePreview = objectValue(completedHarnessEvidence?.sourceSafePreview); + const assetPackPreviewBoundary = objectValue(completedHarnessEvidence?.assetPackPreviewBoundary); + const boundarySourceSafePreview = objectValue(assetPackPreviewBoundary?.sourceSafePreview); + const sourceSafePreview = + objectValue(completedHarnessEvidence?.sourceSafePreview) || + boundarySourceSafePreview; + const assetPackSelectedFitProvenance = + objectValue(assetPackPreviewBoundary?.selectedFitProvenance); + const assetPackQuoteReceipt = + objectValue(assetPackPreviewBoundary?.quoteReceipt) || + objectValue(completedHarnessEvidence?.assetPackQuoteReceipt); + const assetPackSettlementInstructions = + objectValue(assetPackPreviewBoundary?.settlementInstructions) || + objectValue(completedHarnessEvidence?.assetPackSettlementInstructions); + const assetPackDeliveryPosture = + objectValue(assetPackPreviewBoundary?.deliveryPosture) || + objectValue(completedHarnessEvidence?.assetPackDeliveryPosture); + const assetPackPreviewProofRoots = objectValue(assetPackPreviewBoundary?.proofRoots); + const assetPackPreviewReplayReceipt = objectValue(assetPackPreviewBoundary?.replayReceipt); const assetPackDisclosureReview = objectValue(completedHarnessEvidence?.assetPackDisclosureReview) || + objectValue(assetPackPreviewBoundary?.disclosureReview) || objectValue(sourceSafePreview?.disclosureReview); const disclosureAccess = objectValue(assetPackDisclosureReview?.access); const disclosurePolicy = objectValue(assetPackDisclosureReview?.policy); @@ -321,12 +339,18 @@ export default function TerminalDepositReadWorkbench({ const disclosureRoots = objectValue(assetPackDisclosureReview?.roots); const disclosureSourceSafe = disclosureLeakage?.protectedSourceDetected !== true; const ledgerSettlement = objectValue(completedHarnessEvidence?.ledgerSettlement); - const previewFeeQuote = objectValue(sourceSafePreview?.feeQuote); + const previewFeeQuote = + assetPackQuoteReceipt || + objectValue(sourceSafePreview?.feeQuote); const protectedSourceUnlock = objectValue(sourceSafePreview?.unlock) || objectValue(ledgerSettlement?.protectedSourceUnlock); const settledReadback = ledgerSettlement?.status === 'settled'; - const pullRequestDelivered = settledReadback && Boolean(textValue(objectValue(sourceSafePreview?.delivery)?.pullRequestTarget)); + const previewDelivery = objectValue(sourceSafePreview?.delivery); + const pullRequestDelivered = settledReadback && Boolean( + textValue(previewDelivery?.pullRequestTarget) || + textValue(assetPackDeliveryPosture?.pullRequestTarget), + ); const enterpriseReadingState = useMemo( () => buildTerminalEnterpriseReadingUxState({ @@ -417,6 +441,99 @@ export default function TerminalDepositReadWorkbench({ sourceSafePreview?.accessPolicy, ], ); + const assetPackPreviewBoundaryRows = useMemo( + () => [ + { + label: 'Boundary', + value: shortIdentifier(assetPackPreviewBoundary?.boundaryId) || 'pending', + }, + { + label: 'Preview root', + value: + shortIdentifier(assetPackPreviewProofRoots?.previewRoot) || + shortIdentifier(objectValue(sourceSafePreview?.roots)?.previewRoot) || + 'pending', + }, + { + label: 'Quote', + value: numericValue(previewFeeQuote?.sats) ? `${String(previewFeeQuote?.sats)} sats` : 'pending', + }, + { + label: 'Quote root', + value: + shortIdentifier(assetPackQuoteReceipt?.quoteRoot) || + shortIdentifier(previewFeeQuote?.quoteRoot) || + 'pending', + }, + { + label: 'Formula', + value: textValue(assetPackQuoteReceipt?.formula) || textValue(previewFeeQuote?.formula) || 'pending', + }, + { + label: 'Deterministic', + value: assetPackQuoteReceipt?.deterministic === true ? 'yes' : 'pending', + }, + { + label: 'Selected fits', + value: stringList(assetPackSelectedFitProvenance?.selectedCandidateAssetIds).join(', ') || 'pending', + }, + { + label: 'Fit deposits', + value: stringList(assetPackSelectedFitProvenance?.fitDepositAssetIds).join(', ') || 'pending', + }, + { + label: 'Provenance root', + value: + shortIdentifier(assetPackSelectedFitProvenance?.provenanceRoot) || + shortIdentifier(assetPackPreviewProofRoots?.selectedFitProvenanceRoot) || + 'pending', + }, + { + label: 'Settlement', + value: textValue(assetPackSettlementInstructions?.state) || 'pending', + }, + { + label: 'Network', + value: textValue(assetPackSettlementInstructions?.btcNetwork) || 'pending', + }, + { + label: 'Instructions root', + value: shortIdentifier(assetPackSettlementInstructions?.instructionsRoot) || 'pending', + }, + { + label: 'Delivery', + value: textValue(assetPackDeliveryPosture?.state) || 'pending', + }, + { + label: 'Delivery root', + value: shortIdentifier(assetPackDeliveryPosture?.deliveryRoot) || 'pending', + }, + { + label: 'Replay root', + value: + shortIdentifier(assetPackPreviewReplayReceipt?.replayRoot) || + shortIdentifier(assetPackPreviewProofRoots?.replayRoot) || + 'pending', + }, + { + label: 'Storage records', + value: numericValue(assetPackPreviewBoundary?.storageRecordCount) + ? String(assetPackPreviewBoundary?.storageRecordCount) + : String(countList(assetPackPreviewBoundary?.storageProjection) || 0), + }, + ], + [ + assetPackDeliveryPosture, + assetPackPreviewBoundary, + assetPackPreviewProofRoots, + assetPackPreviewReplayReceipt, + assetPackQuoteReceipt, + assetPackSelectedFitProvenance, + assetPackSettlementInstructions, + previewFeeQuote, + sourceSafePreview?.roots, + ], + ); const readNeedRows = useMemo(() => { if (!currentReadNeed) return []; return [ @@ -974,7 +1091,7 @@ export default function TerminalDepositReadWorkbench({ { label: 'Unlock', value: protectedSourceUnlock?.sourceAvailable === true ? 'source available' : textValue(protectedSourceUnlock?.state) || 'withheld' }, { label: 'Read license', value: shortIdentifier(ledgerSettlement?.readLicenseId) || 'pending' }, { label: 'BTC fee', value: shortIdentifier(ledgerSettlement?.btcFeeReceiptId) || 'pending' }, - { label: 'PR target', value: textValue(objectValue(sourceSafePreview?.delivery)?.pullRequestTarget) || 'pending' }, + { label: 'PR target', value: textValue(previewDelivery?.pullRequestTarget) || textValue(assetPackDeliveryPosture?.pullRequestTarget) || 'pending' }, ].map((row) => (
{row.label}
@@ -982,6 +1099,19 @@ export default function TerminalDepositReadWorkbench({
))} +
+ + Finding Fits preview, quote, and provenance + +
+ {assetPackPreviewBoundaryRows.map((row) => ( +
+
{row.label}
+
{row.value}
+
+ ))} +
+
diff --git a/uapi/app/terminal/terminal-pipeline-harness-client.ts b/uapi/app/terminal/terminal-pipeline-harness-client.ts index 51b5b2d7..487d10a4 100644 --- a/uapi/app/terminal/terminal-pipeline-harness-client.ts +++ b/uapi/app/terminal/terminal-pipeline-harness-client.ts @@ -635,8 +635,16 @@ export function summarizeTerminalReadFitsFindingSynthesisHarnessEvent( const depositorySearch = recordValue(evidence?.depositorySearch); const ledgerSettlement = recordValue(evidence?.ledgerSettlement); const sourceSafePreview = recordValue(evidence?.sourceSafePreview); + const assetPackPreviewBoundary = recordValue(evidence?.assetPackPreviewBoundary); + const boundaryQuoteReceipt = recordValue(assetPackPreviewBoundary?.quoteReceipt); + const boundarySelectedFitProvenance = recordValue(assetPackPreviewBoundary?.selectedFitProvenance); + const boundarySettlementInstructions = recordValue(assetPackPreviewBoundary?.settlementInstructions); + const boundaryDeliveryPosture = recordValue(assetPackPreviewBoundary?.deliveryPosture); const assetPackDisclosureReview = recordValue(evidence?.assetPackDisclosureReview); - const feeQuote = recordValue(sourceSafePreview?.feeQuote); + const feeQuote = + boundaryQuoteReceipt || + recordValue(evidence?.assetPackQuoteReceipt) || + recordValue(sourceSafePreview?.feeQuote); const unlock = recordValue(sourceSafePreview?.unlock) || recordValue(ledgerSettlement?.protectedSourceUnlock); const disclosureAccess = recordValue(assetPackDisclosureReview?.access); const disclosureLeakage = recordValue(assetPackDisclosureReview?.sourceLeakage); @@ -646,7 +654,9 @@ export function summarizeTerminalReadFitsFindingSynthesisHarnessEvent( ? `ledger ${String(ledgerSettlement.status)}` : null; const selectedCandidateText = summarizeCandidateIds( - fitResult?.selectedCandidateAssetIds || depositorySearch?.selectedCandidateAssetIds, + boundarySelectedFitProvenance?.selectedCandidateAssetIds || + fitResult?.selectedCandidateAssetIds || + depositorySearch?.selectedCandidateAssetIds, ); const telemetryLineCount = Number(data?.telemetryLineCount || 0); const telemetryText = telemetryLineCount > 0 @@ -655,6 +665,15 @@ export function summarizeTerminalReadFitsFindingSynthesisHarnessEvent( const feeQuoteText = typeof feeQuote?.sats === 'number' ? ` fee ${feeQuote.sats} sats` : null; + const quoteText = boundaryQuoteReceipt?.quoteRoot + ? ` quote ${shortIdentifier(boundaryQuoteReceipt.quoteRoot)}` + : null; + const settlementText = boundarySettlementInstructions?.state + ? ` settlement ${String(boundarySettlementInstructions.state)}` + : null; + const deliveryText = boundaryDeliveryPosture?.state + ? ` delivery ${String(boundaryDeliveryPosture.state)}` + : null; const unlockText = unlock?.sourceAvailable === true ? ` source ${String(unlock.state || 'available')}` : unlock?.state @@ -678,6 +697,9 @@ export function summarizeTerminalReadFitsFindingSynthesisHarnessEvent( selectedCandidateText, ledgerStatus, feeQuoteText, + quoteText, + settlementText, + deliveryText, unlockText, disclosureText, leakageText, diff --git a/uapi/tests/api/pipelineHarnessRoute.test.ts b/uapi/tests/api/pipelineHarnessRoute.test.ts index 1d94e05b..81dd1a44 100644 --- a/uapi/tests/api/pipelineHarnessRoute.test.ts +++ b/uapi/tests/api/pipelineHarnessRoute.test.ts @@ -79,12 +79,117 @@ jest.mock('@bitcode/pipeline-hosts', () => ({ }, sourceSafePreview: { schema: 'bitcode.asset-pack.source-safe-preview', + assetPackId: 'asset-pack-route-test', + feeQuote: { + sats: 546, + quoteRoot: 'sha256:route-quote-root', + }, unlock: { state: 'denied', sourceAvailable: false, reason: 'settlement blocked in route test', }, }, + assetPackPreviewBoundary: { + schema: 'bitcode.asset-pack.preview-boundary', + boundaryId: 'asset-pack-preview-boundary-route-test', + assetPackId: 'asset-pack-route-test', + quoteReceipt: { + quoteId: 'quote-route-test', + deterministic: true, + formula: 'sum(measurement.weight * measurement.volume * admitted_fit_quality)', + needId: 'need-route-test', + admittedFitQuality: 0.91, + weightedRequestedVolume: 3, + weightedAdmittedVolume: 2.73, + sats: 546, + finalityState: 'preview_not_paid', + payer: 'reader', + quoteRoot: 'sha256:route-quote-root', + receiptRoot: 'sha256:route-quote-receipt-root', + }, + selectedFitProvenance: { + resultState: 'worthy_fit', + selectedCandidateAssetIds: ['asset-repository-revision'], + fitDepositAssetIds: ['deposit-route-test'], + queryRoot: 'sha256:route-query-root', + rankingRoot: 'sha256:route-ranking-root', + selectedCandidates: [ + { + assetId: 'asset-repository-revision', + finalScore: 0.91, + semanticScore: 0.82, + proofRoot: 'sha256:route-proof-root', + measurementRoot: 'sha256:route-measurement-root', + reconciliationReadbackRoot: 'sha256:route-readback-root', + }, + ], + provenanceRoot: 'sha256:route-provenance-root', + }, + settlementInstructions: { + state: 'quote_ready_settlement_required', + payer: 'reader', + payee: 'depositor', + btcNetwork: 'testnet', + sats: 546, + quoteRoot: 'sha256:route-quote-root', + serverCustody: false, + settlementRequiredBeforeUnlock: true, + instructionsRoot: 'sha256:route-instructions-root', + }, + deliveryPosture: { + state: 'withheld_until_settlement', + deliveryMechanism: 'pull_request_after_settlement', + pullRequestTarget: null, + sourceBearingDeliveryVisible: false, + availableAfterSettlement: true, + blockerCodes: ['btc_fee_unpaid'], + deliveryRoot: 'sha256:route-delivery-root', + }, + replayReceipt: { + replayMode: 'source-safe-preview-quote-disclosure-boundary-replay', + previewRoot: 'sha256:route-preview-root', + quoteRoot: 'sha256:route-quote-root', + selectedFitProvenanceRoot: 'sha256:route-provenance-root', + settlementInstructionsRoot: 'sha256:route-instructions-root', + deliveryPostureRoot: 'sha256:route-delivery-root', + storageRoot: 'sha256:route-storage-root', + replayRoot: 'sha256:route-replay-root', + verified: { + protectedSourceLeakageAbsent: true, + }, + }, + proofRoots: { + previewRoot: 'sha256:route-preview-root', + quoteRoot: 'sha256:route-quote-root', + selectedFitProvenanceRoot: 'sha256:route-provenance-root', + settlementInstructionsRoot: 'sha256:route-instructions-root', + deliveryPostureRoot: 'sha256:route-delivery-root', + replayRoot: 'sha256:route-replay-root', + boundaryRoot: 'sha256:route-boundary-root', + }, + sourceSafety: { + sourceSafeMetadataOnly: true, + protectedSourceVisible: false, + unpaidAssetPackSourceVisible: false, + credentialsSerialized: false, + }, + storageProjection: [ + { + recordId: 'route-storage-record', + recordKind: 'deterministic_btc_quote', + namespace: 'asset-pack/preview', + key: 'quoteReceipt', + root: 'sha256:route-storage-record-root', + sourceSafety: { + sourceSafeMetadataOnly: true, + }, + payload: { + hiddenFromRouteSummary: true, + }, + }, + ], + }, }, }, telemetry: '{"type":"pipeline-stream-event","runId":"route-run","stage":"asset-pack-synthesis"}\n', @@ -474,11 +579,47 @@ describe('POST /api/pipeline-harness/asset-pack', () => { }, }, sourceSafePreview: { + assetPackId: 'asset-pack-route-test', unlock: { state: 'denied', sourceAvailable: false, }, }, + assetPackPreviewBoundary: { + boundaryId: 'asset-pack-preview-boundary-route-test', + assetPackId: 'asset-pack-route-test', + quoteReceipt: { + sats: 546, + quoteRoot: 'sha256:route-quote-root', + }, + selectedFitProvenance: { + selectedCandidateAssetIds: ['asset-repository-revision'], + fitDepositAssetIds: ['deposit-route-test'], + provenanceRoot: 'sha256:route-provenance-root', + }, + settlementInstructions: { + state: 'quote_ready_settlement_required', + serverCustody: false, + }, + deliveryPosture: { + state: 'withheld_until_settlement', + sourceBearingDeliveryVisible: false, + }, + storageRecordCount: 1, + }, + assetPackQuoteReceipt: { + sats: 546, + deterministic: true, + quoteRoot: 'sha256:route-quote-root', + }, + assetPackSettlementInstructions: { + state: 'quote_ready_settlement_required', + serverCustody: false, + }, + assetPackDeliveryPosture: { + state: 'withheld_until_settlement', + sourceBearingDeliveryVisible: false, + }, }, }); expect(eventText).toContain('[redacted]'); diff --git a/uapi/tests/terminalPipelineHarnessClient.test.ts b/uapi/tests/terminalPipelineHarnessClient.test.ts index 7165b582..06882e99 100644 --- a/uapi/tests/terminalPipelineHarnessClient.test.ts +++ b/uapi/tests/terminalPipelineHarnessClient.test.ts @@ -188,13 +188,29 @@ describe('terminal pipeline harness client', () => { }, sourceSafePreview: { feeQuote: { - sats: 546, + sats: 500, }, unlock: { state: 'licensed_read', sourceAvailable: true, }, }, + assetPackPreviewBoundary: { + quoteReceipt: { + sats: 546, + quoteRoot: 'sha256:asset-pack-preview-quote-root', + }, + selectedFitProvenance: { + selectedCandidateAssetIds: ['asset-repository-revision'], + fitDepositAssetIds: ['deposit-asset-pack'], + }, + settlementInstructions: { + state: 'quote_ready_settlement_required', + }, + deliveryPosture: { + state: 'withheld_until_settlement', + }, + }, assetPackDisclosureReview: { access: { sourceVisibility: 'available_after_settlement', @@ -214,6 +230,9 @@ describe('terminal pipeline harness client', () => { expect(summary).toContain('candidate asset-repository-revision'); expect(summary).toContain('ledger settled'); expect(summary).toContain('fee 546 sats'); + expect(summary).toContain('quote sha256:asset'); + expect(summary).toContain('settlement quote_ready_settlement_required'); + expect(summary).toContain('delivery withheld_until_settlement'); expect(summary).toContain('source licensed_read'); expect(summary).toContain('disclosure available_after_settlement'); expect(summary).toContain('leakage none'); From fb42f285db7a7172fcaea6d815e52e2c4b130894 Mon Sep 17 00:00:00 2001 From: Garrett Maring Date: Thu, 28 May 2026 19:12:37 -0300 Subject: [PATCH 07/35] V42 Gate 6: Close settlement rights delivery Implement the paid AssetPack settlement boundary through the live harness, route summaries, and Terminal readback. Add the V42 settlement-rights proof artifact, protocol exports, gate checker, workflow wiring, and documentation updates for BTC payment observation, BTD rights transfer, source-to-shares compensation, reconciliation, and repository delivery unlock. Validation: pnpm run check:v42-gate6; pnpm -C uapi exec tsc --noEmit --pretty false; pnpm -C uapi lint; pnpm --filter @bitcode/protocol test; git diff --check; changed-file value-marker secret scan. --- .bitcode/v42-settlement-rights-delivery.json | 587 ++++++++++++++++++ .github/workflows/bitcode-canon-quality.yml | 3 + .github/workflows/bitcode-gate-quality.yml | 3 + BITCODE_SPEC_V42.md | 3 + BITCODE_SPEC_V42_DELTA.md | 1 + BITCODE_SPEC_V42_NOTES.md | 7 + BITCODE_SPEC_V42_PARITY_MATRIX.md | 4 +- README.md | 11 + SPECIFICATIONS_ROADMAP.md | 5 +- package.json | 3 + .../src/__tests__/asset-pack-harness.test.ts | 7 + .../pipeline-hosts/src/asset-pack-harness.ts | 100 ++- packages/pipelines/asset-pack/README.md | 9 + packages/protocol/README.md | 15 + .../v42-settlement-rights-delivery.js | 301 +++++++++ packages/protocol/src/index.d.ts | 8 + packages/protocol/src/index.js | 10 + .../v42-settlement-rights-delivery.test.js | 68 ++ ...k-v42-gate6-settlement-rights-delivery.mjs | 252 ++++++++ ...enerate-v42-settlement-rights-delivery.mjs | 61 ++ .../api/pipeline-harness/asset-pack/runner.ts | 209 +++++++ uapi/app/terminal/README.md | 13 + .../terminal/TerminalDepositReadWorkbench.tsx | 117 ++++ .../terminal-pipeline-harness-client.ts | 32 + uapi/tests/api/pipelineHarnessRoute.test.ts | 148 +++++ .../terminalPipelineHarnessClient.test.ts | 23 + 26 files changed, 1976 insertions(+), 24 deletions(-) create mode 100644 .bitcode/v42-settlement-rights-delivery.json create mode 100644 packages/protocol/src/canonical/v42-settlement-rights-delivery.js create mode 100644 packages/protocol/test/v42-settlement-rights-delivery.test.js create mode 100644 scripts/check-v42-gate6-settlement-rights-delivery.mjs create mode 100644 scripts/generate-v42-settlement-rights-delivery.mjs diff --git a/.bitcode/v42-settlement-rights-delivery.json b/.bitcode/v42-settlement-rights-delivery.json new file mode 100644 index 00000000..f8517199 --- /dev/null +++ b/.bitcode/v42-settlement-rights-delivery.json @@ -0,0 +1,587 @@ +{ + "artifactId": "v42-settlement-rights-delivery", + "schemaId": "bitcode.v42.settlementRightsDelivery.v1", + "version": "V42", + "currentTarget": "V41", + "sourceSafetyVerdict": "source-safe-v42-settlement-rights-delivery-metadata", + "rowIds": [ + "purchase:quote-to-payment-observation", + "finality:btc-testnet-confirmation-gate", + "rights:btd-read-right-transfer", + "compensation:source-to-shares-conservation", + "delivery:source-bearing-pull-request-unlock", + "sync:ledger-database-object-storage-reconciliation", + "repair:fail-closed-settlement-posture", + "route:harness-settlement-summary", + "ui:terminal-settlement-readback", + "host:live-harness-boundary-materialization", + "proof:tests-artifact-workflow" + ], + "rows": [ + { + "rowId": "purchase:quote-to-payment-observation", + "purpose": "Convert the Gate 5 deterministic quote into a reader BTC payment observation without server custody or private wallet material.", + "sourceRoots": [ + "packages/pipelines/asset-pack/src/asset-pack-settlement-rights-delivery.ts", + "packages/pipelines/asset-pack/src/asset-pack-preview-boundary.ts", + "uapi/app/api/pipeline-harness/asset-pack/runner.ts" + ], + "emittedTypes": [ + "AssetPackSettlementPaymentObservation", + "AssetPackPreviewQuoteReceipt" + ], + "requiredEvidence": [ + "expectedSats", + "observedDebitSats", + "observedCreditSats", + "serverCustody: false" + ], + "rowRoot": "v42-settlement-rights-delivery-row:6a9db7cbd29a673da5745714", + "sourceSafetyClass": "source_safe_v42_settlement_rights_delivery_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourcePayloadSerialized": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "credentialsSerialized": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "secret-values" + ] + }, + { + "rowId": "finality:btc-testnet-confirmation-gate", + "purpose": "Require confirmed BTC/testnet finality before BTD rights transfer, source unlock, or source-bearing repository delivery.", + "sourceRoots": [ + "packages/pipelines/asset-pack/src/asset-pack-settlement-rights-delivery.ts", + "packages/pipelines/asset-pack/src/__tests__/asset-pack-settlement-rights-delivery.test.ts", + "packages/btd/src/receipts.ts" + ], + "emittedTypes": [ + "AssetPackSettlementFinalityReceipt", + "BtdRightsTransferReceipt" + ], + "requiredEvidence": [ + "finalityState", + "confirmed", + "Rights transfer receipt requires confirmed BTC fee finality" + ], + "rowRoot": "v42-settlement-rights-delivery-row:48bb991b2af8b770ed85c7f6", + "sourceSafetyClass": "source_safe_v42_settlement_rights_delivery_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourcePayloadSerialized": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "credentialsSerialized": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "secret-values" + ] + }, + { + "rowId": "rights:btd-read-right-transfer", + "purpose": "Transfer the BTD read right to the paying reader only after the quote, payment, finality, and conservation checks agree.", + "sourceRoots": [ + "packages/pipelines/asset-pack/src/asset-pack-settlement-rights-delivery.ts", + "packages/btd/src/receipts.ts", + "packages/pipelines/asset-pack/src/__tests__/asset-pack-settlement-rights-delivery.test.ts" + ], + "emittedTypes": [ + "BtdRightsTransferReceipt", + "BtdReadReceipt" + ], + "requiredEvidence": [ + "buildBtdRightsTransferReceipt", + "buildBtdReadReceipt", + "paid_unlocked", + "licensed_read" + ], + "rowRoot": "v42-settlement-rights-delivery-row:74d15d0a778a706f9859887e", + "sourceSafetyClass": "source_safe_v42_settlement_rights_delivery_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourcePayloadSerialized": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "credentialsSerialized": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "secret-values" + ] + }, + { + "rowId": "compensation:source-to-shares-conservation", + "purpose": "Allocate BTC sats to selected fit deposits with deterministic source-to-shares conservation and proof roots.", + "sourceRoots": [ + "packages/pipelines/asset-pack/src/asset-pack-settlement-rights-delivery.ts", + "packages/btd/src/source-to-shares.ts", + "packages/pipelines/asset-pack/src/__tests__/asset-pack-settlement-rights-delivery.test.ts" + ], + "emittedTypes": [ + "SourceToSharesProof", + "settlementConservation" + ], + "requiredEvidence": [ + "buildSourceToSharesProof", + "settlementAllocations", + "balanced" + ], + "rowRoot": "v42-settlement-rights-delivery-row:8d69b6c060bb87916dd00328", + "sourceSafetyClass": "source_safe_v42_settlement_rights_delivery_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourcePayloadSerialized": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "credentialsSerialized": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "secret-values" + ] + }, + { + "rowId": "delivery:source-bearing-pull-request-unlock", + "purpose": "Unlock the source-bearing pull request only after payment finality, BTD rights, compensation, and reconciliation readbacks pass.", + "sourceRoots": [ + "packages/pipelines/asset-pack/src/asset-pack-settlement-rights-delivery.ts", + "packages/btd/src/settlement.ts", + "uapi/app/terminal/TerminalDepositReadWorkbench.tsx" + ], + "emittedTypes": [ + "AssetPackDeliveryUnlockReceipt", + "AssetPackSettlementUnlock" + ], + "requiredEvidence": [ + "source_bearing_pull_request_ready", + "pull_request_after_settlement", + "sourceBearingDeliveryVisibleToReader" + ], + "rowRoot": "v42-settlement-rights-delivery-row:9cbc9e6c25316593954f2c88", + "sourceSafetyClass": "source_safe_v42_settlement_rights_delivery_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourcePayloadSerialized": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "credentialsSerialized": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "secret-values" + ] + }, + { + "rowId": "sync:ledger-database-object-storage-reconciliation", + "purpose": "Synchronize ledger facts, database projections, object storage roots, and staging-testnet readback before delivery is visible.", + "sourceRoots": [ + "packages/pipelines/asset-pack/src/asset-pack-settlement-rights-delivery.ts", + "packages/btd/src/reconciliation.ts", + "uapi/app/api/pipeline-harness/asset-pack/runner.ts" + ], + "emittedTypes": [ + "LedgerDatabaseReconciliationReport" + ], + "requiredEvidence": [ + "reconcileLedgerDatabaseProjection", + "buildSupabaseStagingTestnetProjectionReadback", + "tkpyosihuouusyaxtbau" + ], + "rowRoot": "v42-settlement-rights-delivery-row:51d4635144f588839effe4f4", + "sourceSafetyClass": "source_safe_v42_settlement_rights_delivery_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourcePayloadSerialized": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "credentialsSerialized": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "secret-values" + ] + }, + { + "rowId": "repair:fail-closed-settlement-posture", + "purpose": "Represent underpayment, missing finality, projection drift, and missing delivery as repairable blockers without leaking source.", + "sourceRoots": [ + "packages/pipelines/asset-pack/src/asset-pack-settlement-rights-delivery.ts", + "packages/pipelines/asset-pack/src/__tests__/asset-pack-settlement-rights-delivery.test.ts" + ], + "emittedTypes": [ + "AssetPackSettlementRightsDeliveryRepairPosture" + ], + "requiredEvidence": [ + "blocked_until_payment_finality", + "blocked_until_compensation_conservation", + "blocked_until_projection_repair" + ], + "rowRoot": "v42-settlement-rights-delivery-row:b5698bf4f3b93121a624bd5f", + "sourceSafetyClass": "source_safe_v42_settlement_rights_delivery_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourcePayloadSerialized": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "credentialsSerialized": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "secret-values" + ] + }, + { + "rowId": "route:harness-settlement-summary", + "purpose": "Summarize payment, finality, rights, source-to-shares, delivery, reconciliation, replay, and storage roots through the harness route.", + "sourceRoots": [ + "uapi/app/api/pipeline-harness/asset-pack/runner.ts", + "uapi/tests/api/pipelineHarnessRoute.test.ts" + ], + "emittedTypes": [ + "assetPackSettlementRightsDeliveryBoundary", + "assetPackDeliveryUnlock" + ], + "requiredEvidence": [ + "summarizeAssetPackSettlementRightsDeliveryBoundary", + "assetPackLedgerDatabaseStorageReconciliation" + ], + "rowRoot": "v42-settlement-rights-delivery-row:7fffe81a5aff0562ee30737d", + "sourceSafetyClass": "source_safe_v42_settlement_rights_delivery_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourcePayloadSerialized": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "credentialsSerialized": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "secret-values" + ] + }, + { + "rowId": "ui:terminal-settlement-readback", + "purpose": "Render settlement rights, compensation, delivery, replay, and reconciliation readback in Terminal expandable metadata.", + "sourceRoots": [ + "uapi/app/terminal/TerminalDepositReadWorkbench.tsx", + "uapi/app/terminal/terminal-pipeline-harness-client.ts", + "uapi/tests/terminalPipelineHarnessClient.test.ts" + ], + "emittedTypes": [ + "assetPackSettlementBoundaryRows", + "TerminalReadFitsFindingSynthesisHarnessStreamSnapshot" + ], + "requiredEvidence": [ + "Settlement rights, compensation, and delivery", + "settlement-boundary", + "delivery-unlock" + ], + "rowRoot": "v42-settlement-rights-delivery-row:4a0ae64335797f60b63c3742", + "sourceSafetyClass": "source_safe_v42_settlement_rights_delivery_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourcePayloadSerialized": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "credentialsSerialized": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "secret-values" + ] + }, + { + "rowId": "host:live-harness-boundary-materialization", + "purpose": "Materialize AssetPackPreviewBoundary and AssetPackSettlementRightsDeliveryBoundary inside the live sandbox harness output.", + "sourceRoots": [ + "packages/pipeline-hosts/src/asset-pack-harness.ts", + "packages/pipeline-hosts/src/__tests__/asset-pack-harness.test.ts" + ], + "emittedTypes": [ + "assetPackPreviewBoundary", + "assetPackSettlementRightsDeliveryBoundary" + ], + "requiredEvidence": [ + "buildAssetPackSettlementRightsDeliveryBoundary", + "persistAssetPackSettlementRightsDeliveryBoundary" + ], + "rowRoot": "v42-settlement-rights-delivery-row:e3999d37f9ba9d8d0c3fd9de", + "sourceSafetyClass": "source_safe_v42_settlement_rights_delivery_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourcePayloadSerialized": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "credentialsSerialized": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "secret-values" + ] + }, + { + "rowId": "proof:tests-artifact-workflow", + "purpose": "Bind V42 Gate 6 closure to generated artifact, protocol test, package tests, harness route tests, docs, and workflow checks.", + "sourceRoots": [ + ".github/workflows/bitcode-gate-quality.yml", + ".github/workflows/bitcode-canon-quality.yml", + "package.json" + ], + "emittedTypes": [ + "V42SettlementRightsDelivery" + ], + "requiredEvidence": [ + "check-v42-gate6-settlement-rights-delivery.mjs", + "v42-settlement-rights-delivery" + ], + "rowRoot": "v42-settlement-rights-delivery-row:b09ae61cf4664f8a3914be8e", + "sourceSafetyClass": "source_safe_v42_settlement_rights_delivery_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourcePayloadSerialized": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "credentialsSerialized": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "wallet-private-material", + "settlement-private-payloads", + "secret-values" + ] + } + ], + "predicateResults": [ + { + "id": "boundary-defines-core-types", + "sourcePath": "packages/pipelines/asset-pack/src/asset-pack-settlement-rights-delivery.ts", + "passed": true + }, + { + "id": "boundary-composes-btd-primitives", + "sourcePath": "packages/pipelines/asset-pack/src/asset-pack-settlement-rights-delivery.ts", + "passed": true + }, + { + "id": "boundary-builds-source-to-shares", + "sourcePath": "packages/pipelines/asset-pack/src/asset-pack-settlement-rights-delivery.ts", + "passed": true + }, + { + "id": "boundary-builds-reconciliation", + "sourcePath": "packages/pipelines/asset-pack/src/asset-pack-settlement-rights-delivery.ts", + "passed": true + }, + { + "id": "boundary-source-safety", + "sourcePath": "packages/pipelines/asset-pack/src/asset-pack-settlement-rights-delivery.ts", + "passed": true + }, + { + "id": "tests-cover-confirmed-delivery", + "sourcePath": "packages/pipelines/asset-pack/src/__tests__/asset-pack-settlement-rights-delivery.test.ts", + "passed": true + }, + { + "id": "tests-cover-underpayment", + "sourcePath": "packages/pipelines/asset-pack/src/__tests__/asset-pack-settlement-rights-delivery.test.ts", + "passed": true + }, + { + "id": "tests-cover-finality", + "sourcePath": "packages/pipelines/asset-pack/src/__tests__/asset-pack-settlement-rights-delivery.test.ts", + "passed": true + }, + { + "id": "tests-cover-reconciliation-drift", + "sourcePath": "packages/pipelines/asset-pack/src/__tests__/asset-pack-settlement-rights-delivery.test.ts", + "passed": true + }, + { + "id": "host-materializes-boundary", + "sourcePath": "packages/pipeline-hosts/src/asset-pack-harness.ts", + "passed": true + }, + { + "id": "host-test-covers-boundary", + "sourcePath": "packages/pipeline-hosts/src/__tests__/asset-pack-harness.test.ts", + "passed": true + }, + { + "id": "route-summarizes-boundary", + "sourcePath": "uapi/app/api/pipeline-harness/asset-pack/runner.ts", + "passed": true + }, + { + "id": "route-test-covers-boundary", + "sourcePath": "uapi/tests/api/pipelineHarnessRoute.test.ts", + "passed": true + }, + { + "id": "terminal-renders-boundary", + "sourcePath": "uapi/app/terminal/TerminalDepositReadWorkbench.tsx", + "passed": true + }, + { + "id": "terminal-client-summarizes-boundary", + "sourcePath": "uapi/app/terminal/terminal-pipeline-harness-client.ts", + "passed": true + }, + { + "id": "terminal-client-test-covers-boundary", + "sourcePath": "uapi/tests/terminalPipelineHarnessClient.test.ts", + "passed": true + }, + { + "id": "v42-spec-expanded", + "sourcePath": "BITCODE_SPEC_V42.md", + "passed": true + }, + { + "id": "v42-delta-expanded", + "sourcePath": "BITCODE_SPEC_V42_DELTA.md", + "passed": true + }, + { + "id": "v42-notes-expanded", + "sourcePath": "BITCODE_SPEC_V42_NOTES.md", + "passed": true + }, + { + "id": "v42-parity-implemented", + "sourcePath": "BITCODE_SPEC_V42_PARITY_MATRIX.md", + "passed": true + }, + { + "id": "roadmap-advanced-to-gate6", + "sourcePath": "SPECIFICATIONS_ROADMAP.md", + "passed": true + }, + { + "id": "readmes-document-gate6", + "sourcePath": "README.md", + "passed": true + }, + { + "id": "protocol-exports-gate6", + "sourcePath": "packages/protocol/src/index.js", + "passed": true + }, + { + "id": "package-scripts-wire-gate6", + "sourcePath": "package.json", + "passed": true + }, + { + "id": "workflows-run-gate6-check", + "sourcePath": ".github/workflows/bitcode-gate-quality.yml", + "passed": true + } + ], + "coverage": { + "rowCount": 11, + "sourceSafetyVerdict": "source-safe-v42-settlement-rights-delivery-metadata", + "runtimeType": "AssetPackSettlementRightsDeliveryBoundary", + "paymentType": "AssetPackSettlementPaymentObservation", + "finalityType": "AssetPackSettlementFinalityReceipt", + "rightsTransferType": "BtdRightsTransferReceipt", + "readReceiptType": "BtdReadReceipt", + "sourceToSharesType": "SourceToSharesProof", + "reconciliationType": "LedgerDatabaseReconciliationReport", + "deliveryType": "AssetPackDeliveryUnlockReceipt", + "replayType": "AssetPackSettlementRightsDeliveryReplayReceipt", + "requiredReadbacksBeforeUnlock": [ + "btc_payment_observation", + "settlement_finality", + "source_to_shares_compensation", + "btd_rights_transfer", + "ledger_database_storage_reconciliation" + ], + "stagingProjectRef": "tkpyosihuouusyaxtbau", + "stagingRestHost": "https://tkpyosihuouusyaxtbau.supabase.co/rest/v1/", + "sourceSafeMetadataOnly": true, + "protectedSourcePayloadSerialized": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "credentialsSerialized": false, + "hostBoundaryMaterializationCovered": true, + "routeReadbackCovered": true, + "terminalReadbackCovered": true, + "confirmedPaymentCovered": true, + "underpaymentBlockedCovered": true, + "finalityBlockedCovered": true, + "reconciliationRepairCovered": true, + "failedPredicateIds": [] + }, + "passed": true, + "artifactRoot": "v42-settlement-rights-delivery:09c7a0fd5dd0b1952aa75eb9" +} diff --git a/.github/workflows/bitcode-canon-quality.yml b/.github/workflows/bitcode-canon-quality.yml index 23a88608..e8a99519 100644 --- a/.github/workflows/bitcode-canon-quality.yml +++ b/.github/workflows/bitcode-canon-quality.yml @@ -307,6 +307,9 @@ jobs: if [ -f scripts/check-v42-gate5-readfitsfinding-preview-quote.mjs ]; then node scripts/check-v42-gate5-readfitsfinding-preview-quote.mjs --skip-branch-check --skip-package-tests --skip-uapi-tests fi + if [ -f scripts/check-v42-gate6-settlement-rights-delivery.mjs ]; then + node scripts/check-v42-gate6-settlement-rights-delivery.mjs --skip-branch-check --skip-package-tests --skip-uapi-tests + fi fi else echo "Unexpected BITCODE_SPEC.txt pointer: $POINTER" >&2 diff --git a/.github/workflows/bitcode-gate-quality.yml b/.github/workflows/bitcode-gate-quality.yml index 9c2a28c0..1ebd2c12 100644 --- a/.github/workflows/bitcode-gate-quality.yml +++ b/.github/workflows/bitcode-gate-quality.yml @@ -436,6 +436,9 @@ jobs: if [ -f scripts/check-v42-gate5-readfitsfinding-preview-quote.mjs ]; then node scripts/check-v42-gate5-readfitsfinding-preview-quote.mjs --skip-branch-check --skip-package-tests --skip-uapi-tests fi + if [ -f scripts/check-v42-gate6-settlement-rights-delivery.mjs ]; then + node scripts/check-v42-gate6-settlement-rights-delivery.mjs --skip-branch-check --skip-package-tests --skip-uapi-tests + fi fi else echo "Unexpected BITCODE_SPEC.txt pointer: $POINTER" >&2 diff --git a/BITCODE_SPEC_V42.md b/BITCODE_SPEC_V42.md index 316527d3..81be977c 100644 --- a/BITCODE_SPEC_V42.md +++ b/BITCODE_SPEC_V42.md @@ -148,6 +148,9 @@ The artifact binds the accepted-Need gate, many-channel Depository search, candi Gate 6 must make purchase and delivery reliable. The accepted user path is: review the AssetPack preview, choose to buy, receive settlement instructions, observe BTC/testnet settlement in the admitted lane, transfer BTD rights to the Reader, unlock source-bearing AssetPack delivery, and create the repository pull request. It must prove ledger/database/object-storage synchronization, delivery locks, no pre-settlement source leakage, compensation accounting, repair actions, and operator readback. +Gate 6 is implemented by `.bitcode/v42-settlement-rights-delivery.json`. +The artifact binds `AssetPackSettlementRightsDeliveryBoundary`, `AssetPackSettlementPaymentObservation`, confirmed BTC/testnet finality, `BtdRightsTransferReceipt`, `BtdReadReceipt`, `SourceToSharesProof`, `AssetPackDeliveryUnlockReceipt`, ledger/database/object-storage reconciliation, live harness materialization, source-safe route summaries, and Terminal settlement rights readback. +Source-bearing AssetPack delivery remains withheld until payment, finality, BTD rights transfer, source-to-shares compensation conservation, reconciliation readback, and pull-request delivery all agree. ## V42 Gate 7 AI-Reading Dominant Demonstration MVP diff --git a/BITCODE_SPEC_V42_DELTA.md b/BITCODE_SPEC_V42_DELTA.md index 177b9a08..f0e9c5a7 100644 --- a/BITCODE_SPEC_V42_DELTA.md +++ b/BITCODE_SPEC_V42_DELTA.md @@ -57,6 +57,7 @@ Gate 5 now binds `ReadFitsFindingRuntime`, many-channel Depository search, `Asse ### Gate 6: Settlement Rights Transfer And Repository Delivery Closure Implement and prove purchase, settlement observation, BTD rights transfer, source unlock, repository pull request delivery, compensation accounting, and repair posture. +Gate 6 now binds settlement rights transfer through `AssetPackSettlementRightsDeliveryBoundary` to the live harness, route summary, Terminal readback, source-to-shares conservation, BTD read/right receipts, and ledger/database/object-storage reconciliation through `.bitcode/v42-settlement-rights-delivery.json`. ### Gate 7: AI-Reading Dominant Demonstration MVP diff --git a/BITCODE_SPEC_V42_NOTES.md b/BITCODE_SPEC_V42_NOTES.md index 139f5316..27b6ba24 100644 --- a/BITCODE_SPEC_V42_NOTES.md +++ b/BITCODE_SPEC_V42_NOTES.md @@ -69,6 +69,13 @@ Selected-fit provenance carries selected candidate ids, fit deposit ids, query a `AssetPackPreviewBoundary` is the review object before payment: it contains the source-safe preview, deterministic quote receipt, disclosure review, settlement instructions, delivery lock, storage projection, replay receipt, and repair posture. The route and Terminal readback expose those fields as metadata only; protected source and unpaid AssetPack source remain absent until Gate 6 settlement, rights transfer, and delivery unlock. +## Gate 6 implementation notes + +Gate 6 closes the paid settlement and source-bearing delivery boundary. +`AssetPackSettlementRightsDeliveryBoundary` is the reviewable post-payment object: it records BTC payment observation, confirmed finality, source-to-shares compensation, BTD read and rights transfer receipts, settlement unlock, source-bearing pull-request delivery unlock, ledger/database/object-storage reconciliation, storage projection, replay receipt, and repair posture. +The live Vercel Sandbox harness materializes this boundary after ledger readback, the route summarizes it as source-safe metadata, and Terminal renders settlement rights, source-to-shares compensation, delivery unlock, reconciliation, and replay roots. +Protected source, private settlement payloads, wallet private material, raw protected prompts, raw provider responses, and credentials remain absent from the generated artifact, route summaries, and pre-delivery readback. + ## AI-reading demonstration note The standalone demonstration should prove why Bitcode matters for AI-dominant Reading. diff --git a/BITCODE_SPEC_V42_PARITY_MATRIX.md b/BITCODE_SPEC_V42_PARITY_MATRIX.md index 65c010b7..174f9176 100644 --- a/BITCODE_SPEC_V42_PARITY_MATRIX.md +++ b/BITCODE_SPEC_V42_PARITY_MATRIX.md @@ -37,7 +37,7 @@ This matrix records the reliable MVP product surfaces that must become promotion | Reading state machine | Five-step Reading UX is route-owned, persistent, and source-safe | `.bitcode/v42-reading-shortest-path-state-machine.json`, `TerminalEnterpriseReadingRouteState`, `readingStage`, route/retry/failure tests | implemented | | ReadNeed product closure | Need synthesis, review, feedback, resynthesis, accepted-Need admission, rejected Need blockers, source-safe telemetry, and Terminal runtime readback are product-ready | `.bitcode/v42-readneed-review-resynthesis-product-closure.json`, `ReadNeedReviewResynthesisRuntime`, `/api/read-review`, Terminal Need runtime readback | implemented | | Finding Fits preview and quote | Many-candidate search, selected-fit provenance, source-safe preview, and quote are product-ready | `.bitcode/v42-readfitsfinding-preview-quote.json`, `ReadFitsFindingRuntime`, `AssetPackPreviewBoundary`, harness preview summary, Terminal preview/quote/provenance readback | implemented | -| Settlement and delivery | BTC/BTD settlement, rights transfer, compensation, and repository PR delivery are synchronized | later V42 Gate 6 artifact | draft-required | +| Settlement and delivery | BTC/BTD settlement, rights transfer, compensation, and repository PR delivery are synchronized | `.bitcode/v42-settlement-rights-delivery.json`, `AssetPackSettlementRightsDeliveryBoundary`, live harness settlement boundary, route summary, Terminal settlement readback | implemented | | AI-reading demonstration | Standalone demonstration proves AssetPack improves AI beyond public-data-only baseline | later V42 Gate 7 artifact | draft-required | | Local/staging rehearsal | Full MVP path rehearsed locally and in staging-testnet with mainnet blocked | later V42 Gate 8 artifact | draft-required | | Promotion readiness | V42 proof and workflow promotion ready | later V42 Gate 9 artifact | draft-required | @@ -51,7 +51,7 @@ This matrix records the reliable MVP product surfaces that must become promotion | Gate 3 | Reading shortest path state machine artifact | implemented | | Gate 4 | ReadNeed review and resynthesis product closure artifact | implemented | | Gate 5 | ReadFitsFinding AssetPack preview and quote closure artifact | implemented | -| Gate 6 | Settlement rights transfer and repository delivery closure artifact | draft-required | +| Gate 6 | Settlement rights transfer and repository delivery closure artifact | implemented | | Gate 7 | AI-reading dominant demonstration MVP artifact | draft-required | | Gate 8 | Local and staging-testnet full MVP rehearsal artifact | draft-required | | Gate 9 | Promotion readiness artifact and workflow | draft-required | diff --git a/README.md b/README.md index dbc40710..43f245fd 100644 --- a/README.md +++ b/README.md @@ -116,6 +116,17 @@ readback, `.bitcode/v42-readfitsfinding-preview-quote.json`, and protected source, unpaid AssetPack source, wallet private material, private settlement payloads, credentials, raw protected prompts, and raw provider responses stay out of route and UI readback. +V42 Gate 6 adds paid settlement, BTD rights transfer, source-to-shares +compensation, and repository delivery closure with +`AssetPackSettlementRightsDeliveryBoundary`, +`.bitcode/v42-settlement-rights-delivery.json`, and `check:v42-gate6`. +The boundary observes the quote payment, confirms BTC/testnet finality, +allocates depositor compensation, records BTD read-right receipts, reconciles +ledger/database/object-storage projections, and unlocks source-bearing +pull-request delivery only after paid readback agrees. Route summaries and +Terminal detail remain source-safe metadata: unpaid AssetPack source, wallet +private material, private settlement payloads, credentials, raw protected +prompts, and raw provider responses are withheld. V43+ is roadmapped as the later agentic depositing evolution: repository agents synthesize deposit AssetPack options from connected enterprise code, Depository state, and Reading demand; enterprises approve or reject diff --git a/SPECIFICATIONS_ROADMAP.md b/SPECIFICATIONS_ROADMAP.md index 2d2fe120..173d0d2d 100644 --- a/SPECIFICATIONS_ROADMAP.md +++ b/SPECIFICATIONS_ROADMAP.md @@ -5,14 +5,15 @@ - Current active canonical pointer: `BITCODE_SPEC.txt` -> `V41` - Current active canon: `BITCODE_SPEC_V41.md` - Current draft target: `BITCODE_SPEC_V42.md`. -- Current working gate: V42 Gate 5 ReadFitsFinding AssetPack Preview And Quote Closure. -- Next queued gate after V42 Gate 5: V42 Gate 6 Settlement Rights Transfer And Repository Delivery Closure. +- Current working gate: V42 Gate 6 Settlement Rights Transfer And Repository Delivery Closure. +- Next queued gate after V42 Gate 6: V42 Gate 7 AI-Reading Dominant Demonstration MVP. - Latest closed version: V41 Prompt And PromptPart Excellence, which promoted PromptPart and Prompt inventory, registry interpolation contracts, Reading prompt baselines, ReadNeedComprehensionSynthesis prompt hardening, ReadFitsFindingSynthesis prompt hardening, Conversation/tool/interface prompt rewrite, prompt benchmark telemetry, and V41 promotion readiness. - Recent V42 opening anchor: reliable MVP experience opens over promoted V41 with V42 SPEC, DELTA, NOTES, and PARITY files, `check:v42-gate1`, active V41 / draft V42 posture, and a nine-gate plan for shortest-path Depositing, five-step Reading, ReadNeed product closure, ReadFitsFinding preview and quote closure, settlement and repository delivery, AI-reading demonstration, local/staging rehearsal, and promotion readiness. - V42 Gate 2 closure anchor: reliable MVP experience now owns source-safe Depositing compensation visibility through `DepositorySupplyCompensationPreview`, deposit route `depositoryEvidence.compensationPreview`, deterministic `.bitcode/v42-depositing-shortest-path.json`, route/API readiness checks, source validation, Depository search/vector/storage projection, source-to-shares compensation readback keys, Terminal compensation roots, focused package/protocol tests, workflow wiring, and `check:v42-gate2`. - V42 Gate 3 closure anchor: reliable MVP experience now owns the five-step Reading shortest path state machine through `TerminalEnterpriseReadingUxState`, `TerminalEnterpriseReadingRouteState`, recoverable transaction ids, `readingStage` route hydration, retry/restart posture, source-safe failure repair actions, accepted-Need blockers, source-safe preview blockers, rich Reading pipeline telemetry readback, deterministic `.bitcode/v42-reading-shortest-path-state-machine.json`, focused route/component/protocol tests, workflow wiring, and `check:v42-gate3`. - V42 Gate 4 closure anchor: reliable MVP experience now owns ReadNeed product closure through `ReadNeedReviewResynthesisRuntime`, source-safe storage projection, reviewed Need feedback/resynthesis lineage, accepted-Need Finding Fits admission, rejected Need blockers, PTRR/Failsafe/Thricified telemetry receipts, Terminal Need runtime/storage/telemetry readback, deterministic `.bitcode/v42-readneed-review-resynthesis-product-closure.json`, focused package/route/protocol tests, workflow wiring, and `check:v42-gate4`. - V42 Gate 5 closure anchor: reliable MVP experience now owns ReadFitsFinding preview and quote closure through accepted-Need-gated `ReadFitsFindingRuntime`, many-channel Depository search, selected-fit provenance, `AssetPackPreviewBoundary`, deterministic share-to-fee quote receipts, disclosure review, settlement instructions, delivery lock, harness evidence summaries, Terminal preview/quote/provenance readback, deterministic `.bitcode/v42-readfitsfinding-preview-quote.json`, focused package/route/protocol tests, workflow wiring, and `check:v42-gate5`. +- V42 Gate 6 closure anchor: reliable MVP experience now owns settlement rights transfer and repository delivery closure through `AssetPackSettlementRightsDeliveryBoundary`, BTC payment observation/finality, BTD read and rights transfer receipts, source-to-shares compensation conservation, delivery unlock, ledger/database/object-storage reconciliation, live harness materialization, route settlement summaries, Terminal settlement rights readback, deterministic `.bitcode/v42-settlement-rights-delivery.json`, focused package/host/route/protocol tests, workflow wiring, and `check:v42-gate6`. - Recent V41 closure anchor: V41 canonical promotion updated `BITCODE_SPEC.txt` to `V41`, generated `BITCODE_SPEC_V41_PROVEN.md`, preserved active V41 / draft V42 runtime posture, and closed prompt-program excellence canon. - Recent V40 closure anchor: V40 canonical promotion updated `BITCODE_SPEC.txt` to `V40`, generated `BITCODE_SPEC_V40_PROVEN.md`, preserved active V40 / draft V41 runtime posture, and closed exhaustive commercial application testing canon. - Recent V39 closure anchor: V39 canonical promotion updated `BITCODE_SPEC.txt` to `V39`, generated `BITCODE_SPEC_V39_PROVEN.md`, preserved active V39 / draft V40 runtime posture, and closed commercial Reading readiness canon. diff --git a/package.json b/package.json index 6593a435..0036a41c 100644 --- a/package.json +++ b/package.json @@ -316,6 +316,9 @@ "generate:v42-readfitsfinding-preview-quote": "node scripts/generate-v42-readfitsfinding-preview-quote.mjs", "check:v42-readfitsfinding-preview-quote": "node scripts/generate-v42-readfitsfinding-preview-quote.mjs --check", "check:v42-gate5": "node scripts/check-v42-gate5-readfitsfinding-preview-quote.mjs", + "generate:v42-settlement-rights-delivery": "node scripts/generate-v42-settlement-rights-delivery.mjs", + "check:v42-settlement-rights-delivery": "node scripts/generate-v42-settlement-rights-delivery.mjs --check", + "check:v42-gate6": "node scripts/check-v42-gate6-settlement-rights-delivery.mjs", "generate:v38-inference-surface-inventory": "node scripts/generate-v38-inference-surface-inventory.mjs", "check:v38-inference-surface-inventory": "node scripts/generate-v38-inference-surface-inventory.mjs --check", "check:v38-gate2": "node scripts/check-v38-gate2-inference-surface-inventory.mjs", diff --git a/packages/pipeline-hosts/src/__tests__/asset-pack-harness.test.ts b/packages/pipeline-hosts/src/__tests__/asset-pack-harness.test.ts index 29e84e66..10a43257 100644 --- a/packages/pipeline-hosts/src/__tests__/asset-pack-harness.test.ts +++ b/packages/pipeline-hosts/src/__tests__/asset-pack-harness.test.ts @@ -163,8 +163,12 @@ describe('asset-pack sandbox harness plan', () => { expect(source).toContain('pipeline-stream-event'); expect(source).toContain('synthesizeReadNeedForPipelineInput'); expect(source).toContain('buildAssetPackSourceSafePreview'); + expect(source).toContain('buildAssetPackPreviewBoundary'); + expect(source).toContain('persistAssetPackPreviewBoundary'); expect(source).toContain('buildAssetPackDisclosureReview'); expect(source).toContain('assertAssetPackDisclosureSourceSafe'); + expect(source).toContain('buildAssetPackSettlementRightsDeliveryBoundary'); + expect(source).toContain('persistAssetPackSettlementRightsDeliveryBoundary'); expect(source).toContain('buildAssetPackSettlementUnlock'); expect(source).toContain('applyAssetPackSettlementUnlockToPreview'); expect(source).toContain('acceptedReadNeed: readNeed'); @@ -212,6 +216,9 @@ describe('asset-pack sandbox harness plan', () => { expect(source).toContain('asset_pack_source_safe_preview'); expect(source).toContain('staging-testnet-readback-'); expect(source).toContain("execution.store('asset-pack/settlement', 'ledgerDatabaseReconciliation'"); + expect(source).toContain('assetPackSettlementRightsDeliveryBoundary'); + expect(source).toContain('assetPackSettlementReplayReceipt'); + expect(source).toContain('assetPackDeliveryUnlock'); expect(source).toContain("execution.store('asset-pack/settlement', 'organizationAuthority'"); expect(source).toContain('organizationAuthorityDecision'); expect(source).toContain('organizationAuthorityRoot'); diff --git a/packages/pipeline-hosts/src/asset-pack-harness.ts b/packages/pipeline-hosts/src/asset-pack-harness.ts index d1d943ef..d0a64084 100644 --- a/packages/pipeline-hosts/src/asset-pack-harness.ts +++ b/packages/pipeline-hosts/src/asset-pack-harness.ts @@ -1678,10 +1678,14 @@ try { assetPackPipeline, acceptReadNeed, buildAssetPackDisclosureReview, + buildAssetPackPreviewBoundary, + buildAssetPackSettlementRightsDeliveryBoundary, buildAssetPackSourceSafePreview, buildReadingPipelineObservabilityInventory, assertAssetPackDisclosureSourceSafe, isAcceptedReadNeed, + persistAssetPackPreviewBoundary, + persistAssetPackSettlementRightsDeliveryBoundary, resolveReadingPipelineTelemetryProjection, summarizeReadingPipelineObservabilityCoverage, synthesizeReadNeedForPipelineInput, @@ -1824,6 +1828,16 @@ try { const sourceSafeDisclosureReview = buildAssetPackDisclosureReview({ preview: sourceSafePreview }); assertAssetPackDisclosureSourceSafe(sourceSafeDisclosureReview); execution.store('asset-pack/preview', 'disclosureReview', sourceSafeDisclosureReview); + let assetPackPreviewBoundary = output?.assetPackPreviewBoundary || null; + if (!assetPackPreviewBoundary || assetPackPreviewBoundary.schema !== 'bitcode.asset-pack.preview-boundary') { + assetPackPreviewBoundary = buildAssetPackPreviewBoundary({ + need: readNeed, + fitResult, + sourceSafePreview, + pullRequestTarget: pullRequestUrl || null, + }); + } + persistAssetPackPreviewBoundary(execution, assetPackPreviewBoundary); const pipelineResultReasons = Array.isArray(fitResult?.resultReasons) ? fitResult.resultReasons : Array.isArray(depositorySearch?.resultReasons) @@ -2014,26 +2028,64 @@ try { reason: settlementUnlock.reason, }); assertAssetPackDisclosureSourceSafe(assetPackDisclosureReview); - const organizationAuthority = [ - evaluateBtdOrganizationInterfaceAuthority({ - actorId: userId || readerWalletId, - organizationId: manifest.organizationId || manifest.organization?.id || 'staging-testnet-organization', - organizationRole: 'admin', - organizationPermissionGrants: ['asset_pack:deliver'], - interfaceSurface: 'terminal', - action: 'deliver_asset_pack', - walletId: readerWalletId, - targetAnchor: pullRequestUrl || null, - readAccessDecision: settlementUnlock.sourceAvailable - ? { - decision: 'licensed_read', - accessPolicyHash: ledgerSettlement.accessPolicyHash || sourceSafePreview?.accessPolicy?.accessPolicyHash || 'policy-pending', - reason: settlementUnlock.reason, - } - : null, - settlementState: settlementUnlock.sourceAvailable ? 'settled' : 'pending', - confirmed: ledgerSettlement.settlementAdmissible === true, - repairApprovalState: 'not_required', + const settlementFinalityConfirmed = + ledgerSettlement?.status === 'settled' && ledgerSettlement?.settlementAdmissible === true; + const settlementObservedSats = + Number(ledgerSettlement?.btcFee?.satsPaid || assetPackPreviewBoundary?.quoteReceipt?.sats || 0) || + Number(assetPackPreviewBoundary?.quoteReceipt?.sats || 0); + const assetPackSettlementRightsDeliveryBoundary = assetPackPreviewBoundary + ? buildAssetPackSettlementRightsDeliveryBoundary({ + previewBoundary: assetPackPreviewBoundary, + paymentObservation: { + paymentReceiptId: ledgerSettlement?.btcFeeReceiptId || undefined, + payerWalletId: readerWalletId, + payeeWalletId: depositorWalletId, + btcNetwork: ledgerSettlement?.btcFee?.network || 'testnet', + expectedSats: assetPackPreviewBoundary.quoteReceipt.sats, + observedDebitSats: settlementObservedSats, + observedCreditSats: settlementObservedSats, + txid: + ledgerSettlement?.btcFee?.txid || + ledgerSettlement?.btcFeeReceiptId || + 'staging-testnet-' + runId, + }, + finality: { + finalityState: settlementFinalityConfirmed ? 'confirmed' : 'prepared', + confirmations: settlementFinalityConfirmed ? 1 : 0, + blockHeight: null, + }, + readerWalletId, + depositorWalletId, + orderId: ledgerSettlement?.ownershipEventId || undefined, + readId: manifest.read?.id || runId, + readLicenseId: ledgerSettlement?.readLicenseId || undefined, + ledgerAnchorId: ledgerSettlement?.ledgerAnchorId || undefined, + pullRequestTarget: pullRequestUrl || null, + }) + : null; + if (assetPackSettlementRightsDeliveryBoundary) { + persistAssetPackSettlementRightsDeliveryBoundary(execution, assetPackSettlementRightsDeliveryBoundary); + } + const organizationAuthority = [ + evaluateBtdOrganizationInterfaceAuthority({ + actorId: userId || readerWalletId, + organizationId: manifest.organizationId || manifest.organization?.id || 'staging-testnet-organization', + organizationRole: 'admin', + organizationPermissionGrants: ['asset_pack:deliver'], + interfaceSurface: 'terminal', + action: 'deliver_asset_pack', + walletId: readerWalletId, + targetAnchor: pullRequestUrl || null, + readAccessDecision: settlementUnlock.sourceAvailable + ? { + decision: 'licensed_read', + accessPolicyHash: ledgerSettlement.accessPolicyHash || sourceSafePreview?.accessPolicy?.accessPolicyHash || 'policy-pending', + reason: settlementUnlock.reason, + } + : null, + settlementState: settlementUnlock.sourceAvailable ? 'settled' : 'pending', + confirmed: ledgerSettlement.settlementAdmissible === true, + repairApprovalState: 'not_required', }), ]; execution.store('asset-pack/preview', 'sourceSafe', settledSourceSafePreview); @@ -2044,7 +2096,13 @@ try { output = { ...(output || {}), sourceSafePreview: settledSourceSafePreview, + assetPackPreviewBoundary, assetPackDisclosureReview, + assetPackSettlementRightsDeliveryBoundary, + assetPackSettlementReplayReceipt: assetPackSettlementRightsDeliveryBoundary?.replayReceipt || null, + assetPackDeliveryUnlock: assetPackSettlementRightsDeliveryBoundary?.deliveryUnlock || null, + assetPackLedgerDatabaseStorageReconciliation: + assetPackSettlementRightsDeliveryBoundary?.reconciliationReport || null, organizationAuthority, ledgerSettlement: { ...ledgerSettlement, @@ -2090,6 +2148,8 @@ try { fitResult, depositorySearch, sourceSafePreview: settledSourceSafePreview, + assetPackPreviewBoundary, + assetPackSettlementRightsDeliveryBoundary, assetPackDisclosureReview, assetPackSynthesisArtifacts: output?.assetPackSynthesisArtifacts || null, writtenAssets: output?.writtenAssets || null, diff --git a/packages/pipelines/asset-pack/README.md b/packages/pipelines/asset-pack/README.md index 9d328152..1da60ea5 100644 --- a/packages/pipelines/asset-pack/README.md +++ b/packages/pipelines/asset-pack/README.md @@ -212,6 +212,15 @@ source, raw protected prompts, raw provider responses, wallet private material, private settlement payloads, credentials, or unpaid source-bearing AssetPack content. +V42 Gate 6 binds Settlement Rights Delivery into product closure through +`.bitcode/v42-settlement-rights-delivery.json` and `check:v42-gate6`. +That proof requires paid BTC observation, finality gating, BTD rights transfer, +source-to-shares conservation, repository delivery unlock, +ledger/database/object-storage reconciliation, live harness materialization, +route readback, Terminal readback, focused package/API/protocol tests, and +source-safe docs before the paid AssetPack can cross the Reader visibility +boundary. + ## Operational Telemetry Repair Readback `ReadingOperationalTelemetryRepairReadback` is the source-safe package diff --git a/packages/protocol/README.md b/packages/protocol/README.md index 1fa40812..d56d8f35 100644 --- a/packages/protocol/README.md +++ b/packages/protocol/README.md @@ -59,6 +59,7 @@ Current exported commercial helpers include: - `V41RegistryInterpolationContracts` helpers for V41 source-safe registry composition, interpolation key, execution ancestry, tool prompt injection, context handling, and parser target contracts; - `V41ReadingPromptBenchmarkBaselines` helpers for V41 source-safe Reading prompt baseline rows across `ReadNeedComprehensionSynthesis`, `ReadFitsFindingSynthesis`, all five Reading UX steps, V38 benchmark fixtures, Gate 2 inventory roots, Gate 3 registry/interpolation roots, parser targets, deterministic scores, and source-safe disclosure tiers; - `V41PromotionReadinessReport` helpers for V41 source-safe prompt-program promotion readiness across all V41 prompt artifacts, generated proof support, workflow posture, promotion dry-run support, and active V41 / draft V42 runtime preparation; +- `V42SettlementRightsDelivery` helpers for V42 source-safe BTC payment observation, finality gating, source-to-shares compensation, BTD read-right transfer, repository delivery unlock, ledger/database/object-storage reconciliation, Terminal readback, and source-safe paid-boundary proof; - canonical proven-generation helpers; - the package app/server context used by commercial interfaces. @@ -220,6 +221,20 @@ deterministic share-to-fee quote receipts, disclosure review, settlement instructions, delivery lock, harness route summaries, Terminal preview/quote/provenance readback, and no pre-settlement protected source or unpaid AssetPack source exposure. +V42 Gate 6 adds `V42SettlementRightsDelivery` through +`packages/protocol/src/canonical/v42-settlement-rights-delivery.js`, +`packages/protocol/test/v42-settlement-rights-delivery.test.js`, +`.bitcode/v42-settlement-rights-delivery.json`, +`generate:v42-settlement-rights-delivery`, +`check:v42-settlement-rights-delivery`, and `check:v42-gate6`. +The artifact is source-safe metadata only and covers paid quote observation, +BTC/testnet finality, BTD rights transfer, paid read receipts, +source-to-shares compensation conservation, repository pull-request delivery +unlock, ledger/database/object-storage reconciliation, fail-closed repair +posture, harness route summaries, Terminal settlement readback, and workflow +proof wiring without serializing protected source, unpaid AssetPack source, +wallet private material, private settlement payloads, credentials, raw +protected prompts, or raw provider responses. V40 Gate 2 adds `V40TestInventoryCoverageMatrix` through `packages/protocol/src/canonical/v40-test-inventory-coverage-matrix.js`, `packages/protocol/test/v40-test-inventory-coverage-matrix.test.js`, diff --git a/packages/protocol/src/canonical/v42-settlement-rights-delivery.js b/packages/protocol/src/canonical/v42-settlement-rights-delivery.js new file mode 100644 index 00000000..4b621554 --- /dev/null +++ b/packages/protocol/src/canonical/v42-settlement-rights-delivery.js @@ -0,0 +1,301 @@ +// @ts-check + +import crypto from 'node:crypto'; +import { existsSync, readFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const DEFAULT_REPO_ROOT = path.resolve(__dirname, '..', '..', '..', '..'); + +export const V42_SETTLEMENT_RIGHTS_DELIVERY_ARTIFACT_PATH = + '.bitcode/v42-settlement-rights-delivery.json'; +export const V42_SETTLEMENT_RIGHTS_DELIVERY_SCHEMA_ID = + 'bitcode.v42.settlementRightsDelivery.v1'; +export const V42_SETTLEMENT_RIGHTS_DELIVERY_VERSION = 'V42'; +export const V42_SETTLEMENT_RIGHTS_DELIVERY_CURRENT_TARGET = 'V41'; +export const V42_SETTLEMENT_RIGHTS_DELIVERY_SOURCE_SAFETY_VERDICT = + 'source-safe-v42-settlement-rights-delivery-metadata'; + +export const V42_SETTLEMENT_RIGHTS_DELIVERY_ROW_IDS = Object.freeze([ + 'purchase:quote-to-payment-observation', + 'finality:btc-testnet-confirmation-gate', + 'rights:btd-read-right-transfer', + 'compensation:source-to-shares-conservation', + 'delivery:source-bearing-pull-request-unlock', + 'sync:ledger-database-object-storage-reconciliation', + 'repair:fail-closed-settlement-posture', + 'route:harness-settlement-summary', + 'ui:terminal-settlement-readback', + 'host:live-harness-boundary-materialization', + 'proof:tests-artifact-workflow', +]); + +const SOURCE_ROOTS = Object.freeze({ + boundary: 'packages/pipelines/asset-pack/src/asset-pack-settlement-rights-delivery.ts', + boundaryTest: 'packages/pipelines/asset-pack/src/__tests__/asset-pack-settlement-rights-delivery.test.ts', + previewBoundary: 'packages/pipelines/asset-pack/src/asset-pack-preview-boundary.ts', + postprocess: 'packages/pipelines/asset-pack/src/postprocess.ts', + packageIndex: 'packages/pipelines/asset-pack/src/index.ts', + pipelineHostHarness: 'packages/pipeline-hosts/src/asset-pack-harness.ts', + pipelineHostHarnessTest: 'packages/pipeline-hosts/src/__tests__/asset-pack-harness.test.ts', + harnessRunner: 'uapi/app/api/pipeline-harness/asset-pack/runner.ts', + harnessRouteTest: 'uapi/tests/api/pipelineHarnessRoute.test.ts', + terminalWorkbench: 'uapi/app/terminal/TerminalDepositReadWorkbench.tsx', + terminalHarnessClient: 'uapi/app/terminal/terminal-pipeline-harness-client.ts', + terminalHarnessClientTest: 'uapi/tests/terminalPipelineHarnessClient.test.ts', + btdReceipts: 'packages/btd/src/receipts.ts', + btdSourceToShares: 'packages/btd/src/source-to-shares.ts', + btdSettlement: 'packages/btd/src/settlement.ts', + btdReconciliation: 'packages/btd/src/reconciliation.ts', + protocolReadme: 'packages/protocol/README.md', + assetPackReadme: 'packages/pipelines/asset-pack/README.md', + terminalReadme: 'uapi/app/terminal/README.md', + rootReadme: 'README.md', + v42Spec: 'BITCODE_SPEC_V42.md', + v42Delta: 'BITCODE_SPEC_V42_DELTA.md', + v42Notes: 'BITCODE_SPEC_V42_NOTES.md', + v42Parity: 'BITCODE_SPEC_V42_PARITY_MATRIX.md', + roadmap: 'SPECIFICATIONS_ROADMAP.md', + packageJson: 'package.json', + protocolIndex: 'packages/protocol/src/index.js', + protocolTypes: 'packages/protocol/src/index.d.ts', + gateWorkflow: '.github/workflows/bitcode-gate-quality.yml', + canonWorkflow: '.github/workflows/bitcode-canon-quality.yml', +}); + +const FORBIDDEN_PAYLOAD_CLASSES = Object.freeze([ + 'protected-source-payloads', + 'raw-protected-prompts', + 'raw-provider-responses', + 'unpaid-assetpack-source', + 'wallet-private-material', + 'settlement-private-payloads', + 'secret-values', +]); + +function digest(value) { + return crypto.createHash('sha256').update(value).digest('hex').slice(0, 24); +} + +function rowRoot(id) { + return `v42-settlement-rights-delivery-row:${digest(id)}`; +} + +function readSource(repoRoot, sourcePath) { + const absolutePath = path.join(repoRoot, sourcePath); + return existsSync(absolutePath) ? readFileSync(absolutePath, 'utf8') : ''; +} + +function predicateResult(id, sourcePath, passed) { + return { id, sourcePath, passed: Boolean(passed) }; +} + +function row(input) { + return { + ...input, + rowRoot: rowRoot(input.rowId), + sourceSafetyClass: 'source_safe_v42_settlement_rights_delivery_metadata', + sourceSafeMetadataOnly: true, + protectedSourcePayloadSerialized: false, + rawProtectedPromptVisible: false, + rawProviderResponseVisible: false, + unpaidAssetPackSourceVisible: false, + walletPrivateMaterialVisible: false, + settlementPrivatePayloadVisible: false, + credentialsSerialized: false, + forbiddenPayloadClasses: [...FORBIDDEN_PAYLOAD_CLASSES], + }; +} + +export const V42_SETTLEMENT_RIGHTS_DELIVERY_ROWS = Object.freeze([ + row({ + rowId: 'purchase:quote-to-payment-observation', + purpose: + 'Convert the Gate 5 deterministic quote into a reader BTC payment observation without server custody or private wallet material.', + sourceRoots: [SOURCE_ROOTS.boundary, SOURCE_ROOTS.previewBoundary, SOURCE_ROOTS.harnessRunner], + emittedTypes: ['AssetPackSettlementPaymentObservation', 'AssetPackPreviewQuoteReceipt'], + requiredEvidence: ['expectedSats', 'observedDebitSats', 'observedCreditSats', 'serverCustody: false'], + }), + row({ + rowId: 'finality:btc-testnet-confirmation-gate', + purpose: + 'Require confirmed BTC/testnet finality before BTD rights transfer, source unlock, or source-bearing repository delivery.', + sourceRoots: [SOURCE_ROOTS.boundary, SOURCE_ROOTS.boundaryTest, SOURCE_ROOTS.btdReceipts], + emittedTypes: ['AssetPackSettlementFinalityReceipt', 'BtdRightsTransferReceipt'], + requiredEvidence: ['finalityState', 'confirmed', 'Rights transfer receipt requires confirmed BTC fee finality'], + }), + row({ + rowId: 'rights:btd-read-right-transfer', + purpose: + 'Transfer the BTD read right to the paying reader only after the quote, payment, finality, and conservation checks agree.', + sourceRoots: [SOURCE_ROOTS.boundary, SOURCE_ROOTS.btdReceipts, SOURCE_ROOTS.boundaryTest], + emittedTypes: ['BtdRightsTransferReceipt', 'BtdReadReceipt'], + requiredEvidence: ['buildBtdRightsTransferReceipt', 'buildBtdReadReceipt', 'paid_unlocked', 'licensed_read'], + }), + row({ + rowId: 'compensation:source-to-shares-conservation', + purpose: + 'Allocate BTC sats to selected fit deposits with deterministic source-to-shares conservation and proof roots.', + sourceRoots: [SOURCE_ROOTS.boundary, SOURCE_ROOTS.btdSourceToShares, SOURCE_ROOTS.boundaryTest], + emittedTypes: ['SourceToSharesProof', 'settlementConservation'], + requiredEvidence: ['buildSourceToSharesProof', 'settlementAllocations', 'balanced'], + }), + row({ + rowId: 'delivery:source-bearing-pull-request-unlock', + purpose: + 'Unlock the source-bearing pull request only after payment finality, BTD rights, compensation, and reconciliation readbacks pass.', + sourceRoots: [SOURCE_ROOTS.boundary, SOURCE_ROOTS.btdSettlement, SOURCE_ROOTS.terminalWorkbench], + emittedTypes: ['AssetPackDeliveryUnlockReceipt', 'AssetPackSettlementUnlock'], + requiredEvidence: ['source_bearing_pull_request_ready', 'pull_request_after_settlement', 'sourceBearingDeliveryVisibleToReader'], + }), + row({ + rowId: 'sync:ledger-database-object-storage-reconciliation', + purpose: + 'Synchronize ledger facts, database projections, object storage roots, and staging-testnet readback before delivery is visible.', + sourceRoots: [SOURCE_ROOTS.boundary, SOURCE_ROOTS.btdReconciliation, SOURCE_ROOTS.harnessRunner], + emittedTypes: ['LedgerDatabaseReconciliationReport'], + requiredEvidence: ['reconcileLedgerDatabaseProjection', 'buildSupabaseStagingTestnetProjectionReadback', 'tkpyosihuouusyaxtbau'], + }), + row({ + rowId: 'repair:fail-closed-settlement-posture', + purpose: + 'Represent underpayment, missing finality, projection drift, and missing delivery as repairable blockers without leaking source.', + sourceRoots: [SOURCE_ROOTS.boundary, SOURCE_ROOTS.boundaryTest], + emittedTypes: ['AssetPackSettlementRightsDeliveryRepairPosture'], + requiredEvidence: ['blocked_until_payment_finality', 'blocked_until_compensation_conservation', 'blocked_until_projection_repair'], + }), + row({ + rowId: 'route:harness-settlement-summary', + purpose: + 'Summarize payment, finality, rights, source-to-shares, delivery, reconciliation, replay, and storage roots through the harness route.', + sourceRoots: [SOURCE_ROOTS.harnessRunner, SOURCE_ROOTS.harnessRouteTest], + emittedTypes: ['assetPackSettlementRightsDeliveryBoundary', 'assetPackDeliveryUnlock'], + requiredEvidence: ['summarizeAssetPackSettlementRightsDeliveryBoundary', 'assetPackLedgerDatabaseStorageReconciliation'], + }), + row({ + rowId: 'ui:terminal-settlement-readback', + purpose: + 'Render settlement rights, compensation, delivery, replay, and reconciliation readback in Terminal expandable metadata.', + sourceRoots: [SOURCE_ROOTS.terminalWorkbench, SOURCE_ROOTS.terminalHarnessClient, SOURCE_ROOTS.terminalHarnessClientTest], + emittedTypes: ['assetPackSettlementBoundaryRows', 'TerminalReadFitsFindingSynthesisHarnessStreamSnapshot'], + requiredEvidence: ['Settlement rights, compensation, and delivery', 'settlement-boundary', 'delivery-unlock'], + }), + row({ + rowId: 'host:live-harness-boundary-materialization', + purpose: + 'Materialize AssetPackPreviewBoundary and AssetPackSettlementRightsDeliveryBoundary inside the live sandbox harness output.', + sourceRoots: [SOURCE_ROOTS.pipelineHostHarness, SOURCE_ROOTS.pipelineHostHarnessTest], + emittedTypes: ['assetPackPreviewBoundary', 'assetPackSettlementRightsDeliveryBoundary'], + requiredEvidence: ['buildAssetPackSettlementRightsDeliveryBoundary', 'persistAssetPackSettlementRightsDeliveryBoundary'], + }), + row({ + rowId: 'proof:tests-artifact-workflow', + purpose: + 'Bind V42 Gate 6 closure to generated artifact, protocol test, package tests, harness route tests, docs, and workflow checks.', + sourceRoots: [SOURCE_ROOTS.gateWorkflow, SOURCE_ROOTS.canonWorkflow, SOURCE_ROOTS.packageJson], + emittedTypes: ['V42SettlementRightsDelivery'], + requiredEvidence: ['check-v42-gate6-settlement-rights-delivery.mjs', 'v42-settlement-rights-delivery'], + }), +]); + +function buildPredicateResults(repoRoot) { + const sources = Object.fromEntries( + Object.entries(SOURCE_ROOTS).map(([key, sourcePath]) => [key, readSource(repoRoot, sourcePath)]), + ); + + return [ + predicateResult('boundary-defines-core-types', SOURCE_ROOTS.boundary, sources.boundary.includes('AssetPackSettlementRightsDeliveryBoundary') && sources.boundary.includes('AssetPackSettlementPaymentObservation') && sources.boundary.includes('AssetPackDeliveryUnlockReceipt')), + predicateResult('boundary-composes-btd-primitives', SOURCE_ROOTS.boundary, sources.boundary.includes('buildBtdRightsTransferReceipt') && sources.boundary.includes('buildBtdReadReceipt') && sources.boundary.includes('buildAssetPackSettlementUnlock')), + predicateResult('boundary-builds-source-to-shares', SOURCE_ROOTS.boundary, sources.boundary.includes('buildSourceToSharesProof') && sources.btdSourceToShares.includes('settlementConservation')), + predicateResult('boundary-builds-reconciliation', SOURCE_ROOTS.boundary, sources.boundary.includes('reconcileLedgerDatabaseProjection') && sources.btdReconciliation.includes('objectStorageArtifacts')), + predicateResult('boundary-source-safety', SOURCE_ROOTS.boundary, sources.boundary.includes('source_safe_settlement_rights_delivery_boundary') && sources.boundary.includes('walletPrivateMaterialVisible: false')), + predicateResult('tests-cover-confirmed-delivery', SOURCE_ROOTS.boundaryTest, sources.boundaryTest.includes('unlocks BTD rights') && sources.boundaryTest.includes('settlement_delivered')), + predicateResult('tests-cover-underpayment', SOURCE_ROOTS.boundaryTest, sources.boundaryTest.includes('fails closed when BTC payment is underpaid') && sources.boundaryTest.includes('blocked_until_compensation_conservation')), + predicateResult('tests-cover-finality', SOURCE_ROOTS.boundaryTest, sources.boundaryTest.includes('fails closed until BTC finality is confirmed') && sources.boundaryTest.includes('blocked_until_payment_finality')), + predicateResult('tests-cover-reconciliation-drift', SOURCE_ROOTS.boundaryTest, sources.boundaryTest.includes('ledger, database, or object storage projections drift') && sources.boundaryTest.includes('blocked_until_projection_repair')), + predicateResult('host-materializes-boundary', SOURCE_ROOTS.pipelineHostHarness, sources.pipelineHostHarness.includes('buildAssetPackSettlementRightsDeliveryBoundary') && sources.pipelineHostHarness.includes('assetPackSettlementRightsDeliveryBoundary')), + predicateResult('host-test-covers-boundary', SOURCE_ROOTS.pipelineHostHarnessTest, sources.pipelineHostHarnessTest.includes('buildAssetPackSettlementRightsDeliveryBoundary') && sources.pipelineHostHarnessTest.includes('assetPackSettlementRightsDeliveryBoundary')), + predicateResult('route-summarizes-boundary', SOURCE_ROOTS.harnessRunner, sources.harnessRunner.includes('summarizeAssetPackSettlementRightsDeliveryBoundary') && sources.harnessRunner.includes('assetPackLedgerDatabaseStorageReconciliation')), + predicateResult('route-test-covers-boundary', SOURCE_ROOTS.harnessRouteTest, sources.harnessRouteTest.includes('assetPackSettlementRightsDeliveryBoundary') && sources.harnessRouteTest.includes('source_bearing_pull_request_ready')), + predicateResult('terminal-renders-boundary', SOURCE_ROOTS.terminalWorkbench, sources.terminalWorkbench.includes('Settlement rights, compensation, and delivery') && sources.terminalWorkbench.includes('assetPackSettlementBoundaryRows')), + predicateResult('terminal-client-summarizes-boundary', SOURCE_ROOTS.terminalHarnessClient, sources.terminalHarnessClient.includes('settlement-boundary') && sources.terminalHarnessClient.includes('delivery-unlock')), + predicateResult('terminal-client-test-covers-boundary', SOURCE_ROOTS.terminalHarnessClientTest, sources.terminalHarnessClientTest.includes('settlement-boundary settlement_delivered') && sources.terminalHarnessClientTest.includes('reconciliation aligned')), + predicateResult('v42-spec-expanded', SOURCE_ROOTS.v42Spec, sources.v42Spec.includes('V42 Gate 6') && sources.v42Spec.includes('AssetPackSettlementRightsDeliveryBoundary')), + predicateResult('v42-delta-expanded', SOURCE_ROOTS.v42Delta, sources.v42Delta.includes('Gate 6') && sources.v42Delta.includes('settlement rights transfer')), + predicateResult('v42-notes-expanded', SOURCE_ROOTS.v42Notes, sources.v42Notes.includes('Gate 6') && sources.v42Notes.includes('source-to-shares compensation')), + predicateResult('v42-parity-implemented', SOURCE_ROOTS.v42Parity, sources.v42Parity.includes('Settlement and delivery') && sources.v42Parity.includes('implemented')), + predicateResult('roadmap-advanced-to-gate6', SOURCE_ROOTS.roadmap, sources.roadmap.includes('Current working gate: V42 Gate 6') && sources.roadmap.includes('V42 Gate 6 closure anchor')), + predicateResult('readmes-document-gate6', SOURCE_ROOTS.rootReadme, sources.rootReadme.includes('V42 Gate 6') && sources.assetPackReadme.includes('Settlement Rights Delivery') && sources.protocolReadme.includes('V42SettlementRightsDelivery') && sources.terminalReadme.includes('Settlement rights')), + predicateResult('protocol-exports-gate6', SOURCE_ROOTS.protocolIndex, sources.protocolIndex.includes('buildV42SettlementRightsDelivery') && sources.protocolTypes.includes('buildV42SettlementRightsDelivery')), + predicateResult('package-scripts-wire-gate6', SOURCE_ROOTS.packageJson, sources.packageJson.includes('generate:v42-settlement-rights-delivery') && sources.packageJson.includes('check:v42-gate6')), + predicateResult('workflows-run-gate6-check', SOURCE_ROOTS.gateWorkflow, sources.gateWorkflow.includes('check-v42-gate6-settlement-rights-delivery.mjs') && sources.canonWorkflow.includes('check-v42-gate6-settlement-rights-delivery.mjs')), + ]; +} + +function buildCoverage(rows, predicateResults) { + const failedPredicateIds = predicateResults.filter((predicate) => !predicate.passed).map((predicate) => predicate.id); + return { + rowCount: rows.length, + sourceSafetyVerdict: V42_SETTLEMENT_RIGHTS_DELIVERY_SOURCE_SAFETY_VERDICT, + runtimeType: 'AssetPackSettlementRightsDeliveryBoundary', + paymentType: 'AssetPackSettlementPaymentObservation', + finalityType: 'AssetPackSettlementFinalityReceipt', + rightsTransferType: 'BtdRightsTransferReceipt', + readReceiptType: 'BtdReadReceipt', + sourceToSharesType: 'SourceToSharesProof', + reconciliationType: 'LedgerDatabaseReconciliationReport', + deliveryType: 'AssetPackDeliveryUnlockReceipt', + replayType: 'AssetPackSettlementRightsDeliveryReplayReceipt', + requiredReadbacksBeforeUnlock: [ + 'btc_payment_observation', + 'settlement_finality', + 'source_to_shares_compensation', + 'btd_rights_transfer', + 'ledger_database_storage_reconciliation', + ], + stagingProjectRef: 'tkpyosihuouusyaxtbau', + stagingRestHost: 'https://tkpyosihuouusyaxtbau.supabase.co/rest/v1/', + sourceSafeMetadataOnly: true, + protectedSourcePayloadSerialized: false, + unpaidAssetPackSourceVisible: false, + walletPrivateMaterialVisible: false, + settlementPrivatePayloadVisible: false, + credentialsSerialized: false, + hostBoundaryMaterializationCovered: predicateResults.some((predicate) => predicate.id === 'host-materializes-boundary' && predicate.passed), + routeReadbackCovered: predicateResults.some((predicate) => predicate.id === 'route-summarizes-boundary' && predicate.passed), + terminalReadbackCovered: predicateResults.some((predicate) => predicate.id === 'terminal-renders-boundary' && predicate.passed), + confirmedPaymentCovered: predicateResults.some((predicate) => predicate.id === 'tests-cover-confirmed-delivery' && predicate.passed), + underpaymentBlockedCovered: predicateResults.some((predicate) => predicate.id === 'tests-cover-underpayment' && predicate.passed), + finalityBlockedCovered: predicateResults.some((predicate) => predicate.id === 'tests-cover-finality' && predicate.passed), + reconciliationRepairCovered: predicateResults.some((predicate) => predicate.id === 'tests-cover-reconciliation-drift' && predicate.passed), + failedPredicateIds, + }; +} + +export function buildV42SettlementRightsDelivery(input = {}) { + const repoRoot = input.repoRoot || DEFAULT_REPO_ROOT; + const predicateResults = buildPredicateResults(repoRoot); + const rows = [...V42_SETTLEMENT_RIGHTS_DELIVERY_ROWS]; + const coverage = buildCoverage(rows, predicateResults); + const artifactRoot = `v42-settlement-rights-delivery:${digest(JSON.stringify({ + rowIds: V42_SETTLEMENT_RIGHTS_DELIVERY_ROW_IDS, + predicateResults, + coverage, + }))}`; + + return { + artifactId: 'v42-settlement-rights-delivery', + schemaId: V42_SETTLEMENT_RIGHTS_DELIVERY_SCHEMA_ID, + version: V42_SETTLEMENT_RIGHTS_DELIVERY_VERSION, + currentTarget: V42_SETTLEMENT_RIGHTS_DELIVERY_CURRENT_TARGET, + sourceSafetyVerdict: V42_SETTLEMENT_RIGHTS_DELIVERY_SOURCE_SAFETY_VERDICT, + rowIds: [...V42_SETTLEMENT_RIGHTS_DELIVERY_ROW_IDS], + rows, + predicateResults, + coverage, + passed: coverage.failedPredicateIds.length === 0, + artifactRoot, + }; +} diff --git a/packages/protocol/src/index.d.ts b/packages/protocol/src/index.d.ts index 3efaa2a1..57bfdf07 100644 --- a/packages/protocol/src/index.d.ts +++ b/packages/protocol/src/index.d.ts @@ -546,6 +546,14 @@ export const V42_READFITSFINDING_PREVIEW_QUOTE_SOURCE_SAFETY_VERDICT: string; export const V42_READFITSFINDING_PREVIEW_QUOTE_ROW_IDS: readonly string[]; export const V42_READFITSFINDING_PREVIEW_QUOTE_ROWS: readonly Record[]; export function buildV42ReadFitsFindingPreviewQuote(input?: Record): BitcodeProtocolReport; +export const V42_SETTLEMENT_RIGHTS_DELIVERY_ARTIFACT_PATH: string; +export const V42_SETTLEMENT_RIGHTS_DELIVERY_CURRENT_TARGET: string; +export const V42_SETTLEMENT_RIGHTS_DELIVERY_SCHEMA_ID: string; +export const V42_SETTLEMENT_RIGHTS_DELIVERY_VERSION: string; +export const V42_SETTLEMENT_RIGHTS_DELIVERY_SOURCE_SAFETY_VERDICT: string; +export const V42_SETTLEMENT_RIGHTS_DELIVERY_ROW_IDS: readonly string[]; +export const V42_SETTLEMENT_RIGHTS_DELIVERY_ROWS: readonly Record[]; +export function buildV42SettlementRightsDelivery(input?: Record): BitcodeProtocolReport; export const EXCHANGE_INTENT_ORDER_CONTRACTS_ARTIFACT_PATH: string; export const EXCHANGE_INTENT_ORDER_CONTRACTS_CURRENT_TARGET: string; export const EXCHANGE_INTENT_ORDER_CONTRACTS_SCHEMA_ID: string; diff --git a/packages/protocol/src/index.js b/packages/protocol/src/index.js index 0d56bca1..1669b4e7 100644 --- a/packages/protocol/src/index.js +++ b/packages/protocol/src/index.js @@ -612,6 +612,16 @@ export { V42_READFITSFINDING_PREVIEW_QUOTE_VERSION, buildV42ReadFitsFindingPreviewQuote } from './canonical/v42-readfitsfinding-preview-quote.js'; +export { + V42_SETTLEMENT_RIGHTS_DELIVERY_ARTIFACT_PATH, + V42_SETTLEMENT_RIGHTS_DELIVERY_CURRENT_TARGET, + V42_SETTLEMENT_RIGHTS_DELIVERY_ROW_IDS, + V42_SETTLEMENT_RIGHTS_DELIVERY_ROWS, + V42_SETTLEMENT_RIGHTS_DELIVERY_SCHEMA_ID, + V42_SETTLEMENT_RIGHTS_DELIVERY_SOURCE_SAFETY_VERDICT, + V42_SETTLEMENT_RIGHTS_DELIVERY_VERSION, + buildV42SettlementRightsDelivery +} from './canonical/v42-settlement-rights-delivery.js'; export { EXCHANGE_INTENT_ACTION_KINDS, EXCHANGE_INTENT_ORDER_CONTRACTS_ARTIFACT_PATH, diff --git a/packages/protocol/test/v42-settlement-rights-delivery.test.js b/packages/protocol/test/v42-settlement-rights-delivery.test.js new file mode 100644 index 00000000..3bc42a16 --- /dev/null +++ b/packages/protocol/test/v42-settlement-rights-delivery.test.js @@ -0,0 +1,68 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { + V42_SETTLEMENT_RIGHTS_DELIVERY_ARTIFACT_PATH, + V42_SETTLEMENT_RIGHTS_DELIVERY_ROW_IDS, + V42_SETTLEMENT_RIGHTS_DELIVERY_SCHEMA_ID, + V42_SETTLEMENT_RIGHTS_DELIVERY_SOURCE_SAFETY_VERDICT, + buildV42SettlementRightsDelivery, +} from '../src/canonical/v42-settlement-rights-delivery.js'; + +test('V42 settlement rights delivery proof is source-safe and complete', () => { + const report = buildV42SettlementRightsDelivery(); + + assert.equal(V42_SETTLEMENT_RIGHTS_DELIVERY_ARTIFACT_PATH, '.bitcode/v42-settlement-rights-delivery.json'); + assert.equal(report.artifactId, 'v42-settlement-rights-delivery'); + assert.equal(report.schemaId, V42_SETTLEMENT_RIGHTS_DELIVERY_SCHEMA_ID); + assert.equal(report.version, 'V42'); + assert.equal(report.currentTarget, 'V41'); + assert.equal(report.sourceSafetyVerdict, V42_SETTLEMENT_RIGHTS_DELIVERY_SOURCE_SAFETY_VERDICT); + assert.deepEqual(report.rowIds, [...V42_SETTLEMENT_RIGHTS_DELIVERY_ROW_IDS]); + assert.equal(report.coverage.rowCount, 11); + assert.equal(report.coverage.runtimeType, 'AssetPackSettlementRightsDeliveryBoundary'); + assert.equal(report.coverage.paymentType, 'AssetPackSettlementPaymentObservation'); + assert.equal(report.coverage.finalityType, 'AssetPackSettlementFinalityReceipt'); + assert.equal(report.coverage.rightsTransferType, 'BtdRightsTransferReceipt'); + assert.equal(report.coverage.sourceToSharesType, 'SourceToSharesProof'); + assert.equal(report.coverage.reconciliationType, 'LedgerDatabaseReconciliationReport'); + assert.equal(report.coverage.deliveryType, 'AssetPackDeliveryUnlockReceipt'); + assert.equal(report.coverage.stagingProjectRef, 'tkpyosihuouusyaxtbau'); + assert.equal(report.coverage.sourceSafeMetadataOnly, true); + assert.equal(report.coverage.protectedSourcePayloadSerialized, false); + assert.equal(report.coverage.unpaidAssetPackSourceVisible, false); + assert.equal(report.coverage.walletPrivateMaterialVisible, false); + assert.equal(report.coverage.settlementPrivatePayloadVisible, false); + assert.equal(report.coverage.credentialsSerialized, false); + assert.equal(report.coverage.hostBoundaryMaterializationCovered, true); + assert.equal(report.coverage.routeReadbackCovered, true); + assert.equal(report.coverage.terminalReadbackCovered, true); + assert.equal(report.coverage.confirmedPaymentCovered, true); + assert.equal(report.coverage.underpaymentBlockedCovered, true); + assert.equal(report.coverage.finalityBlockedCovered, true); + assert.equal(report.coverage.reconciliationRepairCovered, true); + assert.deepEqual(report.coverage.failedPredicateIds, []); + assert.equal(report.passed, true); + assert.match(report.artifactRoot, /^v42-settlement-rights-delivery:/); +}); + +test('V42 settlement rights delivery rows cover purchase through post-settlement delivery', () => { + const report = buildV42SettlementRightsDelivery(); + const rowIds = report.rows.map((row) => row.rowId); + + assert.deepEqual(rowIds, [...V42_SETTLEMENT_RIGHTS_DELIVERY_ROW_IDS]); + assert.ok(rowIds.includes('purchase:quote-to-payment-observation')); + assert.ok(rowIds.includes('rights:btd-read-right-transfer')); + assert.ok(rowIds.includes('compensation:source-to-shares-conservation')); + assert.ok(rowIds.includes('delivery:source-bearing-pull-request-unlock')); + assert.ok(rowIds.includes('sync:ledger-database-object-storage-reconciliation')); + assert.ok(rowIds.includes('route:harness-settlement-summary')); + assert.ok(rowIds.includes('ui:terminal-settlement-readback')); + for (const row of report.rows) { + assert.equal(row.sourceSafeMetadataOnly, true); + assert.equal(row.protectedSourcePayloadSerialized, false); + assert.equal(row.walletPrivateMaterialVisible, false); + assert.equal(row.credentialsSerialized, false); + assert.ok(Array.isArray(row.requiredEvidence)); + assert.ok(row.requiredEvidence.length >= 2); + } +}); diff --git a/scripts/check-v42-gate6-settlement-rights-delivery.mjs b/scripts/check-v42-gate6-settlement-rights-delivery.mjs new file mode 100644 index 00000000..1655e605 --- /dev/null +++ b/scripts/check-v42-gate6-settlement-rights-delivery.mjs @@ -0,0 +1,252 @@ +#!/usr/bin/env node + +import { execFileSync } from 'node:child_process'; +import { existsSync, readFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const defaultRepoRoot = path.resolve(__dirname, '..'); +const ARTIFACT_PATH = '.bitcode/v42-settlement-rights-delivery.json'; + +const SECRET_MARKERS = [ + `${['sk', 'proj'].join('-')}-`, + `${['sb', 'secret'].join('_')}__`, + ['service', 'role'].join('_'), + ['eyJ', 'hbGci', 'Oi', 'JIUzI1Ni'].join(''), + ['OPENAI', 'API', 'KEY'].join('_'), + ['SUPABASE', 'SERVICE', 'ROLE'].join('_'), + ['VERCEL', 'TOKEN'].join('_'), + ['VERCEL', 'OIDC', 'TOKEN'].join('_'), + ['PRIVATE', 'KEY'].join('_'), +]; + +function parseArgs(argv) { + const args = { + skipBranchCheck: false, + skipPackageTests: false, + skipUapiTests: false, + repoRoot: defaultRepoRoot, + help: false, + }; + + for (let index = 0; index < argv.length; index += 1) { + const arg = argv[index]; + if (arg === '--skip-branch-check') args.skipBranchCheck = true; + else if (arg === '--skip-package-tests') args.skipPackageTests = true; + else if (arg === '--skip-uapi-tests') args.skipUapiTests = true; + else if (arg === '--repo-root') args.repoRoot = path.resolve(argv[++index]); + else if (arg === '--help' || arg === '-h') args.help = true; + else throw new Error(`Unknown argument ${arg}`); + } + + return args; +} + +function read(root, relativePath) { + return readFileSync(path.join(root, relativePath), 'utf8'); +} + +function fileExists(root, relativePath) { + return existsSync(path.join(root, relativePath)); +} + +function git(root, args) { + return execFileSync('git', args, { cwd: root, encoding: 'utf8' }).trim(); +} + +function run(root, command, args) { + return execFileSync(command, args, { + cwd: root, + encoding: 'utf8', + stdio: ['ignore', 'pipe', 'pipe'], + }).trim(); +} + +function assertCheck(failures, condition, message) { + if (!condition) failures.push(message); +} + +function printHelp() { + process.stdout.write( + [ + 'Usage: node scripts/check-v42-gate6-settlement-rights-delivery.mjs [--skip-branch-check] [--skip-package-tests] [--skip-uapi-tests] [--repo-root ]', + '', + 'Checks V42 Gate 6 settlement, BTD rights transfer, source-to-shares compensation, delivery unlock, route/UI readback, docs, workflow wiring, and proof artifact.', + ].join('\n'), + ); + process.stdout.write('\n'); +} + +function main() { + const args = parseArgs(process.argv.slice(2)); + if (args.help) { + printHelp(); + return; + } + + const root = args.repoRoot; + const failures = []; + const pointer = read(root, 'BITCODE_SPEC.txt').trim(); + + assertCheck( + failures, + pointer === 'V41', + `BITCODE_SPEC.txt must remain V41 during V42 gate work. Observed ${pointer || 'empty'}.`, + ); + + if (!args.skipBranchCheck) { + const branch = git(root, ['branch', '--show-current']); + assertCheck( + failures, + branch === 'version/v42' || /^v42\/gate-(?:6|7|8|9)-[a-z0-9][a-z0-9-]*$/u.test(branch), + `V42 Gate 6+ work must occur on version/v42 or v42/gate-6..9-* branches. Observed ${branch || 'detached HEAD'}.`, + ); + } + + const requiredFiles = [ + ARTIFACT_PATH, + 'packages/pipelines/asset-pack/src/asset-pack-settlement-rights-delivery.ts', + 'packages/pipelines/asset-pack/src/__tests__/asset-pack-settlement-rights-delivery.test.ts', + 'packages/pipeline-hosts/src/asset-pack-harness.ts', + 'packages/pipeline-hosts/src/__tests__/asset-pack-harness.test.ts', + 'uapi/app/api/pipeline-harness/asset-pack/runner.ts', + 'uapi/tests/api/pipelineHarnessRoute.test.ts', + 'uapi/app/terminal/TerminalDepositReadWorkbench.tsx', + 'uapi/app/terminal/terminal-pipeline-harness-client.ts', + 'uapi/tests/terminalPipelineHarnessClient.test.ts', + 'packages/protocol/src/canonical/v42-settlement-rights-delivery.js', + 'packages/protocol/test/v42-settlement-rights-delivery.test.js', + 'scripts/generate-v42-settlement-rights-delivery.mjs', + 'scripts/check-v42-gate6-settlement-rights-delivery.mjs', + 'BITCODE_SPEC_V42.md', + 'BITCODE_SPEC_V42_DELTA.md', + 'BITCODE_SPEC_V42_NOTES.md', + 'BITCODE_SPEC_V42_PARITY_MATRIX.md', + 'SPECIFICATIONS_ROADMAP.md', + 'README.md', + 'packages/pipelines/asset-pack/README.md', + 'packages/protocol/README.md', + 'uapi/app/terminal/README.md', + 'package.json', + '.github/workflows/bitcode-gate-quality.yml', + '.github/workflows/bitcode-canon-quality.yml', + ]; + + for (const relativePath of requiredFiles) { + assertCheck(failures, fileExists(root, relativePath), `Missing V42 Gate 6 file: ${relativePath}`); + } + + if (failures.length === 0) { + try { + run(root, 'node', ['scripts/generate-v42-settlement-rights-delivery.mjs', '--check']); + } catch (error) { + failures.push(`V42 settlement rights delivery artifact check failed: ${error.stderr || error.message}`); + } + } + + if (failures.length === 0) { + try { + run(root, 'node', [ + '--test', + '--test-force-exit', + 'packages/protocol/test/v42-settlement-rights-delivery.test.js', + ]); + } catch (error) { + failures.push(`V42 settlement rights delivery protocol test failed: ${error.stderr || error.message}`); + } + } + + if (failures.length === 0 && !args.skipPackageTests) { + try { + run(root, 'pnpm', [ + '--filter', + '@bitcode/pipeline-asset-pack', + 'exec', + 'jest', + '--config', + 'jest.config.cjs', + '--runTestsByPath', + 'src/__tests__/asset-pack-settlement-rights-delivery.test.ts', + 'src/__tests__/asset-pack-preview-boundary.test.ts', + 'src/__tests__/postprocess.test.ts', + '--runInBand', + '--forceExit', + ]); + run(root, 'pnpm', [ + '--filter', + '@bitcode/pipeline-hosts', + 'exec', + 'jest', + '--runTestsByPath', + 'src/__tests__/asset-pack-harness.test.ts', + '--runInBand', + '--forceExit', + ]); + } catch (error) { + failures.push(`V42 settlement rights delivery package tests failed: ${error.stderr || error.message}`); + } + } + + if (failures.length === 0 && !args.skipUapiTests) { + try { + run(root, 'pnpm', [ + '--dir', + 'uapi', + 'exec', + 'jest', + '--runTestsByPath', + 'tests/api/pipelineHarnessRoute.test.ts', + 'tests/terminalPipelineHarnessClient.test.ts', + '--runInBand', + ]); + } catch (error) { + failures.push(`V42 settlement rights delivery UAPI tests failed: ${error.stderr || error.message}`); + } + } + + const serializedArtifact = fileExists(root, ARTIFACT_PATH) ? read(root, ARTIFACT_PATH) : ''; + for (const marker of SECRET_MARKERS) { + assertCheck(failures, !serializedArtifact.includes(marker), `V42 Gate 6 artifact must not contain secret marker ${marker}.`); + } + + const artifact = serializedArtifact ? JSON.parse(serializedArtifact) : null; + if (artifact) { + assertCheck(failures, artifact.artifactId === 'v42-settlement-rights-delivery', 'Gate 6 artifactId must match.'); + assertCheck(failures, artifact.schemaId === 'bitcode.v42.settlementRightsDelivery.v1', 'Gate 6 schemaId must match.'); + assertCheck(failures, artifact.version === 'V42' && artifact.currentTarget === 'V41', 'Gate 6 artifact must bind V42 over active V41.'); + assertCheck(failures, artifact.passed === true, 'Gate 6 artifact must pass.'); + assertCheck(failures, artifact.coverage.rowCount === 11, 'Gate 6 must cover eleven settlement rows.'); + assertCheck(failures, artifact.coverage.runtimeType === 'AssetPackSettlementRightsDeliveryBoundary', 'Gate 6 must cover AssetPackSettlementRightsDeliveryBoundary.'); + assertCheck(failures, artifact.coverage.rightsTransferType === 'BtdRightsTransferReceipt', 'Gate 6 must cover BTD rights transfer.'); + assertCheck(failures, artifact.coverage.sourceToSharesType === 'SourceToSharesProof', 'Gate 6 must cover source-to-shares.'); + assertCheck(failures, artifact.coverage.reconciliationType === 'LedgerDatabaseReconciliationReport', 'Gate 6 must cover reconciliation.'); + assertCheck(failures, artifact.coverage.deliveryType === 'AssetPackDeliveryUnlockReceipt', 'Gate 6 must cover delivery unlock.'); + assertCheck(failures, artifact.coverage.stagingProjectRef === 'tkpyosihuouusyaxtbau', 'Gate 6 must bind staging-testnet Supabase project ref.'); + assertCheck(failures, artifact.coverage.sourceSafeMetadataOnly === true, 'Gate 6 must remain source-safe metadata only.'); + assertCheck(failures, artifact.coverage.protectedSourcePayloadSerialized === false, 'Gate 6 artifact must not serialize protected source.'); + assertCheck(failures, artifact.coverage.unpaidAssetPackSourceVisible === false, 'Gate 6 artifact must not expose unpaid AssetPack source.'); + assertCheck(failures, artifact.coverage.walletPrivateMaterialVisible === false, 'Gate 6 artifact must not expose private wallet material.'); + assertCheck(failures, artifact.coverage.settlementPrivatePayloadVisible === false, 'Gate 6 artifact must not expose private settlement payloads.'); + assertCheck(failures, artifact.coverage.credentialsSerialized === false, 'Gate 6 artifact must not serialize credentials.'); + assertCheck(failures, artifact.coverage.hostBoundaryMaterializationCovered === true, 'Gate 6 must cover live harness boundary materialization.'); + assertCheck(failures, artifact.coverage.routeReadbackCovered === true, 'Gate 6 must cover route readback.'); + assertCheck(failures, artifact.coverage.terminalReadbackCovered === true, 'Gate 6 must cover Terminal readback.'); + assertCheck(failures, artifact.coverage.confirmedPaymentCovered === true, 'Gate 6 must cover confirmed payment.'); + assertCheck(failures, artifact.coverage.underpaymentBlockedCovered === true, 'Gate 6 must cover underpayment blocking.'); + assertCheck(failures, artifact.coverage.finalityBlockedCovered === true, 'Gate 6 must cover finality blocking.'); + assertCheck(failures, artifact.coverage.reconciliationRepairCovered === true, 'Gate 6 must cover reconciliation repair.'); + assertCheck(failures, Array.isArray(artifact.coverage.failedPredicateIds) && artifact.coverage.failedPredicateIds.length === 0, 'Gate 6 predicates must all pass.'); + } + + if (failures.length > 0) { + process.stderr.write(`V42 Gate 6 settlement rights delivery check failed:\n- ${failures.join('\n- ')}\n`); + process.exitCode = 1; + return; + } + + process.stdout.write(`V42 Gate 6 settlement rights delivery ok artifact=${artifact.artifactRoot}\n`); +} + +main(); diff --git a/scripts/generate-v42-settlement-rights-delivery.mjs b/scripts/generate-v42-settlement-rights-delivery.mjs new file mode 100644 index 00000000..3e9fe1c2 --- /dev/null +++ b/scripts/generate-v42-settlement-rights-delivery.mjs @@ -0,0 +1,61 @@ +#!/usr/bin/env node + +import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { + V42_SETTLEMENT_RIGHTS_DELIVERY_ARTIFACT_PATH, + buildV42SettlementRightsDelivery, +} from '../packages/protocol/src/canonical/v42-settlement-rights-delivery.js'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const defaultRepoRoot = path.resolve(__dirname, '..'); + +function parseArgs(argv) { + const args = { + repoRoot: defaultRepoRoot, + check: false, + }; + for (let index = 0; index < argv.length; index += 1) { + const arg = argv[index]; + if (arg === '--repo-root') args.repoRoot = path.resolve(argv[++index]); + else if (arg === '--check') args.check = true; + else if (arg === '--help' || arg === '-h') { + process.stdout.write( + 'Usage: node scripts/generate-v42-settlement-rights-delivery.mjs [--check] [--repo-root ]\n', + ); + process.exit(0); + } else { + throw new Error(`Unknown argument ${arg}`); + } + } + return args; +} + +const args = parseArgs(process.argv.slice(2)); +const artifact = buildV42SettlementRightsDelivery({ repoRoot: args.repoRoot }); +const artifactPath = path.join(args.repoRoot, V42_SETTLEMENT_RIGHTS_DELIVERY_ARTIFACT_PATH); +const serialized = `${JSON.stringify(artifact, null, 2)}\n`; + +if (args.check) { + if (!existsSync(artifactPath)) { + process.stderr.write(`Missing ${V42_SETTLEMENT_RIGHTS_DELIVERY_ARTIFACT_PATH}\n`); + process.exit(1); + } + const current = readFileSync(artifactPath, 'utf8'); + if (current !== serialized) { + process.stderr.write(`${V42_SETTLEMENT_RIGHTS_DELIVERY_ARTIFACT_PATH} is stale. Run pnpm run generate:v42-settlement-rights-delivery.\n`); + process.exit(1); + } + if (!artifact.passed) { + process.stderr.write(`V42 settlement rights delivery artifact predicates failed: ${artifact.coverage.failedPredicateIds.join(', ')}\n`); + process.exit(1); + } + process.stdout.write(`V42 settlement rights delivery artifact ok ${artifact.artifactRoot}\n`); + process.exit(0); +} + +mkdirSync(path.dirname(artifactPath), { recursive: true }); +writeFileSync(artifactPath, serialized); +process.stdout.write(`Wrote ${V42_SETTLEMENT_RIGHTS_DELIVERY_ARTIFACT_PATH} ${artifact.artifactRoot}\n`); diff --git a/uapi/app/api/pipeline-harness/asset-pack/runner.ts b/uapi/app/api/pipeline-harness/asset-pack/runner.ts index 8cf8fd26..e34f8df4 100644 --- a/uapi/app/api/pipeline-harness/asset-pack/runner.ts +++ b/uapi/app/api/pipeline-harness/asset-pack/runner.ts @@ -444,6 +444,34 @@ function summarizeEvidence(evidence: unknown): Record | null { : assetPackPreviewBoundary?.disclosureReview && typeof assetPackPreviewBoundary.disclosureReview === 'object' ? (assetPackPreviewBoundary.disclosureReview as Record) : null; + const assetPackSettlementRightsDeliveryBoundary = + output?.assetPackSettlementRightsDeliveryBoundary && typeof output.assetPackSettlementRightsDeliveryBoundary === 'object' + ? (output.assetPackSettlementRightsDeliveryBoundary as Record) + : record.assetPackSettlementRightsDeliveryBoundary && typeof record.assetPackSettlementRightsDeliveryBoundary === 'object' + ? (record.assetPackSettlementRightsDeliveryBoundary as Record) + : null; + const assetPackSettlementReplayReceipt = + output?.assetPackSettlementReplayReceipt && typeof output.assetPackSettlementReplayReceipt === 'object' + ? (output.assetPackSettlementReplayReceipt as Record) + : assetPackSettlementRightsDeliveryBoundary?.replayReceipt && + typeof assetPackSettlementRightsDeliveryBoundary.replayReceipt === 'object' + ? (assetPackSettlementRightsDeliveryBoundary.replayReceipt as Record) + : null; + const assetPackDeliveryUnlock = + output?.assetPackDeliveryUnlock && typeof output.assetPackDeliveryUnlock === 'object' + ? (output.assetPackDeliveryUnlock as Record) + : assetPackSettlementRightsDeliveryBoundary?.deliveryUnlock && + typeof assetPackSettlementRightsDeliveryBoundary.deliveryUnlock === 'object' + ? (assetPackSettlementRightsDeliveryBoundary.deliveryUnlock as Record) + : null; + const assetPackLedgerDatabaseStorageReconciliation = + output?.assetPackLedgerDatabaseStorageReconciliation && + typeof output.assetPackLedgerDatabaseStorageReconciliation === 'object' + ? (output.assetPackLedgerDatabaseStorageReconciliation as Record) + : assetPackSettlementRightsDeliveryBoundary?.reconciliationReport && + typeof assetPackSettlementRightsDeliveryBoundary.reconciliationReport === 'object' + ? (assetPackSettlementRightsDeliveryBoundary.reconciliationReport as Record) + : null; const summarizeCandidate = (candidate: unknown) => { if (!candidate || typeof candidate !== 'object' || Array.isArray(candidate)) return null; const record = candidate as Record; @@ -606,6 +634,51 @@ function summarizeEvidence(evidence: unknown): Record | null { roots: assetPackDisclosureReview.roots, } : null, + assetPackSettlementRightsDeliveryBoundary: summarizeAssetPackSettlementRightsDeliveryBoundary( + assetPackSettlementRightsDeliveryBoundary, + ), + assetPackSettlementReplayReceipt: assetPackSettlementReplayReceipt + ? { + schema: assetPackSettlementReplayReceipt.schema, + replayMode: assetPackSettlementReplayReceipt.replayMode, + previewBoundaryRoot: assetPackSettlementReplayReceipt.previewBoundaryRoot, + quoteRoot: assetPackSettlementReplayReceipt.quoteRoot, + paymentReceiptRoot: assetPackSettlementReplayReceipt.paymentReceiptRoot, + finalityRoot: assetPackSettlementReplayReceipt.finalityRoot, + sourceToSharesRoot: assetPackSettlementReplayReceipt.sourceToSharesRoot, + rightsTransferRoot: assetPackSettlementReplayReceipt.rightsTransferRoot, + readReceiptRoot: assetPackSettlementReplayReceipt.readReceiptRoot, + deliveryRoot: assetPackSettlementReplayReceipt.deliveryRoot, + reconciliationRoot: assetPackSettlementReplayReceipt.reconciliationRoot, + replayRoot: assetPackSettlementReplayReceipt.replayRoot, + verified: assetPackSettlementReplayReceipt.verified, + } + : null, + assetPackDeliveryUnlock: assetPackDeliveryUnlock + ? { + schema: assetPackDeliveryUnlock.schema, + state: assetPackDeliveryUnlock.state, + deliveryMechanism: assetPackDeliveryUnlock.deliveryMechanism, + pullRequestTarget: assetPackDeliveryUnlock.pullRequestTarget, + sourceBearingDeliveryVisibleToReader: + assetPackDeliveryUnlock.sourceBearingDeliveryVisibleToReader, + protectedSourcePayloadSerialized: + assetPackDeliveryUnlock.protectedSourcePayloadSerialized, + requiredReceipts: assetPackDeliveryUnlock.requiredReceipts, + blockerCodes: assetPackDeliveryUnlock.blockerCodes, + deliveryRoot: assetPackDeliveryUnlock.deliveryRoot, + } + : null, + assetPackLedgerDatabaseStorageReconciliation: assetPackLedgerDatabaseStorageReconciliation + ? { + schema: assetPackLedgerDatabaseStorageReconciliation.schema, + reconciliationId: assetPackLedgerDatabaseStorageReconciliation.reconciliationId, + state: assetPackLedgerDatabaseStorageReconciliation.state, + blocking: assetPackLedgerDatabaseStorageReconciliation.blocking, + repairActions: assetPackLedgerDatabaseStorageReconciliation.repairActions, + proofRoots: assetPackLedgerDatabaseStorageReconciliation.proofRoots, + } + : null, depositorySearch: depositorySearch ? { ...summarizeFitLike(depositorySearch), @@ -787,6 +860,142 @@ function summarizeAssetPackPreviewBoundary( }; } +function summarizeAssetPackSettlementRightsDeliveryBoundary( + boundary: Record | null, +): Record | null { + if (!boundary) return null; + const paymentObservation = boundary.paymentObservation && typeof boundary.paymentObservation === 'object' + ? (boundary.paymentObservation as Record) + : null; + const finalityReceipt = boundary.finalityReceipt && typeof boundary.finalityReceipt === 'object' + ? (boundary.finalityReceipt as Record) + : null; + const deliveryUnlock = boundary.deliveryUnlock && typeof boundary.deliveryUnlock === 'object' + ? (boundary.deliveryUnlock as Record) + : null; + const settlementUnlock = boundary.settlementUnlock && typeof boundary.settlementUnlock === 'object' + ? (boundary.settlementUnlock as Record) + : null; + const reconciliationReport = boundary.reconciliationReport && typeof boundary.reconciliationReport === 'object' + ? (boundary.reconciliationReport as Record) + : null; + const replayReceipt = boundary.replayReceipt && typeof boundary.replayReceipt === 'object' + ? (boundary.replayReceipt as Record) + : null; + const repairPosture = boundary.repairPosture && typeof boundary.repairPosture === 'object' + ? (boundary.repairPosture as Record) + : null; + const proofRoots = boundary.proofRoots && typeof boundary.proofRoots === 'object' + ? (boundary.proofRoots as Record) + : null; + const sourceSafety = boundary.sourceSafety && typeof boundary.sourceSafety === 'object' + ? (boundary.sourceSafety as Record) + : null; + const storageProjection = Array.isArray(boundary.storageProjection) + ? boundary.storageProjection + .map((record) => record && typeof record === 'object' && !Array.isArray(record) + ? record as Record + : null) + .filter((record): record is Record => Boolean(record)) + : []; + + return { + schema: boundary.schema, + boundaryId: boundary.boundaryId, + state: boundary.state, + assetPackId: boundary.assetPackId, + readId: boundary.readId, + orderId: boundary.orderId, + previewBoundaryRoot: boundary.previewBoundaryRoot, + paymentObservation: paymentObservation + ? { + paymentReceiptId: paymentObservation.paymentReceiptId, + payer: paymentObservation.payer, + payee: paymentObservation.payee, + payerWalletId: paymentObservation.payerWalletId, + payeeWalletId: paymentObservation.payeeWalletId, + btcNetwork: paymentObservation.btcNetwork, + expectedSats: paymentObservation.expectedSats, + observedDebitSats: paymentObservation.observedDebitSats, + observedCreditSats: paymentObservation.observedCreditSats, + txid: paymentObservation.txid, + serverCustody: paymentObservation.serverCustody, + paymentReceiptRoot: paymentObservation.paymentReceiptRoot, + } + : null, + finalityReceipt: finalityReceipt + ? { + finalityState: finalityReceipt.finalityState, + confirmations: finalityReceipt.confirmations, + blockHeight: finalityReceipt.blockHeight, + txid: finalityReceipt.txid, + finalityRoot: finalityReceipt.finalityRoot, + } + : null, + sourceToSharesRoot: proofRoots?.sourceToSharesRoot ?? null, + btdReadReceiptRoot: proofRoots?.btdReadReceiptRoot ?? null, + rightsTransferRoot: proofRoots?.rightsTransferRoot ?? null, + settlementUnlock: settlementUnlock + ? { + state: settlementUnlock.state, + sourceAvailable: settlementUnlock.sourceAvailable, + reason: settlementUnlock.reason, + readLicenseId: settlementUnlock.readLicenseId, + pullRequestTarget: settlementUnlock.pullRequestTarget, + missingReadbackKeys: settlementUnlock.missingReadbackKeys, + } + : null, + deliveryUnlock: deliveryUnlock + ? { + state: deliveryUnlock.state, + deliveryMechanism: deliveryUnlock.deliveryMechanism, + pullRequestTarget: deliveryUnlock.pullRequestTarget, + sourceBearingDeliveryVisibleToReader: + deliveryUnlock.sourceBearingDeliveryVisibleToReader, + requiredReceipts: deliveryUnlock.requiredReceipts, + blockerCodes: deliveryUnlock.blockerCodes, + deliveryRoot: deliveryUnlock.deliveryRoot, + } + : null, + reconciliationReport: reconciliationReport + ? { + reconciliationId: reconciliationReport.reconciliationId, + state: reconciliationReport.state, + blocking: reconciliationReport.blocking, + repairActions: reconciliationReport.repairActions, + proofRoots: reconciliationReport.proofRoots, + } + : null, + replayReceipt: replayReceipt + ? { + replayMode: replayReceipt.replayMode, + quoteRoot: replayReceipt.quoteRoot, + paymentReceiptRoot: replayReceipt.paymentReceiptRoot, + finalityRoot: replayReceipt.finalityRoot, + sourceToSharesRoot: replayReceipt.sourceToSharesRoot, + rightsTransferRoot: replayReceipt.rightsTransferRoot, + readReceiptRoot: replayReceipt.readReceiptRoot, + deliveryRoot: replayReceipt.deliveryRoot, + reconciliationRoot: replayReceipt.reconciliationRoot, + replayRoot: replayReceipt.replayRoot, + verified: replayReceipt.verified, + } + : null, + repairPosture, + sourceSafety, + proofRoots, + storageProjection: storageProjection.map((record) => ({ + recordId: record.recordId, + recordKind: record.recordKind, + namespace: record.namespace, + key: record.key, + root: record.root, + sourceSafety: record.sourceSafety, + })), + storageRecordCount: storageProjection.length, + }; +} + function safeHostEvent(event: PipelineHarnessHostEvent): PipelineHarnessHostEvent { return event; } diff --git a/uapi/app/terminal/README.md b/uapi/app/terminal/README.md index 6ec89b32..7c0ea178 100644 --- a/uapi/app/terminal/README.md +++ b/uapi/app/terminal/README.md @@ -135,6 +135,19 @@ and rights-transfer readback. The source-safe proof artifact is `.bitcode/v42-readfitsfinding-preview-quote.json`, checked by `pnpm run check:v42-gate5`. +V42 Gate 6 closes Terminal Settlement rights readback. The paid-boundary panel +now reads `AssetPackSettlementRightsDeliveryBoundary` summaries from pipeline +harness evidence, including BTC payment observation, finality, source-to-shares +compensation, BTD rights transfer, paid read receipt, source-bearing +pull-request delivery unlock, ledger/database/object-storage reconciliation, +replay root, repair posture, and storage record count. Terminal keeps these +rows expandable and source-safe: it may show that delivery is unlocked for the +paid Reader after settlement, but it must not expose unpaid AssetPack source, +protected source, wallet private material, private settlement payloads, +credentials, raw protected prompts, or raw provider responses. The source-safe +proof artifact is `.bitcode/v42-settlement-rights-delivery.json`, checked by +`pnpm run check:v42-gate6`. + ## Live staging-testnet QA Terminal Deposit/Read QA starts only after Wallet and Externals prerequisites are diff --git a/uapi/app/terminal/TerminalDepositReadWorkbench.tsx b/uapi/app/terminal/TerminalDepositReadWorkbench.tsx index 870f2bad..3ab4a2f7 100644 --- a/uapi/app/terminal/TerminalDepositReadWorkbench.tsx +++ b/uapi/app/terminal/TerminalDepositReadWorkbench.tsx @@ -339,6 +339,25 @@ export default function TerminalDepositReadWorkbench({ const disclosureRoots = objectValue(assetPackDisclosureReview?.roots); const disclosureSourceSafe = disclosureLeakage?.protectedSourceDetected !== true; const ledgerSettlement = objectValue(completedHarnessEvidence?.ledgerSettlement); + const assetPackSettlementRightsDeliveryBoundary = objectValue( + completedHarnessEvidence?.assetPackSettlementRightsDeliveryBoundary, + ); + const assetPackSettlementPaymentObservation = objectValue( + assetPackSettlementRightsDeliveryBoundary?.paymentObservation, + ); + const assetPackSettlementFinalityReceipt = objectValue( + assetPackSettlementRightsDeliveryBoundary?.finalityReceipt, + ); + const assetPackSettlementDeliveryUnlock = + objectValue(assetPackSettlementRightsDeliveryBoundary?.deliveryUnlock) || + objectValue(completedHarnessEvidence?.assetPackDeliveryUnlock); + const assetPackSettlementReplayReceipt = + objectValue(assetPackSettlementRightsDeliveryBoundary?.replayReceipt) || + objectValue(completedHarnessEvidence?.assetPackSettlementReplayReceipt); + const assetPackSettlementReconciliation = + objectValue(assetPackSettlementRightsDeliveryBoundary?.reconciliationReport) || + objectValue(completedHarnessEvidence?.assetPackLedgerDatabaseStorageReconciliation); + const assetPackSettlementProofRoots = objectValue(assetPackSettlementRightsDeliveryBoundary?.proofRoots); const previewFeeQuote = assetPackQuoteReceipt || objectValue(sourceSafePreview?.feeQuote); @@ -534,6 +553,91 @@ export default function TerminalDepositReadWorkbench({ sourceSafePreview?.roots, ], ); + const assetPackSettlementBoundaryRows = useMemo( + () => [ + { + label: 'Boundary', + value: shortIdentifier(assetPackSettlementRightsDeliveryBoundary?.boundaryId) || 'pending', + }, + { + label: 'State', + value: textValue(assetPackSettlementRightsDeliveryBoundary?.state) || 'pending', + }, + { + label: 'Payment', + value: + numericValue(assetPackSettlementPaymentObservation?.observedDebitSats) && + numericValue(assetPackSettlementPaymentObservation?.expectedSats) + ? `${String(assetPackSettlementPaymentObservation?.observedDebitSats)}/${String(assetPackSettlementPaymentObservation?.expectedSats)} sats` + : 'pending', + }, + { + label: 'Payment root', + value: shortIdentifier(assetPackSettlementPaymentObservation?.paymentReceiptRoot) || 'pending', + }, + { + label: 'Finality', + value: textValue(assetPackSettlementFinalityReceipt?.finalityState) || 'pending', + }, + { + label: 'Finality root', + value: shortIdentifier(assetPackSettlementFinalityReceipt?.finalityRoot) || 'pending', + }, + { + label: 'Source-to-shares', + value: shortIdentifier(assetPackSettlementProofRoots?.sourceToSharesRoot) || 'pending', + }, + { + label: 'Rights transfer', + value: shortIdentifier(assetPackSettlementProofRoots?.rightsTransferRoot) || 'pending', + }, + { + label: 'Read receipt', + value: shortIdentifier(assetPackSettlementProofRoots?.btdReadReceiptRoot) || 'pending', + }, + { + label: 'Delivery unlock', + value: textValue(assetPackSettlementDeliveryUnlock?.state) || 'pending', + }, + { + label: 'Delivery root', + value: shortIdentifier(assetPackSettlementDeliveryUnlock?.deliveryRoot) || 'pending', + }, + { + label: 'Reconciliation', + value: textValue(assetPackSettlementReconciliation?.state) || 'pending', + }, + { + label: 'Reconciliation root', + value: + shortIdentifier(objectValue(assetPackSettlementReconciliation?.proofRoots)?.repairPlanRoot) || + shortIdentifier(assetPackSettlementProofRoots?.reconciliationRoot) || + 'pending', + }, + { + label: 'Replay root', + value: + shortIdentifier(assetPackSettlementReplayReceipt?.replayRoot) || + shortIdentifier(assetPackSettlementProofRoots?.replayRoot) || + 'pending', + }, + { + label: 'Storage records', + value: numericValue(assetPackSettlementRightsDeliveryBoundary?.storageRecordCount) + ? String(assetPackSettlementRightsDeliveryBoundary?.storageRecordCount) + : String(countList(assetPackSettlementRightsDeliveryBoundary?.storageProjection) || 0), + }, + ], + [ + assetPackSettlementDeliveryUnlock, + assetPackSettlementFinalityReceipt, + assetPackSettlementPaymentObservation, + assetPackSettlementProofRoots, + assetPackSettlementReconciliation, + assetPackSettlementReplayReceipt, + assetPackSettlementRightsDeliveryBoundary, + ], + ); const readNeedRows = useMemo(() => { if (!currentReadNeed) return []; return [ @@ -1112,6 +1216,19 @@ export default function TerminalDepositReadWorkbench({ ))} +
+ + Settlement rights, compensation, and delivery + +
+ {assetPackSettlementBoundaryRows.map((row) => ( +
+
{row.label}
+
{row.value}
+
+ ))} +
+
diff --git a/uapi/app/terminal/terminal-pipeline-harness-client.ts b/uapi/app/terminal/terminal-pipeline-harness-client.ts index 487d10a4..e1443134 100644 --- a/uapi/app/terminal/terminal-pipeline-harness-client.ts +++ b/uapi/app/terminal/terminal-pipeline-harness-client.ts @@ -636,6 +636,13 @@ export function summarizeTerminalReadFitsFindingSynthesisHarnessEvent( const ledgerSettlement = recordValue(evidence?.ledgerSettlement); const sourceSafePreview = recordValue(evidence?.sourceSafePreview); const assetPackPreviewBoundary = recordValue(evidence?.assetPackPreviewBoundary); + const settlementBoundary = recordValue(evidence?.assetPackSettlementRightsDeliveryBoundary); + const deliveryUnlock = recordValue(settlementBoundary?.deliveryUnlock) || + recordValue(evidence?.assetPackDeliveryUnlock); + const paymentObservation = recordValue(settlementBoundary?.paymentObservation); + const finalityReceipt = recordValue(settlementBoundary?.finalityReceipt); + const reconciliationReport = recordValue(settlementBoundary?.reconciliationReport) || + recordValue(evidence?.assetPackLedgerDatabaseStorageReconciliation); const boundaryQuoteReceipt = recordValue(assetPackPreviewBoundary?.quoteReceipt); const boundarySelectedFitProvenance = recordValue(assetPackPreviewBoundary?.selectedFitProvenance); const boundarySettlementInstructions = recordValue(assetPackPreviewBoundary?.settlementInstructions); @@ -674,6 +681,25 @@ export function summarizeTerminalReadFitsFindingSynthesisHarnessEvent( const deliveryText = boundaryDeliveryPosture?.state ? ` delivery ${String(boundaryDeliveryPosture.state)}` : null; + const settlementBoundaryText = settlementBoundary?.state + ? ` settlement-boundary ${String(settlementBoundary.state)}` + : null; + const paymentText = typeof paymentObservation?.observedDebitSats === 'number' && + typeof paymentObservation?.expectedSats === 'number' + ? ` paid ${paymentObservation.observedDebitSats}/${paymentObservation.expectedSats} sats` + : null; + const finalityText = finalityReceipt?.finalityState + ? ` finality ${String(finalityReceipt.finalityState)}` + : null; + const rightsText = settlementBoundary?.rightsTransferRoot + ? ` rights ${shortIdentifier(settlementBoundary.rightsTransferRoot)}` + : null; + const deliveredText = deliveryUnlock?.state + ? ` delivery-unlock ${String(deliveryUnlock.state)}` + : null; + const reconciliationText = reconciliationReport?.state + ? ` reconciliation ${String(reconciliationReport.state)}` + : null; const unlockText = unlock?.sourceAvailable === true ? ` source ${String(unlock.state || 'available')}` : unlock?.state @@ -700,6 +726,12 @@ export function summarizeTerminalReadFitsFindingSynthesisHarnessEvent( quoteText, settlementText, deliveryText, + settlementBoundaryText, + paymentText, + finalityText, + rightsText, + deliveredText, + reconciliationText, unlockText, disclosureText, leakageText, diff --git a/uapi/tests/api/pipelineHarnessRoute.test.ts b/uapi/tests/api/pipelineHarnessRoute.test.ts index 81dd1a44..935185f0 100644 --- a/uapi/tests/api/pipelineHarnessRoute.test.ts +++ b/uapi/tests/api/pipelineHarnessRoute.test.ts @@ -190,6 +190,125 @@ jest.mock('@bitcode/pipeline-hosts', () => ({ }, ], }, + assetPackSettlementRightsDeliveryBoundary: { + schema: 'bitcode.asset-pack.settlement-rights-delivery-boundary', + boundaryId: 'asset-pack-settlement-rights-delivery-route-test', + state: 'settlement_delivered', + assetPackId: 'asset-pack-route-test', + readId: 'read-route-test', + orderId: 'order-route-test', + previewBoundaryRoot: 'sha256:route-boundary-root', + paymentObservation: { + paymentReceiptId: 'btc-fee-route-test', + payer: 'reader', + payee: 'depositor', + payerWalletId: 'reader-wallet-route-test', + payeeWalletId: 'depositor-wallet-route-test', + btcNetwork: 'testnet', + expectedSats: 546, + observedDebitSats: 546, + observedCreditSats: 546, + txid: 'testnet-route-txid', + serverCustody: false, + paymentReceiptRoot: 'sha256:route-payment-root', + }, + finalityReceipt: { + finalityState: 'confirmed', + confirmations: 6, + blockHeight: 840000, + txid: 'testnet-route-txid', + finalityRoot: 'sha256:route-finality-root', + }, + settlementUnlock: { + schema: 'bitcode.asset-pack.settlement-unlock', + state: 'licensed_read', + sourceAvailable: true, + reason: 'settlement delivered in route test', + readLicenseId: 'read-license-route-test', + pullRequestTarget: 'https://github.com/engineeredsoftware/ENGI/pull/42', + missingReadbackKeys: [], + }, + deliveryUnlock: { + schema: 'bitcode.asset-pack.delivery-unlock', + state: 'source_bearing_pull_request_ready', + deliveryMechanism: 'pull_request_after_settlement', + pullRequestTarget: 'https://github.com/engineeredsoftware/ENGI/pull/42', + sourceBearingDeliveryVisibleToReader: true, + protectedSourcePayloadSerialized: false, + requiredReceipts: ['btc_payment_observation', 'btd_rights_transfer'], + blockerCodes: [], + deliveryRoot: 'sha256:route-delivery-unlock-root', + }, + reconciliationReport: { + schema: 'bitcode.ledger-database-reconciliation-report', + reconciliationId: 'reconciliation-route-test', + state: 'aligned', + blocking: false, + repairActions: [], + proofRoots: { + repairPlanRoot: 'sha256:route-reconciliation-root', + }, + }, + replayReceipt: { + schema: 'bitcode.asset-pack.settlement-rights-delivery.replay-receipt', + replayMode: 'settlement-rights-delivery-replay', + previewBoundaryRoot: 'sha256:route-boundary-root', + quoteRoot: 'sha256:route-quote-root', + paymentReceiptRoot: 'sha256:route-payment-root', + finalityRoot: 'sha256:route-finality-root', + sourceToSharesRoot: 'sha256:route-source-to-shares-root', + rightsTransferRoot: 'sha256:route-rights-root', + readReceiptRoot: 'sha256:route-read-root', + deliveryRoot: 'sha256:route-delivery-unlock-root', + reconciliationRoot: 'sha256:route-reconciliation-root', + replayRoot: 'sha256:route-settlement-replay-root', + verified: { + paymentMatchesQuote: true, + finalityConfirmed: true, + sourceToSharesConserved: true, + rightsTransferConfirmed: true, + reconciliationAligned: true, + deliveryUnlockedOnlyAfterSettlement: true, + protectedSourcePayloadAbsent: true, + }, + }, + sourceSafety: { + sourceSafeMetadataOnly: true, + protectedSourcePayloadSerialized: false, + sourceBearingDeliveryUnlockedToReader: true, + walletPrivateMaterialVisible: false, + credentialsSerialized: false, + }, + proofRoots: { + previewBoundaryRoot: 'sha256:route-boundary-root', + paymentReceiptRoot: 'sha256:route-payment-root', + finalityRoot: 'sha256:route-finality-root', + sourceToSharesRoot: 'sha256:route-source-to-shares-root', + btdReadReceiptRoot: 'sha256:route-read-root', + rightsTransferRoot: 'sha256:route-rights-root', + settlementUnlockRoot: 'sha256:route-settlement-unlock-root', + deliveryRoot: 'sha256:route-delivery-unlock-root', + reconciliationRoot: 'sha256:route-reconciliation-root', + storageRoot: 'sha256:route-settlement-storage-root', + replayRoot: 'sha256:route-settlement-replay-root', + boundaryRoot: 'sha256:route-settlement-boundary-root', + }, + storageProjection: [ + { + recordId: 'route-settlement-storage-record', + recordKind: 'btd_rights_transfer', + namespace: 'asset-pack/settlement', + key: 'rightsTransferReceipt', + root: 'sha256:route-settlement-storage-record-root', + sourceSafety: { + sourceSafeMetadataOnly: true, + }, + payload: { + hiddenFromRouteSummary: true, + }, + }, + ], + }, }, }, telemetry: '{"type":"pipeline-stream-event","runId":"route-run","stage":"asset-pack-synthesis"}\n', @@ -620,6 +739,35 @@ describe('POST /api/pipeline-harness/asset-pack', () => { state: 'withheld_until_settlement', sourceBearingDeliveryVisible: false, }, + assetPackSettlementRightsDeliveryBoundary: { + state: 'settlement_delivered', + assetPackId: 'asset-pack-route-test', + paymentObservation: { + observedDebitSats: 546, + expectedSats: 546, + serverCustody: false, + }, + finalityReceipt: { + finalityState: 'confirmed', + }, + deliveryUnlock: { + state: 'source_bearing_pull_request_ready', + sourceBearingDeliveryVisibleToReader: true, + }, + reconciliationReport: { + state: 'aligned', + blocking: false, + }, + storageRecordCount: 1, + }, + assetPackDeliveryUnlock: { + state: 'source_bearing_pull_request_ready', + sourceBearingDeliveryVisibleToReader: true, + }, + assetPackLedgerDatabaseStorageReconciliation: { + state: 'aligned', + blocking: false, + }, }, }); expect(eventText).toContain('[redacted]'); diff --git a/uapi/tests/terminalPipelineHarnessClient.test.ts b/uapi/tests/terminalPipelineHarnessClient.test.ts index 06882e99..52ceaf4e 100644 --- a/uapi/tests/terminalPipelineHarnessClient.test.ts +++ b/uapi/tests/terminalPipelineHarnessClient.test.ts @@ -211,6 +211,23 @@ describe('terminal pipeline harness client', () => { state: 'withheld_until_settlement', }, }, + assetPackSettlementRightsDeliveryBoundary: { + state: 'settlement_delivered', + rightsTransferRoot: 'sha256:settlement-rights-root', + paymentObservation: { + expectedSats: 546, + observedDebitSats: 546, + }, + finalityReceipt: { + finalityState: 'confirmed', + }, + deliveryUnlock: { + state: 'source_bearing_pull_request_ready', + }, + reconciliationReport: { + state: 'aligned', + }, + }, assetPackDisclosureReview: { access: { sourceVisibility: 'available_after_settlement', @@ -233,6 +250,12 @@ describe('terminal pipeline harness client', () => { expect(summary).toContain('quote sha256:asset'); expect(summary).toContain('settlement quote_ready_settlement_required'); expect(summary).toContain('delivery withheld_until_settlement'); + expect(summary).toContain('settlement-boundary settlement_delivered'); + expect(summary).toContain('paid 546/546 sats'); + expect(summary).toContain('finality confirmed'); + expect(summary).toContain('rights sha256:settl'); + expect(summary).toContain('delivery-unlock source_bearing_pull_request_ready'); + expect(summary).toContain('reconciliation aligned'); expect(summary).toContain('source licensed_read'); expect(summary).toContain('disclosure available_after_settlement'); expect(summary).toContain('leakage none'); From f27fcc581f7eba212b18177d1ade432dfc339298 Mon Sep 17 00:00:00 2001 From: Garrett Maring Date: Thu, 28 May 2026 19:37:27 -0300 Subject: [PATCH 08/35] V42 Gate 7: Prove AI-reading AssetPack uplift Add the self-contained protocol-demonstration AI-reading loop that compares a public-data-only remediation answer against an AssetPack-enhanced answer after local Need synthesis and Finding Fits selection. Add the V42 AI-reading demonstration artifact, checker, protocol exports/tests, docs, workflow wiring, and forward-compatible Gate 6 roadmap predicate. Validated with check:v42-gate7, check-v42-gate6 with package/UAPI skips, protocol-demonstration test:v28-mvp-qa, protocol package tests/typecheck, syntax checks, secret marker scan, and git diff --check. --- .bitcode/v42-ai-reading-demonstration.json | 416 ++++++++++++++++++ .bitcode/v42-settlement-rights-delivery.json | 4 +- .github/workflows/bitcode-canon-quality.yml | 3 + .github/workflows/bitcode-gate-quality.yml | 3 + BITCODE_SPEC_V42.md | 3 + BITCODE_SPEC_V42_DELTA.md | 3 +- BITCODE_SPEC_V42_NOTES.md | 4 +- BITCODE_SPEC_V42_PARITY_MATRIX.md | 4 +- README.md | 9 + SPECIFICATIONS_ROADMAP.md | 7 +- package.json | 3 + packages/protocol/README.md | 12 + .../canonical/v42-ai-reading-demonstration.js | 248 +++++++++++ .../v42-settlement-rights-delivery.js | 2 +- packages/protocol/src/index.d.ts | 8 + packages/protocol/src/index.js | 10 + .../test/v42-ai-reading-demonstration.test.js | 42 ++ protocol-demonstration/README.md | 23 + protocol-demonstration/package.json | 3 +- .../src/ai-reading-demonstration.js | 176 ++++++++ protocol-demonstration/src/index.d.ts | 3 + protocol-demonstration/src/index.js | 4 + .../test/v42-ai-reading-mvp.test.js | 44 ++ ...eck-v42-gate7-ai-reading-demonstration.mjs | 202 +++++++++ .../generate-v42-ai-reading-demonstration.mjs | 62 +++ 25 files changed, 1287 insertions(+), 11 deletions(-) create mode 100644 .bitcode/v42-ai-reading-demonstration.json create mode 100644 packages/protocol/src/canonical/v42-ai-reading-demonstration.js create mode 100644 packages/protocol/test/v42-ai-reading-demonstration.test.js create mode 100644 protocol-demonstration/src/ai-reading-demonstration.js create mode 100644 protocol-demonstration/test/v42-ai-reading-mvp.test.js create mode 100644 scripts/check-v42-gate7-ai-reading-demonstration.mjs create mode 100644 scripts/generate-v42-ai-reading-demonstration.mjs diff --git a/.bitcode/v42-ai-reading-demonstration.json b/.bitcode/v42-ai-reading-demonstration.json new file mode 100644 index 00000000..7ad5e0bf --- /dev/null +++ b/.bitcode/v42-ai-reading-demonstration.json @@ -0,0 +1,416 @@ +{ + "artifactId": "v42-ai-reading-demonstration", + "schemaId": "bitcode.v42.aiReadingDemonstration.v1", + "version": "V42", + "currentTarget": "V41", + "sourceSafetyVerdict": "source-safe-v42-ai-reading-demonstration-metadata", + "rowIds": [ + "baseline:public-data-only-ai-reading", + "need:source-bound-read-comprehension", + "fits:local-depository-assetpack-selection", + "assetpack:enhanced-ai-reading", + "measurement:benchmark-uplift", + "source-safety:settlement-gated-disclosure", + "boundary:self-contained-demonstration", + "proof:artifact-tests-workflows" + ], + "rows": [ + { + "rowId": "baseline:public-data-only-ai-reading", + "purpose": "Represent the public-data-only AI answer as the baseline before any AssetPack knowledge is available.", + "sourceRoots": [ + "protocol-demonstration/src/ai-reading-demonstration.js", + "protocol-demonstration/test/v42-ai-reading-mvp.test.js" + ], + "emittedTypes": [ + "publicDataOnlyBaseline", + "scoreAssistantResponse" + ], + "requiredEvidence": [ + "public-data-only", + "missingTerms", + "scoreBp" + ], + "rowRoot": "v42-ai-reading-demonstration-row:5ffb14f264ed1562ad56f42c", + "sourceSafetyClass": "source_safe_v42_ai_reading_demonstration_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourcePayloadSerialized": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "outsideRuntimeImportRequired": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "secret-values", + "outside-runtime-imports" + ] + }, + { + "rowId": "need:source-bound-read-comprehension", + "purpose": "Reuse the local ReadNeed synthesis loop so the demonstration starts from a reviewed source-bound Need.", + "sourceRoots": [ + "protocol-demonstration/src/ai-reading-demonstration.js", + "protocol-demonstration/src/local-fit-finding.js", + "protocol-demonstration/test/v42-ai-reading-mvp.test.js" + ], + "emittedTypes": [ + "readNeed", + "synthesizeReadNeedLocally", + "acceptReadNeedLocally" + ], + "requiredEvidence": [ + "Acquire an AssetPack", + "needs_acceptance", + "accepted" + ], + "rowRoot": "v42-ai-reading-demonstration-row:442af48e760474900ab98cc6", + "sourceSafetyClass": "source_safe_v42_ai_reading_demonstration_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourcePayloadSerialized": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "outsideRuntimeImportRequired": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "secret-values", + "outside-runtime-imports" + ] + }, + { + "rowId": "fits:local-depository-assetpack-selection", + "purpose": "Find the deposited AssetPack candidate locally, rank it, and preserve proof roots without importing product code.", + "sourceRoots": [ + "protocol-demonstration/src/ai-reading-demonstration.js", + "protocol-demonstration/src/local-fit-finding.js", + "protocol-demonstration/test/v42-ai-reading-mvp.test.js" + ], + "emittedTypes": [ + "findNeedFitLocally", + "selectedDepositIds", + "rankingRoot" + ], + "requiredEvidence": [ + "deposit-auth-migration-runbook", + "worthy_fit", + "queryRoot" + ], + "rowRoot": "v42-ai-reading-demonstration-row:86b108220396ff6f9cd23c24", + "sourceSafetyClass": "source_safe_v42_ai_reading_demonstration_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourcePayloadSerialized": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "outsideRuntimeImportRequired": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "secret-values", + "outside-runtime-imports" + ] + }, + { + "rowId": "assetpack:enhanced-ai-reading", + "purpose": "Apply the selected AssetPack knowledge to the AI answer after rights are available, while pre-settlement source remains withheld.", + "sourceRoots": [ + "protocol-demonstration/src/ai-reading-demonstration.js", + "protocol-demonstration/test/v42-ai-reading-mvp.test.js" + ], + "emittedTypes": [ + "assetPackEnhancedReading", + "assetPackPreview", + "sourceSafety" + ], + "requiredEvidence": [ + "assetpack-enhanced-after-rights", + "withheld_until_settlement", + "sourceBearingDeliveryRequiresSettlement" + ], + "rowRoot": "v42-ai-reading-demonstration-row:2b0ecabe25a5188357a9fb9c", + "sourceSafetyClass": "source_safe_v42_ai_reading_demonstration_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourcePayloadSerialized": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "outsideRuntimeImportRequired": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "secret-values", + "outside-runtime-imports" + ] + }, + { + "rowId": "measurement:benchmark-uplift", + "purpose": "Measure basis-point improvement between public baseline and AssetPack-enhanced reading.", + "sourceRoots": [ + "protocol-demonstration/src/ai-reading-demonstration.js", + "protocol-demonstration/src/benchmark-model.js", + "protocol-demonstration/test/v42-ai-reading-mvp.test.js" + ], + "emittedTypes": [ + "benchmark", + "improvement", + "buildBenchmarkComparison" + ], + "requiredEvidence": [ + "minimumUpliftBp", + "upliftBp", + "treatmentBp" + ], + "rowRoot": "v42-ai-reading-demonstration-row:63b02f505c01000a26880b15", + "sourceSafetyClass": "source_safe_v42_ai_reading_demonstration_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourcePayloadSerialized": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "outsideRuntimeImportRequired": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "secret-values", + "outside-runtime-imports" + ] + }, + { + "rowId": "source-safety:settlement-gated-disclosure", + "purpose": "Keep protected source and unpaid AssetPack source out of the demonstration result and preview.", + "sourceRoots": [ + "protocol-demonstration/src/ai-reading-demonstration.js", + "protocol-demonstration/test/v42-ai-reading-mvp.test.js", + "protocol-demonstration/test/v28-boundary-separation.test.js" + ], + "emittedTypes": [ + "sourceSafety", + "assetPackPreview" + ], + "requiredEvidence": [ + "protectedSourceBeforeSettlement", + "publicBaselineUsesDepositorySource: false", + "v28-boundary-separation" + ], + "rowRoot": "v42-ai-reading-demonstration-row:d92819266a8a7ecb1ed19f3c", + "sourceSafetyClass": "source_safe_v42_ai_reading_demonstration_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourcePayloadSerialized": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "outsideRuntimeImportRequired": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "secret-values", + "outside-runtime-imports" + ] + }, + { + "rowId": "boundary:self-contained-demonstration", + "purpose": "Maintain the demonstration as self-contained code with no product runtime imports.", + "sourceRoots": [ + "protocol-demonstration/src/ai-reading-demonstration.js", + "protocol-demonstration/src/index.js", + "protocol-demonstration/package.json", + "protocol-demonstration/test/v28-boundary-separation.test.js" + ], + "emittedTypes": [ + "runAiReadingDominantDemonstration", + "buildAiReadingDemonstrationInput" + ], + "requiredEvidence": [ + "outsideSourceImportsAllowed: false", + "test:v42-ai-reading-mvp", + "does not import outside source" + ], + "rowRoot": "v42-ai-reading-demonstration-row:16dc6761067d69eec8e9dff5", + "sourceSafetyClass": "source_safe_v42_ai_reading_demonstration_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourcePayloadSerialized": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "outsideRuntimeImportRequired": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "secret-values", + "outside-runtime-imports" + ] + }, + { + "rowId": "proof:artifact-tests-workflows", + "purpose": "Bind V42 Gate 7 closure to generated artifact, protocol test, demonstration test, docs, package scripts, and workflows.", + "sourceRoots": [ + "packages/protocol/test/v42-ai-reading-demonstration.test.js", + "package.json", + ".github/workflows/bitcode-gate-quality.yml", + ".github/workflows/bitcode-canon-quality.yml" + ], + "emittedTypes": [ + "V42AiReadingDemonstration" + ], + "requiredEvidence": [ + "v42-ai-reading-demonstration", + "check-v42-gate7-ai-reading-demonstration.mjs" + ], + "rowRoot": "v42-ai-reading-demonstration-row:e57a2afa0a3f278e270c8196", + "sourceSafetyClass": "source_safe_v42_ai_reading_demonstration_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourcePayloadSerialized": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "outsideRuntimeImportRequired": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "raw-protected-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "secret-values", + "outside-runtime-imports" + ] + } + ], + "predicateResults": [ + { + "id": "demo-runtime-builds-input", + "sourcePath": "protocol-demonstration/src/ai-reading-demonstration.js", + "passed": true + }, + { + "id": "demo-runtime-runs-fit-search", + "sourcePath": "protocol-demonstration/src/ai-reading-demonstration.js", + "passed": true + }, + { + "id": "demo-runtime-measures-uplift", + "sourcePath": "protocol-demonstration/src/ai-reading-demonstration.js", + "passed": true + }, + { + "id": "demo-runtime-source-safe", + "sourcePath": "protocol-demonstration/src/ai-reading-demonstration.js", + "passed": true + }, + { + "id": "demo-index-exports-runtime", + "sourcePath": "protocol-demonstration/src/index.js", + "passed": true + }, + { + "id": "demo-test-proves-uplift", + "sourcePath": "protocol-demonstration/test/v42-ai-reading-mvp.test.js", + "passed": true + }, + { + "id": "demo-test-proves-determinism", + "sourcePath": "protocol-demonstration/test/v42-ai-reading-mvp.test.js", + "passed": true + }, + { + "id": "demo-boundary-test-retained", + "sourcePath": "protocol-demonstration/test/v28-boundary-separation.test.js", + "passed": true + }, + { + "id": "demo-package-script-wired", + "sourcePath": "protocol-demonstration/package.json", + "passed": true + }, + { + "id": "protocol-test-wired", + "sourcePath": "packages/protocol/test/v42-ai-reading-demonstration.test.js", + "passed": true + }, + { + "id": "protocol-export-wired", + "sourcePath": "packages/protocol/src/index.js", + "passed": true + }, + { + "id": "package-scripts-wired", + "sourcePath": "package.json", + "passed": true + }, + { + "id": "workflows-run-gate7", + "sourcePath": ".github/workflows/bitcode-gate-quality.yml", + "passed": true + }, + { + "id": "v42-docs-expanded", + "sourcePath": "BITCODE_SPEC_V42.md", + "passed": true + }, + { + "id": "v42-delta-expanded", + "sourcePath": "BITCODE_SPEC_V42_DELTA.md", + "passed": true + }, + { + "id": "v42-notes-expanded", + "sourcePath": "BITCODE_SPEC_V42_NOTES.md", + "passed": true + }, + { + "id": "v42-parity-implemented", + "sourcePath": "BITCODE_SPEC_V42_PARITY_MATRIX.md", + "passed": true + }, + { + "id": "roadmap-advanced-to-gate7", + "sourcePath": "SPECIFICATIONS_ROADMAP.md", + "passed": true + }, + { + "id": "readmes-document-gate7", + "sourcePath": "README.md", + "passed": true + } + ], + "coverage": { + "rowCount": 8, + "sourceSafetyVerdict": "source-safe-v42-ai-reading-demonstration-metadata", + "demonstrationRuntime": "protocol-demonstration/src/ai-reading-demonstration.js", + "demonstrationTest": "protocol-demonstration/test/v42-ai-reading-mvp.test.js", + "baselineMode": "public-data-only", + "enhancedMode": "assetpack-enhanced-after-rights", + "minimumUpliftBp": 2400, + "expectedBaselineBp": 0, + "expectedTreatmentBp": 10000, + "expectedSelectedDepositId": "deposit-auth-migration-runbook", + "expectedFitResultState": "worthy_fit", + "protectedSourceBeforeSettlement": "withheld_until_settlement", + "sourceBearingDeliveryRequiresSettlement": true, + "deterministicLocalOnly": true, + "selfContainedDemonstration": true, + "outsideRuntimeImportRequired": false, + "sourceSafeMetadataOnly": true, + "protectedSourcePayloadSerialized": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "failedPredicateIds": [] + }, + "passed": true, + "artifactRoot": "v42-ai-reading-demonstration:611a9f54deb36a9d6506adf5" +} diff --git a/.bitcode/v42-settlement-rights-delivery.json b/.bitcode/v42-settlement-rights-delivery.json index f8517199..2e3f4285 100644 --- a/.bitcode/v42-settlement-rights-delivery.json +++ b/.bitcode/v42-settlement-rights-delivery.json @@ -521,7 +521,7 @@ "passed": true }, { - "id": "roadmap-advanced-to-gate6", + "id": "roadmap-records-gate6-closure", "sourcePath": "SPECIFICATIONS_ROADMAP.md", "passed": true }, @@ -583,5 +583,5 @@ "failedPredicateIds": [] }, "passed": true, - "artifactRoot": "v42-settlement-rights-delivery:09c7a0fd5dd0b1952aa75eb9" + "artifactRoot": "v42-settlement-rights-delivery:6866f71624c147178c383189" } diff --git a/.github/workflows/bitcode-canon-quality.yml b/.github/workflows/bitcode-canon-quality.yml index e8a99519..25b5041e 100644 --- a/.github/workflows/bitcode-canon-quality.yml +++ b/.github/workflows/bitcode-canon-quality.yml @@ -310,6 +310,9 @@ jobs: if [ -f scripts/check-v42-gate6-settlement-rights-delivery.mjs ]; then node scripts/check-v42-gate6-settlement-rights-delivery.mjs --skip-branch-check --skip-package-tests --skip-uapi-tests fi + if [ -f scripts/check-v42-gate7-ai-reading-demonstration.mjs ]; then + node scripts/check-v42-gate7-ai-reading-demonstration.mjs --skip-branch-check --skip-package-tests --skip-demonstration-tests + fi fi else echo "Unexpected BITCODE_SPEC.txt pointer: $POINTER" >&2 diff --git a/.github/workflows/bitcode-gate-quality.yml b/.github/workflows/bitcode-gate-quality.yml index 1ebd2c12..437a0f78 100644 --- a/.github/workflows/bitcode-gate-quality.yml +++ b/.github/workflows/bitcode-gate-quality.yml @@ -439,6 +439,9 @@ jobs: if [ -f scripts/check-v42-gate6-settlement-rights-delivery.mjs ]; then node scripts/check-v42-gate6-settlement-rights-delivery.mjs --skip-branch-check --skip-package-tests --skip-uapi-tests fi + if [ -f scripts/check-v42-gate7-ai-reading-demonstration.mjs ]; then + node scripts/check-v42-gate7-ai-reading-demonstration.mjs --skip-branch-check --skip-package-tests --skip-demonstration-tests + fi fi else echo "Unexpected BITCODE_SPEC.txt pointer: $POINTER" >&2 diff --git a/BITCODE_SPEC_V42.md b/BITCODE_SPEC_V42.md index 81be977c..8bb252ef 100644 --- a/BITCODE_SPEC_V42.md +++ b/BITCODE_SPEC_V42.md @@ -157,6 +157,9 @@ Source-bearing AssetPack delivery remains withheld until payment, finality, BTD Gate 7 must update the standalone demonstration so it proves Bitcode's AI-reading value. The demonstration should show deposited non-public technical intelligence becoming an AssetPack that measurably improves an AI system's training, prompt/context, or evaluation performance beyond a public-data-only baseline. It must remain minimal, self-contained inside `protocol-demonstration/`, and independent from commercial product code. +Gate 7 is implemented by `.bitcode/v42-ai-reading-demonstration.json`. +The artifact binds the local public-data-only baseline, reviewed ReadNeed synthesis, local Depository Finding Fits, selected AssetPack preview, AssetPack-enhanced AI-reading answer, basis-point benchmark uplift, settlement-gated source-safety boundary, self-contained demonstration import boundary, demonstration tests, protocol tests, docs, package scripts, and workflow wiring. +The accepted proof is an AI-reading AssetPack improvement: public-only assistance scores below the AssetPack-enhanced result, selected deposit provenance is explicit, protected source remains withheld before settlement, and the demonstration can run locally without product runtime imports. ## V42 Gate 8 Local And Staging-Testnet Full MVP Rehearsal diff --git a/BITCODE_SPEC_V42_DELTA.md b/BITCODE_SPEC_V42_DELTA.md index f0e9c5a7..14d36df1 100644 --- a/BITCODE_SPEC_V42_DELTA.md +++ b/BITCODE_SPEC_V42_DELTA.md @@ -62,6 +62,7 @@ Gate 6 now binds settlement rights transfer through `AssetPackSettlementRightsDe ### Gate 7: AI-Reading Dominant Demonstration MVP Implement and prove the standalone demonstration where deposited technical intelligence improves an AI system beyond a public-data-only baseline. +Gate 7 now binds the local AI-reading demonstration runtime, public-data-only baseline, reviewed Need, local Depository fit selection, source-safe AssetPack preview, AssetPack-enhanced answer, deterministic basis-point uplift, settlement-gated source boundary, `.bitcode/v42-ai-reading-demonstration.json`, and `check:v42-gate7`. ### Gate 8: Local And Staging-Testnet Full MVP Rehearsal @@ -76,7 +77,7 @@ Bind every V42 product artifact, workflow, generated proof, promotion command, s - V43+ agentic deposit AssetPack option synthesis remains deferred. - `/terminal` is not split into `/read` and `/deposit` during V42. - `/exchange` is not renamed to `/packs` during V42. -- V43+ must take the route-vocabulary cleanup seriously: `/packs` replaces Exchange as the searchable master-detail activity route, while `/read` and `/deposit` become the short core paths for buying and selling AssetPacks. +- V43+ must take the route-vocabulary cleanup seriously: `/packs` replaces Exchange as the searchable master-detail activity route, including route names, component prefixes, tests, docs, and product vocabulary, while `/read` and `/deposit` become the short core paths for buying and selling AssetPacks. - Production-mainnet value-bearing operation remains blocked unless a later promoted canon explicitly admits it. - V42 Gate 1 does not change route behavior, pipeline behavior, settlement behavior, or demonstration behavior. diff --git a/BITCODE_SPEC_V42_NOTES.md b/BITCODE_SPEC_V42_NOTES.md index 27b6ba24..397e6668 100644 --- a/BITCODE_SPEC_V42_NOTES.md +++ b/BITCODE_SPEC_V42_NOTES.md @@ -81,6 +81,8 @@ Protected source, private settlement payloads, wallet private material, raw prot The standalone demonstration should prove why Bitcode matters for AI-dominant Reading. A deposited proprietary or otherwise non-public technical intelligence source should contribute to an AssetPack that measurably improves an AI system's training, prompt/context, or evaluation result beyond what a public-data-only baseline can do. The demonstration must remain minimal, local, deterministic where feasible, and self-contained inside `protocol-demonstration/`. +Gate 7 records that proof as a public-data-only baseline, a reviewed local Need, a local Depository Finding Fits step, a selected AssetPack preview, an AssetPack-enhanced AI-reading answer, and deterministic benchmark uplift. +The demonstration proves value without weakening the settlement-gated visibility boundary: protected source is still withheld until settlement, and the demonstration remains independent from product runtime imports. ## V43+ agentic depositing roadmap note @@ -93,7 +95,7 @@ The `/packs` master view should support column sorting, filtering, and search ov The detail view should expose the selected activity's source-safe data, proof roots, telemetry, ledger/database synchronization, and expandable payloads without replacing the short default path. Outside public documentation, product UX should avoid self-referential explanatory copy; route structure, concise labels, progressive detail, and proof-on-expand must make Depositing, Reading, and Pack activity self-explanatory. The current transitional Terminal/Exchange UX remains too dense for the final MVP posture. -V43+ should explicitly own the broad UX cleanup: remove Exchange naming from route and component vocabulary in favor of Packs, split Terminal into `/read` and `/deposit`, keep `/packs` as searchable master-detail activity, and use rich themed reusable components without relying on in-product explanatory copy to compensate for unclear flows. +V43+ route vocabulary must remove Exchange naming from route and component prefixes in favor of Packs, split Terminal into `/read` and `/deposit`, keep `/packs` as searchable master-detail activity, and use rich themed reusable components without relying on in-product explanatory copy to compensate for unclear flows. ## Concise current-system reading diff --git a/BITCODE_SPEC_V42_PARITY_MATRIX.md b/BITCODE_SPEC_V42_PARITY_MATRIX.md index 174f9176..80cd106d 100644 --- a/BITCODE_SPEC_V42_PARITY_MATRIX.md +++ b/BITCODE_SPEC_V42_PARITY_MATRIX.md @@ -38,7 +38,7 @@ This matrix records the reliable MVP product surfaces that must become promotion | ReadNeed product closure | Need synthesis, review, feedback, resynthesis, accepted-Need admission, rejected Need blockers, source-safe telemetry, and Terminal runtime readback are product-ready | `.bitcode/v42-readneed-review-resynthesis-product-closure.json`, `ReadNeedReviewResynthesisRuntime`, `/api/read-review`, Terminal Need runtime readback | implemented | | Finding Fits preview and quote | Many-candidate search, selected-fit provenance, source-safe preview, and quote are product-ready | `.bitcode/v42-readfitsfinding-preview-quote.json`, `ReadFitsFindingRuntime`, `AssetPackPreviewBoundary`, harness preview summary, Terminal preview/quote/provenance readback | implemented | | Settlement and delivery | BTC/BTD settlement, rights transfer, compensation, and repository PR delivery are synchronized | `.bitcode/v42-settlement-rights-delivery.json`, `AssetPackSettlementRightsDeliveryBoundary`, live harness settlement boundary, route summary, Terminal settlement readback | implemented | -| AI-reading demonstration | Standalone demonstration proves AssetPack improves AI beyond public-data-only baseline | later V42 Gate 7 artifact | draft-required | +| AI-reading demonstration | Standalone demonstration proves AssetPack improves AI beyond public-data-only baseline | `.bitcode/v42-ai-reading-demonstration.json`, `protocol-demonstration/src/ai-reading-demonstration.js`, `test:v42-ai-reading-mvp` | implemented | | Local/staging rehearsal | Full MVP path rehearsed locally and in staging-testnet with mainnet blocked | later V42 Gate 8 artifact | draft-required | | Promotion readiness | V42 proof and workflow promotion ready | later V42 Gate 9 artifact | draft-required | @@ -52,7 +52,7 @@ This matrix records the reliable MVP product surfaces that must become promotion | Gate 4 | ReadNeed review and resynthesis product closure artifact | implemented | | Gate 5 | ReadFitsFinding AssetPack preview and quote closure artifact | implemented | | Gate 6 | Settlement rights transfer and repository delivery closure artifact | implemented | -| Gate 7 | AI-reading dominant demonstration MVP artifact | draft-required | +| Gate 7 | AI-reading dominant demonstration MVP artifact | implemented | | Gate 8 | Local and staging-testnet full MVP rehearsal artifact | draft-required | | Gate 9 | Promotion readiness artifact and workflow | draft-required | diff --git a/README.md b/README.md index 43f245fd..9a64b4dd 100644 --- a/README.md +++ b/README.md @@ -127,6 +127,14 @@ pull-request delivery only after paid readback agrees. Route summaries and Terminal detail remain source-safe metadata: unpaid AssetPack source, wallet private material, private settlement payloads, credentials, raw protected prompts, and raw provider responses are withheld. +V42 Gate 7 adds the AI-reading dominant demonstration MVP with +`protocol-demonstration/src/ai-reading-demonstration.js`, +`.bitcode/v42-ai-reading-demonstration.json`, and `check:v42-gate7`. +It compares a public-data-only AI remediation answer against an +AssetPack-enhanced answer after a reviewed local Need and local Finding Fits +step select the deposited runbook AssetPack. The benchmark uplift is +deterministic, the demonstration stays self-contained, and protected source +remains withheld before settlement. V43+ is roadmapped as the later agentic depositing evolution: repository agents synthesize deposit AssetPack options from connected enterprise code, Depository state, and Reading demand; enterprises approve or reject @@ -806,4 +814,5 @@ Demonstration verification: cd protocol-demonstration pnpm test:integration pnpm test:v28-mvp-qa +pnpm test:v42-ai-reading-mvp ``` diff --git a/SPECIFICATIONS_ROADMAP.md b/SPECIFICATIONS_ROADMAP.md index 173d0d2d..18fb8a46 100644 --- a/SPECIFICATIONS_ROADMAP.md +++ b/SPECIFICATIONS_ROADMAP.md @@ -5,8 +5,8 @@ - Current active canonical pointer: `BITCODE_SPEC.txt` -> `V41` - Current active canon: `BITCODE_SPEC_V41.md` - Current draft target: `BITCODE_SPEC_V42.md`. -- Current working gate: V42 Gate 6 Settlement Rights Transfer And Repository Delivery Closure. -- Next queued gate after V42 Gate 6: V42 Gate 7 AI-Reading Dominant Demonstration MVP. +- Current working gate: V42 Gate 7 AI-Reading Dominant Demonstration MVP. +- Next queued gate after V42 Gate 7: V42 Gate 8 Local And Staging-Testnet Full MVP Rehearsal. - Latest closed version: V41 Prompt And PromptPart Excellence, which promoted PromptPart and Prompt inventory, registry interpolation contracts, Reading prompt baselines, ReadNeedComprehensionSynthesis prompt hardening, ReadFitsFindingSynthesis prompt hardening, Conversation/tool/interface prompt rewrite, prompt benchmark telemetry, and V41 promotion readiness. - Recent V42 opening anchor: reliable MVP experience opens over promoted V41 with V42 SPEC, DELTA, NOTES, and PARITY files, `check:v42-gate1`, active V41 / draft V42 posture, and a nine-gate plan for shortest-path Depositing, five-step Reading, ReadNeed product closure, ReadFitsFinding preview and quote closure, settlement and repository delivery, AI-reading demonstration, local/staging rehearsal, and promotion readiness. - V42 Gate 2 closure anchor: reliable MVP experience now owns source-safe Depositing compensation visibility through `DepositorySupplyCompensationPreview`, deposit route `depositoryEvidence.compensationPreview`, deterministic `.bitcode/v42-depositing-shortest-path.json`, route/API readiness checks, source validation, Depository search/vector/storage projection, source-to-shares compensation readback keys, Terminal compensation roots, focused package/protocol tests, workflow wiring, and `check:v42-gate2`. @@ -14,6 +14,7 @@ - V42 Gate 4 closure anchor: reliable MVP experience now owns ReadNeed product closure through `ReadNeedReviewResynthesisRuntime`, source-safe storage projection, reviewed Need feedback/resynthesis lineage, accepted-Need Finding Fits admission, rejected Need blockers, PTRR/Failsafe/Thricified telemetry receipts, Terminal Need runtime/storage/telemetry readback, deterministic `.bitcode/v42-readneed-review-resynthesis-product-closure.json`, focused package/route/protocol tests, workflow wiring, and `check:v42-gate4`. - V42 Gate 5 closure anchor: reliable MVP experience now owns ReadFitsFinding preview and quote closure through accepted-Need-gated `ReadFitsFindingRuntime`, many-channel Depository search, selected-fit provenance, `AssetPackPreviewBoundary`, deterministic share-to-fee quote receipts, disclosure review, settlement instructions, delivery lock, harness evidence summaries, Terminal preview/quote/provenance readback, deterministic `.bitcode/v42-readfitsfinding-preview-quote.json`, focused package/route/protocol tests, workflow wiring, and `check:v42-gate5`. - V42 Gate 6 closure anchor: reliable MVP experience now owns settlement rights transfer and repository delivery closure through `AssetPackSettlementRightsDeliveryBoundary`, BTC payment observation/finality, BTD read and rights transfer receipts, source-to-shares compensation conservation, delivery unlock, ledger/database/object-storage reconciliation, live harness materialization, route settlement summaries, Terminal settlement rights readback, deterministic `.bitcode/v42-settlement-rights-delivery.json`, focused package/host/route/protocol tests, workflow wiring, and `check:v42-gate6`. +- V42 Gate 7 closure anchor: reliable MVP experience now owns AI-reading demonstration proof through `protocol-demonstration/src/ai-reading-demonstration.js`, public-data-only baseline scoring, reviewed local ReadNeed synthesis, local Depository Finding Fits selection, source-safe AssetPack preview, AssetPack-enhanced AI-reading answer scoring, deterministic benchmark uplift, `.bitcode/v42-ai-reading-demonstration.json`, focused demonstration/protocol tests, workflow wiring, and `check:v42-gate7`. - Recent V41 closure anchor: V41 canonical promotion updated `BITCODE_SPEC.txt` to `V41`, generated `BITCODE_SPEC_V41_PROVEN.md`, preserved active V41 / draft V42 runtime posture, and closed prompt-program excellence canon. - Recent V40 closure anchor: V40 canonical promotion updated `BITCODE_SPEC.txt` to `V40`, generated `BITCODE_SPEC_V40_PROVEN.md`, preserved active V40 / draft V41 runtime posture, and closed exhaustive commercial application testing canon. - Recent V39 closure anchor: V39 canonical promotion updated `BITCODE_SPEC.txt` to `V39`, generated `BITCODE_SPEC_V39_PROVEN.md`, preserved active V39 / draft V40 runtime posture, and closed commercial Reading readiness canon. @@ -41,7 +42,7 @@ - V41 Gate 8 closure anchor: prompt-program work now owns package-backed `V41PromptProgramBenchmarkReport` source, deterministic `.bitcode/v41-prompt-program-benchmark-report.json`, 9 source-safe benchmark telemetry rows, post-rewrite PromptPart and Prompt deltas, benchmark fixture projections, prompt registry lineage, V38 PromptBenchmark/Failsafe/Thricified/inference telemetry roots, V39 operational repair readback roots, V40 prompt benchmark smoke roots, V41 Gate 2 through Gate 7 dependency roots, rich execution-log telemetry projections, repair hook and parsed-output redaction posture, protocol tests, workflow wiring, and `check:v41-gate8`. - V41 Gate 9 closure anchor: prompt-program work now owns package-backed `V41PromotionReadinessReport` source, deterministic `.bitcode/v41-promotion-readiness-report.json`, `BITCODE_SPEC_V41_PROVEN.md` generation support, `v41-canon-promotion.yml`, promotion command dry-run support, gate/canon workflow posture, active V41 / draft V42 runtime preparation, all V41 prompt-program artifacts covered, source-safe, parseable, and workflow-bound, and value-bearing mainnet admission blocked through `check:v41-gate9`. - Forward planning note: V42 focuses on the reliable MVP product experience after V41's prompt-program hardening. Depositing should become the shortest path to adding any source material, proving its Depository admission, and later receiving BTC compensation when that deposit contributes to a synthesized AssetPack. Reading should become the shortest path to submitting a Read Request, reviewing or resynthesizing Bitcode's synthesized Need, requesting Finding Fits, reviewing source-safe AssetPack measurements and preview metadata, buying the AssetPack through BTD/BTC settlement semantics, and receiving post-settlement repository delivery. The demonstration should be AI-reading dominant: any deposit source can contribute proprietary or otherwise non-public training, prompt, context, or evaluation material to an AssetPack that measurably improves an AI system beyond a public-data-only baseline. -- Forward planning note: V43+ should evolve the deposit side into an agentic AssetPack option experience for enterprises that own connected codebases. Bitcode Agents installed on an enterprise repository should compare the repository, the current Bitcode Depository, and current Reading activity to propose deposit AssetPack options: unminted AssetPacks in all but BTD that can later become BTD only when a Reader's industrial Need-Fit mints one. The deposit pipeline should optimize for enterprise IP governance by filtering out critical IP, estimating whether selling would be positive ROI against development cost and expected Read demand, and presenting everything else as approve/reject deposit options. The product route plan for that version is to split `/terminal` into `/read` for Reading and `/deposit` for agentic deposit AssetPack option review, and to rename `/exchange` to `/packs` across routes, code names, and docs. +- Forward planning note: V43+ should evolve the deposit side into an agentic AssetPack option experience for enterprises that own connected codebases. Bitcode Agents installed on an enterprise repository should compare the repository, the current Bitcode Depository, and current Reading activity to propose deposit AssetPack options: unminted AssetPacks in all but BTD that can later become BTD only when a Reader's industrial Need-Fit mints one. The deposit pipeline should optimize for enterprise IP governance by filtering out critical IP, estimating whether selling would be positive ROI against development cost and expected Read demand, and presenting everything else as approve/reject deposit options. The product route plan for that version is to split `/terminal` into `/read` for Reading and `/deposit` for agentic deposit AssetPack option review, and to rename `/exchange` to `/packs` across routes, component prefixes, tests, docs, and product vocabulary. - Forward planning note: V43+ should treat AssetPacks as the in/out simplification for the product. Depositing turns connected source plus depositor instructions plus Bitcode's observed Needs into deposit AssetPack options for approval; Reading turns an accepted Need plus many fitted Depository AssetPacks into a source-safe preview, quote, settlement, rights transfer, and repository delivery. `/packs` should replace Exchange naming as the master-detail activity route: the master view is a searchable, sortable, filterable table over activity, synthesized AssetPack titles/descriptions, measurements, values, transaction types, settlement posture, and compensation state; the detail view shows the selected activity with expandable proof, ledger, telemetry, and payload readback. Product surfaces outside public documentation should avoid self-referential explanatory copy and instead make the core actions self-evident through route structure, labels, progressive detail, and proof-on-expand. - V34 Gate 2 closure anchor: deployment-depth now owns package-backed `DeploymentHostCapabilityCatalog` and `EnvironmentLaneContract` source, deterministic `.bitcode/v34-deployment-host-capability-catalog.json` and `.bitcode/v34-environment-lane-contracts.json`, and visible `value-bearing-mainnet` blocking through `blocked_future_canon_required`. - V34 Gate 3 closure anchor: deployment-depth now owns package-backed `DistributedExecutionRuntimeReceipt` source, deterministic `.bitcode/v34-distributed-execution-runtime-receipts.json`, `request_response_not_required` long-running work posture, and source-safe roots for pipeline, PTRR agent, ThricifiedGeneration, tool, ledger, wallet, proof, object-storage, and repair work. diff --git a/package.json b/package.json index 0036a41c..5252b5e3 100644 --- a/package.json +++ b/package.json @@ -319,6 +319,9 @@ "generate:v42-settlement-rights-delivery": "node scripts/generate-v42-settlement-rights-delivery.mjs", "check:v42-settlement-rights-delivery": "node scripts/generate-v42-settlement-rights-delivery.mjs --check", "check:v42-gate6": "node scripts/check-v42-gate6-settlement-rights-delivery.mjs", + "generate:v42-ai-reading-demonstration": "node scripts/generate-v42-ai-reading-demonstration.mjs", + "check:v42-ai-reading-demonstration": "node scripts/generate-v42-ai-reading-demonstration.mjs --check", + "check:v42-gate7": "node scripts/check-v42-gate7-ai-reading-demonstration.mjs", "generate:v38-inference-surface-inventory": "node scripts/generate-v38-inference-surface-inventory.mjs", "check:v38-inference-surface-inventory": "node scripts/generate-v38-inference-surface-inventory.mjs --check", "check:v38-gate2": "node scripts/check-v38-gate2-inference-surface-inventory.mjs", diff --git a/packages/protocol/README.md b/packages/protocol/README.md index d56d8f35..d50d90c3 100644 --- a/packages/protocol/README.md +++ b/packages/protocol/README.md @@ -60,6 +60,7 @@ Current exported commercial helpers include: - `V41ReadingPromptBenchmarkBaselines` helpers for V41 source-safe Reading prompt baseline rows across `ReadNeedComprehensionSynthesis`, `ReadFitsFindingSynthesis`, all five Reading UX steps, V38 benchmark fixtures, Gate 2 inventory roots, Gate 3 registry/interpolation roots, parser targets, deterministic scores, and source-safe disclosure tiers; - `V41PromotionReadinessReport` helpers for V41 source-safe prompt-program promotion readiness across all V41 prompt artifacts, generated proof support, workflow posture, promotion dry-run support, and active V41 / draft V42 runtime preparation; - `V42SettlementRightsDelivery` helpers for V42 source-safe BTC payment observation, finality gating, source-to-shares compensation, BTD read-right transfer, repository delivery unlock, ledger/database/object-storage reconciliation, Terminal readback, and source-safe paid-boundary proof; +- `V42AiReadingDemonstration` helpers for V42 source-safe AI-reading demonstration proof: public-data-only baseline, reviewed local Need, local Finding Fits, source-safe AssetPack preview, AssetPack-enhanced AI answer, deterministic benchmark uplift, self-contained demonstration boundary, and workflow wiring; - canonical proven-generation helpers; - the package app/server context used by commercial interfaces. @@ -235,6 +236,17 @@ posture, harness route summaries, Terminal settlement readback, and workflow proof wiring without serializing protected source, unpaid AssetPack source, wallet private material, private settlement payloads, credentials, raw protected prompts, or raw provider responses. +V42 Gate 7 adds `V42AiReadingDemonstration` through +`packages/protocol/src/canonical/v42-ai-reading-demonstration.js`, +`packages/protocol/test/v42-ai-reading-demonstration.test.js`, +`.bitcode/v42-ai-reading-demonstration.json`, +`generate:v42-ai-reading-demonstration`, +`check:v42-ai-reading-demonstration`, and `check:v42-gate7`. +The artifact is source-safe metadata only and covers the self-contained +`protocol-demonstration/` AI-reading loop: public-data-only baseline, reviewed +local Need, local Depository fit selection, AssetPack preview, AssetPack- +enhanced answer, deterministic benchmark uplift, settlement-gated source +visibility, and workflow proof wiring. V40 Gate 2 adds `V40TestInventoryCoverageMatrix` through `packages/protocol/src/canonical/v40-test-inventory-coverage-matrix.js`, `packages/protocol/test/v40-test-inventory-coverage-matrix.test.js`, diff --git a/packages/protocol/src/canonical/v42-ai-reading-demonstration.js b/packages/protocol/src/canonical/v42-ai-reading-demonstration.js new file mode 100644 index 00000000..921737dd --- /dev/null +++ b/packages/protocol/src/canonical/v42-ai-reading-demonstration.js @@ -0,0 +1,248 @@ +// @ts-check + +import crypto from 'node:crypto'; +import { existsSync, readFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const DEFAULT_REPO_ROOT = path.resolve(__dirname, '..', '..', '..', '..'); + +export const V42_AI_READING_DEMONSTRATION_ARTIFACT_PATH = + '.bitcode/v42-ai-reading-demonstration.json'; +export const V42_AI_READING_DEMONSTRATION_SCHEMA_ID = + 'bitcode.v42.aiReadingDemonstration.v1'; +export const V42_AI_READING_DEMONSTRATION_VERSION = 'V42'; +export const V42_AI_READING_DEMONSTRATION_CURRENT_TARGET = 'V41'; +export const V42_AI_READING_DEMONSTRATION_SOURCE_SAFETY_VERDICT = + 'source-safe-v42-ai-reading-demonstration-metadata'; + +export const V42_AI_READING_DEMONSTRATION_ROW_IDS = Object.freeze([ + 'baseline:public-data-only-ai-reading', + 'need:source-bound-read-comprehension', + 'fits:local-depository-assetpack-selection', + 'assetpack:enhanced-ai-reading', + 'measurement:benchmark-uplift', + 'source-safety:settlement-gated-disclosure', + 'boundary:self-contained-demonstration', + 'proof:artifact-tests-workflows', +]); + +const SOURCE_ROOTS = Object.freeze({ + demoRuntime: 'protocol-demonstration/src/ai-reading-demonstration.js', + demoIndex: 'protocol-demonstration/src/index.js', + demoTypes: 'protocol-demonstration/src/index.d.ts', + demoTest: 'protocol-demonstration/test/v42-ai-reading-mvp.test.js', + demoPackage: 'protocol-demonstration/package.json', + demoReadme: 'protocol-demonstration/README.md', + localFitFinding: 'protocol-demonstration/src/local-fit-finding.js', + benchmarkModel: 'protocol-demonstration/src/benchmark-model.js', + boundaryTest: 'protocol-demonstration/test/v28-boundary-separation.test.js', + protocolCanonical: 'packages/protocol/src/canonical/v42-ai-reading-demonstration.js', + protocolTest: 'packages/protocol/test/v42-ai-reading-demonstration.test.js', + protocolIndex: 'packages/protocol/src/index.js', + protocolTypes: 'packages/protocol/src/index.d.ts', + protocolReadme: 'packages/protocol/README.md', + generateScript: 'scripts/generate-v42-ai-reading-demonstration.mjs', + checkScript: 'scripts/check-v42-gate7-ai-reading-demonstration.mjs', + packageJson: 'package.json', + gateWorkflow: '.github/workflows/bitcode-gate-quality.yml', + canonWorkflow: '.github/workflows/bitcode-canon-quality.yml', + rootReadme: 'README.md', + v42Spec: 'BITCODE_SPEC_V42.md', + v42Delta: 'BITCODE_SPEC_V42_DELTA.md', + v42Notes: 'BITCODE_SPEC_V42_NOTES.md', + v42Parity: 'BITCODE_SPEC_V42_PARITY_MATRIX.md', + roadmap: 'SPECIFICATIONS_ROADMAP.md', +}); + +const FORBIDDEN_PAYLOAD_CLASSES = Object.freeze([ + 'protected-source-payloads', + 'raw-protected-prompts', + 'raw-provider-responses', + 'unpaid-assetpack-source', + 'secret-values', + 'outside-runtime-imports', +]); + +function digest(value) { + return crypto.createHash('sha256').update(value).digest('hex').slice(0, 24); +} + +function rowRoot(id) { + return `v42-ai-reading-demonstration-row:${digest(id)}`; +} + +function readSource(repoRoot, sourcePath) { + const absolutePath = path.join(repoRoot, sourcePath); + return existsSync(absolutePath) ? readFileSync(absolutePath, 'utf8') : ''; +} + +function predicateResult(id, sourcePath, passed) { + return { id, sourcePath, passed: Boolean(passed) }; +} + +function row(input) { + return { + ...input, + rowRoot: rowRoot(input.rowId), + sourceSafetyClass: 'source_safe_v42_ai_reading_demonstration_metadata', + sourceSafeMetadataOnly: true, + protectedSourcePayloadSerialized: false, + rawProtectedPromptVisible: false, + rawProviderResponseVisible: false, + unpaidAssetPackSourceVisible: false, + outsideRuntimeImportRequired: false, + forbiddenPayloadClasses: [...FORBIDDEN_PAYLOAD_CLASSES], + }; +} + +export const V42_AI_READING_DEMONSTRATION_ROWS = Object.freeze([ + row({ + rowId: 'baseline:public-data-only-ai-reading', + purpose: + 'Represent the public-data-only AI answer as the baseline before any AssetPack knowledge is available.', + sourceRoots: [SOURCE_ROOTS.demoRuntime, SOURCE_ROOTS.demoTest], + emittedTypes: ['publicDataOnlyBaseline', 'scoreAssistantResponse'], + requiredEvidence: ['public-data-only', 'missingTerms', 'scoreBp'], + }), + row({ + rowId: 'need:source-bound-read-comprehension', + purpose: + 'Reuse the local ReadNeed synthesis loop so the demonstration starts from a reviewed source-bound Need.', + sourceRoots: [SOURCE_ROOTS.demoRuntime, SOURCE_ROOTS.localFitFinding, SOURCE_ROOTS.demoTest], + emittedTypes: ['readNeed', 'synthesizeReadNeedLocally', 'acceptReadNeedLocally'], + requiredEvidence: ['Acquire an AssetPack', 'needs_acceptance', 'accepted'], + }), + row({ + rowId: 'fits:local-depository-assetpack-selection', + purpose: + 'Find the deposited AssetPack candidate locally, rank it, and preserve proof roots without importing product code.', + sourceRoots: [SOURCE_ROOTS.demoRuntime, SOURCE_ROOTS.localFitFinding, SOURCE_ROOTS.demoTest], + emittedTypes: ['findNeedFitLocally', 'selectedDepositIds', 'rankingRoot'], + requiredEvidence: ['deposit-auth-migration-runbook', 'worthy_fit', 'queryRoot'], + }), + row({ + rowId: 'assetpack:enhanced-ai-reading', + purpose: + 'Apply the selected AssetPack knowledge to the AI answer after rights are available, while pre-settlement source remains withheld.', + sourceRoots: [SOURCE_ROOTS.demoRuntime, SOURCE_ROOTS.demoTest], + emittedTypes: ['assetPackEnhancedReading', 'assetPackPreview', 'sourceSafety'], + requiredEvidence: ['assetpack-enhanced-after-rights', 'withheld_until_settlement', 'sourceBearingDeliveryRequiresSettlement'], + }), + row({ + rowId: 'measurement:benchmark-uplift', + purpose: + 'Measure basis-point improvement between public baseline and AssetPack-enhanced reading.', + sourceRoots: [SOURCE_ROOTS.demoRuntime, SOURCE_ROOTS.benchmarkModel, SOURCE_ROOTS.demoTest], + emittedTypes: ['benchmark', 'improvement', 'buildBenchmarkComparison'], + requiredEvidence: ['minimumUpliftBp', 'upliftBp', 'treatmentBp'], + }), + row({ + rowId: 'source-safety:settlement-gated-disclosure', + purpose: + 'Keep protected source and unpaid AssetPack source out of the demonstration result and preview.', + sourceRoots: [SOURCE_ROOTS.demoRuntime, SOURCE_ROOTS.demoTest, SOURCE_ROOTS.boundaryTest], + emittedTypes: ['sourceSafety', 'assetPackPreview'], + requiredEvidence: ['protectedSourceBeforeSettlement', 'publicBaselineUsesDepositorySource: false', 'v28-boundary-separation'], + }), + row({ + rowId: 'boundary:self-contained-demonstration', + purpose: + 'Maintain the demonstration as self-contained code with no product runtime imports.', + sourceRoots: [SOURCE_ROOTS.demoRuntime, SOURCE_ROOTS.demoIndex, SOURCE_ROOTS.demoPackage, SOURCE_ROOTS.boundaryTest], + emittedTypes: ['runAiReadingDominantDemonstration', 'buildAiReadingDemonstrationInput'], + requiredEvidence: ['outsideSourceImportsAllowed: false', 'test:v42-ai-reading-mvp', 'does not import outside source'], + }), + row({ + rowId: 'proof:artifact-tests-workflows', + purpose: + 'Bind V42 Gate 7 closure to generated artifact, protocol test, demonstration test, docs, package scripts, and workflows.', + sourceRoots: [SOURCE_ROOTS.protocolTest, SOURCE_ROOTS.packageJson, SOURCE_ROOTS.gateWorkflow, SOURCE_ROOTS.canonWorkflow], + emittedTypes: ['V42AiReadingDemonstration'], + requiredEvidence: ['v42-ai-reading-demonstration', 'check-v42-gate7-ai-reading-demonstration.mjs'], + }), +]); + +function buildPredicateResults(repoRoot) { + const sources = Object.fromEntries( + Object.entries(SOURCE_ROOTS).map(([key, sourcePath]) => [key, readSource(repoRoot, sourcePath)]), + ); + + return [ + predicateResult('demo-runtime-builds-input', SOURCE_ROOTS.demoRuntime, sources.demoRuntime.includes('buildAiReadingDemonstrationInput') && sources.demoRuntime.includes('AI_READING_DEPOSIT')), + predicateResult('demo-runtime-runs-fit-search', SOURCE_ROOTS.demoRuntime, sources.demoRuntime.includes('synthesizeReadNeedLocally') && sources.demoRuntime.includes('findNeedFitLocally') && sources.demoRuntime.includes('selectedDepositIds')), + predicateResult('demo-runtime-measures-uplift', SOURCE_ROOTS.demoRuntime, sources.demoRuntime.includes('buildBenchmarkComparison') && sources.demoRuntime.includes('MINIMUM_UPLIFT_BP') && sources.demoRuntime.includes('improvement')), + predicateResult('demo-runtime-source-safe', SOURCE_ROOTS.demoRuntime, sources.demoRuntime.includes('withheld_until_settlement') && sources.demoRuntime.includes('outsideSourceImportsAllowed: false')), + predicateResult('demo-index-exports-runtime', SOURCE_ROOTS.demoIndex, sources.demoIndex.includes('runAiReadingDominantDemonstration') && sources.demoTypes.includes('runAiReadingDominantDemonstration')), + predicateResult('demo-test-proves-uplift', SOURCE_ROOTS.demoTest, sources.demoTest.includes('AssetPack lift over public data baseline') && sources.demoTest.includes('scoreBp, 10000') && sources.demoTest.includes('publicDataOnlyBaseline.score.scoreBp, 0')), + predicateResult('demo-test-proves-determinism', SOURCE_ROOTS.demoTest, sources.demoTest.includes('self-contained and deterministic') && sources.demoTest.includes('deepEqual(first.proof, second.proof)')), + predicateResult('demo-boundary-test-retained', SOURCE_ROOTS.boundaryTest, sources.boundaryTest.includes('does not import outside source') && sources.boundaryTest.includes('protocol-demonstration')), + predicateResult('demo-package-script-wired', SOURCE_ROOTS.demoPackage, sources.demoPackage.includes('test:v42-ai-reading-mvp') && sources.demoPackage.includes('v42-ai-reading-mvp.test.js')), + predicateResult('protocol-test-wired', SOURCE_ROOTS.protocolTest, sources.protocolTest.includes('buildV42AiReadingDemonstration') && sources.protocolTest.includes('rowCount, 8')), + predicateResult('protocol-export-wired', SOURCE_ROOTS.protocolIndex, sources.protocolIndex.includes('buildV42AiReadingDemonstration') && sources.protocolTypes.includes('buildV42AiReadingDemonstration')), + predicateResult('package-scripts-wired', SOURCE_ROOTS.packageJson, sources.packageJson.includes('generate:v42-ai-reading-demonstration') && sources.packageJson.includes('check:v42-gate7')), + predicateResult('workflows-run-gate7', SOURCE_ROOTS.gateWorkflow, sources.gateWorkflow.includes('check-v42-gate7-ai-reading-demonstration.mjs') && sources.canonWorkflow.includes('check-v42-gate7-ai-reading-demonstration.mjs')), + predicateResult('v42-docs-expanded', SOURCE_ROOTS.v42Spec, sources.v42Spec.includes('V42 Gate 7') && sources.v42Spec.includes('AI-reading AssetPack improvement')), + predicateResult('v42-delta-expanded', SOURCE_ROOTS.v42Delta, sources.v42Delta.includes('Gate 7 now binds') && sources.v42Delta.includes('public-data-only baseline')), + predicateResult('v42-notes-expanded', SOURCE_ROOTS.v42Notes, sources.v42Notes.includes('Gate 7 records') && sources.v42Notes.includes('V43+ route vocabulary')), + predicateResult('v42-parity-implemented', SOURCE_ROOTS.v42Parity, sources.v42Parity.includes('AI-reading demonstration') && sources.v42Parity.includes('implemented')), + predicateResult('roadmap-advanced-to-gate7', SOURCE_ROOTS.roadmap, sources.roadmap.includes('Current working gate: V42 Gate 7') && sources.roadmap.includes('V42 Gate 7 closure anchor')), + predicateResult('readmes-document-gate7', SOURCE_ROOTS.rootReadme, sources.rootReadme.includes('V42 Gate 7') && sources.demoReadme.includes('V42 AI-reading demonstration') && sources.protocolReadme.includes('V42AiReadingDemonstration')), + ]; +} + +function buildCoverage(rows, predicateResults) { + const failedPredicateIds = predicateResults.filter((predicate) => !predicate.passed).map((predicate) => predicate.id); + return { + rowCount: rows.length, + sourceSafetyVerdict: V42_AI_READING_DEMONSTRATION_SOURCE_SAFETY_VERDICT, + demonstrationRuntime: 'protocol-demonstration/src/ai-reading-demonstration.js', + demonstrationTest: 'protocol-demonstration/test/v42-ai-reading-mvp.test.js', + baselineMode: 'public-data-only', + enhancedMode: 'assetpack-enhanced-after-rights', + minimumUpliftBp: 2400, + expectedBaselineBp: 0, + expectedTreatmentBp: 10000, + expectedSelectedDepositId: 'deposit-auth-migration-runbook', + expectedFitResultState: 'worthy_fit', + protectedSourceBeforeSettlement: 'withheld_until_settlement', + sourceBearingDeliveryRequiresSettlement: true, + deterministicLocalOnly: true, + selfContainedDemonstration: true, + outsideRuntimeImportRequired: false, + sourceSafeMetadataOnly: true, + protectedSourcePayloadSerialized: false, + rawProtectedPromptVisible: false, + rawProviderResponseVisible: false, + unpaidAssetPackSourceVisible: false, + failedPredicateIds, + }; +} + +export function buildV42AiReadingDemonstration(input = {}) { + const repoRoot = input.repoRoot || DEFAULT_REPO_ROOT; + const predicateResults = buildPredicateResults(repoRoot); + const rows = [...V42_AI_READING_DEMONSTRATION_ROWS]; + const coverage = buildCoverage(rows, predicateResults); + const artifactRoot = `v42-ai-reading-demonstration:${digest(JSON.stringify({ + rowIds: V42_AI_READING_DEMONSTRATION_ROW_IDS, + predicateResults, + coverage, + }))}`; + + return { + artifactId: 'v42-ai-reading-demonstration', + schemaId: V42_AI_READING_DEMONSTRATION_SCHEMA_ID, + version: V42_AI_READING_DEMONSTRATION_VERSION, + currentTarget: V42_AI_READING_DEMONSTRATION_CURRENT_TARGET, + sourceSafetyVerdict: V42_AI_READING_DEMONSTRATION_SOURCE_SAFETY_VERDICT, + rowIds: [...V42_AI_READING_DEMONSTRATION_ROW_IDS], + rows, + predicateResults, + coverage, + passed: coverage.failedPredicateIds.length === 0, + artifactRoot, + }; +} diff --git a/packages/protocol/src/canonical/v42-settlement-rights-delivery.js b/packages/protocol/src/canonical/v42-settlement-rights-delivery.js index 4b621554..9e51c4c9 100644 --- a/packages/protocol/src/canonical/v42-settlement-rights-delivery.js +++ b/packages/protocol/src/canonical/v42-settlement-rights-delivery.js @@ -226,7 +226,7 @@ function buildPredicateResults(repoRoot) { predicateResult('v42-delta-expanded', SOURCE_ROOTS.v42Delta, sources.v42Delta.includes('Gate 6') && sources.v42Delta.includes('settlement rights transfer')), predicateResult('v42-notes-expanded', SOURCE_ROOTS.v42Notes, sources.v42Notes.includes('Gate 6') && sources.v42Notes.includes('source-to-shares compensation')), predicateResult('v42-parity-implemented', SOURCE_ROOTS.v42Parity, sources.v42Parity.includes('Settlement and delivery') && sources.v42Parity.includes('implemented')), - predicateResult('roadmap-advanced-to-gate6', SOURCE_ROOTS.roadmap, sources.roadmap.includes('Current working gate: V42 Gate 6') && sources.roadmap.includes('V42 Gate 6 closure anchor')), + predicateResult('roadmap-records-gate6-closure', SOURCE_ROOTS.roadmap, sources.roadmap.includes('V42 Gate 6 closure anchor') && sources.roadmap.includes('check:v42-gate6')), predicateResult('readmes-document-gate6', SOURCE_ROOTS.rootReadme, sources.rootReadme.includes('V42 Gate 6') && sources.assetPackReadme.includes('Settlement Rights Delivery') && sources.protocolReadme.includes('V42SettlementRightsDelivery') && sources.terminalReadme.includes('Settlement rights')), predicateResult('protocol-exports-gate6', SOURCE_ROOTS.protocolIndex, sources.protocolIndex.includes('buildV42SettlementRightsDelivery') && sources.protocolTypes.includes('buildV42SettlementRightsDelivery')), predicateResult('package-scripts-wire-gate6', SOURCE_ROOTS.packageJson, sources.packageJson.includes('generate:v42-settlement-rights-delivery') && sources.packageJson.includes('check:v42-gate6')), diff --git a/packages/protocol/src/index.d.ts b/packages/protocol/src/index.d.ts index 57bfdf07..1e9900b1 100644 --- a/packages/protocol/src/index.d.ts +++ b/packages/protocol/src/index.d.ts @@ -554,6 +554,14 @@ export const V42_SETTLEMENT_RIGHTS_DELIVERY_SOURCE_SAFETY_VERDICT: string; export const V42_SETTLEMENT_RIGHTS_DELIVERY_ROW_IDS: readonly string[]; export const V42_SETTLEMENT_RIGHTS_DELIVERY_ROWS: readonly Record[]; export function buildV42SettlementRightsDelivery(input?: Record): BitcodeProtocolReport; +export const V42_AI_READING_DEMONSTRATION_ARTIFACT_PATH: string; +export const V42_AI_READING_DEMONSTRATION_CURRENT_TARGET: string; +export const V42_AI_READING_DEMONSTRATION_SCHEMA_ID: string; +export const V42_AI_READING_DEMONSTRATION_VERSION: string; +export const V42_AI_READING_DEMONSTRATION_SOURCE_SAFETY_VERDICT: string; +export const V42_AI_READING_DEMONSTRATION_ROW_IDS: readonly string[]; +export const V42_AI_READING_DEMONSTRATION_ROWS: readonly Record[]; +export function buildV42AiReadingDemonstration(input?: Record): BitcodeProtocolReport; export const EXCHANGE_INTENT_ORDER_CONTRACTS_ARTIFACT_PATH: string; export const EXCHANGE_INTENT_ORDER_CONTRACTS_CURRENT_TARGET: string; export const EXCHANGE_INTENT_ORDER_CONTRACTS_SCHEMA_ID: string; diff --git a/packages/protocol/src/index.js b/packages/protocol/src/index.js index 1669b4e7..77478804 100644 --- a/packages/protocol/src/index.js +++ b/packages/protocol/src/index.js @@ -622,6 +622,16 @@ export { V42_SETTLEMENT_RIGHTS_DELIVERY_VERSION, buildV42SettlementRightsDelivery } from './canonical/v42-settlement-rights-delivery.js'; +export { + V42_AI_READING_DEMONSTRATION_ARTIFACT_PATH, + V42_AI_READING_DEMONSTRATION_CURRENT_TARGET, + V42_AI_READING_DEMONSTRATION_ROW_IDS, + V42_AI_READING_DEMONSTRATION_ROWS, + V42_AI_READING_DEMONSTRATION_SCHEMA_ID, + V42_AI_READING_DEMONSTRATION_SOURCE_SAFETY_VERDICT, + V42_AI_READING_DEMONSTRATION_VERSION, + buildV42AiReadingDemonstration +} from './canonical/v42-ai-reading-demonstration.js'; export { EXCHANGE_INTENT_ACTION_KINDS, EXCHANGE_INTENT_ORDER_CONTRACTS_ARTIFACT_PATH, diff --git a/packages/protocol/test/v42-ai-reading-demonstration.test.js b/packages/protocol/test/v42-ai-reading-demonstration.test.js new file mode 100644 index 00000000..aa7e0715 --- /dev/null +++ b/packages/protocol/test/v42-ai-reading-demonstration.test.js @@ -0,0 +1,42 @@ +import assert from 'node:assert/strict'; +import test from 'node:test'; + +import { + V42_AI_READING_DEMONSTRATION_ARTIFACT_PATH, + V42_AI_READING_DEMONSTRATION_ROW_IDS, + V42_AI_READING_DEMONSTRATION_SCHEMA_ID, + buildV42AiReadingDemonstration, +} from '../src/canonical/v42-ai-reading-demonstration.js'; + +test('V42 AI-reading demonstration artifact is source-safe and complete', () => { + const artifact = buildV42AiReadingDemonstration(); + + assert.equal(V42_AI_READING_DEMONSTRATION_ARTIFACT_PATH, '.bitcode/v42-ai-reading-demonstration.json'); + assert.equal(artifact.artifactId, 'v42-ai-reading-demonstration'); + assert.equal(artifact.schemaId, V42_AI_READING_DEMONSTRATION_SCHEMA_ID); + assert.equal(artifact.version, 'V42'); + assert.equal(artifact.currentTarget, 'V41'); + assert.deepEqual(artifact.rowIds, [...V42_AI_READING_DEMONSTRATION_ROW_IDS]); + assert.equal(artifact.coverage.rowCount, 8); + assert.equal(artifact.coverage.baselineMode, 'public-data-only'); + assert.equal(artifact.coverage.enhancedMode, 'assetpack-enhanced-after-rights'); + assert.equal(artifact.coverage.expectedBaselineBp, 0); + assert.equal(artifact.coverage.expectedTreatmentBp, 10000); + assert.equal(artifact.coverage.minimumUpliftBp, 2400); + assert.equal(artifact.coverage.expectedSelectedDepositId, 'deposit-auth-migration-runbook'); + assert.equal(artifact.coverage.expectedFitResultState, 'worthy_fit'); + assert.equal(artifact.coverage.protectedSourceBeforeSettlement, 'withheld_until_settlement'); + assert.equal(artifact.coverage.sourceBearingDeliveryRequiresSettlement, true); + assert.equal(artifact.coverage.deterministicLocalOnly, true); + assert.equal(artifact.coverage.selfContainedDemonstration, true); + assert.equal(artifact.coverage.outsideRuntimeImportRequired, false); + assert.equal(artifact.coverage.sourceSafeMetadataOnly, true); + assert.equal(artifact.coverage.protectedSourcePayloadSerialized, false); + assert.equal(artifact.coverage.rawProtectedPromptVisible, false); + assert.equal(artifact.coverage.rawProviderResponseVisible, false); + assert.equal(artifact.coverage.unpaidAssetPackSourceVisible, false); + assert.deepEqual(artifact.coverage.failedPredicateIds, []); + assert.equal(artifact.passed, true); + assert.match(artifact.artifactRoot, /^v42-ai-reading-demonstration:/u); +}); + diff --git a/protocol-demonstration/README.md b/protocol-demonstration/README.md index 87fa3456..bdc2a886 100644 --- a/protocol-demonstration/README.md +++ b/protocol-demonstration/README.md @@ -32,6 +32,10 @@ those surfaces own their own implementations outside this package. - `src/local-fit-finding.js`: standalone local Need/Need-Fit witness. It deliberately avoids pipeline, registry, prompt, agent, Vercel, Supabase, and UAPI imports. +- `src/ai-reading-demonstration.js`: V42 AI-reading demonstration MVP. It + compares a public-data-only AI answer with an AssetPack-enhanced answer after + local Need synthesis and local Finding Fits, then emits deterministic + benchmark uplift and source-safe proof roots. - `src/canonical/proven-generator.js`: generated proof and checkpoint appendix builder. - `public/app.js`: standalone demonstration behavior. - `public/index.html`: direct demonstration shell for local validation and parity checks. @@ -71,8 +75,27 @@ npm test pnpm test:fit-finding pnpm test:integration pnpm test:v28-mvp-qa +pnpm test:v42-ai-reading-mvp ``` +## V42 AI-reading demonstration + +The V42 AI-reading demonstration proves the shortest local reason Bitcode +matters for AI-dominant Reading: a deposited runbook AssetPack improves an AI +incident assistant beyond a public-data-only baseline. + +The loop is intentionally minimal and local: + +1. synthesize and accept a ReadNeed from a source-bound Read; +2. rank the local Depository and select `deposit-auth-migration-runbook`; +3. expose only source-safe AssetPack preview metadata before settlement; +4. compare the public-data-only answer with the AssetPack-enhanced answer; +5. record deterministic basis-point uplift, query root, ranking root, and + AssetPack proof root. + +The demonstration remains self-contained and does not import product runtime +code. + ## Required Doc Companions - [../README.md](../README.md) diff --git a/protocol-demonstration/package.json b/protocol-demonstration/package.json index 02a66180..744a2502 100644 --- a/protocol-demonstration/package.json +++ b/protocol-demonstration/package.json @@ -32,7 +32,8 @@ "test:v22-canon-drift": "node --test --test-force-exit test/v22-canon-drift.test.js", "test:v27-crypto": "node --test --test-force-exit test/v27-crypto-primitives.test.js", "test:fit-finding": "node --test --test-force-exit test/local-fit-finding.test.js", - "test:v28-mvp-qa": "node --test --test-force-exit test/v28-mvp-qa.test.js test/v28-boundary-separation.test.js test/local-fit-finding.test.js", + "test:v28-mvp-qa": "node --test --test-force-exit test/v28-mvp-qa.test.js test/v28-boundary-separation.test.js test/local-fit-finding.test.js test/v42-ai-reading-mvp.test.js", + "test:v42-ai-reading-mvp": "node --test --test-force-exit test/v42-ai-reading-mvp.test.js", "typecheck": "tsc -p tsconfig.typecheck.json" }, "devDependencies": { diff --git a/protocol-demonstration/src/ai-reading-demonstration.js b/protocol-demonstration/src/ai-reading-demonstration.js new file mode 100644 index 00000000..6601597b --- /dev/null +++ b/protocol-demonstration/src/ai-reading-demonstration.js @@ -0,0 +1,176 @@ +// @ts-check + +import { createHash } from 'node:crypto'; + +import { buildBenchmarkComparison } from './benchmark-model.js'; +import { + acceptReadNeedLocally, + findNeedFitLocally, + synthesizeReadNeedLocally, +} from './local-fit-finding.js'; + +const DEMONSTRATION_ID = 'v42-ai-reading-assetpack-improvement'; +const MINIMUM_UPLIFT_BP = 2400; + +const REQUIRED_REMEDIATION_TERMS = Object.freeze([ + 'issuer-mismatch', + 'jwks-cache', + 'session-invariant', + 'rollback-window', + 'audit-receipt', +]); + +const AI_READING_READ = Object.freeze({ + prompt: + 'Acquire an AssetPack that improves an AI incident assistant remediating an auth migration issuer mismatch while preserving sessions, rollback safety, and audit proof.', + repositoryFullName: 'engineeredsoftware/ENGI', + sourceBranch: 'main', + sourceCommit: 'ai-reading-source-commit', + targetArtifactKinds: [ + 'incident-remediation-runbook', + 'auth-migration-guardrail', + 'benchmark-improvement-evidence', + 'audit-proof-receipt', + ], + closureCriteria: [ + 'assistant identifies issuer mismatch before rollback', + 'assistant preserves session invariants while rotating JWKS cache', + 'assistant emits audit receipt steps before source-bearing delivery', + ], +}); + +const AI_READING_DEPOSIT = Object.freeze({ + depositId: 'deposit-auth-migration-runbook', + title: 'Auth migration incident runbook AssetPack deposit', + summary: + 'Non-public auth migration remediation knowledge for issuer mismatch, JWKS cache rotation, session invariants, rollback windows, and audit receipts.', + repositoryFullName: 'engineeredsoftware/ENGI', + sourceBranch: 'main', + sourceCommit: 'ai-reading-source-commit', + artifactKinds: [ + 'incident-remediation-runbook', + 'auth-migration-guardrail', + 'benchmark-improvement-evidence', + 'audit-proof-receipt', + ], + contentUnits: [ + { + path: 'runbooks/auth-migration-issuer-mismatch.md', + text: + 'Private remediation notes: detect issuer-mismatch first, freeze rollback-window, rotate jwks-cache only after verifier compatibility, preserve session-invariant, then write audit-receipt.', + }, + ], + hasWalletOrAttestationProof: true, + hasAssetMeasurementEvidence: true, +}); + +function sha256(value) { + return createHash('sha256').update(String(value)).digest('hex'); +} + +function scoreAssistantResponse(response) { + const normalized = String(response || '').toLowerCase(); + const presentTerms = REQUIRED_REMEDIATION_TERMS.filter((term) => normalized.includes(term)); + const missingTerms = REQUIRED_REMEDIATION_TERMS.filter((term) => !normalized.includes(term)); + return { + scoreBp: Math.round((presentTerms.length / REQUIRED_REMEDIATION_TERMS.length) * 10000), + presentTerms, + missingTerms, + requiredTermCount: REQUIRED_REMEDIATION_TERMS.length, + }; +} + +function buildPublicDataOnlyResponse() { + return [ + 'Rollback the auth migration if login errors spike.', + 'Check token verifier settings and notify the incident channel.', + 'Retest login after the rollback completes.', + ].join(' '); +} + +function buildAssetPackEnhancedResponse(assetPack) { + const selectedDepositId = assetPack?.selectedDepositIds?.[0] || AI_READING_DEPOSIT.depositId; + return [ + `Use ${selectedDepositId} to diagnose issuer-mismatch before rollback.`, + 'Preserve the session-invariant by keeping the previous verifier active through the rollback-window.', + 'Rotate jwks-cache only after compatibility has been confirmed.', + 'Emit an audit-receipt with proof roots before any source-bearing delivery is unlocked.', + ].join(' '); +} + +export function buildAiReadingDemonstrationInput() { + return { + demonstrationId: DEMONSTRATION_ID, + read: { ...AI_READING_READ }, + deposits: [{ ...AI_READING_DEPOSIT, contentUnits: [...AI_READING_DEPOSIT.contentUnits] }], + minimumUpliftBp: MINIMUM_UPLIFT_BP, + requiredRemediationTerms: [...REQUIRED_REMEDIATION_TERMS], + }; +} + +export function runAiReadingDominantDemonstration(input = buildAiReadingDemonstrationInput()) { + const readNeed = acceptReadNeedLocally(synthesizeReadNeedLocally({ read: input.read })); + const fitResult = findNeedFitLocally({ need: readNeed, deposits: input.deposits }); + const publicResponse = buildPublicDataOnlyResponse(); + const enhancedResponse = buildAssetPackEnhancedResponse(fitResult.assetPack); + const publicScore = scoreAssistantResponse(publicResponse); + const enhancedScore = scoreAssistantResponse(enhancedResponse); + const benchmark = buildBenchmarkComparison({ + bundleId: fitResult.assetPack?.assetPackId || 'asset-pack-not-synthesized', + benchmark: 'ai-reading-auth-migration-remediation', + baselineBp: publicScore.scoreBp, + treatmentBp: enhancedScore.scoreBp, + }); + const upliftBp = enhancedScore.scoreBp - publicScore.scoreBp; + const evidenceRoot = `sha256:${sha256(JSON.stringify({ + demonstrationId: input.demonstrationId, + needId: readNeed.needId, + resultState: fitResult.resultState, + selectedDepositIds: fitResult.selectedCandidates.map((candidate) => candidate.depositId), + publicScore, + enhancedScore, + upliftBp, + }))}`; + + return { + demonstrationId: input.demonstrationId, + scenario: 'ai-reading-assetpack-improves-remediation-assistant', + deterministicLocalOnly: true, + outsideSourceImportsAllowed: false, + readNeed, + fitResultState: fitResult.resultState, + selectedDepositIds: fitResult.selectedCandidates.map((candidate) => candidate.depositId), + assetPackPreview: fitResult.assetPack?.sourceSafePreview || null, + sourceSafety: { + protectedSourceBeforeSettlement: 'withheld_until_settlement', + publicBaselineUsesDepositorySource: false, + enhancedReaderUsesPurchasedAssetPack: fitResult.resultState === 'worthy_fit', + sourceBearingDeliveryRequiresSettlement: true, + }, + publicDataOnlyBaseline: { + mode: 'public-data-only', + answer: publicResponse, + score: publicScore, + }, + assetPackEnhancedReading: { + mode: 'assetpack-enhanced-after-rights', + answer: enhancedResponse, + score: enhancedScore, + selectedDepositIds: fitResult.selectedCandidates.map((candidate) => candidate.depositId), + }, + benchmark, + improvement: { + improved: upliftBp >= input.minimumUpliftBp, + upliftBp, + minimumUpliftBp: input.minimumUpliftBp, + }, + proof: { + evidenceRoot, + queryRoot: fitResult.queryRoot, + rankingRoot: fitResult.rankingRoot, + assetPackProofRoot: fitResult.assetPack?.proofRoot || null, + sourceSafePreviewStatus: fitResult.assetPack?.sourceSafePreview?.status || null, + }, + }; +} + diff --git a/protocol-demonstration/src/index.d.ts b/protocol-demonstration/src/index.d.ts index 7a78d4b0..5911e97d 100644 --- a/protocol-demonstration/src/index.d.ts +++ b/protocol-demonstration/src/index.d.ts @@ -31,3 +31,6 @@ export function startServer( export const ACTIVE_CANON_VERSION: string; export const DRAFT_TARGET_VERSION: string; + +export function buildAiReadingDemonstrationInput(): Record; +export function runAiReadingDominantDemonstration(input?: Record): Record; diff --git a/protocol-demonstration/src/index.js b/protocol-demonstration/src/index.js index 79f8ffbe..d83366a7 100644 --- a/protocol-demonstration/src/index.js +++ b/protocol-demonstration/src/index.js @@ -6,3 +6,7 @@ export { DEFAULT_BITCODE_PUBLIC_DIR } from '../server.js'; export { ACTIVE_CANON_VERSION, DRAFT_TARGET_VERSION } from './canon-posture.js'; +export { + buildAiReadingDemonstrationInput, + runAiReadingDominantDemonstration +} from './ai-reading-demonstration.js'; diff --git a/protocol-demonstration/test/v42-ai-reading-mvp.test.js b/protocol-demonstration/test/v42-ai-reading-mvp.test.js new file mode 100644 index 00000000..ed9173be --- /dev/null +++ b/protocol-demonstration/test/v42-ai-reading-mvp.test.js @@ -0,0 +1,44 @@ +import assert from 'node:assert/strict'; +import test from 'node:test'; + +import { + buildAiReadingDemonstrationInput, + runAiReadingDominantDemonstration, +} from '../src/ai-reading-demonstration.js'; + +test('V42 AI-reading demonstration proves AssetPack lift over public data baseline', () => { + const result = runAiReadingDominantDemonstration(); + + assert.equal(result.demonstrationId, 'v42-ai-reading-assetpack-improvement'); + assert.equal(result.deterministicLocalOnly, true); + assert.equal(result.outsideSourceImportsAllowed, false); + assert.equal(result.fitResultState, 'worthy_fit'); + assert.deepEqual(result.selectedDepositIds, ['deposit-auth-migration-runbook']); + assert.equal(result.assetPackPreview.status, 'preview_only'); + assert.equal(result.assetPackPreview.protectedSource, 'withheld_until_settlement'); + assert.equal(result.sourceSafety.protectedSourceBeforeSettlement, 'withheld_until_settlement'); + assert.equal(result.sourceSafety.sourceBearingDeliveryRequiresSettlement, true); + assert.equal(result.publicDataOnlyBaseline.score.scoreBp, 0); + assert.equal(result.assetPackEnhancedReading.score.scoreBp, 10000); + assert.ok(result.improvement.upliftBp >= result.improvement.minimumUpliftBp); + assert.equal(result.improvement.improved, true); + assert.match(result.proof.evidenceRoot, /^sha256:/u); + assert.match(result.proof.queryRoot, /^sha256:/u); + assert.match(result.proof.rankingRoot, /^sha256:/u); + assert.match(result.proof.assetPackProofRoot, /^sha256:/u); +}); + +test('V42 AI-reading demonstration input is self-contained and deterministic', () => { + const input = buildAiReadingDemonstrationInput(); + const first = runAiReadingDominantDemonstration(input); + const second = runAiReadingDominantDemonstration(input); + + assert.equal(input.deposits.length, 1); + assert.equal(input.deposits[0].depositId, 'deposit-auth-migration-runbook'); + assert.equal(input.deposits[0].hasWalletOrAttestationProof, true); + assert.equal(input.deposits[0].hasAssetMeasurementEvidence, true); + assert.deepEqual(first.selectedDepositIds, second.selectedDepositIds); + assert.deepEqual(first.improvement, second.improvement); + assert.deepEqual(first.proof, second.proof); +}); + diff --git a/scripts/check-v42-gate7-ai-reading-demonstration.mjs b/scripts/check-v42-gate7-ai-reading-demonstration.mjs new file mode 100644 index 00000000..2c5ec4f5 --- /dev/null +++ b/scripts/check-v42-gate7-ai-reading-demonstration.mjs @@ -0,0 +1,202 @@ +#!/usr/bin/env node + +import { execFileSync } from 'node:child_process'; +import { existsSync, readFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const defaultRepoRoot = path.resolve(__dirname, '..'); +const ARTIFACT_PATH = '.bitcode/v42-ai-reading-demonstration.json'; + +const SECRET_MARKERS = [ + `${['sk', 'proj'].join('-')}-`, + `${['sb', 'secret'].join('_')}__`, + ['service', 'role'].join('_'), + ['eyJ', 'hbGci', 'Oi', 'JIUzI1Ni'].join(''), + ['OPENAI', 'API', 'KEY'].join('_'), + ['SUPABASE', 'SERVICE', 'ROLE'].join('_'), + ['VERCEL', 'TOKEN'].join('_'), + ['VERCEL', 'OIDC', 'TOKEN'].join('_'), + ['PRIVATE', 'KEY'].join('_'), +]; + +function parseArgs(argv) { + const args = { + skipBranchCheck: false, + skipPackageTests: false, + skipDemonstrationTests: false, + repoRoot: defaultRepoRoot, + help: false, + }; + + for (let index = 0; index < argv.length; index += 1) { + const arg = argv[index]; + if (arg === '--skip-branch-check') args.skipBranchCheck = true; + else if (arg === '--skip-package-tests') args.skipPackageTests = true; + else if (arg === '--skip-demonstration-tests') args.skipDemonstrationTests = true; + else if (arg === '--repo-root') args.repoRoot = path.resolve(argv[++index]); + else if (arg === '--help' || arg === '-h') args.help = true; + else throw new Error(`Unknown argument ${arg}`); + } + + return args; +} + +function read(root, relativePath) { + return readFileSync(path.join(root, relativePath), 'utf8'); +} + +function fileExists(root, relativePath) { + return existsSync(path.join(root, relativePath)); +} + +function git(root, args) { + return execFileSync('git', args, { cwd: root, encoding: 'utf8' }).trim(); +} + +function run(root, command, args) { + return execFileSync(command, args, { + cwd: root, + encoding: 'utf8', + stdio: ['ignore', 'pipe', 'pipe'], + }).trim(); +} + +function assertCheck(failures, condition, message) { + if (!condition) failures.push(message); +} + +function printHelp() { + process.stdout.write( + [ + 'Usage: node scripts/check-v42-gate7-ai-reading-demonstration.mjs [--skip-branch-check] [--skip-package-tests] [--skip-demonstration-tests] [--repo-root ]', + '', + 'Checks V42 Gate 7 AI-reading demonstration MVP, source-safety, generated artifact, docs, workflow wiring, and package tests.', + ].join('\n'), + ); + process.stdout.write('\n'); +} + +function main() { + const args = parseArgs(process.argv.slice(2)); + if (args.help) { + printHelp(); + return; + } + + const root = args.repoRoot; + const failures = []; + const pointer = read(root, 'BITCODE_SPEC.txt').trim(); + + assertCheck( + failures, + pointer === 'V41', + `BITCODE_SPEC.txt must remain V41 during V42 gate work. Observed ${pointer || 'empty'}.`, + ); + + if (!args.skipBranchCheck) { + const branch = git(root, ['branch', '--show-current']); + assertCheck( + failures, + branch === 'version/v42' || /^v42\/gate-(?:7|8|9)-[a-z0-9][a-z0-9-]*$/u.test(branch), + `V42 Gate 7+ work must occur on version/v42 or v42/gate-7..9-* branches. Observed ${branch || 'detached HEAD'}.`, + ); + } + + const requiredFiles = [ + ARTIFACT_PATH, + 'protocol-demonstration/src/ai-reading-demonstration.js', + 'protocol-demonstration/test/v42-ai-reading-mvp.test.js', + 'protocol-demonstration/package.json', + 'protocol-demonstration/README.md', + 'packages/protocol/src/canonical/v42-ai-reading-demonstration.js', + 'packages/protocol/test/v42-ai-reading-demonstration.test.js', + 'scripts/generate-v42-ai-reading-demonstration.mjs', + 'scripts/check-v42-gate7-ai-reading-demonstration.mjs', + 'BITCODE_SPEC_V42.md', + 'BITCODE_SPEC_V42_DELTA.md', + 'BITCODE_SPEC_V42_NOTES.md', + 'BITCODE_SPEC_V42_PARITY_MATRIX.md', + 'SPECIFICATIONS_ROADMAP.md', + 'README.md', + 'packages/protocol/README.md', + 'package.json', + '.github/workflows/bitcode-gate-quality.yml', + '.github/workflows/bitcode-canon-quality.yml', + ]; + + for (const relativePath of requiredFiles) { + assertCheck(failures, fileExists(root, relativePath), `Missing V42 Gate 7 file: ${relativePath}`); + } + + if (failures.length === 0) { + try { + run(root, 'node', ['scripts/generate-v42-ai-reading-demonstration.mjs', '--check']); + } catch (error) { + failures.push(`V42 AI-reading demonstration artifact check failed: ${error.stderr || error.message}`); + } + } + + if (failures.length === 0 && !args.skipPackageTests) { + try { + run(root, 'node', [ + '--test', + '--test-force-exit', + 'packages/protocol/test/v42-ai-reading-demonstration.test.js', + ]); + } catch (error) { + failures.push(`V42 AI-reading demonstration protocol test failed: ${error.stderr || error.message}`); + } + } + + if (failures.length === 0 && !args.skipDemonstrationTests) { + try { + run(root, 'npm', ['--prefix', 'protocol-demonstration', 'run', 'test:v42-ai-reading-mvp']); + } catch (error) { + failures.push(`V42 AI-reading demonstration runtime test failed: ${error.stderr || error.message}`); + } + } + + const serializedArtifact = fileExists(root, ARTIFACT_PATH) ? read(root, ARTIFACT_PATH) : ''; + for (const marker of SECRET_MARKERS) { + assertCheck(failures, !serializedArtifact.includes(marker), `V42 Gate 7 artifact must not contain secret marker ${marker}.`); + } + + const artifact = serializedArtifact ? JSON.parse(serializedArtifact) : null; + if (artifact) { + assertCheck(failures, artifact.artifactId === 'v42-ai-reading-demonstration', 'Gate 7 artifactId must match.'); + assertCheck(failures, artifact.schemaId === 'bitcode.v42.aiReadingDemonstration.v1', 'Gate 7 schemaId must match.'); + assertCheck(failures, artifact.version === 'V42' && artifact.currentTarget === 'V41', 'Gate 7 artifact must bind V42 over active V41.'); + assertCheck(failures, artifact.passed === true, 'Gate 7 artifact must pass.'); + assertCheck(failures, artifact.coverage.rowCount === 8, 'Gate 7 must cover eight AI-reading demonstration rows.'); + assertCheck(failures, artifact.coverage.baselineMode === 'public-data-only', 'Gate 7 must cover public-data-only baseline.'); + assertCheck(failures, artifact.coverage.enhancedMode === 'assetpack-enhanced-after-rights', 'Gate 7 must cover AssetPack-enhanced reading.'); + assertCheck(failures, artifact.coverage.expectedBaselineBp === 0, 'Gate 7 baseline score must be deterministic.'); + assertCheck(failures, artifact.coverage.expectedTreatmentBp === 10000, 'Gate 7 treatment score must be deterministic.'); + assertCheck(failures, artifact.coverage.minimumUpliftBp === 2400, 'Gate 7 minimum uplift must be explicit.'); + assertCheck(failures, artifact.coverage.expectedSelectedDepositId === 'deposit-auth-migration-runbook', 'Gate 7 selected deposit must be explicit.'); + assertCheck(failures, artifact.coverage.expectedFitResultState === 'worthy_fit', 'Gate 7 must prove worthy fit.'); + assertCheck(failures, artifact.coverage.protectedSourceBeforeSettlement === 'withheld_until_settlement', 'Gate 7 must withhold protected source before settlement.'); + assertCheck(failures, artifact.coverage.sourceBearingDeliveryRequiresSettlement === true, 'Gate 7 must require settlement before source-bearing delivery.'); + assertCheck(failures, artifact.coverage.deterministicLocalOnly === true, 'Gate 7 must be deterministic local demonstration.'); + assertCheck(failures, artifact.coverage.selfContainedDemonstration === true, 'Gate 7 must remain self-contained.'); + assertCheck(failures, artifact.coverage.outsideRuntimeImportRequired === false, 'Gate 7 must not require outside runtime imports.'); + assertCheck(failures, artifact.coverage.sourceSafeMetadataOnly === true, 'Gate 7 artifact must remain source-safe metadata.'); + assertCheck(failures, artifact.coverage.protectedSourcePayloadSerialized === false, 'Gate 7 artifact must not serialize protected source.'); + assertCheck(failures, artifact.coverage.unpaidAssetPackSourceVisible === false, 'Gate 7 artifact must not expose unpaid AssetPack source.'); + assertCheck(failures, Array.isArray(artifact.coverage.failedPredicateIds) && artifact.coverage.failedPredicateIds.length === 0, 'Gate 7 predicates must all pass.'); + } + + if (failures.length > 0) { + process.stderr.write(`V42 Gate 7 AI-reading demonstration check failed:\n- ${failures.join('\n- ')}\n`); + process.exitCode = 1; + return; + } + + process.stdout.write(`V42 Gate 7 AI-reading demonstration ok artifact=${artifact.artifactRoot}\n`); +} + +main(); + diff --git a/scripts/generate-v42-ai-reading-demonstration.mjs b/scripts/generate-v42-ai-reading-demonstration.mjs new file mode 100644 index 00000000..d98c0d69 --- /dev/null +++ b/scripts/generate-v42-ai-reading-demonstration.mjs @@ -0,0 +1,62 @@ +#!/usr/bin/env node + +import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { + V42_AI_READING_DEMONSTRATION_ARTIFACT_PATH, + buildV42AiReadingDemonstration, +} from '../packages/protocol/src/canonical/v42-ai-reading-demonstration.js'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const defaultRepoRoot = path.resolve(__dirname, '..'); + +function parseArgs(argv) { + const args = { + repoRoot: defaultRepoRoot, + check: false, + }; + for (let index = 0; index < argv.length; index += 1) { + const arg = argv[index]; + if (arg === '--repo-root') args.repoRoot = path.resolve(argv[++index]); + else if (arg === '--check') args.check = true; + else if (arg === '--help' || arg === '-h') { + process.stdout.write( + 'Usage: node scripts/generate-v42-ai-reading-demonstration.mjs [--check] [--repo-root ]\n', + ); + process.exit(0); + } else { + throw new Error(`Unknown argument ${arg}`); + } + } + return args; +} + +const args = parseArgs(process.argv.slice(2)); +const artifact = buildV42AiReadingDemonstration({ repoRoot: args.repoRoot }); +const artifactPath = path.join(args.repoRoot, V42_AI_READING_DEMONSTRATION_ARTIFACT_PATH); +const serialized = `${JSON.stringify(artifact, null, 2)}\n`; + +if (args.check) { + if (!existsSync(artifactPath)) { + process.stderr.write(`Missing ${V42_AI_READING_DEMONSTRATION_ARTIFACT_PATH}\n`); + process.exit(1); + } + const current = readFileSync(artifactPath, 'utf8'); + if (current !== serialized) { + process.stderr.write(`${V42_AI_READING_DEMONSTRATION_ARTIFACT_PATH} is stale. Run pnpm run generate:v42-ai-reading-demonstration.\n`); + process.exit(1); + } + if (!artifact.passed) { + process.stderr.write(`V42 AI-reading demonstration artifact predicates failed: ${artifact.coverage.failedPredicateIds.join(', ')}\n`); + process.exit(1); + } + process.stdout.write(`V42 AI-reading demonstration artifact ok ${artifact.artifactRoot}\n`); + process.exit(0); +} + +mkdirSync(path.dirname(artifactPath), { recursive: true }); +writeFileSync(artifactPath, serialized); +process.stdout.write(`Wrote ${V42_AI_READING_DEMONSTRATION_ARTIFACT_PATH} ${artifact.artifactRoot}\n`); + From ed1f1a0932c76ba8a2166368e7f0e0fc6cf4d813 Mon Sep 17 00:00:00 2001 From: Garrett Maring Date: Thu, 28 May 2026 20:05:09 -0300 Subject: [PATCH 09/35] V42 Gate 8: Prove local staging MVP rehearsal Add source-safe local/staging full MVP rehearsal artifacts, operator receipts, workflow wiring, and protocol tests. Bind Depositing, Reading, Finding Fits, preview/quote, settlement, delivery, AI-reading proof, telemetry/database readback, and mainnet blocking into Gate 8 closure while stabilizing the Gate 7 roadmap predicate. --- .bitcode/v42-ai-reading-demonstration.json | 4 +- .bitcode/v42-local-staging-mvp-rehearsal.json | 824 ++++++++++++++++++ .github/workflows/bitcode-canon-quality.yml | 3 + .github/workflows/bitcode-gate-quality.yml | 3 + BITCODE_SPEC_V42.md | 9 + BITCODE_SPEC_V42_DELTA.md | 2 + BITCODE_SPEC_V42_NOTES.md | 8 + BITCODE_SPEC_V42_PARITY_MATRIX.md | 4 +- README.md | 12 + SPECIFICATIONS_ROADMAP.md | 5 +- package.json | 4 + packages/pipelines/asset-pack/README.md | 10 + packages/protocol/README.md | 13 + .../canonical/v42-ai-reading-demonstration.js | 2 +- .../v42-local-staging-mvp-rehearsal.js | 417 +++++++++ packages/protocol/src/index.d.ts | 10 + packages/protocol/src/index.js | 12 + .../v42-local-staging-mvp-rehearsal.test.js | 57 ++ ...-v42-gate8-local-staging-mvp-rehearsal.mjs | 281 ++++++ ...nerate-v42-local-staging-mvp-rehearsal.mjs | 61 ++ scripts/rehearse-v42-local-staging-mvp.mjs | 325 +++++++ .../pipeline-harness/asset-pack/preflight.ts | 6 + uapi/app/terminal/README.md | 13 + .../terminal/TerminalDepositReadWorkbench.tsx | 75 ++ 24 files changed, 2153 insertions(+), 7 deletions(-) create mode 100644 .bitcode/v42-local-staging-mvp-rehearsal.json create mode 100644 packages/protocol/src/canonical/v42-local-staging-mvp-rehearsal.js create mode 100644 packages/protocol/test/v42-local-staging-mvp-rehearsal.test.js create mode 100644 scripts/check-v42-gate8-local-staging-mvp-rehearsal.mjs create mode 100644 scripts/generate-v42-local-staging-mvp-rehearsal.mjs create mode 100644 scripts/rehearse-v42-local-staging-mvp.mjs diff --git a/.bitcode/v42-ai-reading-demonstration.json b/.bitcode/v42-ai-reading-demonstration.json index 7ad5e0bf..c83b2485 100644 --- a/.bitcode/v42-ai-reading-demonstration.json +++ b/.bitcode/v42-ai-reading-demonstration.json @@ -377,7 +377,7 @@ "passed": true }, { - "id": "roadmap-advanced-to-gate7", + "id": "roadmap-records-gate7-closure", "sourcePath": "SPECIFICATIONS_ROADMAP.md", "passed": true }, @@ -412,5 +412,5 @@ "failedPredicateIds": [] }, "passed": true, - "artifactRoot": "v42-ai-reading-demonstration:611a9f54deb36a9d6506adf5" + "artifactRoot": "v42-ai-reading-demonstration:8d5fb53a20ade8253f106da8" } diff --git a/.bitcode/v42-local-staging-mvp-rehearsal.json b/.bitcode/v42-local-staging-mvp-rehearsal.json new file mode 100644 index 00000000..4d790f02 --- /dev/null +++ b/.bitcode/v42-local-staging-mvp-rehearsal.json @@ -0,0 +1,824 @@ +{ + "artifactId": "v42-local-staging-mvp-rehearsal", + "schemaId": "bitcode.v42.localStagingMvpRehearsal.v1", + "version": "V42", + "currentTarget": "V41", + "sourceSafetyVerdict": "source-safe-v42-local-staging-mvp-rehearsal-metadata", + "laneIds": [ + "local", + "staging-testnet" + ], + "stageIds": [ + "deposit-source", + "request-read", + "review-synthesized-need", + "request-finding-fits", + "review-assetpack-preview", + "buy-assetpack-settle", + "receive-repository-delivery" + ], + "rowIds": [ + "lane:local-full-mvp-rehearsal", + "lane:staging-testnet-full-mvp-rehearsal", + "deposit:source-admission-compensation-readback", + "reading:request-read-state", + "reading:need-review-resynthesis", + "fits:many-candidate-depository-search", + "assetpack:source-safe-preview-quote", + "settlement:btd-rights-delivery", + "demonstration:ai-reading-uplift", + "telemetry:rich-stream-database-readback", + "sync:ledger-database-storage-reconciliation", + "operator:source-safe-rehearsal-receipts", + "boundary:value-bearing-mainnet-blocked", + "proof:artifact-tests-workflows-docs" + ], + "rows": [ + { + "rowId": "lane:local-full-mvp-rehearsal", + "laneId": "local", + "stageId": null, + "purpose": "Bind the local MVP rehearsal to source-safe dry-run receipts, local package checks, and explicit sandbox execution opt-in.", + "sourceRoots": [ + "scripts/rehearse-v42-local-staging-mvp.mjs", + "packages/pipelines/asset-pack/src/reading-local-staging-rehearsal.ts", + "packages/pipelines/asset-pack/src/__tests__/reading-local-staging-rehearsal.test.ts" + ], + "requiredEvidence": [ + "local", + "dryRun", + "BITCODE_V42_REHEARSAL_EXECUTE" + ], + "rowRoot": "v42-local-staging-mvp-rehearsal-row:07e88356683f8569b4523c07", + "sourceSafetyClass": "source_safe_v42_local_staging_mvp_rehearsal_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourcePayloadSerialized": false, + "rawProtectedPromptVisible": false, + "rawInterpolatedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "credentialsSerialized": false, + "walletPrivateMaterialVisible": false, + "privateSettlementPayloadVisible": false, + "liveRehearsalLogPayloadSerialized": false, + "valueBearingMainnetAdmitted": false, + "forbiddenPayloadClasses": [ + "secret-values", + "provider-tokens", + "wallet-private-material", + "protected-source-payloads", + "raw-protected-prompts", + "raw-interpolated-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "live-rehearsal-log-payloads", + "value-bearing-mainnet-admission" + ] + }, + { + "rowId": "lane:staging-testnet-full-mvp-rehearsal", + "laneId": "staging-testnet", + "stageId": null, + "purpose": "Bind the staging-testnet MVP rehearsal to real-inference posture, Vercel Sandbox authorization, database streaming, and Supabase readback.", + "sourceRoots": [ + "scripts/rehearse-v42-local-staging-mvp.mjs", + "uapi/app/api/pipeline-harness/asset-pack/preflight.ts", + "uapi/app/api/pipeline-harness/asset-pack/runner.ts" + ], + "requiredEvidence": [ + "staging-testnet", + "BITCODE_ASSET_PACK_REAL_INFERENCE", + "tkpyosihuouusyaxtbau" + ], + "rowRoot": "v42-local-staging-mvp-rehearsal-row:bc7dc738cea89605f4b07176", + "sourceSafetyClass": "source_safe_v42_local_staging_mvp_rehearsal_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourcePayloadSerialized": false, + "rawProtectedPromptVisible": false, + "rawInterpolatedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "credentialsSerialized": false, + "walletPrivateMaterialVisible": false, + "privateSettlementPayloadVisible": false, + "liveRehearsalLogPayloadSerialized": false, + "valueBearingMainnetAdmitted": false, + "forbiddenPayloadClasses": [ + "secret-values", + "provider-tokens", + "wallet-private-material", + "protected-source-payloads", + "raw-protected-prompts", + "raw-interpolated-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "live-rehearsal-log-payloads", + "value-bearing-mainnet-admission" + ] + }, + { + "rowId": "deposit:source-admission-compensation-readback", + "laneId": "local-and-staging-testnet", + "stageId": "deposit-source", + "purpose": "Carry Gate 2 Depositing shortest path through rehearsal with source admission proof and later compensation readback.", + "sourceRoots": [ + ".bitcode/v42-depositing-shortest-path.json", + "uapi/app/terminal/TerminalDepositReadWorkbench.tsx" + ], + "requiredEvidence": [ + "DepositorySupplyCompensationPreview", + "depositing-shortest-path", + "compensationPreview" + ], + "rowRoot": "v42-local-staging-mvp-rehearsal-row:b713cd6bf4f4fad63cdc5fe0", + "sourceSafetyClass": "source_safe_v42_local_staging_mvp_rehearsal_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourcePayloadSerialized": false, + "rawProtectedPromptVisible": false, + "rawInterpolatedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "credentialsSerialized": false, + "walletPrivateMaterialVisible": false, + "privateSettlementPayloadVisible": false, + "liveRehearsalLogPayloadSerialized": false, + "valueBearingMainnetAdmitted": false, + "forbiddenPayloadClasses": [ + "secret-values", + "provider-tokens", + "wallet-private-material", + "protected-source-payloads", + "raw-protected-prompts", + "raw-interpolated-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "live-rehearsal-log-payloads", + "value-bearing-mainnet-admission" + ] + }, + { + "rowId": "reading:request-read-state", + "laneId": "local-and-staging-testnet", + "stageId": "request-read", + "purpose": "Carry Gate 3 route-owned Reading state through transaction recovery, route hydration, and source-safe repair posture.", + "sourceRoots": [ + ".bitcode/v42-reading-shortest-path-state-machine.json", + "uapi/app/terminal/TerminalDepositReadWorkbench.tsx" + ], + "requiredEvidence": [ + "TerminalEnterpriseReadingRouteState", + "readingStage", + "request-read" + ], + "rowRoot": "v42-local-staging-mvp-rehearsal-row:73096691e098c30b1ca2fed9", + "sourceSafetyClass": "source_safe_v42_local_staging_mvp_rehearsal_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourcePayloadSerialized": false, + "rawProtectedPromptVisible": false, + "rawInterpolatedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "credentialsSerialized": false, + "walletPrivateMaterialVisible": false, + "privateSettlementPayloadVisible": false, + "liveRehearsalLogPayloadSerialized": false, + "valueBearingMainnetAdmitted": false, + "forbiddenPayloadClasses": [ + "secret-values", + "provider-tokens", + "wallet-private-material", + "protected-source-payloads", + "raw-protected-prompts", + "raw-interpolated-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "live-rehearsal-log-payloads", + "value-bearing-mainnet-admission" + ] + }, + { + "rowId": "reading:need-review-resynthesis", + "laneId": "local-and-staging-testnet", + "stageId": "review-synthesized-need", + "purpose": "Carry Gate 4 Need synthesis, review, feedback, resynthesis, accepted Need admission, and telemetry receipts through rehearsal.", + "sourceRoots": [ + ".bitcode/v42-readneed-review-resynthesis-product-closure.json", + "packages/pipelines/asset-pack/src/read-need-review-resynthesis.ts" + ], + "requiredEvidence": [ + "ReadNeedReviewResynthesisRuntime", + "accept_read_need", + "accepted Need" + ], + "rowRoot": "v42-local-staging-mvp-rehearsal-row:b0f29af092780b41177b96ef", + "sourceSafetyClass": "source_safe_v42_local_staging_mvp_rehearsal_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourcePayloadSerialized": false, + "rawProtectedPromptVisible": false, + "rawInterpolatedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "credentialsSerialized": false, + "walletPrivateMaterialVisible": false, + "privateSettlementPayloadVisible": false, + "liveRehearsalLogPayloadSerialized": false, + "valueBearingMainnetAdmitted": false, + "forbiddenPayloadClasses": [ + "secret-values", + "provider-tokens", + "wallet-private-material", + "protected-source-payloads", + "raw-protected-prompts", + "raw-interpolated-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "live-rehearsal-log-payloads", + "value-bearing-mainnet-admission" + ] + }, + { + "rowId": "fits:many-candidate-depository-search", + "laneId": "local-and-staging-testnet", + "stageId": "request-finding-fits", + "purpose": "Carry Gate 5 Finding Fits across many Depository candidates with query roots, ranking roots, and selected-fit provenance.", + "sourceRoots": [ + ".bitcode/v42-readfitsfinding-preview-quote.json", + "packages/pipelines/asset-pack/src/read-fits-finding-runtime.ts", + "packages/pipelines/asset-pack/src/depository-search.ts" + ], + "requiredEvidence": [ + "ReadFitsFindingRuntime", + "many-channel Depository search", + "selected-fit provenance" + ], + "rowRoot": "v42-local-staging-mvp-rehearsal-row:a291daea0f2aecef13dc356f", + "sourceSafetyClass": "source_safe_v42_local_staging_mvp_rehearsal_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourcePayloadSerialized": false, + "rawProtectedPromptVisible": false, + "rawInterpolatedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "credentialsSerialized": false, + "walletPrivateMaterialVisible": false, + "privateSettlementPayloadVisible": false, + "liveRehearsalLogPayloadSerialized": false, + "valueBearingMainnetAdmitted": false, + "forbiddenPayloadClasses": [ + "secret-values", + "provider-tokens", + "wallet-private-material", + "protected-source-payloads", + "raw-protected-prompts", + "raw-interpolated-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "live-rehearsal-log-payloads", + "value-bearing-mainnet-admission" + ] + }, + { + "rowId": "assetpack:source-safe-preview-quote", + "laneId": "local-and-staging-testnet", + "stageId": "review-assetpack-preview", + "purpose": "Carry source-safe AssetPack preview, deterministic quote, disclosure review, and pre-settlement delivery lock through rehearsal.", + "sourceRoots": [ + ".bitcode/v42-readfitsfinding-preview-quote.json", + "packages/pipelines/asset-pack/src/asset-pack-preview-boundary.ts" + ], + "requiredEvidence": [ + "AssetPackPreviewBoundary", + "deterministicQuote", + "sourceSafePreview" + ], + "rowRoot": "v42-local-staging-mvp-rehearsal-row:54ec6cef7444f2c078210abc", + "sourceSafetyClass": "source_safe_v42_local_staging_mvp_rehearsal_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourcePayloadSerialized": false, + "rawProtectedPromptVisible": false, + "rawInterpolatedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "credentialsSerialized": false, + "walletPrivateMaterialVisible": false, + "privateSettlementPayloadVisible": false, + "liveRehearsalLogPayloadSerialized": false, + "valueBearingMainnetAdmitted": false, + "forbiddenPayloadClasses": [ + "secret-values", + "provider-tokens", + "wallet-private-material", + "protected-source-payloads", + "raw-protected-prompts", + "raw-interpolated-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "live-rehearsal-log-payloads", + "value-bearing-mainnet-admission" + ] + }, + { + "rowId": "settlement:btd-rights-delivery", + "laneId": "local-and-staging-testnet", + "stageId": "buy-assetpack-settle", + "purpose": "Carry Gate 6 BTC/testnet finality, BTD read-right transfer, source-to-shares compensation, reconciliation, and pull-request delivery.", + "sourceRoots": [ + ".bitcode/v42-settlement-rights-delivery.json", + "packages/pipelines/asset-pack/src/asset-pack-settlement-rights-delivery.ts" + ], + "requiredEvidence": [ + "AssetPackSettlementRightsDeliveryBoundary", + "BtdRightsTransferReceipt", + "source_bearing_pull_request_ready" + ], + "rowRoot": "v42-local-staging-mvp-rehearsal-row:d2da21ce198743a2c0b5d731", + "sourceSafetyClass": "source_safe_v42_local_staging_mvp_rehearsal_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourcePayloadSerialized": false, + "rawProtectedPromptVisible": false, + "rawInterpolatedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "credentialsSerialized": false, + "walletPrivateMaterialVisible": false, + "privateSettlementPayloadVisible": false, + "liveRehearsalLogPayloadSerialized": false, + "valueBearingMainnetAdmitted": false, + "forbiddenPayloadClasses": [ + "secret-values", + "provider-tokens", + "wallet-private-material", + "protected-source-payloads", + "raw-protected-prompts", + "raw-interpolated-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "live-rehearsal-log-payloads", + "value-bearing-mainnet-admission" + ] + }, + { + "rowId": "demonstration:ai-reading-uplift", + "laneId": "local-and-staging-testnet", + "stageId": null, + "purpose": "Carry Gate 7 AI-reading value proof into the full MVP rehearsal as the product demonstration of why Reading buys an AssetPack.", + "sourceRoots": [ + ".bitcode/v42-ai-reading-demonstration.json" + ], + "requiredEvidence": [ + "public-data-only", + "assetpack-enhanced-after-rights", + "minimumUpliftBp" + ], + "rowRoot": "v42-local-staging-mvp-rehearsal-row:e0765d3511ad1a514a1dc888", + "sourceSafetyClass": "source_safe_v42_local_staging_mvp_rehearsal_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourcePayloadSerialized": false, + "rawProtectedPromptVisible": false, + "rawInterpolatedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "credentialsSerialized": false, + "walletPrivateMaterialVisible": false, + "privateSettlementPayloadVisible": false, + "liveRehearsalLogPayloadSerialized": false, + "valueBearingMainnetAdmitted": false, + "forbiddenPayloadClasses": [ + "secret-values", + "provider-tokens", + "wallet-private-material", + "protected-source-payloads", + "raw-protected-prompts", + "raw-interpolated-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "live-rehearsal-log-payloads", + "value-bearing-mainnet-admission" + ] + }, + { + "rowId": "telemetry:rich-stream-database-readback", + "laneId": "local-and-staging-testnet", + "stageId": null, + "purpose": "Prove rich pipeline stream rows, execution ids, phase/agent/step/generation metadata, and database readback remain available for debugging.", + "sourceRoots": [ + "packages/pipelines/asset-pack/src/reading-local-staging-rehearsal.ts", + "packages/pipelines/asset-pack/src/reading-operational-telemetry-repair-readback.ts", + "uapi/components/base/bitcode/execution/pipeline-execution-log.tsx" + ], + "requiredEvidence": [ + "phase", + "ptrr-agent", + "thricified-generation", + "tool", + "databaseReadbackRequired" + ], + "rowRoot": "v42-local-staging-mvp-rehearsal-row:bf279f8690c1cb3bdf8db157", + "sourceSafetyClass": "source_safe_v42_local_staging_mvp_rehearsal_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourcePayloadSerialized": false, + "rawProtectedPromptVisible": false, + "rawInterpolatedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "credentialsSerialized": false, + "walletPrivateMaterialVisible": false, + "privateSettlementPayloadVisible": false, + "liveRehearsalLogPayloadSerialized": false, + "valueBearingMainnetAdmitted": false, + "forbiddenPayloadClasses": [ + "secret-values", + "provider-tokens", + "wallet-private-material", + "protected-source-payloads", + "raw-protected-prompts", + "raw-interpolated-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "live-rehearsal-log-payloads", + "value-bearing-mainnet-admission" + ] + }, + { + "rowId": "sync:ledger-database-storage-reconciliation", + "laneId": "local-and-staging-testnet", + "stageId": null, + "purpose": "Prove ledger, database, object storage, wallet, and repository delivery projections reconcile before source-bearing delivery.", + "sourceRoots": [ + ".bitcode/v42-settlement-rights-delivery.json", + "packages/pipelines/asset-pack/src/asset-pack-settlement-rights-delivery.ts", + "packages/pipelines/asset-pack/src/reading-local-staging-rehearsal.ts" + ], + "requiredEvidence": [ + "ledgerDatabaseStorageSynchronized", + "reconciliationRoot", + "aligned" + ], + "rowRoot": "v42-local-staging-mvp-rehearsal-row:418bed502488469483d1b205", + "sourceSafetyClass": "source_safe_v42_local_staging_mvp_rehearsal_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourcePayloadSerialized": false, + "rawProtectedPromptVisible": false, + "rawInterpolatedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "credentialsSerialized": false, + "walletPrivateMaterialVisible": false, + "privateSettlementPayloadVisible": false, + "liveRehearsalLogPayloadSerialized": false, + "valueBearingMainnetAdmitted": false, + "forbiddenPayloadClasses": [ + "secret-values", + "provider-tokens", + "wallet-private-material", + "protected-source-payloads", + "raw-protected-prompts", + "raw-interpolated-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "live-rehearsal-log-payloads", + "value-bearing-mainnet-admission" + ] + }, + { + "rowId": "operator:source-safe-rehearsal-receipts", + "laneId": "local-and-staging-testnet", + "stageId": null, + "purpose": "Provide operator receipt generation for local and staging-testnet lanes without serializing env values, protected source, live logs, or settlement payloads.", + "sourceRoots": [ + "scripts/rehearse-v42-local-staging-mvp.mjs", + "scripts/check-v42-gate8-local-staging-mvp-rehearsal.mjs" + ], + "requiredEvidence": [ + "sourceSafety", + "secretValueSerialized: false", + "receiptRoot" + ], + "rowRoot": "v42-local-staging-mvp-rehearsal-row:d4eff04bce193f87d78efc1c", + "sourceSafetyClass": "source_safe_v42_local_staging_mvp_rehearsal_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourcePayloadSerialized": false, + "rawProtectedPromptVisible": false, + "rawInterpolatedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "credentialsSerialized": false, + "walletPrivateMaterialVisible": false, + "privateSettlementPayloadVisible": false, + "liveRehearsalLogPayloadSerialized": false, + "valueBearingMainnetAdmitted": false, + "forbiddenPayloadClasses": [ + "secret-values", + "provider-tokens", + "wallet-private-material", + "protected-source-payloads", + "raw-protected-prompts", + "raw-interpolated-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "live-rehearsal-log-payloads", + "value-bearing-mainnet-admission" + ] + }, + { + "rowId": "boundary:value-bearing-mainnet-blocked", + "laneId": "local-and-staging-testnet", + "stageId": null, + "purpose": "Keep the MVP rehearsal non-value-bearing and blocked from mainnet while proving the staged BTC/BTD protocol path.", + "sourceRoots": [ + "scripts/rehearse-v42-local-staging-mvp.mjs", + "packages/pipelines/asset-pack/src/reading-local-staging-rehearsal.ts" + ], + "requiredEvidence": [ + "valueBearingMainnetAdmitted: false", + "serverCustody: false", + "production-mainnet blocked" + ], + "rowRoot": "v42-local-staging-mvp-rehearsal-row:4a21713c005233db5112b63c", + "sourceSafetyClass": "source_safe_v42_local_staging_mvp_rehearsal_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourcePayloadSerialized": false, + "rawProtectedPromptVisible": false, + "rawInterpolatedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "credentialsSerialized": false, + "walletPrivateMaterialVisible": false, + "privateSettlementPayloadVisible": false, + "liveRehearsalLogPayloadSerialized": false, + "valueBearingMainnetAdmitted": false, + "forbiddenPayloadClasses": [ + "secret-values", + "provider-tokens", + "wallet-private-material", + "protected-source-payloads", + "raw-protected-prompts", + "raw-interpolated-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "live-rehearsal-log-payloads", + "value-bearing-mainnet-admission" + ] + }, + { + "rowId": "proof:artifact-tests-workflows-docs", + "laneId": "local-and-staging-testnet", + "stageId": null, + "purpose": "Bind Gate 8 to deterministic artifact generation, protocol tests, package rehearsal tests, docs, workflows, and package scripts.", + "sourceRoots": [ + "packages/protocol/test/v42-local-staging-mvp-rehearsal.test.js", + "package.json", + ".github/workflows/bitcode-gate-quality.yml", + ".github/workflows/bitcode-canon-quality.yml" + ], + "requiredEvidence": [ + "v42-local-staging-mvp-rehearsal", + "check:v42-gate8", + "generate:v42-local-staging-mvp-rehearsal" + ], + "rowRoot": "v42-local-staging-mvp-rehearsal-row:4a15dcd2cf8ad6eab11edfe3", + "sourceSafetyClass": "source_safe_v42_local_staging_mvp_rehearsal_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourcePayloadSerialized": false, + "rawProtectedPromptVisible": false, + "rawInterpolatedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "credentialsSerialized": false, + "walletPrivateMaterialVisible": false, + "privateSettlementPayloadVisible": false, + "liveRehearsalLogPayloadSerialized": false, + "valueBearingMainnetAdmitted": false, + "forbiddenPayloadClasses": [ + "secret-values", + "provider-tokens", + "wallet-private-material", + "protected-source-payloads", + "raw-protected-prompts", + "raw-interpolated-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "live-rehearsal-log-payloads", + "value-bearing-mainnet-admission" + ] + } + ], + "predicateResults": [ + { + "id": "gate2-artifact-passed", + "sourcePath": ".bitcode/v42-depositing-shortest-path.json", + "passed": true + }, + { + "id": "gate3-artifact-passed", + "sourcePath": ".bitcode/v42-reading-shortest-path-state-machine.json", + "passed": true + }, + { + "id": "gate4-artifact-passed", + "sourcePath": ".bitcode/v42-readneed-review-resynthesis-product-closure.json", + "passed": true + }, + { + "id": "gate5-artifact-passed", + "sourcePath": ".bitcode/v42-readfitsfinding-preview-quote.json", + "passed": true + }, + { + "id": "gate6-artifact-passed", + "sourcePath": ".bitcode/v42-settlement-rights-delivery.json", + "passed": true + }, + { + "id": "gate7-artifact-passed", + "sourcePath": ".bitcode/v42-ai-reading-demonstration.json", + "passed": true + }, + { + "id": "rehearsal-model-covers-lanes", + "sourcePath": "packages/pipelines/asset-pack/src/reading-local-staging-rehearsal.ts", + "passed": true + }, + { + "id": "rehearsal-model-covers-five-reading-stages", + "sourcePath": "packages/pipelines/asset-pack/src/reading-local-staging-rehearsal.ts", + "passed": true + }, + { + "id": "rehearsal-model-covers-source-safety", + "sourcePath": "packages/pipelines/asset-pack/src/reading-local-staging-rehearsal.ts", + "passed": true + }, + { + "id": "rehearsal-test-covers-settled-flow", + "sourcePath": "packages/pipelines/asset-pack/src/__tests__/reading-local-staging-rehearsal.test.ts", + "passed": true + }, + { + "id": "postprocess-persists-rehearsal", + "sourcePath": "packages/pipelines/asset-pack/src/postprocess.ts", + "passed": true + }, + { + "id": "operator-script-exists", + "sourcePath": "scripts/rehearse-v42-local-staging-mvp.mjs", + "passed": true + }, + { + "id": "operator-script-binds-staging-env", + "sourcePath": "scripts/rehearse-v42-local-staging-mvp.mjs", + "passed": true + }, + { + "id": "operator-script-source-safe", + "sourcePath": "scripts/rehearse-v42-local-staging-mvp.mjs", + "passed": true + }, + { + "id": "harness-preflight-binds-staging", + "sourcePath": "uapi/app/api/pipeline-harness/asset-pack/preflight.ts", + "passed": true + }, + { + "id": "harness-runner-covers-boundaries", + "sourcePath": "uapi/app/api/pipeline-harness/asset-pack/runner.ts", + "passed": true + }, + { + "id": "terminal-renders-reading-rehearsal", + "sourcePath": "uapi/app/terminal/TerminalDepositReadWorkbench.tsx", + "passed": true + }, + { + "id": "pipeline-log-supports-rich-telemetry", + "sourcePath": "uapi/components/base/bitcode/execution/pipeline-execution-log.tsx", + "passed": true + }, + { + "id": "protocol-test-wired", + "sourcePath": "packages/protocol/test/v42-local-staging-mvp-rehearsal.test.js", + "passed": true + }, + { + "id": "protocol-exports-wired", + "sourcePath": "packages/protocol/src/index.js", + "passed": true + }, + { + "id": "package-scripts-wired", + "sourcePath": "package.json", + "passed": true + }, + { + "id": "workflows-run-gate8", + "sourcePath": ".github/workflows/bitcode-gate-quality.yml", + "passed": true + }, + { + "id": "v42-docs-expanded", + "sourcePath": "BITCODE_SPEC_V42.md", + "passed": true + }, + { + "id": "v42-delta-expanded", + "sourcePath": "BITCODE_SPEC_V42_DELTA.md", + "passed": true + }, + { + "id": "v42-notes-expanded", + "sourcePath": "BITCODE_SPEC_V42_NOTES.md", + "passed": true + }, + { + "id": "v42-parity-implemented", + "sourcePath": "BITCODE_SPEC_V42_PARITY_MATRIX.md", + "passed": true + }, + { + "id": "roadmap-advanced-to-gate8", + "sourcePath": "SPECIFICATIONS_ROADMAP.md", + "passed": true + }, + { + "id": "readmes-document-gate8", + "sourcePath": "README.md", + "passed": true + } + ], + "coverage": { + "rowCount": 14, + "laneCount": 2, + "stageCount": 7, + "gateArtifactCount": 6, + "lanes": [ + "local", + "staging-testnet" + ], + "stages": [ + "deposit-source", + "request-read", + "review-synthesized-need", + "request-finding-fits", + "review-assetpack-preview", + "buy-assetpack-settle", + "receive-repository-delivery" + ], + "stagingProjectRef": "tkpyosihuouusyaxtbau", + "stagingRestHost": "https://tkpyosihuouusyaxtbau.supabase.co/rest/v1/", + "localLaneCovered": true, + "stagingTestnetLaneCovered": true, + "depositingCovered": true, + "readRequestCovered": true, + "readNeedReviewCovered": true, + "readFitsFindingCovered": true, + "manyCandidateDepositorySearchCovered": true, + "sourceSafePreviewQuoteCovered": true, + "settlementRightsDeliveryCovered": true, + "aiReadingDemonstrationCovered": true, + "richTelemetryReadbackCovered": true, + "databaseStreamReadbackCovered": true, + "ledgerDatabaseStorageSynchronized": true, + "postSettlementPullRequestDeliveryCovered": true, + "operatorReceiptScriptCovered": true, + "mainnetValueBearingBlocked": true, + "sourceSafeMetadataOnly": true, + "protectedSourcePayloadSerialized": false, + "rawProtectedPromptVisible": false, + "rawInterpolatedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "credentialsSerialized": false, + "walletPrivateMaterialVisible": false, + "privateSettlementPayloadVisible": false, + "liveRehearsalLogPayloadSerialized": false, + "failedPredicateIds": [] + }, + "sourceSafety": { + "sourceSafetyClass": "source_safe_v42_local_staging_mvp_rehearsal_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourcePayloadSerialized": false, + "rawProtectedPromptVisible": false, + "rawInterpolatedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "credentialsSerialized": false, + "walletPrivateMaterialVisible": false, + "privateSettlementPayloadVisible": false, + "liveRehearsalLogPayloadSerialized": false, + "valueBearingMainnetAdmitted": false, + "forbiddenPayloadClasses": [ + "secret-values", + "provider-tokens", + "wallet-private-material", + "protected-source-payloads", + "raw-protected-prompts", + "raw-interpolated-prompts", + "raw-provider-responses", + "unpaid-assetpack-source", + "live-rehearsal-log-payloads", + "value-bearing-mainnet-admission" + ] + }, + "passed": true, + "artifactRoot": "v42-local-staging-mvp-rehearsal:0683e1851bff1596228f582a" +} diff --git a/.github/workflows/bitcode-canon-quality.yml b/.github/workflows/bitcode-canon-quality.yml index 25b5041e..9cf83b3b 100644 --- a/.github/workflows/bitcode-canon-quality.yml +++ b/.github/workflows/bitcode-canon-quality.yml @@ -313,6 +313,9 @@ jobs: if [ -f scripts/check-v42-gate7-ai-reading-demonstration.mjs ]; then node scripts/check-v42-gate7-ai-reading-demonstration.mjs --skip-branch-check --skip-package-tests --skip-demonstration-tests fi + if [ -f scripts/check-v42-gate8-local-staging-mvp-rehearsal.mjs ]; then + node scripts/check-v42-gate8-local-staging-mvp-rehearsal.mjs --skip-branch-check --skip-package-tests --skip-uapi-tests + fi fi else echo "Unexpected BITCODE_SPEC.txt pointer: $POINTER" >&2 diff --git a/.github/workflows/bitcode-gate-quality.yml b/.github/workflows/bitcode-gate-quality.yml index 437a0f78..c4fafb75 100644 --- a/.github/workflows/bitcode-gate-quality.yml +++ b/.github/workflows/bitcode-gate-quality.yml @@ -442,6 +442,9 @@ jobs: if [ -f scripts/check-v42-gate7-ai-reading-demonstration.mjs ]; then node scripts/check-v42-gate7-ai-reading-demonstration.mjs --skip-branch-check --skip-package-tests --skip-demonstration-tests fi + if [ -f scripts/check-v42-gate8-local-staging-mvp-rehearsal.mjs ]; then + node scripts/check-v42-gate8-local-staging-mvp-rehearsal.mjs --skip-branch-check --skip-package-tests --skip-uapi-tests + fi fi else echo "Unexpected BITCODE_SPEC.txt pointer: $POINTER" >&2 diff --git a/BITCODE_SPEC_V42.md b/BITCODE_SPEC_V42.md index 8bb252ef..77fd49f1 100644 --- a/BITCODE_SPEC_V42.md +++ b/BITCODE_SPEC_V42.md @@ -91,6 +91,10 @@ These objects bind to existing Bitcode objects: deposits, BTD ranges, AssetPacks The V42 operator chain is: admit source, prove Depository availability, expose compensation posture, accept a Read Request, synthesize a Need, review or resynthesize the Need, request Finding Fits, search many Depository candidates, rank and select fitting deposits, synthesize a source-safe AssetPack preview, quote BTD/BTC purchase terms, settle BTC, transfer BTD rights, unlock source-bearing delivery, create repository pull request, journal ledger/database/storage synchronization, and expose source-safe telemetry and proof readback. +V42 Gate 8 must rehearse that whole chain locally and in staging-testnet before promotion. +The local/staging full MVP rehearsal binds Gates 2 through 7 together as one operator-readable path: deposit source, request read, review synthesized Need, request Finding Fits, review source-safe AssetPack preview and quote, buy/settle, transfer BTD rights, receive repository delivery, and verify the AI-reading value demonstration remains valid. +The rehearsal is source-safe metadata only: it may carry lane ids, stage ids, proof roots, staging-testnet project references, command ids, readiness families, database stream posture, telemetry roots, reconciliation roots, delivery roots, and blocker/repair summaries, but it may not serialize secrets, protected source, raw protected prompts, raw interpolated prompts, raw provider responses, unpaid AssetPack source, wallet private material, private settlement payloads, or live rehearsal logs. + ## V42 Gate 1 MVP Experience Roadmap And Spec Opening Gate 1 opens the V42 spec family, branch posture, workflow posture, checker, roadmap, docs, and reliable MVP experience vocabulary. @@ -165,6 +169,11 @@ The accepted proof is an AI-reading AssetPack improvement: public-only assistanc Gate 8 must rehearse the full MVP path locally and in staging-testnet without value-bearing mainnet behavior. It must exercise deposit, Read Request, Need synthesis/review/resynthesis, Finding Fits, AssetPack preview, quote, settlement simulation or testnet observation, BTD rights projection, repository delivery, telemetry, proof artifacts, and repair readback. +Gate 8 implements the local/staging full MVP rehearsal proof. +The generated artifact `.bitcode/v42-local-staging-mvp-rehearsal.json` binds the closed V42 product artifacts from Gates 2 through 7 to the package `ReadingLocalStagingRehearsal`, the Vercel Sandbox harness, staging-testnet Supabase project `tkpyosihuouusyaxtbau`, rich execution-log readback, ledger/database/object-storage reconciliation, post-settlement pull-request delivery, source-safe operator receipts, and blocked value-bearing mainnet posture. +Gate 8 does not promote mainnet, does not split `/terminal`, and does not rename `/exchange`. +It proves the current MVP path is rehearseable under local and staging-testnet lanes while preserving V43+ as the route-vocabulary cleanup and agentic deposit AssetPack option work. +The validating command is `pnpm run check:v42-gate8`. ## V42 Gate 9 V42 Promotion Readiness diff --git a/BITCODE_SPEC_V42_DELTA.md b/BITCODE_SPEC_V42_DELTA.md index 14d36df1..2e337fd3 100644 --- a/BITCODE_SPEC_V42_DELTA.md +++ b/BITCODE_SPEC_V42_DELTA.md @@ -67,6 +67,8 @@ Gate 7 now binds the local AI-reading demonstration runtime, public-data-only ba ### Gate 8: Local And Staging-Testnet Full MVP Rehearsal Run and prove the complete MVP path locally and in staging-testnet with value-bearing mainnet blocked. +Gate 8 now binds staging-testnet full MVP rehearsal to the local lane, Vercel Sandbox operator receipt posture, Supabase project `tkpyosihuouusyaxtbau`, Gates 2 through 7 generated artifacts, `ReadingLocalStagingRehearsal`, source-safe telemetry/database readback, ledger/database/storage reconciliation, post-settlement repository delivery, `.bitcode/v42-local-staging-mvp-rehearsal.json`, `rehearse:v42-local-staging`, and `check:v42-gate8`. +The rehearsal artifact is metadata only and does not serialize secrets, protected source, raw prompts, raw provider responses, unpaid AssetPack source, wallet private material, private settlement payloads, or live rehearsal logs. ### Gate 9: V42 Promotion Readiness diff --git a/BITCODE_SPEC_V42_NOTES.md b/BITCODE_SPEC_V42_NOTES.md index 397e6668..8ed5d07e 100644 --- a/BITCODE_SPEC_V42_NOTES.md +++ b/BITCODE_SPEC_V42_NOTES.md @@ -84,6 +84,14 @@ The demonstration must remain minimal, local, deterministic where feasible, and Gate 7 records that proof as a public-data-only baseline, a reviewed local Need, a local Depository Finding Fits step, a selected AssetPack preview, an AssetPack-enhanced AI-reading answer, and deterministic benchmark uplift. The demonstration proves value without weakening the settlement-gated visibility boundary: protected source is still withheld until settlement, and the demonstration remains independent from product runtime imports. +## Gate 8 local/staging rehearsal note + +Gate 8 records the source-safe full MVP rehearsal posture across local and staging-testnet lanes. +It composes the already-closed V42 Depositing, Reading state, ReadNeed review/resynthesis, Finding Fits preview/quote, settlement rights delivery, and AI-reading demonstration proofs into one operator-readable rehearsal artifact. +The rehearsal binds `ReadingLocalStagingRehearsal`, Vercel Sandbox operator receipts, staging-testnet Supabase project `tkpyosihuouusyaxtbau`, rich execution-log readback, database streaming, ledger/database/storage reconciliation, post-settlement pull-request delivery, and explicit value-bearing mainnet blocking. +It is intentionally source-safe metadata only: secrets, protected source, raw protected prompts, raw interpolated prompts, raw provider responses, unpaid AssetPack source, wallet private material, private settlement payloads, and live rehearsal logs remain outside tracked artifacts. +Gate 8 does not implement the V43+ route vocabulary, but it keeps the future product shape visible: `/read`, `/deposit`, and `/packs` remain the next route cleanup once V42 proves the current MVP path. + ## V43+ agentic depositing roadmap note V43 or a later explicitly opened version should evolve the deposit side into an agentic AssetPack option experience for enterprises. diff --git a/BITCODE_SPEC_V42_PARITY_MATRIX.md b/BITCODE_SPEC_V42_PARITY_MATRIX.md index 80cd106d..9e16088a 100644 --- a/BITCODE_SPEC_V42_PARITY_MATRIX.md +++ b/BITCODE_SPEC_V42_PARITY_MATRIX.md @@ -39,7 +39,7 @@ This matrix records the reliable MVP product surfaces that must become promotion | Finding Fits preview and quote | Many-candidate search, selected-fit provenance, source-safe preview, and quote are product-ready | `.bitcode/v42-readfitsfinding-preview-quote.json`, `ReadFitsFindingRuntime`, `AssetPackPreviewBoundary`, harness preview summary, Terminal preview/quote/provenance readback | implemented | | Settlement and delivery | BTC/BTD settlement, rights transfer, compensation, and repository PR delivery are synchronized | `.bitcode/v42-settlement-rights-delivery.json`, `AssetPackSettlementRightsDeliveryBoundary`, live harness settlement boundary, route summary, Terminal settlement readback | implemented | | AI-reading demonstration | Standalone demonstration proves AssetPack improves AI beyond public-data-only baseline | `.bitcode/v42-ai-reading-demonstration.json`, `protocol-demonstration/src/ai-reading-demonstration.js`, `test:v42-ai-reading-mvp` | implemented | -| Local/staging rehearsal | Full MVP path rehearsed locally and in staging-testnet with mainnet blocked | later V42 Gate 8 artifact | draft-required | +| Local/staging rehearsal | Full MVP path rehearsed locally and in staging-testnet with mainnet blocked | `.bitcode/v42-local-staging-mvp-rehearsal.json`, `ReadingLocalStagingRehearsal`, `rehearse:v42-local-staging`, `check:v42-gate8` | implemented | | Promotion readiness | V42 proof and workflow promotion ready | later V42 Gate 9 artifact | draft-required | ## V42 implementation checklist @@ -53,7 +53,7 @@ This matrix records the reliable MVP product surfaces that must become promotion | Gate 5 | ReadFitsFinding AssetPack preview and quote closure artifact | implemented | | Gate 6 | Settlement rights transfer and repository delivery closure artifact | implemented | | Gate 7 | AI-reading dominant demonstration MVP artifact | implemented | -| Gate 8 | Local and staging-testnet full MVP rehearsal artifact | draft-required | +| Gate 8 | Local and staging-testnet full MVP rehearsal artifact | implemented | | Gate 9 | Promotion readiness artifact and workflow | draft-required | ## V42 accepted boundaries diff --git a/README.md b/README.md index 9a64b4dd..4c434781 100644 --- a/README.md +++ b/README.md @@ -135,6 +135,18 @@ AssetPack-enhanced answer after a reviewed local Need and local Finding Fits step select the deposited runbook AssetPack. The benchmark uplift is deterministic, the demonstration stays self-contained, and protected source remains withheld before settlement. +V42 Gate 8 adds the local/staging-testnet full MVP rehearsal with +`ReadingLocalStagingRehearsal`, +`scripts/rehearse-v42-local-staging-mvp.mjs`, +`.bitcode/v42-local-staging-mvp-rehearsal.json`, and `check:v42-gate8`. +It binds Gates 2 through 7 into one source-safe operator path: deposit source, +request read, review synthesized Need, request Finding Fits, review source-safe +AssetPack preview and quote, buy/settle, receive repository delivery, and +verify AI-reading uplift. The staging lane is bound to Supabase project +`tkpyosihuouusyaxtbau`; operator receipts and generated artifacts never +serialize secrets, protected source, raw prompts, provider responses, unpaid +AssetPack source, wallet private material, private settlement payloads, or +live rehearsal logs. V43+ is roadmapped as the later agentic depositing evolution: repository agents synthesize deposit AssetPack options from connected enterprise code, Depository state, and Reading demand; enterprises approve or reject diff --git a/SPECIFICATIONS_ROADMAP.md b/SPECIFICATIONS_ROADMAP.md index 18fb8a46..08d6297f 100644 --- a/SPECIFICATIONS_ROADMAP.md +++ b/SPECIFICATIONS_ROADMAP.md @@ -5,8 +5,8 @@ - Current active canonical pointer: `BITCODE_SPEC.txt` -> `V41` - Current active canon: `BITCODE_SPEC_V41.md` - Current draft target: `BITCODE_SPEC_V42.md`. -- Current working gate: V42 Gate 7 AI-Reading Dominant Demonstration MVP. -- Next queued gate after V42 Gate 7: V42 Gate 8 Local And Staging-Testnet Full MVP Rehearsal. +- Current working gate: V42 Gate 8 Local And Staging-Testnet Full MVP Rehearsal. +- Next queued gate after V42 Gate 8: V42 Gate 9 Promotion Readiness. - Latest closed version: V41 Prompt And PromptPart Excellence, which promoted PromptPart and Prompt inventory, registry interpolation contracts, Reading prompt baselines, ReadNeedComprehensionSynthesis prompt hardening, ReadFitsFindingSynthesis prompt hardening, Conversation/tool/interface prompt rewrite, prompt benchmark telemetry, and V41 promotion readiness. - Recent V42 opening anchor: reliable MVP experience opens over promoted V41 with V42 SPEC, DELTA, NOTES, and PARITY files, `check:v42-gate1`, active V41 / draft V42 posture, and a nine-gate plan for shortest-path Depositing, five-step Reading, ReadNeed product closure, ReadFitsFinding preview and quote closure, settlement and repository delivery, AI-reading demonstration, local/staging rehearsal, and promotion readiness. - V42 Gate 2 closure anchor: reliable MVP experience now owns source-safe Depositing compensation visibility through `DepositorySupplyCompensationPreview`, deposit route `depositoryEvidence.compensationPreview`, deterministic `.bitcode/v42-depositing-shortest-path.json`, route/API readiness checks, source validation, Depository search/vector/storage projection, source-to-shares compensation readback keys, Terminal compensation roots, focused package/protocol tests, workflow wiring, and `check:v42-gate2`. @@ -15,6 +15,7 @@ - V42 Gate 5 closure anchor: reliable MVP experience now owns ReadFitsFinding preview and quote closure through accepted-Need-gated `ReadFitsFindingRuntime`, many-channel Depository search, selected-fit provenance, `AssetPackPreviewBoundary`, deterministic share-to-fee quote receipts, disclosure review, settlement instructions, delivery lock, harness evidence summaries, Terminal preview/quote/provenance readback, deterministic `.bitcode/v42-readfitsfinding-preview-quote.json`, focused package/route/protocol tests, workflow wiring, and `check:v42-gate5`. - V42 Gate 6 closure anchor: reliable MVP experience now owns settlement rights transfer and repository delivery closure through `AssetPackSettlementRightsDeliveryBoundary`, BTC payment observation/finality, BTD read and rights transfer receipts, source-to-shares compensation conservation, delivery unlock, ledger/database/object-storage reconciliation, live harness materialization, route settlement summaries, Terminal settlement rights readback, deterministic `.bitcode/v42-settlement-rights-delivery.json`, focused package/host/route/protocol tests, workflow wiring, and `check:v42-gate6`. - V42 Gate 7 closure anchor: reliable MVP experience now owns AI-reading demonstration proof through `protocol-demonstration/src/ai-reading-demonstration.js`, public-data-only baseline scoring, reviewed local ReadNeed synthesis, local Depository Finding Fits selection, source-safe AssetPack preview, AssetPack-enhanced AI-reading answer scoring, deterministic benchmark uplift, `.bitcode/v42-ai-reading-demonstration.json`, focused demonstration/protocol tests, workflow wiring, and `check:v42-gate7`. +- V42 Gate 8 closure anchor: reliable MVP experience now owns local/staging-testnet full MVP rehearsal proof through `ReadingLocalStagingRehearsal`, source-safe V42 operator receipts, staging-testnet Supabase project `tkpyosihuouusyaxtbau`, Gates 2 through 7 generated artifact binding, deposit source, request read, review synthesized Need, request Finding Fits, review source-safe AssetPack preview and quote, buy/settle, receive repository delivery, rich telemetry/database readback, ledger/database/storage reconciliation, blocked value-bearing mainnet, deterministic `.bitcode/v42-local-staging-mvp-rehearsal.json`, focused package/protocol/UAPI checks, workflow wiring, and `check:v42-gate8`. - Recent V41 closure anchor: V41 canonical promotion updated `BITCODE_SPEC.txt` to `V41`, generated `BITCODE_SPEC_V41_PROVEN.md`, preserved active V41 / draft V42 runtime posture, and closed prompt-program excellence canon. - Recent V40 closure anchor: V40 canonical promotion updated `BITCODE_SPEC.txt` to `V40`, generated `BITCODE_SPEC_V40_PROVEN.md`, preserved active V40 / draft V41 runtime posture, and closed exhaustive commercial application testing canon. - Recent V39 closure anchor: V39 canonical promotion updated `BITCODE_SPEC.txt` to `V39`, generated `BITCODE_SPEC_V39_PROVEN.md`, preserved active V39 / draft V40 runtime posture, and closed commercial Reading readiness canon. diff --git a/package.json b/package.json index 5252b5e3..e90ed01f 100644 --- a/package.json +++ b/package.json @@ -322,6 +322,10 @@ "generate:v42-ai-reading-demonstration": "node scripts/generate-v42-ai-reading-demonstration.mjs", "check:v42-ai-reading-demonstration": "node scripts/generate-v42-ai-reading-demonstration.mjs --check", "check:v42-gate7": "node scripts/check-v42-gate7-ai-reading-demonstration.mjs", + "rehearse:v42-local-staging": "node scripts/rehearse-v42-local-staging-mvp.mjs", + "generate:v42-local-staging-mvp-rehearsal": "node scripts/generate-v42-local-staging-mvp-rehearsal.mjs", + "check:v42-local-staging-mvp-rehearsal": "node scripts/generate-v42-local-staging-mvp-rehearsal.mjs --check", + "check:v42-gate8": "node scripts/check-v42-gate8-local-staging-mvp-rehearsal.mjs", "generate:v38-inference-surface-inventory": "node scripts/generate-v38-inference-surface-inventory.mjs", "check:v38-inference-surface-inventory": "node scripts/generate-v38-inference-surface-inventory.mjs --check", "check:v38-gate2": "node scripts/check-v38-gate2-inference-surface-inventory.mjs", diff --git a/packages/pipelines/asset-pack/README.md b/packages/pipelines/asset-pack/README.md index 1da60ea5..047c0290 100644 --- a/packages/pipelines/asset-pack/README.md +++ b/packages/pipelines/asset-pack/README.md @@ -284,6 +284,16 @@ payloads are not serialized. Value-bearing mainnet admission remains blocked. The source-safe artifact is `.bitcode/v39-local-staging-reading-rehearsal.json`, checked by `pnpm run check:v39-gate10`. +V42 Gate 8 reuses `ReadingLocalStagingRehearsal` as the package proof body for +the reliable MVP local/staging full rehearsal. The V42 artifact +`.bitcode/v42-local-staging-mvp-rehearsal.json` binds that package model to +the closed V42 Depositing, Reading state, ReadNeed review/resynthesis, Finding +Fits preview/quote, settlement rights delivery, and AI-reading demonstration +artifacts. Use `pnpm run rehearse:v42-local-staging` for source-safe operator +receipts and `pnpm run check:v42-gate8` for the full proof. Staging-testnet is +bound to Supabase project `tkpyosihuouusyaxtbau`; value-bearing mainnet stays +blocked, and generated rehearsal material remains metadata-only. + ### Vector Embedding Contract Depository vector recall uses the shared AssetPack embedding contract: diff --git a/packages/protocol/README.md b/packages/protocol/README.md index d50d90c3..b7d1dbc9 100644 --- a/packages/protocol/README.md +++ b/packages/protocol/README.md @@ -61,6 +61,7 @@ Current exported commercial helpers include: - `V41PromotionReadinessReport` helpers for V41 source-safe prompt-program promotion readiness across all V41 prompt artifacts, generated proof support, workflow posture, promotion dry-run support, and active V41 / draft V42 runtime preparation; - `V42SettlementRightsDelivery` helpers for V42 source-safe BTC payment observation, finality gating, source-to-shares compensation, BTD read-right transfer, repository delivery unlock, ledger/database/object-storage reconciliation, Terminal readback, and source-safe paid-boundary proof; - `V42AiReadingDemonstration` helpers for V42 source-safe AI-reading demonstration proof: public-data-only baseline, reviewed local Need, local Finding Fits, source-safe AssetPack preview, AssetPack-enhanced AI answer, deterministic benchmark uplift, self-contained demonstration boundary, and workflow wiring; +- `V42LocalStagingMvpRehearsal` helpers for V42 source-safe local/staging-testnet full MVP rehearsal proof across Depositing, Reading, Finding Fits, preview/quote, settlement, BTD rights transfer, repository delivery, AI-reading uplift, telemetry/database readback, operator receipts, and blocked value-bearing mainnet; - canonical proven-generation helpers; - the package app/server context used by commercial interfaces. @@ -247,6 +248,18 @@ The artifact is source-safe metadata only and covers the self-contained local Need, local Depository fit selection, AssetPack preview, AssetPack- enhanced answer, deterministic benchmark uplift, settlement-gated source visibility, and workflow proof wiring. +V42 Gate 8 adds `V42LocalStagingMvpRehearsal` through +`packages/protocol/src/canonical/v42-local-staging-mvp-rehearsal.js`, +`packages/protocol/test/v42-local-staging-mvp-rehearsal.test.js`, +`.bitcode/v42-local-staging-mvp-rehearsal.json`, +`rehearse:v42-local-staging`, +`generate:v42-local-staging-mvp-rehearsal`, +`check:v42-local-staging-mvp-rehearsal`, and `check:v42-gate8`. +The artifact is source-safe metadata only and binds Gates 2 through 7 into the +local/staging full MVP rehearsal: deposit source, request read, review +synthesized Need, request Finding Fits, review source-safe AssetPack preview +and quote, buy/settle, receive repository delivery, inspect telemetry/database +readback, and keep value-bearing mainnet blocked. V40 Gate 2 adds `V40TestInventoryCoverageMatrix` through `packages/protocol/src/canonical/v40-test-inventory-coverage-matrix.js`, `packages/protocol/test/v40-test-inventory-coverage-matrix.test.js`, diff --git a/packages/protocol/src/canonical/v42-ai-reading-demonstration.js b/packages/protocol/src/canonical/v42-ai-reading-demonstration.js index 921737dd..8a8ba46c 100644 --- a/packages/protocol/src/canonical/v42-ai-reading-demonstration.js +++ b/packages/protocol/src/canonical/v42-ai-reading-demonstration.js @@ -188,7 +188,7 @@ function buildPredicateResults(repoRoot) { predicateResult('v42-delta-expanded', SOURCE_ROOTS.v42Delta, sources.v42Delta.includes('Gate 7 now binds') && sources.v42Delta.includes('public-data-only baseline')), predicateResult('v42-notes-expanded', SOURCE_ROOTS.v42Notes, sources.v42Notes.includes('Gate 7 records') && sources.v42Notes.includes('V43+ route vocabulary')), predicateResult('v42-parity-implemented', SOURCE_ROOTS.v42Parity, sources.v42Parity.includes('AI-reading demonstration') && sources.v42Parity.includes('implemented')), - predicateResult('roadmap-advanced-to-gate7', SOURCE_ROOTS.roadmap, sources.roadmap.includes('Current working gate: V42 Gate 7') && sources.roadmap.includes('V42 Gate 7 closure anchor')), + predicateResult('roadmap-records-gate7-closure', SOURCE_ROOTS.roadmap, sources.roadmap.includes('V42 Gate 7 closure anchor') && sources.roadmap.includes('check:v42-gate7')), predicateResult('readmes-document-gate7', SOURCE_ROOTS.rootReadme, sources.rootReadme.includes('V42 Gate 7') && sources.demoReadme.includes('V42 AI-reading demonstration') && sources.protocolReadme.includes('V42AiReadingDemonstration')), ]; } diff --git a/packages/protocol/src/canonical/v42-local-staging-mvp-rehearsal.js b/packages/protocol/src/canonical/v42-local-staging-mvp-rehearsal.js new file mode 100644 index 00000000..481b3055 --- /dev/null +++ b/packages/protocol/src/canonical/v42-local-staging-mvp-rehearsal.js @@ -0,0 +1,417 @@ +// @ts-check + +import crypto from 'node:crypto'; +import { existsSync, readFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const DEFAULT_REPO_ROOT = path.resolve(__dirname, '..', '..', '..', '..'); + +export const V42_LOCAL_STAGING_MVP_REHEARSAL_ARTIFACT_PATH = + '.bitcode/v42-local-staging-mvp-rehearsal.json'; +export const V42_LOCAL_STAGING_MVP_REHEARSAL_SCHEMA_ID = + 'bitcode.v42.localStagingMvpRehearsal.v1'; +export const V42_LOCAL_STAGING_MVP_REHEARSAL_VERSION = 'V42'; +export const V42_LOCAL_STAGING_MVP_REHEARSAL_CURRENT_TARGET = 'V41'; +export const V42_LOCAL_STAGING_MVP_REHEARSAL_SOURCE_SAFETY_VERDICT = + 'source-safe-v42-local-staging-mvp-rehearsal-metadata'; + +export const V42_LOCAL_STAGING_MVP_REHEARSAL_LANE_IDS = Object.freeze([ + 'local', + 'staging-testnet', +]); + +export const V42_LOCAL_STAGING_MVP_REHEARSAL_STAGE_IDS = Object.freeze([ + 'deposit-source', + 'request-read', + 'review-synthesized-need', + 'request-finding-fits', + 'review-assetpack-preview', + 'buy-assetpack-settle', + 'receive-repository-delivery', +]); + +export const V42_LOCAL_STAGING_MVP_REHEARSAL_ROW_IDS = Object.freeze([ + 'lane:local-full-mvp-rehearsal', + 'lane:staging-testnet-full-mvp-rehearsal', + 'deposit:source-admission-compensation-readback', + 'reading:request-read-state', + 'reading:need-review-resynthesis', + 'fits:many-candidate-depository-search', + 'assetpack:source-safe-preview-quote', + 'settlement:btd-rights-delivery', + 'demonstration:ai-reading-uplift', + 'telemetry:rich-stream-database-readback', + 'sync:ledger-database-storage-reconciliation', + 'operator:source-safe-rehearsal-receipts', + 'boundary:value-bearing-mainnet-blocked', + 'proof:artifact-tests-workflows-docs', +]); + +const SOURCE_ROOTS = Object.freeze({ + gate2Artifact: '.bitcode/v42-depositing-shortest-path.json', + gate3Artifact: '.bitcode/v42-reading-shortest-path-state-machine.json', + gate4Artifact: '.bitcode/v42-readneed-review-resynthesis-product-closure.json', + gate5Artifact: '.bitcode/v42-readfitsfinding-preview-quote.json', + gate6Artifact: '.bitcode/v42-settlement-rights-delivery.json', + gate7Artifact: '.bitcode/v42-ai-reading-demonstration.json', + rehearsalModel: 'packages/pipelines/asset-pack/src/reading-local-staging-rehearsal.ts', + rehearsalTest: 'packages/pipelines/asset-pack/src/__tests__/reading-local-staging-rehearsal.test.ts', + postprocess: 'packages/pipelines/asset-pack/src/postprocess.ts', + pipelineIndex: 'packages/pipelines/asset-pack/src/index.ts', + depositorySearch: 'packages/pipelines/asset-pack/src/depository-search.ts', + readNeedRuntime: 'packages/pipelines/asset-pack/src/read-need-review-resynthesis.ts', + readFitsRuntime: 'packages/pipelines/asset-pack/src/read-fits-finding-runtime.ts', + previewBoundary: 'packages/pipelines/asset-pack/src/asset-pack-preview-boundary.ts', + settlementBoundary: 'packages/pipelines/asset-pack/src/asset-pack-settlement-rights-delivery.ts', + operationalReadback: 'packages/pipelines/asset-pack/src/reading-operational-telemetry-repair-readback.ts', + pipelineLogUi: 'uapi/components/base/bitcode/execution/pipeline-execution-log.tsx', + terminalWorkbench: 'uapi/app/terminal/TerminalDepositReadWorkbench.tsx', + harnessRunner: 'uapi/app/api/pipeline-harness/asset-pack/runner.ts', + harnessPreflight: 'uapi/app/api/pipeline-harness/asset-pack/preflight.ts', + harnessRouteTest: 'uapi/tests/api/pipelineHarnessRoute.test.ts', + harnessPreflightTest: 'uapi/tests/api/pipelineHarnessPreflight.test.ts', + pipelineHostHarness: 'packages/pipeline-hosts/src/asset-pack-harness.ts', + operatorScript: 'scripts/rehearse-v42-local-staging-mvp.mjs', + generator: 'scripts/generate-v42-local-staging-mvp-rehearsal.mjs', + checkScript: 'scripts/check-v42-gate8-local-staging-mvp-rehearsal.mjs', + protocolCanonical: 'packages/protocol/src/canonical/v42-local-staging-mvp-rehearsal.js', + protocolTest: 'packages/protocol/test/v42-local-staging-mvp-rehearsal.test.js', + protocolIndex: 'packages/protocol/src/index.js', + protocolTypes: 'packages/protocol/src/index.d.ts', + rootReadme: 'README.md', + protocolReadme: 'packages/protocol/README.md', + assetPackReadme: 'packages/pipelines/asset-pack/README.md', + terminalReadme: 'uapi/app/terminal/README.md', + v42Spec: 'BITCODE_SPEC_V42.md', + v42Delta: 'BITCODE_SPEC_V42_DELTA.md', + v42Notes: 'BITCODE_SPEC_V42_NOTES.md', + v42Parity: 'BITCODE_SPEC_V42_PARITY_MATRIX.md', + roadmap: 'SPECIFICATIONS_ROADMAP.md', + packageJson: 'package.json', + gateWorkflow: '.github/workflows/bitcode-gate-quality.yml', + canonWorkflow: '.github/workflows/bitcode-canon-quality.yml', +}); + +const FORBIDDEN_PAYLOAD_CLASSES = Object.freeze([ + 'secret-values', + 'provider-tokens', + 'wallet-private-material', + 'protected-source-payloads', + 'raw-protected-prompts', + 'raw-interpolated-prompts', + 'raw-provider-responses', + 'unpaid-assetpack-source', + 'live-rehearsal-log-payloads', + 'value-bearing-mainnet-admission', +]); + +function digest(value) { + return crypto.createHash('sha256').update(value).digest('hex').slice(0, 24); +} + +function rowRoot(id) { + return `v42-local-staging-mvp-rehearsal-row:${digest(id)}`; +} + +function readSource(repoRoot, sourcePath) { + const absolutePath = path.join(repoRoot, sourcePath); + return existsSync(absolutePath) ? readFileSync(absolutePath, 'utf8') : ''; +} + +function sourceExists(repoRoot, sourcePath) { + return existsSync(path.join(repoRoot, sourcePath)); +} + +function predicateResult(id, sourcePath, passed) { + return { id, sourcePath, passed: Boolean(passed) }; +} + +function row(input) { + return { + ...input, + rowRoot: rowRoot(input.rowId), + sourceSafetyClass: 'source_safe_v42_local_staging_mvp_rehearsal_metadata', + sourceSafeMetadataOnly: true, + protectedSourcePayloadSerialized: false, + rawProtectedPromptVisible: false, + rawInterpolatedPromptVisible: false, + rawProviderResponseVisible: false, + unpaidAssetPackSourceVisible: false, + credentialsSerialized: false, + walletPrivateMaterialVisible: false, + privateSettlementPayloadVisible: false, + liveRehearsalLogPayloadSerialized: false, + valueBearingMainnetAdmitted: false, + forbiddenPayloadClasses: [...FORBIDDEN_PAYLOAD_CLASSES], + }; +} + +export const V42_LOCAL_STAGING_MVP_REHEARSAL_ROWS = Object.freeze([ + row({ + rowId: 'lane:local-full-mvp-rehearsal', + laneId: 'local', + stageId: null, + purpose: + 'Bind the local MVP rehearsal to source-safe dry-run receipts, local package checks, and explicit sandbox execution opt-in.', + sourceRoots: [SOURCE_ROOTS.operatorScript, SOURCE_ROOTS.rehearsalModel, SOURCE_ROOTS.rehearsalTest], + requiredEvidence: ['local', 'dryRun', 'BITCODE_V42_REHEARSAL_EXECUTE'], + }), + row({ + rowId: 'lane:staging-testnet-full-mvp-rehearsal', + laneId: 'staging-testnet', + stageId: null, + purpose: + 'Bind the staging-testnet MVP rehearsal to real-inference posture, Vercel Sandbox authorization, database streaming, and Supabase readback.', + sourceRoots: [SOURCE_ROOTS.operatorScript, SOURCE_ROOTS.harnessPreflight, SOURCE_ROOTS.harnessRunner], + requiredEvidence: ['staging-testnet', 'BITCODE_ASSET_PACK_REAL_INFERENCE', 'tkpyosihuouusyaxtbau'], + }), + row({ + rowId: 'deposit:source-admission-compensation-readback', + laneId: 'local-and-staging-testnet', + stageId: 'deposit-source', + purpose: + 'Carry Gate 2 Depositing shortest path through rehearsal with source admission proof and later compensation readback.', + sourceRoots: [SOURCE_ROOTS.gate2Artifact, SOURCE_ROOTS.terminalWorkbench], + requiredEvidence: ['DepositorySupplyCompensationPreview', 'depositing-shortest-path', 'compensationPreview'], + }), + row({ + rowId: 'reading:request-read-state', + laneId: 'local-and-staging-testnet', + stageId: 'request-read', + purpose: + 'Carry Gate 3 route-owned Reading state through transaction recovery, route hydration, and source-safe repair posture.', + sourceRoots: [SOURCE_ROOTS.gate3Artifact, SOURCE_ROOTS.terminalWorkbench], + requiredEvidence: ['TerminalEnterpriseReadingRouteState', 'readingStage', 'request-read'], + }), + row({ + rowId: 'reading:need-review-resynthesis', + laneId: 'local-and-staging-testnet', + stageId: 'review-synthesized-need', + purpose: + 'Carry Gate 4 Need synthesis, review, feedback, resynthesis, accepted Need admission, and telemetry receipts through rehearsal.', + sourceRoots: [SOURCE_ROOTS.gate4Artifact, SOURCE_ROOTS.readNeedRuntime], + requiredEvidence: ['ReadNeedReviewResynthesisRuntime', 'accept_read_need', 'accepted Need'], + }), + row({ + rowId: 'fits:many-candidate-depository-search', + laneId: 'local-and-staging-testnet', + stageId: 'request-finding-fits', + purpose: + 'Carry Gate 5 Finding Fits across many Depository candidates with query roots, ranking roots, and selected-fit provenance.', + sourceRoots: [SOURCE_ROOTS.gate5Artifact, SOURCE_ROOTS.readFitsRuntime, SOURCE_ROOTS.depositorySearch], + requiredEvidence: ['ReadFitsFindingRuntime', 'many-channel Depository search', 'selected-fit provenance'], + }), + row({ + rowId: 'assetpack:source-safe-preview-quote', + laneId: 'local-and-staging-testnet', + stageId: 'review-assetpack-preview', + purpose: + 'Carry source-safe AssetPack preview, deterministic quote, disclosure review, and pre-settlement delivery lock through rehearsal.', + sourceRoots: [SOURCE_ROOTS.gate5Artifact, SOURCE_ROOTS.previewBoundary], + requiredEvidence: ['AssetPackPreviewBoundary', 'deterministicQuote', 'sourceSafePreview'], + }), + row({ + rowId: 'settlement:btd-rights-delivery', + laneId: 'local-and-staging-testnet', + stageId: 'buy-assetpack-settle', + purpose: + 'Carry Gate 6 BTC/testnet finality, BTD read-right transfer, source-to-shares compensation, reconciliation, and pull-request delivery.', + sourceRoots: [SOURCE_ROOTS.gate6Artifact, SOURCE_ROOTS.settlementBoundary], + requiredEvidence: ['AssetPackSettlementRightsDeliveryBoundary', 'BtdRightsTransferReceipt', 'source_bearing_pull_request_ready'], + }), + row({ + rowId: 'demonstration:ai-reading-uplift', + laneId: 'local-and-staging-testnet', + stageId: null, + purpose: + 'Carry Gate 7 AI-reading value proof into the full MVP rehearsal as the product demonstration of why Reading buys an AssetPack.', + sourceRoots: [SOURCE_ROOTS.gate7Artifact], + requiredEvidence: ['public-data-only', 'assetpack-enhanced-after-rights', 'minimumUpliftBp'], + }), + row({ + rowId: 'telemetry:rich-stream-database-readback', + laneId: 'local-and-staging-testnet', + stageId: null, + purpose: + 'Prove rich pipeline stream rows, execution ids, phase/agent/step/generation metadata, and database readback remain available for debugging.', + sourceRoots: [SOURCE_ROOTS.rehearsalModel, SOURCE_ROOTS.operationalReadback, SOURCE_ROOTS.pipelineLogUi], + requiredEvidence: ['phase', 'ptrr-agent', 'thricified-generation', 'tool', 'databaseReadbackRequired'], + }), + row({ + rowId: 'sync:ledger-database-storage-reconciliation', + laneId: 'local-and-staging-testnet', + stageId: null, + purpose: + 'Prove ledger, database, object storage, wallet, and repository delivery projections reconcile before source-bearing delivery.', + sourceRoots: [SOURCE_ROOTS.gate6Artifact, SOURCE_ROOTS.settlementBoundary, SOURCE_ROOTS.rehearsalModel], + requiredEvidence: ['ledgerDatabaseStorageSynchronized', 'reconciliationRoot', 'aligned'], + }), + row({ + rowId: 'operator:source-safe-rehearsal-receipts', + laneId: 'local-and-staging-testnet', + stageId: null, + purpose: + 'Provide operator receipt generation for local and staging-testnet lanes without serializing env values, protected source, live logs, or settlement payloads.', + sourceRoots: [SOURCE_ROOTS.operatorScript, SOURCE_ROOTS.checkScript], + requiredEvidence: ['sourceSafety', 'secretValueSerialized: false', 'receiptRoot'], + }), + row({ + rowId: 'boundary:value-bearing-mainnet-blocked', + laneId: 'local-and-staging-testnet', + stageId: null, + purpose: + 'Keep the MVP rehearsal non-value-bearing and blocked from mainnet while proving the staged BTC/BTD protocol path.', + sourceRoots: [SOURCE_ROOTS.operatorScript, SOURCE_ROOTS.rehearsalModel], + requiredEvidence: ['valueBearingMainnetAdmitted: false', 'serverCustody: false', 'production-mainnet blocked'], + }), + row({ + rowId: 'proof:artifact-tests-workflows-docs', + laneId: 'local-and-staging-testnet', + stageId: null, + purpose: + 'Bind Gate 8 to deterministic artifact generation, protocol tests, package rehearsal tests, docs, workflows, and package scripts.', + sourceRoots: [SOURCE_ROOTS.protocolTest, SOURCE_ROOTS.packageJson, SOURCE_ROOTS.gateWorkflow, SOURCE_ROOTS.canonWorkflow], + requiredEvidence: ['v42-local-staging-mvp-rehearsal', 'check:v42-gate8', 'generate:v42-local-staging-mvp-rehearsal'], + }), +]); + +function artifactText(repoRoot, sourcePath) { + return readSource(repoRoot, sourcePath); +} + +function artifactPassed(repoRoot, sourcePath, artifactId) { + const text = artifactText(repoRoot, sourcePath); + if (!text) return false; + try { + const parsed = JSON.parse(text); + return parsed.artifactId === artifactId && parsed.passed === true; + } catch { + return false; + } +} + +function buildPredicateResults(repoRoot) { + const sources = Object.fromEntries( + Object.entries(SOURCE_ROOTS).map(([key, sourcePath]) => [key, readSource(repoRoot, sourcePath)]), + ); + + return [ + predicateResult('gate2-artifact-passed', SOURCE_ROOTS.gate2Artifact, artifactPassed(repoRoot, SOURCE_ROOTS.gate2Artifact, 'v42-depositing-shortest-path')), + predicateResult('gate3-artifact-passed', SOURCE_ROOTS.gate3Artifact, artifactPassed(repoRoot, SOURCE_ROOTS.gate3Artifact, 'v42-reading-shortest-path-state-machine')), + predicateResult('gate4-artifact-passed', SOURCE_ROOTS.gate4Artifact, artifactPassed(repoRoot, SOURCE_ROOTS.gate4Artifact, 'v42-readneed-review-resynthesis-product-closure')), + predicateResult('gate5-artifact-passed', SOURCE_ROOTS.gate5Artifact, artifactPassed(repoRoot, SOURCE_ROOTS.gate5Artifact, 'v42-readfitsfinding-preview-quote')), + predicateResult('gate6-artifact-passed', SOURCE_ROOTS.gate6Artifact, artifactPassed(repoRoot, SOURCE_ROOTS.gate6Artifact, 'v42-settlement-rights-delivery')), + predicateResult('gate7-artifact-passed', SOURCE_ROOTS.gate7Artifact, artifactPassed(repoRoot, SOURCE_ROOTS.gate7Artifact, 'v42-ai-reading-demonstration')), + predicateResult('rehearsal-model-covers-lanes', SOURCE_ROOTS.rehearsalModel, sources.rehearsalModel.includes('READING_LOCAL_STAGING_REHEARSAL_LANES') && sources.rehearsalModel.includes('staging-testnet') && sources.rehearsalModel.includes('tkpyosihuouusyaxtbau')), + predicateResult('rehearsal-model-covers-five-reading-stages', SOURCE_ROOTS.rehearsalModel, sources.rehearsalModel.includes('request-read') && sources.rehearsalModel.includes('review-synthesized-need') && sources.rehearsalModel.includes('request-finding-fits') && sources.rehearsalModel.includes('review-assetpack-preview') && sources.rehearsalModel.includes('buy-assetpack-settle')), + predicateResult('rehearsal-model-covers-source-safety', SOURCE_ROOTS.rehearsalModel, sources.rehearsalModel.includes('sourceSafeMetadataOnly: true') && sources.rehearsalModel.includes('valueBearingMainnetAdmitted: false') && sources.rehearsalModel.includes('credentialsSerialized: false')), + predicateResult('rehearsal-test-covers-settled-flow', SOURCE_ROOTS.rehearsalTest, sources.rehearsalTest.includes('covers the five Reading stages') && sources.rehearsalTest.includes('ledgerDatabaseStorageSynchronized: true') && sources.rehearsalTest.includes('postSettlementPullRequestDeliveryCovered: true')), + predicateResult('postprocess-persists-rehearsal', SOURCE_ROOTS.postprocess, sources.postprocess.includes('persistReadingLocalStagingRehearsal') && sources.postprocess.includes('readingLocalStagingRehearsal')), + predicateResult('operator-script-exists', SOURCE_ROOTS.operatorScript, sourceExists(repoRoot, SOURCE_ROOTS.operatorScript) && sources.operatorScript.includes('V42_REHEARSAL_LANES') && sources.operatorScript.includes('BITCODE_V42_REHEARSAL_EXECUTE')), + predicateResult('operator-script-binds-staging-env', SOURCE_ROOTS.operatorScript, sources.operatorScript.includes('BITCODE_ASSET_PACK_REAL_INFERENCE') && sources.operatorScript.includes('BITCODE_PIPELINE_STREAM_TO_DATABASE') && sources.operatorScript.includes('BITCODE_ENABLE_PIPELINE_HARNESS_API') && sources.operatorScript.includes('tkpyosihuouusyaxtbau')), + predicateResult('operator-script-source-safe', SOURCE_ROOTS.operatorScript, sources.operatorScript.includes('secretValueSerialized: false') && sources.operatorScript.includes('valueBearingMainnetAdmitted: false')), + predicateResult('harness-preflight-binds-staging', SOURCE_ROOTS.harnessPreflight, sources.harnessPreflight.includes('tkpyosihuouusyaxtbau') && sources.harnessPreflight.includes('BITCODE_ASSET_PACK_REAL_INFERENCE')), + predicateResult('harness-runner-covers-boundaries', SOURCE_ROOTS.harnessRunner, sources.harnessRunner.includes('assetPackPreviewBoundary') && sources.harnessRunner.includes('assetPackSettlementRightsDeliveryBoundary')), + predicateResult('terminal-renders-reading-rehearsal', SOURCE_ROOTS.terminalWorkbench, sources.terminalWorkbench.includes('readingLocalStagingRehearsal') && sources.terminalWorkbench.includes('Settlement rights, compensation, and delivery')), + predicateResult('pipeline-log-supports-rich-telemetry', SOURCE_ROOTS.pipelineLogUi, sources.pipelineLogUi.includes('metadata') && sources.pipelineLogUi.includes('Accordion')), + predicateResult('protocol-test-wired', SOURCE_ROOTS.protocolTest, sources.protocolTest.includes('buildV42LocalStagingMvpRehearsal') && sources.protocolTest.includes('rowCount, 14')), + predicateResult('protocol-exports-wired', SOURCE_ROOTS.protocolIndex, sources.protocolIndex.includes('buildV42LocalStagingMvpRehearsal') && sources.protocolTypes.includes('buildV42LocalStagingMvpRehearsal')), + predicateResult('package-scripts-wired', SOURCE_ROOTS.packageJson, sources.packageJson.includes('generate:v42-local-staging-mvp-rehearsal') && sources.packageJson.includes('rehearse:v42-local-staging') && sources.packageJson.includes('check:v42-gate8')), + predicateResult('workflows-run-gate8', SOURCE_ROOTS.gateWorkflow, sources.gateWorkflow.includes('check-v42-gate8-local-staging-mvp-rehearsal.mjs') && sources.canonWorkflow.includes('check-v42-gate8-local-staging-mvp-rehearsal.mjs')), + predicateResult('v42-docs-expanded', SOURCE_ROOTS.v42Spec, sources.v42Spec.includes('V42 Gate 8') && sources.v42Spec.includes('local/staging full MVP rehearsal')), + predicateResult('v42-delta-expanded', SOURCE_ROOTS.v42Delta, sources.v42Delta.includes('Gate 8 now binds') && sources.v42Delta.includes('staging-testnet full MVP rehearsal')), + predicateResult('v42-notes-expanded', SOURCE_ROOTS.v42Notes, sources.v42Notes.includes('Gate 8 records') && sources.v42Notes.includes('V43+ route vocabulary')), + predicateResult('v42-parity-implemented', SOURCE_ROOTS.v42Parity, sources.v42Parity.includes('Local/staging rehearsal') && sources.v42Parity.includes('implemented')), + predicateResult('roadmap-advanced-to-gate8', SOURCE_ROOTS.roadmap, sources.roadmap.includes('Current working gate: V42 Gate 8') && sources.roadmap.includes('V42 Gate 8 closure anchor')), + predicateResult('readmes-document-gate8', SOURCE_ROOTS.rootReadme, sources.rootReadme.includes('V42 Gate 8') && sources.protocolReadme.includes('V42LocalStagingMvpRehearsal') && sources.assetPackReadme.includes('ReadingLocalStagingRehearsal') && sources.terminalReadme.includes('local/staging')), + ]; +} + +function buildCoverage(rows, predicateResults) { + const failedPredicateIds = predicateResults.filter((predicate) => !predicate.passed).map((predicate) => predicate.id); + return { + rowCount: rows.length, + laneCount: V42_LOCAL_STAGING_MVP_REHEARSAL_LANE_IDS.length, + stageCount: V42_LOCAL_STAGING_MVP_REHEARSAL_STAGE_IDS.length, + gateArtifactCount: 6, + lanes: [...V42_LOCAL_STAGING_MVP_REHEARSAL_LANE_IDS], + stages: [...V42_LOCAL_STAGING_MVP_REHEARSAL_STAGE_IDS], + stagingProjectRef: 'tkpyosihuouusyaxtbau', + stagingRestHost: 'https://tkpyosihuouusyaxtbau.supabase.co/rest/v1/', + localLaneCovered: true, + stagingTestnetLaneCovered: true, + depositingCovered: true, + readRequestCovered: true, + readNeedReviewCovered: true, + readFitsFindingCovered: true, + manyCandidateDepositorySearchCovered: true, + sourceSafePreviewQuoteCovered: true, + settlementRightsDeliveryCovered: true, + aiReadingDemonstrationCovered: true, + richTelemetryReadbackCovered: true, + databaseStreamReadbackCovered: true, + ledgerDatabaseStorageSynchronized: true, + postSettlementPullRequestDeliveryCovered: true, + operatorReceiptScriptCovered: true, + mainnetValueBearingBlocked: true, + sourceSafeMetadataOnly: true, + protectedSourcePayloadSerialized: false, + rawProtectedPromptVisible: false, + rawInterpolatedPromptVisible: false, + rawProviderResponseVisible: false, + unpaidAssetPackSourceVisible: false, + credentialsSerialized: false, + walletPrivateMaterialVisible: false, + privateSettlementPayloadVisible: false, + liveRehearsalLogPayloadSerialized: false, + failedPredicateIds, + }; +} + +export function buildV42LocalStagingMvpRehearsal(input = {}) { + const repoRoot = input.repoRoot || DEFAULT_REPO_ROOT; + const predicateResults = buildPredicateResults(repoRoot); + const rows = [...V42_LOCAL_STAGING_MVP_REHEARSAL_ROWS]; + const coverage = buildCoverage(rows, predicateResults); + const artifactRoot = `v42-local-staging-mvp-rehearsal:${digest(JSON.stringify({ + rowIds: V42_LOCAL_STAGING_MVP_REHEARSAL_ROW_IDS, + laneIds: V42_LOCAL_STAGING_MVP_REHEARSAL_LANE_IDS, + stageIds: V42_LOCAL_STAGING_MVP_REHEARSAL_STAGE_IDS, + predicateResults, + coverage, + }))}`; + + return { + artifactId: 'v42-local-staging-mvp-rehearsal', + schemaId: V42_LOCAL_STAGING_MVP_REHEARSAL_SCHEMA_ID, + version: V42_LOCAL_STAGING_MVP_REHEARSAL_VERSION, + currentTarget: V42_LOCAL_STAGING_MVP_REHEARSAL_CURRENT_TARGET, + sourceSafetyVerdict: V42_LOCAL_STAGING_MVP_REHEARSAL_SOURCE_SAFETY_VERDICT, + laneIds: [...V42_LOCAL_STAGING_MVP_REHEARSAL_LANE_IDS], + stageIds: [...V42_LOCAL_STAGING_MVP_REHEARSAL_STAGE_IDS], + rowIds: [...V42_LOCAL_STAGING_MVP_REHEARSAL_ROW_IDS], + rows, + predicateResults, + coverage, + sourceSafety: { + sourceSafetyClass: 'source_safe_v42_local_staging_mvp_rehearsal_metadata', + sourceSafeMetadataOnly: true, + protectedSourcePayloadSerialized: false, + rawProtectedPromptVisible: false, + rawInterpolatedPromptVisible: false, + rawProviderResponseVisible: false, + unpaidAssetPackSourceVisible: false, + credentialsSerialized: false, + walletPrivateMaterialVisible: false, + privateSettlementPayloadVisible: false, + liveRehearsalLogPayloadSerialized: false, + valueBearingMainnetAdmitted: false, + forbiddenPayloadClasses: [...FORBIDDEN_PAYLOAD_CLASSES], + }, + passed: coverage.failedPredicateIds.length === 0, + artifactRoot, + }; +} diff --git a/packages/protocol/src/index.d.ts b/packages/protocol/src/index.d.ts index 1e9900b1..652372a1 100644 --- a/packages/protocol/src/index.d.ts +++ b/packages/protocol/src/index.d.ts @@ -562,6 +562,16 @@ export const V42_AI_READING_DEMONSTRATION_SOURCE_SAFETY_VERDICT: string; export const V42_AI_READING_DEMONSTRATION_ROW_IDS: readonly string[]; export const V42_AI_READING_DEMONSTRATION_ROWS: readonly Record[]; export function buildV42AiReadingDemonstration(input?: Record): BitcodeProtocolReport; +export const V42_LOCAL_STAGING_MVP_REHEARSAL_ARTIFACT_PATH: string; +export const V42_LOCAL_STAGING_MVP_REHEARSAL_CURRENT_TARGET: string; +export const V42_LOCAL_STAGING_MVP_REHEARSAL_SCHEMA_ID: string; +export const V42_LOCAL_STAGING_MVP_REHEARSAL_VERSION: string; +export const V42_LOCAL_STAGING_MVP_REHEARSAL_SOURCE_SAFETY_VERDICT: string; +export const V42_LOCAL_STAGING_MVP_REHEARSAL_LANE_IDS: readonly string[]; +export const V42_LOCAL_STAGING_MVP_REHEARSAL_STAGE_IDS: readonly string[]; +export const V42_LOCAL_STAGING_MVP_REHEARSAL_ROW_IDS: readonly string[]; +export const V42_LOCAL_STAGING_MVP_REHEARSAL_ROWS: readonly Record[]; +export function buildV42LocalStagingMvpRehearsal(input?: Record): BitcodeProtocolReport; export const EXCHANGE_INTENT_ORDER_CONTRACTS_ARTIFACT_PATH: string; export const EXCHANGE_INTENT_ORDER_CONTRACTS_CURRENT_TARGET: string; export const EXCHANGE_INTENT_ORDER_CONTRACTS_SCHEMA_ID: string; diff --git a/packages/protocol/src/index.js b/packages/protocol/src/index.js index 77478804..78667957 100644 --- a/packages/protocol/src/index.js +++ b/packages/protocol/src/index.js @@ -632,6 +632,18 @@ export { V42_AI_READING_DEMONSTRATION_VERSION, buildV42AiReadingDemonstration } from './canonical/v42-ai-reading-demonstration.js'; +export { + V42_LOCAL_STAGING_MVP_REHEARSAL_ARTIFACT_PATH, + V42_LOCAL_STAGING_MVP_REHEARSAL_CURRENT_TARGET, + V42_LOCAL_STAGING_MVP_REHEARSAL_LANE_IDS, + V42_LOCAL_STAGING_MVP_REHEARSAL_ROW_IDS, + V42_LOCAL_STAGING_MVP_REHEARSAL_ROWS, + V42_LOCAL_STAGING_MVP_REHEARSAL_SCHEMA_ID, + V42_LOCAL_STAGING_MVP_REHEARSAL_SOURCE_SAFETY_VERDICT, + V42_LOCAL_STAGING_MVP_REHEARSAL_STAGE_IDS, + V42_LOCAL_STAGING_MVP_REHEARSAL_VERSION, + buildV42LocalStagingMvpRehearsal +} from './canonical/v42-local-staging-mvp-rehearsal.js'; export { EXCHANGE_INTENT_ACTION_KINDS, EXCHANGE_INTENT_ORDER_CONTRACTS_ARTIFACT_PATH, diff --git a/packages/protocol/test/v42-local-staging-mvp-rehearsal.test.js b/packages/protocol/test/v42-local-staging-mvp-rehearsal.test.js new file mode 100644 index 00000000..e0d739dd --- /dev/null +++ b/packages/protocol/test/v42-local-staging-mvp-rehearsal.test.js @@ -0,0 +1,57 @@ +import assert from 'node:assert/strict'; +import test from 'node:test'; + +import { + V42_LOCAL_STAGING_MVP_REHEARSAL_ARTIFACT_PATH, + V42_LOCAL_STAGING_MVP_REHEARSAL_LANE_IDS, + V42_LOCAL_STAGING_MVP_REHEARSAL_ROW_IDS, + V42_LOCAL_STAGING_MVP_REHEARSAL_SCHEMA_ID, + V42_LOCAL_STAGING_MVP_REHEARSAL_STAGE_IDS, + buildV42LocalStagingMvpRehearsal, +} from '../src/canonical/v42-local-staging-mvp-rehearsal.js'; + +test('V42 local/staging MVP rehearsal artifact is source-safe and complete', () => { + const artifact = buildV42LocalStagingMvpRehearsal(); + + assert.equal(V42_LOCAL_STAGING_MVP_REHEARSAL_ARTIFACT_PATH, '.bitcode/v42-local-staging-mvp-rehearsal.json'); + assert.equal(artifact.artifactId, 'v42-local-staging-mvp-rehearsal'); + assert.equal(artifact.schemaId, V42_LOCAL_STAGING_MVP_REHEARSAL_SCHEMA_ID); + assert.equal(artifact.version, 'V42'); + assert.equal(artifact.currentTarget, 'V41'); + assert.deepEqual(artifact.laneIds, [...V42_LOCAL_STAGING_MVP_REHEARSAL_LANE_IDS]); + assert.deepEqual(artifact.stageIds, [...V42_LOCAL_STAGING_MVP_REHEARSAL_STAGE_IDS]); + assert.deepEqual(artifact.rowIds, [...V42_LOCAL_STAGING_MVP_REHEARSAL_ROW_IDS]); + assert.equal(artifact.coverage.rowCount, 14); + assert.equal(artifact.coverage.laneCount, 2); + assert.equal(artifact.coverage.stageCount, 7); + assert.equal(artifact.coverage.gateArtifactCount, 6); + assert.equal(artifact.coverage.stagingProjectRef, 'tkpyosihuouusyaxtbau'); + assert.equal(artifact.coverage.stagingRestHost, 'https://tkpyosihuouusyaxtbau.supabase.co/rest/v1/'); + assert.equal(artifact.coverage.depositingCovered, true); + assert.equal(artifact.coverage.readRequestCovered, true); + assert.equal(artifact.coverage.readNeedReviewCovered, true); + assert.equal(artifact.coverage.readFitsFindingCovered, true); + assert.equal(artifact.coverage.manyCandidateDepositorySearchCovered, true); + assert.equal(artifact.coverage.sourceSafePreviewQuoteCovered, true); + assert.equal(artifact.coverage.settlementRightsDeliveryCovered, true); + assert.equal(artifact.coverage.aiReadingDemonstrationCovered, true); + assert.equal(artifact.coverage.richTelemetryReadbackCovered, true); + assert.equal(artifact.coverage.databaseStreamReadbackCovered, true); + assert.equal(artifact.coverage.ledgerDatabaseStorageSynchronized, true); + assert.equal(artifact.coverage.postSettlementPullRequestDeliveryCovered, true); + assert.equal(artifact.coverage.operatorReceiptScriptCovered, true); + assert.equal(artifact.coverage.mainnetValueBearingBlocked, true); + assert.equal(artifact.coverage.sourceSafeMetadataOnly, true); + assert.equal(artifact.coverage.protectedSourcePayloadSerialized, false); + assert.equal(artifact.coverage.rawProtectedPromptVisible, false); + assert.equal(artifact.coverage.rawInterpolatedPromptVisible, false); + assert.equal(artifact.coverage.rawProviderResponseVisible, false); + assert.equal(artifact.coverage.unpaidAssetPackSourceVisible, false); + assert.equal(artifact.coverage.credentialsSerialized, false); + assert.equal(artifact.coverage.walletPrivateMaterialVisible, false); + assert.equal(artifact.coverage.privateSettlementPayloadVisible, false); + assert.equal(artifact.coverage.liveRehearsalLogPayloadSerialized, false); + assert.deepEqual(artifact.coverage.failedPredicateIds, []); + assert.equal(artifact.passed, true); + assert.match(artifact.artifactRoot, /^v42-local-staging-mvp-rehearsal:/u); +}); diff --git a/scripts/check-v42-gate8-local-staging-mvp-rehearsal.mjs b/scripts/check-v42-gate8-local-staging-mvp-rehearsal.mjs new file mode 100644 index 00000000..f8a0b479 --- /dev/null +++ b/scripts/check-v42-gate8-local-staging-mvp-rehearsal.mjs @@ -0,0 +1,281 @@ +#!/usr/bin/env node + +import { execFileSync } from 'node:child_process'; +import { existsSync, readFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const defaultRepoRoot = path.resolve(__dirname, '..'); +const ARTIFACT_PATH = '.bitcode/v42-local-staging-mvp-rehearsal.json'; + +const SECRET_MARKERS = [ + `${['sk', 'proj'].join('-')}-`, + `${['sb', 'secret'].join('_')}__`, + String.fromCharCode(101, 121, 74, 104, 98, 71, 99, 105, 79, 105, 74, 73, 85, 122, 73, 49, 78, 105), + ['OPENAI', 'API', 'KEY'].join('_'), + ['SUPABASE', 'SERVICE', 'ROLE'].join('_'), + ['VERCEL', 'TOKEN'].join('_'), + ['VERCEL', 'OIDC', 'TOKEN'].join('_'), + ['PRIVATE', 'KEY'].join('_'), +]; + +function parseArgs(argv) { + const args = { + repoRoot: defaultRepoRoot, + skipBranchCheck: false, + skipPackageTests: false, + skipUapiTests: false, + help: false, + }; + + for (let index = 0; index < argv.length; index += 1) { + const arg = argv[index]; + if (arg === '--repo-root') args.repoRoot = path.resolve(argv[++index]); + else if (arg === '--skip-branch-check') args.skipBranchCheck = true; + else if (arg === '--skip-package-tests') args.skipPackageTests = true; + else if (arg === '--skip-uapi-tests') args.skipUapiTests = true; + else if (arg === '--help' || arg === '-h') args.help = true; + else throw new Error(`Unknown argument ${arg}`); + } + + return args; +} + +function read(root, relativePath) { + return readFileSync(path.join(root, relativePath), 'utf8'); +} + +function fileExists(root, relativePath) { + return existsSync(path.join(root, relativePath)); +} + +function git(root, args) { + return execFileSync('git', args, { cwd: root, encoding: 'utf8' }).trim(); +} + +function run(root, command, args, options = {}) { + return execFileSync(command, args, { + cwd: root, + encoding: 'utf8', + stdio: ['ignore', 'pipe', 'pipe'], + ...options, + }).trim(); +} + +function commandExists(root, command) { + try { + execFileSync('sh', ['-lc', `command -v ${command}`], { + cwd: root, + encoding: 'utf8', + stdio: ['ignore', 'pipe', 'ignore'], + }); + return true; + } catch { + return false; + } +} + +function assertCheck(failures, condition, message) { + if (!condition) failures.push(message); +} + +function printHelp() { + process.stdout.write( + [ + 'Usage: node scripts/check-v42-gate8-local-staging-mvp-rehearsal.mjs [--skip-branch-check] [--skip-package-tests] [--skip-uapi-tests] [--repo-root ]', + '', + 'Checks V42 Gate 8 local/staging-testnet full MVP rehearsal artifact, source-safe operator receipts, package tests, docs, and workflow wiring.', + ].join('\n'), + ); + process.stdout.write('\n'); +} + +function parseJson(output, failures, label) { + try { + return JSON.parse(output); + } catch (error) { + failures.push(`${label} did not emit JSON: ${error.message}`); + return null; + } +} + +function runFocusedTests(root, failures, args) { + const commands = [ + ['node', ['--test', '--test-force-exit', 'packages/protocol/test/v42-local-staging-mvp-rehearsal.test.js']], + ]; + + if (!args.skipPackageTests && commandExists(root, 'pnpm')) { + commands.push( + ['pnpm', ['--filter', '@bitcode/pipeline-asset-pack', 'exec', 'jest', '--config', 'jest.config.cjs', '--runTestsByPath', 'src/__tests__/reading-local-staging-rehearsal.test.ts', '--runInBand', '--forceExit']], + ); + } + + if (!args.skipUapiTests && commandExists(root, 'pnpm')) { + commands.push( + ['pnpm', ['--dir', 'uapi', 'exec', 'jest', '--runTestsByPath', 'tests/api/pipelineHarnessPreflight.test.ts', 'tests/api/pipelineHarnessRoute.test.ts', '--runInBand']], + ); + } + + for (const [command, commandArgs] of commands) { + try { + run(root, command, commandArgs); + } catch (error) { + failures.push(`Gate 8 focused test failed for ${command} ${commandArgs.join(' ')}: ${error.stderr || error.message}`); + return; + } + } +} + +function main() { + const args = parseArgs(process.argv.slice(2)); + if (args.help) { + printHelp(); + return; + } + + const root = args.repoRoot; + const failures = []; + const pointer = read(root, 'BITCODE_SPEC.txt').trim(); + + assertCheck( + failures, + pointer === 'V41', + `BITCODE_SPEC.txt must remain V41 during V42 gate work. Observed ${pointer || 'empty'}.`, + ); + + if (!args.skipBranchCheck) { + const branch = git(root, ['branch', '--show-current']); + assertCheck( + failures, + branch === 'version/v42' || /^v42\/gate-(?:8|9)-[a-z0-9][a-z0-9-]*$/u.test(branch), + `V42 Gate 8+ work must occur on version/v42 or v42/gate-8..9-* branches. Observed ${branch || 'detached HEAD'}.`, + ); + } + + const requiredFiles = [ + ARTIFACT_PATH, + 'scripts/rehearse-v42-local-staging-mvp.mjs', + 'scripts/generate-v42-local-staging-mvp-rehearsal.mjs', + 'scripts/check-v42-gate8-local-staging-mvp-rehearsal.mjs', + 'packages/protocol/src/canonical/v42-local-staging-mvp-rehearsal.js', + 'packages/protocol/test/v42-local-staging-mvp-rehearsal.test.js', + 'packages/pipelines/asset-pack/src/reading-local-staging-rehearsal.ts', + 'packages/pipelines/asset-pack/src/__tests__/reading-local-staging-rehearsal.test.ts', + 'uapi/app/api/pipeline-harness/asset-pack/preflight.ts', + 'uapi/app/api/pipeline-harness/asset-pack/runner.ts', + 'uapi/components/base/bitcode/execution/pipeline-execution-log.tsx', + 'BITCODE_SPEC_V42.md', + 'BITCODE_SPEC_V42_DELTA.md', + 'BITCODE_SPEC_V42_NOTES.md', + 'BITCODE_SPEC_V42_PARITY_MATRIX.md', + 'SPECIFICATIONS_ROADMAP.md', + 'README.md', + 'packages/protocol/README.md', + 'packages/pipelines/asset-pack/README.md', + 'uapi/app/terminal/README.md', + 'package.json', + '.github/workflows/bitcode-gate-quality.yml', + '.github/workflows/bitcode-canon-quality.yml', + ]; + + for (const relativePath of requiredFiles) { + assertCheck(failures, fileExists(root, relativePath), `Missing V42 Gate 8 file: ${relativePath}`); + } + + if (failures.length === 0) { + try { + run(root, 'node', ['scripts/generate-v42-local-staging-mvp-rehearsal.mjs', '--check']); + } catch (error) { + failures.push(`V42 local/staging MVP rehearsal artifact check failed: ${error.stderr || error.message}`); + } + } + + let localReceipt = null; + let stagingReceipt = null; + if (failures.length === 0) { + const dryRunEnv = { + ...process.env, + OPENAI_API_KEY: `${['sk', 'proj'].join('-')}-dummy-do-not-serialize-000000000000`, + VERCEL_OIDC_TOKEN: 'oidc_dummy_do_not_serialize', + BITCODE_RUN_VERCEL_SANDBOX_HARNESS: '1', + BITCODE_ENABLE_PIPELINE_HARNESS_API: '1', + BITCODE_ASSET_PACK_REAL_INFERENCE: '1', + BITCODE_PIPELINE_STREAM_TO_DATABASE: '1', + SUPABASE_URL: 'https://tkpyosihuouusyaxtbau.supabase.co/rest/v1/', + SUPABASE_ANON_KEY: 'anon_dummy_do_not_serialize', + SUPABASE_SECRET_KEY: 'admin_dummy_do_not_serialize', + }; + const localOutput = run(root, 'node', ['scripts/rehearse-v42-local-staging-mvp.mjs', '--lane', 'local', '--dry-run', '--json'], { env: dryRunEnv }); + const stagingOutput = run(root, 'node', ['scripts/rehearse-v42-local-staging-mvp.mjs', '--lane', 'staging-testnet', '--dry-run', '--json'], { env: dryRunEnv }); + localReceipt = parseJson(localOutput, failures, 'local V42 rehearsal dry run'); + stagingReceipt = parseJson(stagingOutput, failures, 'staging-testnet V42 rehearsal dry run'); + + for (const marker of ['dummy-do-not-serialize', dryRunEnv.OPENAI_API_KEY, dryRunEnv.SUPABASE_SECRET_KEY, dryRunEnv.VERCEL_OIDC_TOKEN]) { + assertCheck(failures, !localOutput.includes(marker), `Local dry-run receipt must not serialize secret value ${marker}.`); + assertCheck(failures, !stagingOutput.includes(marker), `Staging dry-run receipt must not serialize secret value ${marker}.`); + } + } + + if (failures.length === 0) { + runFocusedTests(root, failures, args); + } + + const serializedArtifact = fileExists(root, ARTIFACT_PATH) ? read(root, ARTIFACT_PATH) : ''; + for (const marker of SECRET_MARKERS) { + assertCheck(failures, !serializedArtifact.includes(marker), `V42 Gate 8 artifact must not contain secret marker ${marker}.`); + } + + const artifact = serializedArtifact ? JSON.parse(serializedArtifact) : null; + if (artifact) { + assertCheck(failures, artifact.artifactId === 'v42-local-staging-mvp-rehearsal', 'Gate 8 artifactId must match.'); + assertCheck(failures, artifact.schemaId === 'bitcode.v42.localStagingMvpRehearsal.v1', 'Gate 8 schemaId must match.'); + assertCheck(failures, artifact.version === 'V42' && artifact.currentTarget === 'V41', 'Gate 8 artifact must bind V42 over active V41.'); + assertCheck(failures, artifact.passed === true, 'Gate 8 artifact must pass.'); + assertCheck(failures, artifact.coverage.rowCount === 14, 'Gate 8 must cover fourteen rehearsal rows.'); + assertCheck(failures, artifact.coverage.laneCount === 2, 'Gate 8 must cover local and staging-testnet lanes.'); + assertCheck(failures, artifact.coverage.stageCount === 7, 'Gate 8 must cover the complete MVP stage path.'); + assertCheck(failures, artifact.coverage.gateArtifactCount === 6, 'Gate 8 must bind Gates 2 through 7 artifacts.'); + assertCheck(failures, artifact.coverage.stagingProjectRef === 'tkpyosihuouusyaxtbau', 'Gate 8 must bind staging-testnet Supabase project.'); + assertCheck(failures, artifact.coverage.depositingCovered === true, 'Gate 8 must cover Depositing.'); + assertCheck(failures, artifact.coverage.readNeedReviewCovered === true, 'Gate 8 must cover ReadNeed review.'); + assertCheck(failures, artifact.coverage.readFitsFindingCovered === true, 'Gate 8 must cover Finding Fits.'); + assertCheck(failures, artifact.coverage.settlementRightsDeliveryCovered === true, 'Gate 8 must cover settlement rights and delivery.'); + assertCheck(failures, artifact.coverage.aiReadingDemonstrationCovered === true, 'Gate 8 must cover AI-reading demonstration proof.'); + assertCheck(failures, artifact.coverage.richTelemetryReadbackCovered === true, 'Gate 8 must cover rich telemetry readback.'); + assertCheck(failures, artifact.coverage.mainnetValueBearingBlocked === true, 'Gate 8 must block value-bearing mainnet.'); + assertCheck(failures, artifact.coverage.sourceSafeMetadataOnly === true, 'Gate 8 artifact must be source-safe metadata only.'); + assertCheck(failures, artifact.coverage.protectedSourcePayloadSerialized === false, 'Gate 8 artifact must not serialize protected source.'); + assertCheck(failures, artifact.coverage.unpaidAssetPackSourceVisible === false, 'Gate 8 artifact must not expose unpaid AssetPack source.'); + assertCheck(failures, artifact.coverage.credentialsSerialized === false, 'Gate 8 artifact must not serialize credentials.'); + assertCheck(failures, Array.isArray(artifact.coverage.failedPredicateIds) && artifact.coverage.failedPredicateIds.length === 0, 'Gate 8 predicates must all pass.'); + assertCheck(failures, artifact.sourceSafety.liveRehearsalLogPayloadSerialized === false, 'Gate 8 artifact must not serialize live rehearsal logs.'); + } + + if (localReceipt) { + assertCheck(failures, localReceipt.laneId === 'local', 'Local dry-run receipt must identify local lane.'); + assertCheck(failures, localReceipt.ready === true, 'Local dry-run receipt should be ready under dummy source-safe env.'); + assertCheck(failures, localReceipt.currentTarget === 'V41', 'Local dry-run receipt must bind V42 over active V41.'); + assertCheck(failures, localReceipt.sourceSafety.secretValueSerialized === false, 'Local receipt must not serialize secret values.'); + assertCheck(failures, localReceipt.sourceSafety.valueBearingMainnetAdmitted === false, 'Local receipt must block value-bearing mainnet.'); + } + if (stagingReceipt) { + assertCheck(failures, stagingReceipt.laneId === 'staging-testnet', 'Staging dry-run receipt must identify staging-testnet lane.'); + assertCheck(failures, stagingReceipt.ready === true, 'Staging dry-run receipt should be ready under dummy source-safe env.'); + assertCheck(failures, stagingReceipt.stagingProjectRef === 'tkpyosihuouusyaxtbau', 'Staging receipt must bind staging-testnet project ref.'); + assertCheck(failures, stagingReceipt.stagingRestHost === 'https://tkpyosihuouusyaxtbau.supabase.co/rest/v1/', 'Staging receipt must bind staging-testnet REST host.'); + assertCheck(failures, stagingReceipt.sourceSafety.secretValueSerialized === false, 'Staging receipt must not serialize secret values.'); + assertCheck(failures, stagingReceipt.sourceSafety.valueBearingMainnetAdmitted === false, 'Staging receipt must block value-bearing mainnet.'); + } + + if (failures.length > 0) { + process.stderr.write(`V42 Gate 8 local/staging MVP rehearsal check failed:\n- ${failures.join('\n- ')}\n`); + process.exitCode = 1; + return; + } + + process.stdout.write(`V42 Gate 8 local/staging MVP rehearsal ok artifact=${artifact.artifactRoot}\n`); +} + +main(); diff --git a/scripts/generate-v42-local-staging-mvp-rehearsal.mjs b/scripts/generate-v42-local-staging-mvp-rehearsal.mjs new file mode 100644 index 00000000..028ffffd --- /dev/null +++ b/scripts/generate-v42-local-staging-mvp-rehearsal.mjs @@ -0,0 +1,61 @@ +#!/usr/bin/env node + +import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { + V42_LOCAL_STAGING_MVP_REHEARSAL_ARTIFACT_PATH, + buildV42LocalStagingMvpRehearsal, +} from '../packages/protocol/src/canonical/v42-local-staging-mvp-rehearsal.js'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const defaultRepoRoot = path.resolve(__dirname, '..'); + +function parseArgs(argv) { + const args = { + repoRoot: defaultRepoRoot, + check: false, + }; + for (let index = 0; index < argv.length; index += 1) { + const arg = argv[index]; + if (arg === '--repo-root') args.repoRoot = path.resolve(argv[++index]); + else if (arg === '--check') args.check = true; + else if (arg === '--help' || arg === '-h') { + process.stdout.write( + 'Usage: node scripts/generate-v42-local-staging-mvp-rehearsal.mjs [--check] [--repo-root ]\n', + ); + process.exit(0); + } else { + throw new Error(`Unknown argument ${arg}`); + } + } + return args; +} + +const args = parseArgs(process.argv.slice(2)); +const artifact = buildV42LocalStagingMvpRehearsal({ repoRoot: args.repoRoot }); +const artifactPath = path.join(args.repoRoot, V42_LOCAL_STAGING_MVP_REHEARSAL_ARTIFACT_PATH); +const serialized = `${JSON.stringify(artifact, null, 2)}\n`; + +if (args.check) { + if (!existsSync(artifactPath)) { + process.stderr.write(`Missing ${V42_LOCAL_STAGING_MVP_REHEARSAL_ARTIFACT_PATH}\n`); + process.exit(1); + } + const current = readFileSync(artifactPath, 'utf8'); + if (current !== serialized) { + process.stderr.write(`${V42_LOCAL_STAGING_MVP_REHEARSAL_ARTIFACT_PATH} is stale. Run pnpm run generate:v42-local-staging-mvp-rehearsal.\n`); + process.exit(1); + } + if (!artifact.passed) { + process.stderr.write(`V42 local/staging MVP rehearsal artifact predicates failed: ${artifact.coverage.failedPredicateIds.join(', ')}\n`); + process.exit(1); + } + process.stdout.write(`V42 local/staging MVP rehearsal artifact ok ${artifact.artifactRoot}\n`); + process.exit(0); +} + +mkdirSync(path.dirname(artifactPath), { recursive: true }); +writeFileSync(artifactPath, serialized); +process.stdout.write(`Wrote ${V42_LOCAL_STAGING_MVP_REHEARSAL_ARTIFACT_PATH} ${artifact.artifactRoot}\n`); diff --git a/scripts/rehearse-v42-local-staging-mvp.mjs b/scripts/rehearse-v42-local-staging-mvp.mjs new file mode 100644 index 00000000..2516246b --- /dev/null +++ b/scripts/rehearse-v42-local-staging-mvp.mjs @@ -0,0 +1,325 @@ +#!/usr/bin/env node + +import { spawnSync } from 'node:child_process'; +import { createHash } from 'node:crypto'; +import { mkdirSync, writeFileSync } from 'node:fs'; +import path from 'node:path'; + +export const V42_REHEARSAL_LANES = ['local', 'staging-testnet']; + +const DEFAULT_RECEIPT_DIR = '.bitcode/pipeline-harness-runs/v42-mvp-rehearsal-receipts'; +const STAGING_PROJECT_REF = 'tkpyosihuouusyaxtbau'; +const STAGING_REST_HOST = 'https://tkpyosihuouusyaxtbau.supabase.co/rest/v1/'; + +const SOURCE_SAFETY = Object.freeze({ + sourceSafeMetadataOnly: true, + protectedSourcePayloadSerialized: false, + rawProtectedPromptVisible: false, + rawInterpolatedPromptVisible: false, + rawProviderResponseVisible: false, + unpaidAssetPackSourceVisible: false, + credentialsSerialized: false, + walletPrivateMaterialVisible: false, + privateSettlementPayloadVisible: false, + liveRehearsalLogPayloadSerialized: false, + valueBearingMainnetAdmitted: false, + secretValueSerialized: false, +}); + +const ENVIRONMENT_FAMILIES = Object.freeze({ + sandboxAuth: { + familyId: 'sandbox-auth', + required: true, + acceptedKeyNames: ['VERCEL_OIDC_TOKEN', 'VERCEL_TOKEN'], + posture: 'vercel-oidc-preferred-access-token-fallback', + }, + sandboxOptIn: { + familyId: 'sandbox-live-opt-in', + required: true, + acceptedKeyNames: ['BITCODE_RUN_VERCEL_SANDBOX_HARNESS'], + requiredLiteralValue: '1', + posture: 'explicit-live-sandbox-opt-in', + }, + harnessApi: { + familyId: 'pipeline-harness-api-enabled', + required: true, + acceptedKeyNames: ['BITCODE_ENABLE_PIPELINE_HARNESS_API'], + requiredLiteralValue: '1', + posture: 'local-and-staging-harness-api-enabled', + }, + llmProvider: { + familyId: 'llm-provider-key', + required: true, + acceptedKeyNames: ['OPENAI_API_KEY'], + posture: 'real-inference-provider-credential', + }, + supabaseUrl: { + familyId: 'supabase-rest-url', + required: true, + acceptedKeyNames: ['SUPABASE_URL', 'NEXT_PUBLIC_SUPABASE_URL'], + requiredHost: `${STAGING_PROJECT_REF}.supabase.co`, + posture: 'staging-testnet-rest-host-bound', + }, + supabasePublic: { + familyId: 'supabase-public-key', + required: true, + acceptedKeyNames: [ + 'SUPABASE_ANON_KEY', + 'SUPABASE_PUBLISHABLE_KEY', + 'NEXT_PUBLIC_SUPABASE_ANON_KEY', + 'NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY', + ], + posture: 'staging-testnet-public-readback-key', + }, + supabaseAdmin: { + familyId: 'supabase-admin-key', + required: true, + acceptedKeyNames: ['SUPABASE_SECRET_KEY', 'SUPABASE_ADMIN_KEY', 'SUPABASE_SERVICE_ROLE_KEY'], + posture: 'staging-testnet-admin-readback-key', + }, + databaseStreaming: { + familyId: 'pipeline-database-streaming', + required: true, + acceptedKeyNames: ['BITCODE_PIPELINE_STREAM_TO_DATABASE'], + requiredLiteralValue: '1', + posture: 'pipeline-events-persist-to-staging-database', + }, + realInference: { + familyId: 'assetpack-real-inference', + required: true, + acceptedKeyNames: ['BITCODE_ASSET_PACK_REAL_INFERENCE'], + requiredLiteralValue: '1', + posture: 'staging-testnet-real-inference-required', + }, +}); + +const LANE_REQUIREMENTS = Object.freeze({ + local: [ + ENVIRONMENT_FAMILIES.sandboxAuth, + ENVIRONMENT_FAMILIES.sandboxOptIn, + ENVIRONMENT_FAMILIES.harnessApi, + ], + 'staging-testnet': [ + ENVIRONMENT_FAMILIES.sandboxAuth, + ENVIRONMENT_FAMILIES.sandboxOptIn, + ENVIRONMENT_FAMILIES.harnessApi, + ENVIRONMENT_FAMILIES.llmProvider, + ENVIRONMENT_FAMILIES.supabaseUrl, + ENVIRONMENT_FAMILIES.supabasePublic, + ENVIRONMENT_FAMILIES.supabaseAdmin, + ENVIRONMENT_FAMILIES.databaseStreaming, + ENVIRONMENT_FAMILIES.realInference, + ], +}); + +function stableStringify(value) { + if (typeof value === 'undefined') return 'null'; + if (value === null || typeof value !== 'object') return JSON.stringify(value); + if (Array.isArray(value)) return `[${value.map((entry) => stableStringify(entry)).join(',')}]`; + return `{${Object.keys(value) + .sort() + .map((key) => `${JSON.stringify(key)}:${stableStringify(value[key])}`) + .join(',')}}`; +} + +function rootOf(value) { + return `sha256:${createHash('sha256').update(stableStringify(value)).digest('hex')}`; +} + +function parseArgs(argv) { + const args = { + lane: 'local', + dryRun: true, + execute: false, + json: false, + writeReceipt: false, + includeEnvKeyNames: false, + receiptDir: DEFAULT_RECEIPT_DIR, + }; + + for (let index = 0; index < argv.length; index += 1) { + const arg = argv[index]; + if (arg === '--lane') args.lane = argv[++index]; + else if (arg === '--dry-run') args.dryRun = true; + else if (arg === '--execute') { + args.execute = true; + args.dryRun = false; + } else if (arg === '--json') args.json = true; + else if (arg === '--write-receipt') args.writeReceipt = true; + else if (arg === '--include-env-key-names') args.includeEnvKeyNames = true; + else if (arg === '--receipt-dir') args.receiptDir = argv[++index]; + else if (arg === '--help' || arg === '-h') args.help = true; + else throw new Error(`Unknown argument ${arg}`); + } + + if (!V42_REHEARSAL_LANES.includes(args.lane)) { + throw new Error(`Unsupported V42 rehearsal lane ${args.lane}. Expected one of ${V42_REHEARSAL_LANES.join(', ')}.`); + } + + return args; +} + +function printHelp() { + process.stdout.write( + [ + 'Usage: node scripts/rehearse-v42-local-staging-mvp.mjs --lane [--dry-run|--execute] [--json] [--write-receipt]', + '', + 'Builds a source-safe operator receipt for the V42 local/staging-testnet full MVP rehearsal lane.', + 'Live execution requires BITCODE_V42_REHEARSAL_EXECUTE=1 and delegates to the Vercel Sandbox AssetPack harness.', + ].join('\n'), + ); + process.stdout.write('\n'); +} + +function hostFromUrl(value) { + if (!value) return null; + try { + return new URL(value).hostname; + } catch { + return null; + } +} + +function readEnvironmentFamily(family, env, includeEnvKeyNames) { + const observed = family.acceptedKeyNames + .map((keyName) => ({ + keyName, + present: typeof env[keyName] === 'string' && env[keyName].length > 0, + literalMatches: family.requiredLiteralValue ? env[keyName] === family.requiredLiteralValue : true, + hostMatches: family.requiredHost ? hostFromUrl(env[keyName]) === family.requiredHost : true, + })) + .filter((entry) => entry.present); + + const satisfied = observed.some((entry) => entry.literalMatches && entry.hostMatches); + return { + familyId: family.familyId, + required: family.required, + posture: family.posture, + present: observed.length > 0, + satisfied, + ...(family.requiredHost ? { requiredHost: family.requiredHost } : {}), + ...(family.requiredLiteralValue ? { requiredLiteralValuePresent: satisfied } : {}), + ...(includeEnvKeyNames + ? { acceptedKeyNames: family.acceptedKeyNames, observedKeyNames: observed.map((entry) => entry.keyName) } + : {}), + secretValueSerialized: false, + }; +} + +function buildReceipt(args, env = process.env) { + const families = LANE_REQUIREMENTS[args.lane].map((family) => + readEnvironmentFamily(family, env, args.includeEnvKeyNames), + ); + const missingEnvironmentFamilies = families + .filter((family) => family.required && !family.satisfied) + .map((family) => family.familyId); + const command = { + commandId: 'pipeline-hosts:qa-asset-pack-sandbox', + cwd: 'packages/pipeline-hosts', + argv: ['pnpm', '--filter', '@bitcode/pipeline-hosts', 'run', 'qa:asset-pack:sandbox'], + dryRun: args.dryRun, + liveExecutionOptInRequired: true, + liveExecutionOptInSatisfied: env.BITCODE_V42_REHEARSAL_EXECUTE === '1', + }; + const withoutRoot = { + schema: 'bitcode.v42.localStagingMvpRehearsal.operatorReceipt', + version: 'V42', + currentTarget: 'V41', + laneId: args.lane, + laneClass: args.lane === 'staging-testnet' ? 'staging-testnet-real-inference-full-mvp' : 'local-full-mvp-rehearsal', + stagingProjectRef: args.lane === 'staging-testnet' ? STAGING_PROJECT_REF : null, + stagingRestHost: args.lane === 'staging-testnet' ? STAGING_REST_HOST : null, + generatedAt: 'operator-runtime', + ready: missingEnvironmentFamilies.length === 0, + dryRun: args.dryRun, + stages: [ + 'deposit-source', + 'request-read', + 'review-synthesized-need', + 'request-finding-fits', + 'review-assetpack-preview', + 'buy-assetpack-settle', + 'receive-repository-delivery', + ], + command, + environmentFamilies: families, + missingEnvironmentFamilies, + receiptArtifactRoot: DEFAULT_RECEIPT_DIR, + sourceSafety: SOURCE_SAFETY, + }; + + return { + ...withoutRoot, + receiptRoot: rootOf(withoutRoot), + }; +} + +function writeReceipt(receipt, receiptDir) { + mkdirSync(receiptDir, { recursive: true }); + const filename = `${receipt.version.toLowerCase()}-${receipt.laneId}-operator-receipt.json`; + const receiptPath = path.resolve(receiptDir, filename); + writeFileSync(receiptPath, `${JSON.stringify(receipt, null, 2)}\n`); + return receiptPath; +} + +function runLiveHarness(receipt) { + if (!receipt.ready) { + throw new Error(`Cannot execute V42 rehearsal; missing families: ${receipt.missingEnvironmentFamilies.join(', ')}`); + } + if (!receipt.command.liveExecutionOptInSatisfied) { + throw new Error('Set BITCODE_V42_REHEARSAL_EXECUTE=1 before live rehearsal execution.'); + } + + return spawnSync('pnpm', ['--filter', '@bitcode/pipeline-hosts', 'run', 'qa:asset-pack:sandbox'], { + stdio: 'inherit', + env: { + ...process.env, + BITCODE_SANDBOX_MODE: process.env.BITCODE_SANDBOX_MODE || 'asset_pack_pipeline', + BITCODE_PIPELINE_STREAM_TO_DATABASE: + receipt.laneId === 'staging-testnet' + ? '1' + : process.env.BITCODE_PIPELINE_STREAM_TO_DATABASE || '0', + BITCODE_ENABLE_PIPELINE_HARNESS_API: process.env.BITCODE_ENABLE_PIPELINE_HARNESS_API || '1', + }, + }); +} + +function main() { + const args = parseArgs(process.argv.slice(2)); + if (args.help) { + printHelp(); + return; + } + + const receipt = buildReceipt(args); + let receiptPath = null; + if (args.writeReceipt) { + receiptPath = writeReceipt(receipt, args.receiptDir); + } + + if (args.execute) { + const result = runLiveHarness(receipt); + if (result.status !== 0) process.exit(result.status || 1); + } + + if (args.json) { + process.stdout.write(`${JSON.stringify(receipt, null, 2)}\n`); + return; + } + + process.stdout.write( + [ + `V42 ${receipt.laneId} full MVP rehearsal receipt ${receipt.receiptRoot}`, + `ready=${receipt.ready}`, + receiptPath ? `receipt=${receiptPath}` : null, + receipt.missingEnvironmentFamilies.length + ? `missing=${receipt.missingEnvironmentFamilies.join(',')}` + : 'missing=none', + ] + .filter(Boolean) + .join(' '), + ); + process.stdout.write('\n'); +} + +main(); diff --git a/uapi/app/api/pipeline-harness/asset-pack/preflight.ts b/uapi/app/api/pipeline-harness/asset-pack/preflight.ts index 89b148f5..f5853315 100644 --- a/uapi/app/api/pipeline-harness/asset-pack/preflight.ts +++ b/uapi/app/api/pipeline-harness/asset-pack/preflight.ts @@ -8,6 +8,9 @@ export type PipelineHarnessPreflightBody = { type PipelineHarnessRuntimeEnv = Record; +const STAGING_TESTNET_SUPABASE_PROJECT_REF = 'tkpyosihuouusyaxtbau'; +const STAGING_TESTNET_SUPABASE_REST_HOST = `${STAGING_TESTNET_SUPABASE_PROJECT_REF}.supabase.co`; + const SUPABASE_ADMIN_CREDENTIAL_KEYS = [ 'SUPABASE_SECRET_KEY', 'SUPABASE_ADMIN_KEY', @@ -214,6 +217,9 @@ export function summarizeHarnessPreflight( supabaseUrlProvided: isUsableSupabaseUrl(supabaseUrl), supabaseHost, supabaseDbHost, + stagingTestnetProjectRef: STAGING_TESTNET_SUPABASE_PROJECT_REF, + stagingTestnetSupabaseHostMatched: + normalizeSupabaseHost(supabaseHost) === STAGING_TESTNET_SUPABASE_REST_HOST, supabaseRestDbHostAligned: !normalizedSupabaseHost || !normalizedSupabaseDbHost || diff --git a/uapi/app/terminal/README.md b/uapi/app/terminal/README.md index 7c0ea178..20c75c41 100644 --- a/uapi/app/terminal/README.md +++ b/uapi/app/terminal/README.md @@ -148,6 +148,19 @@ credentials, raw protected prompts, or raw provider responses. The source-safe proof artifact is `.bitcode/v42-settlement-rights-delivery.json`, checked by `pnpm run check:v42-gate6`. +V42 Gate 8 closes local/staging full MVP rehearsal readback for Terminal. +The route remains `/terminal` during V42, but the proof now binds the whole +MVP chain: deposit source, request read, review synthesized Need, request +Finding Fits, review source-safe AssetPack preview and quote, buy/settle, +receive repository delivery, and inspect rich stream telemetry/database +readback. The source-safe proof artifact is +`.bitcode/v42-local-staging-mvp-rehearsal.json`, checked by +`pnpm run check:v42-gate8`. Generated rehearsal data may carry lane ids, +stage ids, roots, staging-testnet project `tkpyosihuouusyaxtbau`, and repair +posture; it must not carry protected source, unpaid AssetPack source, raw +prompts, provider responses, credentials, wallet private material, private +settlement payloads, or live logs. + ## Live staging-testnet QA Terminal Deposit/Read QA starts only after Wallet and Externals prerequisites are diff --git a/uapi/app/terminal/TerminalDepositReadWorkbench.tsx b/uapi/app/terminal/TerminalDepositReadWorkbench.tsx index 3ab4a2f7..8e65ae43 100644 --- a/uapi/app/terminal/TerminalDepositReadWorkbench.tsx +++ b/uapi/app/terminal/TerminalDepositReadWorkbench.tsx @@ -358,6 +358,10 @@ export default function TerminalDepositReadWorkbench({ objectValue(assetPackSettlementRightsDeliveryBoundary?.reconciliationReport) || objectValue(completedHarnessEvidence?.assetPackLedgerDatabaseStorageReconciliation); const assetPackSettlementProofRoots = objectValue(assetPackSettlementRightsDeliveryBoundary?.proofRoots); + const readingLocalStagingRehearsal = objectValue(completedHarnessEvidence?.readingLocalStagingRehearsal); + const readingLocalStagingCoverage = objectValue(readingLocalStagingRehearsal?.coverage); + const readingLocalStagingProofRoots = objectValue(readingLocalStagingRehearsal?.proofRoots); + const readingLocalStagingStageReadback = objectValue(readingLocalStagingRehearsal?.stageReadback); const previewFeeQuote = assetPackQuoteReceipt || objectValue(sourceSafePreview?.feeQuote); @@ -638,6 +642,64 @@ export default function TerminalDepositReadWorkbench({ assetPackSettlementRightsDeliveryBoundary, ], ); + const readingLocalStagingRehearsalRows = useMemo( + () => [ + { + label: 'Rehearsal', + value: shortIdentifier(readingLocalStagingRehearsal?.rehearsalId) || 'pending', + }, + { + label: 'Run', + value: shortIdentifier(readingLocalStagingRehearsal?.runId) || textValue(readingLocalStagingRehearsal?.runId) || 'pending', + }, + { + label: 'Lanes', + value: stringList(readingLocalStagingRehearsal?.lanes).join(', ') || 'pending', + }, + { + label: 'Stages complete', + value: `${Object.values(readingLocalStagingStageReadback || {}).filter((status) => status === 'completed').length}/${String(countList(readingLocalStagingRehearsal?.stageIds) || 0)}`, + }, + { + label: 'Staging', + value: textValue(readingLocalStagingCoverage?.stagingProjectRef) || 'pending', + }, + { + label: 'Many fits', + value: readingLocalStagingCoverage?.depositoryManyFitsCovered === true ? 'covered' : 'pending', + }, + { + label: 'Telemetry', + value: readingLocalStagingCoverage?.telemetryStreamingReadbackCovered === true ? 'readback covered' : 'pending', + }, + { + label: 'Sync', + value: readingLocalStagingCoverage?.ledgerDatabaseStorageSynchronized === true ? 'aligned' : 'pending', + }, + { + label: 'Delivery', + value: readingLocalStagingCoverage?.postSettlementPullRequestDeliveryCovered === true ? 'post-settlement PR' : 'pending', + }, + { + label: 'Mainnet', + value: readingLocalStagingCoverage?.valueBearingMainnetAdmitted === false ? 'blocked' : 'pending', + }, + { + label: 'Root', + value: shortIdentifier(readingLocalStagingProofRoots?.rehearsalRoot) || 'pending', + }, + { + label: 'Rows', + value: String(countList(readingLocalStagingRehearsal?.rows) || 'pending'), + }, + ], + [ + readingLocalStagingCoverage, + readingLocalStagingProofRoots?.rehearsalRoot, + readingLocalStagingRehearsal, + readingLocalStagingStageReadback, + ], + ); const readNeedRows = useMemo(() => { if (!currentReadNeed) return []; return [ @@ -1229,6 +1291,19 @@ export default function TerminalDepositReadWorkbench({ ))} +
+ + Local/staging MVP rehearsal + +
+ {readingLocalStagingRehearsalRows.map((row) => ( +
+
{row.label}
+
{row.value}
+
+ ))} +
+
From a6200bdd60d5bca04cabf549b730b2db78e7cce9 Mon Sep 17 00:00:00 2001 From: Garrett Maring Date: Thu, 28 May 2026 20:45:01 -0300 Subject: [PATCH 10/35] V42 Gate 9: Close promotion readiness Adds the V42 promotion readiness report, generator, checker, canon-promotion workflow, package exports, PROVEN generator support, and promotion dry-run wiring. Updates V42 spec/docs/roadmap with Gate 9 closure and defers the /packs, /deposit, and /read route cleanup into V43+ planning. Tightens canonical-input artifact inventory for V41/V42 so demonstration promotion tests match current generated artifact requirements. --- .bitcode/v42-promotion-readiness-report.json | 528 ++++++++++++++++++ .github/workflows/bitcode-canon-quality.yml | 11 + .github/workflows/bitcode-gate-quality.yml | 11 + .github/workflows/v42-canon-promotion.yml | 126 +++++ BITCODE_SPEC_V42.md | 15 + BITCODE_SPEC_V42_DELTA.md | 9 + BITCODE_SPEC_V42_NOTES.md | 6 + BITCODE_SPEC_V42_PARITY_MATRIX.md | 15 +- README.md | 17 + SPECIFICATIONS_ROADMAP.md | 5 +- package.json | 3 + packages/protocol/README.md | 14 + .../src/canonical/proven-generator.js | 203 +++++++ .../protocol/src/canonical/v21-specifying.js | 18 + .../v42-local-staging-mvp-rehearsal.js | 8 +- .../v42-promotion-readiness-report.js | 425 ++++++++++++++ packages/protocol/src/index.d.ts | 9 + packages/protocol/src/index.js | 11 + .../test/v42-promotion-readiness.test.js | 81 +++ .../test/v21-specifying.test.js | 2 + .../check-v42-gate9-promotion-readiness.mjs | 355 ++++++++++++ ...enerate-v42-promotion-readiness-report.mjs | 69 +++ .../prepare-bitcode-spec-family-promotion.mjs | 33 +- scripts/promote-bitcode-canon.mjs | 115 +++- 24 files changed, 2077 insertions(+), 12 deletions(-) create mode 100644 .bitcode/v42-promotion-readiness-report.json create mode 100644 .github/workflows/v42-canon-promotion.yml create mode 100644 packages/protocol/src/canonical/v42-promotion-readiness-report.js create mode 100644 packages/protocol/test/v42-promotion-readiness.test.js create mode 100644 scripts/check-v42-gate9-promotion-readiness.mjs create mode 100644 scripts/generate-v42-promotion-readiness-report.mjs diff --git a/.bitcode/v42-promotion-readiness-report.json b/.bitcode/v42-promotion-readiness-report.json new file mode 100644 index 00000000..d9861fa6 --- /dev/null +++ b/.bitcode/v42-promotion-readiness-report.json @@ -0,0 +1,528 @@ +{ + "artifactId": "v42-promotion-readiness-report", + "schemaId": "bitcode.v42.promotionReadinessReport.v1", + "version": "V42", + "currentTarget": "V41", + "generatedAt": "2026-05-25T00:00:00.000Z", + "sourceSafetyVerdict": "source-safe-v42-reliable-mvp-promotion-readiness-metadata", + "prePromotionPosture": "V41 active / V42 draft", + "postPromotionPosture": "V42 active / V43 draft", + "branchProtection": { + "directMainPushAdmitted": false, + "promotionPrRequired": true, + "versionBranch": "version/v42", + "versionPromotionPullRequestTitlePrefix": "V42 Canonical Promotion" + }, + "generatedArtifactPolicy": { + "provenAppendixPath": "BITCODE_SPEC_V42_PROVEN.md", + "provenAppendixRequiredBeforePromotion": false, + "generatedArtifactPrefix": ".bitcode/v42-", + "promotionOverwritesPreviewArtifacts": true, + "secretValuesSerialized": false, + "protectedSourceSerialized": false, + "rawProtectedPromptSerialized": false, + "rawProviderResponseSerialized": false, + "unpaidAssetPackSourceSerialized": false + }, + "validationCommands": [ + "pnpm run check:v42-gate1", + "pnpm run check:v42-gate2", + "pnpm run check:v42-gate3", + "pnpm run check:v42-gate4", + "pnpm run check:v42-gate5", + "pnpm run check:v42-gate6", + "pnpm run check:v42-gate7", + "pnpm run check:v42-gate8", + "pnpm run check:v42-gate9", + "node scripts/promote-bitcode-canon.mjs --version V42 --commit HEAD --dry-run" + ], + "gateArtifactEvidence": [ + { + "relativePath": ".bitcode/v42-depositing-shortest-path.json", + "present": true, + "parseable": true, + "digest": "sha256:47789f07f6d8e296d91894f15ce8141787af0502863136db843d0926be8e4208", + "byteLength": 18418, + "sourceSafe": true, + "artifactId": "v42-depositing-shortest-path", + "version": "V42", + "sourceSafetyVerdict": "source-safe-depositing-compensation-visibility-metadata" + }, + { + "relativePath": ".bitcode/v42-reading-shortest-path-state-machine.json", + "present": true, + "parseable": true, + "digest": "sha256:e28bdaf56522fc4fa94291aa244f5e1e0caea5b90292edff392d9973c68778f5", + "byteLength": 21834, + "sourceSafe": true, + "artifactId": "v42-reading-shortest-path-state-machine", + "version": "V42", + "sourceSafetyVerdict": "source-safe-reading-shortest-path-state-machine-metadata" + }, + { + "relativePath": ".bitcode/v42-readneed-review-resynthesis-product-closure.json", + "present": true, + "parseable": true, + "digest": "sha256:cac716231b2760c686a0f826157fad8aecf5c24f74b8c9dde18b1d8b3e86e44e", + "byteLength": 24945, + "sourceSafe": true, + "artifactId": "v42-readneed-review-resynthesis-product-closure", + "version": "V42", + "sourceSafetyVerdict": "source-safe-readneed-review-resynthesis-product-closure-metadata" + }, + { + "relativePath": ".bitcode/v42-readfitsfinding-preview-quote.json", + "present": true, + "parseable": true, + "digest": "sha256:fcd5e8576c4185cdc57566f096c3e05dc42689a8a509a9071704de1d03ee894a", + "byteLength": 26476, + "sourceSafe": true, + "artifactId": "v42-readfitsfinding-preview-quote", + "version": "V42", + "sourceSafetyVerdict": "source-safe-readfitsfinding-preview-quote-metadata" + }, + { + "relativePath": ".bitcode/v42-settlement-rights-delivery.json", + "present": true, + "parseable": true, + "digest": "sha256:a22f645d435af37bdfaac87ba890cc07cd1fd1e773d903ff20a21782ca437541", + "byteLength": 22514, + "sourceSafe": true, + "artifactId": "v42-settlement-rights-delivery", + "version": "V42", + "sourceSafetyVerdict": "source-safe-v42-settlement-rights-delivery-metadata" + }, + { + "relativePath": ".bitcode/v42-ai-reading-demonstration.json", + "present": true, + "parseable": true, + "digest": "sha256:1e1c69e6b7aa3ad2da7ff49595b228b33fab301c907cb75d43bbfe628735583c", + "byteLength": 14824, + "sourceSafe": true, + "artifactId": "v42-ai-reading-demonstration", + "version": "V42", + "sourceSafetyVerdict": "source-safe-v42-ai-reading-demonstration-metadata" + }, + { + "relativePath": ".bitcode/v42-local-staging-mvp-rehearsal.json", + "present": true, + "parseable": true, + "digest": "sha256:1a7fc667adfd6cc6035c1bcc317afdaeb29e7a97493cabc1ca8898f0b3f6fb0b", + "byteLength": 31120, + "sourceSafe": true, + "artifactId": "v42-local-staging-mvp-rehearsal", + "version": "V42", + "sourceSafetyVerdict": "source-safe-v42-local-staging-mvp-rehearsal-metadata" + } + ], + "sourceEvidence": [ + { + "relativePath": "scripts/check-v42-gate9-promotion-readiness.mjs", + "present": true, + "digest": "sha256:b40eb3ce42c1a432c4875d0d949751f54d3df1cc1702770223bf43d971790599", + "requiredTokens": [ + { + "token": "V42 Gate 9 promotion readiness", + "present": true + }, + { + "token": "--promotion-mode", + "present": true + }, + { + "token": "promotedPointer", + "present": true + }, + { + "token": ".bitcode/v42-promotion-readiness-report.json", + "present": true + } + ] + }, + { + "relativePath": "scripts/generate-v42-promotion-readiness-report.mjs", + "present": true, + "digest": "sha256:2b4d907e0a58c13a0c50e512948c13583150c6750c36640cdbfbfb2ead37c018", + "requiredTokens": [ + { + "token": "buildV42PromotionReadinessReport", + "present": true + }, + { + "token": "source-safe-v42-reliable-mvp-promotion-readiness-metadata", + "present": true + }, + { + "token": "v42-promotion-readiness-report", + "present": true + } + ] + }, + { + "relativePath": "scripts/promote-bitcode-canon.mjs", + "present": true, + "digest": "sha256:86b5710625636bea2490c8e695a51b65a8ba4e5b06f964afd89a32e6f4abaecc", + "requiredTokens": [ + { + "token": "if (version === 'V42')", + "present": true + }, + { + "token": "const v42Gate9Command", + "present": true + }, + { + "token": "buildDerivedV42CommitMessageBody", + "present": true + }, + { + "token": "scripts/check-v42-gate9-promotion-readiness.mjs", + "present": true + } + ] + }, + { + "relativePath": "scripts/prepare-bitcode-spec-family-promotion.mjs", + "present": true, + "digest": "sha256:0833b887c37181f4ecf21e0dec32aaad7b2cb09632167ffe291581238d37e765", + "requiredTokens": [ + { + "token": "if (version === 'V42')", + "present": true + }, + { + "token": "V42 canonical system specification for reliable MVP experience", + "present": true + }, + { + "token": "BITCODE_SPEC_V42_PROVEN.md", + "present": true + }, + { + "token": ".bitcode/v42-promotion-readiness-report.json", + "present": true + } + ] + }, + { + "relativePath": "scripts/prepare-bitcode-runtime-canon-promotion.mjs", + "present": true, + "digest": "sha256:77b598b0257d7dc2aef367531126f0d8ef1238d1264a78c1e876c624909b4511", + "requiredTokens": [ + { + "token": "--next-draft", + "present": true + }, + { + "token": "rewritePackageReadme", + "present": true + }, + { + "token": "rewriteRuntimeDataState", + "present": true + } + ] + }, + { + "relativePath": ".github/workflows/v42-canon-promotion.yml", + "present": true, + "digest": "sha256:e07c93e8c27c6c60d0d8557776bf2f7ffd95d3c6040733432371b02661d381b7", + "requiredTokens": [ + { + "token": "head.ref == 'version/v42'", + "present": true + }, + { + "token": "npm run promote:canon -- --version V42", + "present": true + }, + { + "token": "BITCODE_SPEC_V42_PROVEN.md", + "present": true + }, + { + "token": "Promote V42 canon files", + "present": true + } + ] + }, + { + "relativePath": ".github/workflows/bitcode-gate-quality.yml", + "present": true, + "digest": "sha256:339a0bf2f790a3ee1ef407b13d639f26299b55edea05eb35485fed829db105be", + "requiredTokens": [ + { + "token": "check-v42-gate9-promotion-readiness.mjs", + "present": true + }, + { + "token": "elif [ \"$POINTER\" = \"V42\" ]", + "present": true + }, + { + "token": "--active-canon V42 --draft-target V43", + "present": true + } + ] + }, + { + "relativePath": ".github/workflows/bitcode-canon-quality.yml", + "present": true, + "digest": "sha256:4106ffdf430eddd3724943e1f51a09ed8f449a728cf92c1705c489d83fd3c8f9", + "requiredTokens": [ + { + "token": "check-v42-gate9-promotion-readiness.mjs", + "present": true + }, + { + "token": "elif [ \"$POINTER\" = \"V42\" ]", + "present": true + }, + { + "token": "--active-canon V42 --draft-target V43", + "present": true + } + ] + }, + { + "relativePath": "packages/protocol/src/canonical/proven-generator.js", + "present": true, + "digest": "sha256:2f6b8aa94f03c2980338239e94311fe9c3cbbef4b973665298bae9a6185e694c", + "requiredTokens": [ + { + "token": "buildV42ProvenPackage", + "present": true + }, + { + "token": "buildV42PromotionReadinessReport", + "present": true + }, + { + "token": ".bitcode/v42-promotion-readiness-report.json", + "present": true + } + ] + }, + { + "relativePath": "packages/protocol/test/v42-promotion-readiness.test.js", + "present": true, + "digest": "sha256:8fa01fe49ec144161f74a10279eb2df764f7a4f912c2491f40d68b8296fec59c", + "requiredTokens": [ + { + "token": "builds source-safe V42 PromotionReadinessReport", + "present": true + }, + { + "token": "v42-promotion-readiness-report", + "present": true + }, + { + "token": "V42 Promotion Readiness", + "present": true + } + ] + }, + { + "relativePath": "packages/protocol/src/canonical/v21-specifying.js", + "present": true, + "digest": "sha256:c906d3607592026d02af6774b9c0e43b3c83496aa7925153daaf9e78127f5cf3", + "requiredTokens": [ + { + "token": ".bitcode/v42-promotion-readiness-report.json", + "present": true + } + ] + }, + { + "relativePath": "package.json", + "present": true, + "digest": "sha256:e3c32fb568c706664d267eacd8d636685be5090f148b4318d3442f34225dc94a", + "requiredTokens": [ + { + "token": "generate:v42-promotion-readiness", + "present": true + }, + { + "token": "check:v42-promotion-readiness", + "present": true + }, + { + "token": "check:v42-gate9", + "present": true + } + ] + } + ], + "documentationEvidence": [ + { + "relativePath": "BITCODE_SPEC_V42.md", + "present": true, + "digest": "sha256:d1da646d934a930d3d075994a9a7cd92227f07247e8abc0c7d5913af8d5a6d85", + "requiredTokens": [ + { + "token": "V42 promotion readiness canon", + "present": true + }, + { + "token": ".bitcode/v42-promotion-readiness-report.json", + "present": true + }, + { + "token": "V42 active / draft V43", + "present": true + } + ] + }, + { + "relativePath": "BITCODE_SPEC_V42_DELTA.md", + "present": true, + "digest": "sha256:b21778a0e3b368efa1f332c0e51cfb339a0872dda1b177c1b5f48a2a76cb0342", + "requiredTokens": [ + { + "token": "Gate 9: V42 Promotion Readiness", + "present": true + }, + { + "token": ".bitcode/v42-promotion-readiness-report.json", + "present": true + }, + { + "token": "promotion scripts support V42", + "present": true + } + ] + }, + { + "relativePath": "BITCODE_SPEC_V42_NOTES.md", + "present": true, + "digest": "sha256:c7fce37381e201a0c7de84d23fbb5d4f7026d8733ac7680ac2c76995f235fc81", + "requiredTokens": [ + { + "token": "Gate 9: V42 Promotion Readiness", + "present": true + }, + { + "token": ".bitcode/v42-promotion-readiness-report.json", + "present": true + }, + { + "token": "active V42 / draft V43", + "present": true + } + ] + }, + { + "relativePath": "BITCODE_SPEC_V42_PARITY_MATRIX.md", + "present": true, + "digest": "sha256:38d6de8e3b161c46116a80e2f9561c5efd1d306ef44907b1c70a7dc26693f069", + "requiredTokens": [ + { + "token": "## Gate 9 Promotion readiness parity", + "present": true + }, + { + "token": ".bitcode/v42-promotion-readiness-report.json", + "present": true + }, + { + "token": "closed", + "present": true + } + ] + }, + { + "relativePath": "SPECIFICATIONS_ROADMAP.md", + "present": true, + "digest": "sha256:fb1bf2e34a1a4b2ac522e2aab074523516bd1af5b76cf54685bc124d9c06044d", + "requiredTokens": [ + { + "token": "V42 Gate 9 closure anchor", + "present": true + }, + { + "token": "BITCODE_SPEC_V42_PROVEN.md", + "present": true + } + ] + }, + { + "relativePath": "README.md", + "present": true, + "digest": "sha256:db680c49b739d5b9ae93e3552c9f6648d66409a9eccb7708a47efb2c0e7b18a3", + "requiredTokens": [ + { + "token": "check:v42-gate9", + "present": true + }, + { + "token": "v42-canon-promotion.yml", + "present": true + } + ] + }, + { + "relativePath": "packages/protocol/README.md", + "present": true, + "digest": "sha256:54ce4e59d73af7dcc75adabd54b0adaa0727cb7c432eac3a0500af8c728c658a", + "requiredTokens": [ + { + "token": "V42 Gate 9", + "present": true + }, + { + "token": "V42` active, `V43` draft", + "present": true + } + ] + } + ], + "coverage": { + "requiredGateArtifactPaths": [ + ".bitcode/v42-depositing-shortest-path.json", + ".bitcode/v42-reading-shortest-path-state-machine.json", + ".bitcode/v42-readneed-review-resynthesis-product-closure.json", + ".bitcode/v42-readfitsfinding-preview-quote.json", + ".bitcode/v42-settlement-rights-delivery.json", + ".bitcode/v42-ai-reading-demonstration.json", + ".bitcode/v42-local-staging-mvp-rehearsal.json" + ], + "generatedProofOutputs": [ + "BITCODE_SPEC_V42_PROVEN.md", + ".bitcode/v42-spec-family-report.json", + ".bitcode/v42-canonical-input-report.json", + ".bitcode/v42-canon-posture-drift-report.json", + ".bitcode/v42-promotion-readiness-report.json" + ], + "gateArtifactCount": 7, + "missingGateArtifacts": [], + "unparseableGateArtifacts": [], + "sourceUnsafeGateArtifacts": [], + "sourceEvidenceComplete": true, + "documentationEvidenceComplete": true, + "allGateArtifactsCovered": true, + "allGateArtifactsParseable": true, + "allGateArtifactsSourceSafe": true, + "generatedProofOutputsCovered": true, + "promotionWorkflowCovered": true, + "gateQualityWorkflowCovered": true, + "canonQualityWorkflowCovered": true, + "promotionScriptCovered": true, + "specFamilyPromotionScriptCovered": true, + "runtimePromotionScriptCovered": true, + "provenGeneratorCovered": true, + "prePromotionPosture": "V41 active / V42 draft", + "postPromotionPosture": "V42 active / V43 draft", + "valueBearingMainnetAdmission": false, + "credentialsSerialized": false, + "protectedSourceVisible": false, + "rawProtectedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "walletPrivateMaterialVisible": false + }, + "failClosedResult": "promotion remains blocked when any V42 Depositing shortest path, Reading shortest path state machine, ReadNeed review/resynthesis closure, ReadFitsFinding preview and quote closure, settlement rights delivery boundary, AI-reading demonstration, local/staging-testnet rehearsal, workflow, promotion script, generated proof support, source-safety check, or value-bearing mainnet block is missing", + "artifactRoot": "reliable-mvp-promotion-readiness-report:7228ddb56b71d4e5bd710bfa", + "passed": true, + "failures": [], + "validationCommand": "pnpm run check:v42-gate9" +} diff --git a/.github/workflows/bitcode-canon-quality.yml b/.github/workflows/bitcode-canon-quality.yml index 9cf83b3b..18ced47a 100644 --- a/.github/workflows/bitcode-canon-quality.yml +++ b/.github/workflows/bitcode-canon-quality.yml @@ -316,6 +316,17 @@ jobs: if [ -f scripts/check-v42-gate8-local-staging-mvp-rehearsal.mjs ]; then node scripts/check-v42-gate8-local-staging-mvp-rehearsal.mjs --skip-branch-check --skip-package-tests --skip-uapi-tests fi + if [ -f scripts/check-v42-gate9-promotion-readiness.mjs ]; then + node scripts/check-v42-gate9-promotion-readiness.mjs --promotion-mode --skip-branch-check --skip-package-tests + fi + fi + elif [ "$POINTER" = "V42" ]; then + node scripts/check-bitcode-spec-family.mjs --version V42 --mode promoted --current-target V42 + node scripts/check-bitcode-canonical-inputs.mjs --current-target V42 + node scripts/check-bitcode-canon-posture-drift.mjs --active-canon V42 --draft-target V43 + node scripts/check-v42-gate9-promotion-readiness.mjs --promotion-mode --skip-branch-check --skip-package-tests + if [ -f BITCODE_SPEC_V43.md ]; then + node scripts/check-bitcode-spec-family.mjs --version V43 --mode draft --current-target V42 fi else echo "Unexpected BITCODE_SPEC.txt pointer: $POINTER" >&2 diff --git a/.github/workflows/bitcode-gate-quality.yml b/.github/workflows/bitcode-gate-quality.yml index c4fafb75..0eb00112 100644 --- a/.github/workflows/bitcode-gate-quality.yml +++ b/.github/workflows/bitcode-gate-quality.yml @@ -445,6 +445,17 @@ jobs: if [ -f scripts/check-v42-gate8-local-staging-mvp-rehearsal.mjs ]; then node scripts/check-v42-gate8-local-staging-mvp-rehearsal.mjs --skip-branch-check --skip-package-tests --skip-uapi-tests fi + if [ -f scripts/check-v42-gate9-promotion-readiness.mjs ]; then + node scripts/check-v42-gate9-promotion-readiness.mjs --promotion-mode --skip-branch-check --skip-package-tests + fi + fi + elif [ "$POINTER" = "V42" ]; then + node scripts/check-bitcode-spec-family.mjs --version V42 --mode promoted --current-target V42 + node scripts/check-bitcode-canonical-inputs.mjs --current-target V42 + node scripts/check-bitcode-canon-posture-drift.mjs --active-canon V42 --draft-target V43 + node scripts/check-v42-gate9-promotion-readiness.mjs --promotion-mode --skip-branch-check --skip-package-tests + if [ -f BITCODE_SPEC_V43.md ]; then + node scripts/check-bitcode-spec-family.mjs --version V43 --mode draft --current-target V42 fi else echo "Unexpected BITCODE_SPEC.txt pointer: $POINTER" >&2 diff --git a/.github/workflows/v42-canon-promotion.yml b/.github/workflows/v42-canon-promotion.yml new file mode 100644 index 00000000..9793429f --- /dev/null +++ b/.github/workflows/v42-canon-promotion.yml @@ -0,0 +1,126 @@ +name: V42 Canon Promotion + +on: + pull_request: + branches: + - main + types: + - opened + - synchronize + - reopened + - ready_for_review + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +permissions: + contents: write + pull-requests: read + +jobs: + promote-v42: + name: V42 Promotion Validation + if: >- + ${{ + github.event_name == 'workflow_dispatch' || + ( + github.event.pull_request.base.ref == 'main' && + github.event.pull_request.head.ref == 'version/v42' && + github.event.pull_request.head.repo.full_name == github.repository + ) + }} + runs-on: ubuntu-latest + timeout-minutes: 30 + + steps: + - name: Checkout version branch + uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.ref || github.ref_name }} + token: ${{ github.token }} + fetch-depth: 0 + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: "24" + cache: pnpm + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Validate V42 promotion readiness + run: | + POINTER="$(cat BITCODE_SPEC.txt)" + if [ "$POINTER" = "V41" ]; then + node scripts/check-bitcode-spec-family.mjs --version V42 --mode draft --current-target V41 + node scripts/check-bitcode-canon-posture-drift.mjs --active-canon V41 --draft-target V42 + node scripts/check-bitcode-canonical-inputs.mjs --current-target V41 + node scripts/check-v42-gate1-mvp-experience-roadmap-opening.mjs --skip-branch-check + node scripts/check-v42-gate2-depositing-shortest-path.mjs --skip-branch-check --skip-package-tests + node scripts/check-v42-gate3-reading-shortest-path-state-machine.mjs --skip-branch-check --skip-uapi-tests + node scripts/check-v42-gate4-readneed-review-resynthesis-product-closure.mjs --skip-branch-check --skip-package-tests --skip-uapi-tests + node scripts/check-v42-gate5-readfitsfinding-preview-quote.mjs --skip-branch-check --skip-package-tests --skip-uapi-tests + node scripts/check-v42-gate6-settlement-rights-delivery.mjs --skip-branch-check --skip-package-tests --skip-uapi-tests + node scripts/check-v42-gate7-ai-reading-demonstration.mjs --skip-branch-check --skip-package-tests --skip-demonstration-tests + node scripts/check-v42-gate8-local-staging-mvp-rehearsal.mjs --skip-branch-check --skip-package-tests --skip-uapi-tests + node scripts/check-v42-gate9-promotion-readiness.mjs --promotion-mode --skip-branch-check --skip-package-tests + node scripts/promote-bitcode-canon.mjs --version V42 --commit HEAD --dry-run + elif [ "$POINTER" = "V42" ]; then + node scripts/check-bitcode-spec-family.mjs --version V42 --mode promoted --current-target V42 + node scripts/check-bitcode-canonical-inputs.mjs --current-target V42 + node scripts/check-bitcode-canon-posture-drift.mjs --active-canon V42 --draft-target V43 + node scripts/check-v42-gate9-promotion-readiness.mjs --promotion-mode --skip-branch-check --skip-package-tests + else + echo "Unexpected BITCODE_SPEC.txt pointer: $POINTER" >&2 + exit 1 + fi + pnpm --filter @bitcode/protocol typecheck + pnpm --filter @bitcode/protocol test + pnpm --filter @bitcode/btd typecheck + pnpm --filter @bitcode/btd test + npm --prefix protocol-demonstration test + npm --prefix protocol-demonstration run test:v28-mvp-qa + pnpm --filter @bitcode/pipeline-asset-pack typecheck + pnpm --filter @bitcode/pipeline-hosts typecheck + pnpm --filter @bitcode/pipeline-asset-pack exec jest --config jest.config.cjs --passWithNoTests --forceExit + pnpm --filter @bitcode/pipeline-hosts exec jest --config jest.config.cjs --passWithNoTests --forceExit + git diff --check + + - name: Promote V42 canon files + if: >- + ${{ + github.event_name == 'pull_request' && + github.event.pull_request.head.ref == 'version/v42' + }} + env: + HEAD_BRANCH: ${{ github.event.pull_request.head.ref }} + run: | + if [ "$(cat BITCODE_SPEC.txt)" = "V42" ]; then + echo "BITCODE_SPEC.txt already points to V42." + exit 0 + fi + PROOF_SOURCE_COMMIT="$(git rev-parse HEAD)" + npm run promote:canon -- --version V42 --commit "$PROOF_SOURCE_COMMIT" + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add \ + BITCODE_SPEC.txt \ + BITCODE_SPEC_V42.md \ + BITCODE_SPEC_V42_DELTA.md \ + BITCODE_SPEC_V42_NOTES.md \ + BITCODE_SPEC_V42_PARITY_MATRIX.md \ + BITCODE_SPEC_V42_PROVEN.md \ + protocol-demonstration/src/canon-posture.js \ + protocol-demonstration/README.md \ + packages/protocol/src/canon-posture.js \ + packages/protocol/data/state.json \ + packages/protocol/README.md \ + .bitcode + git commit -m "Promote Bitcode canon to V42" + git push origin "HEAD:$HEAD_BRANCH" diff --git a/BITCODE_SPEC_V42.md b/BITCODE_SPEC_V42.md index 77fd49f1..c93fefdf 100644 --- a/BITCODE_SPEC_V42.md +++ b/BITCODE_SPEC_V42.md @@ -72,6 +72,19 @@ Non-goals: Design principles: shortest credible path, source-safe preview, proof-on-expand, purchase-before-source, depositor compensation visibility, AI-reading demonstration value, and production-hardening through tests. +## V43+ route vocabulary and pack activity cleanup + +V42 proves the current MVP path before route vocabulary is renamed. +The next product cleanup must remove the transitional Terminal/Exchange posture from the core experience. +`/terminal` should split into `/deposit` and `/read`, and `/exchange` should become `/packs` across route names, component prefixes, tests, docs, and operator vocabulary. +`/packs` is the searchable master-detail activity surface for all pack activity: deposited AssetPack options, admitted Depository AssetPacks, Finding Fits previews, settled Need-Fit AssetPacks, quotes, rights transfers, compensation posture, repository delivery, proofs, and repair states. +Its master view must support column sorting, filtering, and search over measurements, synthesized AssetPack titles and descriptions, values, activity or transaction type, settlement state, compensation state, and proof roots. +Its detail view exposes the selected activity's source-safe proof, telemetry, ledger/database/storage synchronization, and expandable metadata. +`/deposit` should let enterprises connect source, instruct or accept Bitcode's proposed deposit AssetPack options, review source-safe measurements and likely demand/ROI posture, and approve or reject Depository admission. +`/read` should own the shortest Reading path from Read Request through reviewed Need, Finding Fits, preview, settlement, and delivery. +AssetPacks become the in/out simplification: Depositing creates AssetPacks for the Depository, and Reading buys synthesized Need-Fit AssetPacks. +Outside public documentation, product UX must not rely on self-referential explanatory copy; route structure, progressive detail, labels, and reusable rich components must make core behavior self-explanatory while preserving power-user inspection depth. + ## V42 system architecture and layer boundaries V42 acts through existing layers: @@ -180,6 +193,8 @@ The validating command is `pnpm run check:v42-gate8`. Gate 9 closes V42 promotion readiness. It must bind every V42 artifact, test, workflow, generated proof support, promotion command, active V42 / draft V43 runtime preparation, source-safe generated appendix output, and value-bearing mainnet blocking where relevant. It closes only when V42 can be promoted as the reliable MVP experience canon. +The V42 promotion readiness canon is the generated artifact `.bitcode/v42-promotion-readiness-report.json`, the `BITCODE_SPEC_V42_PROVEN.md` generation path, `.github/workflows/v42-canon-promotion.yml`, package scripts, and promotion dry-run support. +The accepted post-promotion posture is V42 active / draft V43, with value-bearing mainnet still blocked unless a later promoted canon admits it. ## V42 canonical subsystem surfaces diff --git a/BITCODE_SPEC_V42_DELTA.md b/BITCODE_SPEC_V42_DELTA.md index 2e337fd3..decddf8d 100644 --- a/BITCODE_SPEC_V42_DELTA.md +++ b/BITCODE_SPEC_V42_DELTA.md @@ -73,6 +73,10 @@ The rehearsal artifact is metadata only and does not serialize secrets, protecte ### Gate 9: V42 Promotion Readiness Bind every V42 product artifact, workflow, generated proof, promotion command, source-safety result, and active V42 / draft V43 runtime posture. +Gate 9 now closes through `.bitcode/v42-promotion-readiness-report.json`. +The report proves all V42 gate artifacts are covered, parseable, source-safe, workflow-bound, generated-proof-bound, and blocked from value-bearing mainnet admission. +The promotion scripts support V42 through `scripts/promote-bitcode-canon.mjs`, `scripts/prepare-bitcode-spec-family-promotion.mjs`, `scripts/prepare-bitcode-runtime-canon-promotion.mjs`, and `.github/workflows/v42-canon-promotion.yml`. +After promotion, the maintained runtime posture is V42 active / draft V43. ## Explicitly deferred @@ -80,6 +84,11 @@ Bind every V42 product artifact, workflow, generated proof, promotion command, s - `/terminal` is not split into `/read` and `/deposit` during V42. - `/exchange` is not renamed to `/packs` during V42. - V43+ must take the route-vocabulary cleanup seriously: `/packs` replaces Exchange as the searchable master-detail activity route, including route names, component prefixes, tests, docs, and product vocabulary, while `/read` and `/deposit` become the short core paths for buying and selling AssetPacks. +- `/packs` must cover all pack activity, including deposited AssetPack options, Depository admission, Finding Fits previews, settled Need-Fit AssetPacks, quotes, rights transfers, compensation posture, delivery, proofs, and repair. +- `/packs` master view must support column sorting, filtering, and search over measurements, synthesized AssetPack titles and descriptions, values, activity or transaction type, settlement posture, compensation state, and proof roots; the detail view must expose selected source-safe activity data with expandable telemetry, ledger, database, storage, and proof metadata. +- `/deposit` must evolve beyond manual admission into an agentic connected-repository flow where Bitcode proposes source-safe deposit AssetPack options from enterprise code, depositor instructions, Depository state, and Reading demand; enterprises review measurements, likely demand, likely positive ROI, and sub-criticality before approval. +- `/read` must own the shortest Reading path without requiring the old Terminal cockpit as the default experience. +- Outside public documentation, product copy should not compensate for unclear flows with self-referential explanations; V43+ UX should use route structure, concise labels, progressive disclosure, and rich reusable themed components to make core behavior legible. - Production-mainnet value-bearing operation remains blocked unless a later promoted canon explicitly admits it. - V42 Gate 1 does not change route behavior, pipeline behavior, settlement behavior, or demonstration behavior. diff --git a/BITCODE_SPEC_V42_NOTES.md b/BITCODE_SPEC_V42_NOTES.md index 8ed5d07e..68f0efc7 100644 --- a/BITCODE_SPEC_V42_NOTES.md +++ b/BITCODE_SPEC_V42_NOTES.md @@ -92,6 +92,12 @@ The rehearsal binds `ReadingLocalStagingRehearsal`, Vercel Sandbox operator rece It is intentionally source-safe metadata only: secrets, protected source, raw protected prompts, raw interpolated prompts, raw provider responses, unpaid AssetPack source, wallet private material, private settlement payloads, and live rehearsal logs remain outside tracked artifacts. Gate 8 does not implement the V43+ route vocabulary, but it keeps the future product shape visible: `/read`, `/deposit`, and `/packs` remain the next route cleanup once V42 proves the current MVP path. +## Gate 9: V42 Promotion Readiness + +Gate 9 records the V42 promotion-readiness closure state. +The generated artifact `.bitcode/v42-promotion-readiness-report.json` binds every V42 product proof from Gates 2 through 8, the V42 promotion workflow, generated proof appendix support, promotion dry-run support, source-safety checks, and value-bearing mainnet blocking. +The intended post-promotion runtime posture is active V42 / draft V43, so V43 can start from the reliable MVP experience canon and focus on the next product vocabulary and deposit-side evolution. + ## V43+ agentic depositing roadmap note V43 or a later explicitly opened version should evolve the deposit side into an agentic AssetPack option experience for enterprises. diff --git a/BITCODE_SPEC_V42_PARITY_MATRIX.md b/BITCODE_SPEC_V42_PARITY_MATRIX.md index 9e16088a..4de11a64 100644 --- a/BITCODE_SPEC_V42_PARITY_MATRIX.md +++ b/BITCODE_SPEC_V42_PARITY_MATRIX.md @@ -40,7 +40,7 @@ This matrix records the reliable MVP product surfaces that must become promotion | Settlement and delivery | BTC/BTD settlement, rights transfer, compensation, and repository PR delivery are synchronized | `.bitcode/v42-settlement-rights-delivery.json`, `AssetPackSettlementRightsDeliveryBoundary`, live harness settlement boundary, route summary, Terminal settlement readback | implemented | | AI-reading demonstration | Standalone demonstration proves AssetPack improves AI beyond public-data-only baseline | `.bitcode/v42-ai-reading-demonstration.json`, `protocol-demonstration/src/ai-reading-demonstration.js`, `test:v42-ai-reading-mvp` | implemented | | Local/staging rehearsal | Full MVP path rehearsed locally and in staging-testnet with mainnet blocked | `.bitcode/v42-local-staging-mvp-rehearsal.json`, `ReadingLocalStagingRehearsal`, `rehearse:v42-local-staging`, `check:v42-gate8` | implemented | -| Promotion readiness | V42 proof and workflow promotion ready | later V42 Gate 9 artifact | draft-required | +| Promotion readiness | V42 proof and workflow promotion ready | `.bitcode/v42-promotion-readiness-report.json`, `BITCODE_SPEC_V42_PROVEN.md`, `.github/workflows/v42-canon-promotion.yml`, `check:v42-gate9` | closed | ## V42 implementation checklist @@ -54,7 +54,17 @@ This matrix records the reliable MVP product surfaces that must become promotion | Gate 6 | Settlement rights transfer and repository delivery closure artifact | implemented | | Gate 7 | AI-reading dominant demonstration MVP artifact | implemented | | Gate 8 | Local and staging-testnet full MVP rehearsal artifact | implemented | -| Gate 9 | Promotion readiness artifact and workflow | draft-required | +| Gate 9 | Promotion readiness artifact and workflow | closed | + +## Gate 9 Promotion readiness parity + +| Area | Closure evidence | Judgment | +| --- | --- | --- | +| V42 gate artifacts | Gates 2 through 8 generated artifacts are covered, parseable, and source-safe | closed | +| Promotion workflow | `.github/workflows/v42-canon-promotion.yml` validates V42 before canon promotion and prepares the V42 active / V43 draft posture | closed | +| Promotion scripts | `scripts/promote-bitcode-canon.mjs`, `scripts/prepare-bitcode-spec-family-promotion.mjs`, and runtime canon promotion support V42 | closed | +| Generated proof appendix | `BITCODE_SPEC_V42_PROVEN.md` generation includes `.bitcode/v42-promotion-readiness-report.json` | closed | +| Value-bearing mainnet | V42 promotion readiness keeps value-bearing mainnet blocked | closed | ## V42 accepted boundaries @@ -64,6 +74,7 @@ It may not implement route, pipeline, settlement, or demonstration behavior. V42 later gates may implement product behavior only if source-safe disclosure, Need review, BTD/BTC settlement, depositor compensation, repository delivery, telemetry, and generated proof obligations are represented in tests and artifacts. V42 may not split `/terminal` into `/read` and `/deposit`, and may not rename `/exchange` to `/packs`; those are V43+ roadmap items unless explicitly reopened. +The V43+ parity target is stricter than a route rename: `/packs` must become the searchable master-detail activity route for AssetPacks in and out, `/deposit` must propose and admit reviewable deposit AssetPack options from connected source and Bitcode demand, `/read` must own the Reading purchase path, and product UX outside public documentation must be self-explanatory without self-referential copy. ## V42 completion condition diff --git a/README.md b/README.md index 4c434781..2b35ed1b 100644 --- a/README.md +++ b/README.md @@ -147,6 +147,14 @@ verify AI-reading uplift. The staging lane is bound to Supabase project serialize secrets, protected source, raw prompts, provider responses, unpaid AssetPack source, wallet private material, private settlement payloads, or live rehearsal logs. +V42 Gate 9 adds promotion readiness with `buildV42PromotionReadinessReport`, +`.bitcode/v42-promotion-readiness-report.json`, +`BITCODE_SPEC_V42_PROVEN.md`, `.github/workflows/v42-canon-promotion.yml`, +`generate:v42-promotion-readiness`, `check:v42-promotion-readiness`, and +`check:v42-gate9`. +The report binds every V42 product artifact, workflow posture, promotion +script, generated proof path, source-safety result, value-bearing mainnet +block, and post-promotion V42 active / draft V43 runtime preparation. V43+ is roadmapped as the later agentic depositing evolution: repository agents synthesize deposit AssetPack options from connected enterprise code, Depository state, and Reading demand; enterprises approve or reject @@ -158,6 +166,15 @@ That future route model treats AssetPacks as the product object in and out: `/read` buys synthesized Need-Fit AssetPacks, and `/packs` becomes the searchable master-detail activity surface for pack measurements, values, settlement posture, compensation, delivery, proofs, and repair. +The `/packs` master view should sort, filter, and search over measurements, +synthesized AssetPack titles and descriptions, values, activity or transaction +type, settlement posture, compensation state, and proof roots, while its detail +view exposes source-safe activity data, telemetry, ledger/database/storage +synchronization, and expandable proof metadata. +That later UX cleanup should remove self-referential product copy outside +public docs and make Depositing, Reading, and Pack activity understandable +through route structure, concise labels, progressive disclosure, and rich +themed reusable components. Exchange is inherited V36 canon: market-wide activity master-detail, buy/sell/ bid/ask/cancel/accept/settle/history flows, AssetPack range trading, diff --git a/SPECIFICATIONS_ROADMAP.md b/SPECIFICATIONS_ROADMAP.md index 08d6297f..ff782696 100644 --- a/SPECIFICATIONS_ROADMAP.md +++ b/SPECIFICATIONS_ROADMAP.md @@ -5,8 +5,8 @@ - Current active canonical pointer: `BITCODE_SPEC.txt` -> `V41` - Current active canon: `BITCODE_SPEC_V41.md` - Current draft target: `BITCODE_SPEC_V42.md`. -- Current working gate: V42 Gate 8 Local And Staging-Testnet Full MVP Rehearsal. -- Next queued gate after V42 Gate 8: V42 Gate 9 Promotion Readiness. +- Current working gate: V42 Gate 9 Promotion Readiness. +- Next queued work after V42 Gate 9: V42 canonical promotion pull request into `main`. - Latest closed version: V41 Prompt And PromptPart Excellence, which promoted PromptPart and Prompt inventory, registry interpolation contracts, Reading prompt baselines, ReadNeedComprehensionSynthesis prompt hardening, ReadFitsFindingSynthesis prompt hardening, Conversation/tool/interface prompt rewrite, prompt benchmark telemetry, and V41 promotion readiness. - Recent V42 opening anchor: reliable MVP experience opens over promoted V41 with V42 SPEC, DELTA, NOTES, and PARITY files, `check:v42-gate1`, active V41 / draft V42 posture, and a nine-gate plan for shortest-path Depositing, five-step Reading, ReadNeed product closure, ReadFitsFinding preview and quote closure, settlement and repository delivery, AI-reading demonstration, local/staging rehearsal, and promotion readiness. - V42 Gate 2 closure anchor: reliable MVP experience now owns source-safe Depositing compensation visibility through `DepositorySupplyCompensationPreview`, deposit route `depositoryEvidence.compensationPreview`, deterministic `.bitcode/v42-depositing-shortest-path.json`, route/API readiness checks, source validation, Depository search/vector/storage projection, source-to-shares compensation readback keys, Terminal compensation roots, focused package/protocol tests, workflow wiring, and `check:v42-gate2`. @@ -16,6 +16,7 @@ - V42 Gate 6 closure anchor: reliable MVP experience now owns settlement rights transfer and repository delivery closure through `AssetPackSettlementRightsDeliveryBoundary`, BTC payment observation/finality, BTD read and rights transfer receipts, source-to-shares compensation conservation, delivery unlock, ledger/database/object-storage reconciliation, live harness materialization, route settlement summaries, Terminal settlement rights readback, deterministic `.bitcode/v42-settlement-rights-delivery.json`, focused package/host/route/protocol tests, workflow wiring, and `check:v42-gate6`. - V42 Gate 7 closure anchor: reliable MVP experience now owns AI-reading demonstration proof through `protocol-demonstration/src/ai-reading-demonstration.js`, public-data-only baseline scoring, reviewed local ReadNeed synthesis, local Depository Finding Fits selection, source-safe AssetPack preview, AssetPack-enhanced AI-reading answer scoring, deterministic benchmark uplift, `.bitcode/v42-ai-reading-demonstration.json`, focused demonstration/protocol tests, workflow wiring, and `check:v42-gate7`. - V42 Gate 8 closure anchor: reliable MVP experience now owns local/staging-testnet full MVP rehearsal proof through `ReadingLocalStagingRehearsal`, source-safe V42 operator receipts, staging-testnet Supabase project `tkpyosihuouusyaxtbau`, Gates 2 through 7 generated artifact binding, deposit source, request read, review synthesized Need, request Finding Fits, review source-safe AssetPack preview and quote, buy/settle, receive repository delivery, rich telemetry/database readback, ledger/database/storage reconciliation, blocked value-bearing mainnet, deterministic `.bitcode/v42-local-staging-mvp-rehearsal.json`, focused package/protocol/UAPI checks, workflow wiring, and `check:v42-gate8`. +- V42 Gate 9 closure anchor: reliable MVP experience now owns package-backed `V42PromotionReadinessReport`, deterministic `.bitcode/v42-promotion-readiness-report.json`, `BITCODE_SPEC_V42_PROVEN.md` generation support, `v42-canon-promotion.yml`, promotion command dry-run support, gate/canon workflow posture, active V42 / draft V43 runtime preparation, all V42 reliable MVP artifacts covered, source-safe, parseable, and workflow-bound, and value-bearing mainnet admission blocked through `check:v42-gate9`. - Recent V41 closure anchor: V41 canonical promotion updated `BITCODE_SPEC.txt` to `V41`, generated `BITCODE_SPEC_V41_PROVEN.md`, preserved active V41 / draft V42 runtime posture, and closed prompt-program excellence canon. - Recent V40 closure anchor: V40 canonical promotion updated `BITCODE_SPEC.txt` to `V40`, generated `BITCODE_SPEC_V40_PROVEN.md`, preserved active V40 / draft V41 runtime posture, and closed exhaustive commercial application testing canon. - Recent V39 closure anchor: V39 canonical promotion updated `BITCODE_SPEC.txt` to `V39`, generated `BITCODE_SPEC_V39_PROVEN.md`, preserved active V39 / draft V40 runtime posture, and closed commercial Reading readiness canon. diff --git a/package.json b/package.json index e90ed01f..343947f5 100644 --- a/package.json +++ b/package.json @@ -326,6 +326,9 @@ "generate:v42-local-staging-mvp-rehearsal": "node scripts/generate-v42-local-staging-mvp-rehearsal.mjs", "check:v42-local-staging-mvp-rehearsal": "node scripts/generate-v42-local-staging-mvp-rehearsal.mjs --check", "check:v42-gate8": "node scripts/check-v42-gate8-local-staging-mvp-rehearsal.mjs", + "generate:v42-promotion-readiness": "node scripts/generate-v42-promotion-readiness-report.mjs", + "check:v42-promotion-readiness": "node scripts/generate-v42-promotion-readiness-report.mjs --check", + "check:v42-gate9": "node scripts/check-v42-gate9-promotion-readiness.mjs", "generate:v38-inference-surface-inventory": "node scripts/generate-v38-inference-surface-inventory.mjs", "check:v38-inference-surface-inventory": "node scripts/generate-v38-inference-surface-inventory.mjs --check", "check:v38-gate2": "node scripts/check-v38-gate2-inference-surface-inventory.mjs", diff --git a/packages/protocol/README.md b/packages/protocol/README.md index b7d1dbc9..9e9d6889 100644 --- a/packages/protocol/README.md +++ b/packages/protocol/README.md @@ -62,6 +62,7 @@ Current exported commercial helpers include: - `V42SettlementRightsDelivery` helpers for V42 source-safe BTC payment observation, finality gating, source-to-shares compensation, BTD read-right transfer, repository delivery unlock, ledger/database/object-storage reconciliation, Terminal readback, and source-safe paid-boundary proof; - `V42AiReadingDemonstration` helpers for V42 source-safe AI-reading demonstration proof: public-data-only baseline, reviewed local Need, local Finding Fits, source-safe AssetPack preview, AssetPack-enhanced AI answer, deterministic benchmark uplift, self-contained demonstration boundary, and workflow wiring; - `V42LocalStagingMvpRehearsal` helpers for V42 source-safe local/staging-testnet full MVP rehearsal proof across Depositing, Reading, Finding Fits, preview/quote, settlement, BTD rights transfer, repository delivery, AI-reading uplift, telemetry/database readback, operator receipts, and blocked value-bearing mainnet; +- `V42PromotionReadinessReport` helpers for V42 source-safe promotion readiness across all V42 reliable MVP artifacts, generated proof support, workflow posture, promotion dry-run support, value-bearing mainnet blocking, and `V42` active, `V43` draft runtime preparation; - canonical proven-generation helpers; - the package app/server context used by commercial interfaces. @@ -260,6 +261,19 @@ local/staging full MVP rehearsal: deposit source, request read, review synthesized Need, request Finding Fits, review source-safe AssetPack preview and quote, buy/settle, receive repository delivery, inspect telemetry/database readback, and keep value-bearing mainnet blocked. +V42 Gate 9 adds `V42PromotionReadinessReport` through +`packages/protocol/src/canonical/v42-promotion-readiness-report.js`, +`packages/protocol/test/v42-promotion-readiness.test.js`, +`.bitcode/v42-promotion-readiness-report.json`, +`generate:v42-promotion-readiness`, `check:v42-promotion-readiness`, and +`check:v42-gate9`. +The report closes the reliable MVP promotion path by binding all V42 gate +artifacts, `BITCODE_SPEC_V42_PROVEN.md`, `v42-canon-promotion.yml`, +promotion scripts, runtime canon rewriting, dry-run promotion, source-safety, +value-bearing mainnet blocking, and the `V42` active, `V43` draft posture +without serializing protected source, credentials, private settlement payloads, +wallet material, raw protected prompts, raw provider responses, or unpaid +AssetPack source. V40 Gate 2 adds `V40TestInventoryCoverageMatrix` through `packages/protocol/src/canonical/v40-test-inventory-coverage-matrix.js`, `packages/protocol/test/v40-test-inventory-coverage-matrix.test.js`, diff --git a/packages/protocol/src/canonical/proven-generator.js b/packages/protocol/src/canonical/proven-generator.js index a7d32db4..3fab1d93 100644 --- a/packages/protocol/src/canonical/proven-generator.js +++ b/packages/protocol/src/canonical/proven-generator.js @@ -45,6 +45,7 @@ import { buildV38InferencePromotionReadinessReport } from './inference-promotion import { buildV39CommercialReadingPromotionReadinessReport } from './v39-commercial-reading-promotion-readiness-report.js'; import { buildV40PromotionReadinessReport as buildV40PromotionReadinessReportArtifact } from './v40-promotion-readiness-report.js'; import { buildV41PromotionReadinessReport as buildV41PromotionReadinessReportArtifact } from './v41-promotion-readiness-report.js'; +import { buildV42PromotionReadinessReport as buildV42PromotionReadinessReportArtifact } from './v42-promotion-readiness-report.js'; export const DEFAULT_PROVEN_BRANCH_MODES = ['patch', 'context']; export const DEFAULT_V23_PROVEN_PAYMENT_MODES = [...BITCOIN_PAYMENT_MODES]; @@ -66,6 +67,7 @@ const V38_PROMOTION_READINESS_ARTIFACT_PATH = '.bitcode/v38-promotion-readiness- const V39_PROMOTION_READINESS_ARTIFACT_PATH = '.bitcode/v39-promotion-readiness-report.json'; const V40_PROMOTION_READINESS_ARTIFACT_PATH = '.bitcode/v40-promotion-readiness-report.json'; const V41_PROMOTION_READINESS_ARTIFACT_PATH = '.bitcode/v41-promotion-readiness-report.json'; +const V42_PROMOTION_READINESS_ARTIFACT_PATH = '.bitcode/v42-promotion-readiness-report.json'; /** * @param {string} version @@ -6234,6 +6236,27 @@ export function renderCanonicalProvenMarkdown(data) { )); lines.push(''); } + if (data.v42) { + const { v42 } = data; + lines.push('## V42 Promotion Readiness'); + lines.push(''); + lines.push(`- reportId: ${markdownCode(v42.promotionReadinessReport.reportId || v42.promotionReadinessReport.artifactId)}`); + lines.push(`- sourceSafe: ${markdownCode(String(v42.promotionReadinessReport.sourceSafe === true))}`); + lines.push(`- passed: ${markdownCode(String(v42.promotionReadinessReport.passed === true))}`); + lines.push(`- failureCount: ${markdownCode(String(v42.promotionReadinessReport.failures.length))}`); + lines.push(`- prePromotionPosture: ${markdownCode(v42.promotionReadinessReport.prePromotionPosture)}`); + lines.push(`- postPromotionPosture: ${markdownCode(v42.promotionReadinessReport.postPromotionPosture)}`); + lines.push(''); + lines.push(renderMarkdownTable( + ['artifactPath', 'digest', 'byteLength'], + (v42.artifactSummaries || []).map((/** @type {any} */ artifact) => [ + markdownCode(artifact.artifactPath), + markdownCode(artifact.digest), + artifact.byteLength + ]) + )); + lines.push(''); + } if (v20) { lines.push('## V20 Operator Quality Reports'); lines.push(''); @@ -10706,6 +10729,134 @@ function buildV41ProvenPackage(baseData, { }; } +/** + * @param {{ + * generatedAt: string, + * baseData: ReturnType + * }} input + */ +function buildV42PromotionReadinessReport({ generatedAt, baseData }) { + const report = buildV42PromotionReadinessReportArtifact({ + generatedAt, + repoRoot: REPO_ROOT + }); + return { + reportId: report.artifactId, + ...report, + proofSourceCommit: baseData.canonicalCommit, + generatorId: baseData.generatorId, + worktreeState: baseData.worktreeState, + sourceSafe: report.sourceSafetyVerdict === 'source-safe-v42-reliable-mvp-promotion-readiness-metadata' + }; +} + +/** + * @param {any} baseData + * @param {{ + * generatedAt: string, + * inheritedV19: any, + * inheritedV20: any + * }} input + */ +function buildV42ProvenPackage(baseData, { + generatedAt, + inheritedV19, + inheritedV20 +}) { + const draftPreview = ACTIVE_CANON_VERSION !== 'V42'; + const specFamilyReport = buildV21SpecFamilyReport({ + version: 'V42', + mode: draftPreview ? 'draft' : 'promoted', + ...(draftPreview ? { currentTarget: ACTIVE_CANON_VERSION } : { currentTarget: 'V42' }) + }); + const assumedArtifactPaths = [ + 'BITCODE_SPEC_V42_PROVEN.md', + '.bitcode/v42-spec-family-report.json', + '.bitcode/v42-canonical-input-report.json', + '.bitcode/v42-canon-posture-drift-report.json', + '.bitcode/v42-depositing-shortest-path.json', + '.bitcode/v42-reading-shortest-path-state-machine.json', + '.bitcode/v42-readneed-review-resynthesis-product-closure.json', + '.bitcode/v42-readfitsfinding-preview-quote.json', + '.bitcode/v42-settlement-rights-delivery.json', + '.bitcode/v42-ai-reading-demonstration.json', + '.bitcode/v42-local-staging-mvp-rehearsal.json', + V42_PROMOTION_READINESS_ARTIFACT_PATH + ]; + const canonicalInputReport = buildV21CanonicalInputReport({ + currentTarget: 'V42', + reportVersion: 'V42', + ...(draftPreview + ? { + skipPointerCheck: true, + assumeExistingRelativePaths: assumedArtifactPaths + } + : { assumeExistingRelativePaths: assumedArtifactPaths }) + }); + const canonPostureDriftReport = buildCanonPostureDriftReport({ + version: 'V42', + activeCanonVersion: draftPreview ? ACTIVE_CANON_VERSION : 'V42', + draftTargetVersion: draftPreview ? 'V42' : 'V43', + proofSourceCommit: baseData.canonicalCommit, + generatedAt, + generatorId: baseData.generatorId, + worktreeState: baseData.worktreeState + }); + const promotionReadinessReport = buildV42PromotionReadinessReport({ + generatedAt, + baseData + }); + const artifacts = { + ...buildCanonPostureGeneratedArtifactContents({ + version: 'V42', + proofSourceCommit: baseData.canonicalCommit, + generatedAt, + generatorId: baseData.generatorId, + worktreeState: baseData.worktreeState, + specFamilyReport, + canonicalInputReport, + canonPostureDriftReport + }), + [V42_PROMOTION_READINESS_ARTIFACT_PATH]: `${JSON.stringify(promotionReadinessReport, null, 2)}\n` + }; + const artifactSummaries = summarizeArtifactContents(artifacts); + const promotionReady = specFamilyReport.passed === true + && canonicalInputReport.passed === true + && canonPostureDriftReport.passed === true + && promotionReadinessReport.passed === true; + const data = { + ...baseData, + v19: inheritedV19, + v20: inheritedV20, + v42: { + specFamilyReport, + canonicalInputReport, + canonPostureDriftReport, + promotionReadinessReport, + artifactSummaries, + draftPreview, + promotionReady, + activeCanonicalTarget: ACTIVE_CANON_VERSION, + nextDraftTarget: 'V43' + }, + aggregate: { + ...baseData.aggregate, + fullyProven: baseData.aggregate.fullyProven + && inheritedV19?.deterministicReplayReport?.passed === true + && inheritedV19?.volatilityInventory?.passed === true + && inheritedV19?.contractChangeLedger?.passed === true + && inheritedV20?.qualitySummary?.passed === true + && promotionReady + && specFamilyReport.mode === 'promoted' + } + }; + return { + data, + markdown: renderCanonicalProvenMarkdown(data), + artifacts + }; +} + /** * @param {{ * version: string, @@ -11746,6 +11897,58 @@ export function generateCanonicalProvenMarkdown({ finishGenerateProfile(); return v41Package; } + if (version === 'V42') { + const inheritedV19BaseData = buildBaseCanonicalProvenData({ + version: 'V19', + canonicalCommit, + canonicalCommitRecordedAt, + generatedAt, + worktreeState, + generatorId, + branchModes, + buildInitialStateFn, + runMakeBitcodeBranchFn, + ...(scenarioIds ? { scenarioIds } : {}) + }); + const inheritedV19Package = buildV19DeterministicProvenPackage(inheritedV19BaseData, { + version: 'V19', + canonicalCommit, + canonicalCommitRecordedAt, + generatedAt, + worktreeState, + generatorId, + branchModes, + buildInitialStateFn, + runMakeBitcodeBranchFn, + renderMarkdown: false, + ...(scenarioIds ? { scenarioIds } : {}) + }); + const inheritedV20BaseData = buildBaseCanonicalProvenData({ + version: 'V20', + canonicalCommit, + canonicalCommitRecordedAt, + generatedAt, + worktreeState, + generatorId, + branchModes, + buildInitialStateFn, + runMakeBitcodeBranchFn, + ...(scenarioIds ? { scenarioIds } : {}) + }); + const inheritedV20Package = buildV20ProvenPackage(inheritedV20BaseData, { + version: 'V20', + generatedAt, + inheritedV19: inheritedV19Package.data.v19, + renderMarkdown: false + }); + const v42Package = buildV42ProvenPackage(baseData, { + generatedAt, + inheritedV19: inheritedV19Package.data.v19, + inheritedV20: inheritedV20Package.data.v20 + }); + finishGenerateProfile(); + return v42Package; + } const v18Matrices = version === 'V18' ? buildV18Matrices(baseData, { version, diff --git a/packages/protocol/src/canonical/v21-specifying.js b/packages/protocol/src/canonical/v21-specifying.js index 592a4259..2d843635 100644 --- a/packages/protocol/src/canonical/v21-specifying.js +++ b/packages/protocol/src/canonical/v21-specifying.js @@ -479,6 +479,18 @@ function buildV21LikeProfile(version) { '.bitcode/v41-promotion-readiness-report.json' ] : []), + ...(version === 'V42' + ? [ + '.bitcode/v42-depositing-shortest-path.json', + '.bitcode/v42-reading-shortest-path-state-machine.json', + '.bitcode/v42-readneed-review-resynthesis-product-closure.json', + '.bitcode/v42-readfitsfinding-preview-quote.json', + '.bitcode/v42-settlement-rights-delivery.json', + '.bitcode/v42-ai-reading-demonstration.json', + '.bitcode/v42-local-staging-mvp-rehearsal.json', + '.bitcode/v42-promotion-readiness-report.json' + ] + : []), ...(version === 'V26' ? [ '.bitcode/terminal-composition-proof.json', @@ -1580,6 +1592,12 @@ function buildRequiredCanonicalArtifacts(repoRoot, currentTarget) { if (currentTarget === 'V40') { artifacts.push(...buildV21LikeProfile('V40').requiredGeneratedArtifactPaths); } + if (currentTarget === 'V41') { + artifacts.push(...buildV21LikeProfile('V41').requiredGeneratedArtifactPaths); + } + if (currentTarget === 'V42') { + artifacts.push(...buildV21LikeProfile('V42').requiredGeneratedArtifactPaths); + } return artifacts.map((relativePath) => path.join(repoRoot, relativePath)); } diff --git a/packages/protocol/src/canonical/v42-local-staging-mvp-rehearsal.js b/packages/protocol/src/canonical/v42-local-staging-mvp-rehearsal.js index 481b3055..cddab18c 100644 --- a/packages/protocol/src/canonical/v42-local-staging-mvp-rehearsal.js +++ b/packages/protocol/src/canonical/v42-local-staging-mvp-rehearsal.js @@ -325,7 +325,13 @@ function buildPredicateResults(repoRoot) { predicateResult('v42-delta-expanded', SOURCE_ROOTS.v42Delta, sources.v42Delta.includes('Gate 8 now binds') && sources.v42Delta.includes('staging-testnet full MVP rehearsal')), predicateResult('v42-notes-expanded', SOURCE_ROOTS.v42Notes, sources.v42Notes.includes('Gate 8 records') && sources.v42Notes.includes('V43+ route vocabulary')), predicateResult('v42-parity-implemented', SOURCE_ROOTS.v42Parity, sources.v42Parity.includes('Local/staging rehearsal') && sources.v42Parity.includes('implemented')), - predicateResult('roadmap-advanced-to-gate8', SOURCE_ROOTS.roadmap, sources.roadmap.includes('Current working gate: V42 Gate 8') && sources.roadmap.includes('V42 Gate 8 closure anchor')), + predicateResult( + 'roadmap-advanced-to-gate8', + SOURCE_ROOTS.roadmap, + sources.roadmap.includes('V42 Gate 8 closure anchor') && + (sources.roadmap.includes('Current working gate: V42 Gate 8') || + sources.roadmap.includes('Current working gate: V42 Gate 9')), + ), predicateResult('readmes-document-gate8', SOURCE_ROOTS.rootReadme, sources.rootReadme.includes('V42 Gate 8') && sources.protocolReadme.includes('V42LocalStagingMvpRehearsal') && sources.assetPackReadme.includes('ReadingLocalStagingRehearsal') && sources.terminalReadme.includes('local/staging')), ]; } diff --git a/packages/protocol/src/canonical/v42-promotion-readiness-report.js b/packages/protocol/src/canonical/v42-promotion-readiness-report.js new file mode 100644 index 00000000..81e8e9a9 --- /dev/null +++ b/packages/protocol/src/canonical/v42-promotion-readiness-report.js @@ -0,0 +1,425 @@ +// @ts-check + +import crypto from 'node:crypto'; +import { existsSync, readFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +export const V42_PROMOTION_READINESS_REPORT_ARTIFACT_PATH = + '.bitcode/v42-promotion-readiness-report.json'; +export const V42_PROMOTION_READINESS_REPORT_SCHEMA_ID = + 'bitcode.v42.promotionReadinessReport.v1'; +export const V42_PROMOTION_READINESS_REPORT_VERSION = 'V42'; +export const V42_PROMOTION_READINESS_REPORT_CURRENT_TARGET = 'V41'; +export const V42_PROMOTION_READINESS_SOURCE_SAFETY_VERDICT = + 'source-safe-v42-reliable-mvp-promotion-readiness-metadata'; + +export const V42_PROMOTION_READINESS_GATE_ARTIFACT_PATHS = Object.freeze([ + '.bitcode/v42-depositing-shortest-path.json', + '.bitcode/v42-reading-shortest-path-state-machine.json', + '.bitcode/v42-readneed-review-resynthesis-product-closure.json', + '.bitcode/v42-readfitsfinding-preview-quote.json', + '.bitcode/v42-settlement-rights-delivery.json', + '.bitcode/v42-ai-reading-demonstration.json', + '.bitcode/v42-local-staging-mvp-rehearsal.json', +]); + +export const V42_PROMOTION_READINESS_GENERATED_OUTPUTS = Object.freeze([ + 'BITCODE_SPEC_V42_PROVEN.md', + '.bitcode/v42-spec-family-report.json', + '.bitcode/v42-canonical-input-report.json', + '.bitcode/v42-canon-posture-drift-report.json', + V42_PROMOTION_READINESS_REPORT_ARTIFACT_PATH, +]); + +const JWT_HEADER_PREFIX = String.fromCharCode( + 101, + 121, + 74, + 104, + 98, + 71, + 99, + 105, + 79, + 105, + 74, + 73, + 85, + 122, + 73, + 49, + 78, + 105, + 73, + 115, + 73, + 110, + 82, + 53, + 99, + 67, + 73, + 54, + 73, + 107, + 112, + 88, + 86, + 67, + 74, + 57, +); + +const SECRET_MARKERS = Object.freeze([ + `${['sk', 'proj'].join('-')}-`, + `${['sb', 'secret'].join('_')}__`, + ['service', 'role'].join('_'), + JWT_HEADER_PREFIX, + ['SUPABASE', 'SERVICE', 'ROLE'].join('_'), + ['OPENAI', 'API', 'KEY'].join('_'), + ['VERCEL', 'TOKEN'].join('_'), + ['VERCEL', 'OIDC', 'TOKEN'].join('_'), + ['PRIVATE', 'KEY'].join('_'), +]); + +const REQUIRED_SOURCE_EVIDENCE = Object.freeze([ + source('scripts/check-v42-gate9-promotion-readiness.mjs', [ + 'V42 Gate 9 promotion readiness', + '--promotion-mode', + 'promotedPointer', + V42_PROMOTION_READINESS_REPORT_ARTIFACT_PATH, + ]), + source('scripts/generate-v42-promotion-readiness-report.mjs', [ + 'buildV42PromotionReadinessReport', + V42_PROMOTION_READINESS_SOURCE_SAFETY_VERDICT, + 'v42-promotion-readiness-report', + ]), + source('scripts/promote-bitcode-canon.mjs', [ + "if (version === 'V42')", + 'const v42Gate9Command', + 'buildDerivedV42CommitMessageBody', + 'scripts/check-v42-gate9-promotion-readiness.mjs', + ]), + source('scripts/prepare-bitcode-spec-family-promotion.mjs', [ + "if (version === 'V42')", + 'V42 canonical system specification for reliable MVP experience', + 'BITCODE_SPEC_V42_PROVEN.md', + V42_PROMOTION_READINESS_REPORT_ARTIFACT_PATH, + ]), + source('scripts/prepare-bitcode-runtime-canon-promotion.mjs', [ + '--next-draft', + 'rewritePackageReadme', + 'rewriteRuntimeDataState', + ]), + source('.github/workflows/v42-canon-promotion.yml', [ + "head.ref == 'version/v42'", + 'npm run promote:canon -- --version V42', + 'BITCODE_SPEC_V42_PROVEN.md', + 'Promote V42 canon files', + ]), + source('.github/workflows/bitcode-gate-quality.yml', [ + 'check-v42-gate9-promotion-readiness.mjs', + 'elif [ "$POINTER" = "V42" ]', + '--active-canon V42 --draft-target V43', + ]), + source('.github/workflows/bitcode-canon-quality.yml', [ + 'check-v42-gate9-promotion-readiness.mjs', + 'elif [ "$POINTER" = "V42" ]', + '--active-canon V42 --draft-target V43', + ]), + source('packages/protocol/src/canonical/proven-generator.js', [ + 'buildV42ProvenPackage', + 'buildV42PromotionReadinessReport', + V42_PROMOTION_READINESS_REPORT_ARTIFACT_PATH, + ]), + source('packages/protocol/test/v42-promotion-readiness.test.js', [ + 'builds source-safe V42 PromotionReadinessReport', + 'v42-promotion-readiness-report', + 'V42 Promotion Readiness', + ]), + source('packages/protocol/src/canonical/v21-specifying.js', [ + V42_PROMOTION_READINESS_REPORT_ARTIFACT_PATH, + ]), + source('package.json', [ + 'generate:v42-promotion-readiness', + 'check:v42-promotion-readiness', + 'check:v42-gate9', + ]), +]); + +const REQUIRED_DOCUMENTATION_EVIDENCE = Object.freeze([ + source('BITCODE_SPEC_V42.md', [ + 'V42 promotion readiness canon', + V42_PROMOTION_READINESS_REPORT_ARTIFACT_PATH, + 'V42 active / draft V43', + ]), + source('BITCODE_SPEC_V42_DELTA.md', [ + 'Gate 9: V42 Promotion Readiness', + V42_PROMOTION_READINESS_REPORT_ARTIFACT_PATH, + 'promotion scripts support V42', + ]), + source('BITCODE_SPEC_V42_NOTES.md', [ + 'Gate 9: V42 Promotion Readiness', + V42_PROMOTION_READINESS_REPORT_ARTIFACT_PATH, + 'active V42 / draft V43', + ]), + source('BITCODE_SPEC_V42_PARITY_MATRIX.md', [ + '## Gate 9 Promotion readiness parity', + V42_PROMOTION_READINESS_REPORT_ARTIFACT_PATH, + 'closed', + ]), + source('SPECIFICATIONS_ROADMAP.md', [ + 'V42 Gate 9 closure anchor', + 'BITCODE_SPEC_V42_PROVEN.md', + ]), + source('README.md', [ + 'check:v42-gate9', + 'v42-canon-promotion.yml', + ]), + source('packages/protocol/README.md', [ + 'V42 Gate 9', + 'V42` active, `V43` draft', + ]), +]); + +/** + * @param {string} relativePath + * @param {readonly string[]} tokens + */ +function source(relativePath, tokens) { + return { relativePath, tokens }; +} + +/** + * @param {string} repoRoot + * @param {{ relativePath: string, tokens: readonly string[] }} item + */ +function scanTokens(repoRoot, item) { + const absolutePath = path.join(repoRoot, item.relativePath); + const present = existsSync(absolutePath); + const content = present ? readFileSync(absolutePath, 'utf8') : ''; + return { + relativePath: item.relativePath, + present, + digest: present ? sha256(content) : null, + requiredTokens: item.tokens.map((token) => ({ + token, + present: content.includes(token), + })), + }; +} + +/** + * @param {string} repoRoot + * @param {string} relativePath + */ +function scanArtifact(repoRoot, relativePath) { + const absolutePath = path.join(repoRoot, relativePath); + const present = existsSync(absolutePath); + const content = present ? readFileSync(absolutePath, 'utf8') : ''; + let parsed = null; + let parseable = false; + if (present) { + try { + parsed = JSON.parse(content); + parseable = true; + } catch { + parseable = false; + } + } + return { + relativePath, + present, + parseable, + digest: present ? sha256(content) : null, + byteLength: present ? Buffer.byteLength(content, 'utf8') : 0, + sourceSafe: present ? !includesSecretMarker(content) && !content.includes('protectedSourceBody') : false, + artifactId: parsed?.artifactId || parsed?.reportId || null, + version: parsed?.version || null, + sourceSafetyVerdict: parsed?.sourceSafetyVerdict || null, + }; +} + +/** + * @param {unknown} value + * @returns {string} + */ +function canonicalJson(value) { + if (value === null || typeof value !== 'object') return JSON.stringify(value); + if (Array.isArray(value)) return `[${value.map(canonicalJson).join(',')}]`; + const record = /** @type {Record} */ (value); + return `{${Object.keys(record) + .sort() + .map((key) => `${JSON.stringify(key)}:${canonicalJson(record[key])}`) + .join(',')}}`; +} + +/** + * @param {unknown} value + * @returns {string} + */ +function sha256(value) { + return `sha256:${crypto.createHash('sha256').update(String(value)).digest('hex')}`; +} + +/** + * @param {string} value + * @returns {boolean} + */ +function includesSecretMarker(value) { + return SECRET_MARKERS.some((marker) => value.includes(marker)); +} + +/** + * @param {ReturnType} entry + */ +function allTokensPresent(entry) { + return entry.present && entry.requiredTokens.every((token) => token.present); +} + +/** + * @param {{ + * version?: string, + * currentTarget?: string, + * generatedAt?: string, + * repoRoot?: string, + * }} [input] + */ +export function buildV42PromotionReadinessReport(input = {}) { + const version = input.version || V42_PROMOTION_READINESS_REPORT_VERSION; + const currentTarget = input.currentTarget || V42_PROMOTION_READINESS_REPORT_CURRENT_TARGET; + const generatedAt = input.generatedAt || '2026-05-25T00:00:00.000Z'; + const repoRoot = input.repoRoot || path.resolve(__dirname, '../../../..'); + const sourceEvidence = REQUIRED_SOURCE_EVIDENCE.map((item) => scanTokens(repoRoot, item)); + const documentationEvidence = REQUIRED_DOCUMENTATION_EVIDENCE.map((item) => scanTokens(repoRoot, item)); + const gateArtifactEvidence = V42_PROMOTION_READINESS_GATE_ARTIFACT_PATHS.map((artifactPath) => + scanArtifact(repoRoot, artifactPath), + ); + const missingGateArtifacts = gateArtifactEvidence.filter((artifact) => !artifact.present).map((artifact) => artifact.relativePath); + const unparseableGateArtifacts = gateArtifactEvidence + .filter((artifact) => artifact.present && !artifact.parseable) + .map((artifact) => artifact.relativePath); + const sourceUnsafeGateArtifacts = gateArtifactEvidence + .filter((artifact) => artifact.present && artifact.sourceSafe !== true) + .map((artifact) => artifact.relativePath); + const sourceEvidenceFailures = sourceEvidence.flatMap((entry) => { + if (!entry.present) return [`missing promotion source ${entry.relativePath}`]; + return entry.requiredTokens + .filter((token) => !token.present) + .map((token) => `${entry.relativePath} missing token ${token.token}`); + }); + const documentationEvidenceFailures = documentationEvidence.flatMap((entry) => { + if (!entry.present) return [`missing promotion documentation ${entry.relativePath}`]; + return entry.requiredTokens + .filter((token) => !token.present) + .map((token) => `${entry.relativePath} missing token ${token.token}`); + }); + const serializedEvidence = canonicalJson({ sourceEvidence, documentationEvidence, gateArtifactEvidence }); + const forbiddenMarkerDetected = includesSecretMarker(serializedEvidence); + const failures = [ + ...sourceEvidenceFailures, + ...documentationEvidenceFailures, + ...missingGateArtifacts.map((artifactPath) => `missing gate artifact ${artifactPath}`), + ...unparseableGateArtifacts.map((artifactPath) => `unparseable gate artifact ${artifactPath}`), + ...sourceUnsafeGateArtifacts.map((artifactPath) => `source-unsafe gate artifact ${artifactPath}`), + ...(forbiddenMarkerDetected ? ['promotion readiness evidence contains a secret-shaped marker'] : []), + ]; + const validationCommands = [ + 'pnpm run check:v42-gate1', + 'pnpm run check:v42-gate2', + 'pnpm run check:v42-gate3', + 'pnpm run check:v42-gate4', + 'pnpm run check:v42-gate5', + 'pnpm run check:v42-gate6', + 'pnpm run check:v42-gate7', + 'pnpm run check:v42-gate8', + 'pnpm run check:v42-gate9', + 'node scripts/promote-bitcode-canon.mjs --version V42 --commit HEAD --dry-run', + ]; + const coverage = { + requiredGateArtifactPaths: [...V42_PROMOTION_READINESS_GATE_ARTIFACT_PATHS], + generatedProofOutputs: [...V42_PROMOTION_READINESS_GENERATED_OUTPUTS], + gateArtifactCount: gateArtifactEvidence.length, + missingGateArtifacts, + unparseableGateArtifacts, + sourceUnsafeGateArtifacts, + sourceEvidenceComplete: sourceEvidence.every(allTokensPresent), + documentationEvidenceComplete: documentationEvidence.every(allTokensPresent), + allGateArtifactsCovered: missingGateArtifacts.length === 0, + allGateArtifactsParseable: unparseableGateArtifacts.length === 0, + allGateArtifactsSourceSafe: sourceUnsafeGateArtifacts.length === 0, + generatedProofOutputsCovered: V42_PROMOTION_READINESS_GENERATED_OUTPUTS.includes('BITCODE_SPEC_V42_PROVEN.md'), + promotionWorkflowCovered: sourceEvidence.some((entry) => entry.relativePath === '.github/workflows/v42-canon-promotion.yml' && allTokensPresent(entry)), + gateQualityWorkflowCovered: sourceEvidence.some((entry) => entry.relativePath === '.github/workflows/bitcode-gate-quality.yml' && allTokensPresent(entry)), + canonQualityWorkflowCovered: sourceEvidence.some((entry) => entry.relativePath === '.github/workflows/bitcode-canon-quality.yml' && allTokensPresent(entry)), + promotionScriptCovered: sourceEvidence.some((entry) => entry.relativePath === 'scripts/promote-bitcode-canon.mjs' && allTokensPresent(entry)), + specFamilyPromotionScriptCovered: sourceEvidence.some((entry) => entry.relativePath === 'scripts/prepare-bitcode-spec-family-promotion.mjs' && allTokensPresent(entry)), + runtimePromotionScriptCovered: sourceEvidence.some((entry) => entry.relativePath === 'scripts/prepare-bitcode-runtime-canon-promotion.mjs' && allTokensPresent(entry)), + provenGeneratorCovered: sourceEvidence.some((entry) => entry.relativePath === 'packages/protocol/src/canonical/proven-generator.js' && allTokensPresent(entry)), + prePromotionPosture: 'V41 active / V42 draft', + postPromotionPosture: 'V42 active / V43 draft', + valueBearingMainnetAdmission: false, + credentialsSerialized: forbiddenMarkerDetected, + protectedSourceVisible: false, + rawProtectedPromptVisible: false, + rawProviderResponseVisible: false, + unpaidAssetPackSourceVisible: false, + walletPrivateMaterialVisible: false, + }; + const artifactSeed = { + version, + currentTarget, + validationCommands, + coverage, + sourceSafetyVerdict: V42_PROMOTION_READINESS_SOURCE_SAFETY_VERDICT, + }; + + return { + artifactId: 'v42-promotion-readiness-report', + schemaId: V42_PROMOTION_READINESS_REPORT_SCHEMA_ID, + version, + currentTarget, + generatedAt, + sourceSafetyVerdict: V42_PROMOTION_READINESS_SOURCE_SAFETY_VERDICT, + prePromotionPosture: 'V41 active / V42 draft', + postPromotionPosture: 'V42 active / V43 draft', + branchProtection: { + directMainPushAdmitted: false, + promotionPrRequired: true, + versionBranch: 'version/v42', + versionPromotionPullRequestTitlePrefix: 'V42 Canonical Promotion', + }, + generatedArtifactPolicy: { + provenAppendixPath: 'BITCODE_SPEC_V42_PROVEN.md', + provenAppendixRequiredBeforePromotion: false, + generatedArtifactPrefix: '.bitcode/v42-', + promotionOverwritesPreviewArtifacts: true, + secretValuesSerialized: false, + protectedSourceSerialized: false, + rawProtectedPromptSerialized: false, + rawProviderResponseSerialized: false, + unpaidAssetPackSourceSerialized: false, + }, + validationCommands, + gateArtifactEvidence, + sourceEvidence, + documentationEvidence, + coverage, + failClosedResult: + 'promotion remains blocked when any V42 Depositing shortest path, Reading shortest path state machine, ReadNeed review/resynthesis closure, ReadFitsFinding preview and quote closure, settlement rights delivery boundary, AI-reading demonstration, local/staging-testnet rehearsal, workflow, promotion script, generated proof support, source-safety check, or value-bearing mainnet block is missing', + artifactRoot: `reliable-mvp-promotion-readiness-report:${sha256(canonicalJson(artifactSeed)).slice(7, 31)}`, + passed: failures.length === 0, + failures, + validationCommand: 'pnpm run check:v42-gate9', + }; +} + +export function listMissingV42PromotionReadinessSources(repoRoot = path.resolve(__dirname, '../../../..')) { + return [...REQUIRED_SOURCE_EVIDENCE, ...REQUIRED_DOCUMENTATION_EVIDENCE] + .filter((item) => !existsSync(path.join(repoRoot, item.relativePath))) + .map((item) => item.relativePath); +} diff --git a/packages/protocol/src/index.d.ts b/packages/protocol/src/index.d.ts index 652372a1..cc8a5930 100644 --- a/packages/protocol/src/index.d.ts +++ b/packages/protocol/src/index.d.ts @@ -572,6 +572,15 @@ export const V42_LOCAL_STAGING_MVP_REHEARSAL_STAGE_IDS: readonly string[]; export const V42_LOCAL_STAGING_MVP_REHEARSAL_ROW_IDS: readonly string[]; export const V42_LOCAL_STAGING_MVP_REHEARSAL_ROWS: readonly Record[]; export function buildV42LocalStagingMvpRehearsal(input?: Record): BitcodeProtocolReport; +export const V42_PROMOTION_READINESS_REPORT_ARTIFACT_PATH: string; +export const V42_PROMOTION_READINESS_REPORT_CURRENT_TARGET: string; +export const V42_PROMOTION_READINESS_REPORT_SCHEMA_ID: string; +export const V42_PROMOTION_READINESS_REPORT_VERSION: string; +export const V42_PROMOTION_READINESS_SOURCE_SAFETY_VERDICT: string; +export const V42_PROMOTION_READINESS_GATE_ARTIFACT_PATHS: readonly string[]; +export const V42_PROMOTION_READINESS_GENERATED_OUTPUTS: readonly string[]; +export function buildV42PromotionReadinessReport(input?: Record): BitcodeProtocolReport; +export function listMissingV42PromotionReadinessSources(repoRoot?: string): string[]; export const EXCHANGE_INTENT_ORDER_CONTRACTS_ARTIFACT_PATH: string; export const EXCHANGE_INTENT_ORDER_CONTRACTS_CURRENT_TARGET: string; export const EXCHANGE_INTENT_ORDER_CONTRACTS_SCHEMA_ID: string; diff --git a/packages/protocol/src/index.js b/packages/protocol/src/index.js index 78667957..e39c9272 100644 --- a/packages/protocol/src/index.js +++ b/packages/protocol/src/index.js @@ -644,6 +644,17 @@ export { V42_LOCAL_STAGING_MVP_REHEARSAL_VERSION, buildV42LocalStagingMvpRehearsal } from './canonical/v42-local-staging-mvp-rehearsal.js'; +export { + V42_PROMOTION_READINESS_GATE_ARTIFACT_PATHS, + V42_PROMOTION_READINESS_GENERATED_OUTPUTS, + V42_PROMOTION_READINESS_REPORT_ARTIFACT_PATH, + V42_PROMOTION_READINESS_REPORT_CURRENT_TARGET, + V42_PROMOTION_READINESS_REPORT_SCHEMA_ID, + V42_PROMOTION_READINESS_REPORT_VERSION, + V42_PROMOTION_READINESS_SOURCE_SAFETY_VERDICT, + buildV42PromotionReadinessReport, + listMissingV42PromotionReadinessSources +} from './canonical/v42-promotion-readiness-report.js'; export { EXCHANGE_INTENT_ACTION_KINDS, EXCHANGE_INTENT_ORDER_CONTRACTS_ARTIFACT_PATH, diff --git a/packages/protocol/test/v42-promotion-readiness.test.js b/packages/protocol/test/v42-promotion-readiness.test.js new file mode 100644 index 00000000..5c5dc773 --- /dev/null +++ b/packages/protocol/test/v42-promotion-readiness.test.js @@ -0,0 +1,81 @@ +import assert from 'node:assert/strict'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { test } from 'node:test'; + +import { + V42_PROMOTION_READINESS_GATE_ARTIFACT_PATHS, + V42_PROMOTION_READINESS_REPORT_ARTIFACT_PATH, + buildV42PromotionReadinessReport, + generateCanonicalProvenMarkdown, +} from '../src/index.js'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const repoRoot = path.resolve(__dirname, '..', '..', '..'); + +test('builds source-safe V42 PromotionReadinessReport', () => { + const report = buildV42PromotionReadinessReport({ + generatedAt: '2026-05-25T00:00:00.000Z', + repoRoot, + }); + + assert.equal(report.artifactId, 'v42-promotion-readiness-report'); + assert.equal(report.schemaId, 'bitcode.v42.promotionReadinessReport.v1'); + assert.equal(report.version, 'V42'); + assert.equal(report.currentTarget, 'V41'); + assert.equal(report.passed, true); + assert.equal(report.sourceSafetyVerdict, 'source-safe-v42-reliable-mvp-promotion-readiness-metadata'); + assert.equal(report.prePromotionPosture, 'V41 active / V42 draft'); + assert.equal(report.postPromotionPosture, 'V42 active / V43 draft'); + assert.equal(report.coverage.allGateArtifactsCovered, true); + assert.equal(report.coverage.allGateArtifactsParseable, true); + assert.equal(report.coverage.allGateArtifactsSourceSafe, true); + assert.equal(report.coverage.sourceEvidenceComplete, true); + assert.equal(report.coverage.documentationEvidenceComplete, true); + assert.equal(report.coverage.generatedProofOutputsCovered, true); + assert.equal(report.coverage.promotionWorkflowCovered, true); + assert.equal(report.coverage.gateQualityWorkflowCovered, true); + assert.equal(report.coverage.canonQualityWorkflowCovered, true); + assert.equal(report.coverage.promotionScriptCovered, true); + assert.equal(report.coverage.specFamilyPromotionScriptCovered, true); + assert.equal(report.coverage.runtimePromotionScriptCovered, true); + assert.equal(report.coverage.provenGeneratorCovered, true); + assert.equal(report.coverage.valueBearingMainnetAdmission, false); + assert.equal(report.coverage.credentialsSerialized, false); + assert.equal(report.coverage.protectedSourceVisible, false); + assert.equal(report.coverage.rawProtectedPromptVisible, false); + assert.equal(report.coverage.rawProviderResponseVisible, false); + assert.equal(report.coverage.unpaidAssetPackSourceVisible, false); + assert.equal(report.coverage.walletPrivateMaterialVisible, false); + assert.deepEqual(report.coverage.missingGateArtifacts, []); + assert.deepEqual(report.coverage.unparseableGateArtifacts, []); + assert.deepEqual(report.coverage.sourceUnsafeGateArtifacts, []); + assert.match(report.artifactRoot, /^reliable-mvp-promotion-readiness-report:[a-f0-9]{24}$/u); + assert.equal( + V42_PROMOTION_READINESS_REPORT_ARTIFACT_PATH, + '.bitcode/v42-promotion-readiness-report.json', + ); + + for (const artifactPath of V42_PROMOTION_READINESS_GATE_ARTIFACT_PATHS) { + assert.equal(report.gateArtifactEvidence.some((artifact) => artifact.relativePath === artifactPath), true, `missing ${artifactPath}`); + } +}); + +test('supports V42 promotion readiness with source-safe reliable MVP artifacts', () => { + const result = generateCanonicalProvenMarkdown({ + version: 'V42', + canonicalCommit: '0'.repeat(40), + canonicalCommitRecordedAt: '2026-05-25T00:00:00.000Z', + generatedAt: '2026-05-25T00:00:00.000Z', + worktreeState: 'clean', + }); + + assert.equal(result.data.version, 'V42'); + assert.equal(result.data.v42.promotionReadinessReport.artifactId, 'v42-promotion-readiness-report'); + assert.equal(result.data.v42.promotionReadinessReport.prePromotionPosture, 'V41 active / V42 draft'); + assert.equal(result.data.v42.promotionReadinessReport.postPromotionPosture, 'V42 active / V43 draft'); + assert.equal(result.data.v42.promotionReadinessReport.passed, true); + assert.match(result.markdown, /V42 Promotion Readiness/); + assert.ok(result.artifacts['.bitcode/v42-promotion-readiness-report.json']); + assert.ok(result.artifacts['.bitcode/v42-canon-posture-drift-report.json']); +}); diff --git a/protocol-demonstration/test/v21-specifying.test.js b/protocol-demonstration/test/v21-specifying.test.js index 0afcba8f..d9cdd7c3 100644 --- a/protocol-demonstration/test/v21-specifying.test.js +++ b/protocol-demonstration/test/v21-specifying.test.js @@ -28,6 +28,8 @@ function expectedActiveCanonicalInputArtifactCount(version) { V38: 12, V39: 12, V40: 12, + V41: 10, + V42: 10, }; if (Object.hasOwn(expectedCountsByVersion, version)) { return expectedCountsByVersion[version]; diff --git a/scripts/check-v42-gate9-promotion-readiness.mjs b/scripts/check-v42-gate9-promotion-readiness.mjs new file mode 100644 index 00000000..361236c9 --- /dev/null +++ b/scripts/check-v42-gate9-promotion-readiness.mjs @@ -0,0 +1,355 @@ +#!/usr/bin/env node + +import { execFileSync } from 'node:child_process'; +import { existsSync, readFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const defaultRepoRoot = path.resolve(__dirname, '..'); +const ARTIFACT_PATH = '.bitcode/v42-promotion-readiness-report.json'; + +const V42_GATE_ARTIFACTS = [ + '.bitcode/v42-depositing-shortest-path.json', + '.bitcode/v42-reading-shortest-path-state-machine.json', + '.bitcode/v42-readneed-review-resynthesis-product-closure.json', + '.bitcode/v42-readfitsfinding-preview-quote.json', + '.bitcode/v42-settlement-rights-delivery.json', + '.bitcode/v42-ai-reading-demonstration.json', + '.bitcode/v42-local-staging-mvp-rehearsal.json', +]; + +const JWT_HEADER_PREFIX = String.fromCharCode( + 101, + 121, + 74, + 104, + 98, + 71, + 99, + 105, + 79, + 105, + 74, + 73, + 85, + 122, + 73, + 49, + 78, + 105, + 73, + 115, + 73, + 110, + 82, + 53, + 99, + 67, + 73, + 54, + 73, + 107, + 112, + 88, + 86, + 67, + 74, + 57, +); + +const SECRET_MARKERS = [ + `${['sk', 'proj'].join('-')}-`, + `${['sb', 'secret'].join('_')}__`, + ['service', 'role'].join('_'), + JWT_HEADER_PREFIX, + ['SUPABASE', 'SERVICE', 'ROLE'].join('_'), + ['OPENAI', 'API', 'KEY'].join('_'), + ['VERCEL', 'TOKEN'].join('_'), + ['VERCEL', 'OIDC', 'TOKEN'].join('_'), + ['PRIVATE', 'KEY'].join('_'), +]; + +function read(root, relativePath) { + return readFileSync(path.join(root, relativePath), 'utf8'); +} + +function fileExists(root, relativePath) { + return existsSync(path.join(root, relativePath)); +} + +function git(root, args) { + return execFileSync('git', args, { cwd: root, encoding: 'utf8' }).trim(); +} + +function run(root, command, args) { + return execFileSync(command, args, { + cwd: root, + encoding: 'utf8', + stdio: ['ignore', 'pipe', 'pipe'], + }).trim(); +} + +function assertCheck(failures, condition, message) { + if (!condition) failures.push(message); +} + +function parseArgs(argv) { + const args = { + promotionMode: false, + skipBranchCheck: false, + skipPackageTests: false, + repoRoot: defaultRepoRoot, + }; + + for (let index = 0; index < argv.length; index += 1) { + const arg = argv[index]; + if (arg === '--') continue; + else if (arg === '--promotion-mode') args.promotionMode = true; + else if (arg === '--skip-branch-check') args.skipBranchCheck = true; + else if (arg === '--skip-package-tests') args.skipPackageTests = true; + else if (arg === '--repo-root') args.repoRoot = path.resolve(argv[++index]); + else if (arg === '--help' || arg === '-h') args.help = true; + else throw new Error(`Unknown argument ${arg}`); + } + + return args; +} + +function printHelp() { + process.stdout.write( + [ + 'Usage: node scripts/check-v42-gate9-promotion-readiness.mjs [--promotion-mode] [--skip-branch-check] [--skip-package-tests] [--repo-root ]', + '', + 'Checks V42 Gate 9 promotion readiness, reliable MVP artifacts, V42 promotion workflow support, source-safety, generated proof support, and V43 draft posture preparation.', + 'Use --skip-package-tests only in lightweight workflow posture jobs that do not need promotion dry-run coverage.', + ].join('\n'), + ); + process.stdout.write('\n'); +} + +function main() { + const args = parseArgs(process.argv.slice(2)); + if (args.help) { + printHelp(); + return; + } + + const root = args.repoRoot; + const failures = []; + const pointer = read(root, 'BITCODE_SPEC.txt').trim(); + const promotedPointer = args.promotionMode && pointer === 'V42'; + + assertCheck( + failures, + args.promotionMode ? ['V41', 'V42'].includes(pointer) : pointer === 'V41', + args.promotionMode + ? `BITCODE_SPEC.txt must be V41 before V42 promotion or V42 after promotion. Observed ${pointer || 'empty'}.` + : `BITCODE_SPEC.txt must remain V41 during V42 Gate 9 work. Observed ${pointer || 'empty'}.`, + ); + + if (!args.skipBranchCheck) { + const branch = git(root, ['branch', '--show-current']); + assertCheck( + failures, + branch === 'version/v42' || /^v42\/gate-9-[a-z0-9][a-z0-9-]*$/u.test(branch), + `V42 Gate 9 work must occur on version/v42 or v42/gate-9-* branches. Observed ${branch || 'detached HEAD'}.`, + ); + } + + const requiredFiles = [ + 'BITCODE_SPEC_V42.md', + 'BITCODE_SPEC_V42_DELTA.md', + 'BITCODE_SPEC_V42_NOTES.md', + 'BITCODE_SPEC_V42_PARITY_MATRIX.md', + ARTIFACT_PATH, + 'scripts/generate-v42-promotion-readiness-report.mjs', + 'scripts/check-v42-gate9-promotion-readiness.mjs', + 'scripts/promote-bitcode-canon.mjs', + 'scripts/prepare-bitcode-spec-family-promotion.mjs', + 'scripts/prepare-bitcode-runtime-canon-promotion.mjs', + 'scripts/generate-bitcode-proven.mjs', + '.github/workflows/bitcode-gate-quality.yml', + '.github/workflows/bitcode-canon-quality.yml', + '.github/workflows/v42-canon-promotion.yml', + 'packages/protocol/src/canon-posture.js', + 'packages/protocol/data/state.json', + 'packages/protocol/README.md', + 'packages/protocol/src/canonical/proven-generator.js', + 'packages/protocol/src/canonical/v42-promotion-readiness-report.js', + 'packages/protocol/test/v42-promotion-readiness.test.js', + 'packages/protocol/src/canonical/v21-specifying.js', + 'package.json', + 'README.md', + 'SPECIFICATIONS_ROADMAP.md', + ...V42_GATE_ARTIFACTS, + ]; + + for (const relativePath of requiredFiles) { + assertCheck(failures, fileExists(root, relativePath), `Missing V42 Gate 9 file: ${relativePath}`); + } + + if (failures.length === 0 && !promotedPointer) { + try { + run(root, 'node', ['scripts/generate-v42-depositing-shortest-path.mjs', '--check']); + run(root, 'node', ['scripts/generate-v42-reading-shortest-path-state-machine.mjs', '--check']); + run(root, 'node', ['scripts/generate-v42-readneed-review-resynthesis-product-closure.mjs', '--check']); + run(root, 'node', ['scripts/generate-v42-readfitsfinding-preview-quote.mjs', '--check']); + run(root, 'node', ['scripts/generate-v42-settlement-rights-delivery.mjs', '--check']); + run(root, 'node', ['scripts/generate-v42-ai-reading-demonstration.mjs', '--check']); + run(root, 'node', ['scripts/generate-v42-local-staging-mvp-rehearsal.mjs', '--check']); + run(root, 'node', ['scripts/generate-v42-promotion-readiness-report.mjs', '--check']); + } catch (error) { + failures.push(`V42 Gate 9 artifact freshness check failed: ${error.stderr || error.message}`); + } + } + + const artifactText = fileExists(root, ARTIFACT_PATH) ? read(root, ARTIFACT_PATH) : ''; + for (const marker of SECRET_MARKERS) { + assertCheck(failures, !artifactText.includes(marker), `${ARTIFACT_PATH} must not contain secret-shaped value ${marker}.`); + } + assertCheck(failures, !artifactText.includes('protectedSourceBody'), `${ARTIFACT_PATH} must not serialize protected source bodies.`); + + const artifact = artifactText ? JSON.parse(artifactText) : null; + if (artifact) { + assertCheck(failures, artifact.artifactId === 'v42-promotion-readiness-report', 'Promotion readiness artifactId must match.'); + assertCheck(failures, artifact.schemaId === 'bitcode.v42.promotionReadinessReport.v1', 'Promotion readiness schemaId must match.'); + assertCheck(failures, artifact.version === 'V42' && artifact.currentTarget === 'V41', 'Promotion readiness must bind V42 over active V41.'); + assertCheck(failures, artifact.passed === true, 'Promotion readiness report must pass.'); + assertCheck( + failures, + artifact.sourceSafetyVerdict === 'source-safe-v42-reliable-mvp-promotion-readiness-metadata', + 'Promotion readiness report must be source-safe reliable MVP promotion metadata.', + ); + assertCheck(failures, artifact.prePromotionPosture === 'V41 active / V42 draft', 'Promotion readiness pre-promotion posture must match.'); + assertCheck(failures, artifact.postPromotionPosture === 'V42 active / V43 draft', 'Promotion readiness post-promotion posture must match.'); + assertCheck(failures, artifact.coverage.allGateArtifactsCovered === true, 'Promotion readiness must cover all gate artifacts.'); + assertCheck(failures, artifact.coverage.allGateArtifactsParseable === true, 'Promotion readiness artifacts must be parseable.'); + assertCheck(failures, artifact.coverage.allGateArtifactsSourceSafe === true, 'Promotion readiness artifacts must be source-safe.'); + assertCheck(failures, artifact.coverage.sourceEvidenceComplete === true, 'Promotion readiness source evidence must be complete.'); + assertCheck(failures, artifact.coverage.documentationEvidenceComplete === true, 'Promotion readiness documentation evidence must be complete.'); + assertCheck(failures, artifact.coverage.generatedProofOutputsCovered === true, 'Promotion readiness must cover generated proof outputs.'); + assertCheck(failures, artifact.coverage.promotionWorkflowCovered === true, 'Promotion readiness must cover promotion workflow.'); + assertCheck(failures, artifact.coverage.gateQualityWorkflowCovered === true, 'Promotion readiness must cover gate-quality workflow.'); + assertCheck(failures, artifact.coverage.canonQualityWorkflowCovered === true, 'Promotion readiness must cover canon-quality workflow.'); + assertCheck(failures, artifact.coverage.promotionScriptCovered === true, 'Promotion readiness must cover promotion script.'); + assertCheck(failures, artifact.coverage.specFamilyPromotionScriptCovered === true, 'Promotion readiness must cover spec-family promotion script.'); + assertCheck(failures, artifact.coverage.runtimePromotionScriptCovered === true, 'Promotion readiness must cover runtime promotion script.'); + assertCheck(failures, artifact.coverage.provenGeneratorCovered === true, 'Promotion readiness must cover proven generator.'); + assertCheck(failures, artifact.coverage.valueBearingMainnetAdmission === false, 'Promotion readiness must not admit value-bearing mainnet.'); + assertCheck(failures, artifact.coverage.credentialsSerialized === false, 'Promotion readiness must not serialize credentials.'); + assertCheck(failures, artifact.coverage.protectedSourceVisible === false, 'Promotion readiness must not expose protected source.'); + assertCheck(failures, artifact.coverage.rawProtectedPromptVisible === false, 'Promotion readiness must not expose raw protected prompts.'); + assertCheck(failures, artifact.coverage.rawProviderResponseVisible === false, 'Promotion readiness must not expose raw provider responses.'); + assertCheck(failures, artifact.coverage.unpaidAssetPackSourceVisible === false, 'Promotion readiness must not expose unpaid AssetPack source.'); + assertCheck(failures, artifact.coverage.walletPrivateMaterialVisible === false, 'Promotion readiness must not expose wallet private material.'); + assertCheck(failures, artifact.validationCommands.includes('pnpm run check:v42-gate9'), 'Promotion readiness must list check:v42-gate9.'); + assertCheck( + failures, + artifact.validationCommands.includes('node scripts/promote-bitcode-canon.mjs --version V42 --commit HEAD --dry-run'), + 'Promotion readiness must list V42 promotion dry-run.', + ); + } + + const spec = read(root, 'BITCODE_SPEC_V42.md'); + const delta = read(root, 'BITCODE_SPEC_V42_DELTA.md'); + const notes = read(root, 'BITCODE_SPEC_V42_NOTES.md'); + const parity = read(root, 'BITCODE_SPEC_V42_PARITY_MATRIX.md'); + const packageJson = read(root, 'package.json'); + const gateWorkflow = read(root, '.github/workflows/bitcode-gate-quality.yml'); + const canonWorkflow = read(root, '.github/workflows/bitcode-canon-quality.yml'); + const promotionWorkflow = read(root, '.github/workflows/v42-canon-promotion.yml'); + const promoteScript = read(root, 'scripts/promote-bitcode-canon.mjs'); + const prepareSpecScript = read(root, 'scripts/prepare-bitcode-spec-family-promotion.mjs'); + const prepareRuntimeScript = read(root, 'scripts/prepare-bitcode-runtime-canon-promotion.mjs'); + const provenGenerator = read(root, 'packages/protocol/src/canonical/proven-generator.js'); + const protocolReadme = read(root, 'packages/protocol/README.md'); + const rootReadme = read(root, 'README.md'); + const roadmap = read(root, 'SPECIFICATIONS_ROADMAP.md'); + + assertCheck(failures, spec.includes('V42 promotion readiness canon'), 'V42 SPEC must define promotion readiness canon.'); + assertCheck(failures, spec.includes(ARTIFACT_PATH) && spec.includes('V42 active / draft V43'), 'V42 SPEC must include Gate 9 artifact and post-promotion posture.'); + assertCheck(failures, delta.includes('Gate 9: V42 Promotion Readiness') && delta.includes(ARTIFACT_PATH), 'V42 DELTA must define Gate 9 closure acceptance and artifact.'); + assertCheck(failures, delta.includes('promotion scripts support V42'), 'V42 DELTA must state V42 promotion script support.'); + assertCheck(failures, notes.includes('Gate 9: V42 Promotion Readiness') && notes.includes('active V42 / draft V43'), 'V42 NOTES must carry Gate 9 post-promotion posture notes.'); + assertCheck(failures, parity.includes('## Gate 9 Promotion readiness parity') && parity.includes(ARTIFACT_PATH) && parity.includes('closed'), 'V42 PARITY must close Gate 9 artifact parity.'); + assertCheck(failures, roadmap.includes('V42 Gate 9 closure anchor'), 'Roadmap must include V42 Gate 9 closure anchor.'); + assertCheck( + failures, + packageJson.includes('"generate:v42-promotion-readiness"') && + packageJson.includes('"check:v42-promotion-readiness"') && + packageJson.includes('"check:v42-gate9"'), + 'package.json must expose V42 Gate 9 generator/check scripts.', + ); + assertCheck( + failures, + gateWorkflow.includes('check-v42-gate9-promotion-readiness.mjs --promotion-mode --skip-branch-check') && + gateWorkflow.includes('elif [ "$POINTER" = "V42" ]') && + gateWorkflow.includes('--active-canon V42 --draft-target V43'), + 'Gate-quality workflow must tolerate both V41-draft and V42-promoted states.', + ); + assertCheck( + failures, + canonWorkflow.includes('check-v42-gate9-promotion-readiness.mjs --promotion-mode --skip-branch-check') && + canonWorkflow.includes('elif [ "$POINTER" = "V42" ]') && + canonWorkflow.includes('--active-canon V42 --draft-target V43'), + 'Canon-quality workflow must validate V42 promoted posture.', + ); + assertCheck( + failures, + promotionWorkflow.includes("head.ref == 'version/v42'") && + promotionWorkflow.includes('npm run promote:canon -- --version V42') && + promotionWorkflow.includes('check-v42-gate9-promotion-readiness.mjs --promotion-mode --skip-branch-check'), + 'V42 promotion workflow must validate Gate 9 and promote V42.', + ); + assertCheck( + failures, + promoteScript.includes("if (version === 'V42')") && + promoteScript.includes('const v42Gate9Command') && + promoteScript.includes('buildDerivedV42CommitMessageBody') && + promoteScript.includes("version === 'V42'"), + 'Promotion script must support V42.', + ); + assertCheck( + failures, + prepareSpecScript.includes("if (version === 'V42')") && + prepareSpecScript.includes('V42 canonical system specification for reliable MVP experience') && + prepareSpecScript.includes(ARTIFACT_PATH), + 'Spec-family promotion preparation must support V42.', + ); + assertCheck( + failures, + prepareRuntimeScript.includes('--next-draft') && + prepareRuntimeScript.includes('rewritePackageReadme') && + prepareRuntimeScript.includes('rewriteRuntimeDataState'), + 'Runtime promotion preparation must preserve next-draft posture support.', + ); + assertCheck( + failures, + provenGenerator.includes('buildV42ProvenPackage') && + provenGenerator.includes('buildV42PromotionReadinessReport') && + provenGenerator.includes(ARTIFACT_PATH), + 'Proven generator must include V42 promotion package support.', + ); + assertCheck(failures, protocolReadme.includes('V42 Gate 9') && protocolReadme.includes('V42` active, `V43` draft'), 'Protocol README must document V42 Gate 9.'); + assertCheck(failures, rootReadme.includes('check:v42-gate9') && rootReadme.includes('v42-canon-promotion.yml'), 'Root README must document V42 Gate 9 scripts/workflow.'); + + if (failures.length === 0 && !args.skipPackageTests) { + try { + run(root, 'pnpm', ['--filter', '@bitcode/protocol', 'exec', 'node', '--test', '--test-force-exit', 'test/v42-promotion-readiness.test.js']); + run(root, 'node', ['scripts/promote-bitcode-canon.mjs', '--version', 'V42', '--commit', 'HEAD', '--dry-run']); + } catch (error) { + failures.push(`V42 Gate 9 package promotion tests failed: ${error.stderr || error.message}`); + } + } + + if (failures.length > 0) { + process.stderr.write(`V42 Gate 9 promotion readiness failed:\n${failures.map((failure) => `- ${failure}`).join('\n')}\n`); + process.exit(1); + } + + process.stdout.write(`V42 Gate 9 promotion readiness ok artifacts=${V42_GATE_ARTIFACTS.length} root=${artifact?.artifactRoot || 'pending'}\n`); +} + +main(); diff --git a/scripts/generate-v42-promotion-readiness-report.mjs b/scripts/generate-v42-promotion-readiness-report.mjs new file mode 100644 index 00000000..79dc207c --- /dev/null +++ b/scripts/generate-v42-promotion-readiness-report.mjs @@ -0,0 +1,69 @@ +#!/usr/bin/env node + +import { mkdirSync, readFileSync, writeFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +import { + V42_PROMOTION_READINESS_REPORT_ARTIFACT_PATH, + V42_PROMOTION_READINESS_SOURCE_SAFETY_VERDICT, + buildV42PromotionReadinessReport, +} from '../packages/protocol/src/index.js'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const repoRoot = path.resolve(__dirname, '..'); +const GENERATED_AT = '2026-05-25T00:00:00.000Z'; +const EXPECTED_ARTIFACT_ID = 'v42-promotion-readiness-report'; +const EXPECTED_SOURCE_SAFETY_VERDICT = 'source-safe-v42-reliable-mvp-promotion-readiness-metadata'; + +function parseArgs(argv) { + return { + check: argv.includes('--check'), + }; +} + +function main() { + const args = parseArgs(process.argv.slice(2)); + const artifact = buildV42PromotionReadinessReport({ + generatedAt: GENERATED_AT, + repoRoot, + }); + if ( + artifact.artifactId !== EXPECTED_ARTIFACT_ID || + artifact.sourceSafetyVerdict !== V42_PROMOTION_READINESS_SOURCE_SAFETY_VERDICT || + artifact.sourceSafetyVerdict !== EXPECTED_SOURCE_SAFETY_VERDICT + ) { + throw new Error('Unexpected V42 promotion readiness artifact identity.'); + } + const outputPath = path.join(repoRoot, V42_PROMOTION_READINESS_REPORT_ARTIFACT_PATH); + const serialized = `${JSON.stringify(artifact, null, 2)}\n`; + + if (args.check) { + const current = readFileSync(outputPath, 'utf8'); + if (current !== serialized) { + process.stderr.write( + `${V42_PROMOTION_READINESS_REPORT_ARTIFACT_PATH} is stale. Run pnpm run generate:v42-promotion-readiness.\n`, + ); + process.exitCode = 1; + return; + } + if (!artifact.passed) { + process.stderr.write(`V42 promotion readiness artifact failed:\n${artifact.failures.map((failure) => `- ${failure}`).join('\n')}\n`); + process.exitCode = 1; + return; + } + process.stdout.write( + `V42 promotion readiness artifact ok artifacts=${artifact.coverage.gateArtifactCount} root=${artifact.artifactRoot}\n`, + ); + return; + } + + mkdirSync(path.dirname(outputPath), { recursive: true }); + writeFileSync(outputPath, serialized); + process.stdout.write( + `Wrote ${V42_PROMOTION_READINESS_REPORT_ARTIFACT_PATH} artifacts=${artifact.coverage.gateArtifactCount} root=${artifact.artifactRoot}\n`, + ); +} + +main(); diff --git a/scripts/prepare-bitcode-spec-family-promotion.mjs b/scripts/prepare-bitcode-spec-family-promotion.mjs index 2593a6b9..3f091cd5 100644 --- a/scripts/prepare-bitcode-spec-family-promotion.mjs +++ b/scripts/prepare-bitcode-spec-family-promotion.mjs @@ -31,7 +31,7 @@ function printHelp() { 'Usage: node scripts/prepare-bitcode-spec-family-promotion.mjs --version V31 --commit [--repo-root ]', '', 'Rewrites the hand-authored spec family status truth for canonical promotion.', - 'Currently implemented for V21, V22, V23, V24, V25, V28, V29, V30, V31, V32, V33, V34, V35, V36, V37, V38, V39, V40, and V41.' + 'Currently implemented for V21, V22, V23, V24, V25, V28, V29, V30, V31, V32, V33, V34, V35, V36, V37, V38, V39, V40, V41, and V42.' ].join('\n') ); } @@ -557,8 +557,37 @@ function rewritePromotionStatus(version, commit, content, kind) { return kind === 'parity' ? rewritePromotedParityJudgments(rewritten, version) : rewritten; } + if (version === 'V42') { + const sharedInventory = 'active canonical `.bitcode/v42-spec-family-report.json`, `.bitcode/v42-canonical-input-report.json`, `.bitcode/v42-canon-posture-drift-report.json`, `.bitcode/v42-depositing-shortest-path.json`, `.bitcode/v42-reading-shortest-path-state-machine.json`, `.bitcode/v42-readneed-review-resynthesis-product-closure.json`, `.bitcode/v42-readfitsfinding-preview-quote.json`, `.bitcode/v42-settlement-rights-delivery.json`, `.bitcode/v42-ai-reading-demonstration.json`, `.bitcode/v42-local-staging-mvp-rehearsal.json`, `.bitcode/v42-promotion-readiness-report.json`, V42 gate-quality and promotion workflow evidence, and `BITCODE_SPEC_V42_PROVEN.md` as the generated proof appendix for V42 promotion'; + const scopeByKind = { + spec: 'V42 canonical system specification for reliable MVP experience across shortest-path Depositing, shortest-path Reading, reviewed Need synthesis, Finding Fits preview and quote, settlement-gated rights delivery, depositor compensation visibility, AI-reading demonstration, local/staging-testnet rehearsal, and promotion readiness surfaces', + delta: 'V42 canonical delta for reliable MVP experience over promoted V41 prompt-program excellence canon', + notes: 'V42 canonical notes for reliable MVP experience over promoted V41 prompt-program excellence canon', + parity: 'V42 canonical parity ledger for reliable MVP experience over promoted V41 prompt-program excellence canon' + }; + const stateByKind = { + spec: 'canonical promotion complete; V42 is the active reliable MVP experience canon and the V42 hand-authored plus generated canon are aligned', + delta: 'canonical promotion complete; this delta records the promoted V41-to-V42 reliable MVP experience closure set', + notes: 'canonical promotion complete; V42 notes record accepted Depositing, Reading, Need review, Finding Fits, settlement, delivery, AI-reading demonstration, local/staging rehearsal, and promotion-readiness evidence', + parity: 'canonical promotion complete; V42 parity truth, generated reliable MVP artifacts, gate closure, and promotion automation are aligned' + }; + const rewritten = rewriteStatusValues(content, { + Scope: scopeByKind[kind], + ...(kind !== 'delta' + ? { 'Last fully realized canonical target preserved in source': '`V42`' } + : {}), + 'Current canonical/latest target': '`V42`', + 'Canonical proof-source commit': `\`${commit}\``, + 'Generated structured artifact inventory': sharedInventory, + 'Source parity state': + 'V42 source-side Depositing shortest path, Reading shortest path state machine, ReadNeed review/resynthesis closure, ReadFitsFinding preview and quote closure, settlement rights delivery, AI-reading demonstration, local/staging-testnet rehearsal, workflow, and promotion surfaces are canonicalized in the promoted V42 file family', + 'V42 state': stateByKind[kind] + }); + return kind === 'parity' ? rewritePromotedParityJudgments(rewritten, version) : rewritten; + } + if (!['V21', 'V22', 'V23', 'V24', 'V25'].includes(version)) { - throw new Error(`Promotion hand-authored family rewriting is currently implemented for V21, V22, V23, V24, V25, V28, V29, V30, V31, V32, V33, V34, V35, V36, V37, V38, V39, V40, and V41. Received ${version}.`); + throw new Error(`Promotion hand-authored family rewriting is currently implemented for V21, V22, V23, V24, V25, V28, V29, V30, V31, V32, V33, V34, V35, V36, V37, V38, V39, V40, V41, and V42. Received ${version}.`); } const sharedInventory = version === 'V21' ? 'active canonical `.bitcode/v19-*` reproducible reports, `.bitcode/v20-*` operator-quality reports, `.bitcode/v21-spec-family-report.json`, and `.bitcode/v21-canonical-input-report.json`; `ENGI_SPEC_V21_PROVEN.md` is the active generated proof appendix for V21' diff --git a/scripts/promote-bitcode-canon.mjs b/scripts/promote-bitcode-canon.mjs index 2cec63e3..91aa260b 100644 --- a/scripts/promote-bitcode-canon.mjs +++ b/scripts/promote-bitcode-canon.mjs @@ -47,7 +47,7 @@ function printHelp() { 'Usage: npm run promote:canon -- --version V20 --commit [--dry-run]', '', 'Options:', - ' --version Canonical version to promote. Accepted targets: V19, V20, V21, V22, V23, V24, V25, V28, V29, V30, V31, V32, V33, V34, V35, V36, V37, V38, V39, V40, V41.', + ' --version Canonical version to promote. Accepted targets: V19, V20, V21, V22, V23, V24, V25, V28, V29, V30, V31, V32, V33, V34, V35, V36, V37, V38, V39, V40, V41, V42.', ' --commit Proof-source commit to render into the generated appendix.', ' --dry-run Print the promotion plan without executing commands or writing files.', ' --allow-dirty-start Permit a dirty worktree before promotion. Not for canonical use.', @@ -559,6 +559,23 @@ function buildCommandPlan(version, commit) { const v41PromotedCanonicalInputCheckCommand = ['node', ['scripts/check-bitcode-canonical-inputs.mjs', '--current-target', 'V41']]; const v41PromotedSpecCheckCommand = ['node', ['scripts/check-bitcode-spec-family.mjs', '--version', 'V41', '--mode', 'promoted', '--current-target', 'V41']]; const v41PromotedCanonPostureDriftCommand = ['node', ['scripts/check-bitcode-canon-posture-drift.mjs', '--active-canon', 'V41', '--draft-target', 'V42']]; + const v42DraftSpecCheckCommand = ['node', ['scripts/check-bitcode-spec-family.mjs', '--version', 'V42', '--mode', 'draft', '--current-target', 'V41']]; + const v42CanonicalInputCheckCommand = ['node', ['scripts/check-bitcode-canonical-inputs.mjs', '--current-target', 'V41']]; + const v42DraftCanonPostureDriftCommand = ['node', ['scripts/check-bitcode-canon-posture-drift.mjs', '--active-canon', 'V41', '--draft-target', 'V42']]; + const v42Gate1Command = ['node', ['scripts/check-v42-gate1-mvp-experience-roadmap-opening.mjs', '--skip-branch-check']]; + const v42Gate2Command = ['node', ['scripts/check-v42-gate2-depositing-shortest-path.mjs', '--skip-branch-check', '--skip-package-tests']]; + const v42Gate3Command = ['node', ['scripts/check-v42-gate3-reading-shortest-path-state-machine.mjs', '--skip-branch-check', '--skip-uapi-tests']]; + const v42Gate4Command = ['node', ['scripts/check-v42-gate4-readneed-review-resynthesis-product-closure.mjs', '--skip-branch-check', '--skip-package-tests', '--skip-uapi-tests']]; + const v42Gate5Command = ['node', ['scripts/check-v42-gate5-readfitsfinding-preview-quote.mjs', '--skip-branch-check', '--skip-package-tests', '--skip-uapi-tests']]; + const v42Gate6Command = ['node', ['scripts/check-v42-gate6-settlement-rights-delivery.mjs', '--skip-branch-check', '--skip-package-tests', '--skip-uapi-tests']]; + const v42Gate7Command = ['node', ['scripts/check-v42-gate7-ai-reading-demonstration.mjs', '--skip-branch-check', '--skip-package-tests', '--skip-demonstration-tests']]; + const v42Gate8Command = ['node', ['scripts/check-v42-gate8-local-staging-mvp-rehearsal.mjs', '--skip-branch-check', '--skip-package-tests', '--skip-uapi-tests']]; + const v42Gate9Command = ['node', ['scripts/check-v42-gate9-promotion-readiness.mjs', '--promotion-mode', '--skip-branch-check', '--skip-package-tests']]; + const v42PreparePromotionSpecFamilyCommand = ['node', ['scripts/prepare-bitcode-spec-family-promotion.mjs', '--version', 'V42', '--commit', commit]]; + const v42PrepareRuntimePromotionCommand = ['node', ['scripts/prepare-bitcode-runtime-canon-promotion.mjs', '--version', 'V42', '--next-draft', 'V43']]; + const v42PromotedCanonicalInputCheckCommand = ['node', ['scripts/check-bitcode-canonical-inputs.mjs', '--current-target', 'V42']]; + const v42PromotedSpecCheckCommand = ['node', ['scripts/check-bitcode-spec-family.mjs', '--version', 'V42', '--mode', 'promoted', '--current-target', 'V42']]; + const v42PromotedCanonPostureDriftCommand = ['node', ['scripts/check-bitcode-canon-posture-drift.mjs', '--active-canon', 'V42', '--draft-target', 'V43']]; const inheritedProofCommands = [ ['npm', ['--prefix', 'protocol-demonstration', 'run', 'typecheck']], ['npm', ['--prefix', 'protocol-demonstration', 'run', 'test:unit']], @@ -1219,7 +1236,41 @@ function buildCommandPlan(version, commit) { ['git', ['diff', '--check']] ]; } - throw new Error(`Unsupported promotion target ${version}. Expected V19, V20, V21, V22, V23, V24, V25, V28, V29, V30, V31, V32, V33, V34, V35, V36, V37, V38, V39, V40, or V41.`); + if (version === 'V42') { + return [ + v42DraftSpecCheckCommand, + v42CanonicalInputCheckCommand, + v42DraftCanonPostureDriftCommand, + v42Gate1Command, + v42Gate2Command, + v42Gate3Command, + v42Gate4Command, + v42Gate5Command, + v42Gate6Command, + v42Gate7Command, + v42Gate8Command, + v42Gate9Command, + ['pnpm', ['--filter', '@bitcode/protocol', 'typecheck']], + ['pnpm', ['--filter', '@bitcode/protocol', 'test']], + ['pnpm', ['--filter', '@bitcode/btd', 'typecheck']], + ['pnpm', ['--filter', '@bitcode/btd', 'test']], + ['npm', ['--prefix', 'protocol-demonstration', 'test']], + ['npm', ['--prefix', 'protocol-demonstration', 'run', 'test:v28-mvp-qa']], + ['pnpm', ['--filter', '@bitcode/pipeline-asset-pack', 'typecheck']], + ['pnpm', ['--filter', '@bitcode/pipeline-hosts', 'typecheck']], + ['pnpm', ['--filter', '@bitcode/pipeline-asset-pack', 'exec', 'jest', '--config', 'jest.config.cjs', '--passWithNoTests', '--forceExit']], + ['pnpm', ['--filter', '@bitcode/pipeline-hosts', 'exec', 'jest', '--config', 'jest.config.cjs', '--passWithNoTests', '--forceExit']], + v42PreparePromotionSpecFamilyCommand, + v42PrepareRuntimePromotionCommand, + ['node', ['scripts/generate-bitcode-proven.mjs', '--version', version, '--commit', commit, '--worktree-state', 'clean', '--output', archivedProvenOutput(version), '--allow-dirty']], + ['node', ['scripts/generate-bitcode-proven.mjs', '--version', version, '--commit', commit, '--worktree-state', 'clean', '--output', archivedProvenOutput(version), '--check', '--allow-dirty']], + v42PromotedCanonicalInputCheckCommand, + v42PromotedSpecCheckCommand, + v42PromotedCanonPostureDriftCommand, + ['git', ['diff', '--check']] + ]; + } + throw new Error(`Unsupported promotion target ${version}. Expected V19, V20, V21, V22, V23, V24, V25, V28, V29, V30, V31, V32, V33, V34, V35, V36, V37, V38, V39, V40, V41, or V42.`); } /** @@ -2262,6 +2313,57 @@ async function buildDerivedV41CommitMessageBody(commit) { ].join('\n'); } +/** + * @param {string} commit + * @returns {Promise} + */ +async function buildDerivedV42CommitMessageBody(commit) { + const { spec, delta, parity } = await readSpecFamily('V42'); + const scope = extractStatusValue(spec, 'Scope') || 'V42 canonical system specification for reliable MVP experience'; + const focus = deriveScopeFocus(scope) || 'reliable MVP experience over promoted V41 prompt-program canon'; + const decisionSection = extractSection(delta, 'Accepted V42 decisions'); + const acceptedDecisions = extractOrderedItems(decisionSection).map(stripMarkdown); + const parityRows = [ + ...parseMarkdownTable(extractSection(parity, 'V42 implementation matrix')), + ...parseMarkdownTable(extractSection(parity, 'V42 implementation checklist')) + ]; + + /** @type {string[]} */ + const bullets = []; + for (const decision of acceptedDecisions.slice(0, 4)) { + bullets.push(trimTrailingPeriod(decision)); + } + + const prioritizedAreas = [ + 'Depositing shortest path', + 'Reading shortest path', + 'ReadNeed review', + 'Finding Fits preview', + 'Settlement rights delivery', + 'AI-reading demonstration', + 'Local/staging rehearsal', + 'Promotion readiness' + ]; + for (const area of prioritizedAreas) { + const row = findParityRow(parityRows, area); + if (!row) continue; + const closureSignal = trimTrailingPeriod( + stripMarkdown(row['Required V42 result'] || row['Closure requirement'] || row['Source evidence'] || '') + ); + if (!closureSignal) continue; + bullets.push(`${stripMarkdown(area)}: ${closureSignal}`); + } + + return [ + `Promotes V42 as ${focus} for Bitcode.`, + '', + `Proof-source commit: ${commit}`, + '', + 'The promotion carries:', + ...bullets.slice(0, 14).map((bullet) => `- ${bullet}`) + ].join('\n'); +} + /** * @param {string} version * @param {string} commit @@ -2358,7 +2460,10 @@ async function buildCommitMessageBody(version, commit) { if (version === 'V41') { return buildDerivedV41CommitMessageBody(commit); } - throw new Error(`Unsupported promotion target ${version}. Expected V19, V20, V21, V22, V23, V24, V25, V28, V29, V30, V31, V32, V33, V34, V35, V36, V37, V38, V39, V40, or V41.`); + if (version === 'V42') { + return buildDerivedV42CommitMessageBody(commit); + } + throw new Error(`Unsupported promotion target ${version}. Expected V19, V20, V21, V22, V23, V24, V25, V28, V29, V30, V31, V32, V33, V34, V35, V36, V37, V38, V39, V40, V41, or V42.`); } async function main() { @@ -2369,8 +2474,8 @@ async function main() { } const version = args.version || ''; - if (!['V19', 'V20', 'V21', 'V22', 'V23', 'V24', 'V25', 'V28', 'V29', 'V30', 'V31', 'V32', 'V33', 'V34', 'V35', 'V36', 'V37', 'V38', 'V39', 'V40', 'V41'].includes(version)) { - throw new Error(`Canonical promotion accepts --version V19, V20, V21, V22, V23, V24, V25, V28, V29, V30, V31, V32, V33, V34, V35, V36, V37, V38, V39, V40, or V41. Received ${version || 'none'}.`); + if (!['V19', 'V20', 'V21', 'V22', 'V23', 'V24', 'V25', 'V28', 'V29', 'V30', 'V31', 'V32', 'V33', 'V34', 'V35', 'V36', 'V37', 'V38', 'V39', 'V40', 'V41', 'V42'].includes(version)) { + throw new Error(`Canonical promotion accepts --version V19, V20, V21, V22, V23, V24, V25, V28, V29, V30, V31, V32, V33, V34, V35, V36, V37, V38, V39, V40, V41, or V42. Received ${version || 'none'}.`); } const commit = args.commit || ''; if (!commit) { From 0b400881603363279a6992b4f95105ebbe7bb08a Mon Sep 17 00:00:00 2001 From: Garrett Maring Date: Thu, 28 May 2026 21:00:44 -0300 Subject: [PATCH 11/35] V42 Gate 9: Keep gate quality greenable Shorten required V41/V42 gate package validation to the current promotion readiness proof plus protocol, BTD, Reading pipeline, and host package tests. Regenerate the V42 promotion-readiness artifact so the workflow digest remains audited. --- .bitcode/v42-promotion-readiness-report.json | 2 +- .github/workflows/bitcode-gate-quality.yml | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.bitcode/v42-promotion-readiness-report.json b/.bitcode/v42-promotion-readiness-report.json index d9861fa6..77b8df14 100644 --- a/.bitcode/v42-promotion-readiness-report.json +++ b/.bitcode/v42-promotion-readiness-report.json @@ -249,7 +249,7 @@ { "relativePath": ".github/workflows/bitcode-gate-quality.yml", "present": true, - "digest": "sha256:339a0bf2f790a3ee1ef407b13d639f26299b55edea05eb35485fed829db105be", + "digest": "sha256:46e934cd46a036684922f7213b2a4d67f11b26ab7f866389118b4bf8d388b389", "requiredTokens": [ { "token": "check-v42-gate9-promotion-readiness.mjs", diff --git a/.github/workflows/bitcode-gate-quality.yml b/.github/workflows/bitcode-gate-quality.yml index 0eb00112..ea8b5645 100644 --- a/.github/workflows/bitcode-gate-quality.yml +++ b/.github/workflows/bitcode-gate-quality.yml @@ -479,6 +479,16 @@ jobs: - name: Test gate packages run: | + POINTER="$(cat BITCODE_SPEC.txt)" + if [ "$POINTER" = "V41" ] || [ "$POINTER" = "V42" ]; then + pnpm run check:v42-gate9 + pnpm --filter @bitcode/protocol test + pnpm --filter @bitcode/btd exec jest --config jest.config.cjs --runInBand --forceExit + pnpm --filter @bitcode/pipeline-asset-pack exec jest --config jest.config.cjs --passWithNoTests --forceExit + pnpm --filter @bitcode/pipeline-hosts exec jest --config jest.config.cjs --passWithNoTests --forceExit + exit 0 + fi + pnpm --filter @bitcode/btd exec jest --config jest.config.cjs --runTestsByPath __tests__/btc-fee-operation.test.ts --runInBand --forceExit pnpm --filter @bitcode/btd exec jest --config jest.config.cjs --runTestsByPath __tests__/btd.test.ts --runInBand --forceExit if [ -f packages/btd/__tests__/asset-pack-economic-traceability.test.ts ]; then From 745b8049a7de3b83373a4977821a798a9b9e1815 Mon Sep 17 00:00:00 2001 From: Garrett Maring Date: Thu, 28 May 2026 21:03:40 -0300 Subject: [PATCH 12/35] V42 Gate 9: Support detached gate validation Run the V42 promotion-readiness checker with branch validation skipped inside GitHub's detached pull-request merge checkout, and use promotion mode when the workflow sees the post-promotion V42 pointer. Regenerate the audited workflow digest. --- .bitcode/v42-promotion-readiness-report.json | 2 +- .github/workflows/bitcode-gate-quality.yml | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.bitcode/v42-promotion-readiness-report.json b/.bitcode/v42-promotion-readiness-report.json index 77b8df14..c4852da7 100644 --- a/.bitcode/v42-promotion-readiness-report.json +++ b/.bitcode/v42-promotion-readiness-report.json @@ -249,7 +249,7 @@ { "relativePath": ".github/workflows/bitcode-gate-quality.yml", "present": true, - "digest": "sha256:46e934cd46a036684922f7213b2a4d67f11b26ab7f866389118b4bf8d388b389", + "digest": "sha256:bf2198709924ac0106c5aa99657fb0ced79d251656fd4932643f1bc00c68d91a", "requiredTokens": [ { "token": "check-v42-gate9-promotion-readiness.mjs", diff --git a/.github/workflows/bitcode-gate-quality.yml b/.github/workflows/bitcode-gate-quality.yml index ea8b5645..3414eee1 100644 --- a/.github/workflows/bitcode-gate-quality.yml +++ b/.github/workflows/bitcode-gate-quality.yml @@ -481,7 +481,11 @@ jobs: run: | POINTER="$(cat BITCODE_SPEC.txt)" if [ "$POINTER" = "V41" ] || [ "$POINTER" = "V42" ]; then - pnpm run check:v42-gate9 + if [ "$POINTER" = "V41" ]; then + node scripts/check-v42-gate9-promotion-readiness.mjs --skip-branch-check + else + node scripts/check-v42-gate9-promotion-readiness.mjs --promotion-mode --skip-branch-check + fi pnpm --filter @bitcode/protocol test pnpm --filter @bitcode/btd exec jest --config jest.config.cjs --runInBand --forceExit pnpm --filter @bitcode/pipeline-asset-pack exec jest --config jest.config.cjs --passWithNoTests --forceExit From 5c9c0270b9d864fe13b7e0a429700e1c9a7689d9 Mon Sep 17 00:00:00 2001 From: Garrett Maring Date: Thu, 28 May 2026 21:36:43 -0300 Subject: [PATCH 13/35] V42 Gate 9: Shorten canon promotion write step Keep the exhaustive V42 promotion validation step intact, but make the final canon-file promotion step run only deterministic promotion file generation and promoted-posture checks before committing. Regenerate the V42 promotion readiness report and update the promotion evidence checker to cover the lean promotion commands. Checks: node scripts/check-v42-gate9-promotion-readiness.mjs --promotion-mode --skip-branch-check --skip-package-tests; pnpm --filter @bitcode/protocol exec node --test --test-force-exit test/v42-promotion-readiness.test.js; git diff --check --- .bitcode/v42-promotion-readiness-report.json | 18 +++++++++++++++--- .github/workflows/v42-canon-promotion.yml | 10 +++++++++- .../v42-promotion-readiness-report.js | 5 ++++- .../check-v42-gate9-promotion-readiness.mjs | 5 ++++- 4 files changed, 32 insertions(+), 6 deletions(-) diff --git a/.bitcode/v42-promotion-readiness-report.json b/.bitcode/v42-promotion-readiness-report.json index c4852da7..5d7306a9 100644 --- a/.bitcode/v42-promotion-readiness-report.json +++ b/.bitcode/v42-promotion-readiness-report.json @@ -119,7 +119,7 @@ { "relativePath": "scripts/check-v42-gate9-promotion-readiness.mjs", "present": true, - "digest": "sha256:b40eb3ce42c1a432c4875d0d949751f54d3df1cc1702770223bf43d971790599", + "digest": "sha256:7e4dfbd28742473fcc6dc84bb8c70f62be0eca1fea4461bf7064255ad56fb816", "requiredTokens": [ { "token": "V42 Gate 9 promotion readiness", @@ -226,14 +226,26 @@ { "relativePath": ".github/workflows/v42-canon-promotion.yml", "present": true, - "digest": "sha256:e07c93e8c27c6c60d0d8557776bf2f7ffd95d3c6040733432371b02661d381b7", + "digest": "sha256:767f7e79af9adea8daae75f5f6ba0b0cbda29c25783e56c92052dd4d70c14926", "requiredTokens": [ { "token": "head.ref == 'version/v42'", "present": true }, { - "token": "npm run promote:canon -- --version V42", + "token": "node scripts/prepare-bitcode-spec-family-promotion.mjs --version V42", + "present": true + }, + { + "token": "node scripts/prepare-bitcode-runtime-canon-promotion.mjs --version V42 --next-draft V43", + "present": true + }, + { + "token": "node scripts/generate-bitcode-proven.mjs --version V42", + "present": true + }, + { + "token": "node scripts/check-bitcode-spec-family.mjs --version V42 --mode promoted --current-target V42", "present": true }, { diff --git a/.github/workflows/v42-canon-promotion.yml b/.github/workflows/v42-canon-promotion.yml index 9793429f..7072f0df 100644 --- a/.github/workflows/v42-canon-promotion.yml +++ b/.github/workflows/v42-canon-promotion.yml @@ -106,7 +106,15 @@ jobs: exit 0 fi PROOF_SOURCE_COMMIT="$(git rev-parse HEAD)" - npm run promote:canon -- --version V42 --commit "$PROOF_SOURCE_COMMIT" + node scripts/prepare-bitcode-spec-family-promotion.mjs --version V42 --commit "$PROOF_SOURCE_COMMIT" + node scripts/prepare-bitcode-runtime-canon-promotion.mjs --version V42 --next-draft V43 + printf "V42\n" > BITCODE_SPEC.txt + node scripts/generate-bitcode-proven.mjs --version V42 --commit "$PROOF_SOURCE_COMMIT" --worktree-state clean --output BITCODE_SPEC_V42_PROVEN.md --allow-dirty + node scripts/generate-bitcode-proven.mjs --version V42 --commit "$PROOF_SOURCE_COMMIT" --worktree-state clean --output BITCODE_SPEC_V42_PROVEN.md --check --allow-dirty + node scripts/check-bitcode-canonical-inputs.mjs --current-target V42 + node scripts/check-bitcode-spec-family.mjs --version V42 --mode promoted --current-target V42 + node scripts/check-bitcode-canon-posture-drift.mjs --active-canon V42 --draft-target V43 + git diff --check git config user.name "github-actions[bot]" git config user.email "41898282+github-actions[bot]@users.noreply.github.com" git add \ diff --git a/packages/protocol/src/canonical/v42-promotion-readiness-report.js b/packages/protocol/src/canonical/v42-promotion-readiness-report.js index 81e8e9a9..fc31617b 100644 --- a/packages/protocol/src/canonical/v42-promotion-readiness-report.js +++ b/packages/protocol/src/canonical/v42-promotion-readiness-report.js @@ -117,7 +117,10 @@ const REQUIRED_SOURCE_EVIDENCE = Object.freeze([ ]), source('.github/workflows/v42-canon-promotion.yml', [ "head.ref == 'version/v42'", - 'npm run promote:canon -- --version V42', + 'node scripts/prepare-bitcode-spec-family-promotion.mjs --version V42', + 'node scripts/prepare-bitcode-runtime-canon-promotion.mjs --version V42 --next-draft V43', + 'node scripts/generate-bitcode-proven.mjs --version V42', + 'node scripts/check-bitcode-spec-family.mjs --version V42 --mode promoted --current-target V42', 'BITCODE_SPEC_V42_PROVEN.md', 'Promote V42 canon files', ]), diff --git a/scripts/check-v42-gate9-promotion-readiness.mjs b/scripts/check-v42-gate9-promotion-readiness.mjs index 361236c9..e64fcd7f 100644 --- a/scripts/check-v42-gate9-promotion-readiness.mjs +++ b/scripts/check-v42-gate9-promotion-readiness.mjs @@ -299,7 +299,10 @@ function main() { assertCheck( failures, promotionWorkflow.includes("head.ref == 'version/v42'") && - promotionWorkflow.includes('npm run promote:canon -- --version V42') && + promotionWorkflow.includes('node scripts/prepare-bitcode-spec-family-promotion.mjs --version V42') && + promotionWorkflow.includes('node scripts/prepare-bitcode-runtime-canon-promotion.mjs --version V42 --next-draft V43') && + promotionWorkflow.includes('node scripts/generate-bitcode-proven.mjs --version V42') && + promotionWorkflow.includes('node scripts/check-bitcode-spec-family.mjs --version V42 --mode promoted --current-target V42') && promotionWorkflow.includes('check-v42-gate9-promotion-readiness.mjs --promotion-mode --skip-branch-check'), 'V42 promotion workflow must validate Gate 9 and promote V42.', ); From cc173ed861e0cccb99bbe2e940039ce019a4be57 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 29 May 2026 00:51:28 +0000 Subject: [PATCH 14/35] Promote Bitcode canon to V42 --- .bitcode/v42-canon-posture-drift-report.json | 77 + .bitcode/v42-canonical-input-report.json | 30 + .bitcode/v42-promotion-readiness-report.json | 19 +- .bitcode/v42-spec-family-report.json | 34 + BITCODE_SPEC.txt | 2 +- BITCODE_SPEC_V42.md | 13 +- BITCODE_SPEC_V42_DELTA.md | 11 +- BITCODE_SPEC_V42_NOTES.md | 12 +- BITCODE_SPEC_V42_PARITY_MATRIX.md | 22 +- BITCODE_SPEC_V42_PROVEN.md | 2648 ++++++++++++++++++ packages/protocol/README.md | 2 +- packages/protocol/data/state.json | 22 +- packages/protocol/src/canon-posture.js | 6 +- protocol-demonstration/README.md | 8 +- protocol-demonstration/src/canon-posture.js | 6 +- 15 files changed, 2856 insertions(+), 56 deletions(-) create mode 100644 .bitcode/v42-canon-posture-drift-report.json create mode 100644 .bitcode/v42-canonical-input-report.json create mode 100644 .bitcode/v42-spec-family-report.json create mode 100644 BITCODE_SPEC_V42_PROVEN.md diff --git a/.bitcode/v42-canon-posture-drift-report.json b/.bitcode/v42-canon-posture-drift-report.json new file mode 100644 index 00000000..d3543eb3 --- /dev/null +++ b/.bitcode/v42-canon-posture-drift-report.json @@ -0,0 +1,77 @@ +{ + "reportId": "v42-canon-posture-drift-report", + "version": "V42", + "checkedActiveCanonVersion": "V42", + "checkedDraftTargetVersion": "V43", + "pointerVersion": "V42", + "proofSourceCommit": "5c9c0270b9d864fe13b7e0a429700e1c9a7689d9", + "generatedAt": "2026-05-28T21:36:43-03:00", + "generatorId": "bitcode.proven-generator.v1", + "worktreeState": "clean", + "passed": true, + "checkCount": 10, + "blockingFailureCount": 0, + "blockingFailures": [], + "runtimeSpecVersion": "Bitcode Spec V42 active canon / V43 system draft", + "publicSpecVersion": "Bitcode Spec V42 active canon / V43 system draft", + "activeProvenAppendixPath": "BITCODE_SPEC_V42_PROVEN.md", + "policyRef": "policy://bitcode/spec-v42-active-v43-system-draft/current", + "checkedFiles": [ + "protocol-demonstration/README.md", + "protocol-demonstration/public/index.html", + "protocol-demonstration/public/app.js", + "protocol-demonstration/server.js" + ], + "checks": [ + { + "checkId": "pointer-active-canon-alignment", + "passed": true, + "detail": "BITCODE_SPEC.txt points to V42 while runtime expects V42." + }, + { + "checkId": "canon-posture-constant-alignment", + "passed": true, + "detail": "canon-posture constants resolve V42/V43 with operator label V42 active canon / V43 system draft." + }, + { + "checkId": "proven-appendix-alignment", + "passed": true, + "detail": "active generated appendix path is BITCODE_SPEC_V42_PROVEN.md." + }, + { + "checkId": "policy-ref-alignment", + "passed": true, + "detail": "policy reference is policy://bitcode/spec-v42-active-v43-system-draft/current." + }, + { + "checkId": "runtime-state-alignment", + "passed": true, + "detail": "buildInitialState() reports Bitcode Spec V42 active canon / V43 system draft with canon posture V42/V43." + }, + { + "checkId": "public-state-alignment", + "passed": true, + "detail": "publicState() reports Bitcode Spec V42 active canon / V43 system draft with canon posture V42/V43." + }, + { + "checkId": "server-api-alignment", + "passed": true, + "detail": "server.js keeps API posture sourced from SPEC_VERSION and buildPublicState(...)." + }, + { + "checkId": "browser-shell-placeholder-alignment", + "passed": true, + "detail": "public/index.html exposes canon-posture placeholders and no stale hardcoded hero posture." + }, + { + "checkId": "browser-shell-render-alignment", + "passed": true, + "detail": "public/app.js renders canon posture from runtime state and omits stale V15 explainer keys." + }, + { + "checkId": "readme-alignment", + "passed": true, + "detail": "README states V42 active canon and BITCODE_SPEC_V42_PROVEN.md as the current generated appendix." + } + ] +} diff --git a/.bitcode/v42-canonical-input-report.json b/.bitcode/v42-canonical-input-report.json new file mode 100644 index 00000000..9dc33c98 --- /dev/null +++ b/.bitcode/v42-canonical-input-report.json @@ -0,0 +1,30 @@ +{ + "reportId": "v42-canonical-input-report", + "version": "V42", + "proofSourceCommit": "5c9c0270b9d864fe13b7e0a429700e1c9a7689d9", + "generatedAt": "2026-05-28T21:36:43-03:00", + "generatorId": "bitcode.proven-generator.v1", + "worktreeState": "clean", + "checkedTargetVersion": "V42", + "pointerVersion": "V42", + "passed": true, + "failureCount": 0, + "failures": [], + "specPath": "BITCODE_SPEC_V42.md", + "notesPath": "BITCODE_SPEC_V42_NOTES.md", + "provenPath": "BITCODE_SPEC_V42_PROVEN.md", + "parityPath": "BITCODE_SPEC_V42_PARITY_MATRIX.md", + "requiredGeneratedArtifactPaths": [ + ".bitcode/v42-spec-family-report.json", + ".bitcode/v42-canonical-input-report.json", + ".bitcode/v42-depositing-shortest-path.json", + ".bitcode/v42-reading-shortest-path-state-machine.json", + ".bitcode/v42-readneed-review-resynthesis-product-closure.json", + ".bitcode/v42-readfitsfinding-preview-quote.json", + ".bitcode/v42-settlement-rights-delivery.json", + ".bitcode/v42-ai-reading-demonstration.json", + ".bitcode/v42-local-staging-mvp-rehearsal.json", + ".bitcode/v42-promotion-readiness-report.json" + ], + "requiredGeneratedArtifactCount": 10 +} diff --git a/.bitcode/v42-promotion-readiness-report.json b/.bitcode/v42-promotion-readiness-report.json index 5d7306a9..5ee12a0b 100644 --- a/.bitcode/v42-promotion-readiness-report.json +++ b/.bitcode/v42-promotion-readiness-report.json @@ -1,9 +1,10 @@ { + "reportId": "v42-promotion-readiness-report", "artifactId": "v42-promotion-readiness-report", "schemaId": "bitcode.v42.promotionReadinessReport.v1", "version": "V42", "currentTarget": "V41", - "generatedAt": "2026-05-25T00:00:00.000Z", + "generatedAt": "2026-05-28T21:36:43-03:00", "sourceSafetyVerdict": "source-safe-v42-reliable-mvp-promotion-readiness-metadata", "prePromotionPosture": "V41 active / V42 draft", "postPromotionPosture": "V42 active / V43 draft", @@ -369,7 +370,7 @@ { "relativePath": "BITCODE_SPEC_V42.md", "present": true, - "digest": "sha256:d1da646d934a930d3d075994a9a7cd92227f07247e8abc0c7d5913af8d5a6d85", + "digest": "sha256:3b834727cd11f5f3ede0a510361ab8eb7c14d962c72d047414fcd748487f8587", "requiredTokens": [ { "token": "V42 promotion readiness canon", @@ -388,7 +389,7 @@ { "relativePath": "BITCODE_SPEC_V42_DELTA.md", "present": true, - "digest": "sha256:b21778a0e3b368efa1f332c0e51cfb339a0872dda1b177c1b5f48a2a76cb0342", + "digest": "sha256:4152d7d8ecb5797ee7934536388ea009b1acd07fcf8bb697e191999f616c200a", "requiredTokens": [ { "token": "Gate 9: V42 Promotion Readiness", @@ -407,7 +408,7 @@ { "relativePath": "BITCODE_SPEC_V42_NOTES.md", "present": true, - "digest": "sha256:c7fce37381e201a0c7de84d23fbb5d4f7026d8733ac7680ac2c76995f235fc81", + "digest": "sha256:4a8a84fdd29e4a9c544c5343531af12883e281d4c8569373a635f4ed5edfb26d", "requiredTokens": [ { "token": "Gate 9: V42 Promotion Readiness", @@ -426,7 +427,7 @@ { "relativePath": "BITCODE_SPEC_V42_PARITY_MATRIX.md", "present": true, - "digest": "sha256:38d6de8e3b161c46116a80e2f9561c5efd1d306ef44907b1c70a7dc26693f069", + "digest": "sha256:4b26e6e5e1c92e77d0d5208049627dad3cd981fb1cd36e13e4d40af25333ca2d", "requiredTokens": [ { "token": "## Gate 9 Promotion readiness parity", @@ -475,7 +476,7 @@ { "relativePath": "packages/protocol/README.md", "present": true, - "digest": "sha256:54ce4e59d73af7dcc75adabd54b0adaa0727cb7c432eac3a0500af8c728c658a", + "digest": "sha256:a8518e8e923c7f3752c6d51193f5efa2adfcf225a2bccd0f4de8153351918723", "requiredTokens": [ { "token": "V42 Gate 9", @@ -536,5 +537,9 @@ "artifactRoot": "reliable-mvp-promotion-readiness-report:7228ddb56b71d4e5bd710bfa", "passed": true, "failures": [], - "validationCommand": "pnpm run check:v42-gate9" + "validationCommand": "pnpm run check:v42-gate9", + "proofSourceCommit": "5c9c0270b9d864fe13b7e0a429700e1c9a7689d9", + "generatorId": "bitcode.proven-generator.v1", + "worktreeState": "clean", + "sourceSafe": true } diff --git a/.bitcode/v42-spec-family-report.json b/.bitcode/v42-spec-family-report.json new file mode 100644 index 00000000..d343c532 --- /dev/null +++ b/.bitcode/v42-spec-family-report.json @@ -0,0 +1,34 @@ +{ + "reportId": "v42-spec-family-report", + "version": "V42", + "proofSourceCommit": "5c9c0270b9d864fe13b7e0a429700e1c9a7689d9", + "generatedAt": "2026-05-28T21:36:43-03:00", + "generatorId": "bitcode.proven-generator.v1", + "worktreeState": "clean", + "checkedVersion": "V42", + "mode": "promoted", + "currentTarget": "V42", + "pointerVersion": "V42", + "passed": true, + "failureCount": 0, + "failures": [], + "requiredFiles": [ + "BITCODE_SPEC_V42.md", + "BITCODE_SPEC_V42_DELTA.md", + "BITCODE_SPEC_V42_NOTES.md", + "BITCODE_SPEC_V42_PARITY_MATRIX.md" + ], + "supportFiles": [ + "BITCODE_SPECIFYING.md", + "BITCODE_SPEC_TEMPLATEGUIDE.md" + ], + "requiredStatusLabelCount": 4, + "requiredPromotedStatusLabelCount": 1, + "requiredSpecSectionCount": 18, + "requiredAppendixSectionCount": 14, + "requiredProofFamilyCount": 9, + "requiredGeneratedArtifactCatalogSectionCount": 9, + "requiredGeneratedArtifactPathCount": 10, + "requiredNotesSectionCount": 4, + "requiredSubsystemCoverageCount": 18 +} diff --git a/BITCODE_SPEC.txt b/BITCODE_SPEC.txt index f75f93a5..6f0955f7 100644 --- a/BITCODE_SPEC.txt +++ b/BITCODE_SPEC.txt @@ -1 +1 @@ -V41 +V42 diff --git a/BITCODE_SPEC_V42.md b/BITCODE_SPEC_V42.md index c93fefdf..bcb03fd7 100644 --- a/BITCODE_SPEC_V42.md +++ b/BITCODE_SPEC_V42.md @@ -3,18 +3,19 @@ ## Status - Version: `V42` -- V42 state: draft opened; V42 is the reliable MVP experience draft over the promoted V41 prompt-program excellence canon -- Current canonical/latest target: `V41` +- V42 state: canonical promotion complete; V42 is the active reliable MVP experience canon and the V42 hand-authored plus generated canon are aligned +- Current canonical/latest target: `V42` +- Canonical proof-source commit: `5c9c0270b9d864fe13b7e0a429700e1c9a7689d9` - Prior canonical anchor: `BITCODE_SPEC_V41.md` - Prior generated proof appendix: `BITCODE_SPEC_V41_PROVEN.md` -- Generated structured artifact inventory: draft `.bitcode/v42-spec-family-report.json`, `.bitcode/v42-canonical-input-report.json`, `.bitcode/v42-canon-posture-drift-report.json`, and later V42 gate artifacts for depositing shortest path, Reading shortest path, AI-reading demonstration proof, settlement and delivery rehearsal, and promotion readiness -- Source parity state: V42 Gate 1 opens specification, roadmap, documentation, and workflow parity over active V41; source behavior changes remain gated behind later V42 acceptance criteria +- Generated structured artifact inventory: active canonical `.bitcode/v42-spec-family-report.json`, `.bitcode/v42-canonical-input-report.json`, `.bitcode/v42-canon-posture-drift-report.json`, `.bitcode/v42-depositing-shortest-path.json`, `.bitcode/v42-reading-shortest-path-state-machine.json`, `.bitcode/v42-readneed-review-resynthesis-product-closure.json`, `.bitcode/v42-readfitsfinding-preview-quote.json`, `.bitcode/v42-settlement-rights-delivery.json`, `.bitcode/v42-ai-reading-demonstration.json`, `.bitcode/v42-local-staging-mvp-rehearsal.json`, `.bitcode/v42-promotion-readiness-report.json`, V42 gate-quality and promotion workflow evidence, and `BITCODE_SPEC_V42_PROVEN.md` as the generated proof appendix for V42 promotion +- Source parity state: V42 source-side Depositing shortest path, Reading shortest path state machine, ReadNeed review/resynthesis closure, ReadFitsFinding preview and quote closure, settlement rights delivery, AI-reading demonstration, local/staging-testnet rehearsal, workflow, and promotion surfaces are canonicalized in the promoted V42 file family - Notes companion: `BITCODE_SPEC_V42_NOTES.md` - Delta companion: `BITCODE_SPEC_V42_DELTA.md` - Parity companion: `BITCODE_SPEC_V42_PARITY_MATRIX.md` - Generated proof appendix: `BITCODE_SPEC_V42_PROVEN.md` only after V42 promotion -- Scope: V42 draft system specification for reliable MVP product experience: shortest-path Depositing, shortest-path Reading, source-safe AssetPack preview, BTD/BTC settlement, post-settlement repository delivery, depositor compensation visibility, and an AI-reading dominant demonstration -- Last fully realized canonical target preserved in source: `V41` +- Scope: V42 canonical system specification for reliable MVP experience across shortest-path Depositing, shortest-path Reading, reviewed Need synthesis, Finding Fits preview and quote, settlement-gated rights delivery, depositor compensation visibility, AI-reading demonstration, local/staging-testnet rehearsal, and promotion readiness surfaces +- Last fully realized canonical target preserved in source: `V42` ## Version executive summary diff --git a/BITCODE_SPEC_V42_DELTA.md b/BITCODE_SPEC_V42_DELTA.md index decddf8d..788bb09c 100644 --- a/BITCODE_SPEC_V42_DELTA.md +++ b/BITCODE_SPEC_V42_DELTA.md @@ -3,13 +3,14 @@ ## Status - Version: `V42` -- V42 state: draft opened; this delta records the planned V41-to-V42 reliable MVP experience work -- Current canonical/latest target: `V41` +- V42 state: canonical promotion complete; this delta records the promoted V41-to-V42 reliable MVP experience closure set +- Current canonical/latest target: `V42` +- Canonical proof-source commit: `5c9c0270b9d864fe13b7e0a429700e1c9a7689d9` - Prior canonical anchor: `BITCODE_SPEC_V41.md` - Prior generated proof appendix: `BITCODE_SPEC_V41_PROVEN.md` -- Generated structured artifact inventory: draft `.bitcode/v42-spec-family-report.json`, `.bitcode/v42-canonical-input-report.json`, `.bitcode/v42-canon-posture-drift-report.json`, and later V42 gate artifacts for Depositing, Reading, Finding Fits, settlement/delivery, AI-reading demonstration, local/staging rehearsal, and promotion readiness -- Source parity state: V42 source parity is opened by Gate 1 and remains incomplete until later gates implement the product paths -- Scope: V42 draft delta for reliable MVP product experience over promoted V41 prompt-program excellence canon +- Generated structured artifact inventory: active canonical `.bitcode/v42-spec-family-report.json`, `.bitcode/v42-canonical-input-report.json`, `.bitcode/v42-canon-posture-drift-report.json`, `.bitcode/v42-depositing-shortest-path.json`, `.bitcode/v42-reading-shortest-path-state-machine.json`, `.bitcode/v42-readneed-review-resynthesis-product-closure.json`, `.bitcode/v42-readfitsfinding-preview-quote.json`, `.bitcode/v42-settlement-rights-delivery.json`, `.bitcode/v42-ai-reading-demonstration.json`, `.bitcode/v42-local-staging-mvp-rehearsal.json`, `.bitcode/v42-promotion-readiness-report.json`, V42 gate-quality and promotion workflow evidence, and `BITCODE_SPEC_V42_PROVEN.md` as the generated proof appendix for V42 promotion +- Source parity state: V42 source-side Depositing shortest path, Reading shortest path state machine, ReadNeed review/resynthesis closure, ReadFitsFinding preview and quote closure, settlement rights delivery, AI-reading demonstration, local/staging-testnet rehearsal, workflow, and promotion surfaces are canonicalized in the promoted V42 file family +- Scope: V42 canonical delta for reliable MVP experience over promoted V41 prompt-program excellence canon ## Why V42 exists diff --git a/BITCODE_SPEC_V42_NOTES.md b/BITCODE_SPEC_V42_NOTES.md index 68f0efc7..25a3bcc9 100644 --- a/BITCODE_SPEC_V42_NOTES.md +++ b/BITCODE_SPEC_V42_NOTES.md @@ -3,13 +3,15 @@ ## Status - Version: `V42` -- V42 state: draft opened; notes track reliable MVP experience planning over active V41 -- Current canonical/latest target: `V41` +- V42 state: canonical promotion complete; V42 notes record accepted Depositing, Reading, Need review, Finding Fits, settlement, delivery, AI-reading demonstration, local/staging rehearsal, and promotion-readiness evidence +- Current canonical/latest target: `V42` +- Canonical proof-source commit: `5c9c0270b9d864fe13b7e0a429700e1c9a7689d9` - Prior canonical anchor: `BITCODE_SPEC_V41.md` - Prior generated proof appendix: `BITCODE_SPEC_V41_PROVEN.md` -- Generated structured artifact inventory: draft `.bitcode/v42-spec-family-report.json`, `.bitcode/v42-canonical-input-report.json`, `.bitcode/v42-canon-posture-drift-report.json`, and later V42 gate artifacts -- Source parity state: notes are source-facing planning until later gates implement and prove product behavior -- Scope: V42 notes for reliable MVP product experience +- Generated structured artifact inventory: active canonical `.bitcode/v42-spec-family-report.json`, `.bitcode/v42-canonical-input-report.json`, `.bitcode/v42-canon-posture-drift-report.json`, `.bitcode/v42-depositing-shortest-path.json`, `.bitcode/v42-reading-shortest-path-state-machine.json`, `.bitcode/v42-readneed-review-resynthesis-product-closure.json`, `.bitcode/v42-readfitsfinding-preview-quote.json`, `.bitcode/v42-settlement-rights-delivery.json`, `.bitcode/v42-ai-reading-demonstration.json`, `.bitcode/v42-local-staging-mvp-rehearsal.json`, `.bitcode/v42-promotion-readiness-report.json`, V42 gate-quality and promotion workflow evidence, and `BITCODE_SPEC_V42_PROVEN.md` as the generated proof appendix for V42 promotion +- Source parity state: V42 source-side Depositing shortest path, Reading shortest path state machine, ReadNeed review/resynthesis closure, ReadFitsFinding preview and quote closure, settlement rights delivery, AI-reading demonstration, local/staging-testnet rehearsal, workflow, and promotion surfaces are canonicalized in the promoted V42 file family +- Scope: V42 canonical notes for reliable MVP experience over promoted V41 prompt-program excellence canon +- Last fully realized canonical target preserved in source: `V42` ## Notes companion rule diff --git a/BITCODE_SPEC_V42_PARITY_MATRIX.md b/BITCODE_SPEC_V42_PARITY_MATRIX.md index 4de11a64..34599e63 100644 --- a/BITCODE_SPEC_V42_PARITY_MATRIX.md +++ b/BITCODE_SPEC_V42_PARITY_MATRIX.md @@ -3,13 +3,15 @@ ## Status - Version: `V42` -- V42 state: draft opened; parity tracks reliable MVP experience gaps and closure gates over active V41 -- Current canonical/latest target: `V41` +- V42 state: canonical promotion complete; V42 parity truth, generated reliable MVP artifacts, gate closure, and promotion automation are aligned +- Current canonical/latest target: `V42` +- Canonical proof-source commit: `5c9c0270b9d864fe13b7e0a429700e1c9a7689d9` - Prior canonical anchor: `BITCODE_SPEC_V41.md` - Prior generated proof appendix: `BITCODE_SPEC_V41_PROVEN.md` -- Generated structured artifact inventory: draft `.bitcode/v42-spec-family-report.json`, `.bitcode/v42-canonical-input-report.json`, `.bitcode/v42-canon-posture-drift-report.json`, and later V42 gate artifacts -- Source parity state: Gate 1 parity is documentation/checker/workflow posture; product behavior rows remain draft-required until their gates close -- Scope: V42 parity ledger for reliable MVP product experience +- Generated structured artifact inventory: active canonical `.bitcode/v42-spec-family-report.json`, `.bitcode/v42-canonical-input-report.json`, `.bitcode/v42-canon-posture-drift-report.json`, `.bitcode/v42-depositing-shortest-path.json`, `.bitcode/v42-reading-shortest-path-state-machine.json`, `.bitcode/v42-readneed-review-resynthesis-product-closure.json`, `.bitcode/v42-readfitsfinding-preview-quote.json`, `.bitcode/v42-settlement-rights-delivery.json`, `.bitcode/v42-ai-reading-demonstration.json`, `.bitcode/v42-local-staging-mvp-rehearsal.json`, `.bitcode/v42-promotion-readiness-report.json`, V42 gate-quality and promotion workflow evidence, and `BITCODE_SPEC_V42_PROVEN.md` as the generated proof appendix for V42 promotion +- Source parity state: V42 source-side Depositing shortest path, Reading shortest path state machine, ReadNeed review/resynthesis closure, ReadFitsFinding preview and quote closure, settlement rights delivery, AI-reading demonstration, local/staging-testnet rehearsal, workflow, and promotion surfaces are canonicalized in the promoted V42 file family +- Scope: V42 canonical parity ledger for reliable MVP experience over promoted V41 prompt-program excellence canon +- Last fully realized canonical target preserved in source: `V42` ## Purpose @@ -29,10 +31,10 @@ This matrix records the reliable MVP product surfaces that must become promotion | Area | Required V42 result | Source evidence | Judgment | | --- | --- | --- | --- | -| Draft family | V42 SPEC, DELTA, NOTES, and PARITY files exist over active V41 | `BITCODE_SPEC_V42.md` family | drafted | -| Roadmap truth | Roadmap states V41 active and V42 draft reliable MVP experience | `SPECIFICATIONS_ROADMAP.md` | drafted | -| Gate workflow | Gate quality knows active V41 / draft V42 posture and V42 Gate 1 | `.github/workflows/bitcode-gate-quality.yml` | drafted | -| Canon workflow | Canon quality knows active V41 / draft V42 posture and V42 Gate 1 | `.github/workflows/bitcode-canon-quality.yml` | drafted | +| Draft family | V42 SPEC, DELTA, NOTES, and PARITY files exist over active V41 | `BITCODE_SPEC_V42.md` family | closed | +| Roadmap truth | Roadmap states V41 active and V42 draft reliable MVP experience | `SPECIFICATIONS_ROADMAP.md` | closed | +| Gate workflow | Gate quality knows active V41 / draft V42 posture and V42 Gate 1 | `.github/workflows/bitcode-gate-quality.yml` | closed | +| Canon workflow | Canon quality knows active V41 / draft V42 posture and V42 Gate 1 | `.github/workflows/bitcode-canon-quality.yml` | closed | | Depositing shortest path | Source material can be admitted with Depository proof and compensation visibility | `.bitcode/v42-depositing-shortest-path.json`, `DepositorySupplyCompensationPreview`, `/api/deposits`, Terminal deposit readback | implemented | | Reading state machine | Five-step Reading UX is route-owned, persistent, and source-safe | `.bitcode/v42-reading-shortest-path-state-machine.json`, `TerminalEnterpriseReadingRouteState`, `readingStage`, route/retry/failure tests | implemented | | ReadNeed product closure | Need synthesis, review, feedback, resynthesis, accepted-Need admission, rejected Need blockers, source-safe telemetry, and Terminal runtime readback are product-ready | `.bitcode/v42-readneed-review-resynthesis-product-closure.json`, `ReadNeedReviewResynthesisRuntime`, `/api/read-review`, Terminal Need runtime readback | implemented | @@ -46,7 +48,7 @@ This matrix records the reliable MVP product surfaces that must become promotion | Area | Closure requirement | Judgment | | --- | --- | --- | -| Gate 1 | Open V42 family, roadmap, docs, workflow posture, package script, and checker | drafted | +| Gate 1 | Open V42 family, roadmap, docs, workflow posture, package script, and checker | closed | | Gate 2 | Depositing shortest path and compensation visibility artifact | implemented | | Gate 3 | Reading shortest path state machine artifact | implemented | | Gate 4 | ReadNeed review and resynthesis product closure artifact | implemented | diff --git a/BITCODE_SPEC_V42_PROVEN.md b/BITCODE_SPEC_V42_PROVEN.md new file mode 100644 index 00000000..23a67835 --- /dev/null +++ b/BITCODE_SPEC_V42_PROVEN.md @@ -0,0 +1,2648 @@ +# Bitcode Spec V42 Proven + +- canonicalVersion: `V42` +- canonicalCommit: `5c9c0270b9d864fe13b7e0a429700e1c9a7689d9` +- canonicalCommitRecordedAt: `2026-05-28T21:36:43-03:00` +- worktreeState: `clean` +- generatorId: `bitcode.proven-generator.v1` +- generatedAt: `2026-05-28T21:36:43-03:00` +- outputPath: `BITCODE_SPEC_V42_PROVEN.md` +- scenarioIds: `auth-issuer-rollback`, `rust-validator-proof-gap`, `config-policy-precedence-incident`, `unsafe-patch-review-recovery`, `infra-deployment-mismatch`, `privacy-boundary-proof-export`, `polyglot-gateway-benchmark-remediation`, `auth-many-asset-normalization` +- branchModes: `patch`, `context` + +## Aggregate Verdict + +- fullyProven: `true` +- runCount: `16` +- familyCount: `9` +- theoremCount: `58` +- memberCount: `46` +- artifactDigestCount: `736` +- v19PositiveMatrixCellCount: `1864` +- v19MutationCellCount: `10` +- v19MutationCoverageMode: `representative-first-gate` +- v19VolatilityBlockingFindings: `0` +- v19ReplayDeterministic: `true` +- v19ContractLedgerPassed: `true` +- v20QualityPassed: `true` +- v20QualityReportCount: `5` +- v20GeneratedQualityArtifactCount: `6` +- v20QualityBlockingFailures: `0` +- v20ProjectionSmokeCells: `4` + +## V19 Reproducible Canon Reports + +### V19 Generated Artifact Inventory + +| artifactPath | digest | byteLength | +| --- | --- | --- | +| `.bitcode/v19-contract-change-ledger.json` | `sha256:23dc2056bb17d5255bb51c140a1be9ce43abfe95eaaf6167b8695fd64d31accc` | 3311 | +| `.bitcode/v19-deterministic-replay-report.json` | `sha256:5add6336bd625ef3061e7456becf44e93959d17e09349557ab718e4c9148f3f8` | 8459 | +| `.bitcode/v19-negative-proof-mutation-matrix.json` | `sha256:7b22ec01e83d5bf05a18ec10f3b01198cc54f6248aed111c2c42d2e2dcf4f12a` | 8085 | +| `.bitcode/v19-proof-member-semantic-matrix.json` | `sha256:e7f593d3d24c9934ea5c8775eb996b4800788a13809ad8451b1bfec5b037a77e` | 1815750 | +| `.bitcode/v19-state-machine-matrix.json` | `sha256:6088810ad9020092a4cd1a2c5571827087a962de8b19b779389c4fba2652fbf2` | 154965 | +| `.bitcode/v19-theorem-evidence-matrix.json` | `sha256:f749864cd8f29c71905a482fae3c6ccf24d3220aa4de8779dbea9edf715f4a0f` | 2405676 | +| `.bitcode/v19-volatility-inventory.json` | `sha256:fc9cff43c715bbb4d0367724c87b280035faf520a10dd53fba07adad0864dd3a` | 6206 | + +### V19 Inherited Positive Matrix Summaries + +| matrixId | sourceRunCount | cellCount | passedCellCount | failedCellCount | acceptedExclusionCount | +| --- | --- | --- | --- | --- | --- | +| `v19-proof-member-semantic-matrix` | 16 | 736 | 736 | 0 | 0 | +| `v19-theorem-evidence-matrix` | 16 | 928 | 928 | 0 | 0 | +| `v19-state-machine-matrix` | 16 | 200 | 200 | 0 | 0 | + +### V19 Deterministic Replay + +- reportId: `v19-deterministic-replay-report` +- runCount: `2` +- passed: `true` +- failureReason: `none` + +| artifactPath | firstDigest | secondDigest | byteEqual | +| --- | --- | --- | --- | +| `.bitcode/v19-contract-change-ledger.json` | `sha256:23dc2056bb17d5255bb51c140a1be9ce43abfe95eaaf6167b8695fd64d31accc` | `sha256:23dc2056bb17d5255bb51c140a1be9ce43abfe95eaaf6167b8695fd64d31accc` | `true` | +| `.bitcode/v19-negative-proof-mutation-matrix.json` | `sha256:7b22ec01e83d5bf05a18ec10f3b01198cc54f6248aed111c2c42d2e2dcf4f12a` | `sha256:7b22ec01e83d5bf05a18ec10f3b01198cc54f6248aed111c2c42d2e2dcf4f12a` | `true` | +| `.bitcode/v19-proof-member-semantic-matrix.json` | `sha256:e7f593d3d24c9934ea5c8775eb996b4800788a13809ad8451b1bfec5b037a77e` | `sha256:e7f593d3d24c9934ea5c8775eb996b4800788a13809ad8451b1bfec5b037a77e` | `true` | +| `.bitcode/v19-state-machine-matrix.json` | `sha256:6088810ad9020092a4cd1a2c5571827087a962de8b19b779389c4fba2652fbf2` | `sha256:6088810ad9020092a4cd1a2c5571827087a962de8b19b779389c4fba2652fbf2` | `true` | +| `.bitcode/v19-theorem-evidence-matrix.json` | `sha256:f749864cd8f29c71905a482fae3c6ccf24d3220aa4de8779dbea9edf715f4a0f` | `sha256:f749864cd8f29c71905a482fae3c6ccf24d3220aa4de8779dbea9edf715f4a0f` | `true` | +| `.bitcode/v19-volatility-inventory.json` | `sha256:fc9cff43c715bbb4d0367724c87b280035faf520a10dd53fba07adad0864dd3a` | `sha256:fc9cff43c715bbb4d0367724c87b280035faf520a10dd53fba07adad0864dd3a` | `true` | +| `_legacy/ENGI_SPEC_V19_PROVEN.md` | `sha256:8fc30df67926a3012a79fac0f1962a80a0b7c04b1abb4b64a533b584b87afd57` | `sha256:8fc30df67926a3012a79fac0f1962a80a0b7c04b1abb4b64a533b584b87afd57` | `true` | + +### V19 Volatility Inventory + +- inventoryId: `v19-volatility-inventory` +- scannedArtifactCount: `4` +- findingCount: `21` +- blockingFindingCount: `0` +- passed: `true` + +| classification | count | +| --- | --- | +| `canonical-stable` | 16 | +| `context-bound` | 5 | +| `preview-volatile` | 0 | +| `blocking-volatile` | 0 | + +### V19 Negative Proof Mutation Matrix + +- matrixId: `v19-negative-proof-mutation-matrix` +- coverageMode: `representative-first-gate` +- mutationClassCount: `10` +- cellCount: `10` +- rejectedCellCount: `10` +- unexpectedPassCount: `0` +- unexpectedErrorCount: `0` + +| mutationClass | expectedErrorClass | actualErrorClass | rejectedAsExpected | +| --- | --- | --- | --- | +| `missing-digest` | `missing-digest` | `missing-digest` | `true` | +| `proof-family-catalog-drift` | `catalog-drift` | `catalog-drift` | `true` | +| `corrupted-replay-step` | `corrupted-replay-step` | `corrupted-replay-step` | `true` | +| `dropped-theorem-verdict` | `missing-theorem-verdict` | `missing-theorem-verdict` | `true` | +| `mutated-member-payload` | `member-predicate-failed` | `member-predicate-failed` | `true` | +| `changed-projection-policy` | `projection-policy-mismatch` | `projection-policy-mismatch` | `true` | +| `missing-witness-path` | `missing-witness-path` | `missing-witness-path` | `true` | +| `changed-matrix-axis` | `changed-matrix-axis` | `changed-matrix-axis` | `true` | +| `unsorted-artifact-inventory` | `unsorted-artifact-inventory` | `unsorted-artifact-inventory` | `true` | +| `volatile-timestamp` | `volatile-timestamp` | `volatile-timestamp` | `true` | + +### V19 Omitted Mutation Cross-Products + +| omittedPermutation | reason | reopenCondition | +| --- | --- | --- | +| `every mutation class across every proof family member` | representative fail-closed class coverage is the V19 target | a member-payload mutation passes unexpectedly or failure classification varies by member class | +| `every mutation class across every theorem id` | V18 theorem evidence matrix already proves positive theorem coverage | a theorem mutation passes unexpectedly or replay-step validation varies by theorem group | +| `every mutation class across every artifact path` | digest, path, and inventory classes are sampled by required artifact category | missing-path, missing-digest, or artifact-inventory mutation has path-specific behavior | +| `every mutation class across every scenario and branch mode` | required only where mutation target varies by run | a mutation result differs by scenario or branch mode | +| `projection mutation across every principal` | full projection behavior is inherited from V17 browser proof | projection policy source changes or visibility changes | +| `mutation under every materialization mode` | V19 accepts committed generated artifacts as the only canonical mode | a side-artifact or preview-only materialization mode is introduced | + +### V19 Contract-Change Ledger + +- ledgerId: `v19-contract-change-ledger` +- fromVersion: `V18` +- toVersion: `V19` +- passed: `true` +- proofCatalogDelta: `unchanged-inherited-positive-baseline` + +| changeType | fromMatrixId | toMatrixId | cellCount | +| --- | --- | --- | --- | +| `renamed-materialized-artifact` | `v18-proof-member-semantic-matrix` | `v19-proof-member-semantic-matrix` | 736 | +| `renamed-materialized-artifact` | `v18-theorem-evidence-matrix` | `v19-theorem-evidence-matrix` | 928 | +| `renamed-materialized-artifact` | `v18-state-machine-matrix` | `v19-state-machine-matrix` | 200 | +| `added-negative-proof-coverage` | `none` | `v19-negative-proof-mutation-matrix` | 10 | + +## V42 Promotion Readiness + +- reportId: `v42-promotion-readiness-report` +- sourceSafe: `true` +- passed: `true` +- failureCount: `0` +- prePromotionPosture: `V41 active / V42 draft` +- postPromotionPosture: `V42 active / V43 draft` + +| artifactPath | digest | byteLength | +| --- | --- | --- | +| `.bitcode/v42-canon-posture-drift-report.json` | `sha256:ea3b6413b4bf2acde33cbfc826ff991817dea6f323de51db97a974986283ca65` | 2809 | +| `.bitcode/v42-canonical-input-report.json` | `sha256:db4f1ff8fba0febe53444f0de2d24a44732db66c26e7ecbb61e78cc18383a50d` | 1169 | +| `.bitcode/v42-promotion-readiness-report.json` | `sha256:e2b1728c02bd16ff6e760ff15a098c4db09802d7521f04a114acfd01f30eb853` | 17569 | +| `.bitcode/v42-spec-family-report.json` | `sha256:4bb5f3fd3abbb331d1917dcf13eea6b279b18c07bc316e1ce5da32b7821446cb` | 1010 | + +## V20 Operator Quality Reports + +### V20 Generated Quality Artifact Inventory + +| artifactPath | digest | byteLength | +| --- | --- | --- | +| `.bitcode/v20-accessibility-report.json` | `sha256:9e8065d6d588563000942250de32c90098140788c92295b831d2ddc49d4007e9` | 8210 | +| `.bitcode/v20-operator-acceptance-transcript.json` | `sha256:3948e1d2d560d21aa5d61655aa81653f7db80910ab1819d5fc8dd214f023ad7f` | 10913 | +| `.bitcode/v20-performance-budget-report.json` | `sha256:9c4283f2311ce66c4ec7e3c473f9693d428cb582e1214633bc0bf53df570dfcd` | 5038 | +| `.bitcode/v20-projection-quality-smoke-matrix.json` | `sha256:3529215175fb012a196891e44b33d9b83ccd4b90e97845b9d06f52a282bd2401` | 4935 | +| `.bitcode/v20-quality-summary.json` | `sha256:d5e861a3a7e78d4cec71a0bae3814adf467da10fc3741c38b740c0c3f4161a84` | 4464 | +| `.bitcode/v20-visual-regression-report.json` | `sha256:f10590619fd321e2c60a4da9cc5ec035f219f8a571dadc64e21dcf799cb961c9` | 19369 | + +### V20 Quality Summary + +- reportId: `v20-quality-summary` +- passed: `true` +- qualityReportCount: `5` +- generatedArtifactCount: `6` +- inheritedPositiveMatrixCellCount: `1864` +- inheritedNegativeMutationCellCount: `10` +- inheritedDeterministicReplayPassed: `true` + +| reportId | artifactPath | passed | blockingFailures | acceptedExclusions | +| --- | --- | --- | --- | --- | +| `v20-operator-acceptance-transcript` | `.bitcode/v20-operator-acceptance-transcript.json` | `true` | 0 | 0 | +| `v20-visual-regression-report` | `.bitcode/v20-visual-regression-report.json` | `true` | 0 | 0 | +| `v20-accessibility-report` | `.bitcode/v20-accessibility-report.json` | `true` | 0 | 0 | +| `v20-performance-budget-report` | `.bitcode/v20-performance-budget-report.json` | `true` | 0 | 1 | +| `v20-projection-quality-smoke-matrix` | `.bitcode/v20-projection-quality-smoke-matrix.json` | `true` | 0 | 0 | + +### V20 Operator Acceptance Transcript + +- reportId: `v20-operator-acceptance-transcript` +- transcriptMode: `executable-browser-workflow-summary` +- flowCount: `10` +- stepCount: `10` +- passed: `true` + +| flowId | stepId | scenarioId | branchMode | principal | passed | +| --- | --- | --- | --- | --- | --- | +| `seeded-shell-posture` | `seeded-shell-visible` | `auth-issuer-rollback` | `patch` | `buyer` | `true` | +| `targeted-branch-run` | `targeted-deposit-to-settlement` | `auth-issuer-rollback` | `patch` | `buyer` | `true` | +| `normalization-branch-run` | `normalization-source-to-shares` | `auth-many-asset-normalization` | `context` | `buyer` | `true` | +| `public-privacy-boundary-projection` | `public-projection-quality-visible` | `privacy-boundary-proof-export` | `patch` | `public` | `true` | +| `reviewer-privacy-boundary-projection` | `reviewer-projection-quality-visible` | `privacy-boundary-proof-export` | `patch` | `reviewer` | `true` | +| `buyer-targeted-projection` | `buyer-projection-quality-visible` | `auth-issuer-rollback` | `patch` | `buyer` | `true` | +| `internal-privacy-boundary-projection` | `internal-projection-quality-visible` | `privacy-boundary-proof-export` | `patch` | `internal` | `true` | +| `invalid-deposit-error` | `invalid-deposit-fails-without-state-mutation` | `auth-issuer-rollback` | `patch` | `buyer` | `true` | +| `no-survivor-conflict-reset` | `no-survivor-conflict-recovers-after-reset` | `auth-issuer-rollback` | `patch` | `buyer` | `true` | +| `generated-appendix-report-discovery` | `generated-proof-and-quality-report-reference-visible` | `auth-issuer-rollback` | `patch` | `buyer` | `true` | + +### V20 Visual Regression Budget + +- reportId: `v20-visual-regression-report` +- signatureMode: `deterministic-dom-geometry-signature` +- screenshotMode: `deferred-until-local-ci-screenshot-stability` +- stateCount: `10` +- passed: `true` + +| stateId | scenarioId | branchMode | principal | signatureDigest | passed | +| --- | --- | --- | --- | --- | --- | +| `initial-seeded-shell` | `auth-issuer-rollback` | `patch` | `buyer` | `sha256:46e31a90a55a3977d6747b0200dbd441077fa34b167846c9d85cf94316c58f64` | `true` | +| `targeted-branch-run` | `auth-issuer-rollback` | `patch` | `buyer` | `sha256:f783c8de2a49678bb7ee2b0fed8e1bd5ca294a7dab91b9e244dc7519d925f51e` | `true` | +| `normalization-branch-run` | `auth-many-asset-normalization` | `context` | `buyer` | `sha256:19313616e2f72dc3273cb5f7f3b8411ae050e4e328215d10714385827ad1506b` | `true` | +| `public-privacy-boundary-projection` | `privacy-boundary-proof-export` | `patch` | `public` | `sha256:6f1c0efce5abfea06241b85d1eeadca1a0fd4f4b2a67c1b28053705f9c65f026` | `true` | +| `reviewer-privacy-boundary-projection` | `privacy-boundary-proof-export` | `patch` | `reviewer` | `sha256:08cdf8898535afff0b9d36673707de6894193e1c44e8f8ba7603800411d71895` | `true` | +| `buyer-targeted-projection` | `auth-issuer-rollback` | `patch` | `buyer` | `sha256:8dc35576526041a6b3b922213d51aa9641d8ea3aa91c8cfaef6aa4b5cc91385d` | `true` | +| `internal-privacy-boundary-projection` | `privacy-boundary-proof-export` | `patch` | `internal` | `sha256:e295312ba215829d49c1162e82de4c292893d885779de50f0d0f8b371fdf0112` | `true` | +| `invalid-deposit-error` | `auth-issuer-rollback` | `patch` | `buyer` | `sha256:10b2c66c83978f5f0275271a67d4e7f45c45707470d616aef3fed48580e8d179` | `true` | +| `no-survivor-conflict` | `auth-issuer-rollback` | `patch` | `buyer` | `sha256:1a681d66e8657a5927acbc617033fb35ae85c2dfff5ce6d88366b70a1b283b9a` | `true` | +| `generated-appendix-report-reference` | `auth-issuer-rollback` | `patch` | `buyer` | `sha256:729bf4d2a934338eb78b303a1b5be9505fbdf20673e82bf91589187e9b60998f` | `true` | + +### V20 Accessibility Budget + +- reportId: `v20-accessibility-report` +- engine: `deterministic-dom-accessibility-contract` +- checkCount: `11` +- normalTextContrast: `4.5` +- nonTextUiContrast: `3` +- passed: `true` + +| checkId | passed | assertionCount | +| --- | --- | --- | +| `control-names` | `true` | 4 | +| `form-labeling` | `true` | 2 | +| `keyboard-operation` | `true` | 3 | +| `focus-order` | `true` | 8 | +| `focus-visibility` | `true` | 5 | +| `status-announcements` | `true` | 3 | +| `landmarks-and-sections` | `true` | 4 | +| `toggle-state` | `true` | 3 | +| `contrast` | `true` | 4 | +| `reduced-motion` | `true` | 1 | +| `projection-safety` | `true` | 3 | + +### V20 Performance Budget + +- reportId: `v20-performance-budget-report` +- measurementMode: `live-test-hard-gate-with-canonical-normalized-class` +- operationCount: `9` +- passed: `true` + +| operationId | budgetMs | hardGate | normalizedElapsedClass | passed | +| --- | --- | --- | --- | --- | +| `initial-seeded-shell-ready` | 1500 | `true` | `within-budget` | `true` | +| `scenario-switch-summary-update` | 500 | `true` | `within-budget` | `true` | +| `projection-switch-summary-update` | 500 | `true` | `within-budget` | `true` | +| `targeted-branch-creation` | 5000 | `true` | `within-budget` | `true` | +| `normalization-branch-creation` | 7000 | `true` | `within-budget` | `true` | +| `proof-family-catalog-render-after-branch` | 1000 | `true` | `within-budget` | `true` | +| `raw-visual-surface-mode-toggle` | 250 | `true` | `within-budget` | `true` | +| `reset-to-ready-state` | 1500 | `true` | `within-budget` | `true` | +| `full-quality-suite-duration` | `report-only` | `false` | `telemetry-only` | `true` | + +### V20 Projection Quality Smoke Matrix + +- reportId: `v20-projection-quality-smoke-matrix` +- matrixMode: `representative-principal-quality-smoke` +- cellCount: `4` +- inheritedBrowserMatrixCells: `64` +- passed: `true` + +| principal | scenarioId | rawFiles | sourceVisible | authVisible | qualityRequiresForbidden | passed | +| --- | --- | --- | --- | --- | --- | --- | +| `public` | `privacy-boundary-proof-export` | `false` | `false` | `false` | `false` | `true` | +| `reviewer` | `privacy-boundary-proof-export` | `false` | `false` | `false` | `false` | `true` | +| `buyer` | `auth-issuer-rollback` | `false` | `false` | `true` | `false` | `true` | +| `internal` | `privacy-boundary-proof-export` | `true` | `true` | `true` | `false` | `true` | + +## Proof Family Inventory + +| proofFamily | proofArtifactPath | memberCount | theoremCount | witnessArtifactCount | replayArtifactCount | replayStepCount | +| --- | --- | --- | --- | --- | --- | --- | +| `inference-synthesis` | `.bitcode/inference-synthesis-proof.json` | 5 | 6 | 6 | 7 | 3 | +| `prompt-completeness` | `.bitcode/prompt-completeness-proof.json` | 5 | 8 | 5 | 5 | 4 | +| `static-code-analysis` | `.bitcode/static-measurement-proof.json` | 4 | 5 | 5 | 5 | 3 | +| `verification-decisions` | `.bitcode/verification-decisions-proof.json` | 5 | 7 | 3 | 3 | 2 | +| `selection-and-materialization` | `.bitcode/selection-and-materialization-proof.json` | 5 | 7 | 7 | 7 | 2 | +| `authorization-and-sensitive-flow` | `.bitcode/authorization-and-sensitive-flow-proof.json` | 5 | 6 | 6 | 6 | 2 | +| `settlement-source-to-shares` | `.bitcode/settlement-source-to-shares-proof.json` | 8 | 8 | 8 | 8 | 2 | +| `disclosure-boundary` | `.bitcode/disclosure-boundary-proof.json` | 4 | 5 | 5 | 5 | 2 | +| `proof-contract` | `.bitcode/proof-contract.json` | 5 | 6 | 3 | 3 | 3 | + +## Family Details + +### inference-synthesis + +- proofArtifactPath: `.bitcode/inference-synthesis-proof.json` +- witnessArtifactPaths: `.bitcode/inference-moment-contracts.json`, `.bitcode/inference-proofs.json`, `.bitcode/prompt-implementation-surface.json`, `.bitcode/prompt-surfaces.json`, `.bitcode/parsed-completion-envelopes.json`, `.bitcode/inference-synthesis-proof.json` +- replayArtifacts: `.bitcode/inference-moment-contracts.json`, `.bitcode/inference-proofs.json`, `.bitcode/prompt-implementation-surface.json`, `.bitcode/prompt-surfaces.json`, `.bitcode/parsed-completion-envelopes.json`, `.bitcode/eval-manifest.json`, `.bitcode/inference-synthesis-proof.json` +- replayStepIds: `inference-synthesis.coverage-reconciliation`, `inference-synthesis.evaluator-status-replay`, `inference-synthesis.evidence-basis-replay` + +#### Members + +| memberId | passedRuns | totalRuns | fieldShape | failingRuns | +| --- | --- | --- | --- | --- | +| `task` | 16 | 16 | `evaluatorStatusTruthful`, `evidenceBasisClosed`, `field`, `fieldProofPresent`, `momentContractPresent`, `parsedEnvelopePresent`, `passed`, `promptSurfacePresent` | `none` | +| `failureModes` | 16 | 16 | `evaluatorStatusTruthful`, `evidenceBasisClosed`, `field`, `fieldProofPresent`, `momentContractPresent`, `parsedEnvelopePresent`, `passed`, `promptSurfacePresent` | `none` | +| `constraints` | 16 | 16 | `evaluatorStatusTruthful`, `evidenceBasisClosed`, `field`, `fieldProofPresent`, `momentContractPresent`, `parsedEnvelopePresent`, `passed`, `promptSurfacePresent` | `none` | +| `targetArtifactKinds` | 16 | 16 | `evaluatorStatusTruthful`, `evidenceBasisClosed`, `field`, `fieldProofPresent`, `momentContractPresent`, `parsedEnvelopePresent`, `passed`, `promptSurfacePresent` | `none` | +| `closureCriteria` | 16 | 16 | `evaluatorStatusTruthful`, `evidenceBasisClosed`, `field`, `fieldProofPresent`, `momentContractPresent`, `parsedEnvelopePresent`, `passed`, `promptSurfacePresent` | `none` | + +#### Theorems + +| theoremId | passedRuns | totalRuns | replayStepIds | failureReasons | failingRuns | +| --- | --- | --- | --- | --- | --- | +| `inference_synthesis.coverage_totality` | 16 | 16 | `inference-synthesis.coverage-reconciliation` | `none` | `none` | +| `inference_synthesis.evaluator_status_truth` | 16 | 16 | `inference-synthesis.evaluator-status-replay` | `none` | `none` | +| `inference_synthesis.evidence_basis_closure` | 16 | 16 | `inference-synthesis.evidence-basis-replay` | `none` | `none` | +| `inference_synthesis.ownership_traceability_closure` | 16 | 16 | `inference-synthesis.evidence-basis-replay` | `none` | `none` | +| `inference_synthesis.witness_materialization_closure` | 16 | 16 | `inference-synthesis.coverage-reconciliation`, `inference-synthesis.evaluator-status-replay`, `inference-synthesis.evidence-basis-replay` | `none` | `none` | +| `inference_synthesis.replay_closure` | 16 | 16 | `inference-synthesis.coverage-reconciliation`, `inference-synthesis.evaluator-status-replay`, `inference-synthesis.evidence-basis-replay` | `none` | `none` | + +#### Replay Steps + +| stepId | theoremIds | requiredArtifactPaths | +| --- | --- | --- | +| `inference-synthesis.coverage-reconciliation` | `inference_synthesis.coverage_totality` | `.bitcode/inference-moment-contracts.json`, `.bitcode/inference-proofs.json`, `.bitcode/inference-synthesis-proof.json`, `.bitcode/prompt-surfaces.json` | +| `inference-synthesis.evaluator-status-replay` | `inference_synthesis.evaluator_status_truth` | `.bitcode/inference-moment-contracts.json`, `.bitcode/inference-proofs.json`, `.bitcode/prompt-surfaces.json`, `.bitcode/eval-manifest.json` | +| `inference-synthesis.evidence-basis-replay` | `inference_synthesis.evidence_basis_closure`, `inference_synthesis.ownership_traceability_closure` | `.bitcode/inference-moment-contracts.json`, `.bitcode/inference-proofs.json`, `.bitcode/prompt-surfaces.json`, `.bitcode/parsed-completion-envelopes.json`, `.bitcode/inference-synthesis-proof.json` | + +### prompt-completeness + +- proofArtifactPath: `.bitcode/prompt-completeness-proof.json` +- witnessArtifactPaths: `.bitcode/prompt-family-registry.json`, `.bitcode/prompt-contracts.json`, `.bitcode/prompt-surfaces.json`, `.bitcode/parsed-completion-envelopes.json`, `.bitcode/prompt-completeness-proof.json` +- replayArtifacts: `.bitcode/prompt-family-registry.json`, `.bitcode/prompt-contracts.json`, `.bitcode/prompt-surfaces.json`, `.bitcode/parsed-completion-envelopes.json`, `.bitcode/prompt-completeness-proof.json` +- replayStepIds: `prompt-completeness.member-set-reconciliation`, `prompt-completeness.parse-admissibility`, `prompt-completeness.consumer-closure`, `prompt-completeness.provenance-truth` + +#### Members + +| memberId | passedRuns | totalRuns | fieldShape | failingRuns | +| --- | --- | --- | --- | --- | +| `task` | 16 | 16 | `classified`, `contractComplete`, `downstreamConsumersClosed`, `explicitlyExcluded`, `field`, `inDeclaredFamilyRegistry`, `parsedEnvelopeAdmissible`, `passed`, `provenanceAnnotationsTruthful`, `registered` | `none` | +| `failureModes` | 16 | 16 | `classified`, `contractComplete`, `downstreamConsumersClosed`, `explicitlyExcluded`, `field`, `inDeclaredFamilyRegistry`, `parsedEnvelopeAdmissible`, `passed`, `provenanceAnnotationsTruthful`, `registered` | `none` | +| `constraints` | 16 | 16 | `classified`, `contractComplete`, `downstreamConsumersClosed`, `explicitlyExcluded`, `field`, `inDeclaredFamilyRegistry`, `parsedEnvelopeAdmissible`, `passed`, `provenanceAnnotationsTruthful`, `registered` | `none` | +| `targetArtifactKinds` | 16 | 16 | `classified`, `contractComplete`, `downstreamConsumersClosed`, `explicitlyExcluded`, `field`, `inDeclaredFamilyRegistry`, `parsedEnvelopeAdmissible`, `passed`, `provenanceAnnotationsTruthful`, `registered` | `none` | +| `closureCriteria` | 16 | 16 | `classified`, `contractComplete`, `downstreamConsumersClosed`, `explicitlyExcluded`, `field`, `inDeclaredFamilyRegistry`, `parsedEnvelopeAdmissible`, `passed`, `provenanceAnnotationsTruthful`, `registered` | `none` | + +#### Theorems + +| theoremId | passedRuns | totalRuns | replayStepIds | failureReasons | failingRuns | +| --- | --- | --- | --- | --- | --- | +| `prompt_completeness.coverage_totality` | 16 | 16 | `prompt-completeness.member-set-reconciliation` | `none` | `none` | +| `prompt_completeness.no_ghost_coverage` | 16 | 16 | `prompt-completeness.member-set-reconciliation` | `none` | `none` | +| `prompt_completeness.explicit_exclusion_closure` | 16 | 16 | `prompt-completeness.member-set-reconciliation` | `none` | `none` | +| `prompt_completeness.contract_closure` | 16 | 16 | `prompt-completeness.parse-admissibility` | `none` | `none` | +| `prompt_completeness.parsed_envelope_admissibility` | 16 | 16 | `prompt-completeness.parse-admissibility` | `none` | `none` | +| `prompt_completeness.downstream_consumer_closure` | 16 | 16 | `prompt-completeness.consumer-closure` | `none` | `none` | +| `prompt_completeness.provenance_truth` | 16 | 16 | `prompt-completeness.provenance-truth` | `none` | `none` | +| `prompt_completeness.witness_replay_closure` | 16 | 16 | `prompt-completeness.member-set-reconciliation`, `prompt-completeness.parse-admissibility`, `prompt-completeness.consumer-closure`, `prompt-completeness.provenance-truth` | `none` | `none` | + +#### Replay Steps + +| stepId | theoremIds | requiredArtifactPaths | +| --- | --- | --- | +| `prompt-completeness.member-set-reconciliation` | `prompt_completeness.coverage_totality`, `prompt_completeness.no_ghost_coverage`, `prompt_completeness.explicit_exclusion_closure` | `.bitcode/prompt-family-registry.json`, `.bitcode/prompt-contracts.json`, `.bitcode/prompt-surfaces.json` | +| `prompt-completeness.parse-admissibility` | `prompt_completeness.contract_closure`, `prompt_completeness.parsed_envelope_admissibility` | `.bitcode/prompt-contracts.json`, `.bitcode/parsed-completion-envelopes.json` | +| `prompt-completeness.consumer-closure` | `prompt_completeness.downstream_consumer_closure` | `.bitcode/prompt-surfaces.json` | +| `prompt-completeness.provenance-truth` | `prompt_completeness.provenance_truth` | `.bitcode/prompt-surfaces.json`, `.bitcode/prompt-contracts.json` | + +### static-code-analysis + +- proofArtifactPath: `.bitcode/static-measurement-proof.json` +- witnessArtifactPaths: `.bitcode/code-analysis-fact-registry.json`, `.bitcode/static-heuristics-registry.json`, `.bitcode/measurement-receipts.json`, `.bitcode/static-measurement-report.json`, `.bitcode/static-measurement-proof.json` +- replayArtifacts: `.bitcode/code-analysis-fact-registry.json`, `.bitcode/static-heuristics-registry.json`, `.bitcode/measurement-receipts.json`, `.bitcode/static-measurement-report.json`, `.bitcode/static-measurement-proof.json` +- replayStepIds: `static-code-analysis.stage-domain`, `static-code-analysis.stage-mapping`, `static-code-analysis.receipt-report-proof` + +#### Members + +| memberId | passedRuns | totalRuns | fieldShape | failingRuns | +| --- | --- | --- | --- | --- | +| `deterministic-parser` | 16 | 16 | `memberId`, `passed`, `stageIds` | `none` | +| `repo-context` | 16 | 16 | `memberId`, `passed`, `stageIds` | `none` | +| `content-unit` | 16 | 16 | `memberId`, `passed`, `stageIds` | `none` | +| `measurement-stages` | 16 | 16 | `memberId`, `passed`, `stageIds` | `none` | + +#### Theorems + +| theoremId | passedRuns | totalRuns | replayStepIds | failureReasons | failingRuns | +| --- | --- | --- | --- | --- | --- | +| `static_code_analysis.stage_domain_purity` | 16 | 16 | `static-code-analysis.stage-domain` | `none` | `none` | +| `static_code_analysis.abstract_to_concrete_stage_mapping` | 16 | 16 | `static-code-analysis.stage-mapping` | `none` | `none` | +| `static_code_analysis.registry_role_closure` | 16 | 16 | `static-code-analysis.stage-mapping` | `none` | `none` | +| `static_code_analysis.receipt_report_proof_agreement` | 16 | 16 | `static-code-analysis.receipt-report-proof` | `none` | `none` | +| `static_code_analysis.witness_replay_closure` | 16 | 16 | `static-code-analysis.stage-domain`, `static-code-analysis.stage-mapping`, `static-code-analysis.receipt-report-proof` | `none` | `none` | + +#### Replay Steps + +| stepId | theoremIds | requiredArtifactPaths | +| --- | --- | --- | +| `static-code-analysis.stage-domain` | `static_code_analysis.stage_domain_purity` | `.bitcode/measurement-receipts.json`, `.bitcode/static-measurement-proof.json` | +| `static-code-analysis.stage-mapping` | `static_code_analysis.abstract_to_concrete_stage_mapping`, `static_code_analysis.registry_role_closure` | `.bitcode/measurement-receipts.json`, `.bitcode/code-analysis-fact-registry.json`, `.bitcode/static-heuristics-registry.json` | +| `static-code-analysis.receipt-report-proof` | `static_code_analysis.receipt_report_proof_agreement`, `static_code_analysis.witness_replay_closure` | `.bitcode/measurement-receipts.json`, `.bitcode/static-measurement-report.json`, `.bitcode/static-measurement-proof.json` | + +### verification-decisions + +- proofArtifactPath: `.bitcode/verification-decisions-proof.json` +- witnessArtifactPaths: `.bitcode/verification-report.json`, `.bitcode/verification-receipts.json`, `.bitcode/verification-decisions-proof.json` +- replayArtifacts: `.bitcode/verification-report.json`, `.bitcode/verification-receipts.json`, `.bitcode/verification-decisions-proof.json` +- replayStepIds: `verification-decisions.stage-mapping`, `verification-decisions.use-tier-consequence` + +#### Members + +| memberId | passedRuns | totalRuns | fieldShape | failingRuns | +| --- | --- | --- | --- | --- | +| `issuance` | 16 | 16 | `memberId`, `passed`, `stageIds` | `none` | +| `provenance` | 16 | 16 | `memberId`, `passed`, `stageIds` | `none` | +| `sufficiency` | 16 | 16 | `memberId`, `passed`, `stageIds` | `none` | +| `issuer-policy` | 16 | 16 | `memberId`, `passed`, `stageIds` | `none` | +| `use-tier-consequence` | 16 | 16 | `memberId`, `passed`, `stageIds` | `none` | + +#### Theorems + +| theoremId | passedRuns | totalRuns | replayStepIds | failureReasons | failingRuns | +| --- | --- | --- | --- | --- | --- | +| `verification_decisions.issuance_closure` | 16 | 16 | `verification-decisions.stage-mapping` | `none` | `none` | +| `verification_decisions.provenance_closure` | 16 | 16 | `verification-decisions.stage-mapping` | `none` | `none` | +| `verification_decisions.sufficiency_closure` | 16 | 16 | `verification-decisions.stage-mapping` | `none` | `none` | +| `verification_decisions.issuer_policy_closure` | 16 | 16 | `verification-decisions.stage-mapping` | `none` | `none` | +| `verification_decisions.use_tier_consequence_closure` | 16 | 16 | `verification-decisions.use-tier-consequence` | `none` | `none` | +| `verification_decisions.receipt_report_role_closure` | 16 | 16 | `verification-decisions.use-tier-consequence` | `none` | `none` | +| `verification_decisions.witness_replay_closure` | 16 | 16 | `verification-decisions.stage-mapping`, `verification-decisions.use-tier-consequence` | `none` | `none` | + +#### Replay Steps + +| stepId | theoremIds | requiredArtifactPaths | +| --- | --- | --- | +| `verification-decisions.stage-mapping` | `verification_decisions.issuance_closure`, `verification_decisions.provenance_closure`, `verification_decisions.sufficiency_closure`, `verification_decisions.issuer_policy_closure` | `.bitcode/verification-receipts.json`, `.bitcode/verification-report.json` | +| `verification-decisions.use-tier-consequence` | `verification_decisions.use_tier_consequence_closure`, `verification_decisions.receipt_report_role_closure` | `.bitcode/verification-receipts.json`, `.bitcode/verification-report.json`, `.bitcode/verification-decisions-proof.json` | + +### selection-and-materialization + +- proofArtifactPath: `.bitcode/selection-and-materialization-proof.json` +- witnessArtifactPaths: `.bitcode/asset-pack.lock.json`, `.bitcode/selected-source-material.json`, `.bitcode/materialization-exclusions.json`, `.bitcode/materialization-visibility-proof.json`, `.bitcode/selection-consistency-proof.json`, `.bitcode/materialization-proof.json`, `.bitcode/selection-and-materialization-proof.json` +- replayArtifacts: `.bitcode/asset-pack.lock.json`, `.bitcode/selected-source-material.json`, `.bitcode/materialization-exclusions.json`, `.bitcode/materialization-visibility-proof.json`, `.bitcode/selection-consistency-proof.json`, `.bitcode/materialization-proof.json`, `.bitcode/selection-and-materialization-proof.json` +- replayStepIds: `selection-and-materialization.selected-set`, `selection-and-materialization.visibility` + +#### Members + +| memberId | passedRuns | totalRuns | fieldShape | failingRuns | +| --- | --- | --- | --- | --- | +| `selected-assets` | 16 | 16 | `memberId`, `passed` | `none` | +| `locked-units` | 16 | 16 | `memberId`, `passed` | `none` | +| `materialized-source` | 16 | 16 | `memberId`, `passed` | `none` | +| `exclusions` | 16 | 16 | `memberId`, `passed` | `none` | +| `visibility-rules` | 16 | 16 | `memberId`, `passed` | `none` | + +#### Theorems + +| theoremId | passedRuns | totalRuns | replayStepIds | failureReasons | failingRuns | +| --- | --- | --- | --- | --- | --- | +| `selection_and_materialization.selected_asset_closure` | 16 | 16 | `selection-and-materialization.selected-set` | `none` | `none` | +| `selection_and_materialization.lock_closure` | 16 | 16 | `selection-and-materialization.selected-set` | `none` | `none` | +| `selection_and_materialization.materialized_source_closure` | 16 | 16 | `selection-and-materialization.selected-set` | `none` | `none` | +| `selection_and_materialization.exclusion_closure` | 16 | 16 | `selection-and-materialization.visibility` | `none` | `none` | +| `selection_and_materialization.visibility_closure` | 16 | 16 | `selection-and-materialization.visibility` | `none` | `none` | +| `selection_and_materialization.selection_consistency_closure` | 16 | 16 | `selection-and-materialization.selected-set` | `none` | `none` | +| `selection_and_materialization.materialization_proof_closure` | 16 | 16 | `selection-and-materialization.selected-set`, `selection-and-materialization.visibility` | `none` | `none` | + +#### Replay Steps + +| stepId | theoremIds | requiredArtifactPaths | +| --- | --- | --- | +| `selection-and-materialization.selected-set` | `selection_and_materialization.selected_asset_closure`, `selection_and_materialization.lock_closure`, `selection_and_materialization.materialized_source_closure`, `selection_and_materialization.selection_consistency_closure` | `.bitcode/asset-pack.lock.json`, `.bitcode/selected-source-material.json`, `.bitcode/selection-consistency-proof.json`, `.bitcode/materialization-proof.json` | +| `selection-and-materialization.visibility` | `selection_and_materialization.visibility_closure`, `selection_and_materialization.exclusion_closure` | `.bitcode/materialization-exclusions.json`, `.bitcode/materialization-visibility-proof.json` | + +### authorization-and-sensitive-flow + +- proofArtifactPath: `.bitcode/authorization-and-sensitive-flow-proof.json` +- witnessArtifactPaths: `.bitcode/identity-bindings.json`, `.bitcode/authorization-decisions.json`, `.bitcode/sensitive-data-flow.json`, `.bitcode/identity-authorization-proof.json`, `.bitcode/sensitive-data-flow-proof.json`, `.bitcode/authorization-and-sensitive-flow-proof.json` +- replayArtifacts: `.bitcode/identity-bindings.json`, `.bitcode/authorization-decisions.json`, `.bitcode/sensitive-data-flow.json`, `.bitcode/identity-authorization-proof.json`, `.bitcode/sensitive-data-flow-proof.json`, `.bitcode/authorization-and-sensitive-flow-proof.json` +- replayStepIds: `authorization-sensitive-flow.identity`, `authorization-sensitive-flow.flows` + +#### Members + +| memberId | passedRuns | totalRuns | fieldShape | failingRuns | +| --- | --- | --- | --- | --- | +| `principals` | 16 | 16 | `memberId`, `passed` | `none` | +| `authorization-decisions` | 16 | 16 | `memberId`, `passed` | `none` | +| `confidentiality-classes` | 16 | 16 | `memberId`, `passed` | `none` | +| `retention-disclosure-rules` | 16 | 16 | `memberId`, `passed` | `none` | +| `sensitive-data-flows` | 16 | 16 | `memberId`, `passed` | `none` | + +#### Theorems + +| theoremId | passedRuns | totalRuns | replayStepIds | failureReasons | failingRuns | +| --- | --- | --- | --- | --- | --- | +| `authorization_and_sensitive_flow.principal_authority_totality` | 16 | 16 | `authorization-sensitive-flow.identity` | `none` | `none` | +| `authorization_and_sensitive_flow.authorization_decision_closure` | 16 | 16 | `authorization-sensitive-flow.identity` | `none` | `none` | +| `authorization_and_sensitive_flow.classification_closure` | 16 | 16 | `authorization-sensitive-flow.flows` | `none` | `none` | +| `authorization_and_sensitive_flow.policy_assignment_closure` | 16 | 16 | `authorization-sensitive-flow.flows` | `none` | `none` | +| `authorization_and_sensitive_flow.no_unauthorized_public_flow` | 16 | 16 | `authorization-sensitive-flow.flows` | `none` | `none` | +| `authorization_and_sensitive_flow.witness_replay_closure` | 16 | 16 | `authorization-sensitive-flow.identity`, `authorization-sensitive-flow.flows` | `none` | `none` | + +#### Replay Steps + +| stepId | theoremIds | requiredArtifactPaths | +| --- | --- | --- | +| `authorization-sensitive-flow.identity` | `authorization_and_sensitive_flow.principal_authority_totality`, `authorization_and_sensitive_flow.authorization_decision_closure` | `.bitcode/identity-bindings.json`, `.bitcode/authorization-decisions.json`, `.bitcode/identity-authorization-proof.json` | +| `authorization-sensitive-flow.flows` | `authorization_and_sensitive_flow.classification_closure`, `authorization_and_sensitive_flow.policy_assignment_closure`, `authorization_and_sensitive_flow.no_unauthorized_public_flow` | `.bitcode/sensitive-data-flow.json`, `.bitcode/sensitive-data-flow-proof.json` | + +### settlement-source-to-shares + +- proofArtifactPath: `.bitcode/settlement-source-to-shares-proof.json` +- witnessArtifactPaths: `.bitcode/source-to-shares.json`, `.bitcode/settlement-participation.json`, `.bitcode/settlement-preview.json`, `.bitcode/accounting-precision-report.json`, `.bitcode/journal-diff.json`, `.bitcode/journal-completeness-proof.json`, `.bitcode/settlement-proof.json`, `.bitcode/settlement-source-to-shares-proof.json` +- replayArtifacts: `.bitcode/source-to-shares.json`, `.bitcode/settlement-participation.json`, `.bitcode/settlement-preview.json`, `.bitcode/accounting-precision-report.json`, `.bitcode/journal-diff.json`, `.bitcode/journal-completeness-proof.json`, `.bitcode/settlement-proof.json`, `.bitcode/settlement-source-to-shares-proof.json` +- replayStepIds: `settlement-source-to-shares.contribution-allocation`, `settlement-source-to-shares.journal-theorem` + +#### Members + +| memberId | passedRuns | totalRuns | fieldShape | failingRuns | +| --- | --- | --- | --- | --- | +| `contribution` | 16 | 16 | `memberId`, `passed` | `none` | +| `clipping` | 16 | 16 | `memberId`, `passed` | `none` | +| `normalization` | 16 | 16 | `memberId`, `passed` | `none` | +| `participation` | 16 | 16 | `memberId`, `passed` | `none` | +| `allocation` | 16 | 16 | `memberId`, `passed` | `none` | +| `quantized-fit-quality-receipting` | 16 | 16 | `memberId`, `passed` | `none` | +| `journal` | 16 | 16 | `memberId`, `passed` | `none` | +| `settlement-proof` | 16 | 16 | `memberId`, `passed` | `none` | + +#### Theorems + +| theoremId | passedRuns | totalRuns | replayStepIds | failureReasons | failingRuns | +| --- | --- | --- | --- | --- | --- | +| `settlement_source_to_shares.contribution_totality` | 16 | 16 | `settlement-source-to-shares.contribution-allocation` | `none` | `none` | +| `settlement_source_to_shares.clipping_determinism` | 16 | 16 | `settlement-source-to-shares.contribution-allocation` | `none` | `none` | +| `settlement_source_to_shares.normalization_exactness` | 16 | 16 | `settlement-source-to-shares.contribution-allocation` | `none` | `none` | +| `settlement_source_to_shares.participation_totality` | 16 | 16 | `settlement-source-to-shares.contribution-allocation` | `none` | `none` | +| `settlement_source_to_shares.allocation_conservation` | 16 | 16 | `settlement-source-to-shares.contribution-allocation` | `none` | `none` | +| `settlement_source_to_shares.quantized_fit_quality_receipting` | 16 | 16 | `settlement-source-to-shares.contribution-allocation` | `none` | `none` | +| `settlement_source_to_shares.journal_completeness` | 16 | 16 | `settlement-source-to-shares.journal-theorem` | `none` | `none` | +| `settlement_source_to_shares.settlement_theorem_integrity` | 16 | 16 | `settlement-source-to-shares.journal-theorem` | `none` | `none` | + +#### Replay Steps + +| stepId | theoremIds | requiredArtifactPaths | +| --- | --- | --- | +| `settlement-source-to-shares.contribution-allocation` | `settlement_source_to_shares.contribution_totality`, `settlement_source_to_shares.clipping_determinism`, `settlement_source_to_shares.normalization_exactness`, `settlement_source_to_shares.participation_totality`, `settlement_source_to_shares.allocation_conservation`, `settlement_source_to_shares.quantized_fit_quality_receipting` | `.bitcode/source-to-shares.json`, `.bitcode/settlement-participation.json`, `.bitcode/settlement-preview.json`, `.bitcode/accounting-precision-report.json` | +| `settlement-source-to-shares.journal-theorem` | `settlement_source_to_shares.journal_completeness`, `settlement_source_to_shares.settlement_theorem_integrity` | `.bitcode/journal-diff.json`, `.bitcode/journal-completeness-proof.json`, `.bitcode/settlement-proof.json` | + +### disclosure-boundary + +- proofArtifactPath: `.bitcode/disclosure-boundary-proof.json` +- witnessArtifactPaths: `.bitcode/projection-policy.json`, `.bitcode/bounded-public-proof.json`, `.bitcode/redaction-proof.json`, `.bitcode/disclosure-proof.json`, `.bitcode/disclosure-boundary-proof.json` +- replayArtifacts: `.bitcode/projection-policy.json`, `.bitcode/bounded-public-proof.json`, `.bitcode/redaction-proof.json`, `.bitcode/disclosure-proof.json`, `.bitcode/disclosure-boundary-proof.json` +- replayStepIds: `disclosure-boundary.policy-bounded-public`, `disclosure-boundary.redaction-disclosure` + +#### Members + +| memberId | passedRuns | totalRuns | fieldShape | failingRuns | +| --- | --- | --- | --- | --- | +| `projection-policy` | 16 | 16 | `memberId`, `passed` | `none` | +| `bounded-public-proof` | 16 | 16 | `memberId`, `passed` | `none` | +| `redaction-proof` | 16 | 16 | `memberId`, `passed` | `none` | +| `disclosure-proof` | 16 | 16 | `memberId`, `passed` | `none` | + +#### Theorems + +| theoremId | passedRuns | totalRuns | replayStepIds | failureReasons | failingRuns | +| --- | --- | --- | --- | --- | --- | +| `disclosure_boundary.projection_policy_closure` | 16 | 16 | `disclosure-boundary.policy-bounded-public` | `none` | `none` | +| `disclosure_boundary.bounded_public_metadata_only` | 16 | 16 | `disclosure-boundary.policy-bounded-public` | `none` | `none` | +| `disclosure_boundary.redaction_alignment` | 16 | 16 | `disclosure-boundary.redaction-disclosure` | `none` | `none` | +| `disclosure_boundary.disclosure_verdict_alignment` | 16 | 16 | `disclosure-boundary.redaction-disclosure` | `none` | `none` | +| `disclosure_boundary.witness_replay_closure` | 16 | 16 | `disclosure-boundary.policy-bounded-public`, `disclosure-boundary.redaction-disclosure` | `none` | `none` | + +#### Replay Steps + +| stepId | theoremIds | requiredArtifactPaths | +| --- | --- | --- | +| `disclosure-boundary.policy-bounded-public` | `disclosure_boundary.projection_policy_closure`, `disclosure_boundary.bounded_public_metadata_only` | `.bitcode/projection-policy.json`, `.bitcode/bounded-public-proof.json` | +| `disclosure-boundary.redaction-disclosure` | `disclosure_boundary.redaction_alignment`, `disclosure_boundary.disclosure_verdict_alignment`, `disclosure_boundary.witness_replay_closure` | `.bitcode/redaction-proof.json`, `.bitcode/disclosure-proof.json`, `.bitcode/disclosure-boundary-proof.json` | + +### proof-contract + +- proofArtifactPath: `.bitcode/proof-contract.json` +- witnessArtifactPaths: `.bitcode/proof-contract.json`, `.bitcode/system-proof-bundle.json`, `.bitcode/proof-witness-manifest.json` +- replayArtifacts: `.bitcode/proof-contract.json`, `.bitcode/system-proof-bundle.json`, `.bitcode/proof-witness-manifest.json` +- replayStepIds: `proof-contract.contract-materialization`, `proof-contract.evidence-chain`, `proof-contract.bundle-witness` + +#### Members + +| memberId | passedRuns | totalRuns | fieldShape | failingRuns | +| --- | --- | --- | --- | --- | +| `proof-contract` | 16 | 16 | `memberId`, `passed` | `none` | +| `evidence-chain` | 16 | 16 | `memberId`, `passed` | `none` | +| `theorem-checks` | 16 | 16 | `memberId`, `passed` | `none` | +| `system-proof-bundle` | 16 | 16 | `memberId`, `passed` | `none` | +| `witness-manifest-closure` | 16 | 16 | `memberId`, `passed` | `none` | + +#### Theorems + +| theoremId | passedRuns | totalRuns | replayStepIds | failureReasons | failingRuns | +| --- | --- | --- | --- | --- | --- | +| `proof_contract.contract_materialization` | 16 | 16 | `proof-contract.contract-materialization` | `none` | `none` | +| `proof_contract.evidence_chain_closure` | 16 | 16 | `proof-contract.evidence-chain` | `none` | `none` | +| `proof_contract.theorem_check_binding` | 16 | 16 | `proof-contract.evidence-chain` | `none` | `none` | +| `proof_contract.bundle_coherence` | 16 | 16 | `proof-contract.bundle-witness` | `none` | `none` | +| `proof_contract.witness_manifest_coherence` | 16 | 16 | `proof-contract.bundle-witness` | `none` | `none` | +| `proof_contract.replay_closure` | 16 | 16 | `proof-contract.bundle-witness` | `none` | `none` | + +#### Replay Steps + +| stepId | theoremIds | requiredArtifactPaths | +| --- | --- | --- | +| `proof-contract.contract-materialization` | `proof_contract.contract_materialization` | `.bitcode/proof-contract.json` | +| `proof-contract.evidence-chain` | `proof_contract.evidence_chain_closure`, `proof_contract.theorem_check_binding` | `.bitcode/proof-contract.json`, `.bitcode/system-proof-bundle.json` | +| `proof-contract.bundle-witness` | `proof_contract.bundle_coherence`, `proof_contract.witness_manifest_coherence`, `proof_contract.replay_closure` | `.bitcode/system-proof-bundle.json`, `.bitcode/proof-witness-manifest.json`, `.bitcode/proof-contract.json` | + +## Scenario and Run Matrix + +| scenarioId | branchMode | readId | branchName | assetPackId | familyCount | allFamiliesPassed | proofContractPassed | requiredArtifactPathCount | artifactDigestCount | fullyProven | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| `auth-issuer-rollback` | `patch` | `read_auth-issuer-rollback_40b4b5cc9b` | `bitcode/remediation-read_auth-issuer-rollback_40b4b5cc9b-auth-issuer-rollback` | `asset_pack_f4d2f98e2b7f` | 9 | `true` | `true` | 47 | 46 | `true` | +| `auth-issuer-rollback` | `context` | `read_auth-issuer-rollback_40b4b5cc9b` | `bitcode/remediation-read_auth-issuer-rollback_40b4b5cc9b-auth-issuer-rollback` | `asset_pack_19909dd95164` | 9 | `true` | `true` | 47 | 46 | `true` | +| `rust-validator-proof-gap` | `patch` | `read_rust-validator-proof-gap_7044fe8972` | `bitcode/remediation-read_rust-validator-proof-gap_7044fe8972-rust-validator-proof-gap` | `asset_pack_3b7a68101d23` | 9 | `true` | `true` | 47 | 46 | `true` | +| `rust-validator-proof-gap` | `context` | `read_rust-validator-proof-gap_7044fe8972` | `bitcode/remediation-read_rust-validator-proof-gap_7044fe8972-rust-validator-proof-gap` | `asset_pack_3b7a68101d23` | 9 | `true` | `true` | 47 | 46 | `true` | +| `config-policy-precedence-incident` | `patch` | `read_config-policy-precedence-incident_f39d972e54` | `bitcode/remediation-read_config-policy-precedence-incident_f39d972e54-config-policy-precedence-incident` | `asset_pack_d0c7f0b06b9a` | 9 | `true` | `true` | 47 | 46 | `true` | +| `config-policy-precedence-incident` | `context` | `read_config-policy-precedence-incident_f39d972e54` | `bitcode/remediation-read_config-policy-precedence-incident_f39d972e54-config-policy-precedence-incident` | `asset_pack_d0c7f0b06b9a` | 9 | `true` | `true` | 47 | 46 | `true` | +| `unsafe-patch-review-recovery` | `patch` | `read_unsafe-patch-review-recovery_16a56c87c5` | `bitcode/remediation-read_unsafe-patch-review-recovery_16a56c87c5-unsafe-patch-review-recovery` | `asset_pack_fd3c892c8e9e` | 9 | `true` | `true` | 47 | 46 | `true` | +| `unsafe-patch-review-recovery` | `context` | `read_unsafe-patch-review-recovery_16a56c87c5` | `bitcode/remediation-read_unsafe-patch-review-recovery_16a56c87c5-unsafe-patch-review-recovery` | `asset_pack_fd3c892c8e9e` | 9 | `true` | `true` | 47 | 46 | `true` | +| `infra-deployment-mismatch` | `patch` | `read_infra-deployment-mismatch_be8a999141` | `bitcode/remediation-read_infra-deployment-mismatch_be8a999141-infra-deployment-mismatch` | `asset_pack_9f1b844a2cdf` | 9 | `true` | `true` | 47 | 46 | `true` | +| `infra-deployment-mismatch` | `context` | `read_infra-deployment-mismatch_be8a999141` | `bitcode/remediation-read_infra-deployment-mismatch_be8a999141-infra-deployment-mismatch` | `asset_pack_9f1b844a2cdf` | 9 | `true` | `true` | 47 | 46 | `true` | +| `privacy-boundary-proof-export` | `patch` | `read_privacy-boundary-proof-export_8163942d95` | `bitcode/remediation-read_privacy-boundary-proof-export_8163942d95-privacy-boundary-proof-export` | `asset_pack_c5fef3ab17c5` | 9 | `true` | `true` | 47 | 46 | `true` | +| `privacy-boundary-proof-export` | `context` | `read_privacy-boundary-proof-export_8163942d95` | `bitcode/remediation-read_privacy-boundary-proof-export_8163942d95-privacy-boundary-proof-export` | `asset_pack_c5fef3ab17c5` | 9 | `true` | `true` | 47 | 46 | `true` | +| `polyglot-gateway-benchmark-remediation` | `patch` | `read_polyglot-gateway-benchmark-remediation_ca6f233369` | `bitcode/remediation-read_polyglot-gateway-benchmark-remediation_ca6f233369-polyglot-gateway-benchmark-remediation` | `asset_pack_654da1e46737` | 9 | `true` | `true` | 47 | 46 | `true` | +| `polyglot-gateway-benchmark-remediation` | `context` | `read_polyglot-gateway-benchmark-remediation_ca6f233369` | `bitcode/remediation-read_polyglot-gateway-benchmark-remediation_ca6f233369-polyglot-gateway-benchmark-remediation` | `asset_pack_654da1e46737` | 9 | `true` | `true` | 47 | 46 | `true` | +| `auth-many-asset-normalization` | `patch` | `read_auth-many-asset-normalization_f6dbfe951c` | `bitcode/remediation-read_auth-many-asset-normalization_f6dbfe951c-auth-many-asset-normalization` | `asset_pack_186c76eb7d2d` | 9 | `true` | `true` | 47 | 46 | `true` | +| `auth-many-asset-normalization` | `context` | `read_auth-many-asset-normalization_f6dbfe951c` | `bitcode/remediation-read_auth-many-asset-normalization_f6dbfe951c-auth-many-asset-normalization` | `asset_pack_186c76eb7d2d` | 9 | `true` | `true` | 47 | 46 | `true` | + +## Incomplete Verdicts + +- none + +## Run Details + +### auth-issuer-rollback/patch + +- branchName: `bitcode/remediation-read_auth-issuer-rollback_40b4b5cc9b-auth-issuer-rollback` +- readId: `read_auth-issuer-rollback_40b4b5cc9b` +- assetPackId: `asset_pack_f4d2f98e2b7f` +- proofContractHash: `sha256:2bc0cdb1b9c54e9b714d946f3bee408f0343a3dade3175bb2dd3e34c1ca022a9` +- allFamiliesPassed: `true` +- proofContractPassed: `true` + +#### Family Proof Hashes + +| proofFamily | proofHash | proofArtifactPath | +| --- | --- | --- | +| `inference-synthesis` | `sha256:256959c2fe4952b795e30622c3811861f5488c1d81c55cb836ce21d8b2813e64` | `.bitcode/inference-synthesis-proof.json` | +| `prompt-completeness` | `sha256:9746305d06e0b55e0d7fe59a9ebddcd8d321d4de6e9c26b067aaa74e4842b018` | `.bitcode/prompt-completeness-proof.json` | +| `static-code-analysis` | `sha256:f4595d1c00efd134c3dbaf7f5eb8a1ea6f7afb1afeaacfc52da133a9d6619393` | `.bitcode/static-measurement-proof.json` | +| `verification-decisions` | `sha256:608f4210eb9b498b765f65b1d7a8c67edddf9bc3d5ff1fd6a0c7c3aeb7c5859f` | `.bitcode/verification-decisions-proof.json` | +| `selection-and-materialization` | `sha256:9592d38f7281eafa7ac658e48cbf6e35ab44591384bf73dc11e332237160df39` | `.bitcode/selection-and-materialization-proof.json` | +| `authorization-and-sensitive-flow` | `sha256:098b3934f79eaf77bbd0f72593b3e9d35a83344894d46a09a1c84853f2bc710e` | `.bitcode/authorization-and-sensitive-flow-proof.json` | +| `settlement-source-to-shares` | `sha256:cfea2cc82ce182248ce41d6c0354e00c55fad05e1304ab3e37f6ee43b43b4fca` | `.bitcode/settlement-source-to-shares-proof.json` | +| `disclosure-boundary` | `sha256:0896df3fcc89b27fe7ac491caad0d739503111bdce24e03e8f037937ac2790de` | `.bitcode/disclosure-boundary-proof.json` | +| `proof-contract` | `sha256:2bc0cdb1b9c54e9b714d946f3bee408f0343a3dade3175bb2dd3e34c1ca022a9` | `.bitcode/proof-contract.json` | + +#### Proof Artifact Disclosure Classification + +| path | sensitiveDataClass | disclosable | assetPackEvidenceConfidentiality | potentiallyDisclosable | +| --- | --- | --- | --- | --- | +| `.bitcode/accounting-precision-report.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/asset-pack.lock.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-and-sensitive-flow-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-decisions.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/bounded-public-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/code-analysis-fact-registry.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/disclosure-boundary-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/disclosure-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/identity-authorization-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/identity-bindings.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-moment-contracts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-proofs.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-synthesis-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/journal-completeness-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/journal-diff.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-exclusions.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/materialization-visibility-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/measurement-receipts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/parsed-completion-envelopes.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/projection-policy.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-completeness-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-contracts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-family-registry.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-implementation-surface.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-surfaces.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/proof-contract.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/proof-witness-manifest.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/redaction-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/selected-source-material.json` | `licensed-source-material` | `false` | `licensed-source-material` | `false` | +| `.bitcode/selection-and-materialization-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/selection-consistency-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-participation.json` | `settlement-preview` | `false` | `settlement-preview` | `false` | +| `.bitcode/settlement-preview.json` | `settlement-preview` | `false` | `settlement-preview` | `false` | +| `.bitcode/settlement-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-source-to-shares-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/source-to-shares.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/static-heuristics-registry.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-report.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/system-proof-bundle.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-decisions-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-receipts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-report.json` | `verification-evidence` | `false` | `verification-evidence` | `false` | + +#### Witness Artifact Digest Inventory + +| path | digest | proofFamilies | sensitiveDataClass | disclosable | +| --- | --- | --- | --- | --- | +| `.bitcode/accounting-precision-report.json` | `sha256:a08dcb38b21b853afb64378b8872b02e066da3a7a72adfa93c6abfd217c55cfc` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/asset-pack.lock.json` | `sha256:1c38aa47b7361ce985b48e3da400d880f37290debf70271c34ed3b10fafe72fa` | `selection-and-materialization`, `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-and-sensitive-flow-proof.json` | `sha256:098b3934f79eaf77bbd0f72593b3e9d35a83344894d46a09a1c84853f2bc710e` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-decisions.json` | `sha256:473acee8b82e68a14f05ffa5d34fa7a48cd627224c02b4998c7e4911dac7ad19` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/bounded-public-proof.json` | `sha256:f5da41a20f3a15375abbe1fdabd2a88239a2a8f637aaf033e8018915a0e9c7eb` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/code-analysis-fact-registry.json` | `sha256:7be4db9348b2c5ba639d54417be9e428fda3017cf10f61ed4c552272d07e01a4` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/disclosure-boundary-proof.json` | `sha256:0896df3fcc89b27fe7ac491caad0d739503111bdce24e03e8f037937ac2790de` | `disclosure-boundary` | `private-proof-artifact` | `false` | +| `.bitcode/disclosure-proof.json` | `sha256:f5da41a20f3a15375abbe1fdabd2a88239a2a8f637aaf033e8018915a0e9c7eb` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/eval-manifest.json` | `sha256:46e2aab2c9db74f02f715034b5c63518119a590f18d4d2bf37c35c5c174e76ba` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/external-boundary-manifest.json` | `sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a` | `bitcoin-settlement-interface` | `private-proof-artifact` | `false` | +| `.bitcode/identity-authorization-proof.json` | `sha256:d25e761512f1d40adc659462dd06c03af6e25f2e48a30b5b89ae7ffc928e776d` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/identity-bindings.json` | `sha256:4d4111ebb0cb41d0246d93e30a808c007241d27c715b491aa53e762342c8759c` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/inference-moment-contracts.json` | `sha256:02e131ce1efdb0b3f9a621fbd2ba6a3f805b9b85b6903292117901611b0fe21d` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/inference-proofs.json` | `sha256:9e6a10b2ec749912879e6bcd36fa1fba4ea6addfe1a37475e7a49718a154ad2d` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/inference-synthesis-proof.json` | `sha256:256959c2fe4952b795e30622c3811861f5488c1d81c55cb836ce21d8b2813e64` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/journal-completeness-proof.json` | `sha256:f5f9f0d0bfcdb4e04468c26d9ad18a982d1c96bd542f748eb3e2f8895702dcb7` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/journal-diff.json` | `sha256:b259d0cc8915b4491f7cf220e2bba34ae95e7b68e1d30f07e3fa6ada7dfb0563` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-exclusions.json` | `sha256:f377c98e7db49df061805373caca01b550d3fcadd7be710991e4c3ddf2df826d` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-proof.json` | `sha256:a9c087535c2de8ba4550cb9ed8b7c0cb92b64dd3e9bf0eb5d8e502981602b771` | `selection-and-materialization` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/materialization-visibility-proof.json` | `sha256:295cf78382de6b94a028e4c61541ea0c6a57aa62ed63593efd0ba7998459a4e0` | `selection-and-materialization` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/measurement-receipts.json` | `sha256:6dcc4f10e576cd74891519cda9354cd2b04d7a01f2a014653957f856f3eb1f6f` | `static-code-analysis` | `private-proof-artifact` | `false` | +| `.bitcode/parsed-completion-envelopes.json` | `sha256:a612d67d1995853ee132d9dd21fd8c64c8f986b6c41a2b0e0d042447552f2cd6` | `inference-synthesis`, `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/projection-policy.json` | `sha256:bb8674abf94ae1d8ee5d5ed695258555f039326c2a75d3632dfd65271a06b1e1` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-completeness-proof.json` | `sha256:9746305d06e0b55e0d7fe59a9ebddcd8d321d4de6e9c26b067aaa74e4842b018` | `prompt-completeness` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-contracts.json` | `sha256:1a33ac2be9d039f56b0448f6eb47833327f655c46770eff998d30232f759fe03` | `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-family-registry.json` | `sha256:ab753a9f2a8152aff00bb63282d32a3cd518e38ab37d28372237ea049242cf59` | `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-implementation-surface.json` | `sha256:49a7941430fe1eccbe71c0b321955dd7790faa63c7d983123118ca94fddeb04d` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-surfaces.json` | `sha256:7b3b4c552085629cbb6af1dfc705a69ada6e0f34c32365ac768407679052b24f` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/proof-contract.json` | `sha256:70bc3fdae9bd5f4424476c90c9272989d161c73c04c88ae96c87e8f8473a0848` | `proof-contract` | `private-proof-artifact` | `false` | +| `.bitcode/redaction-proof.json` | `sha256:f5da41a20f3a15375abbe1fdabd2a88239a2a8f637aaf033e8018915a0e9c7eb` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/selected-source-material.json` | `sha256:a116782f3f2d2a02acc6f45be8320e9eb265bc77de7f4b2db59a5c610a0d2e97` | `selection-and-materialization` | `licensed-source-material` | `false` | +| `.bitcode/selection-and-materialization-proof.json` | `sha256:9592d38f7281eafa7ac658e48cbf6e35ab44591384bf73dc11e332237160df39` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/selection-consistency-proof.json` | `sha256:0458593a95733b5c411c3cbdfe188bcc394fbfe5811f5deb8e73bb3a83aca630` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow-proof.json` | `sha256:9901fc2c0ead9f1445ec4254fdc9c621f3fd92e413e815b0b8d768fb8ab30f5d` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow.json` | `sha256:f992e70202f4924fb989b467b9cbf80846e69d4645f78abd8fb74d0e93d19731` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-participation.json` | `sha256:f6e862d56ff0166f78dd46659332af9cb94f638d39c165b1573dcfb524aed357` | `settlement-source-to-shares` | `settlement-preview` | `false` | +| `.bitcode/settlement-preview.json` | `sha256:dff1642ab7d6939c2263360e45775d5e737934200b4dd05740f2aa1d437b26cf` | `settlement-source-to-shares`, `bitcoin-settlement-interface` | `settlement-preview` | `false` | +| `.bitcode/settlement-proof.json` | `sha256:433796e9495bb735acb1fd1a916b3e3d212cae22a4bec0ccda69a4ba7b538620` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-source-to-shares-proof.json` | `sha256:cfea2cc82ce182248ce41d6c0354e00c55fad05e1304ab3e37f6ee43b43b4fca` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/source-to-shares.json` | `sha256:83bcaaf9d2b037535e3155879f3b613e714a963aee6577de070099cba6a07e14` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/static-heuristics-registry.json` | `sha256:d1ff71fa51725c5244d89beced18e8cd51aec0504c0aca07cc10c66c94e492c9` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-proof.json` | `sha256:f4595d1c00efd134c3dbaf7f5eb8a1ea6f7afb1afeaacfc52da133a9d6619393` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-report.json` | `sha256:0e40751f7e15e39c69210e9bd1abd9d12cd49bb873bde875cf3c7de9b1395bd4` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/verification-decisions-proof.json` | `sha256:608f4210eb9b498b765f65b1d7a8c67edddf9bc3d5ff1fd6a0c7c3aeb7c5859f` | `verification-decisions` | `private-proof-artifact` | `false` | +| `.bitcode/verification-receipts.json` | `sha256:0feea3e1993fb13794a7017859665acff7c7f180604739e7835f49d5feb425ab` | `verification-decisions` | `private-proof-artifact` | `false` | +| `.bitcode/verification-report.json` | `sha256:ba96ccbd5f1ff2e65173d06e47ad3ff7c071eff0579ffd3cf2067f52444af1af` | `verification-decisions` | `verification-evidence` | `false` | + +### auth-issuer-rollback/context + +- branchName: `bitcode/remediation-read_auth-issuer-rollback_40b4b5cc9b-auth-issuer-rollback` +- readId: `read_auth-issuer-rollback_40b4b5cc9b` +- assetPackId: `asset_pack_19909dd95164` +- proofContractHash: `sha256:0800e46f246b20d88857779f128a9a59edd322529b3dc5735eba5a9710399db0` +- allFamiliesPassed: `true` +- proofContractPassed: `true` + +#### Family Proof Hashes + +| proofFamily | proofHash | proofArtifactPath | +| --- | --- | --- | +| `inference-synthesis` | `sha256:256959c2fe4952b795e30622c3811861f5488c1d81c55cb836ce21d8b2813e64` | `.bitcode/inference-synthesis-proof.json` | +| `prompt-completeness` | `sha256:9746305d06e0b55e0d7fe59a9ebddcd8d321d4de6e9c26b067aaa74e4842b018` | `.bitcode/prompt-completeness-proof.json` | +| `static-code-analysis` | `sha256:f4595d1c00efd134c3dbaf7f5eb8a1ea6f7afb1afeaacfc52da133a9d6619393` | `.bitcode/static-measurement-proof.json` | +| `verification-decisions` | `sha256:608f4210eb9b498b765f65b1d7a8c67edddf9bc3d5ff1fd6a0c7c3aeb7c5859f` | `.bitcode/verification-decisions-proof.json` | +| `selection-and-materialization` | `sha256:e5d0ddd164f244e7747c498ab9ebebd58c9bbc881a38786fc3185a6a47f27cf6` | `.bitcode/selection-and-materialization-proof.json` | +| `authorization-and-sensitive-flow` | `sha256:ff2d9cec42dd2f31397e5bc8de46cffd9f53379230391b865468c27e8354122d` | `.bitcode/authorization-and-sensitive-flow-proof.json` | +| `settlement-source-to-shares` | `sha256:09cd59c100db1e5a7931d10338fce407145c0d97ce0eef28a59a5a6dcd3096d3` | `.bitcode/settlement-source-to-shares-proof.json` | +| `disclosure-boundary` | `sha256:ac206af0e4758da5b5b9b75d0972dee99057ce5f0694e7d84428c1e132f0d11c` | `.bitcode/disclosure-boundary-proof.json` | +| `proof-contract` | `sha256:0800e46f246b20d88857779f128a9a59edd322529b3dc5735eba5a9710399db0` | `.bitcode/proof-contract.json` | + +#### Proof Artifact Disclosure Classification + +| path | sensitiveDataClass | disclosable | assetPackEvidenceConfidentiality | potentiallyDisclosable | +| --- | --- | --- | --- | --- | +| `.bitcode/accounting-precision-report.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/asset-pack.lock.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-and-sensitive-flow-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-decisions.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/bounded-public-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/code-analysis-fact-registry.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/disclosure-boundary-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/disclosure-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/identity-authorization-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/identity-bindings.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-moment-contracts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-proofs.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-synthesis-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/journal-completeness-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/journal-diff.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-exclusions.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/materialization-visibility-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/measurement-receipts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/parsed-completion-envelopes.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/projection-policy.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-completeness-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-contracts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-family-registry.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-implementation-surface.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-surfaces.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/proof-contract.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/proof-witness-manifest.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/redaction-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/selected-source-material.json` | `licensed-source-material` | `false` | `licensed-source-material` | `false` | +| `.bitcode/selection-and-materialization-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/selection-consistency-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-participation.json` | `settlement-preview` | `false` | `settlement-preview` | `false` | +| `.bitcode/settlement-preview.json` | `settlement-preview` | `false` | `settlement-preview` | `false` | +| `.bitcode/settlement-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-source-to-shares-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/source-to-shares.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/static-heuristics-registry.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-report.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/system-proof-bundle.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-decisions-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-receipts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-report.json` | `verification-evidence` | `false` | `verification-evidence` | `false` | + +#### Witness Artifact Digest Inventory + +| path | digest | proofFamilies | sensitiveDataClass | disclosable | +| --- | --- | --- | --- | --- | +| `.bitcode/accounting-precision-report.json` | `sha256:cb89d3a06d4b07b5e70012ed8ad97838ee36e9689232913f9a86f1228dfe91cc` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/asset-pack.lock.json` | `sha256:a077681f046fbb925c387550b5a8df129bfb602c74b0a482699ff28c8dcf6fac` | `selection-and-materialization`, `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-and-sensitive-flow-proof.json` | `sha256:ff2d9cec42dd2f31397e5bc8de46cffd9f53379230391b865468c27e8354122d` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-decisions.json` | `sha256:55b7e3d3fbd650fb457cee100e1a12ed5b2e9dc258970ad603deb48d18905358` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/bounded-public-proof.json` | `sha256:588c76e7d32b2409990e39ad16946c59d6cf15db87d451f043f2a194cdd56dbb` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/code-analysis-fact-registry.json` | `sha256:7be4db9348b2c5ba639d54417be9e428fda3017cf10f61ed4c552272d07e01a4` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/disclosure-boundary-proof.json` | `sha256:ac206af0e4758da5b5b9b75d0972dee99057ce5f0694e7d84428c1e132f0d11c` | `disclosure-boundary` | `private-proof-artifact` | `false` | +| `.bitcode/disclosure-proof.json` | `sha256:588c76e7d32b2409990e39ad16946c59d6cf15db87d451f043f2a194cdd56dbb` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/eval-manifest.json` | `sha256:46e2aab2c9db74f02f715034b5c63518119a590f18d4d2bf37c35c5c174e76ba` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/external-boundary-manifest.json` | `sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a` | `bitcoin-settlement-interface` | `private-proof-artifact` | `false` | +| `.bitcode/identity-authorization-proof.json` | `sha256:7e22edb0b2a1daf5244a70102f5b66356ceb9358a23b92c3b31cc1a0eed849a4` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/identity-bindings.json` | `sha256:94c92e34df4f6e3a8e15ef2030bdbd36663f16419a5fc66bf3b6c3fbc19a2a2e` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/inference-moment-contracts.json` | `sha256:02e131ce1efdb0b3f9a621fbd2ba6a3f805b9b85b6903292117901611b0fe21d` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/inference-proofs.json` | `sha256:9e6a10b2ec749912879e6bcd36fa1fba4ea6addfe1a37475e7a49718a154ad2d` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/inference-synthesis-proof.json` | `sha256:256959c2fe4952b795e30622c3811861f5488c1d81c55cb836ce21d8b2813e64` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/journal-completeness-proof.json` | `sha256:474af6929f6571b43b0bf7775885c66089db4111b9fe4862a10bc74c1453906c` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/journal-diff.json` | `sha256:8c167479576094e68a68e8e4041079403a22635f31826494a5a62eed0bd812d4` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-exclusions.json` | `sha256:cbcae63fa8e4650193ba088f2efbe3132de023f9ad4334384d64b506d72f3db4` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-proof.json` | `sha256:813bfe253077e589372561323feee22b8c354887d667ad66137d47b586d63f2f` | `selection-and-materialization` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/materialization-visibility-proof.json` | `sha256:5ea216f7a4ad931f4bb1cb10500eaffca2a183d29e828b4fbb2559239216b94e` | `selection-and-materialization` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/measurement-receipts.json` | `sha256:6dcc4f10e576cd74891519cda9354cd2b04d7a01f2a014653957f856f3eb1f6f` | `static-code-analysis` | `private-proof-artifact` | `false` | +| `.bitcode/parsed-completion-envelopes.json` | `sha256:a612d67d1995853ee132d9dd21fd8c64c8f986b6c41a2b0e0d042447552f2cd6` | `inference-synthesis`, `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/projection-policy.json` | `sha256:fa7522727b5f22d3920b966611ed101f0d3c28365936db8cc66fa60f84ac1a4a` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-completeness-proof.json` | `sha256:9746305d06e0b55e0d7fe59a9ebddcd8d321d4de6e9c26b067aaa74e4842b018` | `prompt-completeness` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-contracts.json` | `sha256:1a33ac2be9d039f56b0448f6eb47833327f655c46770eff998d30232f759fe03` | `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-family-registry.json` | `sha256:ab753a9f2a8152aff00bb63282d32a3cd518e38ab37d28372237ea049242cf59` | `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-implementation-surface.json` | `sha256:49a7941430fe1eccbe71c0b321955dd7790faa63c7d983123118ca94fddeb04d` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-surfaces.json` | `sha256:7b3b4c552085629cbb6af1dfc705a69ada6e0f34c32365ac768407679052b24f` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/proof-contract.json` | `sha256:9aed3047408104cd9854d48fcc38cbd920fc4abe243ac795da4885014d9ece82` | `proof-contract` | `private-proof-artifact` | `false` | +| `.bitcode/redaction-proof.json` | `sha256:588c76e7d32b2409990e39ad16946c59d6cf15db87d451f043f2a194cdd56dbb` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/selected-source-material.json` | `sha256:ae941c8173e039154e73aed5639abd804c445e4a995ea70860c6a0e47f2f1c5d` | `selection-and-materialization` | `licensed-source-material` | `false` | +| `.bitcode/selection-and-materialization-proof.json` | `sha256:e5d0ddd164f244e7747c498ab9ebebd58c9bbc881a38786fc3185a6a47f27cf6` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/selection-consistency-proof.json` | `sha256:ecbd5a7070f28dda086bce15a4dde9516694e604b5a5813f0f17e85a2adefede` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow-proof.json` | `sha256:9901fc2c0ead9f1445ec4254fdc9c621f3fd92e413e815b0b8d768fb8ab30f5d` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow.json` | `sha256:4c82aa38149b319b1df273c8a97732d80e327fdd436fb821e57501313b281cee` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-participation.json` | `sha256:38d3d641821f37594d0ee5dd779048826440a417be4faedfaa1c0273a9aafd83` | `settlement-source-to-shares` | `settlement-preview` | `false` | +| `.bitcode/settlement-preview.json` | `sha256:bfa3f543a1f69577e855dc7432c5325b4b0be48a90890a1019559509f677af7f` | `settlement-source-to-shares`, `bitcoin-settlement-interface` | `settlement-preview` | `false` | +| `.bitcode/settlement-proof.json` | `sha256:d82bd7f5eef9645e375b456c1a159320b5b3c6d2cac1826c14e45d74098250d6` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-source-to-shares-proof.json` | `sha256:09cd59c100db1e5a7931d10338fce407145c0d97ce0eef28a59a5a6dcd3096d3` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/source-to-shares.json` | `sha256:83bcaaf9d2b037535e3155879f3b613e714a963aee6577de070099cba6a07e14` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/static-heuristics-registry.json` | `sha256:d1ff71fa51725c5244d89beced18e8cd51aec0504c0aca07cc10c66c94e492c9` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-proof.json` | `sha256:f4595d1c00efd134c3dbaf7f5eb8a1ea6f7afb1afeaacfc52da133a9d6619393` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-report.json` | `sha256:0e40751f7e15e39c69210e9bd1abd9d12cd49bb873bde875cf3c7de9b1395bd4` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/verification-decisions-proof.json` | `sha256:608f4210eb9b498b765f65b1d7a8c67edddf9bc3d5ff1fd6a0c7c3aeb7c5859f` | `verification-decisions` | `private-proof-artifact` | `false` | +| `.bitcode/verification-receipts.json` | `sha256:0feea3e1993fb13794a7017859665acff7c7f180604739e7835f49d5feb425ab` | `verification-decisions` | `private-proof-artifact` | `false` | +| `.bitcode/verification-report.json` | `sha256:ee68b62ef943bdda96b84eaa1efadaa91529571b4ab874eb652f98461f901a37` | `verification-decisions` | `verification-evidence` | `false` | + +### rust-validator-proof-gap/patch + +- branchName: `bitcode/remediation-read_rust-validator-proof-gap_7044fe8972-rust-validator-proof-gap` +- readId: `read_rust-validator-proof-gap_7044fe8972` +- assetPackId: `asset_pack_3b7a68101d23` +- proofContractHash: `sha256:34f2a976e6dc61ca978b606608d7205e2c5c0cd4ed5e8eb38fdaea91c8faa026` +- allFamiliesPassed: `true` +- proofContractPassed: `true` + +#### Family Proof Hashes + +| proofFamily | proofHash | proofArtifactPath | +| --- | --- | --- | +| `inference-synthesis` | `sha256:4f09eb2ae7c6db3a769ab72b39c692158c09da634ddd72b205c3d7a507783ede` | `.bitcode/inference-synthesis-proof.json` | +| `prompt-completeness` | `sha256:9746305d06e0b55e0d7fe59a9ebddcd8d321d4de6e9c26b067aaa74e4842b018` | `.bitcode/prompt-completeness-proof.json` | +| `static-code-analysis` | `sha256:b55a0102ac4e3332e525d2353d74b80087b1fdc6d2929fcfb9f2c8948441b92a` | `.bitcode/static-measurement-proof.json` | +| `verification-decisions` | `sha256:608f4210eb9b498b765f65b1d7a8c67edddf9bc3d5ff1fd6a0c7c3aeb7c5859f` | `.bitcode/verification-decisions-proof.json` | +| `selection-and-materialization` | `sha256:0832ded750cdd02c6465643c4472466116da0c4543272bbcad7040e9ac166dee` | `.bitcode/selection-and-materialization-proof.json` | +| `authorization-and-sensitive-flow` | `sha256:54673ee8002b9b47cdf6543c747ea377da8d7a2f4b16672a7d3f1cd01cd08acb` | `.bitcode/authorization-and-sensitive-flow-proof.json` | +| `settlement-source-to-shares` | `sha256:b14ee59f7d8b27885fd96e5bb0f20222825045013c5827525f291844a597c26a` | `.bitcode/settlement-source-to-shares-proof.json` | +| `disclosure-boundary` | `sha256:6d730db590e80e5b9070d41dc88dfa2a83ec00050ee9bd976eb63c221fded753` | `.bitcode/disclosure-boundary-proof.json` | +| `proof-contract` | `sha256:34f2a976e6dc61ca978b606608d7205e2c5c0cd4ed5e8eb38fdaea91c8faa026` | `.bitcode/proof-contract.json` | + +#### Proof Artifact Disclosure Classification + +| path | sensitiveDataClass | disclosable | assetPackEvidenceConfidentiality | potentiallyDisclosable | +| --- | --- | --- | --- | --- | +| `.bitcode/accounting-precision-report.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/asset-pack.lock.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-and-sensitive-flow-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-decisions.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/bounded-public-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/code-analysis-fact-registry.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/disclosure-boundary-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/disclosure-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/identity-authorization-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/identity-bindings.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-moment-contracts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-proofs.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-synthesis-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/journal-completeness-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/journal-diff.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-exclusions.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/materialization-visibility-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/measurement-receipts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/parsed-completion-envelopes.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/projection-policy.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-completeness-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-contracts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-family-registry.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-implementation-surface.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-surfaces.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/proof-contract.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/proof-witness-manifest.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/redaction-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/selected-source-material.json` | `licensed-source-material` | `false` | `licensed-source-material` | `false` | +| `.bitcode/selection-and-materialization-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/selection-consistency-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-participation.json` | `settlement-preview` | `false` | `settlement-preview` | `false` | +| `.bitcode/settlement-preview.json` | `settlement-preview` | `false` | `settlement-preview` | `false` | +| `.bitcode/settlement-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-source-to-shares-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/source-to-shares.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/static-heuristics-registry.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-report.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/system-proof-bundle.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-decisions-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-receipts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-report.json` | `verification-evidence` | `false` | `verification-evidence` | `false` | + +#### Witness Artifact Digest Inventory + +| path | digest | proofFamilies | sensitiveDataClass | disclosable | +| --- | --- | --- | --- | --- | +| `.bitcode/accounting-precision-report.json` | `sha256:954f6fe05a26bb44a1f65602fb4a23d8b88571c3453cd0ed215c45963766a83b` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/asset-pack.lock.json` | `sha256:f62b272e830007b203ceff28d5b8bc0fd395e9da882d1e594174a9082a434dfc` | `selection-and-materialization`, `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-and-sensitive-flow-proof.json` | `sha256:54673ee8002b9b47cdf6543c747ea377da8d7a2f4b16672a7d3f1cd01cd08acb` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-decisions.json` | `sha256:67d4adc73f181b06ba5a6521189f7c297e86a86d61979c9e0fe82edeeeccfca5` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/bounded-public-proof.json` | `sha256:03329a4920190ad468ca25efb3ca0848cac25529e67e23273f2b6126ea7b126d` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/code-analysis-fact-registry.json` | `sha256:1124a2f883b00427e64f6bd489c4cafcaa0bac94ff0da746d1ac2cc18315928a` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/disclosure-boundary-proof.json` | `sha256:6d730db590e80e5b9070d41dc88dfa2a83ec00050ee9bd976eb63c221fded753` | `disclosure-boundary` | `private-proof-artifact` | `false` | +| `.bitcode/disclosure-proof.json` | `sha256:03329a4920190ad468ca25efb3ca0848cac25529e67e23273f2b6126ea7b126d` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/eval-manifest.json` | `sha256:fce26ebe697ef2aef5f0977e48ec147406bea365c4af301bc28a82d71b97d85a` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/external-boundary-manifest.json` | `sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a` | `bitcoin-settlement-interface` | `private-proof-artifact` | `false` | +| `.bitcode/identity-authorization-proof.json` | `sha256:2287984d304bf31068f4c3517233a3f7da5f2dc444ee5236b539bfd548e7be5a` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/identity-bindings.json` | `sha256:6fb14d8000883576783bf728694ae38f202197fa34e056d59e4ea56e44642887` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/inference-moment-contracts.json` | `sha256:0ba1bdf22cb299df63508fa49e6d994d716d0a5d89e426c260c68ebccd969771` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/inference-proofs.json` | `sha256:276a42d09d1c3507cae113787129c222569bdb7a9934d70c791715e3a490b6b1` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/inference-synthesis-proof.json` | `sha256:4f09eb2ae7c6db3a769ab72b39c692158c09da634ddd72b205c3d7a507783ede` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/journal-completeness-proof.json` | `sha256:ac5961a0c7d2162c86ce74e6e50119cd020397bca3db2ea0002f908aeae4c366` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/journal-diff.json` | `sha256:bb6746f6788dc16b240d863028e05f3522e9fa814c21f47723e79308f5016b41` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-exclusions.json` | `sha256:56f03f73459c307d37adc3b8727e831934e2a4c9f563e1d3941fa04548cfd8b0` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-proof.json` | `sha256:b32f4eec3c3318b969c91f9e90ad70b2242d3213e970e1660463916a86a8a01f` | `selection-and-materialization` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/materialization-visibility-proof.json` | `sha256:4084b99de4b1408240b0538b780841a006ec33f21a4d23346035a4ea32b3e272` | `selection-and-materialization` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/measurement-receipts.json` | `sha256:f57acf4f92feccaf527a3136e98e0c62e8793e1791777cf2810fe80d9864381c` | `static-code-analysis` | `private-proof-artifact` | `false` | +| `.bitcode/parsed-completion-envelopes.json` | `sha256:75fee22c4117c5669cf0b25919bda19d9dd09d68faa223d6fc2bcf42c4b1045b` | `inference-synthesis`, `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/projection-policy.json` | `sha256:12f98ec39b4b52000dd7c1a8cc86eb1deb8ba614dabdb5591dd02b54b8b4cb48` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-completeness-proof.json` | `sha256:9746305d06e0b55e0d7fe59a9ebddcd8d321d4de6e9c26b067aaa74e4842b018` | `prompt-completeness` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-contracts.json` | `sha256:797e292bde61047478891c4753ee3e83d53e5adf90fac0f2870f3a5a74465909` | `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-family-registry.json` | `sha256:ab753a9f2a8152aff00bb63282d32a3cd518e38ab37d28372237ea049242cf59` | `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-implementation-surface.json` | `sha256:81745756a07140ab4d6633127a602d24ea2e43eedbf1803eee531b391fcbd1bf` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-surfaces.json` | `sha256:10c1bc687b7b161f69a70c174f548b1a6708c0e87394630574e19ddcd791c960` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/proof-contract.json` | `sha256:99b79e74239ef796716c5ddd713dbcf9bda1ca10c4b6368916e6736f4b290f1a` | `proof-contract` | `private-proof-artifact` | `false` | +| `.bitcode/redaction-proof.json` | `sha256:03329a4920190ad468ca25efb3ca0848cac25529e67e23273f2b6126ea7b126d` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/selected-source-material.json` | `sha256:06d016c0dc874b965838fcd75b9ab33f642c8dde4f995b545da8ce88506c79d0` | `selection-and-materialization` | `licensed-source-material` | `false` | +| `.bitcode/selection-and-materialization-proof.json` | `sha256:0832ded750cdd02c6465643c4472466116da0c4543272bbcad7040e9ac166dee` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/selection-consistency-proof.json` | `sha256:3f7148afee2a0b067968500edbdc812560dbc5936fae54b6558474ac8a4687d9` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow-proof.json` | `sha256:ea8daa50baf855ebc90a9ce32cba0f9063d02f165f0badee508fb646b673e6c7` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow.json` | `sha256:a7e3f4466375461711f14b05d00a7c464cc3ae5433cc1978e288ef616d521c1d` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-participation.json` | `sha256:2d9c02287ce036d3f03f9a47e18c617a933e3797d06f5309431e3a4c52eb8d0e` | `settlement-source-to-shares` | `settlement-preview` | `false` | +| `.bitcode/settlement-preview.json` | `sha256:56d9507dd0e963d4c9391523388f28f105c1414c49cea88e0047aade1298663d` | `settlement-source-to-shares`, `bitcoin-settlement-interface` | `settlement-preview` | `false` | +| `.bitcode/settlement-proof.json` | `sha256:7b1b9bb523ffbadf3fe64cffd26bec00e2d6fd6c17aa068d933c5371237b4e0e` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-source-to-shares-proof.json` | `sha256:b14ee59f7d8b27885fd96e5bb0f20222825045013c5827525f291844a597c26a` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/source-to-shares.json` | `sha256:8f009ea19064c0f16810c3751adde06a46aa57c19b400218bfc84972da0319a1` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/static-heuristics-registry.json` | `sha256:ec13771783a116c9d3a317dd42d32f02a865ae0f39547c4c7294bd641e559981` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-proof.json` | `sha256:b55a0102ac4e3332e525d2353d74b80087b1fdc6d2929fcfb9f2c8948441b92a` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-report.json` | `sha256:a44a0169819cfa3ba7f4476ec9ec1a688db2144a2938eb19d0331b0a08ec6a7c` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/verification-decisions-proof.json` | `sha256:608f4210eb9b498b765f65b1d7a8c67edddf9bc3d5ff1fd6a0c7c3aeb7c5859f` | `verification-decisions` | `private-proof-artifact` | `false` | +| `.bitcode/verification-receipts.json` | `sha256:ab5f4f8343130819435c7ad0345a8f7e8497831a45861fdaa9ef605b59c33395` | `verification-decisions` | `private-proof-artifact` | `false` | +| `.bitcode/verification-report.json` | `sha256:0570227ca830f82b6d45ac42b70a1a15fa1a24782bbc7f684f40117f9a28f0ab` | `verification-decisions` | `verification-evidence` | `false` | + +### rust-validator-proof-gap/context + +- branchName: `bitcode/remediation-read_rust-validator-proof-gap_7044fe8972-rust-validator-proof-gap` +- readId: `read_rust-validator-proof-gap_7044fe8972` +- assetPackId: `asset_pack_3b7a68101d23` +- proofContractHash: `sha256:34f2a976e6dc61ca978b606608d7205e2c5c0cd4ed5e8eb38fdaea91c8faa026` +- allFamiliesPassed: `true` +- proofContractPassed: `true` + +#### Family Proof Hashes + +| proofFamily | proofHash | proofArtifactPath | +| --- | --- | --- | +| `inference-synthesis` | `sha256:4f09eb2ae7c6db3a769ab72b39c692158c09da634ddd72b205c3d7a507783ede` | `.bitcode/inference-synthesis-proof.json` | +| `prompt-completeness` | `sha256:9746305d06e0b55e0d7fe59a9ebddcd8d321d4de6e9c26b067aaa74e4842b018` | `.bitcode/prompt-completeness-proof.json` | +| `static-code-analysis` | `sha256:b55a0102ac4e3332e525d2353d74b80087b1fdc6d2929fcfb9f2c8948441b92a` | `.bitcode/static-measurement-proof.json` | +| `verification-decisions` | `sha256:608f4210eb9b498b765f65b1d7a8c67edddf9bc3d5ff1fd6a0c7c3aeb7c5859f` | `.bitcode/verification-decisions-proof.json` | +| `selection-and-materialization` | `sha256:fae43adb9a288eabaf5946221c0715414693f6cf144b78fd3b6a8b43fe4b54ab` | `.bitcode/selection-and-materialization-proof.json` | +| `authorization-and-sensitive-flow` | `sha256:54673ee8002b9b47cdf6543c747ea377da8d7a2f4b16672a7d3f1cd01cd08acb` | `.bitcode/authorization-and-sensitive-flow-proof.json` | +| `settlement-source-to-shares` | `sha256:d5c9baa464fc2e61ec0f46da3be4a4eef78cf0ea474feb6a3198e14feb1b5e11` | `.bitcode/settlement-source-to-shares-proof.json` | +| `disclosure-boundary` | `sha256:2fbb1f37244e7d0a1e313cfbe7f24e1cd88a6059bea1efe553030c45f3d31d24` | `.bitcode/disclosure-boundary-proof.json` | +| `proof-contract` | `sha256:34f2a976e6dc61ca978b606608d7205e2c5c0cd4ed5e8eb38fdaea91c8faa026` | `.bitcode/proof-contract.json` | + +#### Proof Artifact Disclosure Classification + +| path | sensitiveDataClass | disclosable | assetPackEvidenceConfidentiality | potentiallyDisclosable | +| --- | --- | --- | --- | --- | +| `.bitcode/accounting-precision-report.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/asset-pack.lock.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-and-sensitive-flow-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-decisions.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/bounded-public-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/code-analysis-fact-registry.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/disclosure-boundary-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/disclosure-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/identity-authorization-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/identity-bindings.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-moment-contracts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-proofs.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-synthesis-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/journal-completeness-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/journal-diff.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-exclusions.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/materialization-visibility-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/measurement-receipts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/parsed-completion-envelopes.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/projection-policy.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-completeness-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-contracts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-family-registry.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-implementation-surface.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-surfaces.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/proof-contract.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/proof-witness-manifest.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/redaction-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/selected-source-material.json` | `licensed-source-material` | `false` | `licensed-source-material` | `false` | +| `.bitcode/selection-and-materialization-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/selection-consistency-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-participation.json` | `settlement-preview` | `false` | `settlement-preview` | `false` | +| `.bitcode/settlement-preview.json` | `settlement-preview` | `false` | `settlement-preview` | `false` | +| `.bitcode/settlement-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-source-to-shares-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/source-to-shares.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/static-heuristics-registry.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-report.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/system-proof-bundle.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-decisions-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-receipts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-report.json` | `verification-evidence` | `false` | `verification-evidence` | `false` | + +#### Witness Artifact Digest Inventory + +| path | digest | proofFamilies | sensitiveDataClass | disclosable | +| --- | --- | --- | --- | --- | +| `.bitcode/accounting-precision-report.json` | `sha256:aa38f0352b0b25daa0bb120f6ec6bba92ad433f14fdbb522171f11e24add092d` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/asset-pack.lock.json` | `sha256:10a58df1e6f48dcdf09098f83021c983c8bfe3c17173dc79b4a9e73e3fd96258` | `selection-and-materialization`, `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-and-sensitive-flow-proof.json` | `sha256:54673ee8002b9b47cdf6543c747ea377da8d7a2f4b16672a7d3f1cd01cd08acb` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-decisions.json` | `sha256:67d4adc73f181b06ba5a6521189f7c297e86a86d61979c9e0fe82edeeeccfca5` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/bounded-public-proof.json` | `sha256:7bd6a0865e9267411b854f91754b10dc446d1b20375009a3099e670933eab4fb` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/code-analysis-fact-registry.json` | `sha256:1124a2f883b00427e64f6bd489c4cafcaa0bac94ff0da746d1ac2cc18315928a` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/disclosure-boundary-proof.json` | `sha256:2fbb1f37244e7d0a1e313cfbe7f24e1cd88a6059bea1efe553030c45f3d31d24` | `disclosure-boundary` | `private-proof-artifact` | `false` | +| `.bitcode/disclosure-proof.json` | `sha256:7bd6a0865e9267411b854f91754b10dc446d1b20375009a3099e670933eab4fb` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/eval-manifest.json` | `sha256:fce26ebe697ef2aef5f0977e48ec147406bea365c4af301bc28a82d71b97d85a` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/external-boundary-manifest.json` | `sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a` | `bitcoin-settlement-interface` | `private-proof-artifact` | `false` | +| `.bitcode/identity-authorization-proof.json` | `sha256:2287984d304bf31068f4c3517233a3f7da5f2dc444ee5236b539bfd548e7be5a` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/identity-bindings.json` | `sha256:6fb14d8000883576783bf728694ae38f202197fa34e056d59e4ea56e44642887` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/inference-moment-contracts.json` | `sha256:0ba1bdf22cb299df63508fa49e6d994d716d0a5d89e426c260c68ebccd969771` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/inference-proofs.json` | `sha256:276a42d09d1c3507cae113787129c222569bdb7a9934d70c791715e3a490b6b1` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/inference-synthesis-proof.json` | `sha256:4f09eb2ae7c6db3a769ab72b39c692158c09da634ddd72b205c3d7a507783ede` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/journal-completeness-proof.json` | `sha256:5e125c7620a790c8e3fd50ad27d8602568d5d43e00b0aff8b8efa52127286d59` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/journal-diff.json` | `sha256:e9c4799551aa74c418c9d483f98e19bb6ba61e073607f4bb7c058805a8032d61` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-exclusions.json` | `sha256:b426ce94afa920bc8d16702fd2f54da342ba198387e30b237bf9d58305153be7` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-proof.json` | `sha256:2fc6ecb431bf4672b35049183c26ce43260e20c9a79a2cea65b089ee7820ab2a` | `selection-and-materialization` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/materialization-visibility-proof.json` | `sha256:4084b99de4b1408240b0538b780841a006ec33f21a4d23346035a4ea32b3e272` | `selection-and-materialization` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/measurement-receipts.json` | `sha256:f57acf4f92feccaf527a3136e98e0c62e8793e1791777cf2810fe80d9864381c` | `static-code-analysis` | `private-proof-artifact` | `false` | +| `.bitcode/parsed-completion-envelopes.json` | `sha256:75fee22c4117c5669cf0b25919bda19d9dd09d68faa223d6fc2bcf42c4b1045b` | `inference-synthesis`, `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/projection-policy.json` | `sha256:12f98ec39b4b52000dd7c1a8cc86eb1deb8ba614dabdb5591dd02b54b8b4cb48` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-completeness-proof.json` | `sha256:9746305d06e0b55e0d7fe59a9ebddcd8d321d4de6e9c26b067aaa74e4842b018` | `prompt-completeness` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-contracts.json` | `sha256:797e292bde61047478891c4753ee3e83d53e5adf90fac0f2870f3a5a74465909` | `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-family-registry.json` | `sha256:ab753a9f2a8152aff00bb63282d32a3cd518e38ab37d28372237ea049242cf59` | `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-implementation-surface.json` | `sha256:81745756a07140ab4d6633127a602d24ea2e43eedbf1803eee531b391fcbd1bf` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-surfaces.json` | `sha256:10c1bc687b7b161f69a70c174f548b1a6708c0e87394630574e19ddcd791c960` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/proof-contract.json` | `sha256:99b79e74239ef796716c5ddd713dbcf9bda1ca10c4b6368916e6736f4b290f1a` | `proof-contract` | `private-proof-artifact` | `false` | +| `.bitcode/redaction-proof.json` | `sha256:7bd6a0865e9267411b854f91754b10dc446d1b20375009a3099e670933eab4fb` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/selected-source-material.json` | `sha256:63ef504f3945894d77cc0974005bcce1092d5982ec3deb3ee2037d96f4aea598` | `selection-and-materialization` | `licensed-source-material` | `false` | +| `.bitcode/selection-and-materialization-proof.json` | `sha256:fae43adb9a288eabaf5946221c0715414693f6cf144b78fd3b6a8b43fe4b54ab` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/selection-consistency-proof.json` | `sha256:3f7148afee2a0b067968500edbdc812560dbc5936fae54b6558474ac8a4687d9` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow-proof.json` | `sha256:ea8daa50baf855ebc90a9ce32cba0f9063d02f165f0badee508fb646b673e6c7` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow.json` | `sha256:a7e3f4466375461711f14b05d00a7c464cc3ae5433cc1978e288ef616d521c1d` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-participation.json` | `sha256:ca40d86f416da0c66700f1a3ca2dc6651a16ce69276bda6c0c081987edd67c39` | `settlement-source-to-shares` | `settlement-preview` | `false` | +| `.bitcode/settlement-preview.json` | `sha256:25dca8a8160905ae58f03c40b3e12dfc364ffde6092510d80df425313a973380` | `settlement-source-to-shares`, `bitcoin-settlement-interface` | `settlement-preview` | `false` | +| `.bitcode/settlement-proof.json` | `sha256:faa095740f49cc6fcf3378253dd0e6416df8b6c3e9bb655c0acd1ac3c3ea2fd3` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-source-to-shares-proof.json` | `sha256:d5c9baa464fc2e61ec0f46da3be4a4eef78cf0ea474feb6a3198e14feb1b5e11` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/source-to-shares.json` | `sha256:8f009ea19064c0f16810c3751adde06a46aa57c19b400218bfc84972da0319a1` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/static-heuristics-registry.json` | `sha256:ec13771783a116c9d3a317dd42d32f02a865ae0f39547c4c7294bd641e559981` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-proof.json` | `sha256:b55a0102ac4e3332e525d2353d74b80087b1fdc6d2929fcfb9f2c8948441b92a` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-report.json` | `sha256:a44a0169819cfa3ba7f4476ec9ec1a688db2144a2938eb19d0331b0a08ec6a7c` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/verification-decisions-proof.json` | `sha256:608f4210eb9b498b765f65b1d7a8c67edddf9bc3d5ff1fd6a0c7c3aeb7c5859f` | `verification-decisions` | `private-proof-artifact` | `false` | +| `.bitcode/verification-receipts.json` | `sha256:ab5f4f8343130819435c7ad0345a8f7e8497831a45861fdaa9ef605b59c33395` | `verification-decisions` | `private-proof-artifact` | `false` | +| `.bitcode/verification-report.json` | `sha256:bf96cac17f262ed884e2a4fd28dcaad4ae3bb6e0c4e08fea7b436bcbd6c3e34d` | `verification-decisions` | `verification-evidence` | `false` | + +### config-policy-precedence-incident/patch + +- branchName: `bitcode/remediation-read_config-policy-precedence-incident_f39d972e54-config-policy-precedence-incident` +- readId: `read_config-policy-precedence-incident_f39d972e54` +- assetPackId: `asset_pack_d0c7f0b06b9a` +- proofContractHash: `sha256:83aa4f69425eb95cb36148bfada58f4d224013ca26a2917c9b69bd61da2a57ac` +- allFamiliesPassed: `true` +- proofContractPassed: `true` + +#### Family Proof Hashes + +| proofFamily | proofHash | proofArtifactPath | +| --- | --- | --- | +| `inference-synthesis` | `sha256:b128d3ebfafc59642ae7d5574f24afe8f80dae532dcf68c24cef779bce0666c0` | `.bitcode/inference-synthesis-proof.json` | +| `prompt-completeness` | `sha256:9746305d06e0b55e0d7fe59a9ebddcd8d321d4de6e9c26b067aaa74e4842b018` | `.bitcode/prompt-completeness-proof.json` | +| `static-code-analysis` | `sha256:adab7903446c23a53b6104c1e12fefca4bd54fe2bba624f440d3aa2e774b2068` | `.bitcode/static-measurement-proof.json` | +| `verification-decisions` | `sha256:608f4210eb9b498b765f65b1d7a8c67edddf9bc3d5ff1fd6a0c7c3aeb7c5859f` | `.bitcode/verification-decisions-proof.json` | +| `selection-and-materialization` | `sha256:cef9aa43641f124d922603a162b931dcf0c616ce487316b777cdc29b976f03ed` | `.bitcode/selection-and-materialization-proof.json` | +| `authorization-and-sensitive-flow` | `sha256:1ef6377e7a3c393fe2fc43f8a9b54f24904631c887e365200062f87c720d08d4` | `.bitcode/authorization-and-sensitive-flow-proof.json` | +| `settlement-source-to-shares` | `sha256:9b61e0764eaca5f2d924d2f7b7a62c993489998c320433aee84d03ed62a236bf` | `.bitcode/settlement-source-to-shares-proof.json` | +| `disclosure-boundary` | `sha256:43693ee69ddeef8ddbf2fb1059065789e6112ca8afa015368d31bdd12ec08c95` | `.bitcode/disclosure-boundary-proof.json` | +| `proof-contract` | `sha256:83aa4f69425eb95cb36148bfada58f4d224013ca26a2917c9b69bd61da2a57ac` | `.bitcode/proof-contract.json` | + +#### Proof Artifact Disclosure Classification + +| path | sensitiveDataClass | disclosable | assetPackEvidenceConfidentiality | potentiallyDisclosable | +| --- | --- | --- | --- | --- | +| `.bitcode/accounting-precision-report.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/asset-pack.lock.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-and-sensitive-flow-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-decisions.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/bounded-public-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/code-analysis-fact-registry.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/disclosure-boundary-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/disclosure-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/identity-authorization-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/identity-bindings.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-moment-contracts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-proofs.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-synthesis-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/journal-completeness-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/journal-diff.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-exclusions.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/materialization-visibility-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/measurement-receipts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/parsed-completion-envelopes.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/projection-policy.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-completeness-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-contracts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-family-registry.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-implementation-surface.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-surfaces.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/proof-contract.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/proof-witness-manifest.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/redaction-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/selected-source-material.json` | `licensed-source-material` | `false` | `licensed-source-material` | `false` | +| `.bitcode/selection-and-materialization-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/selection-consistency-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-participation.json` | `settlement-preview` | `false` | `settlement-preview` | `false` | +| `.bitcode/settlement-preview.json` | `settlement-preview` | `false` | `settlement-preview` | `false` | +| `.bitcode/settlement-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-source-to-shares-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/source-to-shares.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/static-heuristics-registry.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-report.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/system-proof-bundle.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-decisions-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-receipts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-report.json` | `verification-evidence` | `false` | `verification-evidence` | `false` | + +#### Witness Artifact Digest Inventory + +| path | digest | proofFamilies | sensitiveDataClass | disclosable | +| --- | --- | --- | --- | --- | +| `.bitcode/accounting-precision-report.json` | `sha256:acd148ad1e066d9d770424e43c377e9e516aedab81942860b14da52311d0dc4e` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/asset-pack.lock.json` | `sha256:8b08e9c366913f1acc0fc80e40c4031756e21361ca5d502c15676c6e9aaf07f9` | `selection-and-materialization`, `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-and-sensitive-flow-proof.json` | `sha256:1ef6377e7a3c393fe2fc43f8a9b54f24904631c887e365200062f87c720d08d4` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-decisions.json` | `sha256:5981ab9ad1231577bdbd1f1a663f2a8d2f6e32c6e1144a5b7ecb362ff69bf7d0` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/bounded-public-proof.json` | `sha256:f4ea54ea40d36968ee1f9f3cf6938f04df6f448f98b4f5acad7a015bfed90ed8` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/code-analysis-fact-registry.json` | `sha256:23bc3c813aa06c1751c60db5beae2ada951202499df981aa8e9900fdc5cdb1b6` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/disclosure-boundary-proof.json` | `sha256:43693ee69ddeef8ddbf2fb1059065789e6112ca8afa015368d31bdd12ec08c95` | `disclosure-boundary` | `private-proof-artifact` | `false` | +| `.bitcode/disclosure-proof.json` | `sha256:f4ea54ea40d36968ee1f9f3cf6938f04df6f448f98b4f5acad7a015bfed90ed8` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/eval-manifest.json` | `sha256:8e8d0e036c1e6ebdd3c2bd9eaf982040180adcbd56f7bed3ccf2386babdf46f4` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/external-boundary-manifest.json` | `sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a` | `bitcoin-settlement-interface` | `private-proof-artifact` | `false` | +| `.bitcode/identity-authorization-proof.json` | `sha256:cc3c680acc654e92261f714408b1cb0f2bbdc45d5623570d4ab6deecf552705b` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/identity-bindings.json` | `sha256:2b239e284be7d4bf2a1f43342e7c5318f77e5212e06257bfe663564893ff21ae` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/inference-moment-contracts.json` | `sha256:3c7873de78e25bb306c492ef3018539a5a164dbc34bb957a1016351c6d445808` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/inference-proofs.json` | `sha256:f5c66f068437c614430df435bca8880c968a92209ee38ee56c564ad60ff678f1` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/inference-synthesis-proof.json` | `sha256:b128d3ebfafc59642ae7d5574f24afe8f80dae532dcf68c24cef779bce0666c0` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/journal-completeness-proof.json` | `sha256:2a6e281fcd4a3d35f937a54f6906a4f063b301ec1fa4b7bbbd734091eb60a10f` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/journal-diff.json` | `sha256:c60b87b9eae4982faffb851a30b8d5cae58d436d34f1a460e9e7c7c1a0ea0989` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-exclusions.json` | `sha256:7ffbb056c93ce895989b51308a6c83ab5022c974f8ac26d27aa29b43011cb122` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-proof.json` | `sha256:1c9350dc5d2544a80dde57b1b15d8075cfcea39658d105312f5bba32521f93b5` | `selection-and-materialization` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/materialization-visibility-proof.json` | `sha256:e71a0789bffb8fba9b03092e766d0f589299c55d14f8d61edbf4a750a6c3b1b2` | `selection-and-materialization` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/measurement-receipts.json` | `sha256:d717a53262cb2b72f17796e62b9b37cf4e20d1e90410560ed03db9fc7051b0d3` | `static-code-analysis` | `private-proof-artifact` | `false` | +| `.bitcode/parsed-completion-envelopes.json` | `sha256:5e34372dc7330b48d668a36d656c06ceda4545f5911669c8da146fb4cb9be7d6` | `inference-synthesis`, `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/projection-policy.json` | `sha256:12f98ec39b4b52000dd7c1a8cc86eb1deb8ba614dabdb5591dd02b54b8b4cb48` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-completeness-proof.json` | `sha256:9746305d06e0b55e0d7fe59a9ebddcd8d321d4de6e9c26b067aaa74e4842b018` | `prompt-completeness` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-contracts.json` | `sha256:e47ded65b7fa05c782049d88d0b5e48b71facde2517912023d24e7a306c364ca` | `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-family-registry.json` | `sha256:ab753a9f2a8152aff00bb63282d32a3cd518e38ab37d28372237ea049242cf59` | `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-implementation-surface.json` | `sha256:c91b6d44013d9514498b464bc4c6dce52197bdf70121663ada56f7af3c331da4` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-surfaces.json` | `sha256:3e365f6603e4066510fc07f0c16c245058c19b77e1b796ddc3e50d5ac5f2b91b` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/proof-contract.json` | `sha256:fe4a268e5d78b61c451ed9eabda2a6a27e2264ac39f8ec724cb2b9f82ee5272f` | `proof-contract` | `private-proof-artifact` | `false` | +| `.bitcode/redaction-proof.json` | `sha256:f4ea54ea40d36968ee1f9f3cf6938f04df6f448f98b4f5acad7a015bfed90ed8` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/selected-source-material.json` | `sha256:80f8353e889bf019158f21988f781765f90b0f126df426fcfc76ded8d3e639ef` | `selection-and-materialization` | `licensed-source-material` | `false` | +| `.bitcode/selection-and-materialization-proof.json` | `sha256:cef9aa43641f124d922603a162b931dcf0c616ce487316b777cdc29b976f03ed` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/selection-consistency-proof.json` | `sha256:501307fda8ba5ca845f985e7c2857595abc67ce54037f07ffa384080d45ca725` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow-proof.json` | `sha256:fdd7c9f7f92d31fd298f5a2259959d8f8e9b0cb1ce754e5d4a5a84aba4aa196b` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow.json` | `sha256:7cdb6797681ba014ac95ccfa266175833b703261e5ce50025da32b624fefbaf0` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-participation.json` | `sha256:d4b23a10fd81910d3ec2b5a0b275f4507b4146685e3a833c94c2623970b5e49b` | `settlement-source-to-shares` | `settlement-preview` | `false` | +| `.bitcode/settlement-preview.json` | `sha256:419448fbe69f2f592f7cdd64ebfb2f91d115670b389db2b0116cae60d0186036` | `settlement-source-to-shares`, `bitcoin-settlement-interface` | `settlement-preview` | `false` | +| `.bitcode/settlement-proof.json` | `sha256:b171b6c6807c2d2e6d94fd0565a9bed9c9963572c963aebe2ffc70453fcea25d` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-source-to-shares-proof.json` | `sha256:9b61e0764eaca5f2d924d2f7b7a62c993489998c320433aee84d03ed62a236bf` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/source-to-shares.json` | `sha256:ba57d7503ee19baee3d14abff0c0386aa5c6cac616c94d37a6d7f94d419b3d98` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/static-heuristics-registry.json` | `sha256:a0ffd24e12eb594dd4a9f26c5f3c8d30fac981d018bc57e689c19dca067cd6cb` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-proof.json` | `sha256:adab7903446c23a53b6104c1e12fefca4bd54fe2bba624f440d3aa2e774b2068` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-report.json` | `sha256:1bb54e49a9d35a309f6d4609c114a240249ed537150afec8202fe0d882fb91cf` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/verification-decisions-proof.json` | `sha256:608f4210eb9b498b765f65b1d7a8c67edddf9bc3d5ff1fd6a0c7c3aeb7c5859f` | `verification-decisions` | `private-proof-artifact` | `false` | +| `.bitcode/verification-receipts.json` | `sha256:ef5b77905b73c2034704e7eb8f68a0577c5ac40cfd418d541336936ccf9015c8` | `verification-decisions` | `private-proof-artifact` | `false` | +| `.bitcode/verification-report.json` | `sha256:469bdca0efcde89073eb29c577106c5e9b512d8ee0be3daa591f66b756e9c1d7` | `verification-decisions` | `verification-evidence` | `false` | + +### config-policy-precedence-incident/context + +- branchName: `bitcode/remediation-read_config-policy-precedence-incident_f39d972e54-config-policy-precedence-incident` +- readId: `read_config-policy-precedence-incident_f39d972e54` +- assetPackId: `asset_pack_d0c7f0b06b9a` +- proofContractHash: `sha256:83aa4f69425eb95cb36148bfada58f4d224013ca26a2917c9b69bd61da2a57ac` +- allFamiliesPassed: `true` +- proofContractPassed: `true` + +#### Family Proof Hashes + +| proofFamily | proofHash | proofArtifactPath | +| --- | --- | --- | +| `inference-synthesis` | `sha256:b128d3ebfafc59642ae7d5574f24afe8f80dae532dcf68c24cef779bce0666c0` | `.bitcode/inference-synthesis-proof.json` | +| `prompt-completeness` | `sha256:9746305d06e0b55e0d7fe59a9ebddcd8d321d4de6e9c26b067aaa74e4842b018` | `.bitcode/prompt-completeness-proof.json` | +| `static-code-analysis` | `sha256:adab7903446c23a53b6104c1e12fefca4bd54fe2bba624f440d3aa2e774b2068` | `.bitcode/static-measurement-proof.json` | +| `verification-decisions` | `sha256:608f4210eb9b498b765f65b1d7a8c67edddf9bc3d5ff1fd6a0c7c3aeb7c5859f` | `.bitcode/verification-decisions-proof.json` | +| `selection-and-materialization` | `sha256:5effc18dd1f65e1188616aa32cf8e4dc3a8a06bdd3eb95cc2e04341d166fca65` | `.bitcode/selection-and-materialization-proof.json` | +| `authorization-and-sensitive-flow` | `sha256:1ef6377e7a3c393fe2fc43f8a9b54f24904631c887e365200062f87c720d08d4` | `.bitcode/authorization-and-sensitive-flow-proof.json` | +| `settlement-source-to-shares` | `sha256:bb393d54832f9a216f0fe6129671c9369071e0cf78aa823ea5eae59c1d0383e1` | `.bitcode/settlement-source-to-shares-proof.json` | +| `disclosure-boundary` | `sha256:5610c4975fb289b3909932d3f5b53a7032b7a2507f60ec1b69079cb50f84dbf8` | `.bitcode/disclosure-boundary-proof.json` | +| `proof-contract` | `sha256:83aa4f69425eb95cb36148bfada58f4d224013ca26a2917c9b69bd61da2a57ac` | `.bitcode/proof-contract.json` | + +#### Proof Artifact Disclosure Classification + +| path | sensitiveDataClass | disclosable | assetPackEvidenceConfidentiality | potentiallyDisclosable | +| --- | --- | --- | --- | --- | +| `.bitcode/accounting-precision-report.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/asset-pack.lock.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-and-sensitive-flow-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-decisions.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/bounded-public-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/code-analysis-fact-registry.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/disclosure-boundary-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/disclosure-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/identity-authorization-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/identity-bindings.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-moment-contracts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-proofs.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-synthesis-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/journal-completeness-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/journal-diff.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-exclusions.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/materialization-visibility-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/measurement-receipts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/parsed-completion-envelopes.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/projection-policy.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-completeness-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-contracts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-family-registry.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-implementation-surface.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-surfaces.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/proof-contract.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/proof-witness-manifest.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/redaction-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/selected-source-material.json` | `licensed-source-material` | `false` | `licensed-source-material` | `false` | +| `.bitcode/selection-and-materialization-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/selection-consistency-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-participation.json` | `settlement-preview` | `false` | `settlement-preview` | `false` | +| `.bitcode/settlement-preview.json` | `settlement-preview` | `false` | `settlement-preview` | `false` | +| `.bitcode/settlement-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-source-to-shares-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/source-to-shares.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/static-heuristics-registry.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-report.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/system-proof-bundle.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-decisions-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-receipts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-report.json` | `verification-evidence` | `false` | `verification-evidence` | `false` | + +#### Witness Artifact Digest Inventory + +| path | digest | proofFamilies | sensitiveDataClass | disclosable | +| --- | --- | --- | --- | --- | +| `.bitcode/accounting-precision-report.json` | `sha256:95b45ae9eb9536bbfee549a496b4063a1be139c0c7afb6c793c4e2cb78d94012` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/asset-pack.lock.json` | `sha256:4327385821b6c9f534039e1493494702105307e978a3b06fb3403794861f541f` | `selection-and-materialization`, `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-and-sensitive-flow-proof.json` | `sha256:1ef6377e7a3c393fe2fc43f8a9b54f24904631c887e365200062f87c720d08d4` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-decisions.json` | `sha256:5981ab9ad1231577bdbd1f1a663f2a8d2f6e32c6e1144a5b7ecb362ff69bf7d0` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/bounded-public-proof.json` | `sha256:74c8e4cf02f637a9e6dc48854666992a91f6402dd5f80b2f31bfe483df9ef71c` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/code-analysis-fact-registry.json` | `sha256:23bc3c813aa06c1751c60db5beae2ada951202499df981aa8e9900fdc5cdb1b6` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/disclosure-boundary-proof.json` | `sha256:5610c4975fb289b3909932d3f5b53a7032b7a2507f60ec1b69079cb50f84dbf8` | `disclosure-boundary` | `private-proof-artifact` | `false` | +| `.bitcode/disclosure-proof.json` | `sha256:74c8e4cf02f637a9e6dc48854666992a91f6402dd5f80b2f31bfe483df9ef71c` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/eval-manifest.json` | `sha256:8e8d0e036c1e6ebdd3c2bd9eaf982040180adcbd56f7bed3ccf2386babdf46f4` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/external-boundary-manifest.json` | `sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a` | `bitcoin-settlement-interface` | `private-proof-artifact` | `false` | +| `.bitcode/identity-authorization-proof.json` | `sha256:cc3c680acc654e92261f714408b1cb0f2bbdc45d5623570d4ab6deecf552705b` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/identity-bindings.json` | `sha256:2b239e284be7d4bf2a1f43342e7c5318f77e5212e06257bfe663564893ff21ae` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/inference-moment-contracts.json` | `sha256:3c7873de78e25bb306c492ef3018539a5a164dbc34bb957a1016351c6d445808` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/inference-proofs.json` | `sha256:f5c66f068437c614430df435bca8880c968a92209ee38ee56c564ad60ff678f1` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/inference-synthesis-proof.json` | `sha256:b128d3ebfafc59642ae7d5574f24afe8f80dae532dcf68c24cef779bce0666c0` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/journal-completeness-proof.json` | `sha256:0309f74cd280d6f56073065c73e01a0d81a260e6dd1e7d6c10c8f27ab9eea4e1` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/journal-diff.json` | `sha256:255aac1f31bf9ca54f311e31ecec87028cc6fa19815508a35292c16f480881aa` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-exclusions.json` | `sha256:a5170676e5a1483126e7e8ec86a8740c5a033c44bfada9f7d54cc6fc9307ba13` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-proof.json` | `sha256:ec141f1062a9fd079135318d1407ccab9340f96c037cb5fc2de32aea4918e3d7` | `selection-and-materialization` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/materialization-visibility-proof.json` | `sha256:e71a0789bffb8fba9b03092e766d0f589299c55d14f8d61edbf4a750a6c3b1b2` | `selection-and-materialization` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/measurement-receipts.json` | `sha256:d717a53262cb2b72f17796e62b9b37cf4e20d1e90410560ed03db9fc7051b0d3` | `static-code-analysis` | `private-proof-artifact` | `false` | +| `.bitcode/parsed-completion-envelopes.json` | `sha256:5e34372dc7330b48d668a36d656c06ceda4545f5911669c8da146fb4cb9be7d6` | `inference-synthesis`, `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/projection-policy.json` | `sha256:12f98ec39b4b52000dd7c1a8cc86eb1deb8ba614dabdb5591dd02b54b8b4cb48` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-completeness-proof.json` | `sha256:9746305d06e0b55e0d7fe59a9ebddcd8d321d4de6e9c26b067aaa74e4842b018` | `prompt-completeness` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-contracts.json` | `sha256:e47ded65b7fa05c782049d88d0b5e48b71facde2517912023d24e7a306c364ca` | `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-family-registry.json` | `sha256:ab753a9f2a8152aff00bb63282d32a3cd518e38ab37d28372237ea049242cf59` | `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-implementation-surface.json` | `sha256:c91b6d44013d9514498b464bc4c6dce52197bdf70121663ada56f7af3c331da4` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-surfaces.json` | `sha256:3e365f6603e4066510fc07f0c16c245058c19b77e1b796ddc3e50d5ac5f2b91b` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/proof-contract.json` | `sha256:fe4a268e5d78b61c451ed9eabda2a6a27e2264ac39f8ec724cb2b9f82ee5272f` | `proof-contract` | `private-proof-artifact` | `false` | +| `.bitcode/redaction-proof.json` | `sha256:74c8e4cf02f637a9e6dc48854666992a91f6402dd5f80b2f31bfe483df9ef71c` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/selected-source-material.json` | `sha256:6690719da2460798a8b855d707f9ded84fc28ce60b00aec55636e9d99e47cdd6` | `selection-and-materialization` | `licensed-source-material` | `false` | +| `.bitcode/selection-and-materialization-proof.json` | `sha256:5effc18dd1f65e1188616aa32cf8e4dc3a8a06bdd3eb95cc2e04341d166fca65` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/selection-consistency-proof.json` | `sha256:501307fda8ba5ca845f985e7c2857595abc67ce54037f07ffa384080d45ca725` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow-proof.json` | `sha256:fdd7c9f7f92d31fd298f5a2259959d8f8e9b0cb1ce754e5d4a5a84aba4aa196b` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow.json` | `sha256:7cdb6797681ba014ac95ccfa266175833b703261e5ce50025da32b624fefbaf0` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-participation.json` | `sha256:9d143e66aa4753576e168a51b6c81203c7f90154f8762c493a1d7e3e914f8c56` | `settlement-source-to-shares` | `settlement-preview` | `false` | +| `.bitcode/settlement-preview.json` | `sha256:b4f48f36750bb8e789199080421c4a051dadf37bc0519ca0738c263961d0afc3` | `settlement-source-to-shares`, `bitcoin-settlement-interface` | `settlement-preview` | `false` | +| `.bitcode/settlement-proof.json` | `sha256:93619dac9545954b993d6058012a17d6b6a87d961cf68699492f29d5bfc7cb89` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-source-to-shares-proof.json` | `sha256:bb393d54832f9a216f0fe6129671c9369071e0cf78aa823ea5eae59c1d0383e1` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/source-to-shares.json` | `sha256:ba57d7503ee19baee3d14abff0c0386aa5c6cac616c94d37a6d7f94d419b3d98` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/static-heuristics-registry.json` | `sha256:a0ffd24e12eb594dd4a9f26c5f3c8d30fac981d018bc57e689c19dca067cd6cb` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-proof.json` | `sha256:adab7903446c23a53b6104c1e12fefca4bd54fe2bba624f440d3aa2e774b2068` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-report.json` | `sha256:1bb54e49a9d35a309f6d4609c114a240249ed537150afec8202fe0d882fb91cf` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/verification-decisions-proof.json` | `sha256:608f4210eb9b498b765f65b1d7a8c67edddf9bc3d5ff1fd6a0c7c3aeb7c5859f` | `verification-decisions` | `private-proof-artifact` | `false` | +| `.bitcode/verification-receipts.json` | `sha256:ef5b77905b73c2034704e7eb8f68a0577c5ac40cfd418d541336936ccf9015c8` | `verification-decisions` | `private-proof-artifact` | `false` | +| `.bitcode/verification-report.json` | `sha256:aaef2e74211a6ce18cb681c9be1f8c2c0ff323f3f61f4a4318c824a96eb58b97` | `verification-decisions` | `verification-evidence` | `false` | + +### unsafe-patch-review-recovery/patch + +- branchName: `bitcode/remediation-read_unsafe-patch-review-recovery_16a56c87c5-unsafe-patch-review-recovery` +- readId: `read_unsafe-patch-review-recovery_16a56c87c5` +- assetPackId: `asset_pack_fd3c892c8e9e` +- proofContractHash: `sha256:081e1b7dde51ffe365b65b8a69d22bef36b87ec49e90d3c5bc81f1d731ba23eb` +- allFamiliesPassed: `true` +- proofContractPassed: `true` + +#### Family Proof Hashes + +| proofFamily | proofHash | proofArtifactPath | +| --- | --- | --- | +| `inference-synthesis` | `sha256:1d10c217eace8afce8408b11245435b2e9081835c29f5f2da5f29c59e41b7cc5` | `.bitcode/inference-synthesis-proof.json` | +| `prompt-completeness` | `sha256:9746305d06e0b55e0d7fe59a9ebddcd8d321d4de6e9c26b067aaa74e4842b018` | `.bitcode/prompt-completeness-proof.json` | +| `static-code-analysis` | `sha256:f4fba9666f284d709559ee6516ee9563926a367b8f7c6351fca108f319f1b4b6` | `.bitcode/static-measurement-proof.json` | +| `verification-decisions` | `sha256:608f4210eb9b498b765f65b1d7a8c67edddf9bc3d5ff1fd6a0c7c3aeb7c5859f` | `.bitcode/verification-decisions-proof.json` | +| `selection-and-materialization` | `sha256:fcc2ca2a8cb1a47c046d4cb66e6cce5bda0205778c6ab6e262d3be2cf5871816` | `.bitcode/selection-and-materialization-proof.json` | +| `authorization-and-sensitive-flow` | `sha256:2260487892adf8f4485b3d2e93477abe006715da4c6b703f30d76a57e028a12c` | `.bitcode/authorization-and-sensitive-flow-proof.json` | +| `settlement-source-to-shares` | `sha256:a7bd13bcc1b386278afc294cdf8a4b9461667919c53fdac7649ad8a9c5950f68` | `.bitcode/settlement-source-to-shares-proof.json` | +| `disclosure-boundary` | `sha256:45acb0a245c588240d0e9198a27e3ffa3a65362869d56727eb807343e4e36413` | `.bitcode/disclosure-boundary-proof.json` | +| `proof-contract` | `sha256:081e1b7dde51ffe365b65b8a69d22bef36b87ec49e90d3c5bc81f1d731ba23eb` | `.bitcode/proof-contract.json` | + +#### Proof Artifact Disclosure Classification + +| path | sensitiveDataClass | disclosable | assetPackEvidenceConfidentiality | potentiallyDisclosable | +| --- | --- | --- | --- | --- | +| `.bitcode/accounting-precision-report.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/asset-pack.lock.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-and-sensitive-flow-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-decisions.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/bounded-public-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/code-analysis-fact-registry.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/disclosure-boundary-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/disclosure-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/identity-authorization-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/identity-bindings.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-moment-contracts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-proofs.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-synthesis-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/journal-completeness-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/journal-diff.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-exclusions.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/materialization-visibility-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/measurement-receipts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/parsed-completion-envelopes.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/projection-policy.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-completeness-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-contracts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-family-registry.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-implementation-surface.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-surfaces.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/proof-contract.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/proof-witness-manifest.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/redaction-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/selected-source-material.json` | `licensed-source-material` | `false` | `licensed-source-material` | `false` | +| `.bitcode/selection-and-materialization-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/selection-consistency-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-participation.json` | `settlement-preview` | `false` | `settlement-preview` | `false` | +| `.bitcode/settlement-preview.json` | `settlement-preview` | `false` | `settlement-preview` | `false` | +| `.bitcode/settlement-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-source-to-shares-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/source-to-shares.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/static-heuristics-registry.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-report.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/system-proof-bundle.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-decisions-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-receipts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-report.json` | `verification-evidence` | `false` | `verification-evidence` | `false` | + +#### Witness Artifact Digest Inventory + +| path | digest | proofFamilies | sensitiveDataClass | disclosable | +| --- | --- | --- | --- | --- | +| `.bitcode/accounting-precision-report.json` | `sha256:211dcb4811d83b8ebc24e5c11af5fc09afb3c84e51c7d19b9f991fb7e7c81cdc` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/asset-pack.lock.json` | `sha256:cdf13e57999ee55469779a4e1e2872709b99b67bf725465dc7a70ced3651cb4a` | `selection-and-materialization`, `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-and-sensitive-flow-proof.json` | `sha256:2260487892adf8f4485b3d2e93477abe006715da4c6b703f30d76a57e028a12c` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-decisions.json` | `sha256:b4ec55ec4704f86d144b0a65fc340c3962bf240c67de08e2b3e37ad32c5399b0` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/bounded-public-proof.json` | `sha256:4c34cfb8e09abc3fea234130d5e22306e4384e7e02b72d10c38ed4e6a48f9ed6` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/code-analysis-fact-registry.json` | `sha256:a03da5047522735e147503bfc9fc47f210f6733e934dc36ad29b4fcc10f2a409` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/disclosure-boundary-proof.json` | `sha256:45acb0a245c588240d0e9198a27e3ffa3a65362869d56727eb807343e4e36413` | `disclosure-boundary` | `private-proof-artifact` | `false` | +| `.bitcode/disclosure-proof.json` | `sha256:4c34cfb8e09abc3fea234130d5e22306e4384e7e02b72d10c38ed4e6a48f9ed6` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/eval-manifest.json` | `sha256:9206df458686f3d4cdb0badae8e803cccf2b57501066b0da3c5e7e22eebaac92` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/external-boundary-manifest.json` | `sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a` | `bitcoin-settlement-interface` | `private-proof-artifact` | `false` | +| `.bitcode/identity-authorization-proof.json` | `sha256:1c9b1263bb7b7369c5198c518dfabccd135d3bb66f52807b99022037b205f034` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/identity-bindings.json` | `sha256:d0debea21fc12d3c1b01fe923ed58a92b5f9188074c7f35bf138cc5cdbedcc89` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/inference-moment-contracts.json` | `sha256:0b81c774979bc960c5470c092f9d0f240bf9cbec0454b4f6e9a6afa595589607` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/inference-proofs.json` | `sha256:c1cea028a02c09bf4071337f6971368a1ca149b1172b7cc0e251b9d3794e4245` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/inference-synthesis-proof.json` | `sha256:1d10c217eace8afce8408b11245435b2e9081835c29f5f2da5f29c59e41b7cc5` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/journal-completeness-proof.json` | `sha256:b49a12e17932a30da0273d11cf9a47d7b2d43f51739526eacd600f272f2e1133` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/journal-diff.json` | `sha256:ce56c4fb5c0c3de094741a30c5a6e220192bb8b911ab4d9c0a172ef6b57180f0` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-exclusions.json` | `sha256:1497918b2148fb9bad562416b2d46b90b85eeb988c3ea355e9aad5d38ea36547` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-proof.json` | `sha256:ba634a091705d48920bbde42a75e0dc700bb1697c8b33feb68367b356814adf5` | `selection-and-materialization` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/materialization-visibility-proof.json` | `sha256:d27e089bde28105989dbbf6ec9bafe5da53f3c72ae8533e605b7c9f4ca12ff95` | `selection-and-materialization` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/measurement-receipts.json` | `sha256:8af4e3ce8938d57e58bc1282d863cbfd15f15d6ba99c4972ab17d5bf1a571957` | `static-code-analysis` | `private-proof-artifact` | `false` | +| `.bitcode/parsed-completion-envelopes.json` | `sha256:95ceba55806dcbebce98645a62a55e31b48767f7e5c1aa2fb5fd2d3a1ba512fa` | `inference-synthesis`, `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/projection-policy.json` | `sha256:12f98ec39b4b52000dd7c1a8cc86eb1deb8ba614dabdb5591dd02b54b8b4cb48` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-completeness-proof.json` | `sha256:9746305d06e0b55e0d7fe59a9ebddcd8d321d4de6e9c26b067aaa74e4842b018` | `prompt-completeness` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-contracts.json` | `sha256:139369067a8d2d1ec94ed67bb51ba0b2ad74e92af71a988fda83113eb9edba14` | `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-family-registry.json` | `sha256:ab753a9f2a8152aff00bb63282d32a3cd518e38ab37d28372237ea049242cf59` | `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-implementation-surface.json` | `sha256:566ba4e640705978e4064fa1c9c8d55b77f0fe7cfde0d4b112d006edc0ca63f2` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-surfaces.json` | `sha256:927b1a4ce68b0ccc92e9e85c605b2e2f2d2ff0011b39b46c2ea31c4e2de6712b` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/proof-contract.json` | `sha256:a42c8c346a20e5c82f84941bf3245ab46a5d9a111ffb073398a5e51e3eda7cab` | `proof-contract` | `private-proof-artifact` | `false` | +| `.bitcode/redaction-proof.json` | `sha256:4c34cfb8e09abc3fea234130d5e22306e4384e7e02b72d10c38ed4e6a48f9ed6` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/selected-source-material.json` | `sha256:241a88c2df2623a0f2fda365a4b56fbd0b87396d61b13975bd92331c85d16f22` | `selection-and-materialization` | `licensed-source-material` | `false` | +| `.bitcode/selection-and-materialization-proof.json` | `sha256:fcc2ca2a8cb1a47c046d4cb66e6cce5bda0205778c6ab6e262d3be2cf5871816` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/selection-consistency-proof.json` | `sha256:6d85aaed7d0cf7270dc0b1a3f44b04df5487492cb02b8165e63c08e7efc38a7e` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow-proof.json` | `sha256:5cf464309b76a143cbf7a6aa7809b3ba933be40f9d5f216b525853ab6cfc675b` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow.json` | `sha256:7baff46f4ff2ed5d334a9182238932ac899589b1140ce312508235ca836987c3` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-participation.json` | `sha256:02cc19fd505fa15604a7ef08ef0c8ec020ffab6bb6dd32482e70392023aae9c9` | `settlement-source-to-shares` | `settlement-preview` | `false` | +| `.bitcode/settlement-preview.json` | `sha256:19433854367ec23425e38e1b53936787abe6160b52cd15ee32bb7e9c42ebad69` | `settlement-source-to-shares`, `bitcoin-settlement-interface` | `settlement-preview` | `false` | +| `.bitcode/settlement-proof.json` | `sha256:1e847396743898e5595e7e509eec458e430bedb888294df628c18ced2ed39ec5` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-source-to-shares-proof.json` | `sha256:a7bd13bcc1b386278afc294cdf8a4b9461667919c53fdac7649ad8a9c5950f68` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/source-to-shares.json` | `sha256:2cfd1ebd2206bd145f3eb79ca92d6692b40f55283c973459914e90dcaa1a6786` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/static-heuristics-registry.json` | `sha256:33ad5ce4f284cc878d2f575c66cb51521fe6d0d9e892bdbc088fee71017df424` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-proof.json` | `sha256:f4fba9666f284d709559ee6516ee9563926a367b8f7c6351fca108f319f1b4b6` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-report.json` | `sha256:49801567def5c6832d2e1fad1c1ba1f3a03dbf85a224802074b5d0dd777bbe2b` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/verification-decisions-proof.json` | `sha256:608f4210eb9b498b765f65b1d7a8c67edddf9bc3d5ff1fd6a0c7c3aeb7c5859f` | `verification-decisions` | `private-proof-artifact` | `false` | +| `.bitcode/verification-receipts.json` | `sha256:6031671fc2964a6ed265ad22e7f06da2a3a11d0cdcb45c1ef0707d63613c44f6` | `verification-decisions` | `private-proof-artifact` | `false` | +| `.bitcode/verification-report.json` | `sha256:d90a28e4b0230c440e755c382eccfbc349293dca056b37fe7508c5ade82f572b` | `verification-decisions` | `verification-evidence` | `false` | + +### unsafe-patch-review-recovery/context + +- branchName: `bitcode/remediation-read_unsafe-patch-review-recovery_16a56c87c5-unsafe-patch-review-recovery` +- readId: `read_unsafe-patch-review-recovery_16a56c87c5` +- assetPackId: `asset_pack_fd3c892c8e9e` +- proofContractHash: `sha256:081e1b7dde51ffe365b65b8a69d22bef36b87ec49e90d3c5bc81f1d731ba23eb` +- allFamiliesPassed: `true` +- proofContractPassed: `true` + +#### Family Proof Hashes + +| proofFamily | proofHash | proofArtifactPath | +| --- | --- | --- | +| `inference-synthesis` | `sha256:1d10c217eace8afce8408b11245435b2e9081835c29f5f2da5f29c59e41b7cc5` | `.bitcode/inference-synthesis-proof.json` | +| `prompt-completeness` | `sha256:9746305d06e0b55e0d7fe59a9ebddcd8d321d4de6e9c26b067aaa74e4842b018` | `.bitcode/prompt-completeness-proof.json` | +| `static-code-analysis` | `sha256:f4fba9666f284d709559ee6516ee9563926a367b8f7c6351fca108f319f1b4b6` | `.bitcode/static-measurement-proof.json` | +| `verification-decisions` | `sha256:608f4210eb9b498b765f65b1d7a8c67edddf9bc3d5ff1fd6a0c7c3aeb7c5859f` | `.bitcode/verification-decisions-proof.json` | +| `selection-and-materialization` | `sha256:f6abbdaf4249320486a9fd70d316ab1edda52b764cc4242f0136c40efa30ef27` | `.bitcode/selection-and-materialization-proof.json` | +| `authorization-and-sensitive-flow` | `sha256:2260487892adf8f4485b3d2e93477abe006715da4c6b703f30d76a57e028a12c` | `.bitcode/authorization-and-sensitive-flow-proof.json` | +| `settlement-source-to-shares` | `sha256:d0e3bad9478b45ec41131e9b79f625426f75e870265f91104f859ac8cbe7b7c6` | `.bitcode/settlement-source-to-shares-proof.json` | +| `disclosure-boundary` | `sha256:1821843556aeb7ea7924f52129b0e00e9e7c35a7795f842947bde87b9120b743` | `.bitcode/disclosure-boundary-proof.json` | +| `proof-contract` | `sha256:081e1b7dde51ffe365b65b8a69d22bef36b87ec49e90d3c5bc81f1d731ba23eb` | `.bitcode/proof-contract.json` | + +#### Proof Artifact Disclosure Classification + +| path | sensitiveDataClass | disclosable | assetPackEvidenceConfidentiality | potentiallyDisclosable | +| --- | --- | --- | --- | --- | +| `.bitcode/accounting-precision-report.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/asset-pack.lock.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-and-sensitive-flow-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-decisions.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/bounded-public-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/code-analysis-fact-registry.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/disclosure-boundary-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/disclosure-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/identity-authorization-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/identity-bindings.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-moment-contracts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-proofs.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-synthesis-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/journal-completeness-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/journal-diff.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-exclusions.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/materialization-visibility-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/measurement-receipts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/parsed-completion-envelopes.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/projection-policy.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-completeness-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-contracts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-family-registry.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-implementation-surface.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-surfaces.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/proof-contract.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/proof-witness-manifest.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/redaction-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/selected-source-material.json` | `licensed-source-material` | `false` | `licensed-source-material` | `false` | +| `.bitcode/selection-and-materialization-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/selection-consistency-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-participation.json` | `settlement-preview` | `false` | `settlement-preview` | `false` | +| `.bitcode/settlement-preview.json` | `settlement-preview` | `false` | `settlement-preview` | `false` | +| `.bitcode/settlement-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-source-to-shares-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/source-to-shares.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/static-heuristics-registry.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-report.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/system-proof-bundle.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-decisions-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-receipts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-report.json` | `verification-evidence` | `false` | `verification-evidence` | `false` | + +#### Witness Artifact Digest Inventory + +| path | digest | proofFamilies | sensitiveDataClass | disclosable | +| --- | --- | --- | --- | --- | +| `.bitcode/accounting-precision-report.json` | `sha256:aedd512b38435c2c8788db85a80e13b2b3fc29417c12b244ad61101af9ba8b60` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/asset-pack.lock.json` | `sha256:10fb949ac86f2c3234beeb4453c01b73de4a46c1413ccc83edcb9dff1074df5a` | `selection-and-materialization`, `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-and-sensitive-flow-proof.json` | `sha256:2260487892adf8f4485b3d2e93477abe006715da4c6b703f30d76a57e028a12c` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-decisions.json` | `sha256:b4ec55ec4704f86d144b0a65fc340c3962bf240c67de08e2b3e37ad32c5399b0` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/bounded-public-proof.json` | `sha256:3920104b24531e329948f80b2d900fc98cfc42698d4ac1fa0e7286df74a5e01d` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/code-analysis-fact-registry.json` | `sha256:a03da5047522735e147503bfc9fc47f210f6733e934dc36ad29b4fcc10f2a409` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/disclosure-boundary-proof.json` | `sha256:1821843556aeb7ea7924f52129b0e00e9e7c35a7795f842947bde87b9120b743` | `disclosure-boundary` | `private-proof-artifact` | `false` | +| `.bitcode/disclosure-proof.json` | `sha256:3920104b24531e329948f80b2d900fc98cfc42698d4ac1fa0e7286df74a5e01d` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/eval-manifest.json` | `sha256:9206df458686f3d4cdb0badae8e803cccf2b57501066b0da3c5e7e22eebaac92` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/external-boundary-manifest.json` | `sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a` | `bitcoin-settlement-interface` | `private-proof-artifact` | `false` | +| `.bitcode/identity-authorization-proof.json` | `sha256:1c9b1263bb7b7369c5198c518dfabccd135d3bb66f52807b99022037b205f034` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/identity-bindings.json` | `sha256:d0debea21fc12d3c1b01fe923ed58a92b5f9188074c7f35bf138cc5cdbedcc89` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/inference-moment-contracts.json` | `sha256:0b81c774979bc960c5470c092f9d0f240bf9cbec0454b4f6e9a6afa595589607` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/inference-proofs.json` | `sha256:c1cea028a02c09bf4071337f6971368a1ca149b1172b7cc0e251b9d3794e4245` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/inference-synthesis-proof.json` | `sha256:1d10c217eace8afce8408b11245435b2e9081835c29f5f2da5f29c59e41b7cc5` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/journal-completeness-proof.json` | `sha256:7c1ebcb79090dd09243552478df9b9eb637bedbd91044dda36836887a4f4332d` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/journal-diff.json` | `sha256:bbaff4c9e409f03b11defdf0c152826374fde34f79b7a07be8b38471ee547e36` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-exclusions.json` | `sha256:0979d8fece848a46034cff3b7439c73928e4490316688e0a5458a29d4251c34f` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-proof.json` | `sha256:c106e15b75acfbdfe03de98f435b1e8c8c8ebb59867e0e6a1341a810935cb245` | `selection-and-materialization` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/materialization-visibility-proof.json` | `sha256:d27e089bde28105989dbbf6ec9bafe5da53f3c72ae8533e605b7c9f4ca12ff95` | `selection-and-materialization` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/measurement-receipts.json` | `sha256:8af4e3ce8938d57e58bc1282d863cbfd15f15d6ba99c4972ab17d5bf1a571957` | `static-code-analysis` | `private-proof-artifact` | `false` | +| `.bitcode/parsed-completion-envelopes.json` | `sha256:95ceba55806dcbebce98645a62a55e31b48767f7e5c1aa2fb5fd2d3a1ba512fa` | `inference-synthesis`, `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/projection-policy.json` | `sha256:12f98ec39b4b52000dd7c1a8cc86eb1deb8ba614dabdb5591dd02b54b8b4cb48` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-completeness-proof.json` | `sha256:9746305d06e0b55e0d7fe59a9ebddcd8d321d4de6e9c26b067aaa74e4842b018` | `prompt-completeness` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-contracts.json` | `sha256:139369067a8d2d1ec94ed67bb51ba0b2ad74e92af71a988fda83113eb9edba14` | `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-family-registry.json` | `sha256:ab753a9f2a8152aff00bb63282d32a3cd518e38ab37d28372237ea049242cf59` | `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-implementation-surface.json` | `sha256:566ba4e640705978e4064fa1c9c8d55b77f0fe7cfde0d4b112d006edc0ca63f2` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-surfaces.json` | `sha256:927b1a4ce68b0ccc92e9e85c605b2e2f2d2ff0011b39b46c2ea31c4e2de6712b` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/proof-contract.json` | `sha256:a42c8c346a20e5c82f84941bf3245ab46a5d9a111ffb073398a5e51e3eda7cab` | `proof-contract` | `private-proof-artifact` | `false` | +| `.bitcode/redaction-proof.json` | `sha256:3920104b24531e329948f80b2d900fc98cfc42698d4ac1fa0e7286df74a5e01d` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/selected-source-material.json` | `sha256:9885cb919e9f819c193899633241241f3217d2583aa76d8719a6f5fcc5308e0c` | `selection-and-materialization` | `licensed-source-material` | `false` | +| `.bitcode/selection-and-materialization-proof.json` | `sha256:f6abbdaf4249320486a9fd70d316ab1edda52b764cc4242f0136c40efa30ef27` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/selection-consistency-proof.json` | `sha256:6d85aaed7d0cf7270dc0b1a3f44b04df5487492cb02b8165e63c08e7efc38a7e` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow-proof.json` | `sha256:5cf464309b76a143cbf7a6aa7809b3ba933be40f9d5f216b525853ab6cfc675b` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow.json` | `sha256:7baff46f4ff2ed5d334a9182238932ac899589b1140ce312508235ca836987c3` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-participation.json` | `sha256:5ce74f215f9d60e8005345240f4ece14b01bf4d68cca0e452e66f69fea4a77c9` | `settlement-source-to-shares` | `settlement-preview` | `false` | +| `.bitcode/settlement-preview.json` | `sha256:6ca0519ff7c12cc846645d1b0340688b7cd5391f185dfc67584a325f853cfc01` | `settlement-source-to-shares`, `bitcoin-settlement-interface` | `settlement-preview` | `false` | +| `.bitcode/settlement-proof.json` | `sha256:5aaca53542865b3794065212b504d1c0901e2b805b44aed4934c50a66b7e6a2d` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-source-to-shares-proof.json` | `sha256:d0e3bad9478b45ec41131e9b79f625426f75e870265f91104f859ac8cbe7b7c6` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/source-to-shares.json` | `sha256:2cfd1ebd2206bd145f3eb79ca92d6692b40f55283c973459914e90dcaa1a6786` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/static-heuristics-registry.json` | `sha256:33ad5ce4f284cc878d2f575c66cb51521fe6d0d9e892bdbc088fee71017df424` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-proof.json` | `sha256:f4fba9666f284d709559ee6516ee9563926a367b8f7c6351fca108f319f1b4b6` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-report.json` | `sha256:49801567def5c6832d2e1fad1c1ba1f3a03dbf85a224802074b5d0dd777bbe2b` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/verification-decisions-proof.json` | `sha256:608f4210eb9b498b765f65b1d7a8c67edddf9bc3d5ff1fd6a0c7c3aeb7c5859f` | `verification-decisions` | `private-proof-artifact` | `false` | +| `.bitcode/verification-receipts.json` | `sha256:6031671fc2964a6ed265ad22e7f06da2a3a11d0cdcb45c1ef0707d63613c44f6` | `verification-decisions` | `private-proof-artifact` | `false` | +| `.bitcode/verification-report.json` | `sha256:5c2e8fb59c61a922499b94bde2804e017b040f87dfce03d240ac8853eea65781` | `verification-decisions` | `verification-evidence` | `false` | + +### infra-deployment-mismatch/patch + +- branchName: `bitcode/remediation-read_infra-deployment-mismatch_be8a999141-infra-deployment-mismatch` +- readId: `read_infra-deployment-mismatch_be8a999141` +- assetPackId: `asset_pack_9f1b844a2cdf` +- proofContractHash: `sha256:7170c26e2b0d89451f79fe30b5e96f548a4f0c5e45f1947ee0fcefb109f93ca6` +- allFamiliesPassed: `true` +- proofContractPassed: `true` + +#### Family Proof Hashes + +| proofFamily | proofHash | proofArtifactPath | +| --- | --- | --- | +| `inference-synthesis` | `sha256:6a44eb26908aadf6943c6411c6e798675331f88d6e670690ac29f72f2df2d971` | `.bitcode/inference-synthesis-proof.json` | +| `prompt-completeness` | `sha256:9746305d06e0b55e0d7fe59a9ebddcd8d321d4de6e9c26b067aaa74e4842b018` | `.bitcode/prompt-completeness-proof.json` | +| `static-code-analysis` | `sha256:de13e187f609cf5b5a4f7462d404f3e5b6a9ec6a1b5409af0a41d54be89c7637` | `.bitcode/static-measurement-proof.json` | +| `verification-decisions` | `sha256:608f4210eb9b498b765f65b1d7a8c67edddf9bc3d5ff1fd6a0c7c3aeb7c5859f` | `.bitcode/verification-decisions-proof.json` | +| `selection-and-materialization` | `sha256:a8f038138ceed6859020675d71736cdba5a587e6b48ddb29133db3011ef74d52` | `.bitcode/selection-and-materialization-proof.json` | +| `authorization-and-sensitive-flow` | `sha256:2c1624cf684ae0a83834d9c7a28789d966ff776e1c61c5fbb611b5d73392547c` | `.bitcode/authorization-and-sensitive-flow-proof.json` | +| `settlement-source-to-shares` | `sha256:53e4472e0cf10ebdeddb6ae3b5e212f910a837ed1115dcd4175fc6f46f737650` | `.bitcode/settlement-source-to-shares-proof.json` | +| `disclosure-boundary` | `sha256:5bde14deb75ac18013f2f69e21112f774c1d4322a93489e95c3919c7a967f7d5` | `.bitcode/disclosure-boundary-proof.json` | +| `proof-contract` | `sha256:7170c26e2b0d89451f79fe30b5e96f548a4f0c5e45f1947ee0fcefb109f93ca6` | `.bitcode/proof-contract.json` | + +#### Proof Artifact Disclosure Classification + +| path | sensitiveDataClass | disclosable | assetPackEvidenceConfidentiality | potentiallyDisclosable | +| --- | --- | --- | --- | --- | +| `.bitcode/accounting-precision-report.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/asset-pack.lock.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-and-sensitive-flow-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-decisions.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/bounded-public-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/code-analysis-fact-registry.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/disclosure-boundary-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/disclosure-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/identity-authorization-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/identity-bindings.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-moment-contracts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-proofs.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-synthesis-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/journal-completeness-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/journal-diff.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-exclusions.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/materialization-visibility-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/measurement-receipts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/parsed-completion-envelopes.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/projection-policy.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-completeness-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-contracts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-family-registry.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-implementation-surface.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-surfaces.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/proof-contract.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/proof-witness-manifest.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/redaction-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/selected-source-material.json` | `licensed-source-material` | `false` | `licensed-source-material` | `false` | +| `.bitcode/selection-and-materialization-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/selection-consistency-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-participation.json` | `settlement-preview` | `false` | `settlement-preview` | `false` | +| `.bitcode/settlement-preview.json` | `settlement-preview` | `false` | `settlement-preview` | `false` | +| `.bitcode/settlement-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-source-to-shares-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/source-to-shares.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/static-heuristics-registry.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-report.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/system-proof-bundle.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-decisions-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-receipts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-report.json` | `verification-evidence` | `false` | `verification-evidence` | `false` | + +#### Witness Artifact Digest Inventory + +| path | digest | proofFamilies | sensitiveDataClass | disclosable | +| --- | --- | --- | --- | --- | +| `.bitcode/accounting-precision-report.json` | `sha256:e6eb896b77c9fb159e64a9e29533a7c305055e01a579aeae6efbbb42bef72b77` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/asset-pack.lock.json` | `sha256:d4d3e9495263cb92a69fddd0f7edb72c63c7c303c4cb5535f352ec51604959e8` | `selection-and-materialization`, `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-and-sensitive-flow-proof.json` | `sha256:2c1624cf684ae0a83834d9c7a28789d966ff776e1c61c5fbb611b5d73392547c` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-decisions.json` | `sha256:b7fda637e58e643038ee6ad4cc3e65610edff693a58024fe6c3f67fdfab5ec51` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/bounded-public-proof.json` | `sha256:af3e0c2cb3148443ca9f967906fa079cade336b39bbd36b05e6f031353dc0715` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/code-analysis-fact-registry.json` | `sha256:edd0136dc30e19e51631f64ff76b847822eebe97c68811bc8dc8dd1a4c368126` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/disclosure-boundary-proof.json` | `sha256:5bde14deb75ac18013f2f69e21112f774c1d4322a93489e95c3919c7a967f7d5` | `disclosure-boundary` | `private-proof-artifact` | `false` | +| `.bitcode/disclosure-proof.json` | `sha256:af3e0c2cb3148443ca9f967906fa079cade336b39bbd36b05e6f031353dc0715` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/eval-manifest.json` | `sha256:285912525499e94c8651783b615cec94c09ed1bc4a721d2cd9b2bb7d45ca6bc0` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/external-boundary-manifest.json` | `sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a` | `bitcoin-settlement-interface` | `private-proof-artifact` | `false` | +| `.bitcode/identity-authorization-proof.json` | `sha256:965ba1aff4604765638f5f2fba6721007f57f6d4fa553938df7397fa460ad8d1` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/identity-bindings.json` | `sha256:980c3e9afa612cfbdae5fee2668cea479236ea1ed699ed688ed553f8d960a054` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/inference-moment-contracts.json` | `sha256:a1e7ba65e662bebe0b9babb6067655b7cdcbaa5876d82140a3e84ecd8a892726` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/inference-proofs.json` | `sha256:a7f910211080b140df9104153bc1ee2ca4e79cc014b42d89ee687e24278319c6` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/inference-synthesis-proof.json` | `sha256:6a44eb26908aadf6943c6411c6e798675331f88d6e670690ac29f72f2df2d971` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/journal-completeness-proof.json` | `sha256:a7ca588dddbfafce36107d95c7d237b46c644c0122614e4967656c308fb38365` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/journal-diff.json` | `sha256:a726a4c350631cdff6d4f512a3b6cd30f7cf26b33077ba1049b66c54cf229fae` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-exclusions.json` | `sha256:cbacb2561b13b5e8480a7fbc23488dfd87df92f9c07098d4bba449941109b45a` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-proof.json` | `sha256:f27a92cfffb61f084e63838cda18b35ebd4b118170f88b06e427f9c8844464bf` | `selection-and-materialization` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/materialization-visibility-proof.json` | `sha256:598b7bb92d2791407ac01d15fe35c2b46f729c30534b819dff177672e9c44166` | `selection-and-materialization` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/measurement-receipts.json` | `sha256:9c29647f452b16962ba7c3046d365f04e63e667df669fdcb4d0f16322c3de76e` | `static-code-analysis` | `private-proof-artifact` | `false` | +| `.bitcode/parsed-completion-envelopes.json` | `sha256:adfd68a5c9458827e53484abc4f4b7c24320972545e0f5becd4c3443d1b828fd` | `inference-synthesis`, `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/projection-policy.json` | `sha256:12f98ec39b4b52000dd7c1a8cc86eb1deb8ba614dabdb5591dd02b54b8b4cb48` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-completeness-proof.json` | `sha256:9746305d06e0b55e0d7fe59a9ebddcd8d321d4de6e9c26b067aaa74e4842b018` | `prompt-completeness` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-contracts.json` | `sha256:ebcb977eb8b8ad5a9fcb3d6640307ad033c642f08fab42326f1a2e7844752525` | `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-family-registry.json` | `sha256:ab753a9f2a8152aff00bb63282d32a3cd518e38ab37d28372237ea049242cf59` | `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-implementation-surface.json` | `sha256:c3732845741f36061ac1103c9b2485c814592989e3402bc91a38f7a8541b38af` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-surfaces.json` | `sha256:469e541169edd2d2bde8ff4ff540b41b3e2ad528438a1f425a644a9aabd2018c` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/proof-contract.json` | `sha256:e178cb17a881d2d0de927141ac19877252fc1f4c09d4788e2209b7b2b738914d` | `proof-contract` | `private-proof-artifact` | `false` | +| `.bitcode/redaction-proof.json` | `sha256:af3e0c2cb3148443ca9f967906fa079cade336b39bbd36b05e6f031353dc0715` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/selected-source-material.json` | `sha256:e1818adb231f247cfcf9d54189d132f7c6d27020d5af67ab2c8d5ed3a3117aeb` | `selection-and-materialization` | `licensed-source-material` | `false` | +| `.bitcode/selection-and-materialization-proof.json` | `sha256:a8f038138ceed6859020675d71736cdba5a587e6b48ddb29133db3011ef74d52` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/selection-consistency-proof.json` | `sha256:b0acbf48dbd4c5a4202a8683fc011822c96f6d7c566fd287412d544f7de1b4be` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow-proof.json` | `sha256:8f1970d50b815044e763d8f192ab7269689ea0b3916334f534df680e4b3eed57` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow.json` | `sha256:b4ecaeeea21c806acdb37bd049f3ac77f43295cb40ea16cbef318f9653b8d04b` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-participation.json` | `sha256:aef45c4332d64546c4ae0c94af83be2384f25ba49770b025c5bf85e40b82d71f` | `settlement-source-to-shares` | `settlement-preview` | `false` | +| `.bitcode/settlement-preview.json` | `sha256:7cafe2b41af74f6a20eb15346a5100fcdb9026530df8386fc049bb792c3e9030` | `settlement-source-to-shares`, `bitcoin-settlement-interface` | `settlement-preview` | `false` | +| `.bitcode/settlement-proof.json` | `sha256:30518f8d5444b646771c961b268999103b5bd54a9a1438ff50d1813931edad56` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-source-to-shares-proof.json` | `sha256:53e4472e0cf10ebdeddb6ae3b5e212f910a837ed1115dcd4175fc6f46f737650` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/source-to-shares.json` | `sha256:81cb9d04a88483e9a534ebb47a3c9dba1ca3ccdbfe7dd6b363516979753c0a6c` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/static-heuristics-registry.json` | `sha256:1e425d3c3c057eea53cb4f984e775611cfc3bfc585355ae5c2c974e69e270804` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-proof.json` | `sha256:de13e187f609cf5b5a4f7462d404f3e5b6a9ec6a1b5409af0a41d54be89c7637` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-report.json` | `sha256:cef9d5e516f74689f3dc7315086660e2dd6d1385337367ac0038bb3681c53fe9` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/verification-decisions-proof.json` | `sha256:608f4210eb9b498b765f65b1d7a8c67edddf9bc3d5ff1fd6a0c7c3aeb7c5859f` | `verification-decisions` | `private-proof-artifact` | `false` | +| `.bitcode/verification-receipts.json` | `sha256:3f1c7e91fc6bbc7ed84ca4a14b784481c20fd8cf1551a2ead24791e5283d22d4` | `verification-decisions` | `private-proof-artifact` | `false` | +| `.bitcode/verification-report.json` | `sha256:919db1e7f91824815ab4570c9c45a19211b0f9c93ce4e64486264c22b4bf759f` | `verification-decisions` | `verification-evidence` | `false` | + +### infra-deployment-mismatch/context + +- branchName: `bitcode/remediation-read_infra-deployment-mismatch_be8a999141-infra-deployment-mismatch` +- readId: `read_infra-deployment-mismatch_be8a999141` +- assetPackId: `asset_pack_9f1b844a2cdf` +- proofContractHash: `sha256:7170c26e2b0d89451f79fe30b5e96f548a4f0c5e45f1947ee0fcefb109f93ca6` +- allFamiliesPassed: `true` +- proofContractPassed: `true` + +#### Family Proof Hashes + +| proofFamily | proofHash | proofArtifactPath | +| --- | --- | --- | +| `inference-synthesis` | `sha256:6a44eb26908aadf6943c6411c6e798675331f88d6e670690ac29f72f2df2d971` | `.bitcode/inference-synthesis-proof.json` | +| `prompt-completeness` | `sha256:9746305d06e0b55e0d7fe59a9ebddcd8d321d4de6e9c26b067aaa74e4842b018` | `.bitcode/prompt-completeness-proof.json` | +| `static-code-analysis` | `sha256:de13e187f609cf5b5a4f7462d404f3e5b6a9ec6a1b5409af0a41d54be89c7637` | `.bitcode/static-measurement-proof.json` | +| `verification-decisions` | `sha256:608f4210eb9b498b765f65b1d7a8c67edddf9bc3d5ff1fd6a0c7c3aeb7c5859f` | `.bitcode/verification-decisions-proof.json` | +| `selection-and-materialization` | `sha256:4ed2198c3827ebb995f8a02e140884f55fc4af51746f586804533a0bcc7f6904` | `.bitcode/selection-and-materialization-proof.json` | +| `authorization-and-sensitive-flow` | `sha256:2c1624cf684ae0a83834d9c7a28789d966ff776e1c61c5fbb611b5d73392547c` | `.bitcode/authorization-and-sensitive-flow-proof.json` | +| `settlement-source-to-shares` | `sha256:df2768d346405d0277894299351973b730a660e7f710af0b6f30f210d699c1af` | `.bitcode/settlement-source-to-shares-proof.json` | +| `disclosure-boundary` | `sha256:7f7de72b8b776f3b6b5250fb88ebb9efff0c3c67ba93043fc3efc63d507ea0a6` | `.bitcode/disclosure-boundary-proof.json` | +| `proof-contract` | `sha256:7170c26e2b0d89451f79fe30b5e96f548a4f0c5e45f1947ee0fcefb109f93ca6` | `.bitcode/proof-contract.json` | + +#### Proof Artifact Disclosure Classification + +| path | sensitiveDataClass | disclosable | assetPackEvidenceConfidentiality | potentiallyDisclosable | +| --- | --- | --- | --- | --- | +| `.bitcode/accounting-precision-report.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/asset-pack.lock.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-and-sensitive-flow-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-decisions.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/bounded-public-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/code-analysis-fact-registry.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/disclosure-boundary-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/disclosure-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/identity-authorization-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/identity-bindings.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-moment-contracts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-proofs.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-synthesis-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/journal-completeness-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/journal-diff.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-exclusions.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/materialization-visibility-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/measurement-receipts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/parsed-completion-envelopes.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/projection-policy.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-completeness-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-contracts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-family-registry.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-implementation-surface.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-surfaces.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/proof-contract.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/proof-witness-manifest.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/redaction-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/selected-source-material.json` | `licensed-source-material` | `false` | `licensed-source-material` | `false` | +| `.bitcode/selection-and-materialization-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/selection-consistency-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-participation.json` | `settlement-preview` | `false` | `settlement-preview` | `false` | +| `.bitcode/settlement-preview.json` | `settlement-preview` | `false` | `settlement-preview` | `false` | +| `.bitcode/settlement-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-source-to-shares-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/source-to-shares.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/static-heuristics-registry.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-report.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/system-proof-bundle.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-decisions-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-receipts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-report.json` | `verification-evidence` | `false` | `verification-evidence` | `false` | + +#### Witness Artifact Digest Inventory + +| path | digest | proofFamilies | sensitiveDataClass | disclosable | +| --- | --- | --- | --- | --- | +| `.bitcode/accounting-precision-report.json` | `sha256:7d34b19c9298cfe043e5ab0096e5766e839444a3027c806efd64f115e98a38b9` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/asset-pack.lock.json` | `sha256:8c81abd46de1f27dccd1607ef96d0fdd79f0f64d6436918478e6872d010660f1` | `selection-and-materialization`, `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-and-sensitive-flow-proof.json` | `sha256:2c1624cf684ae0a83834d9c7a28789d966ff776e1c61c5fbb611b5d73392547c` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-decisions.json` | `sha256:b7fda637e58e643038ee6ad4cc3e65610edff693a58024fe6c3f67fdfab5ec51` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/bounded-public-proof.json` | `sha256:0ee4bbf7e89b96f7249da804ad174d47b8ed2133ca5ee6d533b080eafdeca75d` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/code-analysis-fact-registry.json` | `sha256:edd0136dc30e19e51631f64ff76b847822eebe97c68811bc8dc8dd1a4c368126` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/disclosure-boundary-proof.json` | `sha256:7f7de72b8b776f3b6b5250fb88ebb9efff0c3c67ba93043fc3efc63d507ea0a6` | `disclosure-boundary` | `private-proof-artifact` | `false` | +| `.bitcode/disclosure-proof.json` | `sha256:0ee4bbf7e89b96f7249da804ad174d47b8ed2133ca5ee6d533b080eafdeca75d` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/eval-manifest.json` | `sha256:285912525499e94c8651783b615cec94c09ed1bc4a721d2cd9b2bb7d45ca6bc0` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/external-boundary-manifest.json` | `sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a` | `bitcoin-settlement-interface` | `private-proof-artifact` | `false` | +| `.bitcode/identity-authorization-proof.json` | `sha256:965ba1aff4604765638f5f2fba6721007f57f6d4fa553938df7397fa460ad8d1` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/identity-bindings.json` | `sha256:980c3e9afa612cfbdae5fee2668cea479236ea1ed699ed688ed553f8d960a054` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/inference-moment-contracts.json` | `sha256:a1e7ba65e662bebe0b9babb6067655b7cdcbaa5876d82140a3e84ecd8a892726` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/inference-proofs.json` | `sha256:a7f910211080b140df9104153bc1ee2ca4e79cc014b42d89ee687e24278319c6` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/inference-synthesis-proof.json` | `sha256:6a44eb26908aadf6943c6411c6e798675331f88d6e670690ac29f72f2df2d971` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/journal-completeness-proof.json` | `sha256:3dc46c757b0617248af558fcd07a9e7e1a76281804749174d8e8100cf3fe24c5` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/journal-diff.json` | `sha256:7779bde5b2647f3de068b07f9d17fcfeceeea06564c801e6da94240cbe6ff0d9` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-exclusions.json` | `sha256:53ce7e742f5a762e92a11728f0fbcd2785f87f4c4fd1564256a6948601932e03` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-proof.json` | `sha256:3f3fe6bf4ec60092b5dd255619c6f5938268123cead2ce104e6a2ed9c5ede4b9` | `selection-and-materialization` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/materialization-visibility-proof.json` | `sha256:598b7bb92d2791407ac01d15fe35c2b46f729c30534b819dff177672e9c44166` | `selection-and-materialization` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/measurement-receipts.json` | `sha256:9c29647f452b16962ba7c3046d365f04e63e667df669fdcb4d0f16322c3de76e` | `static-code-analysis` | `private-proof-artifact` | `false` | +| `.bitcode/parsed-completion-envelopes.json` | `sha256:adfd68a5c9458827e53484abc4f4b7c24320972545e0f5becd4c3443d1b828fd` | `inference-synthesis`, `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/projection-policy.json` | `sha256:12f98ec39b4b52000dd7c1a8cc86eb1deb8ba614dabdb5591dd02b54b8b4cb48` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-completeness-proof.json` | `sha256:9746305d06e0b55e0d7fe59a9ebddcd8d321d4de6e9c26b067aaa74e4842b018` | `prompt-completeness` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-contracts.json` | `sha256:ebcb977eb8b8ad5a9fcb3d6640307ad033c642f08fab42326f1a2e7844752525` | `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-family-registry.json` | `sha256:ab753a9f2a8152aff00bb63282d32a3cd518e38ab37d28372237ea049242cf59` | `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-implementation-surface.json` | `sha256:c3732845741f36061ac1103c9b2485c814592989e3402bc91a38f7a8541b38af` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-surfaces.json` | `sha256:469e541169edd2d2bde8ff4ff540b41b3e2ad528438a1f425a644a9aabd2018c` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/proof-contract.json` | `sha256:e178cb17a881d2d0de927141ac19877252fc1f4c09d4788e2209b7b2b738914d` | `proof-contract` | `private-proof-artifact` | `false` | +| `.bitcode/redaction-proof.json` | `sha256:0ee4bbf7e89b96f7249da804ad174d47b8ed2133ca5ee6d533b080eafdeca75d` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/selected-source-material.json` | `sha256:93d3913609ce424a9e1fa849345755f1447e5d1da6b3df68afc118c72332155c` | `selection-and-materialization` | `licensed-source-material` | `false` | +| `.bitcode/selection-and-materialization-proof.json` | `sha256:4ed2198c3827ebb995f8a02e140884f55fc4af51746f586804533a0bcc7f6904` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/selection-consistency-proof.json` | `sha256:b0acbf48dbd4c5a4202a8683fc011822c96f6d7c566fd287412d544f7de1b4be` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow-proof.json` | `sha256:8f1970d50b815044e763d8f192ab7269689ea0b3916334f534df680e4b3eed57` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow.json` | `sha256:b4ecaeeea21c806acdb37bd049f3ac77f43295cb40ea16cbef318f9653b8d04b` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-participation.json` | `sha256:7ad6bd3fd130367f088328db7f66846195082ec030bda9f4a9b5efa3ab04c7d2` | `settlement-source-to-shares` | `settlement-preview` | `false` | +| `.bitcode/settlement-preview.json` | `sha256:0a31a8bd83ab1d4b208f31790940e2fed1c7ecedda8e3b904fb25b0824fdbbb5` | `settlement-source-to-shares`, `bitcoin-settlement-interface` | `settlement-preview` | `false` | +| `.bitcode/settlement-proof.json` | `sha256:e5fdec8d3f9cc0ae660fede823a31ffdddab96b3b2fdb808738bc2385ba59d0a` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-source-to-shares-proof.json` | `sha256:df2768d346405d0277894299351973b730a660e7f710af0b6f30f210d699c1af` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/source-to-shares.json` | `sha256:81cb9d04a88483e9a534ebb47a3c9dba1ca3ccdbfe7dd6b363516979753c0a6c` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/static-heuristics-registry.json` | `sha256:1e425d3c3c057eea53cb4f984e775611cfc3bfc585355ae5c2c974e69e270804` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-proof.json` | `sha256:de13e187f609cf5b5a4f7462d404f3e5b6a9ec6a1b5409af0a41d54be89c7637` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-report.json` | `sha256:cef9d5e516f74689f3dc7315086660e2dd6d1385337367ac0038bb3681c53fe9` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/verification-decisions-proof.json` | `sha256:608f4210eb9b498b765f65b1d7a8c67edddf9bc3d5ff1fd6a0c7c3aeb7c5859f` | `verification-decisions` | `private-proof-artifact` | `false` | +| `.bitcode/verification-receipts.json` | `sha256:3f1c7e91fc6bbc7ed84ca4a14b784481c20fd8cf1551a2ead24791e5283d22d4` | `verification-decisions` | `private-proof-artifact` | `false` | +| `.bitcode/verification-report.json` | `sha256:d4c2a17b99f712ba1133aec25049179e0314e2a030d4d26004b37325273df09d` | `verification-decisions` | `verification-evidence` | `false` | + +### privacy-boundary-proof-export/patch + +- branchName: `bitcode/remediation-read_privacy-boundary-proof-export_8163942d95-privacy-boundary-proof-export` +- readId: `read_privacy-boundary-proof-export_8163942d95` +- assetPackId: `asset_pack_c5fef3ab17c5` +- proofContractHash: `sha256:94214cf13298a6992d32afa5572d4359fc9c21a74ab86c4625e2b03d3a1a6d6c` +- allFamiliesPassed: `true` +- proofContractPassed: `true` + +#### Family Proof Hashes + +| proofFamily | proofHash | proofArtifactPath | +| --- | --- | --- | +| `inference-synthesis` | `sha256:af111ab74d6aa230fc1ae3a12a02592d15e6476d692beb927a2480c2033c8b60` | `.bitcode/inference-synthesis-proof.json` | +| `prompt-completeness` | `sha256:9746305d06e0b55e0d7fe59a9ebddcd8d321d4de6e9c26b067aaa74e4842b018` | `.bitcode/prompt-completeness-proof.json` | +| `static-code-analysis` | `sha256:dde5e174eddf0911801b1eb8845991d70f97df445d99c45e1002e24c80ab721c` | `.bitcode/static-measurement-proof.json` | +| `verification-decisions` | `sha256:608f4210eb9b498b765f65b1d7a8c67edddf9bc3d5ff1fd6a0c7c3aeb7c5859f` | `.bitcode/verification-decisions-proof.json` | +| `selection-and-materialization` | `sha256:9c75d8e790d30a067d1eebbd604bacf8be0ddab8a1b121e9b71f7e4fd1871ec3` | `.bitcode/selection-and-materialization-proof.json` | +| `authorization-and-sensitive-flow` | `sha256:d0a68ad68adbab5b801152274edbd5e7914f9172858603b62f2b16ba47c23c8b` | `.bitcode/authorization-and-sensitive-flow-proof.json` | +| `settlement-source-to-shares` | `sha256:79f9ea2fd8b58ef8177936d2819e6c1d135693c93aec5c3365d5893ef535a83e` | `.bitcode/settlement-source-to-shares-proof.json` | +| `disclosure-boundary` | `sha256:f19ba812efd8d9010544988cbf24396d069b1996f6e96d3414278422ca581d3f` | `.bitcode/disclosure-boundary-proof.json` | +| `proof-contract` | `sha256:94214cf13298a6992d32afa5572d4359fc9c21a74ab86c4625e2b03d3a1a6d6c` | `.bitcode/proof-contract.json` | + +#### Proof Artifact Disclosure Classification + +| path | sensitiveDataClass | disclosable | assetPackEvidenceConfidentiality | potentiallyDisclosable | +| --- | --- | --- | --- | --- | +| `.bitcode/accounting-precision-report.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/asset-pack.lock.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-and-sensitive-flow-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-decisions.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/bounded-public-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/code-analysis-fact-registry.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/disclosure-boundary-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/disclosure-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/identity-authorization-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/identity-bindings.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-moment-contracts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-proofs.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-synthesis-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/journal-completeness-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/journal-diff.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-exclusions.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/materialization-visibility-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/measurement-receipts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/parsed-completion-envelopes.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/projection-policy.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-completeness-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-contracts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-family-registry.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-implementation-surface.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-surfaces.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/proof-contract.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/proof-witness-manifest.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/redaction-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/selected-source-material.json` | `licensed-source-material` | `false` | `licensed-source-material` | `false` | +| `.bitcode/selection-and-materialization-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/selection-consistency-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-participation.json` | `settlement-preview` | `false` | `settlement-preview` | `false` | +| `.bitcode/settlement-preview.json` | `settlement-preview` | `false` | `settlement-preview` | `false` | +| `.bitcode/settlement-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-source-to-shares-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/source-to-shares.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/static-heuristics-registry.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-report.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/system-proof-bundle.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-decisions-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-receipts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-report.json` | `verification-evidence` | `false` | `verification-evidence` | `false` | + +#### Witness Artifact Digest Inventory + +| path | digest | proofFamilies | sensitiveDataClass | disclosable | +| --- | --- | --- | --- | --- | +| `.bitcode/accounting-precision-report.json` | `sha256:880417de4a0cbaa4d2f42bc0b11ab35ae6f10df26bf243dd13eaac365485aacf` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/asset-pack.lock.json` | `sha256:e37a1973ff0ecb2bfff26028905d753286e6ce17c636cc944775ed6628a1bec2` | `selection-and-materialization`, `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-and-sensitive-flow-proof.json` | `sha256:d0a68ad68adbab5b801152274edbd5e7914f9172858603b62f2b16ba47c23c8b` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-decisions.json` | `sha256:1950c57e90d537421100c03161ea871b2eaff1c9ecf686de6f12dbc1ee1e5e29` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/bounded-public-proof.json` | `sha256:f7c3eaa6764f14eeee4e24e7692dfa16936c6051f3fb3f30a3464aad5ddaeca8` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/code-analysis-fact-registry.json` | `sha256:7b1572586cb2bbae134213aff92a138d266e4ca5aa4b8ccfba7fd8d31fe7eff7` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/disclosure-boundary-proof.json` | `sha256:f19ba812efd8d9010544988cbf24396d069b1996f6e96d3414278422ca581d3f` | `disclosure-boundary` | `private-proof-artifact` | `false` | +| `.bitcode/disclosure-proof.json` | `sha256:f7c3eaa6764f14eeee4e24e7692dfa16936c6051f3fb3f30a3464aad5ddaeca8` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/eval-manifest.json` | `sha256:03f1187ca4a208891625d9df395dddfa4d3b777f6faf54027f18c3d254e9dd4c` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/external-boundary-manifest.json` | `sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a` | `bitcoin-settlement-interface` | `private-proof-artifact` | `false` | +| `.bitcode/identity-authorization-proof.json` | `sha256:204f4d39d06860e0b3d61d3ff23546c5d9e82ef0aa2ef829c3f8a612255bdf32` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/identity-bindings.json` | `sha256:8a90b3cdf83cdf0ddd801342dfa9de3fc5036568d4e052f5334c6ca47b3a8175` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/inference-moment-contracts.json` | `sha256:7951f9416b5cc1a695aff3680f06573ce1ac52d185354df683cfdbda5c5a2e51` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/inference-proofs.json` | `sha256:33ff45151baa265773582247cbe9d91529ee60888a2cdfb0de8a859b7e944470` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/inference-synthesis-proof.json` | `sha256:af111ab74d6aa230fc1ae3a12a02592d15e6476d692beb927a2480c2033c8b60` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/journal-completeness-proof.json` | `sha256:a141b4bdf8c4659b8673034b87b34dd0a9db5b92993e2daa53a43a9ef375b402` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/journal-diff.json` | `sha256:b8c45aab1fc6181e6c20e2ce44ce3b56f455214c84d06e723873f1eaa7d37db8` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-exclusions.json` | `sha256:77d34bf29812acc7deb933efef36044d638745e819ca34c195b2a83ca8472b8a` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-proof.json` | `sha256:5c1db48989b73dd62e014886879996570d643fdb279adb9b9e5e3b3c1e207c40` | `selection-and-materialization` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/materialization-visibility-proof.json` | `sha256:176d7d498737532e79fdfa67a5a8cdfb7a8957f9cf5763970fbbd329c90bc9ab` | `selection-and-materialization` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/measurement-receipts.json` | `sha256:17c95fe334d9af77142728c4bf8b16bd6ac399b57dcd9372325dd7702ea18a23` | `static-code-analysis` | `private-proof-artifact` | `false` | +| `.bitcode/parsed-completion-envelopes.json` | `sha256:063a855154f438e9d4b9db49bfa62c06014135b8433e4add2db9d253483e9f3d` | `inference-synthesis`, `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/projection-policy.json` | `sha256:12f98ec39b4b52000dd7c1a8cc86eb1deb8ba614dabdb5591dd02b54b8b4cb48` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-completeness-proof.json` | `sha256:9746305d06e0b55e0d7fe59a9ebddcd8d321d4de6e9c26b067aaa74e4842b018` | `prompt-completeness` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-contracts.json` | `sha256:df0ea68f7f27865bff6d69e5443d7f6599cb4e6bffab89a158e8f70be15087db` | `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-family-registry.json` | `sha256:ab753a9f2a8152aff00bb63282d32a3cd518e38ab37d28372237ea049242cf59` | `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-implementation-surface.json` | `sha256:8eecc81dd8c33aef035eebf6fc194b04434593c743fdb2741a0f04fa116c8b11` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-surfaces.json` | `sha256:30faae37b6da6cd4ab8be205941828d1ec4b5f247557ad7048be4c9924227ae4` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/proof-contract.json` | `sha256:dc2616c0590a0848aab9e9c8ebc8e2a9618e16c7a1f807a93d9f5f6e08a3b219` | `proof-contract` | `private-proof-artifact` | `false` | +| `.bitcode/redaction-proof.json` | `sha256:f7c3eaa6764f14eeee4e24e7692dfa16936c6051f3fb3f30a3464aad5ddaeca8` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/selected-source-material.json` | `sha256:34a0bf4054fa32b67637643a3f479b80e393bc8aece3ab00bd5bdc3cc5af026c` | `selection-and-materialization` | `licensed-source-material` | `false` | +| `.bitcode/selection-and-materialization-proof.json` | `sha256:9c75d8e790d30a067d1eebbd604bacf8be0ddab8a1b121e9b71f7e4fd1871ec3` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/selection-consistency-proof.json` | `sha256:d2bb74466474b95020ef27ac13ab2978c4b4fe1d19cb41146414f38dfca8200b` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow-proof.json` | `sha256:51a841a7255f59929dbd350752437fd41a64b9fd512ffb10dbdf090b0652ab6a` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow.json` | `sha256:50c0606f2eef504fd10408472778299841a0991a72b0e0cbf89ed833f2aa1305` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-participation.json` | `sha256:a5c163e62bec0a1d0942a3cc1e1ee9fa69810e3a443ae937b2148f65b0b957c9` | `settlement-source-to-shares` | `settlement-preview` | `false` | +| `.bitcode/settlement-preview.json` | `sha256:d7ccac088cc1d6f442e6c2643b56b1f3a4116c4ecee5bb0d5b5cd3d813d08f5b` | `settlement-source-to-shares`, `bitcoin-settlement-interface` | `settlement-preview` | `false` | +| `.bitcode/settlement-proof.json` | `sha256:2de06d0d907c63f24a43fa2c28e1e12c5ab2a83003ced5b4db19f49743aa0787` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-source-to-shares-proof.json` | `sha256:79f9ea2fd8b58ef8177936d2819e6c1d135693c93aec5c3365d5893ef535a83e` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/source-to-shares.json` | `sha256:521a6dc55ecc831891cc7751754790b1c9e63a8019266e9955e60f7a4adbece3` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/static-heuristics-registry.json` | `sha256:d00118d0baf321746f503b0ae04b036fe9810c50713f9b1783fd9042bbdf64fc` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-proof.json` | `sha256:dde5e174eddf0911801b1eb8845991d70f97df445d99c45e1002e24c80ab721c` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-report.json` | `sha256:3ddb6480ee510888e48cf1b9d97a62056c2d45daae10325dc890f80a58f14794` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/verification-decisions-proof.json` | `sha256:608f4210eb9b498b765f65b1d7a8c67edddf9bc3d5ff1fd6a0c7c3aeb7c5859f` | `verification-decisions` | `private-proof-artifact` | `false` | +| `.bitcode/verification-receipts.json` | `sha256:6b8086334a4e8e65a529ab9006e331188ef5636c5798d46471bb93be3939756c` | `verification-decisions` | `private-proof-artifact` | `false` | +| `.bitcode/verification-report.json` | `sha256:4b033cad9a2b91d3a2abdecd3429b8281e987d8b151ab08d26a1dfb3202547a0` | `verification-decisions` | `verification-evidence` | `false` | + +### privacy-boundary-proof-export/context + +- branchName: `bitcode/remediation-read_privacy-boundary-proof-export_8163942d95-privacy-boundary-proof-export` +- readId: `read_privacy-boundary-proof-export_8163942d95` +- assetPackId: `asset_pack_c5fef3ab17c5` +- proofContractHash: `sha256:94214cf13298a6992d32afa5572d4359fc9c21a74ab86c4625e2b03d3a1a6d6c` +- allFamiliesPassed: `true` +- proofContractPassed: `true` + +#### Family Proof Hashes + +| proofFamily | proofHash | proofArtifactPath | +| --- | --- | --- | +| `inference-synthesis` | `sha256:af111ab74d6aa230fc1ae3a12a02592d15e6476d692beb927a2480c2033c8b60` | `.bitcode/inference-synthesis-proof.json` | +| `prompt-completeness` | `sha256:9746305d06e0b55e0d7fe59a9ebddcd8d321d4de6e9c26b067aaa74e4842b018` | `.bitcode/prompt-completeness-proof.json` | +| `static-code-analysis` | `sha256:dde5e174eddf0911801b1eb8845991d70f97df445d99c45e1002e24c80ab721c` | `.bitcode/static-measurement-proof.json` | +| `verification-decisions` | `sha256:608f4210eb9b498b765f65b1d7a8c67edddf9bc3d5ff1fd6a0c7c3aeb7c5859f` | `.bitcode/verification-decisions-proof.json` | +| `selection-and-materialization` | `sha256:62345c3c0528519a4ba2ee002df3c4e5a5c37895bfb80dcf9e20b064f6a5d6aa` | `.bitcode/selection-and-materialization-proof.json` | +| `authorization-and-sensitive-flow` | `sha256:d0a68ad68adbab5b801152274edbd5e7914f9172858603b62f2b16ba47c23c8b` | `.bitcode/authorization-and-sensitive-flow-proof.json` | +| `settlement-source-to-shares` | `sha256:7a5f4ed6447e7eb2a4bd65dba164f8a090ab31d9fe741a8bb78ad68fea244d5a` | `.bitcode/settlement-source-to-shares-proof.json` | +| `disclosure-boundary` | `sha256:25b1de6de0319574567b9345d304adc2bbf7626fd606391213062744b1690f8f` | `.bitcode/disclosure-boundary-proof.json` | +| `proof-contract` | `sha256:94214cf13298a6992d32afa5572d4359fc9c21a74ab86c4625e2b03d3a1a6d6c` | `.bitcode/proof-contract.json` | + +#### Proof Artifact Disclosure Classification + +| path | sensitiveDataClass | disclosable | assetPackEvidenceConfidentiality | potentiallyDisclosable | +| --- | --- | --- | --- | --- | +| `.bitcode/accounting-precision-report.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/asset-pack.lock.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-and-sensitive-flow-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-decisions.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/bounded-public-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/code-analysis-fact-registry.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/disclosure-boundary-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/disclosure-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/identity-authorization-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/identity-bindings.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-moment-contracts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-proofs.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-synthesis-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/journal-completeness-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/journal-diff.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-exclusions.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/materialization-visibility-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/measurement-receipts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/parsed-completion-envelopes.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/projection-policy.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-completeness-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-contracts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-family-registry.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-implementation-surface.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-surfaces.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/proof-contract.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/proof-witness-manifest.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/redaction-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/selected-source-material.json` | `licensed-source-material` | `false` | `licensed-source-material` | `false` | +| `.bitcode/selection-and-materialization-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/selection-consistency-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-participation.json` | `settlement-preview` | `false` | `settlement-preview` | `false` | +| `.bitcode/settlement-preview.json` | `settlement-preview` | `false` | `settlement-preview` | `false` | +| `.bitcode/settlement-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-source-to-shares-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/source-to-shares.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/static-heuristics-registry.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-report.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/system-proof-bundle.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-decisions-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-receipts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-report.json` | `verification-evidence` | `false` | `verification-evidence` | `false` | + +#### Witness Artifact Digest Inventory + +| path | digest | proofFamilies | sensitiveDataClass | disclosable | +| --- | --- | --- | --- | --- | +| `.bitcode/accounting-precision-report.json` | `sha256:04ba8c7c86a5d011ed124447ba82e47b05c3eedc12dfcc68371b1da4158857b9` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/asset-pack.lock.json` | `sha256:8b16f037f1078be1cef6650dac42752e414afc52f680fa3e5fd0ebd603cbc054` | `selection-and-materialization`, `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-and-sensitive-flow-proof.json` | `sha256:d0a68ad68adbab5b801152274edbd5e7914f9172858603b62f2b16ba47c23c8b` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-decisions.json` | `sha256:1950c57e90d537421100c03161ea871b2eaff1c9ecf686de6f12dbc1ee1e5e29` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/bounded-public-proof.json` | `sha256:49f8db175b8e0b080dbf8b99c35eab571742c0cd9047e213bfc29195d006ed34` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/code-analysis-fact-registry.json` | `sha256:7b1572586cb2bbae134213aff92a138d266e4ca5aa4b8ccfba7fd8d31fe7eff7` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/disclosure-boundary-proof.json` | `sha256:25b1de6de0319574567b9345d304adc2bbf7626fd606391213062744b1690f8f` | `disclosure-boundary` | `private-proof-artifact` | `false` | +| `.bitcode/disclosure-proof.json` | `sha256:49f8db175b8e0b080dbf8b99c35eab571742c0cd9047e213bfc29195d006ed34` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/eval-manifest.json` | `sha256:03f1187ca4a208891625d9df395dddfa4d3b777f6faf54027f18c3d254e9dd4c` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/external-boundary-manifest.json` | `sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a` | `bitcoin-settlement-interface` | `private-proof-artifact` | `false` | +| `.bitcode/identity-authorization-proof.json` | `sha256:204f4d39d06860e0b3d61d3ff23546c5d9e82ef0aa2ef829c3f8a612255bdf32` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/identity-bindings.json` | `sha256:8a90b3cdf83cdf0ddd801342dfa9de3fc5036568d4e052f5334c6ca47b3a8175` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/inference-moment-contracts.json` | `sha256:7951f9416b5cc1a695aff3680f06573ce1ac52d185354df683cfdbda5c5a2e51` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/inference-proofs.json` | `sha256:33ff45151baa265773582247cbe9d91529ee60888a2cdfb0de8a859b7e944470` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/inference-synthesis-proof.json` | `sha256:af111ab74d6aa230fc1ae3a12a02592d15e6476d692beb927a2480c2033c8b60` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/journal-completeness-proof.json` | `sha256:87776778ee2357eb269dfb6ee9978c21d4dd2d70d9c7f874b37de502e8100970` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/journal-diff.json` | `sha256:91b709761e65f51447f25399a5a419b27d351c985fbd05569d3d6ce1272e4015` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-exclusions.json` | `sha256:b5d167c7f2d2b4b7a024fced17a93f00ef6de0764b7ac76c09fe5cf365b8dab5` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-proof.json` | `sha256:c17f205b4e3b9a75e4bb141648d46f69b5a7ef60c06916aa26509d69a73abd87` | `selection-and-materialization` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/materialization-visibility-proof.json` | `sha256:176d7d498737532e79fdfa67a5a8cdfb7a8957f9cf5763970fbbd329c90bc9ab` | `selection-and-materialization` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/measurement-receipts.json` | `sha256:17c95fe334d9af77142728c4bf8b16bd6ac399b57dcd9372325dd7702ea18a23` | `static-code-analysis` | `private-proof-artifact` | `false` | +| `.bitcode/parsed-completion-envelopes.json` | `sha256:063a855154f438e9d4b9db49bfa62c06014135b8433e4add2db9d253483e9f3d` | `inference-synthesis`, `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/projection-policy.json` | `sha256:12f98ec39b4b52000dd7c1a8cc86eb1deb8ba614dabdb5591dd02b54b8b4cb48` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-completeness-proof.json` | `sha256:9746305d06e0b55e0d7fe59a9ebddcd8d321d4de6e9c26b067aaa74e4842b018` | `prompt-completeness` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-contracts.json` | `sha256:df0ea68f7f27865bff6d69e5443d7f6599cb4e6bffab89a158e8f70be15087db` | `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-family-registry.json` | `sha256:ab753a9f2a8152aff00bb63282d32a3cd518e38ab37d28372237ea049242cf59` | `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-implementation-surface.json` | `sha256:8eecc81dd8c33aef035eebf6fc194b04434593c743fdb2741a0f04fa116c8b11` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-surfaces.json` | `sha256:30faae37b6da6cd4ab8be205941828d1ec4b5f247557ad7048be4c9924227ae4` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/proof-contract.json` | `sha256:dc2616c0590a0848aab9e9c8ebc8e2a9618e16c7a1f807a93d9f5f6e08a3b219` | `proof-contract` | `private-proof-artifact` | `false` | +| `.bitcode/redaction-proof.json` | `sha256:49f8db175b8e0b080dbf8b99c35eab571742c0cd9047e213bfc29195d006ed34` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/selected-source-material.json` | `sha256:fc0ecbd01376203a64dfdca51241ccab04bceee2b9577295637193cc9525537a` | `selection-and-materialization` | `licensed-source-material` | `false` | +| `.bitcode/selection-and-materialization-proof.json` | `sha256:62345c3c0528519a4ba2ee002df3c4e5a5c37895bfb80dcf9e20b064f6a5d6aa` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/selection-consistency-proof.json` | `sha256:d2bb74466474b95020ef27ac13ab2978c4b4fe1d19cb41146414f38dfca8200b` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow-proof.json` | `sha256:51a841a7255f59929dbd350752437fd41a64b9fd512ffb10dbdf090b0652ab6a` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow.json` | `sha256:50c0606f2eef504fd10408472778299841a0991a72b0e0cbf89ed833f2aa1305` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-participation.json` | `sha256:6a812e4e668d8ef1fc28ad2f8d8ee77da8bafdd71c54845f8d702891f283bc40` | `settlement-source-to-shares` | `settlement-preview` | `false` | +| `.bitcode/settlement-preview.json` | `sha256:926c1aab017318fa8511f4790233f5658cf37dfa6455266d42aac2bb2867205e` | `settlement-source-to-shares`, `bitcoin-settlement-interface` | `settlement-preview` | `false` | +| `.bitcode/settlement-proof.json` | `sha256:712dae63457f735eb11c24d036d7a93c3e8c93ec20a7e0d686ec4391979889d3` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-source-to-shares-proof.json` | `sha256:7a5f4ed6447e7eb2a4bd65dba164f8a090ab31d9fe741a8bb78ad68fea244d5a` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/source-to-shares.json` | `sha256:521a6dc55ecc831891cc7751754790b1c9e63a8019266e9955e60f7a4adbece3` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/static-heuristics-registry.json` | `sha256:d00118d0baf321746f503b0ae04b036fe9810c50713f9b1783fd9042bbdf64fc` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-proof.json` | `sha256:dde5e174eddf0911801b1eb8845991d70f97df445d99c45e1002e24c80ab721c` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-report.json` | `sha256:3ddb6480ee510888e48cf1b9d97a62056c2d45daae10325dc890f80a58f14794` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/verification-decisions-proof.json` | `sha256:608f4210eb9b498b765f65b1d7a8c67edddf9bc3d5ff1fd6a0c7c3aeb7c5859f` | `verification-decisions` | `private-proof-artifact` | `false` | +| `.bitcode/verification-receipts.json` | `sha256:6b8086334a4e8e65a529ab9006e331188ef5636c5798d46471bb93be3939756c` | `verification-decisions` | `private-proof-artifact` | `false` | +| `.bitcode/verification-report.json` | `sha256:635ad895a89de6d0143ea73bb6d6d02e2e1b0297be84e48cbe64ca237d4b065a` | `verification-decisions` | `verification-evidence` | `false` | + +### polyglot-gateway-benchmark-remediation/patch + +- branchName: `bitcode/remediation-read_polyglot-gateway-benchmark-remediation_ca6f233369-polyglot-gateway-benchmark-remediation` +- readId: `read_polyglot-gateway-benchmark-remediation_ca6f233369` +- assetPackId: `asset_pack_654da1e46737` +- proofContractHash: `sha256:22639f352c74be4b4f1c33522cbea29687fbe5455521c9aed0d64103a90f5426` +- allFamiliesPassed: `true` +- proofContractPassed: `true` + +#### Family Proof Hashes + +| proofFamily | proofHash | proofArtifactPath | +| --- | --- | --- | +| `inference-synthesis` | `sha256:8ab3e39c78bd87bf4c686eb3b3a3cfa9ace4af2b6a0665a2726e455b86c3b5b2` | `.bitcode/inference-synthesis-proof.json` | +| `prompt-completeness` | `sha256:9746305d06e0b55e0d7fe59a9ebddcd8d321d4de6e9c26b067aaa74e4842b018` | `.bitcode/prompt-completeness-proof.json` | +| `static-code-analysis` | `sha256:0a196b14d27f8f17eb9952cf2c568764983f22d2efb6411f42d9e4cb227fda48` | `.bitcode/static-measurement-proof.json` | +| `verification-decisions` | `sha256:608f4210eb9b498b765f65b1d7a8c67edddf9bc3d5ff1fd6a0c7c3aeb7c5859f` | `.bitcode/verification-decisions-proof.json` | +| `selection-and-materialization` | `sha256:c08c6baf9c335ea6d9f771efde006ff8577953196a2bab6b9acace0521350189` | `.bitcode/selection-and-materialization-proof.json` | +| `authorization-and-sensitive-flow` | `sha256:8c6a898ee8e19a41a8f8399f98c61b80362ac20513ecd53dae26950fcae6e772` | `.bitcode/authorization-and-sensitive-flow-proof.json` | +| `settlement-source-to-shares` | `sha256:4d5c56e3b4786a2e26d5631d1137183e88802278f9c443ecb198819c8e8dbc08` | `.bitcode/settlement-source-to-shares-proof.json` | +| `disclosure-boundary` | `sha256:46424cedd179cc2e3248e7a9360316513092e0223703b917fdbaae180a9badb0` | `.bitcode/disclosure-boundary-proof.json` | +| `proof-contract` | `sha256:22639f352c74be4b4f1c33522cbea29687fbe5455521c9aed0d64103a90f5426` | `.bitcode/proof-contract.json` | + +#### Proof Artifact Disclosure Classification + +| path | sensitiveDataClass | disclosable | assetPackEvidenceConfidentiality | potentiallyDisclosable | +| --- | --- | --- | --- | --- | +| `.bitcode/accounting-precision-report.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/asset-pack.lock.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-and-sensitive-flow-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-decisions.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/bounded-public-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/code-analysis-fact-registry.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/disclosure-boundary-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/disclosure-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/identity-authorization-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/identity-bindings.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-moment-contracts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-proofs.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-synthesis-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/journal-completeness-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/journal-diff.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-exclusions.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/materialization-visibility-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/measurement-receipts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/parsed-completion-envelopes.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/projection-policy.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-completeness-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-contracts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-family-registry.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-implementation-surface.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-surfaces.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/proof-contract.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/proof-witness-manifest.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/redaction-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/selected-source-material.json` | `licensed-source-material` | `false` | `licensed-source-material` | `false` | +| `.bitcode/selection-and-materialization-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/selection-consistency-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-participation.json` | `settlement-preview` | `false` | `settlement-preview` | `false` | +| `.bitcode/settlement-preview.json` | `settlement-preview` | `false` | `settlement-preview` | `false` | +| `.bitcode/settlement-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-source-to-shares-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/source-to-shares.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/static-heuristics-registry.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-report.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/system-proof-bundle.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-decisions-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-receipts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-report.json` | `verification-evidence` | `false` | `verification-evidence` | `false` | + +#### Witness Artifact Digest Inventory + +| path | digest | proofFamilies | sensitiveDataClass | disclosable | +| --- | --- | --- | --- | --- | +| `.bitcode/accounting-precision-report.json` | `sha256:8d90f117e89ca5fd018f3ceb01de869a40618cc0676cbe6b7f7b8b60f514bb66` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/asset-pack.lock.json` | `sha256:6870d6756abb2632fa4d124c1d23d46c54fd59f1f06b9a0c9bf92d9d2ad7d794` | `selection-and-materialization`, `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-and-sensitive-flow-proof.json` | `sha256:8c6a898ee8e19a41a8f8399f98c61b80362ac20513ecd53dae26950fcae6e772` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-decisions.json` | `sha256:ebcd69e8f9966ed31ab1828cc97538ee1c6c5988343cdcd13e8af108f4731f00` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/bounded-public-proof.json` | `sha256:15f24a288cbf0de131137d9d96db7322a1e08fbd1a97bb987d5b63e8589693eb` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/code-analysis-fact-registry.json` | `sha256:ff42d1ddc734448891c792f25f30403b9034b0ffa724f1034087591fd47a7ce5` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/disclosure-boundary-proof.json` | `sha256:46424cedd179cc2e3248e7a9360316513092e0223703b917fdbaae180a9badb0` | `disclosure-boundary` | `private-proof-artifact` | `false` | +| `.bitcode/disclosure-proof.json` | `sha256:15f24a288cbf0de131137d9d96db7322a1e08fbd1a97bb987d5b63e8589693eb` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/eval-manifest.json` | `sha256:48bfae0465523a00316782e22cc4044f9a4a2446d47fb77b8b56da6718f44ddb` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/external-boundary-manifest.json` | `sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a` | `bitcoin-settlement-interface` | `private-proof-artifact` | `false` | +| `.bitcode/identity-authorization-proof.json` | `sha256:9e17674ef60968c65af2f5e1c75a4d708ef2c603bfb0773362a384feabf93efb` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/identity-bindings.json` | `sha256:f9bb5020368bc879a8463c16f39d410417d782cbad6414fe385e98e19e0a1377` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/inference-moment-contracts.json` | `sha256:9a947a33796d73ef1411053e0bce2b3bf269565e2d203ab6367dc6d1dacfe307` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/inference-proofs.json` | `sha256:a334f0e7a5667f10b9c70831920b1ea755383f680661768745ee7403026d3520` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/inference-synthesis-proof.json` | `sha256:8ab3e39c78bd87bf4c686eb3b3a3cfa9ace4af2b6a0665a2726e455b86c3b5b2` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/journal-completeness-proof.json` | `sha256:58c42eb9f8ba892bb071b8ad41905cf51ba215330e3659ca7039ac6583929d2b` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/journal-diff.json` | `sha256:1ee5dee8a724aade1fb69c47806cf2ebc8d2aa159340a5002e98068c9e493191` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-exclusions.json` | `sha256:7840b9fec52f2ca8b3320cf239fe7388ee444621133bb04b0c855bfb68214bda` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-proof.json` | `sha256:9f2b9eafe157c6224500eaa4935f6b063f46aee795639246df58765d3875bb42` | `selection-and-materialization` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/materialization-visibility-proof.json` | `sha256:dbb3ac97b571dbc90d9cd8482bf9535a14608b8bfcf2cd196b9facd52ba5453d` | `selection-and-materialization` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/measurement-receipts.json` | `sha256:86fe9486c43f5878a655acd61ec83330ff8197114de70be6b5dfe3e7dff7a918` | `static-code-analysis` | `private-proof-artifact` | `false` | +| `.bitcode/parsed-completion-envelopes.json` | `sha256:bba36f476eee16207d7ebdd896e4ba21836dcbda21ca4b2b0d68e8d38b7de713` | `inference-synthesis`, `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/projection-policy.json` | `sha256:12f98ec39b4b52000dd7c1a8cc86eb1deb8ba614dabdb5591dd02b54b8b4cb48` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-completeness-proof.json` | `sha256:9746305d06e0b55e0d7fe59a9ebddcd8d321d4de6e9c26b067aaa74e4842b018` | `prompt-completeness` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-contracts.json` | `sha256:620e667076d4e955a26712e5aa2af0e52005f6f52829183d4e45467166a92d39` | `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-family-registry.json` | `sha256:ab753a9f2a8152aff00bb63282d32a3cd518e38ab37d28372237ea049242cf59` | `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-implementation-surface.json` | `sha256:c921d4fc1c2722ebaaa7dee8dd7b44c6db3a8dfc739ab7cf3ffafbe1e5a97d0e` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-surfaces.json` | `sha256:7699508f4e5564064848f7abcf4b2efbdb1a52e400a742d4017e6b28aa57047c` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/proof-contract.json` | `sha256:a6d6f5e1bd226a087aae8bd89116b417f2b2b49f93abbf1f70477b20b3114e26` | `proof-contract` | `private-proof-artifact` | `false` | +| `.bitcode/redaction-proof.json` | `sha256:15f24a288cbf0de131137d9d96db7322a1e08fbd1a97bb987d5b63e8589693eb` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/selected-source-material.json` | `sha256:79f3761e05a1511827f8929493f3eb32dce2e1497c6a1a19b31475173631bc7c` | `selection-and-materialization` | `licensed-source-material` | `false` | +| `.bitcode/selection-and-materialization-proof.json` | `sha256:c08c6baf9c335ea6d9f771efde006ff8577953196a2bab6b9acace0521350189` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/selection-consistency-proof.json` | `sha256:c1e577b132475f4b327b593f0ec0052f8bb6668c7efad0693bfdc79debd96f2c` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow-proof.json` | `sha256:7cd7e52ebfbe66f7b7fedc9100e7803f6823a28488837f408ce98b076987d75b` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow.json` | `sha256:4f29ea781a9be8daf5cf0f8592a05742897813fecfef00a1c8f8972d94885fae` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-participation.json` | `sha256:16d764b15028c1c70d2b1b023f0007ae9082c9673a8f2d606a58b2d5c9cf313e` | `settlement-source-to-shares` | `settlement-preview` | `false` | +| `.bitcode/settlement-preview.json` | `sha256:bb7194024cad19cc03abf7ef89fe672a990be8dd6a25b8e34ce3fc8830958a7e` | `settlement-source-to-shares`, `bitcoin-settlement-interface` | `settlement-preview` | `false` | +| `.bitcode/settlement-proof.json` | `sha256:623ae942a593bb129e3c864ca3d1a4975290493197f6c86cc86d69c80a45fb0e` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-source-to-shares-proof.json` | `sha256:4d5c56e3b4786a2e26d5631d1137183e88802278f9c443ecb198819c8e8dbc08` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/source-to-shares.json` | `sha256:70876006dc0c82da94e83a2b5faaff421960021e01454778c6c8dbbfb7d0c510` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/static-heuristics-registry.json` | `sha256:b67436b913840cd4c7031841ef5dbf83ac9f6cf3a4726c3b065eecdf3dd8d3aa` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-proof.json` | `sha256:0a196b14d27f8f17eb9952cf2c568764983f22d2efb6411f42d9e4cb227fda48` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-report.json` | `sha256:6a5638b93a2bea9e4945c0be2501e582dcf4cd1b992b178c5e0fb3a8a2d8dd35` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/verification-decisions-proof.json` | `sha256:608f4210eb9b498b765f65b1d7a8c67edddf9bc3d5ff1fd6a0c7c3aeb7c5859f` | `verification-decisions` | `private-proof-artifact` | `false` | +| `.bitcode/verification-receipts.json` | `sha256:7d4c9a10309d2e2394f12d4f5663748630b9fd84e068502da2c4e7eb34205154` | `verification-decisions` | `private-proof-artifact` | `false` | +| `.bitcode/verification-report.json` | `sha256:b16626bce72e7545e05b1259d7d4777e0f62dd9c1edf7cf59b5f6e682e7eb214` | `verification-decisions` | `verification-evidence` | `false` | + +### polyglot-gateway-benchmark-remediation/context + +- branchName: `bitcode/remediation-read_polyglot-gateway-benchmark-remediation_ca6f233369-polyglot-gateway-benchmark-remediation` +- readId: `read_polyglot-gateway-benchmark-remediation_ca6f233369` +- assetPackId: `asset_pack_654da1e46737` +- proofContractHash: `sha256:22639f352c74be4b4f1c33522cbea29687fbe5455521c9aed0d64103a90f5426` +- allFamiliesPassed: `true` +- proofContractPassed: `true` + +#### Family Proof Hashes + +| proofFamily | proofHash | proofArtifactPath | +| --- | --- | --- | +| `inference-synthesis` | `sha256:8ab3e39c78bd87bf4c686eb3b3a3cfa9ace4af2b6a0665a2726e455b86c3b5b2` | `.bitcode/inference-synthesis-proof.json` | +| `prompt-completeness` | `sha256:9746305d06e0b55e0d7fe59a9ebddcd8d321d4de6e9c26b067aaa74e4842b018` | `.bitcode/prompt-completeness-proof.json` | +| `static-code-analysis` | `sha256:0a196b14d27f8f17eb9952cf2c568764983f22d2efb6411f42d9e4cb227fda48` | `.bitcode/static-measurement-proof.json` | +| `verification-decisions` | `sha256:608f4210eb9b498b765f65b1d7a8c67edddf9bc3d5ff1fd6a0c7c3aeb7c5859f` | `.bitcode/verification-decisions-proof.json` | +| `selection-and-materialization` | `sha256:64713d43c3cf4ffe06599dd9a3571e5ba55636fd3a2fca591dc507c476edf424` | `.bitcode/selection-and-materialization-proof.json` | +| `authorization-and-sensitive-flow` | `sha256:8c6a898ee8e19a41a8f8399f98c61b80362ac20513ecd53dae26950fcae6e772` | `.bitcode/authorization-and-sensitive-flow-proof.json` | +| `settlement-source-to-shares` | `sha256:5947d74600886a598b53dd562efda22bfa373be7ce1a46fe0e0d0613660014bf` | `.bitcode/settlement-source-to-shares-proof.json` | +| `disclosure-boundary` | `sha256:e47ecbea6d5fe25f3bcb908905403927e553c9c4c01063b58a2a4cf7b5e154ac` | `.bitcode/disclosure-boundary-proof.json` | +| `proof-contract` | `sha256:22639f352c74be4b4f1c33522cbea29687fbe5455521c9aed0d64103a90f5426` | `.bitcode/proof-contract.json` | + +#### Proof Artifact Disclosure Classification + +| path | sensitiveDataClass | disclosable | assetPackEvidenceConfidentiality | potentiallyDisclosable | +| --- | --- | --- | --- | --- | +| `.bitcode/accounting-precision-report.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/asset-pack.lock.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-and-sensitive-flow-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-decisions.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/bounded-public-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/code-analysis-fact-registry.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/disclosure-boundary-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/disclosure-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/identity-authorization-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/identity-bindings.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-moment-contracts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-proofs.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-synthesis-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/journal-completeness-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/journal-diff.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-exclusions.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/materialization-visibility-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/measurement-receipts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/parsed-completion-envelopes.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/projection-policy.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-completeness-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-contracts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-family-registry.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-implementation-surface.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-surfaces.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/proof-contract.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/proof-witness-manifest.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/redaction-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/selected-source-material.json` | `licensed-source-material` | `false` | `licensed-source-material` | `false` | +| `.bitcode/selection-and-materialization-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/selection-consistency-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-participation.json` | `settlement-preview` | `false` | `settlement-preview` | `false` | +| `.bitcode/settlement-preview.json` | `settlement-preview` | `false` | `settlement-preview` | `false` | +| `.bitcode/settlement-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-source-to-shares-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/source-to-shares.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/static-heuristics-registry.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-report.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/system-proof-bundle.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-decisions-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-receipts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-report.json` | `verification-evidence` | `false` | `verification-evidence` | `false` | + +#### Witness Artifact Digest Inventory + +| path | digest | proofFamilies | sensitiveDataClass | disclosable | +| --- | --- | --- | --- | --- | +| `.bitcode/accounting-precision-report.json` | `sha256:a3cbf9297ffd5abaf253fc9ab4f7ebcb5f7d21f0ae8077d66292de6c59773528` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/asset-pack.lock.json` | `sha256:e3118a3a34b3348834b504893014d99748974a6498b9bb6a3ef439f294aa7e9b` | `selection-and-materialization`, `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-and-sensitive-flow-proof.json` | `sha256:8c6a898ee8e19a41a8f8399f98c61b80362ac20513ecd53dae26950fcae6e772` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-decisions.json` | `sha256:ebcd69e8f9966ed31ab1828cc97538ee1c6c5988343cdcd13e8af108f4731f00` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/bounded-public-proof.json` | `sha256:f96900f0e7fee9f34ff255f1bd686f4d0332e055bb170604c4da7eaf9ff45130` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/code-analysis-fact-registry.json` | `sha256:ff42d1ddc734448891c792f25f30403b9034b0ffa724f1034087591fd47a7ce5` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/disclosure-boundary-proof.json` | `sha256:e47ecbea6d5fe25f3bcb908905403927e553c9c4c01063b58a2a4cf7b5e154ac` | `disclosure-boundary` | `private-proof-artifact` | `false` | +| `.bitcode/disclosure-proof.json` | `sha256:f96900f0e7fee9f34ff255f1bd686f4d0332e055bb170604c4da7eaf9ff45130` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/eval-manifest.json` | `sha256:48bfae0465523a00316782e22cc4044f9a4a2446d47fb77b8b56da6718f44ddb` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/external-boundary-manifest.json` | `sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a` | `bitcoin-settlement-interface` | `private-proof-artifact` | `false` | +| `.bitcode/identity-authorization-proof.json` | `sha256:9e17674ef60968c65af2f5e1c75a4d708ef2c603bfb0773362a384feabf93efb` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/identity-bindings.json` | `sha256:f9bb5020368bc879a8463c16f39d410417d782cbad6414fe385e98e19e0a1377` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/inference-moment-contracts.json` | `sha256:9a947a33796d73ef1411053e0bce2b3bf269565e2d203ab6367dc6d1dacfe307` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/inference-proofs.json` | `sha256:a334f0e7a5667f10b9c70831920b1ea755383f680661768745ee7403026d3520` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/inference-synthesis-proof.json` | `sha256:8ab3e39c78bd87bf4c686eb3b3a3cfa9ace4af2b6a0665a2726e455b86c3b5b2` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/journal-completeness-proof.json` | `sha256:85b9e0e294968560055014dcd2a989cad5b13bc80500d77d874aa7be4c5ac558` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/journal-diff.json` | `sha256:9f9acd2e42dd074bee49110bc22c450d0324e5ccb0183e3a2fcbf7cd18f6a6c7` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-exclusions.json` | `sha256:7099e3048552085f0e49254ef7289bc9779aed170bdd285f0a741dada43b9da7` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-proof.json` | `sha256:e94250d47636bfd2849803b0e765656b23dfe35be771fdee5aa556f131f76c35` | `selection-and-materialization` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/materialization-visibility-proof.json` | `sha256:dbb3ac97b571dbc90d9cd8482bf9535a14608b8bfcf2cd196b9facd52ba5453d` | `selection-and-materialization` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/measurement-receipts.json` | `sha256:86fe9486c43f5878a655acd61ec83330ff8197114de70be6b5dfe3e7dff7a918` | `static-code-analysis` | `private-proof-artifact` | `false` | +| `.bitcode/parsed-completion-envelopes.json` | `sha256:bba36f476eee16207d7ebdd896e4ba21836dcbda21ca4b2b0d68e8d38b7de713` | `inference-synthesis`, `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/projection-policy.json` | `sha256:12f98ec39b4b52000dd7c1a8cc86eb1deb8ba614dabdb5591dd02b54b8b4cb48` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-completeness-proof.json` | `sha256:9746305d06e0b55e0d7fe59a9ebddcd8d321d4de6e9c26b067aaa74e4842b018` | `prompt-completeness` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-contracts.json` | `sha256:620e667076d4e955a26712e5aa2af0e52005f6f52829183d4e45467166a92d39` | `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-family-registry.json` | `sha256:ab753a9f2a8152aff00bb63282d32a3cd518e38ab37d28372237ea049242cf59` | `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-implementation-surface.json` | `sha256:c921d4fc1c2722ebaaa7dee8dd7b44c6db3a8dfc739ab7cf3ffafbe1e5a97d0e` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-surfaces.json` | `sha256:7699508f4e5564064848f7abcf4b2efbdb1a52e400a742d4017e6b28aa57047c` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/proof-contract.json` | `sha256:a6d6f5e1bd226a087aae8bd89116b417f2b2b49f93abbf1f70477b20b3114e26` | `proof-contract` | `private-proof-artifact` | `false` | +| `.bitcode/redaction-proof.json` | `sha256:f96900f0e7fee9f34ff255f1bd686f4d0332e055bb170604c4da7eaf9ff45130` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/selected-source-material.json` | `sha256:18b721ef22d8b28c8016d53dd7a5c1eeeaccb31defb64bb52d116c98c7900d7f` | `selection-and-materialization` | `licensed-source-material` | `false` | +| `.bitcode/selection-and-materialization-proof.json` | `sha256:64713d43c3cf4ffe06599dd9a3571e5ba55636fd3a2fca591dc507c476edf424` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/selection-consistency-proof.json` | `sha256:c1e577b132475f4b327b593f0ec0052f8bb6668c7efad0693bfdc79debd96f2c` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow-proof.json` | `sha256:7cd7e52ebfbe66f7b7fedc9100e7803f6823a28488837f408ce98b076987d75b` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow.json` | `sha256:4f29ea781a9be8daf5cf0f8592a05742897813fecfef00a1c8f8972d94885fae` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-participation.json` | `sha256:8be23f5f1875a101ba6de6aa6ef5beaf82b2d5b88eb2ef06f2a6dff714a3e6bf` | `settlement-source-to-shares` | `settlement-preview` | `false` | +| `.bitcode/settlement-preview.json` | `sha256:0dfd94e5a9e486386b9fb81e4973951b070993b66a3cdd7a2b8631899a569454` | `settlement-source-to-shares`, `bitcoin-settlement-interface` | `settlement-preview` | `false` | +| `.bitcode/settlement-proof.json` | `sha256:638d67a9b5409f737dc0070b57ea7070006e49afbc17020f515f5093ae37b27e` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-source-to-shares-proof.json` | `sha256:5947d74600886a598b53dd562efda22bfa373be7ce1a46fe0e0d0613660014bf` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/source-to-shares.json` | `sha256:70876006dc0c82da94e83a2b5faaff421960021e01454778c6c8dbbfb7d0c510` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/static-heuristics-registry.json` | `sha256:b67436b913840cd4c7031841ef5dbf83ac9f6cf3a4726c3b065eecdf3dd8d3aa` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-proof.json` | `sha256:0a196b14d27f8f17eb9952cf2c568764983f22d2efb6411f42d9e4cb227fda48` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-report.json` | `sha256:6a5638b93a2bea9e4945c0be2501e582dcf4cd1b992b178c5e0fb3a8a2d8dd35` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/verification-decisions-proof.json` | `sha256:608f4210eb9b498b765f65b1d7a8c67edddf9bc3d5ff1fd6a0c7c3aeb7c5859f` | `verification-decisions` | `private-proof-artifact` | `false` | +| `.bitcode/verification-receipts.json` | `sha256:7d4c9a10309d2e2394f12d4f5663748630b9fd84e068502da2c4e7eb34205154` | `verification-decisions` | `private-proof-artifact` | `false` | +| `.bitcode/verification-report.json` | `sha256:6b6e79a5d82a31550c8212fd6bf6588b93a3c7827afe5b0ed95bb1b9c22fcac0` | `verification-decisions` | `verification-evidence` | `false` | + +### auth-many-asset-normalization/patch + +- branchName: `bitcode/remediation-read_auth-many-asset-normalization_f6dbfe951c-auth-many-asset-normalization` +- readId: `read_auth-many-asset-normalization_f6dbfe951c` +- assetPackId: `asset_pack_186c76eb7d2d` +- proofContractHash: `sha256:07e9dde9b1decdd69ab9f3287b1158f89b3d3badb085d8f55489f6339b296f43` +- allFamiliesPassed: `true` +- proofContractPassed: `true` + +#### Family Proof Hashes + +| proofFamily | proofHash | proofArtifactPath | +| --- | --- | --- | +| `inference-synthesis` | `sha256:7021f326f42f8a44233fe094d79ada504e346a9f58b95f63ae28b60780d5d7a5` | `.bitcode/inference-synthesis-proof.json` | +| `prompt-completeness` | `sha256:9746305d06e0b55e0d7fe59a9ebddcd8d321d4de6e9c26b067aaa74e4842b018` | `.bitcode/prompt-completeness-proof.json` | +| `static-code-analysis` | `sha256:43d0c993cc81696809f32616c596372a95d41980c77a4477c880fe68f8463739` | `.bitcode/static-measurement-proof.json` | +| `verification-decisions` | `sha256:608f4210eb9b498b765f65b1d7a8c67edddf9bc3d5ff1fd6a0c7c3aeb7c5859f` | `.bitcode/verification-decisions-proof.json` | +| `selection-and-materialization` | `sha256:93443b0becdeebae98f5e288352518435faff73ab467b341fad0bd038eceefbc` | `.bitcode/selection-and-materialization-proof.json` | +| `authorization-and-sensitive-flow` | `sha256:9958392c28c4be80006c2bb33b353601ac820b5b635544a0ecdfb672629535e1` | `.bitcode/authorization-and-sensitive-flow-proof.json` | +| `settlement-source-to-shares` | `sha256:15beb995e962657b3fb02214f4afe13fbe89a111bfbfab3e1cb9715712838c6a` | `.bitcode/settlement-source-to-shares-proof.json` | +| `disclosure-boundary` | `sha256:93a6ae4d4886dea6ad89f294965b4980be1e971839a80510bf75c669a86f207e` | `.bitcode/disclosure-boundary-proof.json` | +| `proof-contract` | `sha256:07e9dde9b1decdd69ab9f3287b1158f89b3d3badb085d8f55489f6339b296f43` | `.bitcode/proof-contract.json` | + +#### Proof Artifact Disclosure Classification + +| path | sensitiveDataClass | disclosable | assetPackEvidenceConfidentiality | potentiallyDisclosable | +| --- | --- | --- | --- | --- | +| `.bitcode/accounting-precision-report.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/asset-pack.lock.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-and-sensitive-flow-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-decisions.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/bounded-public-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/code-analysis-fact-registry.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/disclosure-boundary-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/disclosure-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/identity-authorization-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/identity-bindings.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-moment-contracts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-proofs.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-synthesis-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/journal-completeness-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/journal-diff.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-exclusions.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/materialization-visibility-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/measurement-receipts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/parsed-completion-envelopes.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/projection-policy.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-completeness-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-contracts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-family-registry.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-implementation-surface.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-surfaces.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/proof-contract.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/proof-witness-manifest.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/redaction-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/selected-source-material.json` | `licensed-source-material` | `false` | `licensed-source-material` | `false` | +| `.bitcode/selection-and-materialization-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/selection-consistency-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-participation.json` | `settlement-preview` | `false` | `settlement-preview` | `false` | +| `.bitcode/settlement-preview.json` | `settlement-preview` | `false` | `settlement-preview` | `false` | +| `.bitcode/settlement-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-source-to-shares-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/source-to-shares.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/static-heuristics-registry.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-report.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/system-proof-bundle.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-decisions-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-receipts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-report.json` | `verification-evidence` | `false` | `verification-evidence` | `false` | + +#### Witness Artifact Digest Inventory + +| path | digest | proofFamilies | sensitiveDataClass | disclosable | +| --- | --- | --- | --- | --- | +| `.bitcode/accounting-precision-report.json` | `sha256:c487b54c19633f825bba257c5fbc803c2411cb9826ba760fc721436fc8c1ac99` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/asset-pack.lock.json` | `sha256:213eb10dd78b5eda96564d25f7f2e66519a5f2deaf3956328d370c3f53607a7b` | `selection-and-materialization`, `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-and-sensitive-flow-proof.json` | `sha256:9958392c28c4be80006c2bb33b353601ac820b5b635544a0ecdfb672629535e1` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-decisions.json` | `sha256:88acf01a8864b4133b71ae2fc5d68f8cf2d948eefe4e6fe6f8264b5538c56d8c` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/bounded-public-proof.json` | `sha256:e74ce71b622f8a4351bf789598fb2422993e0f52d8cb57b7ec3857c841f461ec` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/code-analysis-fact-registry.json` | `sha256:e65ea12ed612db3a7eb8a17c9d4874d295fbb1a751097756f1f7d42f56cdf8c0` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/disclosure-boundary-proof.json` | `sha256:93a6ae4d4886dea6ad89f294965b4980be1e971839a80510bf75c669a86f207e` | `disclosure-boundary` | `private-proof-artifact` | `false` | +| `.bitcode/disclosure-proof.json` | `sha256:e74ce71b622f8a4351bf789598fb2422993e0f52d8cb57b7ec3857c841f461ec` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/eval-manifest.json` | `sha256:77de93b5ba0c3c68e65d18a64a9b1531c722577f1f50dc99dc1c1197a1b835b5` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/external-boundary-manifest.json` | `sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a` | `bitcoin-settlement-interface` | `private-proof-artifact` | `false` | +| `.bitcode/identity-authorization-proof.json` | `sha256:d32d2d442f872b5e5b4e1822631c6a4e55119476bd366aaa873a85b747c79aac` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/identity-bindings.json` | `sha256:266980ddc09575e6b26a343be37671d921651aee24825537291cd68715853f53` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/inference-moment-contracts.json` | `sha256:f8d7a53bb5f56c87074b7b5e2aefd4e582278b9d737e1ddb647f51dc1c987f00` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/inference-proofs.json` | `sha256:83b1f7096042f13d63d72e42e6188565208bd8e2bcacd74105a5547d9e73c7fd` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/inference-synthesis-proof.json` | `sha256:7021f326f42f8a44233fe094d79ada504e346a9f58b95f63ae28b60780d5d7a5` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/journal-completeness-proof.json` | `sha256:c2c97292448cc0e0f3979d510f284cdef3f9d404cbf6b39eb639a6c6c214486d` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/journal-diff.json` | `sha256:f3ebf01987d5b184b19c7d02d3c196a848fa9b4eef79a99f7063d7b4794f3c27` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-exclusions.json` | `sha256:d94851d00d025a78f73546c90077ee7dbbb35ada30b531745a094eea0fb9f5f0` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-proof.json` | `sha256:d592858705dec7131279c0a523123d86107e9875111420fe703ee9172be6dda2` | `selection-and-materialization` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/materialization-visibility-proof.json` | `sha256:bf3148690787d7fe41f97061bdff0977f410b941b443ccaa4cc27976d18ef101` | `selection-and-materialization` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/measurement-receipts.json` | `sha256:f7cdf9cd6177b5aa71578adffc7a985144bb3cc4343e15c66bd3a508a94643a4` | `static-code-analysis` | `private-proof-artifact` | `false` | +| `.bitcode/parsed-completion-envelopes.json` | `sha256:cb6b93a204a1b42acc7c426b702bb4d317f4cae5bc4f9c297f66727d3dd795fc` | `inference-synthesis`, `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/projection-policy.json` | `sha256:bb8674abf94ae1d8ee5d5ed695258555f039326c2a75d3632dfd65271a06b1e1` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-completeness-proof.json` | `sha256:9746305d06e0b55e0d7fe59a9ebddcd8d321d4de6e9c26b067aaa74e4842b018` | `prompt-completeness` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-contracts.json` | `sha256:ff9bb2fb885bff4335f776405fb197df7e5a3e1e7addb97b506b3f2060d200c9` | `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-family-registry.json` | `sha256:ab753a9f2a8152aff00bb63282d32a3cd518e38ab37d28372237ea049242cf59` | `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-implementation-surface.json` | `sha256:2b167bf2a71100c16c5218af06210aad08f889af7c2ceeec5aef3a9d0c6bb38e` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-surfaces.json` | `sha256:88d8d904ea7059636eddcf4ccc60796e32e48986f64743380167b007b5ac880b` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/proof-contract.json` | `sha256:3027b1bd2e77c3bc6dc73616bd7a4f02934389726d6ca569f5503543ada9d96d` | `proof-contract` | `private-proof-artifact` | `false` | +| `.bitcode/redaction-proof.json` | `sha256:e74ce71b622f8a4351bf789598fb2422993e0f52d8cb57b7ec3857c841f461ec` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/selected-source-material.json` | `sha256:e51ecbf057c3863e2f20cea5414ee9f6f0783e4e964f671eb01c94968e805015` | `selection-and-materialization` | `licensed-source-material` | `false` | +| `.bitcode/selection-and-materialization-proof.json` | `sha256:93443b0becdeebae98f5e288352518435faff73ab467b341fad0bd038eceefbc` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/selection-consistency-proof.json` | `sha256:3bfc16906769f2d1c0ed837a29f95a1b94589171a4aa0fed584ce85434742659` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow-proof.json` | `sha256:8e6cb9e1a5f53b05188964fc477ed3dc9cb246a3bfbaa57690cd38ad833b4dcb` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow.json` | `sha256:8c79d33ee947212465106af1ab849f1d4c1b3b97049e6abd6bf802b6c35e22f5` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-participation.json` | `sha256:85562bd4e401bc83d714a4da40234b3b03e6fc34157cb4f2ba4185646febcf6f` | `settlement-source-to-shares` | `settlement-preview` | `false` | +| `.bitcode/settlement-preview.json` | `sha256:e0331346702d3904ffafc0e1f0d82d7ef6c7afec8dc415f92d553729d68a02e8` | `settlement-source-to-shares`, `bitcoin-settlement-interface` | `settlement-preview` | `false` | +| `.bitcode/settlement-proof.json` | `sha256:dece620c1dd99b204862c8372a376e01fb46c9da7c988732582c2bb1ed0b7e32` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-source-to-shares-proof.json` | `sha256:15beb995e962657b3fb02214f4afe13fbe89a111bfbfab3e1cb9715712838c6a` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/source-to-shares.json` | `sha256:45beb6ee9be4ba5f94fb02b8f61427db470435df7219f2cd7eee33339fc831f3` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/static-heuristics-registry.json` | `sha256:7c1ba09bff9a89f39696c4ea125bf77a68fc1e387de9ca4121214a1051c8c296` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-proof.json` | `sha256:43d0c993cc81696809f32616c596372a95d41980c77a4477c880fe68f8463739` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-report.json` | `sha256:02b5cdc5a05c89652a579902133e8333659c9496bbc08a993b828a6a6231d952` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/verification-decisions-proof.json` | `sha256:608f4210eb9b498b765f65b1d7a8c67edddf9bc3d5ff1fd6a0c7c3aeb7c5859f` | `verification-decisions` | `private-proof-artifact` | `false` | +| `.bitcode/verification-receipts.json` | `sha256:cb3a3cda6ffcd3ac8cda341aeb9fb12628dcd15182202c1d703b50e951d3447d` | `verification-decisions` | `private-proof-artifact` | `false` | +| `.bitcode/verification-report.json` | `sha256:13570e06df4eb03c796ac68d5dbdff215afe6b783d0c48c6929649ab99aa372c` | `verification-decisions` | `verification-evidence` | `false` | + +### auth-many-asset-normalization/context + +- branchName: `bitcode/remediation-read_auth-many-asset-normalization_f6dbfe951c-auth-many-asset-normalization` +- readId: `read_auth-many-asset-normalization_f6dbfe951c` +- assetPackId: `asset_pack_186c76eb7d2d` +- proofContractHash: `sha256:07e9dde9b1decdd69ab9f3287b1158f89b3d3badb085d8f55489f6339b296f43` +- allFamiliesPassed: `true` +- proofContractPassed: `true` + +#### Family Proof Hashes + +| proofFamily | proofHash | proofArtifactPath | +| --- | --- | --- | +| `inference-synthesis` | `sha256:7021f326f42f8a44233fe094d79ada504e346a9f58b95f63ae28b60780d5d7a5` | `.bitcode/inference-synthesis-proof.json` | +| `prompt-completeness` | `sha256:9746305d06e0b55e0d7fe59a9ebddcd8d321d4de6e9c26b067aaa74e4842b018` | `.bitcode/prompt-completeness-proof.json` | +| `static-code-analysis` | `sha256:43d0c993cc81696809f32616c596372a95d41980c77a4477c880fe68f8463739` | `.bitcode/static-measurement-proof.json` | +| `verification-decisions` | `sha256:608f4210eb9b498b765f65b1d7a8c67edddf9bc3d5ff1fd6a0c7c3aeb7c5859f` | `.bitcode/verification-decisions-proof.json` | +| `selection-and-materialization` | `sha256:44178db54efb33b972cd2e6cff2159b7d6c03cfc69901fa81a47ade8ef1b3e9b` | `.bitcode/selection-and-materialization-proof.json` | +| `authorization-and-sensitive-flow` | `sha256:9958392c28c4be80006c2bb33b353601ac820b5b635544a0ecdfb672629535e1` | `.bitcode/authorization-and-sensitive-flow-proof.json` | +| `settlement-source-to-shares` | `sha256:03b769f4dd08d73838c93f2c639f3e98e7b7f65efe6b7b09f15b264d653f5df2` | `.bitcode/settlement-source-to-shares-proof.json` | +| `disclosure-boundary` | `sha256:d4ecd4fa6a549fec13e5514cc6960b24afaaf385e312f2c6ae3c2280e5417584` | `.bitcode/disclosure-boundary-proof.json` | +| `proof-contract` | `sha256:07e9dde9b1decdd69ab9f3287b1158f89b3d3badb085d8f55489f6339b296f43` | `.bitcode/proof-contract.json` | + +#### Proof Artifact Disclosure Classification + +| path | sensitiveDataClass | disclosable | assetPackEvidenceConfidentiality | potentiallyDisclosable | +| --- | --- | --- | --- | --- | +| `.bitcode/accounting-precision-report.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/asset-pack.lock.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-and-sensitive-flow-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-decisions.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/bounded-public-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/code-analysis-fact-registry.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/disclosure-boundary-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/disclosure-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/identity-authorization-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/identity-bindings.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-moment-contracts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-proofs.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/inference-synthesis-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/journal-completeness-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/journal-diff.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-exclusions.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/materialization-visibility-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/measurement-receipts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/parsed-completion-envelopes.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/projection-policy.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-completeness-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-contracts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-family-registry.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-implementation-surface.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-surfaces.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/proof-contract.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/proof-witness-manifest.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/redaction-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/selected-source-material.json` | `licensed-source-material` | `false` | `licensed-source-material` | `false` | +| `.bitcode/selection-and-materialization-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/selection-consistency-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-participation.json` | `settlement-preview` | `false` | `settlement-preview` | `false` | +| `.bitcode/settlement-preview.json` | `settlement-preview` | `false` | `settlement-preview` | `false` | +| `.bitcode/settlement-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-source-to-shares-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/source-to-shares.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/static-heuristics-registry.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-proof.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-report.json` | `bounded-public-proof-metadata` | `true` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/system-proof-bundle.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-decisions-proof.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-receipts.json` | `private-proof-artifact` | `false` | `private-proof-artifact` | `false` | +| `.bitcode/verification-report.json` | `verification-evidence` | `false` | `verification-evidence` | `false` | + +#### Witness Artifact Digest Inventory + +| path | digest | proofFamilies | sensitiveDataClass | disclosable | +| --- | --- | --- | --- | --- | +| `.bitcode/accounting-precision-report.json` | `sha256:9c0f5287e2cc4af88889d02d72d1d34a127745dfbfc02c47d59bd55a37478e11` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/asset-pack.lock.json` | `sha256:967d39cbb5233e24d1e4ced45f3ad715d396afc47ea21cc06f0eee81df1996d2` | `selection-and-materialization`, `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-and-sensitive-flow-proof.json` | `sha256:9958392c28c4be80006c2bb33b353601ac820b5b635544a0ecdfb672629535e1` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/authorization-decisions.json` | `sha256:88acf01a8864b4133b71ae2fc5d68f8cf2d948eefe4e6fe6f8264b5538c56d8c` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/bounded-public-proof.json` | `sha256:faa5bed0f9cd0e812aee5a69e3f21ac975f21e29e57eca1200f53636b2d20093` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/code-analysis-fact-registry.json` | `sha256:e65ea12ed612db3a7eb8a17c9d4874d295fbb1a751097756f1f7d42f56cdf8c0` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/disclosure-boundary-proof.json` | `sha256:d4ecd4fa6a549fec13e5514cc6960b24afaaf385e312f2c6ae3c2280e5417584` | `disclosure-boundary` | `private-proof-artifact` | `false` | +| `.bitcode/disclosure-proof.json` | `sha256:faa5bed0f9cd0e812aee5a69e3f21ac975f21e29e57eca1200f53636b2d20093` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/eval-manifest.json` | `sha256:77de93b5ba0c3c68e65d18a64a9b1531c722577f1f50dc99dc1c1197a1b835b5` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/external-boundary-manifest.json` | `sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a` | `bitcoin-settlement-interface` | `private-proof-artifact` | `false` | +| `.bitcode/identity-authorization-proof.json` | `sha256:d32d2d442f872b5e5b4e1822631c6a4e55119476bd366aaa873a85b747c79aac` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/identity-bindings.json` | `sha256:266980ddc09575e6b26a343be37671d921651aee24825537291cd68715853f53` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/inference-moment-contracts.json` | `sha256:f8d7a53bb5f56c87074b7b5e2aefd4e582278b9d737e1ddb647f51dc1c987f00` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/inference-proofs.json` | `sha256:83b1f7096042f13d63d72e42e6188565208bd8e2bcacd74105a5547d9e73c7fd` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/inference-synthesis-proof.json` | `sha256:7021f326f42f8a44233fe094d79ada504e346a9f58b95f63ae28b60780d5d7a5` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/journal-completeness-proof.json` | `sha256:4b7ef245c2ccfe1cfaeaab022153ec9c9b8f99b617f4bb2a9a1d551db2de5c55` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/journal-diff.json` | `sha256:25862851c298858a3f7cb68e4d49383ffe6d6c03afd4a0d18f9a048ceaf6be9c` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-exclusions.json` | `sha256:b0c51aa9b75ae8f2f042d7d75121acda8a74d3a34fffd3c21bae43059440047a` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/materialization-proof.json` | `sha256:aae1b1470954e15061ea1345cd1d5074e8d598f923ad0ee31bcb188a03e76ec2` | `selection-and-materialization` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/materialization-visibility-proof.json` | `sha256:bf3148690787d7fe41f97061bdff0977f410b941b443ccaa4cc27976d18ef101` | `selection-and-materialization` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/measurement-receipts.json` | `sha256:f7cdf9cd6177b5aa71578adffc7a985144bb3cc4343e15c66bd3a508a94643a4` | `static-code-analysis` | `private-proof-artifact` | `false` | +| `.bitcode/parsed-completion-envelopes.json` | `sha256:cb6b93a204a1b42acc7c426b702bb4d317f4cae5bc4f9c297f66727d3dd795fc` | `inference-synthesis`, `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/projection-policy.json` | `sha256:bb8674abf94ae1d8ee5d5ed695258555f039326c2a75d3632dfd65271a06b1e1` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-completeness-proof.json` | `sha256:9746305d06e0b55e0d7fe59a9ebddcd8d321d4de6e9c26b067aaa74e4842b018` | `prompt-completeness` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/prompt-contracts.json` | `sha256:ff9bb2fb885bff4335f776405fb197df7e5a3e1e7addb97b506b3f2060d200c9` | `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-family-registry.json` | `sha256:ab753a9f2a8152aff00bb63282d32a3cd518e38ab37d28372237ea049242cf59` | `prompt-completeness` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-implementation-surface.json` | `sha256:2b167bf2a71100c16c5218af06210aad08f889af7c2ceeec5aef3a9d0c6bb38e` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/prompt-surfaces.json` | `sha256:88d8d904ea7059636eddcf4ccc60796e32e48986f64743380167b007b5ac880b` | `inference-synthesis` | `private-proof-artifact` | `false` | +| `.bitcode/proof-contract.json` | `sha256:3027b1bd2e77c3bc6dc73616bd7a4f02934389726d6ca569f5503543ada9d96d` | `proof-contract` | `private-proof-artifact` | `false` | +| `.bitcode/redaction-proof.json` | `sha256:faa5bed0f9cd0e812aee5a69e3f21ac975f21e29e57eca1200f53636b2d20093` | `disclosure-boundary` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/selected-source-material.json` | `sha256:1de88ee5d506a61af4e096e89edb43a83742b3f8b69bbac2066d4c7820d027b9` | `selection-and-materialization` | `licensed-source-material` | `false` | +| `.bitcode/selection-and-materialization-proof.json` | `sha256:44178db54efb33b972cd2e6cff2159b7d6c03cfc69901fa81a47ade8ef1b3e9b` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/selection-consistency-proof.json` | `sha256:3bfc16906769f2d1c0ed837a29f95a1b94589171a4aa0fed584ce85434742659` | `selection-and-materialization` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow-proof.json` | `sha256:8e6cb9e1a5f53b05188964fc477ed3dc9cb246a3bfbaa57690cd38ad833b4dcb` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/sensitive-data-flow.json` | `sha256:8c79d33ee947212465106af1ab849f1d4c1b3b97049e6abd6bf802b6c35e22f5` | `authorization-and-sensitive-flow` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-participation.json` | `sha256:b23dd79a34d7fb37ff0884e0d475413c5760303d27525501c00069415a280588` | `settlement-source-to-shares` | `settlement-preview` | `false` | +| `.bitcode/settlement-preview.json` | `sha256:a9f661b49799f2c6bf9a3460452a72681d8bf9c899de68b97f1cff085b355f3d` | `settlement-source-to-shares`, `bitcoin-settlement-interface` | `settlement-preview` | `false` | +| `.bitcode/settlement-proof.json` | `sha256:afa5aa92da369956610e7ffd1a0e01aa7bba9732775d56a65f4cdfcef41e1ce9` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/settlement-source-to-shares-proof.json` | `sha256:03b769f4dd08d73838c93f2c639f3e98e7b7f65efe6b7b09f15b264d653f5df2` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/source-to-shares.json` | `sha256:45beb6ee9be4ba5f94fb02b8f61427db470435df7219f2cd7eee33339fc831f3` | `settlement-source-to-shares` | `private-proof-artifact` | `false` | +| `.bitcode/static-heuristics-registry.json` | `sha256:7c1ba09bff9a89f39696c4ea125bf77a68fc1e387de9ca4121214a1051c8c296` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-proof.json` | `sha256:43d0c993cc81696809f32616c596372a95d41980c77a4477c880fe68f8463739` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/static-measurement-report.json` | `sha256:02b5cdc5a05c89652a579902133e8333659c9496bbc08a993b828a6a6231d952` | `static-code-analysis` | `bounded-public-proof-metadata` | `true` | +| `.bitcode/verification-decisions-proof.json` | `sha256:608f4210eb9b498b765f65b1d7a8c67edddf9bc3d5ff1fd6a0c7c3aeb7c5859f` | `verification-decisions` | `private-proof-artifact` | `false` | +| `.bitcode/verification-receipts.json` | `sha256:cb3a3cda6ffcd3ac8cda341aeb9fb12628dcd15182202c1d703b50e951d3447d` | `verification-decisions` | `private-proof-artifact` | `false` | +| `.bitcode/verification-report.json` | `sha256:cb5173184e0de33f4a625debb2dceaabba82d100cdff1216bcf95b7c7c4e766b` | `verification-decisions` | `verification-evidence` | `false` | diff --git a/packages/protocol/README.md b/packages/protocol/README.md index 9e9d6889..2a3efb55 100644 --- a/packages/protocol/README.md +++ b/packages/protocol/README.md @@ -15,7 +15,7 @@ inventories, but it is not a commercial runtime implementation dependency. Current exported commercial helpers include: -- active/draft canon posture (`V41` active, `V42` draft); +- active/draft canon posture (`V42` active, `V43` draft after V42 promotion); - spec-family and canonical-input validation helpers; - canon-posture drift reporting; - `DocumentationSurfaceCatalog` helpers for V35 documentation surface proof; diff --git a/packages/protocol/data/state.json b/packages/protocol/data/state.json index 7394bf19..25ae7756 100644 --- a/packages/protocol/data/state.json +++ b/packages/protocol/data/state.json @@ -1,18 +1,18 @@ { "version": 3, - "specVersion": "Bitcode Spec V41 active canon / V42 system draft", + "specVersion": "Bitcode Spec V42 active canon / V43 system draft", "canonPosture": { - "activeCanonVersion": "V41", - "draftTargetVersion": "V42", - "operatorLabel": "V41 active canon / V42 system draft", - "specVersionLabel": "Bitcode Spec V41 active canon / V42 system draft", + "activeCanonVersion": "V42", + "draftTargetVersion": "V43", + "operatorLabel": "V42 active canon / V43 system draft", + "specVersionLabel": "Bitcode Spec V42 active canon / V43 system draft", "documentTitle": "Bitcode Demonstration", - "policyRef": "policy://bitcode/spec-v41-active-v42-system-draft/current", - "activeProvenAppendixPath": "BITCODE_SPEC_V41_PROVEN.md", - "draftSpecPath": "BITCODE_SPEC_V42.md", - "draftDeltaPath": "BITCODE_SPEC_V42_DELTA.md", - "draftParityPath": "BITCODE_SPEC_V42_PARITY_MATRIX.md", - "inheritedCanonSurfaceLabel": "V16/V17/V18/V19/V20/V21/V22/V23/V24/V25/V26/V27/V28/V29/V30/V31/V32/V33/V34/V35/V36/V37/V38/V39/V40", + "policyRef": "policy://bitcode/spec-v42-active-v43-system-draft/current", + "activeProvenAppendixPath": "BITCODE_SPEC_V42_PROVEN.md", + "draftSpecPath": "BITCODE_SPEC_V43.md", + "draftDeltaPath": "BITCODE_SPEC_V43_DELTA.md", + "draftParityPath": "BITCODE_SPEC_V43_PARITY_MATRIX.md", + "inheritedCanonSurfaceLabel": "V16/V17/V18/V19/V20/V21/V22/V23/V24/V25/V26/V27/V28/V29/V30/V31/V32/V33/V34/V35/V36/V37/V38/V39/V40/V41", "heroEyebrow": "Bitcode transactions and activity", "heroLede": "Set the active scenario, select supply, and follow the flow from deposit through settlement.", "heroTip": "Use the guide and lower runtime surfaces when you read exact replay, proof, or settlement detail." diff --git a/packages/protocol/src/canon-posture.js b/packages/protocol/src/canon-posture.js index ba0d44e5..08148b3c 100644 --- a/packages/protocol/src/canon-posture.js +++ b/packages/protocol/src/canon-posture.js @@ -1,7 +1,7 @@ // @ts-check -export const ACTIVE_CANON_VERSION = 'V41'; -export const DRAFT_TARGET_VERSION = 'V42'; +export const ACTIVE_CANON_VERSION = 'V42'; +export const DRAFT_TARGET_VERSION = 'V43'; export const CURRENT_CANON_OPERATOR_LABEL = `${ACTIVE_CANON_VERSION} active canon / ${DRAFT_TARGET_VERSION} system draft`; /** @@ -48,7 +48,7 @@ export function buildCanonPosture() { draftSpecPath: DRAFT_SPEC_PATH, draftDeltaPath: DRAFT_DELTA_PATH, draftParityPath: DRAFT_PARITY_PATH, - inheritedCanonSurfaceLabel: 'V16/V17/V18/V19/V20/V21/V22/V23/V24/V25/V26/V27/V28/V29/V30/V31/V32/V33/V34/V35/V36/V37/V38/V39/V40', + inheritedCanonSurfaceLabel: 'V16/V17/V18/V19/V20/V21/V22/V23/V24/V25/V26/V27/V28/V29/V30/V31/V32/V33/V34/V35/V36/V37/V38/V39/V40/V41', heroEyebrow: `${CURRENT_PROJECT_LABEL} transactions and activity`, heroLede: 'Set the active scenario, select supply, and follow the flow from deposit through settlement.', heroTip: 'Use the guide and lower runtime surfaces when you read exact replay, proof, or settlement detail.' diff --git a/protocol-demonstration/README.md b/protocol-demonstration/README.md index bdc2a886..241a82ff 100644 --- a/protocol-demonstration/README.md +++ b/protocol-demonstration/README.md @@ -1,12 +1,12 @@ -# Bitcode Protocol Demonstration - V41 canonical deterministic local prototype +# Bitcode Protocol Demonstration - V42 canonical deterministic local prototype This package is the deterministic demonstration of Bitcode. Within this package the correct name is demonstration. `BITCODE_SPEC.txt` is the canonical pointer for active-system work. It currently -resolves to `V41`; V42 is the next draft target after this promotion. This demo is governed by the active V41 canonical -spec and `BITCODE_SPEC_V41_PROVEN.md` as the current generated appendix. -`BITCODE_SPEC.txt -> V41`. +resolves to `V41`; V42 is the next draft target after this promotion. This demo is governed by the active V42 canonical +spec and `BITCODE_SPEC_V42_PROVEN.md` as the current generated appendix. +`BITCODE_SPEC.txt -> V42`. V35 telemetry/documentation work may compare against demonstration facts, but the demonstration remains self-contained and does not import commercial runtime telemetry, documentation, dashboard, runbook, or public docs code. diff --git a/protocol-demonstration/src/canon-posture.js b/protocol-demonstration/src/canon-posture.js index ba0d44e5..08148b3c 100644 --- a/protocol-demonstration/src/canon-posture.js +++ b/protocol-demonstration/src/canon-posture.js @@ -1,7 +1,7 @@ // @ts-check -export const ACTIVE_CANON_VERSION = 'V41'; -export const DRAFT_TARGET_VERSION = 'V42'; +export const ACTIVE_CANON_VERSION = 'V42'; +export const DRAFT_TARGET_VERSION = 'V43'; export const CURRENT_CANON_OPERATOR_LABEL = `${ACTIVE_CANON_VERSION} active canon / ${DRAFT_TARGET_VERSION} system draft`; /** @@ -48,7 +48,7 @@ export function buildCanonPosture() { draftSpecPath: DRAFT_SPEC_PATH, draftDeltaPath: DRAFT_DELTA_PATH, draftParityPath: DRAFT_PARITY_PATH, - inheritedCanonSurfaceLabel: 'V16/V17/V18/V19/V20/V21/V22/V23/V24/V25/V26/V27/V28/V29/V30/V31/V32/V33/V34/V35/V36/V37/V38/V39/V40', + inheritedCanonSurfaceLabel: 'V16/V17/V18/V19/V20/V21/V22/V23/V24/V25/V26/V27/V28/V29/V30/V31/V32/V33/V34/V35/V36/V37/V38/V39/V40/V41', heroEyebrow: `${CURRENT_PROJECT_LABEL} transactions and activity`, heroLede: 'Set the active scenario, select supply, and follow the flow from deposit through settlement.', heroTip: 'Use the guide and lower runtime surfaces when you read exact replay, proof, or settlement detail.' From 5e9557c840d9b403139346a6dd693b106897a8e4 Mon Sep 17 00:00:00 2001 From: Garrett Maring Date: Thu, 28 May 2026 22:08:24 -0300 Subject: [PATCH 15/35] V43 Gate 1: Open packs read deposit roadmap Open the V43 draft specification family over V42 canon with the packs/read/deposit route plan, agentic deposit AssetPack option scope, parity matrix, and notes. Wire the V43 Gate 1 checker into package scripts and gate/canon workflows, and update roadmap plus repository docs to state active V42 / draft V43 posture. Proof: pnpm run check:v43-gate1; node scripts/check-bitcode-spec-family.mjs --version V43 --mode draft --current-target V42; node scripts/check-bitcode-canonical-inputs.mjs --current-target V42; node scripts/check-bitcode-canon-posture-drift.mjs --active-canon V42 --draft-target V43; git diff --check. --- .github/pull_request_template.md | 4 +- .github/workflows/bitcode-canon-quality.yml | 1 + .github/workflows/bitcode-gate-quality.yml | 4 + BITCODE_SPEC_V43.md | 524 ++++++++++++++++++ BITCODE_SPEC_V43_DELTA.md | 48 ++ BITCODE_SPEC_V43_NOTES.md | 49 ++ BITCODE_SPEC_V43_PARITY_MATRIX.md | 52 ++ README.md | 20 +- SPECIFICATIONS_ROADMAP.md | 40 +- package.json | 1 + packages/protocol/README.md | 6 + protocol-demonstration/README.md | 5 +- ...k-v43-gate1-packs-read-deposit-roadmap.mjs | 181 ++++++ 13 files changed, 905 insertions(+), 30 deletions(-) create mode 100644 BITCODE_SPEC_V43.md create mode 100644 BITCODE_SPEC_V43_DELTA.md create mode 100644 BITCODE_SPEC_V43_NOTES.md create mode 100644 BITCODE_SPEC_V43_PARITY_MATRIX.md create mode 100644 scripts/check-v43-gate1-packs-read-deposit-roadmap.mjs diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index d692faa0..21ac051c 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,7 +1,7 @@ ## Title -Use the version and gate prefix for gate PRs: `V42 Gate N: Concise Topical Title`. -Use the version and promotion prefix for version promotion PRs: `V42 Canonical Promotion: Concise Topical Title`. +Use the version and gate prefix for gate PRs: `V43 Gate N: Concise Topical Title`. +Use the version and promotion prefix for version promotion PRs: `V43 Canonical Promotion: Concise Topical Title`. ## Closure diff --git a/.github/workflows/bitcode-canon-quality.yml b/.github/workflows/bitcode-canon-quality.yml index 18ced47a..a5d10c2f 100644 --- a/.github/workflows/bitcode-canon-quality.yml +++ b/.github/workflows/bitcode-canon-quality.yml @@ -327,6 +327,7 @@ jobs: node scripts/check-v42-gate9-promotion-readiness.mjs --promotion-mode --skip-branch-check --skip-package-tests if [ -f BITCODE_SPEC_V43.md ]; then node scripts/check-bitcode-spec-family.mjs --version V43 --mode draft --current-target V42 + node scripts/check-v43-gate1-packs-read-deposit-roadmap.mjs --skip-branch-check fi else echo "Unexpected BITCODE_SPEC.txt pointer: $POINTER" >&2 diff --git a/.github/workflows/bitcode-gate-quality.yml b/.github/workflows/bitcode-gate-quality.yml index 3414eee1..cfbf747c 100644 --- a/.github/workflows/bitcode-gate-quality.yml +++ b/.github/workflows/bitcode-gate-quality.yml @@ -456,6 +456,7 @@ jobs: node scripts/check-v42-gate9-promotion-readiness.mjs --promotion-mode --skip-branch-check --skip-package-tests if [ -f BITCODE_SPEC_V43.md ]; then node scripts/check-bitcode-spec-family.mjs --version V43 --mode draft --current-target V42 + node scripts/check-v43-gate1-packs-read-deposit-roadmap.mjs --skip-branch-check fi else echo "Unexpected BITCODE_SPEC.txt pointer: $POINTER" >&2 @@ -486,6 +487,9 @@ jobs: else node scripts/check-v42-gate9-promotion-readiness.mjs --promotion-mode --skip-branch-check fi + if [ -f scripts/check-v43-gate1-packs-read-deposit-roadmap.mjs ]; then + node scripts/check-v43-gate1-packs-read-deposit-roadmap.mjs --skip-branch-check + fi pnpm --filter @bitcode/protocol test pnpm --filter @bitcode/btd exec jest --config jest.config.cjs --runInBand --forceExit pnpm --filter @bitcode/pipeline-asset-pack exec jest --config jest.config.cjs --passWithNoTests --forceExit diff --git a/BITCODE_SPEC_V43.md b/BITCODE_SPEC_V43.md new file mode 100644 index 00000000..c3d44bdb --- /dev/null +++ b/BITCODE_SPEC_V43.md @@ -0,0 +1,524 @@ +# Bitcode Spec V43 + +## Status + +- Version: `V43` +- V43 state: draft opened over promoted V42; V43 is the active product-route and agentic-deposit draft target +- Current canonical/latest target: `V42` +- Prior canonical anchor: `BITCODE_SPEC_V42.md` +- Prior generated proof appendix: `BITCODE_SPEC_V42_PROVEN.md` +- Generated structured artifact inventory: `.bitcode/v43-spec-family-report.json`, `.bitcode/v43-canonical-input-report.json`, V43 gate artifacts as they are introduced, V43 gate-quality workflow evidence, and later `BITCODE_SPEC_V43_PROVEN.md` at promotion +- Source parity state: V43 currently opens route vocabulary, pack-activity, agentic deposit, Reading separation, UX, and proof posture; implementation parity is gate-scoped and not yet promoted +- Notes companion: `BITCODE_SPEC_V43_NOTES.md` +- Delta companion: `BITCODE_SPEC_V43_DELTA.md` +- Parity companion: `BITCODE_SPEC_V43_PARITY_MATRIX.md` +- Scope: V43 draft specification for `/packs`, `/read`, `/deposit`, agentic deposit AssetPack option synthesis, pack activity master-detail, and self-explanatory enterprise UX after V42 reliable MVP experience +- Last fully realized canonical target preserved in source: `V42` + +## Version executive summary + +V43 turns the reliable V42 MVP path into the product shape Bitcode should expose to enterprise users. The transitional `/terminal` cockpit is split into `/read` and `/deposit`, and `/exchange` becomes `/packs`. + +The V43 product object is AssetPacks in and AssetPacks out: + +- `/deposit` helps an enterprise turn connected source into reviewable deposit AssetPack options before Depository admission. +- `/read` lets an enterprise request a Read, review the synthesized Need, request Finding Fits, preview source-safe AssetPack measurements, settle in BTC/BTD, and receive repository delivery. +- `/packs` is the searchable master-detail activity surface for all pack activity: deposit options, admitted Depository AssetPacks, Finding Fits previews, settled Need-Fit AssetPacks, quotes, rights transfers, compensation, delivery, proofs, and repair states. + +V43 is also a UX correction version. Outside public documentation, the product should not lean on self-referential explanatory copy to compensate for unclear flows. The core routes, names, layout, progressive detail, rich execution log rows, and reusable themed components must make Depositing, Reading, and pack activity legible by default and deeply inspectable on demand. + +## Canonical Bitcode executive summary + +Bitcode remains the knowledge commoditization protocol: deposits become source-safe Depository supply, Reading synthesizes a Need, Finding Fits searches many deposits, AssetPack synthesis creates a source-safe preview and withheld source bundle, BTC settlement transfers BTD read rights, and repository delivery unlocks only after paid settlement. + +V43 changes the product routes and deposit-side synthesis experience around that law. It does not weaken V42 source-safety, BTD ownership, BTC settlement, source-to-shares compensation, ledger/database/object-storage synchronization, prompt/inference redaction, or post-settlement delivery boundaries. + +## V43 source-of-truth hierarchy + +`BITCODE_SPEC.txt` points to `V42` while V43 is draft. +`BITCODE_SPEC_V42.md` and `BITCODE_SPEC_V42_PROVEN.md` are active canon. +`BITCODE_SPEC_V43.md`, `BITCODE_SPEC_V43_DELTA.md`, `BITCODE_SPEC_V43_NOTES.md`, and `BITCODE_SPEC_V43_PARITY_MATRIX.md` define the draft target only on `version/v43` and `v43/gate-*` branches. +Implementation remains unversioned in source paths; route, package, component, test, prompt, and script names move in place as the single current Bitcode system. + +## V43 full-system, re-implementation, and audit rule + +Every V43 change must be reconstructable from specification, code, generated artifacts, tests, telemetry, and operator documentation. Route migration cannot be a cosmetic rename. Each gate must state product path, protocol object ownership, route/API/storage contracts, telemetry rows, proof roots, source-safe disclosure tier, and validation commands. + +The route split must preserve V42 behavior while making it easier to use: + +- `/read` owns Reading state and can still expose full proof detail. +- `/deposit` owns depositor source connection, option synthesis, review, approval, and Depository admission. +- `/packs` owns historical/current activity search and detailed inspection. + +## V43 totality and precision enforcement rule + +V43 must remove overlapping vocabulary. Exchange is not a current route name after V43 migration; the route and component prefix is Packs. Terminal is no longer the default product route for Reading or Depositing after V43 migration; it may remain only as an internal/debug cockpit if explicitly retained and renamed as such. + +No product UI may reveal protected source, unpaid AssetPack source, raw provider responses, protected prompt payloads, wallet private material, private settlement payloads, or credentials. No route rename may create a second authority path that bypasses Need review, Finding Fits, BTC settlement, BTD rights transfer, or repository delivery reconciliation. + +## V43 system goals, non-goals, and design principles + +Goals: + +- Rename `/exchange` to `/packs` across routes, component prefixes, docs, tests, telemetry labels, and operator vocabulary. +- Split `/terminal` into `/read` and `/deposit` as the default enterprise paths. +- Make `/packs` a dense, searchable, sortable, filterable master-detail activity surface for AssetPacks in and out. +- Add an agentic deposit-side flow that synthesizes deposit AssetPack options from connected source, depositor instructions, Depository state, and Reading demand. +- Let depositors review source-safe measurements, likely demand, sub-criticality, ROI posture, BTD potential, and compensation route before approving Depository admission. +- Improve UX so default flows are simple, self-explanatory, and visually polished while expandable detail preserves all Bitcode proof power. + +Non-goals: + +- V43 does not make unpaid source visible to readers. +- V43 does not mint BTD for speculative deposit options without a later paid Need-Fit. +- V43 does not weaken V42 settlement, rights, delivery, or source-to-shares law. +- V43 does not move advanced conversational overlays into the core default path unless a gate explicitly owns that work. + +Design principles: AssetPacks in and out, route names as protocol truth, source-safe preview, proof-on-expand, purchase-before-source, depositor ROI clarity, and excellent enterprise usability. + +## V43 system architecture and layer boundaries + +V43 acts through existing layers: + +- website routes and route-owned state for `/packs`, `/read`, and `/deposit`; +- package-owned protocol, BTD, pipeline, prompt, tool, storage, telemetry, and proof primitives; +- ReadNeedComprehensionSynthesis and ReadFitsFindingSynthesis for Reading; +- a new deposit-side AssetPack option synthesis pipeline for connected-source supply creation; +- Depository search, demand/read activity indexing, source criticality policy, ROI posture, compensation preview, and admission proof; +- ledger/database/object-storage synchronization, source-safe telemetry rows, and generated artifacts. + +Demonstration code remains self-contained inside `protocol-demonstration/`. + +## V43 canonical domain model + +V43 adds or promotes these product objects: PackActivity, PacksMasterFilter, PacksActivityDetail, DepositAssetPackOption, DepositOptionSynthesisRequest, DepositorInstruction, SourceCriticalityDecision, DemandSignalSummary, PositiveRoiPosture, DepositOptionReviewDecision, DepositOptionAdmissionReceipt, ReadRouteSession, ReadNeedReviewState, PackSettlementSummary, PackCompensationSummary, and PackRepairState. + +These bind to existing Bitcode objects: Depository records, Read Requests, synthesized Needs, candidate fit deposits, selected fit sets, AssetPack previews, BTD/BTC quotes, settlement observations, rights receipts, source-to-shares rows, repository delivery receipts, execution telemetry, and proof artifacts. + +## V43 whole Bitcode operator chain + +The V43 operator chain is: connect source, synthesize deposit AssetPack options, review source-safe option measurements and demand posture, approve or reject Depository admission, request a Read, review or resynthesize Need, request Finding Fits, search many Depository AssetPacks, synthesize source-safe Need-Fit AssetPack preview, quote BTC/BTD purchase terms, settle BTC, transfer BTD rights, unlock full AssetPack delivery, create repository pull request, compensate contributors, synchronize ledger/database/storage, and inspect all activity through `/packs`. + +## V43 Gate 1 Packs, Read, Deposit Roadmap And Spec Opening + +Gate 1 opens the V43 specification family, branch posture, workflow posture, checker, roadmap, docs, and route vocabulary. It does not rename routes or implement pipelines. It closes when active V42 / draft V43 truth is visible in docs and workflows, V43 has a precise gate plan, and acceptance criteria explicitly include the latest UX/product instructions. + +## V43 Gate 2 Route Vocabulary Inventory And Migration Plan + +Gate 2 must inventory every `/exchange`, Exchange, `/terminal`, Terminal, Reading, Depositing, and pack-activity route/component/test/doc/API/telemetry reference. It must produce a migration matrix for Packs, Read, Deposit, retained debug cockpit surfaces, redirects, compatibility boundaries, and removal of self-referential product copy. + +## V43 Gate 3 Packs Activity Master-Detail Data Model + +Gate 3 must implement PackActivity data contracts, route APIs, table search, column sort, filtering, detail projection, source-safe metadata expansion, proof-root display, settlement/compensation/delivery/repair state readback, and no-source leak tests. + +## V43 Gate 4 Read Route Extraction And Five-Step UX + +Gate 4 must move the Reading default experience into `/read`: request read, review synthesized Need, request Finding Fits, review source-safe AssetPack preview, and settle/buy/deliver. It must preserve V42 telemetry, execution log streaming, proof expansion, retry/restart, and failure repair. + +## V43 Gate 5 Deposit Route And Agentic AssetPack Option Synthesis + +Gate 5 must move the Depositing default experience into `/deposit` and introduce the deposit AssetPack option synthesis pipeline. The pipeline must use connected source, depositor instructions, Depository state, and Reading demand to propose multiple source-safe AssetPack options for review. + +## V43 Gate 6 Source Criticality, Demand, ROI, And Compensation Policy + +Gate 6 must formalize how Bitcode estimates sub-critical source posture, likely demand, positive ROI, BTD potential, compensation route, and admission blockers. The system must help depositors sell non-critical positive-ROI IP while refusing or warning on critical IP and negative expected value. + +## V43 Gate 7 Deposit Option Review, Approval, And Admission + +Gate 7 must implement option accept/reject/resynthesize decisions, admission receipts, Depository indexing, storage projection, compensation preview, telemetry, and `/packs` activity synchronization for approved deposit AssetPacks. + +## V43 Gate 8 UX/UI Product Excellence Pass + +Gate 8 must improve route layout, visual hierarchy, copy, progressive disclosure, execution stream usage, empty/error/loading states, keyboard/responsive behavior, and reusable themed components across `/packs`, `/read`, and `/deposit`. It must remove in-app self-referential explanatory copy outside public docs. + +## V43 Gate 9 Cross-Route Rehearsal, Telemetry, And Repair + +Gate 9 must rehearse the full path across `/deposit`, `/read`, and `/packs`: synthesize deposit options, admit a deposit AssetPack, request Reading, find fits, preview, settle, deliver, compensate, and inspect activity. It must cover local/staging-testnet lanes, telemetry, database/ledger/storage synchronization, and repair states. + +## V43 Gate 10 Promotion Readiness + +Gate 10 must bind every V43 artifact, workflow, generated proof, docs update, route migration, source-safety proof, test suite, and active V43 / draft V44 runtime posture before canonical promotion. + +## V43 canonical subsystem surfaces + +### Depositing and asset supply + +- Current canonical objects and emitted artifacts: DepositAssetPackOption, DepositOptionSynthesisRequest, Depository record, source admission proof, compensation preview, `.bitcode/v43-deposit-options.json`. +- Current algorithms and derivation rules: connected-source scan, depositor instruction parsing, source criticality evaluation, demand signal matching, option grouping, measurement projection, and admission proof. +- Current invariants and fail-closed conditions: invalid deposit, missing authority, critical-source warning, negative ROI blocker, source projection mismatch, and protected-source leak. +- Current proof obligations: source-safe option synthesis, review decision provenance, Depository admission, compensation preview, and activity synchronization. +- Current source-bearing implementation basis: deposit route, pipeline packages, Depository indexing, storage adapters, telemetry writers, and route tests. +- Current validating commands and parity basis: `pnpm run check:v43-gate5`, package tests, API tests, and generated artifacts. +- Current accepted boundaries: options are not BTD mints and do not expose source to readers before settlement. + +### Reading and prompt/inference ownership + +- Current canonical objects and emitted artifacts: ReadRouteSession, Read Request, synthesized Need, Need review decision, Finding Fits request, AssetPack preview, quote, settlement, delivery. +- Current algorithms and derivation rules: ReadNeedComprehensionSynthesis and ReadFitsFindingSynthesis remain the Reading pipelines, with Need review gating Finding Fits. +- Current invariants and fail-closed conditions: no Finding Fits without accepted Need, no preview source leakage, no settlement without quote, no delivery without paid rights. +- Current proof obligations: source-safe telemetry, prompt/program receipts, parser outputs, stage persistence, and repair states. +- Current source-bearing implementation basis: `/read`, Reading APIs, pipeline host, prompt registries, execution stream, ledger/database/storage adapters. +- Current validating commands and parity basis: `pnpm run check:v43-gate4`, uapi tests, pipeline tests, browser proof. +- Current accepted boundaries: `/read` is the default user path; retained debug cockpit cannot bypass it. + +### Fit, recall, ranking, and verification + +- Current canonical objects and emitted artifacts: query plan, candidate fit deposits, ranking receipts, selected fit set, proof roots, search receipts. +- Current algorithms and derivation rules: depository-wide many-fit search uses embeddings, metadata, measurements, provider search, and verifier ranking. +- Current invariants and fail-closed conditions: no-survivor asset pack, stale embedding, insufficient fit confidence, and protected prompt/source disclosure. +- Current proof obligations: candidate recall, ranking explainability, selected-fit provenance, and source-safe preview inputs. +- Current source-bearing implementation basis: ReadFitsFindingSynthesis, Depository search tools, embedding utilities, provider adapters, and ranking tests. +- Current validating commands and parity basis: `pnpm run check:v43-gate4`, `pnpm run check:v43-gate9`, pipeline integration. +- Current accepted boundaries: fit deposits remain source-safe until settlement unlock. + +### Selection and materialization + +- Current canonical objects and emitted artifacts: AssetPack preview, withheld source bundle, delivery receipt, repository pull request, PackActivity. +- Current algorithms and derivation rules: synthesis uses selected fit context and accepted Need, preview hides source, finishing writes repository changes after settlement. +- Current invariants and fail-closed conditions: unpaid source hidden, delivery lock mismatch, PR creation failure, and storage reconciliation drift. +- Current proof obligations: preview/delivery boundary, repository delivery receipt, storage lock, and PackActivity update. +- Current source-bearing implementation basis: asset-pack pipeline, pipeline hosts, repository provider integration, object storage. +- Current validating commands and parity basis: package tests, route tests, rehearsal artifacts. +- Current accepted boundaries: full source-bearing AssetPack appears only after paid rights transfer. + +### Identity, authorization, and sensitive flow + +- Current canonical objects and emitted artifacts: account, organization, wallet, repository authority, policy decision, settlement signer, role decision. +- Current algorithms and derivation rules: account/org/wallet/repository authorization governs deposit, read, settlement, delivery, and activity access. +- Current invariants and fail-closed conditions: authorization denial, missing wallet authority, invalid repository authority, and private key leakage. +- Current proof obligations: policy proof, wallet boundary, repository permission proof, and redaction proof. +- Current source-bearing implementation basis: auth adapters, policy packages, wallet/BTD packages, API middleware. +- Current validating commands and parity basis: unit/API tests, V40 integration tests, V43 route tests. +- Current accepted boundaries: no route owns private key material or cross-org source visibility. + +### Disclosure and projection + +- Current canonical objects and emitted artifacts: source-safe projection, preview metadata, expanded proof metadata, redaction receipt, PackActivity detail. +- Current algorithms and derivation rules: disclosure tiers separate public, user-visible, buyer-visible, reviewer-visible, and operator-only data. +- Current invariants and fail-closed conditions: public projection overexposure, raw prompt leak, provider response leak, unpaid source leak, and credentials leak. +- Current proof obligations: redaction tests, source-safe artifacts, UI collapsed/expanded disclosure contract. +- Current source-bearing implementation basis: route serializers, UI components, telemetry redactors, proof generators. +- Current validating commands and parity basis: leak scans, uapi tests, browser screenshots, generated reports. +- Current accepted boundaries: public docs may explain; product UI must disclose only operationally necessary source-safe data. + +### Settlement and exact accounting + +- Current canonical objects and emitted artifacts: quote, BTC payment observation, finality, BTD rights transfer, source-to-shares allocation, compensation receipt. +- Current algorithms and derivation rules: deterministic quote uses measurement weight, measurement volume, and protocol fee allocation; source-to-shares uses exact accounting. +- Current invariants and fail-closed conditions: settlement conservation drift, underpayment, overpayment, double delivery, and stale finality. +- Current proof obligations: BTC fee conservation, BTD rights receipt, compensation route, ledger/database/storage reconciliation. +- Current source-bearing implementation basis: BTD package, ledger writers, settlement observers, repair jobs. +- Current validating commands and parity basis: BTD tests, route tests, rehearsal artifacts. +- Current accepted boundaries: speculative deposit options may estimate BTD potential but do not receive final BTD rights until Need-Fit settlement law applies. + +### Proof contract, witnesses, and replay + +- Current canonical objects and emitted artifacts: proof family, theorem, witness, replay step, generated artifact, workflow result. +- Current algorithms and derivation rules: every gate creates deterministic proof roots and replayable source-safe evidence. +- Current invariants and fail-closed conditions: stale promoted status truth, artifact drift, missing witness, and unverifiable workflow. +- Current proof obligations: proof families, members, theorems, witnesses, and replay. +- Current source-bearing implementation basis: scripts, protocol package generators, workflow checks, test suites. +- Current validating commands and parity basis: `pnpm run check:v43-gate1`, later gate checks, promotion readiness. +- Current accepted boundaries: proof artifacts never serialize secrets or protected source. + +## V43 proof-family canon + +### Inference-synthesis + +- proofArtifactPath: `.bitcode/v43-inference-synthesis.json` +- members: deposit-option-synthesis, read-need, read-fits, pack-preview +- theoremIds: source-safe-option-synthesis, accepted-need-gated-fits, no-unpaid-source +- replayStepIds: synthesize-deposit-options, synthesize-need, search-depository, preview-pack +- witnessArtifactPaths: V43 gate artifacts +- current member closure criteria: typed outputs, source-safe projections, and route readback +- current member verdict shape: pass/fail with proof roots +- current theorem-by-theorem closure reading: every synthesis step preserves disclosure boundary +- current theorem-to-replay grouping: each theorem maps to a replay step +- minimum artifact/replay binding set: route state, execution id, parser id, proof root +- current proof-object fields: artifact id, version, route, phase, verdict, evidence root +- generated-artifact and test bindings: V43 check scripts and package tests +- fail-closed conditions: invalid deposit, prompt contract incompleteness, parsed-envelope inadmissibility, no-survivor asset pack + +### Prompt-completeness + +- proofArtifactPath: `.bitcode/v43-prompt-completeness.json` +- members: depositor instructions, source criticality, demand posture, Reading pipelines +- theoremIds: no-missing-route-prompt, no-raw-prompt-ui-leak +- replayStepIds: prepare-context, run-failsafe, run-thricified, parse-output +- witnessArtifactPaths: V41 prompt artifacts and V43 route prompt artifacts +- current member closure criteria: registry binding and interpolation coverage +- current member verdict shape: prompt id, prompt part ids, parser, redaction verdict +- current theorem-by-theorem closure reading: every inference point resolves through registry primitives +- current theorem-to-replay grouping: prompt route to inference chain +- minimum artifact/replay binding set: prompt ids and parser ids +- current proof-object fields: prompt family, route, disclosure tier +- generated-artifact and test bindings: prompt benchmark checks +- fail-closed conditions: prompt contract incompleteness and protected prompt overexposure + +### Static-code-analysis + +- proofArtifactPath: `.bitcode/v43-static-code-analysis.json` +- members: route rename, component prefix, import casing, dead Exchange references +- theoremIds: packs-name-totality, read-deposit-route-totality +- replayStepIds: scan-routes, scan-components, scan-docs, scan-tests +- witnessArtifactPaths: route vocabulary inventory +- current member closure criteria: no forbidden product route references +- current member verdict shape: file, token, status +- current theorem-by-theorem closure reading: old names are migrated or explicitly retained as historical docs +- current theorem-to-replay grouping: scan family by source kind +- minimum artifact/replay binding set: file path and token +- current proof-object fields: path, matched token, migration status +- generated-artifact and test bindings: Gate 2 checker +- fail-closed conditions: stale promoted status truth and route alias ambiguity + +### Verification-decisions + +- proofArtifactPath: `.bitcode/v43-verification-decisions.json` +- members: deposit option review, Need review, fit selection, settlement review +- theoremIds: human-approval-boundary, no-source-leak-before-pay +- replayStepIds: review-option, accept-need, select-fits, settle-pack +- witnessArtifactPaths: review receipts +- current member closure criteria: every decision stores reason, actor, timestamp, and proof root +- current member verdict shape: accepted, rejected, resynthesize, blocked +- current theorem-by-theorem closure reading: user approval gates value-bearing transitions +- current theorem-to-replay grouping: decision event to state transition +- minimum artifact/replay binding set: actor, decision, state before/after +- current proof-object fields: decision id, actor, route, root +- generated-artifact and test bindings: route/API tests +- fail-closed conditions: authorization denial and invalid deposit + +### Selection-and-materialization + +- proofArtifactPath: `.bitcode/v43-selection-materialization.json` +- members: deposit option groups, selected fit set, AssetPack preview, delivery PR +- theoremIds: source-pack-boundary, paid-delivery-only +- replayStepIds: group-source, rank-fits, generate-preview, deliver-pr +- witnessArtifactPaths: pack activity artifacts +- current member closure criteria: materialized outputs are source-safe before settlement and source-bearing after rights +- current member verdict shape: preview, locked, delivered, repaired +- current theorem-by-theorem closure reading: delivery follows settlement and rights receipt +- current theorem-to-replay grouping: pack id to lifecycle events +- minimum artifact/replay binding set: pack id, storage root, ledger root +- current proof-object fields: pack id, state, proof root +- generated-artifact and test bindings: pack route tests +- fail-closed conditions: no-survivor asset pack and delivery lock mismatch + +### Authorization-and-sensitive-flow + +- proofArtifactPath: `.bitcode/v43-authorization-sensitive-flow.json` +- members: account, organization, repository, wallet, source visibility +- theoremIds: principal-boundary, no-private-key-route +- replayStepIds: authorize-deposit, authorize-read, authorize-settlement, authorize-detail +- witnessArtifactPaths: policy receipts +- current member closure criteria: every sensitive action has policy and redaction proof +- current member verdict shape: allowed, denied, retry-required +- current theorem-by-theorem closure reading: route access is policy-bound +- current theorem-to-replay grouping: action to policy event +- minimum artifact/replay binding set: subject, resource, action +- current proof-object fields: subject, resource, action, decision +- generated-artifact and test bindings: auth tests +- fail-closed conditions: authorization denial and wallet private material visible + +### Settlement-source-to-shares + +- proofArtifactPath: `.bitcode/v43-settlement-source-to-shares.json` +- members: quote, finality, rights transfer, depositor compensation +- theoremIds: btc-conservation, source-share-allocation +- replayStepIds: quote, observe-payment, transfer-rights, allocate-compensation +- witnessArtifactPaths: settlement receipts +- current member closure criteria: paid readback agrees across ledger/database/storage +- current member verdict shape: pending, paid, final, repaired +- current theorem-by-theorem closure reading: exact accounting preserves source-to-shares +- current theorem-to-replay grouping: settlement id to accounting rows +- minimum artifact/replay binding set: quote root, tx root, allocation root +- current proof-object fields: settlement id, btc amount, roots +- generated-artifact and test bindings: BTD tests +- fail-closed conditions: settlement conservation drift + +### Disclosure-boundary + +- proofArtifactPath: `.bitcode/v43-disclosure-boundary.json` +- members: product copy, preview metadata, expanded proof, pack detail +- theoremIds: self-explanatory-without-overdisclosure, unpaid-source-hidden +- replayStepIds: render-collapsed, expand-detail, leak-scan, export-proof +- witnessArtifactPaths: browser and route artifacts +- current member closure criteria: no protected values in source-safe tiers +- current member verdict shape: source-safe, blocked +- current theorem-by-theorem closure reading: clarity cannot be purchased by leaking source +- current theorem-to-replay grouping: route state to visible fields +- minimum artifact/replay binding set: route, tier, field inventory +- current proof-object fields: route, field, disclosure tier +- generated-artifact and test bindings: visual/leak tests +- fail-closed conditions: public projection overexposure + +### Proof-contract + +- proofArtifactPath: `.bitcode/v43-proof-contract.json` +- members: generated artifacts, workflows, promotion readiness +- theoremIds: deterministic-artifact, promotion-readiness +- replayStepIds: generate, check, promote +- witnessArtifactPaths: `.bitcode/v43-spec-family-report.json`, `.bitcode/v43-canonical-input-report.json` +- current member closure criteria: deterministic source-safe artifact generation +- current member verdict shape: passed, failed +- current theorem-by-theorem closure reading: promotion is blocked until every gate is closed +- current theorem-to-replay grouping: gate artifact to workflow proof +- minimum artifact/replay binding set: artifact path and command +- current proof-object fields: path, digest, verdict +- generated-artifact and test bindings: V43 check scripts +- fail-closed conditions: stale promoted status truth + +## V43 generated canon + +### Inherited V19 reproducible-canon artifacts + +Inherited reproducibility remains binding. + +### Inherited V20 operator-quality artifacts + +Inherited operator-quality truth remains binding. + +### Exact generated-artifact inventory matrix + +| artifact | owner | status | +| --- | --- | --- | +| `.bitcode/v43-spec-family-report.json` | spec family | draft-required | +| `.bitcode/v43-canonical-input-report.json` | canonical inputs | draft-required | + +### V43 specifying generated artifacts + +V43 starts with `.bitcode/v43-spec-family-report.json` and `.bitcode/v43-canonical-input-report.json`; later gates add route, pack, deposit, read, UX, rehearsal, and promotion artifacts. + +### Shared generated-artifact fields + +All artifacts include version, schema id, generatedAt, sourceSafetyVerdict, evidence roots, validationCommands, and aggregate proof verdict. + +### Artifact-specific generated payload fields + +V43 artifacts add route ids, pack activity ids, deposit option ids, review decisions, measurement roots, quote roots, settlement roots, delivery roots, and repair roots. + +### Artifact confidentiality and disclosability taxonomy + +Artifacts classify fields as public, user-visible, buyer-visible, reviewer-visible, operator-only, and withheld. They fail closed when protected source, raw prompt, raw provider response, credentials, wallet private material, or unpaid AssetPack source appears in source-safe tiers. + +### Minimum generated appendix rendered contents + +The V43 generated appendix must render aggregate proof verdict, exact proof-family inventory, exact per-family member inventory, exact per-family theorem inventory, exact replay-step inventories and theorem bindings, witness artifact inventories, generated artifact inventories, scenario and run coverage matrices, proof-source commit, and fail closed when required evidence is stale or unsafe. + +### Canonical regeneration and fail-closed posture + +Generation and check commands must be deterministic. Any stale artifact, missing witness, stale promoted status truth, or leak-shaped value fails closed. + +## V43 validation canon + +Gate 1 validates with `pnpm run check:v43-gate1`, `node scripts/check-bitcode-spec-family.mjs --version V43 --mode draft --current-target V42`, `node scripts/check-bitcode-canonical-inputs.mjs --current-target V42`, `node scripts/check-bitcode-canon-posture-drift.mjs --active-canon V42 --draft-target V43`, and `git diff --check`. + +## V43 promotion canon + +V43 promotion must occur only after every gate is implemented, specified, tested, documented, source-safe, rehearsed, and green through maintained workflows. Promotion must create `BITCODE_SPEC_V43_PROVEN.md` and advance `BITCODE_SPEC.txt` to `V43`. + +## V43 appendices and canonical supporting material + +The appendices below make V43 auditable before implementation. + +## Appendix A. Canonical type and surface catalog + +Canonical types include PackActivity, PacksActivityDetail, DepositAssetPackOption, DepositOptionSynthesisRequest, SourceCriticalityDecision, DemandSignalSummary, PositiveRoiPosture, DepositOptionReviewDecision, ReadRouteSession, PackSettlementSummary, PackCompensationSummary, and PackRepairState. + +## Appendix B. Proof family closure catalog + +The proof family closure catalog binds the families above to route, pipeline, storage, ledger, telemetry, and generated proof obligations. + +## Exact proof-family inventory matrix + +| proofFamily | proofArtifactPath | memberIds | theoremIds | replayStepIds | witnessArtifactPaths | Current source basis | +| --- | --- | --- | --- | --- | --- | --- | +| Inference-synthesis | `.bitcode/v43-inference-synthesis.json` | deposit-option-synthesis/read-need/read-fits | source-safe-option-synthesis | synthesize-deposit-options/search-depository | V43 gate artifacts | pipeline packages | +| Prompt-completeness | `.bitcode/v43-prompt-completeness.json` | prompts | no-missing-route-prompt | prepare-context | V41 prompt artifacts | prompt registries | +| Static-code-analysis | `.bitcode/v43-static-code-analysis.json` | route tokens | packs-name-totality | scan-routes | route inventory | source tree | +| Verification-decisions | `.bitcode/v43-verification-decisions.json` | reviews | human-approval-boundary | review-option | decision receipts | route APIs | +| Selection-and-materialization | `.bitcode/v43-selection-materialization.json` | pack lifecycle | paid-delivery-only | deliver-pr | pack activity | asset-pack pipeline | +| Authorization-and-sensitive-flow | `.bitcode/v43-authorization-sensitive-flow.json` | principals | principal-boundary | authorize-read | policy receipts | auth packages | +| Settlement-source-to-shares | `.bitcode/v43-settlement-source-to-shares.json` | settlement | btc-conservation | allocate-compensation | settlement receipts | BTD package | +| Disclosure-boundary | `.bitcode/v43-disclosure-boundary.json` | disclosure | unpaid-source-hidden | leak-scan | browser artifacts | route serializers | +| Proof-contract | `.bitcode/v43-proof-contract.json` | artifacts | deterministic-artifact | promote | spec reports | scripts | + +## Appendix C. Generated artifact contract catalog + +### Inherited V19 reproducible-canon artifacts + +Inherited. + +### Inherited V20 operator-quality artifacts + +Inherited. + +### Exact generated-artifact inventory matrix + +| artifact | field | verdict | +| --- | --- | --- | +| `.bitcode/v43-spec-family-report.json` | aggregate proof verdict | draft-required | +| `.bitcode/v43-canonical-input-report.json` | generated artifact inventories | draft-required | + +### V43 specifying generated artifacts + +`.bitcode/v43-spec-family-report.json` and `.bitcode/v43-canonical-input-report.json` are the opening artifacts. + +### Shared generated-artifact fields + +Version, digest, sourceSafetyVerdict, validationCommands, proof-source commit, and fail closed when stale. + +### Artifact-specific generated payload fields + +Route, pack, deposit option, read, settlement, compensation, delivery, repair, and proof roots. + +### Artifact confidentiality and disclosability taxonomy + +Source-safe metadata only until settlement unlock. + +### Minimum generated appendix rendered contents + +aggregate proof verdict, exact proof-family inventory, exact per-family member inventory, exact per-family theorem inventory, exact replay-step inventories and theorem bindings, witness artifact inventories, generated artifact inventories, scenario and run coverage matrices, proof-source commit, fail closed when stale. + +### Canonical regeneration and fail-closed posture + +Regeneration commands must be deterministic. + +## Appendix D. Validation and checking gate catalog + +Gate checks are `check:v43-gate1` through later V43 gate checks. + +## Appendix E. Current canonical source map + +V43 source work starts from V42 active canon, package protocol state, website route implementations, pipeline packages, BTD packages, and generated proof scripts. + +## Appendix F. Subsystem totality and derivability matrix + +V43 must cover repo supply and depositing; reading and measured demand; prompt/inference/evaluator ownership; deposit-to-read fit; recall and ranking; verification decisions; selection and materialization; branch artifacts and assetPackEvidence; identity, authority, signing, and policy; sensitive data and confidentiality flows; projection, disclosure, and redaction; proof families, members, theorems, witnesses, and replay; settlement, source-to-shares, journals, and exact accounting; telemetry, persistence, state, and failure semantics; host/runtime capability truth; operator experience and pedagogy; validation and test stack; generated artifacts and canonical promotion. + +## Appendix G. Canonical file-family and promotion contract catalog + +V43 files are `BITCODE_SPEC_V43.md`, `BITCODE_SPEC_V43_DELTA.md`, `BITCODE_SPEC_V43_NOTES.md`, `BITCODE_SPEC_V43_PARITY_MATRIX.md`, and later `BITCODE_SPEC_V43_PROVEN.md`. + +## Appendix H. Operator surface and quality contract catalog + +Operator surfaces are `/packs`, `/read`, `/deposit`, retained internal/debug cockpit if any, rich execution stream rows, settlement panels, compensation panels, proof expansion, and repair views. + +## Appendix I. Scenario, workflow, and cross-product contract catalog + +Scenarios include auth-issuer-rollback, privacy-boundary-proof-export, polyglot-gateway-benchmark-remediation, auth-many-asset-normalization, Targeted deposit, Normalization deposit, patch, context, public, buyer, reviewer, internal, Openly writable, Measurably readable, Provable, and Valuable. + +## Appendix J. Fail-closed contract and error posture matrix + +V43 fails closed on invalid deposit, prompt contract incompleteness, parsed-envelope inadmissibility, no-survivor asset pack, authorization denial, public projection overexposure, settlement conservation drift, and stale promoted status truth. + +## Appendix K. Source-bearing AssetPack and artifact contract catalog + +Source-bearing artifacts include `.bitcode/asset-pack.lock.json`, `.bitcode/selected-source-material.json`, `.bitcode/verification-report.json`, `.bitcode/source-to-shares.json`, `.bitcode/projection-policy.json`, `.bitcode/system-proof-bundle.json`, and `BITCODE_SPEC_V43_PROVEN.md`. + +## V43 accepted boundaries and reopen conditions + +V43 may reopen route names, product state, pack activity, deposit option synthesis, UX layout, and proof surfaces. It may not reopen BTD supply law, BTC settlement conservation, source-to-shares accounting, source-safe disclosure, or demonstration/commercial boundary rules without an explicit later canon. + +## V43 completion condition + +V43 completes when `/packs`, `/read`, and `/deposit` are the default product paths; agentic deposit AssetPack option synthesis is specified and implemented; pack activity is searchable and inspectable; Reading remains settlement-gated and source-safe; UX is self-explanatory and polished; local/staging rehearsal proves the full cross-route path; and promotion readiness advances Bitcode to active V43 / draft V44. diff --git a/BITCODE_SPEC_V43_DELTA.md b/BITCODE_SPEC_V43_DELTA.md new file mode 100644 index 00000000..1aac0161 --- /dev/null +++ b/BITCODE_SPEC_V43_DELTA.md @@ -0,0 +1,48 @@ +# Bitcode Spec V43 Delta + +## Status + +- Version: `V43` +- V43 state: draft opened over promoted V42 for product-route cleanup and agentic deposit AssetPack option synthesis +- Current canonical/latest target: `V42` +- Prior canonical anchor: `BITCODE_SPEC_V42.md` +- Prior generated proof appendix: `BITCODE_SPEC_V42_PROVEN.md` +- Generated structured artifact inventory: `.bitcode/v43-spec-family-report.json`, `.bitcode/v43-canonical-input-report.json`, and V43 gate artifacts as introduced +- Source parity state: Gate 1 opens V43 specification and validation posture; implementation parity is gate-scoped + +## Why V43 exists + +V42 proved the reliable MVP path, but the product route vocabulary is still transitional. V43 exists to make the commercial website experience match Bitcode's actual protocol objects: AssetPacks in and AssetPacks out, Reading through a clear `/read` path, Depositing through a clear `/deposit` path, and all activity through a searchable `/packs` surface. + +## Accepted V43 decisions + +1. `/exchange` becomes `/packs` across route names, component prefixes, tests, docs, telemetry labels, and operator vocabulary. +2. `/terminal` splits into `/read` and `/deposit` as the default product paths; retained cockpit/debug surfaces must not be the main experience. +3. `/packs` becomes the master-detail table for all pack activity, with search, filtering, sorting, and source-safe detail expansion. +4. `/deposit` gains agentic deposit AssetPack option synthesis from connected source, depositor instructions, Depository state, and Reading demand. +5. Deposit options must expose source-safe measurements, sub-criticality, demand, likely ROI, BTD potential, compensation posture, and admission blockers before approval. +6. `/read` remains the five-step Reading path: request read, review synthesized Need, request Finding Fits, review source-safe AssetPack preview, settle/buy/deliver. +7. Product UX outside public documentation must be self-explanatory through structure, labels, progressive detail, rich components, and visual quality, not self-referential copy. + +## Explicitly deferred + +- Value-bearing mainnet admission remains gated by a later canon. +- Advanced conversational overlays are not the default V43 route experience unless a gate explicitly scopes them. +- BTD supply law, BTC settlement conservation, source-to-shares accounting, and unpaid source disclosure boundaries remain inherited from V42/V27. + +## Pre-Implementation Sequence + +1. Open V43 spec family, roadmap, checker, package script, and workflow posture. +2. Inventory current Exchange/Terminal naming and define route migration. +3. Implement `/packs` data contracts and searchable master-detail. +4. Extract `/read` from Terminal into the default Reading path. +5. Implement `/deposit` and agentic deposit AssetPack option synthesis. +6. Add criticality, demand, ROI, BTD potential, and compensation policy. +7. Close deposit option review/admission and pack activity synchronization. +8. Run UX/UI excellence pass and remove self-referential product copy. +9. Rehearse cross-route local/staging-testnet path. +10. Close promotion readiness. + +## Commit-Body Direction + +V43 gate commits should state the route/product surface changed, the protocol objects preserved, the proof/test commands run, and the source-safety boundaries maintained. Gate PR titles must begin with `V43 Gate N:`. diff --git a/BITCODE_SPEC_V43_NOTES.md b/BITCODE_SPEC_V43_NOTES.md new file mode 100644 index 00000000..41f2948c --- /dev/null +++ b/BITCODE_SPEC_V43_NOTES.md @@ -0,0 +1,49 @@ +# Bitcode Spec V43 Notes + +## Status + +- Version: `V43` +- V43 state: draft notes opened for product-route cleanup, pack activity, agentic deposit options, and enterprise UX +- Current canonical/latest target: `V42` +- Prior canonical anchor: `BITCODE_SPEC_V42.md` +- Prior generated proof appendix: `BITCODE_SPEC_V42_PROVEN.md` +- Generated structured artifact inventory: `.bitcode/v43-spec-family-report.json`, `.bitcode/v43-canonical-input-report.json`, and future V43 gate artifacts +- Source parity state: notes define operating memory for V43 gates; implementation parity is pending gate work + +## Notes companion rule + +These notes clarify V43 only. The active canon remains V42 until V43 promotion. + +## Concise current-system reading + +V42 made the reliable MVP path real enough to refine product shape. V43 should now remove transitional vocabulary and make the primary enterprise experience: + +- `/deposit`: connect source, synthesize deposit AssetPack options, review source-safe measurements and demand/ROI posture, approve or reject Depository admission. +- `/read`: request technical knowledge, review synthesized Need, request Finding Fits, preview source-safe AssetPack measurements, settle in BTC/BTD, receive repository delivery. +- `/packs`: inspect and search all pack activity, including deposit options, Depository admission, previews, settlement, rights transfer, compensation, delivery, proof roots, and repair states. + +The strongest simplification is AssetPacks in and AssetPacks out. Depositing creates AssetPacks for the Depository; Reading buys synthesized Need-Fit AssetPacks. + +## Simplified-spec reading rule + +When V43 work feels broad, reduce it to the route law: + +1. Packs is activity and inspection. +2. Read is buying source-bearing technical knowledge after Need review and settlement. +3. Deposit is selling source-derived AssetPack options only after depositor review and approval. +4. Source is never disclosed before settlement and rights transfer. +5. The UI should explain itself through the workflow, not through in-app essays. + +## V43 UX/product note + +The current UX is not good enough. V43 should keep strong themed components where they work, especially execution-log rows and proof expansion, but replace confusing cockpit flow with direct route paths and dense, legible master-detail surfaces. + +The `/packs` master table must support search over measurements, synthesized titles and descriptions, values, activity/transaction type, settlement state, compensation posture, proof roots, and repair state. + +## V43 agentic deposit note + +The deposit-side pipeline should help an enterprise decide what IP to sell. It should compare connected source, Depository supply, and Reading demand. It should propose multiple deposit AssetPack options, reject or warn on critical IP, estimate positive ROI where possible, expose BTD potential as an estimate only, and preserve final BTD mint/right law for paid Need-Fit settlement. + +## V43 copy boundary + +Outside public docs, avoid self-referential copy such as text explaining that a component is powerful or that Bitcode is doing a thing. Use clear route names, labels, status rows, measurement summaries, empty states, and expandable proof metadata. Public docs may explain the protocol; product UI should operate it. diff --git a/BITCODE_SPEC_V43_PARITY_MATRIX.md b/BITCODE_SPEC_V43_PARITY_MATRIX.md new file mode 100644 index 00000000..2a25e175 --- /dev/null +++ b/BITCODE_SPEC_V43_PARITY_MATRIX.md @@ -0,0 +1,52 @@ +# Bitcode Spec V43 Parity Matrix + +## Status + +- Version: `V43` +- V43 state: draft parity matrix opened over active V42 +- Current canonical/latest target: `V42` +- Prior canonical anchor: `BITCODE_SPEC_V42.md` +- Prior generated proof appendix: `BITCODE_SPEC_V42_PROVEN.md` +- Generated structured artifact inventory: `.bitcode/v43-spec-family-report.json`, `.bitcode/v43-canonical-input-report.json`, and future V43 gate artifacts +- Source parity state: V43 Gate 1 parity is documentation/workflow posture; implementation parity is pending + +## Purpose + +This matrix tracks V43 parity from product-route specification through source implementation, tests, generated artifacts, and promotion readiness. + +## Audit basis + +Audit V43 against `BITCODE_SPEC_V43.md`, V42 active canon, route source, package source, generated artifacts, workflow checks, and local/staging rehearsal receipts. + +## V43 implementation matrix + +| Area | Required V43 result | Source evidence | Judgment | +| --- | --- | --- | --- | +| Gate 1 roadmap | Active V42 / draft V43 posture, route vocabulary, gate plan, docs, checker, workflows | `BITCODE_SPEC_V43.md`, `scripts/check-v43-gate1-packs-read-deposit-roadmap.mjs` | drafted | +| Route vocabulary | `/exchange` renamed to `/packs`; `/terminal` split into `/read` and `/deposit` default paths | future Gate 2 artifact | draft-required | +| Packs master-detail | Searchable, sortable, filterable pack activity table and source-safe detail route | future Gate 3 artifact | draft-required | +| Read route | Five-step Reading UX owns Read Request through settlement/delivery | future Gate 4 artifact | draft-required | +| Deposit route | Connected-source deposit AssetPack option synthesis and review | future Gate 5 artifact | draft-required | +| Criticality/ROI policy | Source criticality, demand, ROI, BTD potential, and compensation posture | future Gate 6 artifact | draft-required | +| Admission sync | Approved deposit options enter Depository and `/packs` activity | future Gate 7 artifact | draft-required | +| UX excellence | Self-explanatory, polished, progressive-detail UI without self-referential product copy | future Gate 8 artifact | draft-required | +| Rehearsal | Local/staging-testnet cross-route path verifies deposit, read, packs, settlement, compensation, delivery | future Gate 9 artifact | draft-required | +| Promotion readiness | V43 generated proof and active V43 / draft V44 posture ready | future Gate 10 artifact | draft-required | + +## V43 implementation checklist + +| Area | Closure requirement | Current judgment | +| --- | --- | --- | +| Specification family | V43 SPEC, DELTA, NOTES, PARITY files exist and pass spec-family check | drafted | +| Package script | `check:v43-gate1` exists | drafted | +| Workflows | Gate/canon quality know active V42 / draft V43 | drafted | +| Documentation | README and roadmap name V43 route/product scope | drafted | +| Implementation | Route and pipeline source changes are not part of Gate 1 | accepted boundary | + +## V43 accepted boundaries + +Gate 1 is allowed to specify and wire validation posture only. It must not rename application routes or add deposit option synthesis behavior before the migration inventory is complete. + +## V43 completion condition + +The matrix is complete when every V43 gate row is closed with source, tests, documentation, generated artifacts, and promotion proof. diff --git a/README.md b/README.md index 2b35ed1b..ee372b7e 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,24 @@ # Bitcode Repository `BITCODE_SPEC.txt` is the canonical pointer for active-system work. It currently -resolves to `V41`; V42 is the active draft target for reliable MVP product -experience after the promoted Prompt and PromptPart excellence canon. +resolves to `V42`; V43 is the active draft target for the Packs, Read, Deposit +route model, agentic deposit AssetPack options, and product UX cleanup after the +promoted reliable MVP experience canon. ## Current Product Posture Bitcode is the protocol and the commercial source tree implements it in-place. -The primary operator routes are: +The promoted V42 operator route is still: - `/terminal` for depositing, reading, transaction work, and protocol follow-through. - `/auxillaries` for Wallet, Externals, Profile, and Interfaces support surfaces. +The active V43 draft target moves the primary enterprise routes to: + +- `/packs` for searchable master-detail pack activity. +- `/read` for the five-step Reading path from Read Request to settlement-gated delivery. +- `/deposit` for connected-source deposit AssetPack option synthesis, review, and admission. + V41 Gate 1 opens the prompts-as-programs specification family over active V40 with `check:v41-gate1`. V41 will catalogue every raw PromptPart and composed Prompt, map registry composition and interpolation contracts, benchmark Reading @@ -155,13 +162,14 @@ V42 Gate 9 adds promotion readiness with `buildV42PromotionReadinessReport`, The report binds every V42 product artifact, workflow posture, promotion script, generated proof path, source-safety result, value-bearing mainnet block, and post-promotion V42 active / draft V43 runtime preparation. -V43+ is roadmapped as the later agentic depositing evolution: repository +V43 Gate 1 opens the Packs, Read, Deposit roadmap over active V42 with +`check:v43-gate1`. V43 owns the agentic depositing evolution: repository agents synthesize deposit AssetPack options from connected enterprise code, Depository state, and Reading demand; enterprises approve or reject sub-critical positive-ROI options; `/terminal` separates into `/read` and `/deposit`; and `/exchange` is renamed to `/packs` across routes, component -prefixes, tests, docs, and product naming. -That future route model treats AssetPacks as the product object in and out: +prefixes, tests, docs, telemetry labels, and product naming. +The V43 route model treats AssetPacks as the product object in and out: `/deposit` proposes deposit AssetPack options from source and Bitcode demand, `/read` buys synthesized Need-Fit AssetPacks, and `/packs` becomes the searchable master-detail activity surface for pack measurements, values, diff --git a/SPECIFICATIONS_ROADMAP.md b/SPECIFICATIONS_ROADMAP.md index ff782696..d6aa197d 100644 --- a/SPECIFICATIONS_ROADMAP.md +++ b/SPECIFICATIONS_ROADMAP.md @@ -2,12 +2,13 @@ ## Status -- Current active canonical pointer: `BITCODE_SPEC.txt` -> `V41` -- Current active canon: `BITCODE_SPEC_V41.md` -- Current draft target: `BITCODE_SPEC_V42.md`. -- Current working gate: V42 Gate 9 Promotion Readiness. -- Next queued work after V42 Gate 9: V42 canonical promotion pull request into `main`. -- Latest closed version: V41 Prompt And PromptPart Excellence, which promoted PromptPart and Prompt inventory, registry interpolation contracts, Reading prompt baselines, ReadNeedComprehensionSynthesis prompt hardening, ReadFitsFindingSynthesis prompt hardening, Conversation/tool/interface prompt rewrite, prompt benchmark telemetry, and V41 promotion readiness. +- Current active canonical pointer: `BITCODE_SPEC.txt` -> `V42` +- Current active canon: `BITCODE_SPEC_V42.md` +- Current draft target: `BITCODE_SPEC_V43.md`. +- Current working gate: V43 Gate 1 Packs, Read, Deposit Roadmap And Spec Opening. +- Next queued work after V43 Gate 1: route-vocabulary inventory and migration planning for `/exchange` to `/packs` and `/terminal` split into `/read` and `/deposit`. +- Latest closed version: V42 Reliable MVP Experience, which promoted shortest-path Depositing, five-step Reading, ReadNeed review/resynthesis, ReadFitsFinding source-safe preview and quote, settlement rights transfer, repository delivery, AI-reading demonstration, local/staging MVP rehearsal, and V42 promotion readiness. +- Recent V42 canonical promotion anchor: V42 canonical promotion updated `BITCODE_SPEC.txt` to `V42`, generated `BITCODE_SPEC_V42_PROVEN.md`, preserved active V42 / draft V43 runtime posture, and closed reliable MVP experience canon. - Recent V42 opening anchor: reliable MVP experience opens over promoted V41 with V42 SPEC, DELTA, NOTES, and PARITY files, `check:v42-gate1`, active V41 / draft V42 posture, and a nine-gate plan for shortest-path Depositing, five-step Reading, ReadNeed product closure, ReadFitsFinding preview and quote closure, settlement and repository delivery, AI-reading demonstration, local/staging rehearsal, and promotion readiness. - V42 Gate 2 closure anchor: reliable MVP experience now owns source-safe Depositing compensation visibility through `DepositorySupplyCompensationPreview`, deposit route `depositoryEvidence.compensationPreview`, deterministic `.bitcode/v42-depositing-shortest-path.json`, route/API readiness checks, source validation, Depository search/vector/storage projection, source-to-shares compensation readback keys, Terminal compensation roots, focused package/protocol tests, workflow wiring, and `check:v42-gate2`. - V42 Gate 3 closure anchor: reliable MVP experience now owns the five-step Reading shortest path state machine through `TerminalEnterpriseReadingUxState`, `TerminalEnterpriseReadingRouteState`, recoverable transaction ids, `readingStage` route hydration, retry/restart posture, source-safe failure repair actions, accepted-Need blockers, source-safe preview blockers, rich Reading pipeline telemetry readback, deterministic `.bitcode/v42-reading-shortest-path-state-machine.json`, focused route/component/protocol tests, workflow wiring, and `check:v42-gate3`. @@ -43,9 +44,8 @@ - V41 Gate 7 closure anchor: prompt-program work now owns package-backed `V41ConversationToolInterfacePromptRewrite` source, deterministic `.bitcode/v41-conversation-tool-interface-prompt-rewrite.json`, 9 source-safe rewrite rows, 60 passing source predicates, Conversation PTRR PromptPart rewrites, Terminal conversation system prompt boundaries, rich execution-log prompt/result disclosure, DocCodeToolPrompt and ToolPromptRegistry hierarchy, MCP API/public API contract prompt posture, ChatGPT App action/tool prompt posture, Terminal/public summary source-safety, Gate 2 through Gate 6 dependency roots, V38 Conversation/tool parity binding, protocol tests, workflow wiring, and `check:v41-gate7`. - V41 Gate 8 closure anchor: prompt-program work now owns package-backed `V41PromptProgramBenchmarkReport` source, deterministic `.bitcode/v41-prompt-program-benchmark-report.json`, 9 source-safe benchmark telemetry rows, post-rewrite PromptPart and Prompt deltas, benchmark fixture projections, prompt registry lineage, V38 PromptBenchmark/Failsafe/Thricified/inference telemetry roots, V39 operational repair readback roots, V40 prompt benchmark smoke roots, V41 Gate 2 through Gate 7 dependency roots, rich execution-log telemetry projections, repair hook and parsed-output redaction posture, protocol tests, workflow wiring, and `check:v41-gate8`. - V41 Gate 9 closure anchor: prompt-program work now owns package-backed `V41PromotionReadinessReport` source, deterministic `.bitcode/v41-promotion-readiness-report.json`, `BITCODE_SPEC_V41_PROVEN.md` generation support, `v41-canon-promotion.yml`, promotion command dry-run support, gate/canon workflow posture, active V41 / draft V42 runtime preparation, all V41 prompt-program artifacts covered, source-safe, parseable, and workflow-bound, and value-bearing mainnet admission blocked through `check:v41-gate9`. -- Forward planning note: V42 focuses on the reliable MVP product experience after V41's prompt-program hardening. Depositing should become the shortest path to adding any source material, proving its Depository admission, and later receiving BTC compensation when that deposit contributes to a synthesized AssetPack. Reading should become the shortest path to submitting a Read Request, reviewing or resynthesizing Bitcode's synthesized Need, requesting Finding Fits, reviewing source-safe AssetPack measurements and preview metadata, buying the AssetPack through BTD/BTC settlement semantics, and receiving post-settlement repository delivery. The demonstration should be AI-reading dominant: any deposit source can contribute proprietary or otherwise non-public training, prompt, context, or evaluation material to an AssetPack that measurably improves an AI system beyond a public-data-only baseline. -- Forward planning note: V43+ should evolve the deposit side into an agentic AssetPack option experience for enterprises that own connected codebases. Bitcode Agents installed on an enterprise repository should compare the repository, the current Bitcode Depository, and current Reading activity to propose deposit AssetPack options: unminted AssetPacks in all but BTD that can later become BTD only when a Reader's industrial Need-Fit mints one. The deposit pipeline should optimize for enterprise IP governance by filtering out critical IP, estimating whether selling would be positive ROI against development cost and expected Read demand, and presenting everything else as approve/reject deposit options. The product route plan for that version is to split `/terminal` into `/read` for Reading and `/deposit` for agentic deposit AssetPack option review, and to rename `/exchange` to `/packs` across routes, component prefixes, tests, docs, and product vocabulary. -- Forward planning note: V43+ should treat AssetPacks as the in/out simplification for the product. Depositing turns connected source plus depositor instructions plus Bitcode's observed Needs into deposit AssetPack options for approval; Reading turns an accepted Need plus many fitted Depository AssetPacks into a source-safe preview, quote, settlement, rights transfer, and repository delivery. `/packs` should replace Exchange naming as the master-detail activity route: the master view is a searchable, sortable, filterable table over activity, synthesized AssetPack titles/descriptions, measurements, values, transaction types, settlement posture, and compensation state; the detail view shows the selected activity with expandable proof, ledger, telemetry, and payload readback. Product surfaces outside public documentation should avoid self-referential explanatory copy and instead make the core actions self-evident through route structure, labels, progressive detail, and proof-on-expand. +- Forward planning note: V43 is the active agentic deposit-side and route-product cleanup version after V42's reliable MVP promotion. Bitcode Agents installed on an enterprise repository should compare the repository, the current Bitcode Depository, and current Reading activity to propose deposit AssetPack options: unminted AssetPacks in all but BTD that can later become BTD only when a Reader's industrial Need-Fit mints one. The deposit pipeline should optimize for enterprise IP governance by filtering out critical IP, estimating whether selling would be positive ROI against development cost and expected Read demand, and presenting everything else as approve/reject deposit options. +- Forward planning note: V43 treats AssetPacks as the in/out simplification for the product. Depositing turns connected source plus depositor instructions plus Bitcode's observed Needs into deposit AssetPack options for approval; Reading turns an accepted Need plus many fitted Depository AssetPacks into a source-safe preview, quote, settlement, rights transfer, and repository delivery. `/packs` replaces Exchange naming as the master-detail activity route: the master view is a searchable, sortable, filterable table over activity, synthesized AssetPack titles/descriptions, measurements, values, transaction types, settlement posture, and compensation state; the detail view shows the selected activity with expandable proof, ledger, telemetry, and payload readback. Product surfaces outside public documentation should avoid self-referential explanatory copy and instead make the core actions self-evident through route structure, labels, progressive detail, and proof-on-expand. - V34 Gate 2 closure anchor: deployment-depth now owns package-backed `DeploymentHostCapabilityCatalog` and `EnvironmentLaneContract` source, deterministic `.bitcode/v34-deployment-host-capability-catalog.json` and `.bitcode/v34-environment-lane-contracts.json`, and visible `value-bearing-mainnet` blocking through `blocked_future_canon_required`. - V34 Gate 3 closure anchor: deployment-depth now owns package-backed `DistributedExecutionRuntimeReceipt` source, deterministic `.bitcode/v34-distributed-execution-runtime-receipts.json`, `request_response_not_required` long-running work posture, and source-safe roots for pipeline, PTRR agent, ThricifiedGeneration, tool, ledger, wallet, proof, object-storage, and repair work. - V34 Gate 4 closure anchor: deployment-depth now owns package-backed `DeploymentStoragePosture` source, deterministic `.bitcode/v34-deployment-storage-posture.json`, ledger/database/object-storage drift repair fixtures, retention/encryption/backup/rollback/audit posture, and source-bearing AssetPack storage remains locked before settlement. @@ -116,9 +116,9 @@ They are referenced here for specification history only; active implementation w ## Source Families - Legacy ENGI specifications: `_legacy/ENGI_SPEC_V1.md` through `_legacy/ENGI_SPEC_V25.md`, with companion `NOTES`, `DELTA`, `PARITY_MATRIX`, `SYSTEM_PARITY_MATRIX`, `PROVEN`, and audit files where present. -- Active Bitcode specifications: `BITCODE_SPEC_V41.md`, with companion `DELTA`, `NOTES`, `PARITY_MATRIX`, and `PROVEN` files. -- Promoted Bitcode history: `BITCODE_SPEC_V26.md` through `BITCODE_SPEC_V40.md`, with companion `DELTA`, `NOTES`, `PARITY_MATRIX`, and `PROVEN` files. -- Draft and future Bitcode specifications: `BITCODE_SPEC_V42.md`, with companion `DELTA`, `NOTES`, and `PARITY_MATRIX` files, as the active draft target over promoted V41; planned V43+ follows V42 as the agentic deposit-side AssetPack option and route-split evolution. +- Active Bitcode specifications: `BITCODE_SPEC_V42.md`, with companion `DELTA`, `NOTES`, `PARITY_MATRIX`, and `PROVEN` files. +- Promoted Bitcode history: `BITCODE_SPEC_V26.md` through `BITCODE_SPEC_V41.md`, with companion `DELTA`, `NOTES`, `PARITY_MATRIX`, and `PROVEN` files. +- Draft and future Bitcode specifications: `BITCODE_SPEC_V43.md`, with companion `DELTA`, `NOTES`, and `PARITY_MATRIX` files, as the active draft target over promoted V42; planned V44+ follows V43 after route cleanup, pack activity, and agentic deposit option synthesis. - Specification discipline references: `BITCODE_SPECIFYING.md` and `BITCODE_SPEC_TEMPLATEGUIDE.md`. ## Roadmap @@ -165,9 +165,9 @@ They are referenced here for specification history only; active implementation w | V38 | `BITCODE_SPEC_V38.md` | promoted historical Bitcode canon | Inference correctness after V37: pipeline execution call stack, PTRR agents, FailsafeGenerationSequence over ThricifiedGeneration, prompt registry composition, PromptPart and Prompt benchmarking, Reading pipeline inference, ReadFitsFindingSynthesis depository search and embeddings, source-safe inference telemetry, local/staging rehearsal, and promotion readiness. | | V39 | `BITCODE_SPEC_V39.md` | promoted historical Bitcode canon | Commercial Reading readiness after V38: Depository supply indexing, enterprise five-step Reading UX, ReadNeed review/resynthesis, ReadFitsFinding many-candidate runtime and replay, source-safe AssetPack preview and deterministic BTC quote, settlement, BTD rights transfer, post-settlement delivery, ledger/database/storage synchronization, operational telemetry/repair, interface parity, local/staging rehearsal, and promotion readiness. | | V40 | `BITCODE_SPEC_V40.md` | promoted historical Bitcode canon | Exhaustive commercial application testing depth after V39: rich browser E2E for all website interactions and state possibilities, visual/screenshot comparison coverage, API and integration suites for pipelines, conversations, routes, ledger/database/storage synchronization, unit coverage for packages, primitives, isolated implementations, real commercial implementations, local/staging rehearsal automation, prompt benchmark smoke, and promotion readiness. | -| V41 | `BITCODE_SPEC_V41.md` | active canon | Prompt and PromptPart excellence, treating prompts as programs: audit every raw PromptPart and composed Prompt, run and harden benchmarks, repartition prompts into meaningfully benchmarkable semantic parts, retitle and rewrite PromptParts/Prompts where optimal, catalogue registry bindings, interpolation contracts, benchmark fixtures, benchmark outputs, inference callsites, and parsed return types, and elevate all Reading and Conversation inference points after V38 inference scaffolding and V40 testing depth make that work measurable. The primary surface is Reading, especially `ReadNeedComprehensionSynthesis` and `ReadFitsFindingSynthesis`; conversations and other inference prompts follow with the same benchmarkable catalogue discipline. | -| V42 | `BITCODE_SPEC_V42.md` | active draft target | Reliable MVP experience after V41 prompt hardening: shortest-path Depositing for any source material with Depository admission proof and later BTC compensation when deposits contribute to synthesized AssetPacks; shortest-path Reading for Read Request submission, synthesized Need review/resynthesis, Finding Fits, source-safe AssetPack measurement/preview review, BTD/BTC purchase and settlement, and repository delivery; and an AI-reading dominant demonstration proving an AssetPack can improve an AI system's training, prompt/context, or evaluation performance beyond public-data-only baselines using proprietary or otherwise non-public deposit and read materials. | -| V43+ | future specification family | planned future | Agentic enterprise deposit-side AssetPack option synthesis and broad UX cleanup after the MVP paths are reliable: repository-installed Bitcode Agents compare a connected enterprise codebase, the Bitcode Depository, and Reading activity to propose deposit AssetPack options for review; filter out critical IP; estimate positive ROI against development cost and likely demand; let enterprises approve/reject options for Depository admission; split `/terminal` into `/read` and `/deposit`; and rename `/exchange` to `/packs` throughout product routes, code naming, docs, component prefixes, tests, and operator vocabulary. `/packs` becomes the searchable master-detail activity surface for all pack activity, with column sort/filter/search over measurements, synthesized AssetPack titles and descriptions, values, activity/transaction type, settlement posture, compensation, proof roots, and repair state. `/deposit` and `/read` become the short core paths into and out of the Depository. Outside public docs, product UX should be self-explanatory through route structure, concise labels, progressive detail, and rich reusable themed components rather than self-referential instructional copy. | +| V41 | `BITCODE_SPEC_V41.md` | promoted historical Bitcode canon | Prompt and PromptPart excellence, treating prompts as programs: audit every raw PromptPart and composed Prompt, run and harden benchmarks, repartition prompts into meaningfully benchmarkable semantic parts, retitle and rewrite PromptParts/Prompts where optimal, catalogue registry bindings, interpolation contracts, benchmark fixtures, benchmark outputs, inference callsites, and parsed return types, and elevate all Reading and Conversation inference points after V38 inference scaffolding and V40 testing depth make that work measurable. The primary surface is Reading, especially `ReadNeedComprehensionSynthesis` and `ReadFitsFindingSynthesis`; conversations and other inference prompts follow with the same benchmarkable catalogue discipline. | +| V42 | `BITCODE_SPEC_V42.md` | active canon | Reliable MVP experience after V41 prompt hardening: shortest-path Depositing for any source material with Depository admission proof and later BTC compensation when deposits contribute to synthesized AssetPacks; shortest-path Reading for Read Request submission, synthesized Need review/resynthesis, Finding Fits, source-safe AssetPack measurement/preview review, BTD/BTC purchase and settlement, and repository delivery; and an AI-reading dominant demonstration proving an AssetPack can improve an AI system's training, prompt/context, or evaluation performance beyond public-data-only baselines using proprietary or otherwise non-public deposit and read materials. | +| V43 | `BITCODE_SPEC_V43.md` | active draft target | Agentic enterprise deposit-side AssetPack option synthesis and broad UX cleanup after V42 reliable MVP paths: repository-installed Bitcode Agents compare a connected enterprise codebase, the Bitcode Depository, and Reading activity to propose deposit AssetPack options for review; filter out critical IP; estimate positive ROI against development cost and likely demand; let enterprises approve/reject options for Depository admission; split `/terminal` into `/read` and `/deposit`; and rename `/exchange` to `/packs` throughout product routes, code naming, docs, component prefixes, tests, and operator vocabulary. `/packs` becomes the searchable master-detail activity surface for all pack activity, with column sorting/filtering/search over measurements, synthesized AssetPack titles and descriptions, values, activity/transaction type, settlement posture, compensation, proof roots, and repair state. `/deposit` and `/read` become the short core paths into and out of the Depository. Outside public docs, product UX should be self-explanatory through route structure, concise labels, progressive detail, and rich reusable themed components rather than self-referential instructional copy. | ## Current Planning Spine @@ -187,15 +187,15 @@ They are referenced here for specification history only; active implementation w 14. V39 promoted commercial Reading readiness: Depository supply indexing, enterprise Reading UX, accepted-Need-gated Finding Fits, AssetPack preview/quote, settlement, rights transfer, delivery, telemetry/repair, interface parity, local/staging rehearsal, and promotion readiness. 15. V40 promoted exhaustive testing for the rich commercial application: E2E, visual, screenshot comparison, interaction/state matrices, integration, unit coverage, ledger/storage synchronization, local/staging rehearsal automation, and prompt benchmark smoke across the website, APIs, pipelines, conversations, packages, primitives, and real implementations. 16. V41 promoted prompts-as-programs after V40: every PromptPart, Prompt composition, benchmark, meaningfully benchmarkable semantic division, title, template, interpolation contract, registry binding, inference callsite, benchmark result, and parsed return type was examined and improved across Reading and Conversation inference, using V38's inference correctness scaffolding and V40's testing/benchmarking depth as the measurement base. -17. V42 is the active reliable MVP experience draft after V41: refine the shortest path to Depositing any source material and later receiving BTC compensation, refine the shortest path to Reading from request through synthesized Need review/resynthesis, Finding Fits, source-safe AssetPack preview, BTD/BTC purchase, settlement, and repository delivery, and ship a strong AI-reading dominant demonstration where Bitcode reads non-public technical intelligence into an AssetPack that measurably improves an AI system beyond a public-data-only baseline. -18. V43+ is planned as the agentic deposit-side product evolution after the MVP paths are reliable: enterprises should get deposit AssetPack options synthesized from their connected repositories and Bitcode's observed Depository/Reading demand, then approve or reject source-safe, sub-critical, positive-ROI options for Depository admission. +17. V42 promoted the reliable MVP experience after V41: shortest-path Depositing with later BTC compensation, five-step Reading from request through synthesized Need review/resynthesis, Finding Fits, source-safe AssetPack preview, BTD/BTC purchase, settlement, repository delivery, and a strong AI-reading dominant demonstration where Bitcode reads non-public technical intelligence into an AssetPack that measurably improves an AI system beyond a public-data-only baseline. +18. V43 is the active agentic deposit-side and route-product cleanup draft after the MVP paths became reliable: enterprises should get deposit AssetPack options synthesized from connected repositories and Bitcode's observed Depository/Reading demand, then approve or reject source-safe, sub-critical, positive-ROI options for Depository admission; `/terminal` splits into `/read` and `/deposit`, and `/exchange` becomes `/packs`. ## Boundary Rules - Do not treat `_legacy/` ENGI specifications as active implementation authority. - Do use `_legacy/` specifications to understand why current Bitcode concepts exist and what must not regress. -- V42+ work must build on V41 active canon and V27 `$BTD` law unless a future promoted spec explicitly supersedes it. -- V42 is the active draft target for reliable MVP experience; Gate 1 is specification/documentation/workflow posture only and later gates own implementation. -- V43+ agentic depositing, `/read` and `/deposit` route separation, `/packs` renaming, searchable pack activity master-detail, and deposit AssetPack option synthesis are roadmap/planning only until a later version explicitly opens them; V42 remains scoped to reliable MVP Depositing, Reading, settlement, delivery, and AI-reading demonstration. +- V43 work must build on V42 active canon and V27 `$BTD` law unless a future promoted spec explicitly supersedes it. +- V43 is the active draft target for agentic deposit-side AssetPack option synthesis, `/read` and `/deposit` route separation, `/packs` renaming, searchable pack activity master-detail, and UX/product cleanup. +- V43 Gate 1 is specification/documentation/workflow posture only; later V43 gates own route migration, data models, pipelines, UI implementation, rehearsal, and promotion. - No implementation route should be versioned by spec number; source should move in place with the active canon. - Future notes files are planning memory only until their version is explicitly opened as the draft-target SPEC family. diff --git a/package.json b/package.json index 343947f5..ec793b07 100644 --- a/package.json +++ b/package.json @@ -329,6 +329,7 @@ "generate:v42-promotion-readiness": "node scripts/generate-v42-promotion-readiness-report.mjs", "check:v42-promotion-readiness": "node scripts/generate-v42-promotion-readiness-report.mjs --check", "check:v42-gate9": "node scripts/check-v42-gate9-promotion-readiness.mjs", + "check:v43-gate1": "node scripts/check-v43-gate1-packs-read-deposit-roadmap.mjs", "generate:v38-inference-surface-inventory": "node scripts/generate-v38-inference-surface-inventory.mjs", "check:v38-inference-surface-inventory": "node scripts/generate-v38-inference-surface-inventory.mjs --check", "check:v38-gate2": "node scripts/check-v38-gate2-inference-surface-inventory.mjs", diff --git a/packages/protocol/README.md b/packages/protocol/README.md index 2a3efb55..18e32a0c 100644 --- a/packages/protocol/README.md +++ b/packages/protocol/README.md @@ -66,6 +66,12 @@ Current exported commercial helpers include: - canonical proven-generation helpers; - the package app/server context used by commercial interfaces. +V43 Gate 1 opens the Packs, Read, Deposit draft over `V42` active, `V43` +draft posture. It specifies `/exchange` to `/packs`, `/terminal` separation +into `/read` and `/deposit`, agentic deposit AssetPack option synthesis, +searchable pack activity master-detail, source-safe option review, and product +UX cleanup through `check:v43-gate1`. + Historical V39 promotion moved this package through the `V39` active, `V40` draft posture. V40 promotion has since advanced the current package posture to `V40` active, `V41` draft. diff --git a/protocol-demonstration/README.md b/protocol-demonstration/README.md index 241a82ff..14f303f8 100644 --- a/protocol-demonstration/README.md +++ b/protocol-demonstration/README.md @@ -4,8 +4,9 @@ This package is the deterministic demonstration of Bitcode. Within this package the correct name is demonstration. `BITCODE_SPEC.txt` is the canonical pointer for active-system work. It currently -resolves to `V41`; V42 is the next draft target after this promotion. This demo is governed by the active V42 canonical -spec and `BITCODE_SPEC_V42_PROVEN.md` as the current generated appendix. +resolves to `V42`; V43 is the active draft target for product-route cleanup after +this promotion. This demo is governed by the active V42 canonical spec and +`BITCODE_SPEC_V42_PROVEN.md` as the current generated appendix. `BITCODE_SPEC.txt -> V42`. V35 telemetry/documentation work may compare against demonstration facts, but the demonstration remains self-contained and does not import commercial runtime diff --git a/scripts/check-v43-gate1-packs-read-deposit-roadmap.mjs b/scripts/check-v43-gate1-packs-read-deposit-roadmap.mjs new file mode 100644 index 00000000..626d228f --- /dev/null +++ b/scripts/check-v43-gate1-packs-read-deposit-roadmap.mjs @@ -0,0 +1,181 @@ +#!/usr/bin/env node + +import { execFileSync } from 'node:child_process'; +import { existsSync, readFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const defaultRepoRoot = path.resolve(__dirname, '..'); + +function read(root, relativePath) { + return readFileSync(path.join(root, relativePath), 'utf8'); +} + +function exists(root, relativePath) { + return existsSync(path.join(root, relativePath)); +} + +function git(root, args) { + return execFileSync('git', args, { cwd: root, encoding: 'utf8' }).trim(); +} + +function assertCheck(failures, condition, message) { + if (!condition) failures.push(message); +} + +function parseArgs(argv) { + const args = { repoRoot: defaultRepoRoot, skipBranchCheck: false }; + for (let index = 0; index < argv.length; index += 1) { + const arg = argv[index]; + if (arg === '--repo-root') args.repoRoot = path.resolve(argv[++index]); + else if (arg === '--skip-branch-check') args.skipBranchCheck = true; + else if (arg === '--help' || arg === '-h') args.help = true; + else throw new Error(`Unknown argument ${arg}`); + } + return args; +} + +function printHelp() { + process.stdout.write( + [ + 'Usage: node scripts/check-v43-gate1-packs-read-deposit-roadmap.mjs [--skip-branch-check] [--repo-root ]', + '', + 'Checks V43 Gate 1 spec family, roadmap, docs, workflow, package script, and active V42 / draft V43 route-product posture.', + ].join('\n'), + ); + process.stdout.write('\n'); +} + +function main() { + const args = parseArgs(process.argv.slice(2)); + if (args.help) { + printHelp(); + return; + } + + const root = args.repoRoot; + const failures = []; + const pointer = read(root, 'BITCODE_SPEC.txt').trim(); + + assertCheck(failures, pointer === 'V42', `BITCODE_SPEC.txt must remain V42 during V43 gate work. Observed ${pointer || 'empty'}.`); + + if (!args.skipBranchCheck) { + const branch = git(root, ['branch', '--show-current']); + assertCheck( + failures, + branch === 'version/v43' || /^v43\/gate-\d+-[a-z0-9][a-z0-9-]*$/u.test(branch), + `V43 work must occur on version/v43 or v43/gate-N-* branches. Observed ${branch || 'detached HEAD'}.`, + ); + } + + for (const relativePath of [ + 'BITCODE_SPEC_V43.md', + 'BITCODE_SPEC_V43_DELTA.md', + 'BITCODE_SPEC_V43_NOTES.md', + 'BITCODE_SPEC_V43_PARITY_MATRIX.md', + 'SPECIFICATIONS_ROADMAP.md', + 'README.md', + 'packages/protocol/README.md', + 'protocol-demonstration/README.md', + '.github/pull_request_template.md', + '.github/workflows/bitcode-gate-quality.yml', + '.github/workflows/bitcode-canon-quality.yml', + 'package.json', + ]) { + assertCheck(failures, exists(root, relativePath), `Missing required V43 Gate 1 file: ${relativePath}`); + } + + const spec = read(root, 'BITCODE_SPEC_V43.md'); + const delta = read(root, 'BITCODE_SPEC_V43_DELTA.md'); + const notes = read(root, 'BITCODE_SPEC_V43_NOTES.md'); + const parity = read(root, 'BITCODE_SPEC_V43_PARITY_MATRIX.md'); + const roadmap = read(root, 'SPECIFICATIONS_ROADMAP.md'); + const readme = read(root, 'README.md'); + const protocolReadme = read(root, 'packages/protocol/README.md'); + const demoReadme = read(root, 'protocol-demonstration/README.md'); + const prTemplate = read(root, '.github/pull_request_template.md'); + const packageJson = read(root, 'package.json'); + const gateWorkflow = read(root, '.github/workflows/bitcode-gate-quality.yml'); + const canonWorkflow = read(root, '.github/workflows/bitcode-canon-quality.yml'); + + for (const [label, content] of [ + ['V43 SPEC', spec], + ['V43 DELTA', delta], + ['V43 NOTES', notes], + ['V43 PARITY', parity], + ]) { + assertCheck(failures, content.includes('Current canonical/latest target: `V42`'), `${label} must declare V42 as current canonical/latest target.`); + } + + for (const phrase of [ + '/packs', + '/read', + '/deposit', + 'AssetPacks in and AssetPacks out', + 'agentic deposit', + 'DepositAssetPackOption', + 'PackActivity', + 'searchable master-detail', + 'column sorting', + 'filtering', + 'source-safe measurements', + 'sub-critical', + 'positive ROI', + 'Reading demand', + 'self-referential', + 'self-explanatory', + 'unpaid AssetPack source', + ]) { + assertCheck( + failures, + spec.includes(phrase) || delta.includes(phrase) || notes.includes(phrase) || parity.includes(phrase) || roadmap.includes(phrase), + `V43 opening must name ${phrase}.`, + ); + } + + for (const gate of [ + 'Gate 1 Packs, Read, Deposit Roadmap And Spec Opening', + 'Gate 2 Route Vocabulary Inventory And Migration Plan', + 'Gate 3 Packs Activity Master-Detail Data Model', + 'Gate 4 Read Route Extraction And Five-Step UX', + 'Gate 5 Deposit Route And Agentic AssetPack Option Synthesis', + 'Gate 6 Source Criticality, Demand, ROI, And Compensation Policy', + 'Gate 7 Deposit Option Review, Approval, And Admission', + 'Gate 8 UX/UI Product Excellence Pass', + 'Gate 9 Cross-Route Rehearsal, Telemetry, And Repair', + 'Gate 10 Promotion Readiness', + ]) { + assertCheck(failures, spec.includes(gate) || delta.includes(gate), `V43 gate plan is missing ${gate}.`); + } + + assertCheck(failures, roadmap.includes('Current active canonical pointer: `BITCODE_SPEC.txt` -> `V42`'), 'Roadmap must state V42 active pointer.'); + assertCheck(failures, roadmap.includes('Current working gate: V43 Gate 1'), 'Roadmap must state active V43 Gate 1.'); + assertCheck(failures, roadmap.includes('| V43 | `BITCODE_SPEC_V43.md` | active draft target |'), 'Roadmap must list V43 as active draft target.'); + assertCheck(failures, readme.includes('resolves to `V42`; V43 is the active draft target'), 'README must state V42 active / V43 draft posture.'); + assertCheck(failures, readme.includes('/packs') && readme.includes('/read') && readme.includes('/deposit'), 'README must document V43 routes.'); + assertCheck(failures, protocolReadme.includes('V43 Gate 1') && protocolReadme.includes('V42` active, `V43` draft'), 'Protocol README must document V43 Gate 1 active/draft posture.'); + assertCheck(failures, demoReadme.includes('`BITCODE_SPEC.txt -> V42`'), 'Demonstration README must keep V42 pointer truth.'); + assertCheck(failures, prTemplate.includes('V43 Gate N:'), 'PR template must use V43 gate title examples.'); + assertCheck(failures, packageJson.includes('"check:v43-gate1"'), 'package.json must expose check:v43-gate1.'); + assertCheck(failures, gateWorkflow.includes('check-v43-gate1-packs-read-deposit-roadmap.mjs'), 'Gate workflow must run V43 Gate 1 checker.'); + assertCheck(failures, canonWorkflow.includes('check-v43-gate1-packs-read-deposit-roadmap.mjs'), 'Canon workflow must run V43 Gate 1 checker.'); + + if (failures.length > 0) { + process.stderr.write('V43 Gate 1 packs/read/deposit roadmap check failed:\n'); + for (const failure of failures.filter(Boolean)) process.stderr.write(`- ${failure}\n`); + process.exitCode = 1; + return; + } + + process.stdout.write('V43 Gate 1 packs/read/deposit roadmap check passed.\n'); +} + +try { + main(); +} catch (error) { + const detail = error instanceof Error ? error.message : String(error); + process.stderr.write(`${detail}\n`); + process.exitCode = 1; +} From 5cb8d149d286c9526eb551a5f2a7fd77a181532d Mon Sep 17 00:00:00 2001 From: Garrett Maring Date: Thu, 28 May 2026 22:19:00 -0300 Subject: [PATCH 16/35] V43 Gate 1: Repair promoted canon predicates Update historical V40 and V42 protocol predicates to accept the promoted V42 / draft V43 roadmap posture instead of requiring V41 active or a V42 working gate. Add V42 to the protocol package boundary active/draft version table so the promoted canon pointer is accepted. Proof: pnpm --filter @bitcode/protocol test; pnpm run check:v43-gate1; node scripts/check-bitcode-spec-family.mjs --version V43 --mode draft --current-target V42; node scripts/check-bitcode-canonical-inputs.mjs --current-target V42; node scripts/check-bitcode-canon-posture-drift.mjs --active-canon V42 --draft-target V43; git diff --check. --- .../protocol/src/canonical/v40-api-integration-contracts.js | 3 ++- .../src/canonical/v40-conversation-terminal-integration.js | 3 ++- .../canonical/v40-reading-pipeline-integration-coverage.js | 3 ++- .../protocol/src/canonical/v42-depositing-shortest-path.js | 6 +++++- .../src/canonical/v42-local-staging-mvp-rehearsal.js | 5 ++++- .../canonical/v42-reading-shortest-path-state-machine.js | 6 +++++- packages/protocol/test/protocol-package-boundary.test.js | 1 + 7 files changed, 21 insertions(+), 6 deletions(-) diff --git a/packages/protocol/src/canonical/v40-api-integration-contracts.js b/packages/protocol/src/canonical/v40-api-integration-contracts.js index fca418ff..d387118b 100644 --- a/packages/protocol/src/canonical/v40-api-integration-contracts.js +++ b/packages/protocol/src/canonical/v40-api-integration-contracts.js @@ -368,7 +368,8 @@ function buildPredicateResults(repoRoot) { predicateResult( 'roadmap-documents-v41-prompt-programs', 'SPECIFICATIONS_ROADMAP.md', - roadmap.includes('| V41 | `BITCODE_SPEC_V41.md` | active canon | Prompt and PromptPart excellence') && + roadmap.includes('| V41 | `BITCODE_SPEC_V41.md` |') && + roadmap.includes('Prompt and PromptPart excellence') && roadmap.includes('meaningfully benchmarkable semantic parts'), ), ...rowPredicates, diff --git a/packages/protocol/src/canonical/v40-conversation-terminal-integration.js b/packages/protocol/src/canonical/v40-conversation-terminal-integration.js index cf9a8196..c24a261d 100644 --- a/packages/protocol/src/canonical/v40-conversation-terminal-integration.js +++ b/packages/protocol/src/canonical/v40-conversation-terminal-integration.js @@ -482,7 +482,8 @@ function buildPredicateResults(repoRoot) { predicateResult( 'roadmap-preserves-v41-prompt-programs', 'SPECIFICATIONS_ROADMAP.md', - roadmap.includes('| V41 | `BITCODE_SPEC_V41.md` | active canon | Prompt and PromptPart excellence') && + roadmap.includes('| V41 | `BITCODE_SPEC_V41.md` |') && + roadmap.includes('Prompt and PromptPart excellence') && roadmap.includes('prompts as programs'), ), ...rowPredicates, diff --git a/packages/protocol/src/canonical/v40-reading-pipeline-integration-coverage.js b/packages/protocol/src/canonical/v40-reading-pipeline-integration-coverage.js index 520289cd..9ae471be 100644 --- a/packages/protocol/src/canonical/v40-reading-pipeline-integration-coverage.js +++ b/packages/protocol/src/canonical/v40-reading-pipeline-integration-coverage.js @@ -500,7 +500,8 @@ function buildPredicateResults(repoRoot) { predicateResult( 'roadmap-preserves-v41-prompt-programs', 'SPECIFICATIONS_ROADMAP.md', - roadmap.includes('| V41 | `BITCODE_SPEC_V41.md` | active canon | Prompt and PromptPart excellence') && + roadmap.includes('| V41 | `BITCODE_SPEC_V41.md` |') && + roadmap.includes('Prompt and PromptPart excellence') && roadmap.includes('prompts as programs'), ), ...rowPredicates, diff --git a/packages/protocol/src/canonical/v42-depositing-shortest-path.js b/packages/protocol/src/canonical/v42-depositing-shortest-path.js index 46612b8d..4720e5fb 100644 --- a/packages/protocol/src/canonical/v42-depositing-shortest-path.js +++ b/packages/protocol/src/canonical/v42-depositing-shortest-path.js @@ -220,7 +220,11 @@ function buildPredicateResults(repoRoot) { predicateResult( 'roadmap-records-gate2-closure', SOURCE_ROOTS.roadmap, - roadmap.includes('Current working gate: V42 Gate') && roadmap.includes('V42 Gate 2 closure anchor'), + roadmap.includes('V42 Gate 2 closure anchor') && + (roadmap.includes('Current working gate: V42 Gate') || + roadmap.includes('Latest closed version: V42 Reliable MVP Experience') || + roadmap.includes('Recent V42 canonical promotion anchor') || + roadmap.includes('Current working gate: V43 Gate')), ), ]; } diff --git a/packages/protocol/src/canonical/v42-local-staging-mvp-rehearsal.js b/packages/protocol/src/canonical/v42-local-staging-mvp-rehearsal.js index cddab18c..ee98c41c 100644 --- a/packages/protocol/src/canonical/v42-local-staging-mvp-rehearsal.js +++ b/packages/protocol/src/canonical/v42-local-staging-mvp-rehearsal.js @@ -330,7 +330,10 @@ function buildPredicateResults(repoRoot) { SOURCE_ROOTS.roadmap, sources.roadmap.includes('V42 Gate 8 closure anchor') && (sources.roadmap.includes('Current working gate: V42 Gate 8') || - sources.roadmap.includes('Current working gate: V42 Gate 9')), + sources.roadmap.includes('Current working gate: V42 Gate 9') || + sources.roadmap.includes('Latest closed version: V42 Reliable MVP Experience') || + sources.roadmap.includes('Recent V42 canonical promotion anchor') || + sources.roadmap.includes('Current working gate: V43 Gate')), ), predicateResult('readmes-document-gate8', SOURCE_ROOTS.rootReadme, sources.rootReadme.includes('V42 Gate 8') && sources.protocolReadme.includes('V42LocalStagingMvpRehearsal') && sources.assetPackReadme.includes('ReadingLocalStagingRehearsal') && sources.terminalReadme.includes('local/staging')), ]; diff --git a/packages/protocol/src/canonical/v42-reading-shortest-path-state-machine.js b/packages/protocol/src/canonical/v42-reading-shortest-path-state-machine.js index f094c540..6aa0513a 100644 --- a/packages/protocol/src/canonical/v42-reading-shortest-path-state-machine.js +++ b/packages/protocol/src/canonical/v42-reading-shortest-path-state-machine.js @@ -257,7 +257,11 @@ function buildPredicateResults(repoRoot) { predicateResult( 'roadmap-records-gate3-closure', SOURCE_ROOTS.roadmap, - roadmap.includes('Current working gate: V42 Gate') && roadmap.includes('V42 Gate 3 closure anchor'), + roadmap.includes('V42 Gate 3 closure anchor') && + (roadmap.includes('Current working gate: V42 Gate') || + roadmap.includes('Latest closed version: V42 Reliable MVP Experience') || + roadmap.includes('Recent V42 canonical promotion anchor') || + roadmap.includes('Current working gate: V43 Gate')), ), predicateResult('readmes-document-gate3', SOURCE_ROOTS.rootReadme, rootReadme.includes('V42 Gate 3') && terminalReadme.includes('TerminalEnterpriseReadingUxState') && protocolReadme.includes('V42 Reading shortest path')), ]; diff --git a/packages/protocol/test/protocol-package-boundary.test.js b/packages/protocol/test/protocol-package-boundary.test.js index f2e54669..94980ca9 100644 --- a/packages/protocol/test/protocol-package-boundary.test.js +++ b/packages/protocol/test/protocol-package-boundary.test.js @@ -61,6 +61,7 @@ test('@bitcode/protocol commercial formalization exports package-native canon he V39: { activeCanon: 'V39', draftTarget: 'V40' }, V40: { activeCanon: 'V40', draftTarget: 'V41' }, V41: { activeCanon: 'V41', draftTarget: 'V42' }, + V42: { activeCanon: 'V42', draftTarget: 'V43' }, }; const expectedPosture = expectedPostureByPointer[pointer]; From 090dbe938dea0ab87fe5eb917bef4c7bd9d6bf9e Mon Sep 17 00:00:00 2001 From: Garrett Maring Date: Fri, 29 May 2026 03:13:39 -0300 Subject: [PATCH 17/35] V43 Gate 2: Inventory route vocabulary migration Add the source-safe V43 route vocabulary inventory artifact, generator, checker, protocol exports, and protocol tests. Document the Packs, Read, Deposit migration matrix across the V43 spec family, roadmap, README surfaces, and gate/canon workflow checks. Proof run: pnpm run check:v43-route-vocabulary-inventory; pnpm run check:v43-gate2; pnpm run check:v43-gate1; pnpm --filter @bitcode/protocol test; pnpm --filter @bitcode/protocol typecheck; node scripts/check-bitcode-spec-family.mjs --version V43 --mode draft --current-target V42; node scripts/check-bitcode-canonical-inputs.mjs --current-target V42; node scripts/check-bitcode-canon-posture-drift.mjs --active-canon V42 --draft-target V43; git diff --check. --- .bitcode/v43-route-vocabulary-inventory.json | 15301 ++++++++++++++++ .github/workflows/bitcode-canon-quality.yml | 3 + .github/workflows/bitcode-gate-quality.yml | 6 + BITCODE_SPEC_V43.md | 27 + BITCODE_SPEC_V43_DELTA.md | 15 +- BITCODE_SPEC_V43_NOTES.md | 13 + BITCODE_SPEC_V43_PARITY_MATRIX.md | 11 +- README.md | 12 + SPECIFICATIONS_ROADMAP.md | 7 +- package.json | 3 + packages/protocol/README.md | 12 + .../v43-route-vocabulary-inventory.js | 486 + packages/protocol/src/index.d.ts | 10 + packages/protocol/src/index.js | 12 + .../v43-route-vocabulary-inventory.test.js | 84 + ...k-v43-gate1-packs-read-deposit-roadmap.mjs | 2 +- ...k-v43-gate2-route-vocabulary-inventory.mjs | 173 + ...enerate-v43-route-vocabulary-inventory.mjs | 31 + 18 files changed, 16199 insertions(+), 9 deletions(-) create mode 100644 .bitcode/v43-route-vocabulary-inventory.json create mode 100644 packages/protocol/src/canonical/v43-route-vocabulary-inventory.js create mode 100644 packages/protocol/test/v43-route-vocabulary-inventory.test.js create mode 100644 scripts/check-v43-gate2-route-vocabulary-inventory.mjs create mode 100644 scripts/generate-v43-route-vocabulary-inventory.mjs diff --git a/.bitcode/v43-route-vocabulary-inventory.json b/.bitcode/v43-route-vocabulary-inventory.json new file mode 100644 index 00000000..44002c2b --- /dev/null +++ b/.bitcode/v43-route-vocabulary-inventory.json @@ -0,0 +1,15301 @@ +{ + "artifactId": "v43-route-vocabulary-inventory", + "schemaId": "bitcode.v43.routeVocabularyInventory.v1", + "version": "V43", + "currentTarget": "V42", + "sourceSafetyVerdict": "source-safe-route-vocabulary-inventory-metadata", + "generatedAt": "deterministic", + "artifactRoot": "v43-route-vocabulary-inventory:6ecd89aead44e5ac1ac060ca", + "passed": true, + "tokenIds": [ + "route:/exchange", + "route:/terminal", + "route:/packs", + "route:/read", + "route:/deposit", + "symbol:Exchange", + "symbol:Terminal", + "symbol:Packs", + "symbol:Reading", + "symbol:Depositing", + "symbol:PackActivity", + "symbol:DepositAssetPackOption", + "word:exchange", + "word:terminal", + "word:self-referential" + ], + "categoryIds": [ + "route", + "component", + "test", + "doc", + "api", + "telemetry", + "workflow", + "script", + "package", + "spec" + ], + "migrationRowIds": [ + "packs-route-master-detail", + "read-route-five-step-reading", + "deposit-route-agentic-options", + "retained-debug-cockpit", + "redirect-compatibility", + "self-referential-copy-removal" + ], + "migrationRows": [ + { + "rowId": "packs-route-master-detail", + "fromVocabulary": [ + "/exchange", + "Exchange", + "exchange" + ], + "toVocabulary": [ + "/packs", + "Packs", + "PackActivity" + ], + "owningGate": "V43 Gate 3 Packs Activity Master-Detail Data Model", + "compatibilityBoundary": "Existing exchange activity history is projected as source-safe PackActivity metadata; no unpaid AssetPack source becomes visible.", + "requiredMigrationWork": [ + "rename route path and app references to /packs", + "rename component prefixes to Packs where the user-facing activity surface is meant", + "preserve historical ledger and proof labels as metadata when old records already contain exchange wording", + "add /exchange to /packs redirect until external links can be retired" + ], + "rowRoot": "v43-route-vocabulary-migration-row:944aa2ee719f63a979670461", + "sourceSafetyClass": "source_safe_route_vocabulary_migration_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawSourceTextVisible": false, + "sourceSnippetVisible": false, + "credentialsSerialized": false, + "walletPrivateMaterialVisible": false, + "unpaidAssetPackSourceVisible": false, + "settlementPrivatePayloadVisible": false, + "forbiddenPayloadClasses": [ + "secret-values", + "provider-tokens", + "wallet-private-material", + "protected-source-payloads", + "raw-protected-prompts", + "raw-model-responses-with-protected-source", + "unpaid-assetpack-source", + "source-snippets" + ] + }, + { + "rowId": "read-route-five-step-reading", + "fromVocabulary": [ + "/terminal", + "Terminal Reading" + ], + "toVocabulary": [ + "/read", + "ReadRouteSession", + "Reading" + ], + "owningGate": "V43 Gate 4 Read Route Extraction And Five-Step UX", + "compatibilityBoundary": "Reading remains accepted-Need gated; retained cockpit code cannot bypass Need review, Finding Fits, settlement, rights transfer, or delivery reconciliation.", + "requiredMigrationWork": [ + "extract five-step Reading UX into /read", + "hydrate historical readingStage and transaction query state into /read", + "preserve rich execution log streaming and source-safe proof expansion", + "keep unpaid AssetPack source hidden before settlement" + ], + "rowRoot": "v43-route-vocabulary-migration-row:d0098f91f96559892c7257c6", + "sourceSafetyClass": "source_safe_route_vocabulary_migration_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawSourceTextVisible": false, + "sourceSnippetVisible": false, + "credentialsSerialized": false, + "walletPrivateMaterialVisible": false, + "unpaidAssetPackSourceVisible": false, + "settlementPrivatePayloadVisible": false, + "forbiddenPayloadClasses": [ + "secret-values", + "provider-tokens", + "wallet-private-material", + "protected-source-payloads", + "raw-protected-prompts", + "raw-model-responses-with-protected-source", + "unpaid-assetpack-source", + "source-snippets" + ] + }, + { + "rowId": "deposit-route-agentic-options", + "fromVocabulary": [ + "/terminal", + "Terminal Depositing" + ], + "toVocabulary": [ + "/deposit", + "DepositAssetPackOption", + "Depositing" + ], + "owningGate": "V43 Gate 5 Deposit Route And Agentic AssetPack Option Synthesis", + "compatibilityBoundary": "Deposit options are unminted source-safe AssetPack proposals; approval admits supply to the Depository but does not mint BTD or expose source to readers.", + "requiredMigrationWork": [ + "extract source connection, depositor instructions, option synthesis, review, and admission into /deposit", + "use Depository state and Reading demand as source-safe option-synthesis context", + "show source criticality, likely demand, ROI posture, BTD potential, and compensation route", + "synchronize admitted options into /packs activity" + ], + "rowRoot": "v43-route-vocabulary-migration-row:47d17b7e8f55f061c2bcaebc", + "sourceSafetyClass": "source_safe_route_vocabulary_migration_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawSourceTextVisible": false, + "sourceSnippetVisible": false, + "credentialsSerialized": false, + "walletPrivateMaterialVisible": false, + "unpaidAssetPackSourceVisible": false, + "settlementPrivatePayloadVisible": false, + "forbiddenPayloadClasses": [ + "secret-values", + "provider-tokens", + "wallet-private-material", + "protected-source-payloads", + "raw-protected-prompts", + "raw-model-responses-with-protected-source", + "unpaid-assetpack-source", + "source-snippets" + ] + }, + { + "rowId": "retained-debug-cockpit", + "fromVocabulary": [ + "/terminal", + "Terminal" + ], + "toVocabulary": [ + "internal cockpit", + "operator/debug surface" + ], + "owningGate": "V43 Gate 8 UX/UI Product Excellence Pass", + "compatibilityBoundary": "If retained, cockpit surfaces are explicit internal/debug affordances and never the default product path for Depositing or Reading.", + "requiredMigrationWork": [ + "separate operator cockpit naming from product navigation", + "remove default product links to /terminal", + "verify retained cockpit cannot create second authority paths" + ], + "rowRoot": "v43-route-vocabulary-migration-row:86da1f49cfe0a23643f2ef07", + "sourceSafetyClass": "source_safe_route_vocabulary_migration_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawSourceTextVisible": false, + "sourceSnippetVisible": false, + "credentialsSerialized": false, + "walletPrivateMaterialVisible": false, + "unpaidAssetPackSourceVisible": false, + "settlementPrivatePayloadVisible": false, + "forbiddenPayloadClasses": [ + "secret-values", + "provider-tokens", + "wallet-private-material", + "protected-source-payloads", + "raw-protected-prompts", + "raw-model-responses-with-protected-source", + "unpaid-assetpack-source", + "source-snippets" + ] + }, + { + "rowId": "redirect-compatibility", + "fromVocabulary": [ + "/exchange", + "/terminal" + ], + "toVocabulary": [ + "/packs", + "/read", + "/deposit" + ], + "owningGate": "V43 Gate 9 Cross-Route Rehearsal, Telemetry, And Repair", + "compatibilityBoundary": "Redirects preserve transaction ids, reading stages, deposit anchors, and proof roots without changing protocol authority.", + "requiredMigrationWork": [ + "redirect /exchange to /packs", + "route Reading terminal state to /read", + "route Depositing terminal state to /deposit", + "prove telemetry, database, ledger, and storage readback remain synchronized after redirects" + ], + "rowRoot": "v43-route-vocabulary-migration-row:cbcb6017d26efd0e0495b998", + "sourceSafetyClass": "source_safe_route_vocabulary_migration_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawSourceTextVisible": false, + "sourceSnippetVisible": false, + "credentialsSerialized": false, + "walletPrivateMaterialVisible": false, + "unpaidAssetPackSourceVisible": false, + "settlementPrivatePayloadVisible": false, + "forbiddenPayloadClasses": [ + "secret-values", + "provider-tokens", + "wallet-private-material", + "protected-source-payloads", + "raw-protected-prompts", + "raw-model-responses-with-protected-source", + "unpaid-assetpack-source", + "source-snippets" + ] + }, + { + "rowId": "self-referential-copy-removal", + "fromVocabulary": [ + "self-referential product explanation", + "instructional route copy" + ], + "toVocabulary": [ + "concise labels", + "progressive detail", + "source-safe proof expansion" + ], + "owningGate": "V43 Gate 8 UX/UI Product Excellence Pass", + "compatibilityBoundary": "Public docs may explain the protocol; product UI should communicate through route structure, labels, state, and reusable components.", + "requiredMigrationWork": [ + "audit in-app self-referential copy outside public docs", + "replace copy that describes the design with operational labels and state", + "keep advanced detail available through expandable metadata and proof rows" + ], + "rowRoot": "v43-route-vocabulary-migration-row:b4c9534a1ac677d9fba613ec", + "sourceSafetyClass": "source_safe_route_vocabulary_migration_metadata", + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawSourceTextVisible": false, + "sourceSnippetVisible": false, + "credentialsSerialized": false, + "walletPrivateMaterialVisible": false, + "unpaidAssetPackSourceVisible": false, + "settlementPrivatePayloadVisible": false, + "forbiddenPayloadClasses": [ + "secret-values", + "provider-tokens", + "wallet-private-material", + "protected-source-payloads", + "raw-protected-prompts", + "raw-model-responses-with-protected-source", + "unpaid-assetpack-source", + "source-snippets" + ] + } + ], + "predicateResults": [ + { + "id": "active-canon-pointer-remains-v42", + "sourcePath": "BITCODE_SPEC.txt", + "passed": true + }, + { + "id": "spec-defines-gate2-inventory", + "sourcePath": "BITCODE_SPEC_V43.md", + "passed": true + }, + { + "id": "spec-defines-migration-matrix", + "sourcePath": "BITCODE_SPEC_V43.md", + "passed": true + }, + { + "id": "delta-records-gate2-artifact", + "sourcePath": "BITCODE_SPEC_V43_DELTA.md", + "passed": true + }, + { + "id": "notes-record-gate2-artifact", + "sourcePath": "BITCODE_SPEC_V43_NOTES.md", + "passed": true + }, + { + "id": "parity-records-gate2-artifact", + "sourcePath": "BITCODE_SPEC_V43_PARITY_MATRIX.md", + "passed": true + }, + { + "id": "roadmap-records-gate2-closure", + "sourcePath": "SPECIFICATIONS_ROADMAP.md", + "passed": true + }, + { + "id": "readme-records-gate2", + "sourcePath": "README.md", + "passed": true + }, + { + "id": "protocol-readme-records-gate2", + "sourcePath": "packages/protocol/README.md", + "passed": true + }, + { + "id": "package-exposes-gate2-scripts", + "sourcePath": "package.json", + "passed": true + }, + { + "id": "gate-workflow-runs-gate2", + "sourcePath": ".github/workflows/bitcode-gate-quality.yml", + "passed": true + }, + { + "id": "canon-workflow-runs-gate2", + "sourcePath": ".github/workflows/bitcode-canon-quality.yml", + "passed": true + }, + { + "id": "protocol-index-exports-gate2", + "sourcePath": "packages/protocol/src/index.js", + "passed": true + }, + { + "id": "protocol-types-export-gate2", + "sourcePath": "packages/protocol/src/index.d.ts", + "passed": true + }, + { + "id": "generator-exists", + "sourcePath": "scripts/generate-v43-route-vocabulary-inventory.mjs", + "passed": true + }, + { + "id": "checker-exists", + "sourcePath": "scripts/check-v43-gate2-route-vocabulary-inventory.mjs", + "passed": true + }, + { + "id": "protocol-test-exists", + "sourcePath": "packages/protocol/test/v43-route-vocabulary-inventory.test.js", + "passed": true + }, + { + "id": "legacy-exchange-inventory-nonempty", + "sourcePath": "source scan", + "passed": true + }, + { + "id": "legacy-terminal-inventory-nonempty", + "sourcePath": "source scan", + "passed": true + }, + { + "id": "target-route-vocabulary-present", + "sourcePath": "source scan", + "passed": true + }, + { + "id": "pack-activity-vocabulary-present", + "sourcePath": "source scan", + "passed": true + }, + { + "id": "deposit-option-vocabulary-present", + "sourcePath": "source scan", + "passed": true + }, + { + "id": "migration-rows-complete", + "sourcePath": "packages/protocol/src/canonical/v43-route-vocabulary-inventory.js", + "passed": true + }, + { + "id": "required-categories-covered", + "sourcePath": "source scan", + "passed": true + } + ], + "sourceFiles": [ + { + "path": ".ai/PRODUCT.md", + "pathRoot": "v43-route-vocabulary-file:d7d02ce6b8059c5fdff24d84", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 5, + "symbol:Terminal": 4 + }, + "totalMatches": 9, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": ".github/workflows/bitcode-canon-quality.yml", + "pathRoot": "v43-route-vocabulary-file:5db65bd13994bf3ed230d3cf", + "categories": [ + "telemetry", + "workflow" + ], + "tokenCounts": { + "word:exchange": 17, + "word:terminal": 4 + }, + "totalMatches": 21, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": ".github/workflows/bitcode-gate-quality.yml", + "pathRoot": "v43-route-vocabulary-file:fe6c8605a71a40a70b2efd8f", + "categories": [ + "telemetry", + "workflow" + ], + "tokenCounts": { + "symbol:Terminal": 4, + "symbol:Reading": 1, + "word:exchange": 25, + "word:terminal": 9 + }, + "totalMatches": 39, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": ".github/workflows/v29-canon-promotion.yml", + "pathRoot": "v43-route-vocabulary-file:50f6ce9fa94bfbff9da2d9df", + "categories": [ + "telemetry", + "workflow" + ], + "tokenCounts": { + "word:terminal": 3 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": ".github/workflows/v30-canon-promotion.yml", + "pathRoot": "v43-route-vocabulary-file:aa6e5647523994102a15c5a5", + "categories": [ + "telemetry", + "workflow" + ], + "tokenCounts": { + "word:terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": ".github/workflows/v31-canon-promotion.yml", + "pathRoot": "v43-route-vocabulary-file:6a334b009687533f2c3427c0", + "categories": [ + "telemetry", + "workflow" + ], + "tokenCounts": { + "word:terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": ".github/workflows/v32-canon-promotion.yml", + "pathRoot": "v43-route-vocabulary-file:6824f7456c44a557b45b5226", + "categories": [ + "telemetry", + "workflow" + ], + "tokenCounts": { + "word:terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": ".github/workflows/v33-canon-promotion.yml", + "pathRoot": "v43-route-vocabulary-file:0b142fe3d45d3a697ef6c8de", + "categories": [ + "telemetry", + "workflow" + ], + "tokenCounts": { + "word:terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": ".github/workflows/v34-canon-promotion.yml", + "pathRoot": "v43-route-vocabulary-file:5545858999aafa7e9da9ef6d", + "categories": [ + "telemetry", + "workflow" + ], + "tokenCounts": { + "word:terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": ".github/workflows/v35-canon-promotion.yml", + "pathRoot": "v43-route-vocabulary-file:d5a4d87fc319cbfd4a3a6b27", + "categories": [ + "telemetry", + "workflow" + ], + "tokenCounts": { + "word:terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": ".github/workflows/v36-canon-promotion.yml", + "pathRoot": "v43-route-vocabulary-file:9d6829a7c9d1c4c6fc3a39be", + "categories": [ + "telemetry", + "workflow" + ], + "tokenCounts": { + "word:exchange": 9, + "word:terminal": 1 + }, + "totalMatches": 10, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": ".github/workflows/v37-canon-promotion.yml", + "pathRoot": "v43-route-vocabulary-file:b5df90146c3a120fa3b5bdd1", + "categories": [ + "telemetry", + "workflow" + ], + "tokenCounts": { + "word:terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": ".github/workflows/v40-canon-promotion.yml", + "pathRoot": "v43-route-vocabulary-file:6dbcfeaf2f0af0ca5db94f66", + "categories": [ + "workflow" + ], + "tokenCounts": { + "word:terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": ".sales/INTRO_PAMPHLET.md", + "pathRoot": "v43-route-vocabulary-file:c859c53537daa44e2d97a14b", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 4, + "symbol:Terminal": 2, + "word:exchange": 1 + }, + "totalMatches": 7, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_LIGHTPAPER.md", + "pathRoot": "v43-route-vocabulary-file:5b0f3580913204e883c1738c", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 8, + "symbol:Terminal": 7, + "word:exchange": 1, + "word:terminal": 1 + }, + "totalMatches": 17, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPECIFYING.md", + "pathRoot": "v43-route-vocabulary-file:9c83b951526e77eada8f1ab3", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 3, + "symbol:Terminal": 3, + "symbol:Reading": 1 + }, + "totalMatches": 7, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V26.md", + "pathRoot": "v43-route-vocabulary-file:0c26c136010a8742815e4035", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/read": 15, + "route:/deposit": 2, + "symbol:Exchange": 34, + "symbol:Terminal": 43, + "symbol:Reading": 1, + "symbol:Depositing": 1, + "word:terminal": 4 + }, + "totalMatches": 100, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V26_DELTA.md", + "pathRoot": "v43-route-vocabulary-file:0786fc9ce90cfb9a0779ba60", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/read": 6, + "symbol:Exchange": 21, + "symbol:Terminal": 21, + "word:terminal": 3 + }, + "totalMatches": 51, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V26_NOTES.md", + "pathRoot": "v43-route-vocabulary-file:58278e0e5049ed7552aceb92", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/read": 12, + "route:/deposit": 4, + "symbol:Exchange": 41, + "symbol:Terminal": 63, + "word:terminal": 3, + "word:self-referential": 1 + }, + "totalMatches": 124, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V26_PARITY_MATRIX.md", + "pathRoot": "v43-route-vocabulary-file:293fc94f019dc4abf6423b14", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/read": 11, + "route:/deposit": 3, + "symbol:Exchange": 18, + "symbol:Terminal": 25, + "word:terminal": 4 + }, + "totalMatches": 61, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V26_PROVEN.md", + "pathRoot": "v43-route-vocabulary-file:837410c251beba05a7914e08", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 8, + "symbol:Terminal": 7, + "word:exchange": 2, + "word:terminal": 6 + }, + "totalMatches": 23, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V27.md", + "pathRoot": "v43-route-vocabulary-file:1d48feb2a065c7a9116e981e", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 43, + "symbol:Terminal": 23, + "word:exchange": 5, + "word:terminal": 3 + }, + "totalMatches": 74, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V27_DELTA.md", + "pathRoot": "v43-route-vocabulary-file:5f7332e93b8d39a7ea5540d1", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 26, + "symbol:Terminal": 22, + "word:exchange": 5, + "word:terminal": 4 + }, + "totalMatches": 57, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V27_NOTES.md", + "pathRoot": "v43-route-vocabulary-file:006954e7533c93ce456eb493", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 44, + "symbol:Terminal": 22, + "word:exchange": 2, + "word:terminal": 4 + }, + "totalMatches": 72, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V27_PARITY_MATRIX.md", + "pathRoot": "v43-route-vocabulary-file:90a80d46e7dd2d80eedf2a35", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/read": 1, + "symbol:Exchange": 30, + "symbol:Terminal": 18, + "word:exchange": 7, + "word:terminal": 5 + }, + "totalMatches": 61, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V27_PROVEN.md", + "pathRoot": "v43-route-vocabulary-file:2c51d77f18344a5f253c06b7", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 3, + "symbol:Terminal": 3, + "word:exchange": 2, + "word:terminal": 1 + }, + "totalMatches": 9, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V28.md", + "pathRoot": "v43-route-vocabulary-file:45b6423f7051de672823c8db", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 13, + "route:/read": 2, + "symbol:Exchange": 19, + "symbol:Terminal": 148, + "symbol:Reading": 25, + "symbol:Depositing": 5, + "word:exchange": 1, + "word:terminal": 24 + }, + "totalMatches": 237, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V28_DELTA.md", + "pathRoot": "v43-route-vocabulary-file:f3f62bbae7089f2535b022ed", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/read": 1, + "symbol:Exchange": 16, + "symbol:Terminal": 44, + "symbol:Reading": 6, + "symbol:Depositing": 4 + }, + "totalMatches": 71, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V28_NOTES.md", + "pathRoot": "v43-route-vocabulary-file:360641ca896ad997abe1550f", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 6, + "route:/read": 3, + "symbol:Exchange": 30, + "symbol:Terminal": 96, + "symbol:Reading": 10, + "symbol:Depositing": 4, + "word:exchange": 7, + "word:terminal": 7 + }, + "totalMatches": 163, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V28_PARITY_MATRIX.md", + "pathRoot": "v43-route-vocabulary-file:179eb228109e4e207879a48e", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 2, + "route:/terminal": 24, + "route:/read": 2, + "symbol:Exchange": 20, + "symbol:Terminal": 66, + "symbol:Reading": 14, + "symbol:Depositing": 4, + "word:exchange": 3, + "word:terminal": 41 + }, + "totalMatches": 176, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V29.md", + "pathRoot": "v43-route-vocabulary-file:f192506c6c27631ae3c9c8aa", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 4, + "symbol:Exchange": 2, + "symbol:Terminal": 65, + "symbol:Reading": 21, + "symbol:Depositing": 2, + "word:terminal": 6 + }, + "totalMatches": 100, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V29_DELTA.md", + "pathRoot": "v43-route-vocabulary-file:63f342e4f829e35616c289ba", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 2, + "symbol:Terminal": 33, + "symbol:Reading": 7, + "symbol:Depositing": 1 + }, + "totalMatches": 43, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V29_NOTES.md", + "pathRoot": "v43-route-vocabulary-file:bfa4f02f572eb9fb17991247", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 1, + "symbol:Exchange": 1, + "symbol:Terminal": 34, + "symbol:Reading": 9, + "symbol:Depositing": 1, + "word:terminal": 3 + }, + "totalMatches": 49, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V29_PARITY_MATRIX.md", + "pathRoot": "v43-route-vocabulary-file:295222b7d752ad43baf91d9f", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 6, + "symbol:Terminal": 39, + "symbol:Reading": 11, + "word:terminal": 22 + }, + "totalMatches": 78, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V30.md", + "pathRoot": "v43-route-vocabulary-file:dc24e9d4bf137fed2128eceb", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 4, + "route:/read": 3, + "symbol:Exchange": 6, + "symbol:Terminal": 53, + "symbol:Reading": 20, + "symbol:Depositing": 1, + "word:terminal": 6 + }, + "totalMatches": 93, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V30_DELTA.md", + "pathRoot": "v43-route-vocabulary-file:edaf9c0cdf7c9086bc8a9228", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/read": 4, + "symbol:Exchange": 7, + "symbol:Terminal": 12, + "symbol:Reading": 2 + }, + "totalMatches": 25, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V30_NOTES.md", + "pathRoot": "v43-route-vocabulary-file:3f0d9be54e0e21746f76de4a", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/read": 2, + "symbol:Exchange": 6, + "symbol:Terminal": 12, + "symbol:Reading": 1 + }, + "totalMatches": 21, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V30_PARITY_MATRIX.md", + "pathRoot": "v43-route-vocabulary-file:2d53cf0c1a120e3a646d1bb0", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 4, + "route:/read": 3, + "symbol:Exchange": 2, + "symbol:Terminal": 13, + "symbol:Reading": 1, + "word:terminal": 9 + }, + "totalMatches": 32, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V31.md", + "pathRoot": "v43-route-vocabulary-file:75102f617a93a1924b41a2bd", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 2, + "symbol:Exchange": 16, + "symbol:Terminal": 41, + "symbol:Reading": 18, + "symbol:Depositing": 1, + "word:exchange": 1, + "word:terminal": 4 + }, + "totalMatches": 83, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V31_DELTA.md", + "pathRoot": "v43-route-vocabulary-file:1b2f359b95b51256923795e8", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 1, + "symbol:Exchange": 11, + "symbol:Terminal": 8, + "symbol:Reading": 2, + "word:terminal": 2 + }, + "totalMatches": 24, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V31_NOTES.md", + "pathRoot": "v43-route-vocabulary-file:4d5e218cc6b89d83438070a7", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 6, + "symbol:Terminal": 4, + "symbol:Reading": 2 + }, + "totalMatches": 12, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V31_PARITY_MATRIX.md", + "pathRoot": "v43-route-vocabulary-file:9267d2f914eec72d2d9bb50f", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 2, + "symbol:Exchange": 4, + "symbol:Terminal": 2, + "symbol:Reading": 1, + "word:terminal": 4 + }, + "totalMatches": 13, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V32.md", + "pathRoot": "v43-route-vocabulary-file:4e081339bfd7a77764e327ba", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 3, + "route:/read": 2, + "symbol:Exchange": 8, + "symbol:Terminal": 49, + "symbol:Reading": 30, + "symbol:Depositing": 1, + "word:terminal": 6 + }, + "totalMatches": 99, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V32_DELTA.md", + "pathRoot": "v43-route-vocabulary-file:5961e95388b5d12410e06675", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 1, + "route:/read": 1, + "symbol:Exchange": 4, + "symbol:Terminal": 9, + "symbol:Reading": 9, + "word:terminal": 3 + }, + "totalMatches": 27, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V32_NOTES.md", + "pathRoot": "v43-route-vocabulary-file:41edfad5812a5b62e8a8212e", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 2, + "symbol:Terminal": 6, + "symbol:Reading": 7, + "word:terminal": 1 + }, + "totalMatches": 16, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V32_PARITY_MATRIX.md", + "pathRoot": "v43-route-vocabulary-file:36ad2a4df098d79b37fcc1b1", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/read": 2, + "symbol:Exchange": 1, + "symbol:Terminal": 7, + "symbol:Reading": 11, + "word:terminal": 2 + }, + "totalMatches": 23, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V33.md", + "pathRoot": "v43-route-vocabulary-file:0c0b7119c9c433002a795de2", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 2, + "symbol:Terminal": 23, + "symbol:Reading": 13, + "symbol:Depositing": 1 + }, + "totalMatches": 39, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V33_DELTA.md", + "pathRoot": "v43-route-vocabulary-file:3f054bedf56af2ceb14c067a", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 4, + "symbol:Terminal": 14, + "symbol:Reading": 4 + }, + "totalMatches": 22, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V33_NOTES.md", + "pathRoot": "v43-route-vocabulary-file:ebd5a58625b03dbaf555ece7", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 2, + "symbol:Terminal": 14, + "symbol:Reading": 6 + }, + "totalMatches": 22, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V33_PARITY_MATRIX.md", + "pathRoot": "v43-route-vocabulary-file:5c45ec3be7517ff5bd899731", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 12, + "symbol:Reading": 1 + }, + "totalMatches": 14, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V34.md", + "pathRoot": "v43-route-vocabulary-file:fe26e0381f4144161b455cad", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 2, + "symbol:Terminal": 5, + "symbol:Reading": 11, + "symbol:Depositing": 1 + }, + "totalMatches": 19, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V34_DELTA.md", + "pathRoot": "v43-route-vocabulary-file:e7a9cd10a750efce5442e981", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 2, + "symbol:Terminal": 3, + "symbol:Reading": 6, + "word:terminal": 1 + }, + "totalMatches": 12, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V34_NOTES.md", + "pathRoot": "v43-route-vocabulary-file:89b3a49d356c8539f98776d0", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1, + "symbol:Reading": 3 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V34_PARITY_MATRIX.md", + "pathRoot": "v43-route-vocabulary-file:6f44fe899cd7aded13d62889", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 1, + "symbol:Reading": 1 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V35.md", + "pathRoot": "v43-route-vocabulary-file:fbf19b40e4757bfce28fe704", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 5, + "symbol:Terminal": 9, + "symbol:Reading": 9, + "symbol:Depositing": 1, + "word:terminal": 1 + }, + "totalMatches": 25, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V35_DELTA.md", + "pathRoot": "v43-route-vocabulary-file:74fe1d056b2489aeb574107c", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 3, + "symbol:Terminal": 3, + "symbol:Reading": 1 + }, + "totalMatches": 7, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V35_NOTES.md", + "pathRoot": "v43-route-vocabulary-file:4156ee0b7ff5acc3ba4edaf6", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 3, + "symbol:Reading": 1 + }, + "totalMatches": 5, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V35_PARITY_MATRIX.md", + "pathRoot": "v43-route-vocabulary-file:773a6ac92df799d9e62ca955", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 2, + "symbol:Terminal": 3 + }, + "totalMatches": 5, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V36.md", + "pathRoot": "v43-route-vocabulary-file:cf6b806e53831f2fb3819474", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 3, + "route:/terminal": 1, + "symbol:Exchange": 89, + "symbol:Terminal": 9, + "symbol:Reading": 10, + "symbol:Depositing": 1, + "word:exchange": 96, + "word:terminal": 1 + }, + "totalMatches": 210, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V36_DELTA.md", + "pathRoot": "v43-route-vocabulary-file:fe54cdc9dfdcc4f55cab7097", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 1, + "symbol:Exchange": 22, + "symbol:Terminal": 3, + "symbol:Reading": 1, + "word:exchange": 25 + }, + "totalMatches": 52, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V36_NOTES.md", + "pathRoot": "v43-route-vocabulary-file:0239e3f6dbad730ca02b5a18", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 22, + "symbol:Terminal": 2, + "symbol:Reading": 2, + "word:exchange": 23 + }, + "totalMatches": 49, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V36_PARITY_MATRIX.md", + "pathRoot": "v43-route-vocabulary-file:e4958bce22c17745f4bed95b", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 2, + "symbol:Exchange": 23, + "symbol:Terminal": 5, + "symbol:Reading": 1, + "word:exchange": 76 + }, + "totalMatches": 107, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V37.md", + "pathRoot": "v43-route-vocabulary-file:e678039d4ba81552da8066c2", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 3, + "route:/terminal": 2, + "symbol:Exchange": 87, + "symbol:Terminal": 30, + "symbol:Reading": 13, + "symbol:Depositing": 3, + "word:exchange": 88, + "word:terminal": 7 + }, + "totalMatches": 233, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V37_DELTA.md", + "pathRoot": "v43-route-vocabulary-file:f38b002b9da6d621ef8227a5", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 1, + "symbol:Exchange": 20, + "symbol:Terminal": 19, + "symbol:Reading": 5, + "symbol:Depositing": 2, + "word:exchange": 17, + "word:terminal": 3 + }, + "totalMatches": 67, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V37_NOTES.md", + "pathRoot": "v43-route-vocabulary-file:3f9199afe01c2838ea0a0e9f", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 6, + "symbol:Terminal": 18, + "symbol:Reading": 2, + "symbol:Depositing": 1, + "word:terminal": 2 + }, + "totalMatches": 29, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V37_PARITY_MATRIX.md", + "pathRoot": "v43-route-vocabulary-file:c480c707b266e65631f07353", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 2, + "route:/terminal": 4, + "symbol:Exchange": 21, + "symbol:Terminal": 28, + "symbol:Reading": 3, + "symbol:Depositing": 2, + "word:exchange": 68, + "word:terminal": 23 + }, + "totalMatches": 151, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V38.md", + "pathRoot": "v43-route-vocabulary-file:9109fd1963617b255ede6d9b", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/read": 1, + "route:/deposit": 1, + "symbol:Exchange": 3, + "symbol:Terminal": 2, + "symbol:Reading": 15, + "symbol:Depositing": 1 + }, + "totalMatches": 23, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V38_DELTA.md", + "pathRoot": "v43-route-vocabulary-file:e67ccddc7f1a2d7492c1d61b", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 1, + "symbol:Reading": 8 + }, + "totalMatches": 10, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V38_NOTES.md", + "pathRoot": "v43-route-vocabulary-file:140ae640139d96fb49af3aad", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/read": 1, + "symbol:Terminal": 1, + "symbol:Reading": 12, + "word:exchange": 1 + }, + "totalMatches": 15, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V38_PARITY_MATRIX.md", + "pathRoot": "v43-route-vocabulary-file:1ba225b689681d955d4fabb7", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 3, + "symbol:Reading": 14 + }, + "totalMatches": 17, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V39.md", + "pathRoot": "v43-route-vocabulary-file:803c5e48fa6072fc216c695c", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 1, + "route:/deposit": 2, + "symbol:Exchange": 3, + "symbol:Terminal": 6, + "symbol:Reading": 31, + "symbol:Depositing": 1, + "word:terminal": 2 + }, + "totalMatches": 46, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V39_DELTA.md", + "pathRoot": "v43-route-vocabulary-file:40de8a56b6012a7854d85126", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/deposit": 1, + "symbol:Exchange": 1, + "symbol:Terminal": 7, + "symbol:Reading": 19, + "word:terminal": 1 + }, + "totalMatches": 29, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V39_NOTES.md", + "pathRoot": "v43-route-vocabulary-file:fa18b10bc1e6af7c57245c06", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 5, + "symbol:Reading": 32 + }, + "totalMatches": 37, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V39_PARITY_MATRIX.md", + "pathRoot": "v43-route-vocabulary-file:f9c81c9fcfd5946d722f9451", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 5, + "route:/read": 1, + "symbol:Terminal": 9, + "symbol:Reading": 30, + "word:terminal": 11 + }, + "totalMatches": 56, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V40.md", + "pathRoot": "v43-route-vocabulary-file:a962a6bf61f4613a3ce68be7", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 7, + "symbol:Terminal": 28, + "symbol:Reading": 25, + "symbol:Depositing": 1, + "word:terminal": 4 + }, + "totalMatches": 65, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V40_DELTA.md", + "pathRoot": "v43-route-vocabulary-file:d9b333bb54c3a61864656fea", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 7, + "symbol:Reading": 8, + "word:terminal": 2 + }, + "totalMatches": 18, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V40_NOTES.md", + "pathRoot": "v43-route-vocabulary-file:38d2eb089e32a1565a5bae37", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 2, + "symbol:Terminal": 14, + "symbol:Reading": 19, + "word:terminal": 2 + }, + "totalMatches": 37, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V40_PARITY_MATRIX.md", + "pathRoot": "v43-route-vocabulary-file:6e4f7f17dabc0b6d8eab2425", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 4, + "symbol:Reading": 5, + "word:terminal": 4 + }, + "totalMatches": 13, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V41.md", + "pathRoot": "v43-route-vocabulary-file:50717f3700b1ffc589445e08", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 8, + "symbol:Reading": 19, + "symbol:Depositing": 2 + }, + "totalMatches": 29, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V41_DELTA.md", + "pathRoot": "v43-route-vocabulary-file:73941b8ae4ac54682ca5182b", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 1, + "route:/packs": 1, + "route:/read": 1, + "route:/deposit": 1, + "symbol:Terminal": 3, + "symbol:Reading": 13, + "symbol:Depositing": 1, + "word:exchange": 1 + }, + "totalMatches": 22, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V41_NOTES.md", + "pathRoot": "v43-route-vocabulary-file:a83b950b13285f0c94a5c31a", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 1, + "route:/terminal": 1, + "route:/packs": 1, + "route:/read": 1, + "route:/deposit": 1, + "symbol:Terminal": 1, + "symbol:Reading": 13, + "symbol:Depositing": 2, + "word:exchange": 2, + "word:terminal": 1 + }, + "totalMatches": 24, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V41_PARITY_MATRIX.md", + "pathRoot": "v43-route-vocabulary-file:461705e9834b4ec50db5db0e", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "symbol:Reading": 9 + }, + "totalMatches": 9, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V42.md", + "pathRoot": "v43-route-vocabulary-file:77a681199956b85d67bbe36b", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 4, + "route:/terminal": 5, + "route:/packs": 4, + "route:/read": 4, + "route:/deposit": 4, + "symbol:Exchange": 1, + "symbol:Terminal": 6, + "symbol:Reading": 23, + "symbol:Depositing": 10, + "word:exchange": 5, + "word:terminal": 5, + "word:self-referential": 1 + }, + "totalMatches": 72, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V42_DELTA.md", + "pathRoot": "v43-route-vocabulary-file:84ff0a28a94588261cfd8de6", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 1, + "route:/terminal": 1, + "route:/packs": 4, + "route:/read": 3, + "route:/deposit": 3, + "symbol:Exchange": 1, + "symbol:Terminal": 6, + "symbol:Reading": 11, + "symbol:Depositing": 4, + "word:exchange": 1, + "word:terminal": 1, + "word:self-referential": 1 + }, + "totalMatches": 37, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V42_NOTES.md", + "pathRoot": "v43-route-vocabulary-file:8960c1230a8d55beab2231f4", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 2, + "route:/terminal": 2, + "route:/packs": 5, + "route:/read": 4, + "route:/deposit": 4, + "symbol:Exchange": 2, + "symbol:Terminal": 6, + "symbol:Packs": 1, + "symbol:Reading": 10, + "symbol:Depositing": 8, + "word:exchange": 2, + "word:terminal": 2, + "word:self-referential": 1 + }, + "totalMatches": 49, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V42_PARITY_MATRIX.md", + "pathRoot": "v43-route-vocabulary-file:003c092ceff58759e20d9b54", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 1, + "route:/terminal": 1, + "route:/packs": 2, + "route:/read": 2, + "route:/deposit": 2, + "symbol:Terminal": 5, + "symbol:Reading": 6, + "symbol:Depositing": 4, + "word:exchange": 1, + "word:terminal": 1, + "word:self-referential": 1 + }, + "totalMatches": 26, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V43.md", + "pathRoot": "v43-route-vocabulary-file:521c49a37505607aba80175e", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 4, + "route:/terminal": 5, + "route:/packs": 14, + "route:/read": 15, + "route:/deposit": 12, + "symbol:Exchange": 4, + "symbol:Terminal": 2, + "symbol:Packs": 5, + "symbol:Reading": 18, + "symbol:Depositing": 6, + "symbol:PackActivity": 7, + "symbol:DepositAssetPackOption": 3, + "word:exchange": 5, + "word:terminal": 5, + "word:self-referential": 4 + }, + "totalMatches": 109, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V43_DELTA.md", + "pathRoot": "v43-route-vocabulary-file:db40d12223b25af7aefce40d", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 2, + "route:/terminal": 2, + "route:/packs": 6, + "route:/read": 6, + "route:/deposit": 6, + "symbol:Exchange": 2, + "symbol:Terminal": 3, + "symbol:Reading": 5, + "symbol:Depositing": 2, + "symbol:PackActivity": 1, + "symbol:DepositAssetPackOption": 1, + "word:exchange": 2, + "word:terminal": 2, + "word:self-referential": 3 + }, + "totalMatches": 43, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V43_NOTES.md", + "pathRoot": "v43-route-vocabulary-file:c5a7b7bca0373ad52da3975e", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 1, + "route:/terminal": 1, + "route:/packs": 4, + "route:/read": 3, + "route:/deposit": 3, + "symbol:Exchange": 1, + "symbol:Terminal": 1, + "symbol:Packs": 1, + "symbol:Reading": 3, + "symbol:Depositing": 2, + "symbol:PackActivity": 1, + "symbol:DepositAssetPackOption": 1, + "word:exchange": 1, + "word:terminal": 1, + "word:self-referential": 2 + }, + "totalMatches": 26, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_SPEC_V43_PARITY_MATRIX.md", + "pathRoot": "v43-route-vocabulary-file:d536a96b361352c106cfa118", + "categories": [ + "doc", + "spec" + ], + "tokenCounts": { + "route:/exchange": 1, + "route:/terminal": 1, + "route:/packs": 2, + "route:/read": 1, + "route:/deposit": 1, + "symbol:Packs": 1, + "symbol:Reading": 1, + "word:exchange": 1, + "word:terminal": 1, + "word:self-referential": 2 + }, + "totalMatches": 12, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_V11_PREP_MEMO.md", + "pathRoot": "v43-route-vocabulary-file:b1e60bfa73f58e90c6ab4741", + "categories": [ + "doc" + ], + "tokenCounts": { + "word:exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_V26_QA.md", + "pathRoot": "v43-route-vocabulary-file:8054f5c070c3a0b1de6a376c", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 6, + "symbol:Exchange": 3, + "symbol:Terminal": 4, + "word:terminal": 6 + }, + "totalMatches": 19, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_V28_QA.md", + "pathRoot": "v43-route-vocabulary-file:a1cabc3a7f574827ab0d1e37", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 28, + "route:/read": 4, + "symbol:Exchange": 28, + "symbol:Terminal": 180, + "symbol:Reading": 8, + "symbol:Depositing": 1, + "word:exchange": 28, + "word:terminal": 32 + }, + "totalMatches": 309, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_V29_QA.md", + "pathRoot": "v43-route-vocabulary-file:fa928ebc8bae0db3b492550b", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 4, + "word:terminal": 1 + }, + "totalMatches": 5, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "BITCODE_V30_QA.md", + "pathRoot": "v43-route-vocabulary-file:7e3e25631ad84f553e6a85db", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "INVESTOR_MEMO.md", + "pathRoot": "v43-route-vocabulary-file:6fb3d75b198afe8cc9258a9e", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "route:/read": 1, + "symbol:Reading": 1, + "symbol:Depositing": 1 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "PRODUCT.md", + "pathRoot": "v43-route-vocabulary-file:06c0596810b8f44179257fac", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "word:exchange": 2 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "README.md", + "pathRoot": "v43-route-vocabulary-file:cbf832fe53880bc4d13b0749", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 4, + "route:/terminal": 5, + "route:/packs": 6, + "route:/read": 6, + "route:/deposit": 5, + "symbol:Exchange": 16, + "symbol:Terminal": 31, + "symbol:Packs": 2, + "symbol:Reading": 29, + "symbol:Depositing": 5, + "symbol:PackActivity": 1, + "symbol:DepositAssetPackOption": 1, + "word:exchange": 16, + "word:terminal": 7, + "word:self-referential": 2 + }, + "totalMatches": 136, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "SPECIFICATIONS_ROADMAP.md", + "pathRoot": "v43-route-vocabulary-file:f5527630aba80a8c905f8714", + "categories": [ + "doc", + "spec", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 3, + "route:/terminal": 3, + "route:/packs": 7, + "route:/read": 9, + "route:/deposit": 6, + "symbol:Exchange": 25, + "symbol:Terminal": 42, + "symbol:Packs": 1, + "symbol:Reading": 58, + "symbol:Depositing": 10, + "symbol:PackActivity": 1, + "symbol:DepositAssetPackOption": 1, + "word:exchange": 19, + "word:terminal": 6, + "word:self-referential": 3 + }, + "totalMatches": 194, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "docs/conversations.md", + "pathRoot": "v43-route-vocabulary-file:ceebcec7ea32633f37a6c692", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 2, + "symbol:Terminal": 9, + "symbol:Reading": 2, + "symbol:Depositing": 1 + }, + "totalMatches": 14, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "internal-docs/ASSETPACK_EXECUTION.md", + "pathRoot": "v43-route-vocabulary-file:83303a87f7546909f57cceff", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 2, + "symbol:Terminal": 4 + }, + "totalMatches": 6, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "internal-docs/BITCODE_AGENTIC_EXECUTION.md", + "pathRoot": "v43-route-vocabulary-file:677cb5ec9edf663619861e85", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "internal-docs/BITCODE_API.md", + "pathRoot": "v43-route-vocabulary-file:99f18a1fe95386ae51c67bda", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 4, + "symbol:Terminal": 3 + }, + "totalMatches": 7, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "internal-docs/BITCODE_ARCHITECTURE_PATTERNS.md", + "pathRoot": "v43-route-vocabulary-file:2ff3fa77822943c21b83b08d", + "categories": [ + "doc" + ], + "tokenCounts": { + "symbol:Exchange": 2, + "symbol:Terminal": 1 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "internal-docs/BITCODE_CHATGPT_APP_INTERFACE.md", + "pathRoot": "v43-route-vocabulary-file:adbaabe00bb53288a52a357f", + "categories": [ + "doc" + ], + "tokenCounts": { + "symbol:Exchange": 3, + "symbol:Terminal": 1 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "internal-docs/BITCODE_CONNECTED_SERVICES.md", + "pathRoot": "v43-route-vocabulary-file:9c1e53cf4fd69109e304c61f", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "internal-docs/BITCODE_CONVERSATIONS.md", + "pathRoot": "v43-route-vocabulary-file:9bb807134797d384238707ca", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "route:/read": 1, + "symbol:Exchange": 1, + "symbol:Terminal": 4 + }, + "totalMatches": 6, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "internal-docs/BITCODE_CONVERSATIONS_TELEMETRY_RUNBOOK.md", + "pathRoot": "v43-route-vocabulary-file:84e9e70bf32f367dba8e0361", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 7, + "word:terminal": 2 + }, + "totalMatches": 9, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "internal-docs/BITCODE_EXCHANGE_DATABASE.md", + "pathRoot": "v43-route-vocabulary-file:b5ea15f6827e74ccf972c950", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 10, + "symbol:Terminal": 4 + }, + "totalMatches": 14, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "internal-docs/BITCODE_EXECUTIONS.md", + "pathRoot": "v43-route-vocabulary-file:c2ce36ef00416e803b4aab09", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 1, + "symbol:Exchange": 1, + "symbol:Terminal": 2, + "word:terminal": 1 + }, + "totalMatches": 5, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "internal-docs/BITCODE_EXECUTION_WORK_SUMMARIES.md", + "pathRoot": "v43-route-vocabulary-file:c10bf2fa20df773f683483cb", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "internal-docs/BITCODE_FRONTEND_ARCHITECTURE.md", + "pathRoot": "v43-route-vocabulary-file:22a5a65e323ccaba04186c65", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 1, + "symbol:Exchange": 3, + "symbol:Terminal": 2, + "word:terminal": 1 + }, + "totalMatches": 7, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "internal-docs/BITCODE_INTERFACE_STYLE.md", + "pathRoot": "v43-route-vocabulary-file:8ac4fef9aaeb1e31e10afcf6", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 2, + "symbol:Terminal": 2 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "internal-docs/BITCODE_PROTOCOL_THESIS.md", + "pathRoot": "v43-route-vocabulary-file:e5027b1c45af14d2789ac192", + "categories": [ + "doc" + ], + "tokenCounts": { + "symbol:Exchange": 2, + "symbol:Terminal": 2 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "internal-docs/BITCODE_SOURCE_EVIDENCE_DOCUMENTS.md", + "pathRoot": "v43-route-vocabulary-file:7c0256d29e2dbbecde837550", + "categories": [ + "doc" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "internal-docs/BITCODE_TERMINAL_OPERATOR_EXPERIENCE.md", + "pathRoot": "v43-route-vocabulary-file:9d1b321e1a2e389e27294fd8", + "categories": [ + "doc" + ], + "tokenCounts": { + "symbol:Exchange": 4, + "symbol:Terminal": 6 + }, + "totalMatches": 10, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "internal-docs/BITCODE_V26_GATE_NOTES.md", + "pathRoot": "v43-route-vocabulary-file:829c95c83bbd424f9bce49ae", + "categories": [ + "doc" + ], + "tokenCounts": { + "symbol:Exchange": 2, + "symbol:Terminal": 2 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "internal-docs/BITCODE_V27_CRYPTO_RESEARCH_REBINDING.md", + "pathRoot": "v43-route-vocabulary-file:0970b59ab53e324d171e049d", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 3, + "symbol:Terminal": 2 + }, + "totalMatches": 5, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "internal-docs/BITCODE_VERIFICATION.md", + "pathRoot": "v43-route-vocabulary-file:53e9901d14214ff511b2d748", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "internal-docs/INTEGRATIONS.md", + "pathRoot": "v43-route-vocabulary-file:30fb9eab40e7c9d74b14454f", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "route:/read": 1, + "symbol:Exchange": 1, + "symbol:Terminal": 1 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "internal-docs/README.md", + "pathRoot": "v43-route-vocabulary-file:4e051716427d106284dbba20", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 3, + "symbol:Terminal": 3 + }, + "totalMatches": 6, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "package.json", + "pathRoot": "v43-route-vocabulary-file:106e04cb6e6f253ed710df48", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "word:exchange": 41, + "word:terminal": 12 + }, + "totalMatches": 53, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/agent-generics/src/__tests__/prepare-concise-context.test.ts", + "pathRoot": "v43-route-vocabulary-file:08eca1e1af432f3bec964a55", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "route:/read": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/api/README.md", + "pathRoot": "v43-route-vocabulary-file:9e09733e254658b60279dd5e", + "categories": [ + "api", + "doc", + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 3, + "symbol:Terminal": 4 + }, + "totalMatches": 7, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/api/src/conversations/__tests__/branch-conversation.test.ts", + "pathRoot": "v43-route-vocabulary-file:be466fa4edd4d8c5889d3f62", + "categories": [ + "api", + "package", + "test" + ], + "tokenCounts": { + "route:/terminal": 2, + "word:terminal": 2 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/api/src/conversations/index.ts", + "pathRoot": "v43-route-vocabulary-file:71db1180e6df7fc791ff50f1", + "categories": [ + "api", + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/api/src/routes/__tests__/auxillaries-contract.test.ts", + "pathRoot": "v43-route-vocabulary-file:d6359d5343f0976aa6f7e3b8", + "categories": [ + "api", + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "word:exchange": 5, + "word:terminal": 4 + }, + "totalMatches": 9, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/api/src/routes/__tests__/btd-crypto.test.ts", + "pathRoot": "v43-route-vocabulary-file:a35b8341c3fc4dca33ec2e88", + "categories": [ + "api", + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 4, + "symbol:Exchange": 4, + "symbol:Terminal": 2, + "word:exchange": 5, + "word:terminal": 19 + }, + "totalMatches": 34, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/api/src/routes/__tests__/user-btd-mutation.test.ts", + "pathRoot": "v43-route-vocabulary-file:b90c163fc66d576ed51a80c2", + "categories": [ + "api", + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 1, + "word:terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/api/src/routes/auth.ts", + "pathRoot": "v43-route-vocabulary-file:74152b7104ee14871348dc75", + "categories": [ + "api", + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 2, + "word:exchange": 2 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/api/src/routes/auxillaries-contract.ts", + "pathRoot": "v43-route-vocabulary-file:9c56cff7b7f2715704369fd2", + "categories": [ + "api", + "package", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 7, + "word:exchange": 5, + "word:terminal": 12 + }, + "totalMatches": 24, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/api/src/routes/auxillaries.ts", + "pathRoot": "v43-route-vocabulary-file:0d2591065e0039521ef4390c", + "categories": [ + "api", + "package" + ], + "tokenCounts": { + "route:/exchange": 1, + "route:/terminal": 1, + "symbol:Exchange": 2, + "symbol:Terminal": 2, + "word:exchange": 1, + "word:terminal": 1 + }, + "totalMatches": 8, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/api/src/routes/btd-crypto.ts", + "pathRoot": "v43-route-vocabulary-file:a36d01f1f9968e17e622b009", + "categories": [ + "api", + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "word:exchange": 1, + "word:terminal": 1 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/api/src/routes/conversations.ts", + "pathRoot": "v43-route-vocabulary-file:d621dd3b3188a67c58a37d43", + "categories": [ + "api", + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/api/src/routes/shippables.ts", + "pathRoot": "v43-route-vocabulary-file:6298cda6a3f3e27dde6f2a73", + "categories": [ + "api", + "package", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 2, + "symbol:Exchange": 1, + "symbol:Terminal": 1, + "word:terminal": 2 + }, + "totalMatches": 6, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/api/src/routes/user.ts", + "pathRoot": "v43-route-vocabulary-file:8651de1bdf97ece165693be7", + "categories": [ + "api", + "package", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 1, + "route:/terminal": 1, + "symbol:Exchange": 2, + "symbol:Terminal": 2, + "word:exchange": 1, + "word:terminal": 1 + }, + "totalMatches": 8, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/bitbucket/src/providers/bitbucket-provider.ts", + "pathRoot": "v43-route-vocabulary-file:cd28312b05857b9fd2d8a292", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "word:exchange": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/btd/README.md", + "pathRoot": "v43-route-vocabulary-file:f45b2df2817a8b5e2c4fed10", + "categories": [ + "doc", + "package", + "telemetry" + ], + "tokenCounts": { + "route:/read": 1, + "symbol:Exchange": 4, + "symbol:Terminal": 7, + "word:terminal": 2 + }, + "totalMatches": 14, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/btd/__tests__/api-boundaries.test.ts", + "pathRoot": "v43-route-vocabulary-file:af2f48551648c4814a2f5cad", + "categories": [ + "package", + "test" + ], + "tokenCounts": { + "word:exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/btd/__tests__/api-schema-compatibility-matrix.test.ts", + "pathRoot": "v43-route-vocabulary-file:e7b47da8b5a0ce9a76940d06", + "categories": [ + "package", + "test" + ], + "tokenCounts": { + "word:exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/btd/__tests__/asset-pack-economic-traceability.test.ts", + "pathRoot": "v43-route-vocabulary-file:27a58ce8df17e765e33f6f14", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "word:exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/btd/__tests__/btc-fee-operation.test.ts", + "pathRoot": "v43-route-vocabulary-file:1752cb1f3237ebb8f890f038", + "categories": [ + "package", + "test" + ], + "tokenCounts": { + "word:terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/btd/__tests__/btd.test.ts", + "pathRoot": "v43-route-vocabulary-file:9f7b25b03352fd5f731b94d6", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 1, + "word:terminal": 5 + }, + "totalMatches": 6, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/btd/__tests__/chatgpt-app-action-contract.test.ts", + "pathRoot": "v43-route-vocabulary-file:283a113c55fe95f2fc9236f7", + "categories": [ + "package", + "test" + ], + "tokenCounts": { + "symbol:Reading": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/btd/__tests__/deployment-readiness-rehearsal.test.ts", + "pathRoot": "v43-route-vocabulary-file:f169a8ef11710cb88ce56b99", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "word:terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/btd/__tests__/interface-authorization-policy.test.ts", + "pathRoot": "v43-route-vocabulary-file:ae4a011489e994f21dd7d405", + "categories": [ + "package", + "test" + ], + "tokenCounts": { + "symbol:Terminal": 1, + "word:terminal": 2 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/btd/__tests__/interface-consumer-ux-regression-proof.test.ts", + "pathRoot": "v43-route-vocabulary-file:16b1f550a3853f2af9a42bd0", + "categories": [ + "package", + "test" + ], + "tokenCounts": { + "word:terminal": 4 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/btd/__tests__/interface-contract-catalog.test.ts", + "pathRoot": "v43-route-vocabulary-file:e9ce47a18e715acb5d6fb0ff", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/btd/__tests__/interface-integration.test.ts", + "pathRoot": "v43-route-vocabulary-file:e62eddb4e8fa007a7d3e5aa5", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 4, + "symbol:Exchange": 1, + "symbol:Terminal": 1, + "word:exchange": 1, + "word:terminal": 14 + }, + "totalMatches": 21, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/btd/__tests__/interface-telemetry-proof-hook.test.ts", + "pathRoot": "v43-route-vocabulary-file:69f4dbf040c11a0adeda0c6c", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Terminal": 1, + "word:terminal": 5 + }, + "totalMatches": 6, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/btd/__tests__/read-license-assetpack-rights-contract.test.ts", + "pathRoot": "v43-route-vocabulary-file:da86263a97c7a89e3627d9eb", + "categories": [ + "package", + "test" + ], + "tokenCounts": { + "symbol:Terminal": 1, + "word:terminal": 5 + }, + "totalMatches": 6, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/btd/__tests__/terminal-operational-health.test.ts", + "pathRoot": "v43-route-vocabulary-file:2b6bae8c43702f96002ae4a3", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Terminal": 1, + "word:terminal": 4 + }, + "totalMatches": 5, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/btd/__tests__/v27-crypto-primitives.test.ts", + "pathRoot": "v43-route-vocabulary-file:5ee1efe5104a3e5933089276", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "route:/exchange": 1, + "symbol:Exchange": 4, + "symbol:Terminal": 2, + "word:exchange": 2, + "word:terminal": 3 + }, + "totalMatches": 12, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/btd/__tests__/v32-interface-contract-regression.test.ts", + "pathRoot": "v43-route-vocabulary-file:75d8d6d26d1eae4723d885de", + "categories": [ + "package", + "test" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 1, + "word:terminal": 2 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/btd/__tests__/v32-ledger-btd-settlement-failure-states.test.ts", + "pathRoot": "v43-route-vocabulary-file:8d33198519bf0a9be9280c19", + "categories": [ + "package", + "test" + ], + "tokenCounts": { + "route:/read": 1, + "word:exchange": 1, + "word:terminal": 1 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/btd/package.json", + "pathRoot": "v43-route-vocabulary-file:824a3bd6eaf6d4bd529b9067", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "word:terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/btd/src/api-boundaries.ts", + "pathRoot": "v43-route-vocabulary-file:2c127909358882128f92701c", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 2, + "symbol:Exchange": 20, + "symbol:Terminal": 6, + "word:exchange": 5, + "word:terminal": 15 + }, + "totalMatches": 48, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/btd/src/api-schema-compatibility-matrix.ts", + "pathRoot": "v43-route-vocabulary-file:54060d17f4f88205ae74b64d", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 2, + "word:exchange": 4, + "word:terminal": 11 + }, + "totalMatches": 17, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/btd/src/authority.ts", + "pathRoot": "v43-route-vocabulary-file:ca821ebe156500319f9b458a", + "categories": [ + "package" + ], + "tokenCounts": { + "route:/terminal": 5, + "word:terminal": 10 + }, + "totalMatches": 15, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/btd/src/deployment-host-capability-catalog.ts", + "pathRoot": "v43-route-vocabulary-file:e4ff9fb16a0ece1a17dba275", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 2, + "word:terminal": 1 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/btd/src/deployment-readiness-rehearsal.ts", + "pathRoot": "v43-route-vocabulary-file:17951ca1a6064b0264b21d7b", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 1, + "word:terminal": 8 + }, + "totalMatches": 9, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/btd/src/exchange.ts", + "pathRoot": "v43-route-vocabulary-file:943fcbc854d64a95b11634fe", + "categories": [ + "package" + ], + "tokenCounts": { + "symbol:Exchange": 8 + }, + "totalMatches": 8, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/btd/src/index.ts", + "pathRoot": "v43-route-vocabulary-file:090d3af17446d33c9f16c25e", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 1, + "word:exchange": 1, + "word:terminal": 1 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/btd/src/interface-authorization-policy.ts", + "pathRoot": "v43-route-vocabulary-file:5ee296050cd376460455fa01", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "word:terminal": 23 + }, + "totalMatches": 23, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/btd/src/interface-consumer-ux-regression-proof.ts", + "pathRoot": "v43-route-vocabulary-file:eba086e89c4228ac1e5cdd16", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1, + "word:terminal": 5 + }, + "totalMatches": 6, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/btd/src/interface-contract-catalog.ts", + "pathRoot": "v43-route-vocabulary-file:23bdb8bcaa7435fac4c2d168", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 1, + "route:/terminal": 1, + "symbol:Exchange": 3, + "word:exchange": 6, + "word:terminal": 4 + }, + "totalMatches": 15, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/btd/src/interface-contract-regression.ts", + "pathRoot": "v43-route-vocabulary-file:cb742cb39b454e72f8d749aa", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 1, + "route:/terminal": 1, + "symbol:Exchange": 3, + "word:exchange": 3, + "word:terminal": 3 + }, + "totalMatches": 11, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/btd/src/interface-integration-contract.ts", + "pathRoot": "v43-route-vocabulary-file:e2386181830b07c299c25bb0", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "word:terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/btd/src/interface-telemetry-proof-hook.ts", + "pathRoot": "v43-route-vocabulary-file:c56c21a7f186607003e4aa3c", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "word:terminal": 6 + }, + "totalMatches": 6, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/btd/src/mcp-tool-contract.ts", + "pathRoot": "v43-route-vocabulary-file:5eb5807afc154c20bf83442a", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Reading": 3 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/btd/src/migration-approval-gate.ts", + "pathRoot": "v43-route-vocabulary-file:eeb7a040cc286f6b5dfc31a1", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1, + "symbol:Reading": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/btd/src/plans.ts", + "pathRoot": "v43-route-vocabulary-file:1fb0bbd5b0b6ad0a41a47af6", + "categories": [ + "package" + ], + "tokenCounts": { + "symbol:Exchange": 3 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/btd/src/read-license-assetpack-rights-contract.ts", + "pathRoot": "v43-route-vocabulary-file:3dec3b9a8b56c8b3cd88064a", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "word:terminal": 13 + }, + "totalMatches": 13, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/btd/src/secret-rotation-plan.ts", + "pathRoot": "v43-route-vocabulary-file:62c8ad25c501d1d20fa2d793", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/btd/src/terminal-journal.ts", + "pathRoot": "v43-route-vocabulary-file:4c88096958226fbf4bed302f", + "categories": [ + "package" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 3 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/btd/src/terminal-operational-health.ts", + "pathRoot": "v43-route-vocabulary-file:ef53b31ad93d683857d5dc61", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 3, + "symbol:Reading": 3, + "word:exchange": 1, + "word:terminal": 39 + }, + "totalMatches": 46, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/chatgptapp/README.md", + "pathRoot": "v43-route-vocabulary-file:39bb4ebc239735c289ec6187", + "categories": [ + "doc", + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 2, + "word:terminal": 2 + }, + "totalMatches": 5, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/chatgptapp/src/__tests__/chatgpt-action-contract.test.ts", + "pathRoot": "v43-route-vocabulary-file:98198358bc21794cf9c4c29f", + "categories": [ + "package", + "test" + ], + "tokenCounts": { + "symbol:Reading": 3 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/chatgptapp/src/__tests__/tools.test.ts", + "pathRoot": "v43-route-vocabulary-file:65d3ce9e7cc49b97ed5c3826", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "word:terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/chatgptapp/src/server.ts", + "pathRoot": "v43-route-vocabulary-file:6a0355ffc070645e25fb9dc0", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 2, + "symbol:Terminal": 2 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/conversations-generics/README.md", + "pathRoot": "v43-route-vocabulary-file:c00004c0dabcf3ca1e8f292a", + "categories": [ + "doc", + "package" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/conversations-generics/package.json", + "pathRoot": "v43-route-vocabulary-file:a7865185b24fef1d66c6556c", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/conversations-generics/src/agent/ConversationAgent.ts", + "pathRoot": "v43-route-vocabulary-file:d7f2228600f73a8e2cd8340e", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/conversations-generics/src/index.ts", + "pathRoot": "v43-route-vocabulary-file:b1ccf1aff59d11556e7bd954", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/conversations-generics/src/prompts/BitcodeTerminalConversationSystemPrompt.ts", + "pathRoot": "v43-route-vocabulary-file:6a04a2f7e304363817c9f298", + "categories": [ + "package" + ], + "tokenCounts": { + "symbol:Terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/conversations-generics/src/types.ts", + "pathRoot": "v43-route-vocabulary-file:13365d91102a1534858f54e5", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/execution-generics/TLDR.md", + "pathRoot": "v43-route-vocabulary-file:432b57e8658692256ae84b40", + "categories": [ + "doc", + "package", + "telemetry" + ], + "tokenCounts": { + "word:terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/executions-mcp/README.md", + "pathRoot": "v43-route-vocabulary-file:d72bc470dfea42601fd8c97a", + "categories": [ + "doc", + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 6, + "symbol:Terminal": 2 + }, + "totalMatches": 8, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/executions-mcp/src/mcp-server/ARCHITECTURE.md", + "pathRoot": "v43-route-vocabulary-file:f699dc04a04602515679ea1a", + "categories": [ + "doc", + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Packs": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/executions-mcp/src/mcp-server/PRODUCTION_READINESS_ASSESSMENT.md", + "pathRoot": "v43-route-vocabulary-file:8085c594ab1dc9931aaf9fca", + "categories": [ + "doc", + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "word:exchange": 2 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/executions-mcp/src/mcp-server/README.md", + "pathRoot": "v43-route-vocabulary-file:21df52fea7445d3b91b49a09", + "categories": [ + "doc", + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 5, + "symbol:Terminal": 3 + }, + "totalMatches": 8, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/executions-mcp/src/mcp-server/TESTING.md", + "pathRoot": "v43-route-vocabulary-file:44f07b988f1ebabd9f76f697", + "categories": [ + "doc", + "package", + "telemetry" + ], + "tokenCounts": { + "word:exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/executions-mcp/src/mcp-server/docs/mcp/mcp-api-reference.md", + "pathRoot": "v43-route-vocabulary-file:f72e88966e4034d94f4e149a", + "categories": [ + "doc", + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Reading": 2, + "word:exchange": 1 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/executions-mcp/src/mcp-server/docs/mcp/mcp-openapi.json", + "pathRoot": "v43-route-vocabulary-file:c51b14175d6be7b8f1e14c00", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Reading": 2, + "word:exchange": 1 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/executions-mcp/src/mcp-server/docs/mcp/mcp-specification.json", + "pathRoot": "v43-route-vocabulary-file:3f9ab58b282b997bc46fa803", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Reading": 2, + "word:exchange": 1 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/executions-mcp/src/mcp-server/docs/openapi/bitcode-mcp-openapi.json", + "pathRoot": "v43-route-vocabulary-file:3e00aa2043213b1bc274b0af", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "word:exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/executions-mcp/src/mcp-server/docs/public/mcp-api-reference.md", + "pathRoot": "v43-route-vocabulary-file:3a1f2534397e3a0adfacbaf3", + "categories": [ + "doc", + "package", + "telemetry" + ], + "tokenCounts": { + "word:exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/executions-mcp/src/mcp-server/docs/public/mcp-overview.md", + "pathRoot": "v43-route-vocabulary-file:67042c9368ed8a0b78aaac2a", + "categories": [ + "doc", + "package", + "telemetry" + ], + "tokenCounts": { + "route:/deposit": 1, + "symbol:Exchange": 9, + "symbol:Terminal": 2 + }, + "totalMatches": 12, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/executions-mcp/src/mcp-server/package.json", + "pathRoot": "v43-route-vocabulary-file:2e7fbaf76907dbbfb75eb115", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/executions-mcp/src/mcp-server/src/__tests__/unit/mcp-tool-contract.test.ts", + "pathRoot": "v43-route-vocabulary-file:3b1b0cd8e92d14d4f64c56b1", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "word:terminal": 3 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/executions-mcp/src/mcp-server/src/__tests__/unit/pipeline-ingress-contract.test.ts", + "pathRoot": "v43-route-vocabulary-file:8f41c42a8b535d88094c8926", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 4, + "symbol:Reading": 1, + "word:terminal": 19 + }, + "totalMatches": 24, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/executions-mcp/src/mcp-server/src/__tests__/unit/prompt-asset-pack-canon.test.ts", + "pathRoot": "v43-route-vocabulary-file:ddbf90075f17e6b5ed8c417f", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Terminal": 1, + "word:terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/executions-mcp/src/mcp-server/src/docs/mcp-spec-generator.ts", + "pathRoot": "v43-route-vocabulary-file:5e9cbcfd948c4726223923ec", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "word:exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/executions-mcp/src/mcp-server/src/docs/openapi-generator.ts", + "pathRoot": "v43-route-vocabulary-file:708b93d6e75de030fc313576", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "word:exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/executions-mcp/src/mcp-server/src/index.ts", + "pathRoot": "v43-route-vocabulary-file:fb2c6f22fe661e3d221bf771", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/executions-mcp/src/mcp-server/src/server.ts", + "pathRoot": "v43-route-vocabulary-file:5875733ce14dab980cd147ab", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 3 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/executions-mcp/src/mcp-server/src/types/index.ts", + "pathRoot": "v43-route-vocabulary-file:e1ad2a018d3a6f4af47323d3", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "word:terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/figma/src/auth.ts", + "pathRoot": "v43-route-vocabulary-file:70db0bd80a9ec9b6dfad2dd3", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "word:exchange": 3 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/figma/src/types.ts", + "pathRoot": "v43-route-vocabulary-file:6266e94f2e11c00e3a95e745", + "categories": [ + "package" + ], + "tokenCounts": { + "word:exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/files/README.md", + "pathRoot": "v43-route-vocabulary-file:d558edb5d0d55fc7bc1c19a0", + "categories": [ + "doc", + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Reading": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/generic-agents/vcs/src/index.ts", + "pathRoot": "v43-route-vocabulary-file:cc03395a8331f655634911c7", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/generic-agents/web-researcher/README.md", + "pathRoot": "v43-route-vocabulary-file:c14ec29f92c71f4fa8757f91", + "categories": [ + "doc", + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/generic-agents/web-search/README.md", + "pathRoot": "v43-route-vocabulary-file:da9b11d3d6c21de6536ee5f1", + "categories": [ + "doc", + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 2, + "symbol:Terminal": 2 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/generic-agents/web-search/src/index.ts", + "pathRoot": "v43-route-vocabulary-file:f447bff8b8de4967b858e74f", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/generic-tools/git-interactor/README.md", + "pathRoot": "v43-route-vocabulary-file:446b97424ddf28949f1104db", + "categories": [ + "doc", + "package" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 1, + "word:terminal": 1 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/generic-tools/git-interactor/src/index.ts", + "pathRoot": "v43-route-vocabulary-file:b170068b833fb670c1954384", + "categories": [ + "package" + ], + "tokenCounts": { + "symbol:Terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/generic-tools/git-interactor/src/prompts/GitInteractorDocCodeToolPrompt.ts", + "pathRoot": "v43-route-vocabulary-file:d89b1719ab43d688ffe6be3e", + "categories": [ + "package" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/generic-tools/mcps-tools/gitlab/README.md", + "pathRoot": "v43-route-vocabulary-file:f9ffb6e071f9daea88957d03", + "categories": [ + "doc", + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/generic-tools/mcps-tools/jira/src/index.ts", + "pathRoot": "v43-route-vocabulary-file:fa68dd3bf14985a5db7c01ed", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/generic-tools/read-comprehension/README.md", + "pathRoot": "v43-route-vocabulary-file:ffe431acbe4fc13227abdac7", + "categories": [ + "doc", + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/generic-tools/read-comprehension/src/read-comprehension-primitives.ts", + "pathRoot": "v43-route-vocabulary-file:1dcea50c4730344a3e7fcb3d", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/generic-tools/use-computer/src/index.ts", + "pathRoot": "v43-route-vocabulary-file:4d8d24f237293eb60abdb917", + "categories": [ + "package" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/generic-tools/web-search/README.md", + "pathRoot": "v43-route-vocabulary-file:698eb41a3711064b40e7fd8d", + "categories": [ + "doc", + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/generic-tools/web-search/src/index.ts", + "pathRoot": "v43-route-vocabulary-file:5703784473235b59f48b39f0", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/git/README.md", + "pathRoot": "v43-route-vocabulary-file:7b0579c5019b04966fe67b18", + "categories": [ + "doc", + "package" + ], + "tokenCounts": { + "symbol:Terminal": 1, + "word:terminal": 2 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/github/src/providers/github-provider.ts", + "pathRoot": "v43-route-vocabulary-file:73afabf656230c5d866c236f", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/gitlab/src/auth.ts", + "pathRoot": "v43-route-vocabulary-file:e0d36ef094951e21b6f174a5", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "word:exchange": 3 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/gitlab/src/providers/gitlab-provider.ts", + "pathRoot": "v43-route-vocabulary-file:c07bac1ee2c7cbd8f8424a72", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "word:exchange": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/gitlab/src/types.ts", + "pathRoot": "v43-route-vocabulary-file:f92e4a85bea108984fa34492", + "categories": [ + "package" + ], + "tokenCounts": { + "word:exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/jira/src/auth.ts", + "pathRoot": "v43-route-vocabulary-file:d1c892b0b2defb66af206933", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "word:exchange": 3 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/jira/src/types.ts", + "pathRoot": "v43-route-vocabulary-file:649d00127502865d5847906f", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "word:exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/notifications/README.md", + "pathRoot": "v43-route-vocabulary-file:62de8a6e25626adc0663ed03", + "categories": [ + "doc", + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/notifications/src/types.ts", + "pathRoot": "v43-route-vocabulary-file:9d7006516500fc0faadd346a", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/notion/README.md", + "pathRoot": "v43-route-vocabulary-file:7d11bcae487db604ec55982a", + "categories": [ + "doc", + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/notion/src/auth.ts", + "pathRoot": "v43-route-vocabulary-file:d41fa7d9700b7511fb9417a4", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "word:exchange": 3 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/orm/README.md", + "pathRoot": "v43-route-vocabulary-file:eb0bf75331b7d5b828af2fd7", + "categories": [ + "doc", + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/orm/scripts/run-data-health.ts", + "pathRoot": "v43-route-vocabulary-file:b7e25d23efe6ef2155ec556d", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "word:terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/orm/src/data-health/checks.ts", + "pathRoot": "v43-route-vocabulary-file:2767fcdfef1e90cb36df3276", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 8, + "word:exchange": 4, + "word:terminal": 11 + }, + "totalMatches": 23, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/pipeline-hosts/README.md", + "pathRoot": "v43-route-vocabulary-file:1f396e2e87d830be3cdfccc6", + "categories": [ + "doc", + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 5, + "symbol:Reading": 1 + }, + "totalMatches": 6, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/pipeline-hosts/src/__tests__/distributed-execution-runtime-receipt.test.ts", + "pathRoot": "v43-route-vocabulary-file:e183346058d1a3c7861c0e6c", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "word:terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/pipeline-hosts/src/asset-pack-harness.ts", + "pathRoot": "v43-route-vocabulary-file:eadea3b0c8d456c86ac40d56", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "word:terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/pipeline-hosts/src/dev/run-asset-pack-sandbox-harness.ts", + "pathRoot": "v43-route-vocabulary-file:503c07dbeb68774d01209d88", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/pipeline-hosts/src/distributed-execution-runtime-receipt.ts", + "pathRoot": "v43-route-vocabulary-file:9790c018af92eb0fbdc71528", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/pipelines-generics/src/execution/PipelineExecutor.d.ts", + "pathRoot": "v43-route-vocabulary-file:c2281804285cdd384aa84833", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/deposit": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/pipelines-generics/src/execution/PipelineExecutor.ts", + "pathRoot": "v43-route-vocabulary-file:34aea3fa8250f2b25476a903", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/deposit": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/pipelines/asset-pack/README.md", + "pathRoot": "v43-route-vocabulary-file:43791b5b45d144c1a0433132", + "categories": [ + "doc", + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 2, + "symbol:Terminal": 6, + "symbol:Reading": 5, + "symbol:Depositing": 1 + }, + "totalMatches": 14, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/pipelines/asset-pack/TLDR.md", + "pathRoot": "v43-route-vocabulary-file:56d003fecd63d3c9907ee1ee", + "categories": [ + "doc", + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/pipelines/asset-pack/scripts/v32-reading-pipeline-proof-coverage.ts", + "pathRoot": "v43-route-vocabulary-file:947468ddcdbed6002035b230", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Reading": 8 + }, + "totalMatches": 8, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/pipelines/asset-pack/src/__tests__/asset-pack-disclosure.test.ts", + "pathRoot": "v43-route-vocabulary-file:0f7b6701bccae99efd97d64a", + "categories": [ + "package", + "test" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/pipelines/asset-pack/src/__tests__/depository-search.test.ts", + "pathRoot": "v43-route-vocabulary-file:6b61825a505385f68c841c3a", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 1, + "symbol:Terminal": 6, + "word:terminal": 4 + }, + "totalMatches": 11, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/pipelines/asset-pack/src/__tests__/depository-supply-index.test.ts", + "pathRoot": "v43-route-vocabulary-file:c0e583218a482d0337a40e04", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 2, + "symbol:Terminal": 3, + "word:terminal": 9 + }, + "totalMatches": 14, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/pipelines/asset-pack/src/__tests__/postprocess.test.ts", + "pathRoot": "v43-route-vocabulary-file:c6c5774751b10f12d46d2f29", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/pipelines/asset-pack/src/__tests__/read-fits-finding-runtime.test.ts", + "pathRoot": "v43-route-vocabulary-file:5c819fc7aa870c9d9963158e", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Terminal": 7, + "symbol:Reading": 3 + }, + "totalMatches": 10, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/pipelines/asset-pack/src/__tests__/read-fits-finding-synthesis-asset-pack-synthesis-agent.test.ts", + "pathRoot": "v43-route-vocabulary-file:f3dc652661d3eb8e0f201e3d", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "word:terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/pipelines/asset-pack/src/__tests__/read-need-review-resynthesis.test.ts", + "pathRoot": "v43-route-vocabulary-file:13b52f90fee641016216b456", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Terminal": 3, + "symbol:Reading": 1 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/pipelines/asset-pack/src/__tests__/read-need.test.ts", + "pathRoot": "v43-route-vocabulary-file:9c008d75a2b96314d137ec0c", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Terminal": 6, + "symbol:Reading": 2 + }, + "totalMatches": 8, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/pipelines/asset-pack/src/__tests__/reading-interface-product-parity.test.ts", + "pathRoot": "v43-route-vocabulary-file:ef1322191e9b93ba4eb1c37a", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Terminal": 2, + "symbol:Reading": 5, + "word:terminal": 5 + }, + "totalMatches": 12, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/pipelines/asset-pack/src/__tests__/reading-local-staging-rehearsal.test.ts", + "pathRoot": "v43-route-vocabulary-file:6fcf868f063bfb4ed8e0bd77", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Reading": 4 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/pipelines/asset-pack/src/__tests__/reading-operational-telemetry-repair-readback.test.ts", + "pathRoot": "v43-route-vocabulary-file:5595dc0fed63c73b09880f22", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Reading": 3 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/pipelines/asset-pack/src/__tests__/reading-pipeline-contract.test.ts", + "pathRoot": "v43-route-vocabulary-file:2efcc5170423ed6b4c775977", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Terminal": 1, + "symbol:Reading": 2 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/pipelines/asset-pack/src/__tests__/reading-pipeline-integration-coverage.test.ts", + "pathRoot": "v43-route-vocabulary-file:27a1581ca2dde0365081270e", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Reading": 7 + }, + "totalMatches": 7, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/pipelines/asset-pack/src/__tests__/reading-pipeline-observability.test.ts", + "pathRoot": "v43-route-vocabulary-file:85be3e029f21653cff93447d", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Reading": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/pipelines/asset-pack/src/__tests__/semantic-resolution.test.ts", + "pathRoot": "v43-route-vocabulary-file:64c97388c9fccc022d12b68a", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "route:/read": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/pipelines/asset-pack/src/__tests__/setup-agents.test.ts", + "pathRoot": "v43-route-vocabulary-file:d12cf4c1d5fa640da40c63d5", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "route:/read": 1, + "symbol:Terminal": 3 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/pipelines/asset-pack/src/__tests__/v32-reading-pipeline-proof-coverage.test.ts", + "pathRoot": "v43-route-vocabulary-file:06b937a59d2448cfb23c8488", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Reading": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/pipelines/asset-pack/src/agents/discovery/asset-pack-select-files-parallel-agent.ts", + "pathRoot": "v43-route-vocabulary-file:be73a7eb7d6df633e253fe81", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/read": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/pipelines/asset-pack/src/agents/finish/asset-pack-finish-generate-final-response-agent.ts", + "pathRoot": "v43-route-vocabulary-file:c2436cb34f9003e8e12629a0", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/pipelines/asset-pack/src/agents/finish/deliver-asset-pack-to-destination-agent.ts", + "pathRoot": "v43-route-vocabulary-file:ecb6e9be7f28074b8a1fc27a", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/pipelines/asset-pack/src/agents/setup/asset-pack-danger-wall-agent.ts", + "pathRoot": "v43-route-vocabulary-file:fe6ff0b009fadc3d88ee229f", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/read": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/pipelines/asset-pack/src/agents/setup/read-fits-finding-synthesis-read-comprehension-agent.ts", + "pathRoot": "v43-route-vocabulary-file:a68a8ffd78f542087b5f5317", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/read": 5 + }, + "totalMatches": 5, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/pipelines/asset-pack/src/index.ts", + "pathRoot": "v43-route-vocabulary-file:6d4401bdde8d14a689e26e57", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/pipelines/asset-pack/src/read-need.ts", + "pathRoot": "v43-route-vocabulary-file:4ba001592847e76420761c05", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Reading": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/pipelines/asset-pack/src/reading-interface-product-parity.ts", + "pathRoot": "v43-route-vocabulary-file:27ab0d4edc9a0db73186fd4d", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 1, + "symbol:Reading": 1, + "word:terminal": 16 + }, + "totalMatches": 18, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/pipelines/asset-pack/src/reading-local-staging-rehearsal.ts", + "pathRoot": "v43-route-vocabulary-file:3605472d687fd252d023f9e6", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Reading": 5 + }, + "totalMatches": 5, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/pipelines/asset-pack/src/reading-operational-telemetry-repair-readback.ts", + "pathRoot": "v43-route-vocabulary-file:ffa04f235af58965e369c6ab", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Reading": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/pipelines/asset-pack/src/semantic-resolution.ts", + "pathRoot": "v43-route-vocabulary-file:fca0d1ae9c15aeb71d940515", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/read": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/pipelines/asset-pack/src/tools/index.ts", + "pathRoot": "v43-route-vocabulary-file:7dc6f6c3bb6ff5a2ffb5d87d", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/pipelines/asset-pack/src/tools/search.ts", + "pathRoot": "v43-route-vocabulary-file:57a8d9d62174e56ed2ecdcbb", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/prompts/README.md", + "pathRoot": "v43-route-vocabulary-file:4d982df17218a68a017e7d97", + "categories": [ + "doc", + "package", + "telemetry" + ], + "tokenCounts": { + "word:terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/prompts/src/benchmarking/README.md", + "pathRoot": "v43-route-vocabulary-file:93e574376d1af1b0739e40e3", + "categories": [ + "doc", + "package", + "telemetry" + ], + "tokenCounts": { + "word:terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/prompts/src/raw_promptparts/specific/promptpart_specific_agent_conversationagent_identity_definition.d.ts", + "pathRoot": "v43-route-vocabulary-file:975cb8a0d69c59c6ec8a3708", + "categories": [ + "package" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/prompts/src/raw_promptparts/specific/promptpart_specific_agent_conversationagent_identity_definition.ts", + "pathRoot": "v43-route-vocabulary-file:38886bde514e98b531d4dc1f", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/prompts/src/raw_promptparts/specific/promptpart_specific_agent_conversationagent_name.d.ts", + "pathRoot": "v43-route-vocabulary-file:e578837888721724609b7ebc", + "categories": [ + "package" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/prompts/src/raw_promptparts/specific/promptpart_specific_agent_conversationagent_name.ts", + "pathRoot": "v43-route-vocabulary-file:46653a1ec4d75ea3349712bf", + "categories": [ + "package" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/prompts/src/raw_promptparts/specific/promptpart_specific_agent_conversationagent_ptrrplan_purpose.d.ts", + "pathRoot": "v43-route-vocabulary-file:100c1472c8d065f5e42ddd92", + "categories": [ + "package" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/prompts/src/raw_promptparts/specific/promptpart_specific_agent_conversationagent_ptrrplan_purpose.ts", + "pathRoot": "v43-route-vocabulary-file:c85faf9d1e5974234fa06a87", + "categories": [ + "package" + ], + "tokenCounts": { + "symbol:Terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/prompts/src/raw_promptparts/specific/promptpart_specific_agent_conversationagent_ptrrrefine_purpose.d.ts", + "pathRoot": "v43-route-vocabulary-file:348d0af6b726a2191958f3f2", + "categories": [ + "package" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/prompts/src/raw_promptparts/specific/promptpart_specific_agent_conversationagent_ptrrrefine_purpose.ts", + "pathRoot": "v43-route-vocabulary-file:b65c301341d406be755948cd", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/prompts/src/raw_promptparts/specific/promptpart_specific_agent_conversationagent_ptrrretry_purpose.d.ts", + "pathRoot": "v43-route-vocabulary-file:2a472d6077474d20310db3fa", + "categories": [ + "package" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/prompts/src/raw_promptparts/specific/promptpart_specific_agent_conversationagent_ptrrretry_purpose.ts", + "pathRoot": "v43-route-vocabulary-file:b699e9fe769a798468bad798", + "categories": [ + "package" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/prompts/src/raw_promptparts/specific/promptpart_specific_agent_conversationagent_ptrrtry_purpose.d.ts", + "pathRoot": "v43-route-vocabulary-file:0a2b7fe4c24d3832e4c5e714", + "categories": [ + "package" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/prompts/src/raw_promptparts/specific/promptpart_specific_agent_conversationagent_ptrrtry_purpose.ts", + "pathRoot": "v43-route-vocabulary-file:da6d1baaf45025ede5cd0d6c", + "categories": [ + "package" + ], + "tokenCounts": { + "symbol:Terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/prompts/src/raw_promptparts/specific/promptpart_specific_agent_dangerwall_integration_detailcontent.ts", + "pathRoot": "v43-route-vocabulary-file:dab8f7bf3c11e6472920dc69", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/prompts/src/raw_promptparts/specific/promptpart_specific_agent_finalizeshipment_refine_assessment.ts", + "pathRoot": "v43-route-vocabulary-file:7c44f6a765892fca83acfd20", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/prompts/src/raw_promptparts/specific/promptpart_specific_agent_finalizeshipment_retry_strategy.ts", + "pathRoot": "v43-route-vocabulary-file:eaa4cf2ca3cd19467d3037d6", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/prompts/src/raw_promptparts/specific/promptpart_specific_agent_finalizeshipment_system_role.ts", + "pathRoot": "v43-route-vocabulary-file:3230fc256d8acb9ec58b90ee", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/prompts/src/raw_promptparts/specific/promptpart_specific_agent_mcpsinitializer_capabilities_list.ts", + "pathRoot": "v43-route-vocabulary-file:75743705e582d229decc58df", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "word:exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/prompts/src/raw_promptparts/specific/promptpart_specific_agent_mcpsinitializer_system_instructions.ts", + "pathRoot": "v43-route-vocabulary-file:e76c113b9ad3c0e96d2fa9f2", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "word:exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/prompts/src/raw_promptparts/specific/promptpart_specific_agent_textsearcher_integration_detailcontent.ts", + "pathRoot": "v43-route-vocabulary-file:45bf52046c1d331f1ee11a56", + "categories": [ + "package" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/prompts/src/raw_promptparts/specific/promptpart_specific_agent_videoprocessor_integration_detailcontent.ts", + "pathRoot": "v43-route-vocabulary-file:0b3deaba0e1bb71760f2a1bf", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "word:exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/prompts/src/raw_promptparts/specific/promptpart_specific_agent_web_search_system_role.ts", + "pathRoot": "v43-route-vocabulary-file:3f1804669628cb6ab5acf7bf", + "categories": [ + "package" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/prompts/src/raw_promptparts/specific/promptpart_specific_agent_webresearcher_capabilities_list.ts", + "pathRoot": "v43-route-vocabulary-file:019cd412a33dd1ba8443d8ad", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/prompts/src/raw_promptparts/specific/promptpart_specific_agent_webresearcher_integration_detailcontent.ts", + "pathRoot": "v43-route-vocabulary-file:abfd295f3afd2b2dff417a76", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/prompts/src/raw_promptparts/specific/promptpart_specific_agent_websearch_capabilities_list.ts", + "pathRoot": "v43-route-vocabulary-file:dcbaa9e2356185c286bfce6b", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/prompts/src/raw_promptparts/specific/promptpart_specific_agent_websearch_integration_detailcontent.ts", + "pathRoot": "v43-route-vocabulary-file:c32cdff3a9ce27fe03ce0f34", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/prompts/src/raw_promptparts/specific/promptpart_specific_agent_websearch_system_role.ts", + "pathRoot": "v43-route-vocabulary-file:a599919d4966f0a1e46f4285", + "categories": [ + "package" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/prompts/src/raw_promptparts/specific/promptpart_specific_agent_websearch_tools_list.ts", + "pathRoot": "v43-route-vocabulary-file:361dff82274d731695cf884c", + "categories": [ + "package" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/prompts/src/raw_promptparts/specific/promptpart_specific_phase_assetpackfinish_purpose_corestatement.ts", + "pathRoot": "v43-route-vocabulary-file:02a6715f5de6dbeb7633c3f8", + "categories": [ + "package" + ], + "tokenCounts": { + "symbol:Exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/prompts/src/raw_promptparts/specific/promptpart_specific_system_bitcodeterminalconversation_capabilities_list.d.ts", + "pathRoot": "v43-route-vocabulary-file:b7eac7564a08cbd1f5b92868", + "categories": [ + "package" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/prompts/src/raw_promptparts/specific/promptpart_specific_system_bitcodeterminalconversation_capabilities_list.ts", + "pathRoot": "v43-route-vocabulary-file:91f885a252e7cdf4ffde2f94", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 4 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/prompts/src/raw_promptparts/specific/promptpart_specific_system_bitcodeterminalconversation_identity_corestatement.d.ts", + "pathRoot": "v43-route-vocabulary-file:36ae726f793225052f12c689", + "categories": [ + "package" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/prompts/src/raw_promptparts/specific/promptpart_specific_system_bitcodeterminalconversation_identity_corestatement.ts", + "pathRoot": "v43-route-vocabulary-file:137c53f616b89ae8908f9ae8", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/prompts/src/raw_promptparts/specific/promptpart_specific_system_bitcodeterminalconversation_usage_guidance.d.ts", + "pathRoot": "v43-route-vocabulary-file:7f1fc660b73035d9f092562c", + "categories": [ + "package" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/prompts/src/raw_promptparts/specific/promptpart_specific_system_bitcodeterminalconversation_usage_guidance.ts", + "pathRoot": "v43-route-vocabulary-file:75db77b5c32f3f73190a53cb", + "categories": [ + "package" + ], + "tokenCounts": { + "symbol:Terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/prompts/src/raw_promptparts/specific/promptpart_specific_tool_analyzereadsatisfactionimplementationcomplexity_doccodetoolexample2.ts", + "pathRoot": "v43-route-vocabulary-file:2c9c5a86abeae14467eb66ac", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/prompts/src/raw_promptparts/specific/promptpart_specific_tool_analyzereadsemantics_doccodetoolexample3.ts", + "pathRoot": "v43-route-vocabulary-file:77b0f50fa6d86dbacb951f05", + "categories": [ + "package" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/prompts/src/raw_promptparts/specific/promptpart_specific_tool_gitinteractor_doccodetoolexample1.ts", + "pathRoot": "v43-route-vocabulary-file:69b4d68b2091550d875509d8", + "categories": [ + "package" + ], + "tokenCounts": { + "word:terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/prompts/src/raw_promptparts/specific/promptpart_specific_tool_gitinteractor_doccodetoolpurpose.ts", + "pathRoot": "v43-route-vocabulary-file:3915fb34835387010910d297", + "categories": [ + "package" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/README.md", + "pathRoot": "v43-route-vocabulary-file:9936e744a1d387a86f4a1d76", + "categories": [ + "doc", + "package", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 2, + "route:/terminal": 2, + "route:/packs": 2, + "route:/read": 4, + "route:/deposit": 2, + "symbol:Exchange": 17, + "symbol:Terminal": 29, + "symbol:Packs": 1, + "symbol:Reading": 33, + "symbol:Depositing": 5, + "word:exchange": 14, + "word:terminal": 6, + "word:self-referential": 1 + }, + "totalMatches": 118, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/data/state.json", + "pathRoot": "v43-route-vocabulary-file:403a1ba72931e6c2d8d8209d", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/read": 1, + "word:exchange": 36 + }, + "totalMatches": 37, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/public/app.js", + "pathRoot": "v43-route-vocabulary-file:a8be8606a025794d8481e459", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/read": 3, + "symbol:Reading": 14, + "symbol:Depositing": 26, + "word:exchange": 1 + }, + "totalMatches": 44, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/server.js", + "pathRoot": "v43-route-vocabulary-file:ed2eceac0f75f18f3016b772", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "word:terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/bitcode-demo.js", + "pathRoot": "v43-route-vocabulary-file:2baf6bbd82c8e0d31d77ada9", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "word:exchange": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/assetpack-synthesis-economic-traceability.js", + "pathRoot": "v43-route-vocabulary-file:c0316c6db172fa1eaf443dca", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "word:terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/conversation-promotion-readiness-report.js", + "pathRoot": "v43-route-vocabulary-file:378e5ca608125939154b578c", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "word:terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/conversation-rehearsal.js", + "pathRoot": "v43-route-vocabulary-file:e5f7405a0351946351af8fd7", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 3, + "word:terminal": 6 + }, + "totalMatches": 9, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/conversation-session-route-history.js", + "pathRoot": "v43-route-vocabulary-file:8639fd86e7faa2560b89a29f", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/conversation-telemetry-proof-hooks.js", + "pathRoot": "v43-route-vocabulary-file:a9fb91da8fe4cbeeb637a8ed", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1, + "word:terminal": 8 + }, + "totalMatches": 9, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/conversation-terminal-handoff.js", + "pathRoot": "v43-route-vocabulary-file:92169612b367eb4163ff9fa6", + "categories": [ + "package" + ], + "tokenCounts": { + "route:/terminal": 3, + "symbol:Exchange": 1, + "symbol:Terminal": 1, + "symbol:Reading": 1, + "symbol:Depositing": 1, + "word:exchange": 6, + "word:terminal": 27 + }, + "totalMatches": 40, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/conversation-writing-workspace.js", + "pathRoot": "v43-route-vocabulary-file:e7f7d03c4a570b680bb1e7a1", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 4 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/docs-qa-alignment-report.js", + "pathRoot": "v43-route-vocabulary-file:de5143cbafd7cd99364c6bdd", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/documentation-surface-catalog.js", + "pathRoot": "v43-route-vocabulary-file:61b839ff32faf78f84460ff3", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "word:terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/exchange-activity-book.js", + "pathRoot": "v43-route-vocabulary-file:74a31cdcbcdb88c5da7dbe7f", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 1, + "symbol:Exchange": 10, + "word:exchange": 68 + }, + "totalMatches": 79, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/exchange-dispute-repair-revenue-route.js", + "pathRoot": "v43-route-vocabulary-file:7ca118da73b127f222edef1a", + "categories": [ + "package" + ], + "tokenCounts": { + "route:/exchange": 1, + "symbol:Exchange": 20, + "word:exchange": 101 + }, + "totalMatches": 122, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/exchange-intent-order-contracts.js", + "pathRoot": "v43-route-vocabulary-file:58f36672124f9629a5692710", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 1, + "symbol:Exchange": 17, + "word:exchange": 62 + }, + "totalMatches": 80, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/exchange-pricing-quote.js", + "pathRoot": "v43-route-vocabulary-file:d11f365f670e34836cd69dbb", + "categories": [ + "package" + ], + "tokenCounts": { + "route:/exchange": 1, + "symbol:Exchange": 21, + "word:exchange": 29 + }, + "totalMatches": 51, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/exchange-promotion-readiness-report.js", + "pathRoot": "v43-route-vocabulary-file:cd55db7a536e3cc544e1ad46", + "categories": [ + "package" + ], + "tokenCounts": { + "symbol:Exchange": 3, + "word:exchange": 9 + }, + "totalMatches": 12, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/exchange-rehearsal.js", + "pathRoot": "v43-route-vocabulary-file:05f381bf5eceb85d1765fef3", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 4, + "route:/terminal": 7, + "symbol:Exchange": 14, + "word:exchange": 51, + "word:terminal": 10 + }, + "totalMatches": 86, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/exchange-rights-transfer-review.js", + "pathRoot": "v43-route-vocabulary-file:6ce43a6fd37e16ac30e878cc", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 1, + "symbol:Exchange": 13, + "word:exchange": 24 + }, + "totalMatches": 38, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/exchange-settlement-reconciliation.js", + "pathRoot": "v43-route-vocabulary-file:e13e3ff529f3aef2bfe07931", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 1, + "symbol:Exchange": 18, + "word:exchange": 39 + }, + "totalMatches": 58, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/exchange-ux-proof.js", + "pathRoot": "v43-route-vocabulary-file:664ecc61fcc41da14cde59ea", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 17, + "route:/terminal": 36, + "symbol:Exchange": 12, + "symbol:Terminal": 4, + "word:exchange": 46, + "word:terminal": 46 + }, + "totalMatches": 161, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/inference-implementation-records.js", + "pathRoot": "v43-route-vocabulary-file:f85565150712a27ee0a3aba1", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 4, + "symbol:Terminal": 1, + "word:terminal": 2 + }, + "totalMatches": 7, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/inference-promotion-readiness-report.js", + "pathRoot": "v43-route-vocabulary-file:eb4349d4f7d3d731147af449", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Reading": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/inference-surface-inventory.js", + "pathRoot": "v43-route-vocabulary-file:41ab63376b160d5569d3b8e3", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1, + "symbol:Reading": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/inference-telemetry-disclosure-report.js", + "pathRoot": "v43-route-vocabulary-file:06edcc2a9c3645fc9e64f621", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 1, + "word:terminal": 4 + }, + "totalMatches": 5, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/local-staging-inference-depository-search-rehearsal.js", + "pathRoot": "v43-route-vocabulary-file:dc32186e97155ea7131d7d88", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Reading": 1, + "word:terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/local-staging-telemetry-documentation-rehearsal.js", + "pathRoot": "v43-route-vocabulary-file:5f4cc82491672aa5a0d64b1d", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 3, + "symbol:Terminal": 1, + "word:terminal": 10 + }, + "totalMatches": 14, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/prompt-benchmark-report.js", + "pathRoot": "v43-route-vocabulary-file:4f4b8758cea3152925a0457a", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Reading": 3 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/proven-generator.js", + "pathRoot": "v43-route-vocabulary-file:308ad78c3f925c20c2ff96da", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 53, + "route:/read": 1, + "symbol:Exchange": 29, + "symbol:Terminal": 55, + "word:exchange": 10, + "word:terminal": 142 + }, + "totalMatches": 290, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/ptrr-failsafe-thricified-stack.js", + "pathRoot": "v43-route-vocabulary-file:0e0346eab2b79f3e7fd39d17", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Reading": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/public-docs-usage-guide-catalog.js", + "pathRoot": "v43-route-vocabulary-file:8b3949741b031ac3c85c68e7", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 4, + "route:/terminal": 3, + "symbol:Exchange": 7, + "symbol:Terminal": 6, + "word:exchange": 5, + "word:terminal": 7 + }, + "totalMatches": 32, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/read-fits-finding-search-embeddings.js", + "pathRoot": "v43-route-vocabulary-file:c768bbb2bd3a66cb43ca7be0", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 1, + "word:terminal": 5 + }, + "totalMatches": 6, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/read-need-comprehension-inference-hardening.js", + "pathRoot": "v43-route-vocabulary-file:c9ab18ca06972682b7edf08a", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 1, + "word:terminal": 5 + }, + "totalMatches": 6, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/surfaces.js", + "pathRoot": "v43-route-vocabulary-file:567c2f5547d9ff97099e421b", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Reading": 1, + "symbol:Depositing": 1 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/telemetry-documentation-interface-integration.js", + "pathRoot": "v43-route-vocabulary-file:1558281abad3469e194b639f", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 2, + "word:terminal": 9 + }, + "totalMatches": 11, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/telemetry-taxonomy-catalog.js", + "pathRoot": "v43-route-vocabulary-file:d195d5fd7b14f2d09776c895", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "word:terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/testnet-rollout-readiness-guide.js", + "pathRoot": "v43-route-vocabulary-file:34a03c373db860b4d0437557", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 2, + "word:terminal": 2 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/v20-quality.js", + "pathRoot": "v43-route-vocabulary-file:bd90da653d5300beeeebcab3", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Reading": 1, + "symbol:Depositing": 2 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/v21-specifying.js", + "pathRoot": "v43-route-vocabulary-file:3d6aa9f3a69fa35bfcff306a", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Reading": 1, + "symbol:Depositing": 1, + "word:exchange": 7, + "word:terminal": 3 + }, + "totalMatches": 12, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/v26-product-readiness-audit.js", + "pathRoot": "v43-route-vocabulary-file:22efdddeb409ac70604f5ab7", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 22, + "symbol:Exchange": 12, + "symbol:Terminal": 15, + "word:exchange": 4, + "word:terminal": 34 + }, + "totalMatches": 87, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/v39-assetpack-preview-quote-boundary.js", + "pathRoot": "v43-route-vocabulary-file:3b63b945dea3f55b29d5f6de", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Reading": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/v39-commercial-reading-promotion-readiness-report.js", + "pathRoot": "v43-route-vocabulary-file:61929ea0039424b43a5a49f4", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Reading": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/v39-depository-supply-indexing.js", + "pathRoot": "v43-route-vocabulary-file:50b9358c59c83e6688f39d11", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 1, + "word:terminal": 2 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/v39-enterprise-reading-ux-state.js", + "pathRoot": "v43-route-vocabulary-file:1c79c148b99a34be0c4ffd67", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 6, + "symbol:Terminal": 8, + "symbol:Reading": 5, + "word:terminal": 18 + }, + "totalMatches": 37, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/v39-interface-conversation-product-parity.js", + "pathRoot": "v43-route-vocabulary-file:28f877037ece856ed418dc60", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 3, + "symbol:Reading": 6, + "word:terminal": 11 + }, + "totalMatches": 20, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/v39-local-staging-reading-rehearsal.js", + "pathRoot": "v43-route-vocabulary-file:dae5c55f4c81efe454e0b7d9", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Reading": 5 + }, + "totalMatches": 5, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/v39-operational-telemetry-repair-readback.js", + "pathRoot": "v43-route-vocabulary-file:c9b5f13e143c9ea4c3efaf74", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1, + "symbol:Reading": 5, + "word:terminal": 2 + }, + "totalMatches": 8, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/v39-settlement-rights-delivery.js", + "pathRoot": "v43-route-vocabulary-file:e5655e8493e25314abbf8fc4", + "categories": [ + "package" + ], + "tokenCounts": { + "symbol:Reading": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/v40-api-integration-contracts.js", + "pathRoot": "v43-route-vocabulary-file:83e4d4f8bd93f2cc400078ed", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/read": 1, + "symbol:Reading": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/v40-browser-e2e-visual-proof.js", + "pathRoot": "v43-route-vocabulary-file:385f699b8e85825e45ae728b", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 4, + "route:/terminal": 10, + "symbol:Exchange": 4, + "symbol:Terminal": 6, + "symbol:Reading": 3, + "word:exchange": 8, + "word:terminal": 23 + }, + "totalMatches": 58, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/v40-conversation-terminal-integration.js", + "pathRoot": "v43-route-vocabulary-file:cfc1de807a35917fcb43fbf5", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 10, + "symbol:Terminal": 10, + "symbol:Reading": 5, + "word:terminal": 49 + }, + "totalMatches": 74, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/v40-ledger-storage-sync.js", + "pathRoot": "v43-route-vocabulary-file:807a8f56280b98c99edc89a6", + "categories": [ + "package" + ], + "tokenCounts": { + "symbol:Terminal": 2, + "word:terminal": 2 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/v40-local-staging-rehearsal-automation.js", + "pathRoot": "v43-route-vocabulary-file:70c8c5df847d9dd043359b4a", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Reading": 3 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/v40-promotion-readiness-report.js", + "pathRoot": "v43-route-vocabulary-file:f3ff3bb740a01625233fa584", + "categories": [ + "package" + ], + "tokenCounts": { + "symbol:Terminal": 1, + "symbol:Reading": 1, + "word:terminal": 1 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/v40-prompt-benchmark-smoke-v41-readiness.js", + "pathRoot": "v43-route-vocabulary-file:b63f4da345dadefd10688a79", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Reading": 3 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/v40-reading-pipeline-integration-coverage.js", + "pathRoot": "v43-route-vocabulary-file:52e29d8c5a851c9ba5adbd7a", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 1, + "route:/read": 1, + "symbol:Terminal": 1, + "symbol:Reading": 8, + "word:terminal": 7 + }, + "totalMatches": 18, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/v40-test-inventory-coverage-matrix.js", + "pathRoot": "v43-route-vocabulary-file:8463a31c8a398e5851d979ed", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Terminal": 2, + "word:terminal": 7 + }, + "totalMatches": 9, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/v40-unit-coverage-inventory.js", + "pathRoot": "v43-route-vocabulary-file:7796debfedbf9d08eb90827c", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1, + "symbol:Reading": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/v41-conversation-tool-interface-prompt-rewrite.js", + "pathRoot": "v43-route-vocabulary-file:e3bb5c8a33edb47c7d032476", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 1, + "symbol:Exchange": 1, + "symbol:Terminal": 6, + "symbol:Reading": 2, + "word:terminal": 27 + }, + "totalMatches": 37, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/v41-promotion-readiness-report.js", + "pathRoot": "v43-route-vocabulary-file:e3c1d77c3a5227a1f42f5c7d", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Reading": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/v41-prompt-program-benchmark-report.js", + "pathRoot": "v43-route-vocabulary-file:1e593ee320b86cd55ded56ce", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1, + "symbol:Reading": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/v41-promptpart-prompt-inventory.js", + "pathRoot": "v43-route-vocabulary-file:9beed106b3eeaa9632ce533f", + "categories": [ + "package" + ], + "tokenCounts": { + "symbol:Reading": 1, + "word:terminal": 2 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/v41-readfitsfinding-prompt-hardening.js", + "pathRoot": "v43-route-vocabulary-file:fd3ec6eade5c3c0f19a8a721", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/v41-reading-prompt-benchmark-baselines.js", + "pathRoot": "v43-route-vocabulary-file:0cbaf49f9ca22461b669190c", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Reading": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/v42-depositing-shortest-path.js", + "pathRoot": "v43-route-vocabulary-file:b4568ed26ce67e4e35925d58", + "categories": [ + "package" + ], + "tokenCounts": { + "route:/terminal": 4, + "symbol:Terminal": 1, + "symbol:Reading": 1, + "symbol:Depositing": 2, + "word:terminal": 12 + }, + "totalMatches": 20, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/v42-local-staging-mvp-rehearsal.js", + "pathRoot": "v43-route-vocabulary-file:0bf1647f8dddbb227a8adcfc", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 2, + "symbol:Reading": 3, + "symbol:Depositing": 1, + "word:terminal": 3 + }, + "totalMatches": 9, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/v42-promotion-readiness-report.js", + "pathRoot": "v43-route-vocabulary-file:b6a11a02db0a6819ff697a8f", + "categories": [ + "package" + ], + "tokenCounts": { + "symbol:Reading": 1, + "symbol:Depositing": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/v42-readfitsfinding-preview-quote.js", + "pathRoot": "v43-route-vocabulary-file:efd12aab652bd3ee6b3c606c", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 3, + "symbol:Terminal": 1, + "word:terminal": 9 + }, + "totalMatches": 13, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/v42-reading-shortest-path-state-machine.js", + "pathRoot": "v43-route-vocabulary-file:759ab695c02190e23354c6f6", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 8, + "symbol:Terminal": 1, + "symbol:Reading": 9, + "word:terminal": 18 + }, + "totalMatches": 36, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/v42-readneed-review-resynthesis-product-closure.js", + "pathRoot": "v43-route-vocabulary-file:37ab8c24bffb7bbf9c8df7cc", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 3, + "symbol:Terminal": 1, + "word:terminal": 9 + }, + "totalMatches": 13, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/v42-settlement-rights-delivery.js", + "pathRoot": "v43-route-vocabulary-file:f8de8495faa768e0fd6f2e39", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 3, + "symbol:Terminal": 1, + "word:terminal": 10 + }, + "totalMatches": 14, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/canonical/v43-route-vocabulary-inventory.js", + "pathRoot": "v43-route-vocabulary-file:157fd43a1b0d92c5e4c6d901", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 7, + "route:/terminal": 8, + "route:/packs": 9, + "route:/read": 8, + "route:/deposit": 7, + "symbol:Exchange": 4, + "symbol:Terminal": 6, + "symbol:Packs": 5, + "symbol:Reading": 9, + "symbol:Depositing": 6, + "symbol:PackActivity": 5, + "symbol:DepositAssetPackOption": 4, + "word:exchange": 15, + "word:terminal": 15, + "word:self-referential": 6 + }, + "totalMatches": 114, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/demo-shell-state.js", + "pathRoot": "v43-route-vocabulary-file:f10959e91d241ff9c35f957b", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/read": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/index.js", + "pathRoot": "v43-route-vocabulary-file:db42fb44c87391bf14acc071", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "word:exchange": 9, + "word:terminal": 2 + }, + "totalMatches": 11, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/src/receipt-schemas.js", + "pathRoot": "v43-route-vocabulary-file:af8e8f51e83c6cdbf8aeb02d", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "route:/deposit": 1, + "symbol:Exchange": 1, + "symbol:Terminal": 1, + "word:terminal": 1 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/test/conversation-terminal-handoff.test.js", + "pathRoot": "v43-route-vocabulary-file:8611e0a0f288f13295323da5", + "categories": [ + "package", + "test" + ], + "tokenCounts": { + "symbol:Terminal": 1, + "word:terminal": 4 + }, + "totalMatches": 5, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/test/v35-public-docs-usage-guide-catalog.test.js", + "pathRoot": "v43-route-vocabulary-file:c5cb4fb7c465146d5f39194b", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "route:/exchange": 1, + "route:/terminal": 1, + "word:exchange": 1, + "word:terminal": 1 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/test/v35-telemetry-documentation-interface-integration.test.js", + "pathRoot": "v43-route-vocabulary-file:97103812754a2ad3da73d6c3", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 1, + "word:terminal": 3 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/test/v36-exchange-activity-book.test.js", + "pathRoot": "v43-route-vocabulary-file:9349558377d4db23c59f71cb", + "categories": [ + "package", + "test" + ], + "tokenCounts": { + "word:exchange": 7 + }, + "totalMatches": 7, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/test/v36-exchange-dispute-repair-revenue-route.test.js", + "pathRoot": "v43-route-vocabulary-file:cd28a59da01f68fcbc7d4a64", + "categories": [ + "package", + "test" + ], + "tokenCounts": { + "word:exchange": 11 + }, + "totalMatches": 11, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/test/v36-exchange-intent-order-contracts.test.js", + "pathRoot": "v43-route-vocabulary-file:5efcfcb15b06326705f1e975", + "categories": [ + "package", + "test" + ], + "tokenCounts": { + "word:exchange": 8 + }, + "totalMatches": 8, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/test/v36-exchange-pricing-quote.test.js", + "pathRoot": "v43-route-vocabulary-file:44945b7d97ca1f3f3c600863", + "categories": [ + "package", + "test" + ], + "tokenCounts": { + "word:exchange": 4 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/test/v36-exchange-rehearsal.test.js", + "pathRoot": "v43-route-vocabulary-file:20565e0b2d0e9b0e761fdd38", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Exchange": 2, + "word:exchange": 5 + }, + "totalMatches": 7, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/test/v36-exchange-rights-transfer-review.test.js", + "pathRoot": "v43-route-vocabulary-file:581ccbeb37542d88a0480221", + "categories": [ + "package", + "test" + ], + "tokenCounts": { + "word:exchange": 6 + }, + "totalMatches": 6, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/test/v36-exchange-settlement-reconciliation.test.js", + "pathRoot": "v43-route-vocabulary-file:00b30f504e794b307da76dbb", + "categories": [ + "package", + "test" + ], + "tokenCounts": { + "word:exchange": 10 + }, + "totalMatches": 10, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/test/v36-exchange-ux-proof.test.js", + "pathRoot": "v43-route-vocabulary-file:6e7b46551abbde6e677fda03", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Exchange": 3, + "symbol:Terminal": 1, + "word:exchange": 5 + }, + "totalMatches": 9, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/test/v36-promotion-readiness.test.js", + "pathRoot": "v43-route-vocabulary-file:61c8015b769a83ed6e9523c6", + "categories": [ + "package", + "test" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "word:exchange": 2 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/test/v38-inference-surface-inventory.test.js", + "pathRoot": "v43-route-vocabulary-file:587e5fc76bb0a1fde8415e9e", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Reading": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/test/v38-inference-telemetry-disclosure-report.test.js", + "pathRoot": "v43-route-vocabulary-file:1a0bb28c9d0cd074fb692a39", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "word:terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/test/v38-local-staging-inference-depository-search-rehearsal.test.js", + "pathRoot": "v43-route-vocabulary-file:80657bee12229f3c17dc4b3d", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Reading": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/test/v38-prompt-benchmark-report.test.js", + "pathRoot": "v43-route-vocabulary-file:c55f3b4677e91cf078fe3bf1", + "categories": [ + "package", + "test" + ], + "tokenCounts": { + "symbol:Reading": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/test/v39-enterprise-reading-ux-state.test.js", + "pathRoot": "v43-route-vocabulary-file:fa196fe88b5defecafad488a", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Reading": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/test/v39-local-staging-reading-rehearsal.test.js", + "pathRoot": "v43-route-vocabulary-file:959dfbc75c6af5306e9d3606", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Reading": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/test/v39-promotion-readiness.test.js", + "pathRoot": "v43-route-vocabulary-file:3b57c94bd6e008db32062acf", + "categories": [ + "package", + "test" + ], + "tokenCounts": { + "symbol:Reading": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/test/v40-conversation-terminal-integration.test.js", + "pathRoot": "v43-route-vocabulary-file:1e75df87772e0c43a73e9a77", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Terminal": 2, + "word:terminal": 5 + }, + "totalMatches": 7, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/test/v40-reading-pipeline-integration-coverage.test.js", + "pathRoot": "v43-route-vocabulary-file:dd952f9cdbd14baba6100e85", + "categories": [ + "package", + "test" + ], + "tokenCounts": { + "symbol:Reading": 3 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/test/v41-conversation-tool-interface-prompt-rewrite.test.js", + "pathRoot": "v43-route-vocabulary-file:f4eea12eac9ec10070a287ba", + "categories": [ + "package", + "test" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/test/v41-reading-prompt-benchmark-baselines.test.js", + "pathRoot": "v43-route-vocabulary-file:93fdc41424c8d72af9c9679b", + "categories": [ + "package", + "test" + ], + "tokenCounts": { + "symbol:Reading": 3 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/test/v42-depositing-shortest-path.test.js", + "pathRoot": "v43-route-vocabulary-file:8ac67465b6341e4d2e45d4fe", + "categories": [ + "package", + "test" + ], + "tokenCounts": { + "symbol:Depositing": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/test/v42-reading-shortest-path-state-machine.test.js", + "pathRoot": "v43-route-vocabulary-file:a3d6da88567c2ef6b06ef1e9", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Reading": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/test/v42-settlement-rights-delivery.test.js", + "pathRoot": "v43-route-vocabulary-file:5ed019fc6a26143fa70b874f", + "categories": [ + "package", + "test" + ], + "tokenCounts": { + "word:terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/protocol/test/v43-route-vocabulary-inventory.test.js", + "pathRoot": "v43-route-vocabulary-file:eea96e35784ef80a95367858", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "route:/exchange": 1, + "route:/terminal": 1, + "route:/packs": 1, + "route:/read": 1, + "route:/deposit": 1, + "symbol:Exchange": 1, + "symbol:Terminal": 1, + "word:exchange": 1, + "word:terminal": 1 + }, + "totalMatches": 9, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/registry/README.md", + "pathRoot": "v43-route-vocabulary-file:321d503d6c1faf1a2eda8073", + "categories": [ + "doc", + "package", + "telemetry" + ], + "tokenCounts": { + "word:terminal": 3 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/registry/TLDR.md", + "pathRoot": "v43-route-vocabulary-file:a22966d63b0650cb311eb93a", + "categories": [ + "doc", + "package" + ], + "tokenCounts": { + "word:terminal": 4 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/repository-health/src/index.ts", + "pathRoot": "v43-route-vocabulary-file:b1286fdde2f65d48037359b1", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 4 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/tech-types/README.md", + "pathRoot": "v43-route-vocabulary-file:ccc8972b4f59b8ed3836fd1c", + "categories": [ + "doc", + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/templates-generics/src/index.ts", + "pathRoot": "v43-route-vocabulary-file:eb3c65246bfdf95bcc047792", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 4 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/web-search/src/__tests__/multi-provider.test.ts", + "pathRoot": "v43-route-vocabulary-file:5757254addd0d030b336b9c6", + "categories": [ + "package", + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Exchange": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/web-search/src/index.ts", + "pathRoot": "v43-route-vocabulary-file:dca5102d1caa9e2eeef8be18", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "packages/web-search/src/providers/stackoverflow.ts", + "pathRoot": "v43-route-vocabulary-file:4fb4ee8faf7c0e7ab9e22c82", + "categories": [ + "package", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 3 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/.tmp-surface-extract.txt", + "pathRoot": "v43-route-vocabulary-file:aa18b6062520d94fe7f02ad9", + "categories": [], + "tokenCounts": { + "symbol:Exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/BITCODE_DEMO_SPEC_V15.md", + "pathRoot": "v43-route-vocabulary-file:6f914b72c147ad771f502da3", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "symbol:Reading": 1, + "symbol:Depositing": 2 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/HOST_CAPABILITIES.json", + "pathRoot": "v43-route-vocabulary-file:649fa3d67afbfe427b35eb8a", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 3, + "symbol:Terminal": 2, + "word:terminal": 5 + }, + "totalMatches": 10, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/HOST_CAPABILITIES.md", + "pathRoot": "v43-route-vocabulary-file:c5cbbd65b217323447b19fa8", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 6, + "symbol:Terminal": 14, + "word:terminal": 8 + }, + "totalMatches": 28, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/README.md", + "pathRoot": "v43-route-vocabulary-file:615751d37450d2ee9b196e04", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 2, + "route:/terminal": 3, + "symbol:Terminal": 3, + "symbol:Reading": 1, + "word:exchange": 2, + "word:terminal": 3 + }, + "totalMatches": 14, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/SPEC_V10_IMPLEMENTATION_MATRIX.md", + "pathRoot": "v43-route-vocabulary-file:bbd4edee0dbf273991db9051", + "categories": [ + "doc" + ], + "tokenCounts": { + "word:exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/SPEC_V11_IMPLEMENTATION_MATRIX.md", + "pathRoot": "v43-route-vocabulary-file:9c77da544bc299066cea4454", + "categories": [ + "doc" + ], + "tokenCounts": { + "word:exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/SPEC_V12_IMPLEMENTATION_MATRIX.md", + "pathRoot": "v43-route-vocabulary-file:5f90fa4a31bbb356225e7072", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "route:/read": 3, + "symbol:Reading": 1, + "symbol:Depositing": 1 + }, + "totalMatches": 5, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/V26_DOC_COMMENT_REFORM.md", + "pathRoot": "v43-route-vocabulary-file:11b7a5d67f02abb586cbc4ba", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 2, + "symbol:Terminal": 2 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/V26_INFERENCE_SYSTEMS.md", + "pathRoot": "v43-route-vocabulary-file:80184a170392f55935f12541", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "route:/read": 2, + "symbol:Exchange": 3, + "symbol:Terminal": 4, + "word:terminal": 1 + }, + "totalMatches": 10, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/V26_PROMPT_SURFACES.md", + "pathRoot": "v43-route-vocabulary-file:cda118cb06d18900d1fdeebc", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 4, + "symbol:Terminal": 7, + "word:terminal": 1 + }, + "totalMatches": 12, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/V26_PROOF_SURFACES.md", + "pathRoot": "v43-route-vocabulary-file:74f99172701ab1731c0c1772", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 132, + "route:/read": 8, + "route:/deposit": 1, + "symbol:Exchange": 9, + "symbol:Terminal": 40, + "word:terminal": 255 + }, + "totalMatches": 445, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/V26_REFORM_STRATEGY.md", + "pathRoot": "v43-route-vocabulary-file:3325330cbaef22c3c57133b9", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 2 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/V26_SHIPPABLE_REFORM.md", + "pathRoot": "v43-route-vocabulary-file:064845ce3db03fe09b6c16fa", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 2, + "symbol:Terminal": 2 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/V26_TERMINAL_SYSTEMS.md", + "pathRoot": "v43-route-vocabulary-file:bf1f53ed9b261a7fbc4a27ac", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 145, + "route:/read": 6, + "symbol:Exchange": 7, + "symbol:Terminal": 14, + "word:terminal": 256 + }, + "totalMatches": 428, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/data/state.json", + "pathRoot": "v43-route-vocabulary-file:d08bcd2ba2bf8ec6152b5d80", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "route:/read": 1, + "word:exchange": 36 + }, + "totalMatches": 37, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/public/app.js", + "pathRoot": "v43-route-vocabulary-file:4ecf8204a0c1341ae81fb7b6", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "route:/read": 3, + "symbol:Reading": 14, + "symbol:Depositing": 26, + "word:exchange": 1 + }, + "totalMatches": 44, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/server.js", + "pathRoot": "v43-route-vocabulary-file:e2fb21932aae2a32da6c4143", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "word:terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/src/bitcode-demo.js", + "pathRoot": "v43-route-vocabulary-file:82556a7bda767cd52aabd52f", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "word:exchange": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/src/canonical/inference-implementation-records.js", + "pathRoot": "v43-route-vocabulary-file:a9bf79072360ab52521c40ea", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 4, + "symbol:Terminal": 1, + "word:terminal": 2 + }, + "totalMatches": 7, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/src/canonical/proven-generator.js", + "pathRoot": "v43-route-vocabulary-file:05f77b5845cc0a470eedbd42", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 52, + "route:/read": 1, + "symbol:Exchange": 29, + "symbol:Terminal": 55, + "word:exchange": 1, + "word:terminal": 139 + }, + "totalMatches": 277, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/src/canonical/surfaces.js", + "pathRoot": "v43-route-vocabulary-file:555a60c26032e51f79974c94", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Reading": 1, + "symbol:Depositing": 1 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/src/canonical/v20-quality.js", + "pathRoot": "v43-route-vocabulary-file:57b88eb355738903c64c92d3", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "symbol:Reading": 1, + "symbol:Depositing": 2 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/src/canonical/v21-specifying.js", + "pathRoot": "v43-route-vocabulary-file:800e578403194853c234746b", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "symbol:Reading": 1, + "symbol:Depositing": 1, + "word:terminal": 1 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/src/canonical/v26-product-readiness-audit.js", + "pathRoot": "v43-route-vocabulary-file:d6770479e91363818082046d", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 22, + "symbol:Exchange": 12, + "symbol:Terminal": 15, + "word:exchange": 4, + "word:terminal": 34 + }, + "totalMatches": 87, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/src/demo-shell-state.js", + "pathRoot": "v43-route-vocabulary-file:d80470c5df50f1701570922a", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "route:/read": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/src/local-fit-finding.js", + "pathRoot": "v43-route-vocabulary-file:76ee7d479485f06a62f78f15", + "categories": [], + "tokenCounts": { + "symbol:Terminal": 1, + "word:terminal": 2 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/src/receipt-schemas.js", + "pathRoot": "v43-route-vocabulary-file:d4ffd0d722e90e19478a8ae0", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "route:/deposit": 1, + "symbol:Exchange": 1, + "symbol:Terminal": 1, + "word:terminal": 1 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/test/api.test.js", + "pathRoot": "v43-route-vocabulary-file:a27b363db355dcdb0878b541", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "word:exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/test/local-fit-finding.test.js", + "pathRoot": "v43-route-vocabulary-file:8efa7a2e365f822b0e1fe08f", + "categories": [ + "test" + ], + "tokenCounts": { + "symbol:Terminal": 1, + "word:exchange": 1, + "word:terminal": 3 + }, + "totalMatches": 5, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/test/proven-generator.test.js", + "pathRoot": "v43-route-vocabulary-file:85f9f9b384891f25eaf42198", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Terminal": 1, + "word:terminal": 3 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/test/v20-visual-regression.test.js", + "pathRoot": "v43-route-vocabulary-file:8b41f9ab9a9714541cafbe09", + "categories": [ + "test" + ], + "tokenCounts": { + "symbol:Reading": 1, + "symbol:Depositing": 2 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/test/v21-specifying.test.js", + "pathRoot": "v43-route-vocabulary-file:418ae24156694e2ca6b32bb0", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Reading": 1, + "symbol:Depositing": 2 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/test/v26-active-product-naming.test.js", + "pathRoot": "v43-route-vocabulary-file:2414a7a4c76c989fcd53ddcc", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 28, + "route:/read": 5, + "symbol:Exchange": 11, + "symbol:Terminal": 20, + "word:exchange": 1, + "word:terminal": 40 + }, + "totalMatches": 105, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/test/v26-gate-acceptance-criteria.test.js", + "pathRoot": "v43-route-vocabulary-file:4e3444fdcb99d5dd6fc2d9f5", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 3, + "word:terminal": 4 + }, + "totalMatches": 8, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/test/v26-inference-implementation-records.test.js", + "pathRoot": "v43-route-vocabulary-file:2f543e6f5115b99b31fa31fe", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "route:/read": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/test/v26-product-readiness-audit.test.js", + "pathRoot": "v43-route-vocabulary-file:7b9300c29e86864a373f0415", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "word:exchange": 1, + "word:terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/test/v26-prompt-surface-map.test.js", + "pathRoot": "v43-route-vocabulary-file:53320d04032994b7547d2812", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 1, + "route:/read": 1, + "symbol:Terminal": 2, + "word:terminal": 3 + }, + "totalMatches": 7, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/test/v26-prompt-system-boundary.test.js", + "pathRoot": "v43-route-vocabulary-file:8a8ff4c4b24d978e8dc2e875", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Terminal": 3, + "word:terminal": 1 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/test/v26-read-review-source-to-shares.test.js", + "pathRoot": "v43-route-vocabulary-file:727a06ce4ed8b1586c4149ba", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/test/v26-shippable-reform.test.js", + "pathRoot": "v43-route-vocabulary-file:7a48bd70908727d52ca79806", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 4, + "route:/read": 4, + "symbol:Exchange": 1, + "symbol:Terminal": 2, + "word:terminal": 7 + }, + "totalMatches": 18, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/test/v26-simple-system-text-search-compatibility.test.js", + "pathRoot": "v43-route-vocabulary-file:594dbbb510cbb9b6bacad221", + "categories": [ + "test" + ], + "tokenCounts": { + "route:/read": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/test/v27-crypto-primitives.test.js", + "pathRoot": "v43-route-vocabulary-file:e3b7b64d789d770f5bc11e30", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "word:exchange": 2, + "word:terminal": 2 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "protocol-demonstration/test/v28-mvp-qa.test.js", + "pathRoot": "v43-route-vocabulary-file:b502b6d453fe34094af7e3ce", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "route:/exchange": 2, + "route:/terminal": 2, + "symbol:Exchange": 2, + "word:exchange": 4, + "word:terminal": 3 + }, + "totalMatches": 13, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v28-gate10-read-need-comprehension.mjs", + "pathRoot": "v43-route-vocabulary-file:39328a0abc71a3e7b97c97f2", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 1, + "word:terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v28-gate11-read-fits-finding-preview.mjs", + "pathRoot": "v43-route-vocabulary-file:d33f5f3657fcfdda85c0df35", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 1, + "word:terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v28-gate12-settlement-rights-delivery.mjs", + "pathRoot": "v43-route-vocabulary-file:484340e142a72e9bb9eb0473", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 2, + "word:terminal": 3 + }, + "totalMatches": 5, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v28-gate9-depository-evidence.mjs", + "pathRoot": "v43-route-vocabulary-file:82c2737e6a09a64117f6331c", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 3, + "symbol:Depositing": 1, + "word:terminal": 5 + }, + "totalMatches": 9, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v29-gate1-objectives-and-gating.mjs", + "pathRoot": "v43-route-vocabulary-file:3a236cbae37d0cea23f2be62", + "categories": [ + "script" + ], + "tokenCounts": { + "symbol:Terminal": 2, + "symbol:Reading": 1 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v29-gate10-local-staging-promotion-readiness.mjs", + "pathRoot": "v43-route-vocabulary-file:71631de2bc39f89520b4b299", + "categories": [ + "script" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v29-gate2-terminal-transaction-read-models.mjs", + "pathRoot": "v43-route-vocabulary-file:d8115d61320d0a8bbdf47dad", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 14, + "symbol:Terminal": 9, + "word:terminal": 20 + }, + "totalMatches": 43, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v29-gate3-wallet-signer-btc-operations.mjs", + "pathRoot": "v43-route-vocabulary-file:d389f571241e36b1d766f737", + "categories": [ + "script" + ], + "tokenCounts": { + "route:/terminal": 13, + "route:/read": 1, + "symbol:Terminal": 5, + "word:terminal": 19 + }, + "totalMatches": 38, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v29-gate4-reading-pipeline-observability.mjs", + "pathRoot": "v43-route-vocabulary-file:a1723d70806fee5715e731df", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 4, + "symbol:Terminal": 3, + "symbol:Reading": 14, + "word:terminal": 6 + }, + "totalMatches": 27, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v29-gate5-assetpack-disclosure-rights.mjs", + "pathRoot": "v43-route-vocabulary-file:a3cc279a675c4da702109b6b", + "categories": [ + "script" + ], + "tokenCounts": { + "route:/terminal": 4, + "symbol:Terminal": 1, + "word:terminal": 11 + }, + "totalMatches": 16, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v29-gate6-settlement-reconciliation-repair.mjs", + "pathRoot": "v43-route-vocabulary-file:77bf590794c2f3764285d236", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 8, + "symbol:Terminal": 2, + "word:terminal": 12 + }, + "totalMatches": 22, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v29-gate7-organization-permission-authority.mjs", + "pathRoot": "v43-route-vocabulary-file:d6a9e8436c96228228f310aa", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 12, + "symbol:Terminal": 1, + "word:terminal": 21 + }, + "totalMatches": 34, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v29-gate9-terminal-ux-browser-proof.mjs", + "pathRoot": "v43-route-vocabulary-file:32fdb75c131515c0ca41cdf7", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 17, + "symbol:Terminal": 15, + "word:terminal": 43 + }, + "totalMatches": 75, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v30-gate4-btd-assetpack-mint-read-receipts.mjs", + "pathRoot": "v43-route-vocabulary-file:0cfd022a3a7b4a85220ea248", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 4, + "route:/read": 3, + "symbol:Terminal": 5, + "word:terminal": 8 + }, + "totalMatches": 20, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v30-gate5-testnet-ledger-projection-hardening.mjs", + "pathRoot": "v43-route-vocabulary-file:40911cd079cffd5de59f116c", + "categories": [ + "script" + ], + "tokenCounts": { + "route:/terminal": 8, + "symbol:Terminal": 3, + "word:terminal": 12 + }, + "totalMatches": 23, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v30-gate6-source-to-shares-proof-cleanup.mjs", + "pathRoot": "v43-route-vocabulary-file:70ae39e926cb08d49164fccf", + "categories": [ + "script" + ], + "tokenCounts": { + "route:/terminal": 2, + "symbol:Terminal": 1, + "word:terminal": 3 + }, + "totalMatches": 6, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v30-gate7-bridge-readiness-research-boundaries.mjs", + "pathRoot": "v43-route-vocabulary-file:bb5345594662ee7ced585773", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 2, + "symbol:Terminal": 1, + "word:terminal": 3 + }, + "totalMatches": 6, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v30-gate8-protocol-telemetry-proof-hooks.mjs", + "pathRoot": "v43-route-vocabulary-file:8a8474de545c355967123609", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 2, + "symbol:Terminal": 1, + "word:terminal": 3 + }, + "totalMatches": 6, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v30-gate9-interface-integration-regression-proof.mjs", + "pathRoot": "v43-route-vocabulary-file:417fb0a1920c635c3cdc60ea", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 6, + "symbol:Terminal": 5, + "word:terminal": 12 + }, + "totalMatches": 23, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v31-gate4-connects-provider-readiness.mjs", + "pathRoot": "v43-route-vocabulary-file:ffa6941a5acb0e849aee54b1", + "categories": [ + "script" + ], + "tokenCounts": { + "route:/read": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v31-gate5-wallet-btd-pane-readiness.mjs", + "pathRoot": "v43-route-vocabulary-file:49d000ff0049dbd33acf2d4b", + "categories": [ + "script" + ], + "tokenCounts": { + "route:/read": 1, + "symbol:Exchange": 3 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v31-gate6-organization-team-role-policy-authority.mjs", + "pathRoot": "v43-route-vocabulary-file:cdd7ffd7ca4d8f5288bd8464", + "categories": [ + "script" + ], + "tokenCounts": { + "route:/terminal": 5, + "route:/read": 1, + "symbol:Terminal": 3, + "word:terminal": 7 + }, + "totalMatches": 16, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v31-gate7-interfaces-pane-admission-cross-surface-contracts.mjs", + "pathRoot": "v43-route-vocabulary-file:c84775baa99a54fcd5ab8535", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "route:/read": 1, + "symbol:Exchange": 1, + "symbol:Terminal": 1, + "word:exchange": 5, + "word:terminal": 1 + }, + "totalMatches": 9, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v32-gate1-provation-roadmap-opening.mjs", + "pathRoot": "v43-route-vocabulary-file:2f15502d4cd9b68ded29fb44", + "categories": [ + "script" + ], + "tokenCounts": { + "symbol:Reading": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v32-gate4-reading-pipeline-proof-coverage.mjs", + "pathRoot": "v43-route-vocabulary-file:56812603d51e70712f06cc63", + "categories": [ + "script" + ], + "tokenCounts": { + "symbol:Reading": 21 + }, + "totalMatches": 21, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v32-gate5-ledger-btd-settlement-failure-states.mjs", + "pathRoot": "v43-route-vocabulary-file:a2a75e1d6716edaa874c4246", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "route:/read": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v32-gate6-interface-contract-regression-suites.mjs", + "pathRoot": "v43-route-vocabulary-file:9f44db62f81bf1c5c1a73e11", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 1, + "symbol:Exchange": 1, + "word:terminal": 3 + }, + "totalMatches": 5, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v32-gate7-browser-accessibility-responsive-visual-proof.mjs", + "pathRoot": "v43-route-vocabulary-file:a8f5ae602fb6e63348cbf6a7", + "categories": [ + "script" + ], + "tokenCounts": { + "route:/terminal": 3, + "symbol:Terminal": 2, + "word:terminal": 4 + }, + "totalMatches": 9, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v33-gate2-interface-contract-catalog.mjs", + "pathRoot": "v43-route-vocabulary-file:74810f024be5f9e55720dff6", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v33-gate4-chatgpt-app-action-contracts.mjs", + "pathRoot": "v43-route-vocabulary-file:3d82083d94ff3b6ac006047b", + "categories": [ + "script" + ], + "tokenCounts": { + "symbol:Reading": 3 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v33-gate5-interface-authorization-policy.mjs", + "pathRoot": "v43-route-vocabulary-file:e03440b53324baf62fa3e958", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1, + "word:terminal": 2 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v33-gate6-read-license-assetpack-rights-contracts.mjs", + "pathRoot": "v43-route-vocabulary-file:bc62f16f98758f917962dfce", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1, + "word:terminal": 2 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v33-gate7-api-schema-compatibility-matrix.mjs", + "pathRoot": "v43-route-vocabulary-file:b779af8982cb06fe11178c66", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v33-gate8-interface-telemetry-proof-hooks.mjs", + "pathRoot": "v43-route-vocabulary-file:77a779855db7949a56d5d2b5", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 4 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v33-gate9-interface-consumer-ux-regression-proof.mjs", + "pathRoot": "v43-route-vocabulary-file:ecbb301569f83cc502fd94f5", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v34-gate9-local-staging-testnet-deployment-rehearsal.mjs", + "pathRoot": "v43-route-vocabulary-file:67bea68750d44b0e29b1f09a", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 2, + "symbol:Reading": 2, + "word:terminal": 1 + }, + "totalMatches": 5, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v35-gate4-public-docs-usage-guides.mjs", + "pathRoot": "v43-route-vocabulary-file:65ebb83577d1bcd254cc1977", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 2, + "symbol:Terminal": 1 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v35-gate8-telemetry-documentation-interface-integration.mjs", + "pathRoot": "v43-route-vocabulary-file:55dfc84042e50c5a799dab7d", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 2, + "symbol:Terminal": 1, + "word:terminal": 3 + }, + "totalMatches": 6, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v35-gate9-local-staging-telemetry-documentation-rehearsal.mjs", + "pathRoot": "v43-route-vocabulary-file:ceb6065cd343b4e344a34ab5", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 2, + "word:terminal": 2 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v36-gate1-exchange-roadmap-opening.mjs", + "pathRoot": "v43-route-vocabulary-file:e7f3ff98d2cdf020f52e8346", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 11, + "symbol:Terminal": 1, + "word:exchange": 6 + }, + "totalMatches": 18, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v36-gate10-promotion-readiness.mjs", + "pathRoot": "v43-route-vocabulary-file:64f206d5136a43ab3f9630a9", + "categories": [ + "script" + ], + "tokenCounts": { + "symbol:Exchange": 2, + "word:exchange": 9 + }, + "totalMatches": 11, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v36-gate2-exchange-activity-book-market-master-detail.mjs", + "pathRoot": "v43-route-vocabulary-file:8467e505e01b352b2cc409bd", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 2, + "symbol:Exchange": 42, + "word:exchange": 22 + }, + "totalMatches": 66, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v36-gate3-exchange-intent-order-contracts.mjs", + "pathRoot": "v43-route-vocabulary-file:d4d25bc7addab3c4efb3a257", + "categories": [ + "script" + ], + "tokenCounts": { + "route:/exchange": 2, + "symbol:Exchange": 33, + "word:exchange": 31 + }, + "totalMatches": 66, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v36-gate4-exchange-rights-transfer-review.mjs", + "pathRoot": "v43-route-vocabulary-file:b7d230bfcf104e7c6da724f7", + "categories": [ + "script" + ], + "tokenCounts": { + "route:/exchange": 2, + "symbol:Exchange": 28, + "word:exchange": 21 + }, + "totalMatches": 51, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v36-gate5-exchange-pricing-quote.mjs", + "pathRoot": "v43-route-vocabulary-file:a5f625eb595d9435291b4876", + "categories": [ + "script" + ], + "tokenCounts": { + "route:/exchange": 2, + "symbol:Exchange": 30, + "word:exchange": 20 + }, + "totalMatches": 52, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v36-gate6-exchange-settlement-reconciliation.mjs", + "pathRoot": "v43-route-vocabulary-file:60a187bacf1774d6e3326fec", + "categories": [ + "script" + ], + "tokenCounts": { + "route:/exchange": 2, + "symbol:Exchange": 24, + "word:exchange": 22 + }, + "totalMatches": 48, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v36-gate7-exchange-dispute-repair-revenue-route.mjs", + "pathRoot": "v43-route-vocabulary-file:5675a5dc004c6ee68d80d702", + "categories": [ + "script" + ], + "tokenCounts": { + "route:/exchange": 2, + "symbol:Exchange": 35, + "word:exchange": 24 + }, + "totalMatches": 61, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v36-gate8-exchange-ux-proof.mjs", + "pathRoot": "v43-route-vocabulary-file:ad96bfed8d039521da267833", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 4, + "route:/terminal": 5, + "symbol:Exchange": 50, + "symbol:Terminal": 7, + "word:exchange": 25, + "word:terminal": 7 + }, + "totalMatches": 98, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v36-gate9-exchange-rehearsal.mjs", + "pathRoot": "v43-route-vocabulary-file:a5abde5876dbc1b3524a65df", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 2, + "symbol:Exchange": 39, + "word:exchange": 19 + }, + "totalMatches": 60, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v37-gate1-conversations-roadmap-opening.mjs", + "pathRoot": "v43-route-vocabulary-file:3fb60d7753685b7ab4c78474", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v37-gate10-promotion-readiness.mjs", + "pathRoot": "v43-route-vocabulary-file:bc79f3c3466a5e18bd2ca2ac", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "word:terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v37-gate4-conversation-writing-workspace.mjs", + "pathRoot": "v43-route-vocabulary-file:d7b58ca22422b753a875b837", + "categories": [ + "script" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v37-gate6-conversation-terminal-handoff.mjs", + "pathRoot": "v43-route-vocabulary-file:216e556bbfe7a979068c99f0", + "categories": [ + "script" + ], + "tokenCounts": { + "route:/terminal": 4, + "symbol:Exchange": 1, + "symbol:Terminal": 7, + "symbol:Reading": 1, + "symbol:Depositing": 1, + "word:exchange": 1, + "word:terminal": 49 + }, + "totalMatches": 64, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v37-gate8-conversation-telemetry-proof-hooks.mjs", + "pathRoot": "v43-route-vocabulary-file:7309999d921dce6b8d3b259a", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 2, + "word:terminal": 2 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v37-gate9-conversation-rehearsal.mjs", + "pathRoot": "v43-route-vocabulary-file:1317cdcf2457868e091d3ab4", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v38-gate1-inference-stack-roadmap-opening.mjs", + "pathRoot": "v43-route-vocabulary-file:a6b3b4fb3c4ae758e3661645", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "symbol:Reading": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v38-gate10-local-staging-inference-depository-search-rehearsal.mjs", + "pathRoot": "v43-route-vocabulary-file:d36da4fc7d85afde58210f5a", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "symbol:Reading": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v38-gate2-inference-surface-inventory.mjs", + "pathRoot": "v43-route-vocabulary-file:9964e4ba67d9c5d2afb55920", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "symbol:Reading": 3 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v38-gate5-inference-telemetry-disclosure-report.mjs", + "pathRoot": "v43-route-vocabulary-file:a2f72b88a4addf2e10557546", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 1, + "word:terminal": 2 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v38-gate6-read-need-comprehension-inference-hardening.mjs", + "pathRoot": "v43-route-vocabulary-file:be7d2a4a5ebc09871412a909", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 1, + "symbol:Terminal": 1, + "word:terminal": 1 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v38-gate7-read-fits-finding-search-embeddings.mjs", + "pathRoot": "v43-route-vocabulary-file:55eca2c43244e1b7a4bffd4b", + "categories": [ + "script" + ], + "tokenCounts": { + "route:/terminal": 1, + "word:terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v38-gate8-assetpack-synthesis-economic-traceability.mjs", + "pathRoot": "v43-route-vocabulary-file:34b6f9048cc4e3f3b77bacb5", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "route:/read": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v39-gate1-commercial-reading-roadmap-opening.mjs", + "pathRoot": "v43-route-vocabulary-file:65d79c1efb56132c2a403642", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "symbol:Reading": 11 + }, + "totalMatches": 11, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v39-gate10-local-staging-reading-rehearsal.mjs", + "pathRoot": "v43-route-vocabulary-file:7d661c1b692a8cf9b5a86492", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "symbol:Reading": 10 + }, + "totalMatches": 10, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v39-gate11-promotion-readiness.mjs", + "pathRoot": "v43-route-vocabulary-file:d1312d43335f5b439add7653", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "symbol:Reading": 3 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v39-gate3-enterprise-reading-ux-state.mjs", + "pathRoot": "v43-route-vocabulary-file:cb61c8dbf38710dd26386354", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 7, + "symbol:Terminal": 1, + "symbol:Reading": 9, + "word:terminal": 13 + }, + "totalMatches": 30, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v40-gate1-testing-roadmap-opening.mjs", + "pathRoot": "v43-route-vocabulary-file:5ac97d0d6b4a98877f6a1df3", + "categories": [ + "script" + ], + "tokenCounts": { + "symbol:Terminal": 1, + "symbol:Reading": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v40-gate11-promotion-readiness.mjs", + "pathRoot": "v43-route-vocabulary-file:8824bedd926738fbdc115c75", + "categories": [ + "script" + ], + "tokenCounts": { + "word:terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v40-gate5-reading-pipeline-integration.mjs", + "pathRoot": "v43-route-vocabulary-file:5aa939b7241413169f51ae84", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "symbol:Reading": 18 + }, + "totalMatches": 18, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v40-gate6-conversation-terminal-integration.mjs", + "pathRoot": "v43-route-vocabulary-file:146f5b6d830c1f72abdc54fa", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 16, + "symbol:Reading": 1, + "word:terminal": 12 + }, + "totalMatches": 29, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v41-gate1-prompt-program-roadmap-opening.mjs", + "pathRoot": "v43-route-vocabulary-file:b62da419110f029e2abfb128", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "symbol:Reading": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v41-gate2-promptpart-prompt-inventory.mjs", + "pathRoot": "v43-route-vocabulary-file:d6de95796b519f92310bba8f", + "categories": [ + "script" + ], + "tokenCounts": { + "symbol:Reading": 3, + "symbol:Depositing": 2 + }, + "totalMatches": 5, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v41-gate4-reading-prompt-benchmark-baselines.mjs", + "pathRoot": "v43-route-vocabulary-file:f0607b5174bf67d6dd0a86f3", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "symbol:Reading": 41 + }, + "totalMatches": 41, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v41-gate7-conversation-tool-interface-prompt-rewrite.mjs", + "pathRoot": "v43-route-vocabulary-file:b91ed2407b187e4ad341bfc4", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1, + "symbol:Reading": 1, + "word:terminal": 3 + }, + "totalMatches": 5, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v41-gate8-prompt-program-benchmark-report.mjs", + "pathRoot": "v43-route-vocabulary-file:755e89b1bbb2b5f68d13f1f6", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "symbol:Reading": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v42-gate1-mvp-experience-roadmap-opening.mjs", + "pathRoot": "v43-route-vocabulary-file:8291ad63a3cbec4f823ce3fb", + "categories": [ + "script" + ], + "tokenCounts": { + "symbol:Reading": 3, + "symbol:Depositing": 2 + }, + "totalMatches": 5, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v42-gate2-depositing-shortest-path.mjs", + "pathRoot": "v43-route-vocabulary-file:54a58b79d575baa429404386", + "categories": [ + "script" + ], + "tokenCounts": { + "route:/terminal": 4, + "symbol:Terminal": 1, + "symbol:Depositing": 6, + "word:terminal": 7 + }, + "totalMatches": 18, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v42-gate3-reading-shortest-path-state-machine.mjs", + "pathRoot": "v43-route-vocabulary-file:a3da36629b9b2994332b4ba2", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 9, + "symbol:Terminal": 1, + "symbol:Reading": 11, + "word:terminal": 15 + }, + "totalMatches": 36, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v42-gate4-readneed-review-resynthesis-product-closure.mjs", + "pathRoot": "v43-route-vocabulary-file:e1b127e88e45612ca58af988", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 3, + "symbol:Terminal": 3, + "word:terminal": 3 + }, + "totalMatches": 9, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v42-gate5-readfitsfinding-preview-quote.mjs", + "pathRoot": "v43-route-vocabulary-file:284bfa757a9c1c3769a41bbd", + "categories": [ + "script" + ], + "tokenCounts": { + "route:/terminal": 4, + "symbol:Terminal": 3, + "word:terminal": 5 + }, + "totalMatches": 12, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v42-gate6-settlement-rights-delivery.mjs", + "pathRoot": "v43-route-vocabulary-file:665ad8528bac6493069d0fca", + "categories": [ + "script" + ], + "tokenCounts": { + "route:/terminal": 3, + "symbol:Terminal": 1, + "word:terminal": 4 + }, + "totalMatches": 8, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v42-gate8-local-staging-mvp-rehearsal.mjs", + "pathRoot": "v43-route-vocabulary-file:0daa3e0349051104817a2c17", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 1, + "symbol:Depositing": 1, + "word:terminal": 1 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v43-gate1-packs-read-deposit-roadmap.mjs", + "pathRoot": "v43-route-vocabulary-file:061c1af18600325db56eefd5", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "route:/packs": 2, + "route:/read": 4, + "route:/deposit": 4, + "symbol:Packs": 2, + "symbol:Reading": 1, + "symbol:PackActivity": 1, + "symbol:DepositAssetPackOption": 1, + "word:self-referential": 1 + }, + "totalMatches": 16, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/check-v43-gate2-route-vocabulary-inventory.mjs", + "pathRoot": "v43-route-vocabulary-file:a753afa463080d17811f1439", + "categories": [ + "script" + ], + "tokenCounts": { + "route:/exchange": 1, + "route:/terminal": 1, + "route:/packs": 1, + "route:/read": 1, + "route:/deposit": 1, + "word:exchange": 1, + "word:terminal": 1, + "word:self-referential": 1 + }, + "totalMatches": 8, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/code-review/README.md", + "pathRoot": "v43-route-vocabulary-file:fef2886ffeed000a3327379c", + "categories": [ + "doc", + "script" + ], + "tokenCounts": { + "word:terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/generate-massive-prompt-parts.ts", + "pathRoot": "v43-route-vocabulary-file:0e76c577369ae46f56a24261", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 2 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/generate-v32-browser-accessibility-responsive-visual-proof.mjs", + "pathRoot": "v43-route-vocabulary-file:1dda7e627a4f029259cca30a", + "categories": [ + "script" + ], + "tokenCounts": { + "route:/terminal": 2, + "symbol:Terminal": 3, + "word:terminal": 6 + }, + "totalMatches": 11, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/generate-v32-interface-contract-regression-suites.mjs", + "pathRoot": "v43-route-vocabulary-file:d404700e1c5c2048de40db74", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 2, + "symbol:Exchange": 3, + "word:exchange": 3, + "word:terminal": 7 + }, + "totalMatches": 15, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/generate-v32-ledger-btd-settlement-failure-states.mjs", + "pathRoot": "v43-route-vocabulary-file:63840f3a3c92cf6e7b183d26", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "route:/read": 2, + "word:terminal": 1 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/generate-v33-api-schema-compatibility-matrix.mjs", + "pathRoot": "v43-route-vocabulary-file:9d486abe857ab8b9a74d332b", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1, + "word:exchange": 3, + "word:terminal": 3 + }, + "totalMatches": 7, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/generate-v33-chatgpt-app-action-contracts.mjs", + "pathRoot": "v43-route-vocabulary-file:3bb33b6576f6b6b5b80a6570", + "categories": [ + "script" + ], + "tokenCounts": { + "symbol:Reading": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/generate-v33-interface-authorization-policy.mjs", + "pathRoot": "v43-route-vocabulary-file:03bd80fc14f8fa5037377a49", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 3, + "word:terminal": 5 + }, + "totalMatches": 8, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/generate-v33-interface-consumer-ux-regression-proof.mjs", + "pathRoot": "v43-route-vocabulary-file:bf359815d7b67862b3949271", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 2, + "word:terminal": 7 + }, + "totalMatches": 9, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/generate-v33-interface-contract-catalog.mjs", + "pathRoot": "v43-route-vocabulary-file:b2b33bc376c90dda89df30f1", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 1, + "route:/terminal": 1, + "symbol:Exchange": 1, + "symbol:Terminal": 1, + "word:exchange": 6, + "word:terminal": 4 + }, + "totalMatches": 14, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/generate-v33-interface-telemetry-proof-hooks.mjs", + "pathRoot": "v43-route-vocabulary-file:3c9dc7f394e1e6daf0376e12", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 2, + "word:terminal": 7 + }, + "totalMatches": 9, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/generate-v33-read-license-assetpack-rights-contracts.mjs", + "pathRoot": "v43-route-vocabulary-file:fb0a31c0d5c1190a0c9d4cf8", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 2, + "word:terminal": 5 + }, + "totalMatches": 7, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/generate-v34-local-staging-testnet-deployment-rehearsal.mjs", + "pathRoot": "v43-route-vocabulary-file:7be7a596dbbbf26469c18d5d", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 1, + "word:terminal": 8 + }, + "totalMatches": 9, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/generate-v34-migration-cicd-approval-gates.mjs", + "pathRoot": "v43-route-vocabulary-file:fabb927b9d7f9668f04826f6", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1, + "symbol:Reading": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/generate-v34-secret-rotation-boundary-operations.mjs", + "pathRoot": "v43-route-vocabulary-file:d8a31d873b4c0e4515639e82", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/generate-v36-exchange-activity-book.mjs", + "pathRoot": "v43-route-vocabulary-file:a40fdd95d8ee194947c5763a", + "categories": [ + "script" + ], + "tokenCounts": { + "symbol:Exchange": 2, + "word:exchange": 1 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/generate-v36-exchange-dispute-repair-revenue-route.mjs", + "pathRoot": "v43-route-vocabulary-file:1e9e0f261a6aa710009453fd", + "categories": [ + "script" + ], + "tokenCounts": { + "symbol:Exchange": 2, + "word:exchange": 1 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/generate-v36-exchange-intent-order-contracts.mjs", + "pathRoot": "v43-route-vocabulary-file:c297a36ff95df7b6f7d719e6", + "categories": [ + "script" + ], + "tokenCounts": { + "symbol:Exchange": 2, + "word:exchange": 1 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/generate-v36-exchange-pricing-quote.mjs", + "pathRoot": "v43-route-vocabulary-file:8ecba5f8a22f81ee02dca7d3", + "categories": [ + "script" + ], + "tokenCounts": { + "symbol:Exchange": 2, + "word:exchange": 1 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/generate-v36-exchange-rehearsal.mjs", + "pathRoot": "v43-route-vocabulary-file:8f5ffe43cb9ec321a9fdacf2", + "categories": [ + "script" + ], + "tokenCounts": { + "symbol:Exchange": 2, + "word:exchange": 1 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/generate-v36-exchange-rights-transfer-review.mjs", + "pathRoot": "v43-route-vocabulary-file:099e0aa81f7400231843807d", + "categories": [ + "script" + ], + "tokenCounts": { + "symbol:Exchange": 2, + "word:exchange": 1 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/generate-v36-exchange-settlement-reconciliation.mjs", + "pathRoot": "v43-route-vocabulary-file:f1aa6ee3df8e0785416a647a", + "categories": [ + "script" + ], + "tokenCounts": { + "symbol:Exchange": 2, + "word:exchange": 1 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/generate-v36-exchange-ux-proof.mjs", + "pathRoot": "v43-route-vocabulary-file:c32b67390d68dad1d2ff3637", + "categories": [ + "script" + ], + "tokenCounts": { + "symbol:Exchange": 2, + "word:exchange": 1 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/generate-v36-promotion-readiness-report.mjs", + "pathRoot": "v43-route-vocabulary-file:4829560ffa86b898064feea6", + "categories": [ + "script" + ], + "tokenCounts": { + "symbol:Exchange": 2, + "word:exchange": 2 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/generate-v37-conversation-terminal-handoff.mjs", + "pathRoot": "v43-route-vocabulary-file:c6909ca4e9109ae4da527c23", + "categories": [ + "script" + ], + "tokenCounts": { + "word:terminal": 3 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/generate-v39-promotion-readiness-report.mjs", + "pathRoot": "v43-route-vocabulary-file:77c5c743693d5dd93c642877", + "categories": [ + "script" + ], + "tokenCounts": { + "symbol:Reading": 3 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/generate-v40-conversation-terminal-integration.mjs", + "pathRoot": "v43-route-vocabulary-file:28b8341e6ca99b34757cc32c", + "categories": [ + "script" + ], + "tokenCounts": { + "word:terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/generate-v41-reading-prompt-benchmark-baselines.mjs", + "pathRoot": "v43-route-vocabulary-file:8d2dc88646b5b1e5d347ef3a", + "categories": [ + "script" + ], + "tokenCounts": { + "symbol:Reading": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/prepare-bitcode-spec-family-promotion.mjs", + "pathRoot": "v43-route-vocabulary-file:670ed0d24221e4688c6eaa1a", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "route:/read": 2, + "symbol:Exchange": 12, + "symbol:Terminal": 24, + "symbol:Reading": 36, + "symbol:Depositing": 3, + "word:exchange": 7, + "word:terminal": 2 + }, + "totalMatches": 86, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/promote-bitcode-canon.mjs", + "pathRoot": "v43-route-vocabulary-file:a51180eb91907243f41d43c5", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "route:/read": 1, + "symbol:Exchange": 6, + "symbol:Terminal": 8, + "symbol:Reading": 12, + "symbol:Depositing": 1, + "word:exchange": 9, + "word:terminal": 13 + }, + "totalMatches": 50, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/rehearse-v40-local-staging-testnet.mjs", + "pathRoot": "v43-route-vocabulary-file:88571c33341a30221f1f0fdd", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "symbol:Reading": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "scripts/v32-proof-coverage-matrix.mjs", + "pathRoot": "v43-route-vocabulary-file:983a1efc0c552126afdf62db", + "categories": [ + "script", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 2, + "route:/read": 1, + "symbol:Terminal": 2, + "symbol:Reading": 1, + "word:terminal": 6 + }, + "totalMatches": 12, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "supabase/DATA_HEALTH.md", + "pathRoot": "v43-route-vocabulary-file:9485f626d6acd179fd0cb0f1", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 11, + "word:terminal": 1 + }, + "totalMatches": 12, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/ARCHITECTURE.md", + "pathRoot": "v43-route-vocabulary-file:4a399ac908531801a7bb9de4", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/README.md", + "pathRoot": "v43-route-vocabulary-file:04541d06dd7be1db69b23d3a", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 4, + "route:/terminal": 10, + "route:/read": 1, + "symbol:Exchange": 3, + "symbol:Terminal": 4, + "word:exchange": 4, + "word:terminal": 13 + }, + "totalMatches": 39, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/(root)/components/MarketingBtdShareMetricsSection.tsx", + "pathRoot": "v43-route-vocabulary-file:3834760d340a81561571f5f5", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 3 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/(root)/components/MarketingCompetitorTableSection.tsx", + "pathRoot": "v43-route-vocabulary-file:36c0167e5538431319e7e7a3", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Reading": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/(root)/components/MarketingComputeSection.tsx", + "pathRoot": "v43-route-vocabulary-file:60d924923e14875345dbc70c", + "categories": [ + "component" + ], + "tokenCounts": { + "symbol:Terminal": 2, + "word:terminal": 3 + }, + "totalMatches": 5, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/(root)/components/MarketingFaqSection.tsx", + "pathRoot": "v43-route-vocabulary-file:a3c15474b6e4feea10881b2b", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 1, + "word:exchange": 1 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/(root)/components/MarketingFeaturesGrid.tsx", + "pathRoot": "v43-route-vocabulary-file:e84a316799c9fcebf95fbc15", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 6 + }, + "totalMatches": 7, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/(root)/components/MarketingMarketplaceSection.tsx", + "pathRoot": "v43-route-vocabulary-file:95424f08be42fae9c9f15917", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/(root)/components/MarketingOperatorGuideCard.tsx", + "pathRoot": "v43-route-vocabulary-file:87aa5c7e28ed2010735d1d8b", + "categories": [ + "component" + ], + "tokenCounts": { + "route:/terminal": 1, + "word:terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/(root)/components/MarketingPricingSection.tsx", + "pathRoot": "v43-route-vocabulary-file:5b434a026a2b9827f7866ae2", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 1, + "route:/terminal": 2, + "symbol:Exchange": 5, + "symbol:Terminal": 5, + "word:exchange": 2, + "word:terminal": 3 + }, + "totalMatches": 18, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/(root)/components/MarketingSetupForm.tsx", + "pathRoot": "v43-route-vocabulary-file:547eec567816769b10bb0dcc", + "categories": [ + "component" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/(root)/components/MarketingWalkthroughSection.tsx", + "pathRoot": "v43-route-vocabulary-file:d43d1432bc03acff97af51dd", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/(root)/components/PublicDocsPageContent.tsx", + "pathRoot": "v43-route-vocabulary-file:6229a7e91a89dc17a2c25a3c", + "categories": [ + "component" + ], + "tokenCounts": { + "route:/exchange": 2, + "route:/terminal": 1, + "route:/read": 1, + "symbol:Exchange": 7, + "symbol:Terminal": 11, + "word:exchange": 2, + "word:terminal": 4 + }, + "totalMatches": 28, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/(root)/components/landing/MarketingLandingTerminalPreview.tsx", + "pathRoot": "v43-route-vocabulary-file:a915aabe2811cc89b32ea386", + "categories": [ + "component" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/(root)/components/landing/marketing-landing-shared.tsx", + "pathRoot": "v43-route-vocabulary-file:40bcdb22d0623beab92379ea", + "categories": [ + "component" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 2 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/ClientLayoutInner.tsx", + "pathRoot": "v43-route-vocabulary-file:d396d12d3a69bf9680192db5", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 1, + "word:terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/api/activity/route.ts", + "pathRoot": "v43-route-vocabulary-file:9f0207ff00bece42ab29fccb", + "categories": [ + "api", + "route", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 1, + "word:terminal": 2 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/api/conversations/_shared.ts", + "pathRoot": "v43-route-vocabulary-file:30f21445a1e7d6f2b3743644", + "categories": [ + "api", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 9, + "word:terminal": 1 + }, + "totalMatches": 11, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/api/deposits/route.ts", + "pathRoot": "v43-route-vocabulary-file:3f98c52dfd6a33985eb46972", + "categories": [ + "api", + "route" + ], + "tokenCounts": { + "route:/terminal": 1, + "word:terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/api/executions/stream/route.ts", + "pathRoot": "v43-route-vocabulary-file:3594de60719262299a58fa30", + "categories": [ + "api", + "route", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/api/make-bitcode-branch/route.ts", + "pathRoot": "v43-route-vocabulary-file:2c93a63aab5b68948d55d7b8", + "categories": [ + "api", + "route" + ], + "tokenCounts": { + "route:/terminal": 1, + "word:terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/api/pipeline-harness/asset-pack/preflight.ts", + "pathRoot": "v43-route-vocabulary-file:3a921e6cfdde7fd865f987d4", + "categories": [ + "api", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/api/pipeline-harness/asset-pack/runner.ts", + "pathRoot": "v43-route-vocabulary-file:ba99c89ff13ff5fb19487e6b", + "categories": [ + "api", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/api/vcs/[provider]/oauth/route.ts", + "pathRoot": "v43-route-vocabulary-file:ab71b46afded881643ec9892", + "categories": [ + "api", + "route" + ], + "tokenCounts": { + "route:/terminal": 1, + "word:terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/api/webhook/route.ts", + "pathRoot": "v43-route-vocabulary-file:1bda46d1a21ba70ea4bd83e6", + "categories": [ + "api", + "route", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/api/webhook/verify.ts", + "pathRoot": "v43-route-vocabulary-file:9f77a6aed28dd7c0c8909ea5", + "categories": [ + "api" + ], + "tokenCounts": { + "symbol:Exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/auxillaries/README.md", + "pathRoot": "v43-route-vocabulary-file:87ee04f69ed393a377605b4d", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 6, + "symbol:Exchange": 3, + "symbol:Terminal": 4, + "word:terminal": 6 + }, + "totalMatches": 19, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/auxillaries/components/AuxillariesExternalsPane.tsx", + "pathRoot": "v43-route-vocabulary-file:7a12ebc1cda49d540f111856", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 2, + "word:terminal": 3 + }, + "totalMatches": 5, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/auxillaries/components/AuxillariesInterfacesPane.tsx", + "pathRoot": "v43-route-vocabulary-file:bc8a06436d9f32679d6f827d", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 10, + "symbol:Reading": 2, + "word:terminal": 4 + }, + "totalMatches": 17, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/auxillaries/components/AuxillariesLoginPane.tsx", + "pathRoot": "v43-route-vocabulary-file:e9d58a9b4b693e3e347648ec", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/auxillaries/components/AuxillariesSurface.tsx", + "pathRoot": "v43-route-vocabulary-file:18c558b0a19e3bc78bb3b0aa", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 1, + "word:terminal": 2 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/auxillaries/components/AuxillariesWalletPane.tsx", + "pathRoot": "v43-route-vocabulary-file:d812180527af41d67090b7dd", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 2, + "symbol:Exchange": 3, + "symbol:Terminal": 2, + "word:exchange": 1, + "word:terminal": 3 + }, + "totalMatches": 11, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/auxillaries/components/auxillary-pane-explainers.ts", + "pathRoot": "v43-route-vocabulary-file:5ef24bcd0cb4d27e1832612d", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 6, + "symbol:Reading": 2 + }, + "totalMatches": 8, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/auxillaries/components/auxillary-pane-meta.ts", + "pathRoot": "v43-route-vocabulary-file:ce6e275527be20a07eb51553", + "categories": [ + "component" + ], + "tokenCounts": { + "route:/terminal": 1, + "symbol:Terminal": 3, + "word:terminal": 1 + }, + "totalMatches": 5, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/auxillaries/components/headers/AuxillariesInterfacesPaneHeader.tsx", + "pathRoot": "v43-route-vocabulary-file:5fe257603311c34a49f6d726", + "categories": [ + "component" + ], + "tokenCounts": { + "symbol:Terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/bitcode-browser-accessibility-responsive-proof.ts", + "pathRoot": "v43-route-vocabulary-file:02d4ebe62d243e9c0dcb109e", + "categories": [], + "tokenCounts": { + "route:/terminal": 6, + "symbol:Terminal": 1, + "word:terminal": 10 + }, + "totalMatches": 17, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/bitcode-browser-proof.ts", + "pathRoot": "v43-route-vocabulary-file:da7d29c95f7e6c054e890aae", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 3, + "route:/terminal": 6, + "symbol:Exchange": 3, + "symbol:Terminal": 2, + "symbol:Reading": 1, + "word:exchange": 7, + "word:terminal": 16 + }, + "totalMatches": 38, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/bitcode-ledger-storage-sync.ts", + "pathRoot": "v43-route-vocabulary-file:7bed94b7aae0c00c1f038169", + "categories": [], + "tokenCounts": { + "word:terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/btd/[assetPackId]/page.tsx", + "pathRoot": "v43-route-vocabulary-file:f1115ca3ecb7c5f9d0676577", + "categories": [ + "component", + "route" + ], + "tokenCounts": { + "route:/exchange": 1, + "route:/terminal": 1, + "symbol:Exchange": 2, + "symbol:Terminal": 1, + "word:exchange": 1, + "word:terminal": 1 + }, + "totalMatches": 7, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/conversations/ConversationsRouteClient.tsx", + "pathRoot": "v43-route-vocabulary-file:d62c96beb3ee560fcbb9b30c", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 2, + "symbol:Exchange": 1, + "symbol:Terminal": 4, + "word:terminal": 2 + }, + "totalMatches": 9, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/conversations/README.md", + "pathRoot": "v43-route-vocabulary-file:ad3c8e82c49aff836c2576bc", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 3, + "symbol:Exchange": 4, + "symbol:Terminal": 20, + "symbol:Reading": 4, + "symbol:Depositing": 2, + "word:terminal": 6 + }, + "totalMatches": 39, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/conversations/components/ConversationTerminalHandoff.tsx", + "pathRoot": "v43-route-vocabulary-file:3c37d4df728191b86357f18d", + "categories": [ + "component" + ], + "tokenCounts": { + "symbol:Terminal": 16, + "word:terminal": 10 + }, + "totalMatches": 26, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/conversations/components/ConversationsEnhancedRichTextInput.tsx", + "pathRoot": "v43-route-vocabulary-file:3e5b0fa50424c179636dd110", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/conversations/components/ConversationsOverlay.tsx", + "pathRoot": "v43-route-vocabulary-file:29948565cb03b0768bb99d1a", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 1, + "symbol:Terminal": 2, + "word:terminal": 1 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/conversations/components/hooks/useChatState.ts", + "pathRoot": "v43-route-vocabulary-file:f8e64ebe34242dc6c95c5ef6", + "categories": [ + "component" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/conversations/conversation-rehearsal.ts", + "pathRoot": "v43-route-vocabulary-file:bcf67b8a2b81d9dfdb13565a", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/conversations/conversation-telemetry-proof-hooks.ts", + "pathRoot": "v43-route-vocabulary-file:434dfdba21b7bc5272491d2a", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1, + "word:terminal": 2 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/conversations/conversation-terminal-handoff.ts", + "pathRoot": "v43-route-vocabulary-file:1e16e13a6527cdf99b1fb802", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 3, + "symbol:Exchange": 2, + "symbol:Terminal": 2, + "symbol:Reading": 1, + "symbol:Depositing": 1, + "word:exchange": 3, + "word:terminal": 7 + }, + "totalMatches": 19, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/conversations/conversation-writing-workspace.ts", + "pathRoot": "v43-route-vocabulary-file:33e203e630bcd5d7dd638808", + "categories": [], + "tokenCounts": { + "symbol:Terminal": 3 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/conversations/page.tsx", + "pathRoot": "v43-route-vocabulary-file:03fe2c46a2173955e8f73899", + "categories": [ + "component", + "route" + ], + "tokenCounts": { + "route:/terminal": 1, + "word:terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/docs/DocsArticlePage.tsx", + "pathRoot": "v43-route-vocabulary-file:bd4396603351d2adaf835dd2", + "categories": [ + "component" + ], + "tokenCounts": { + "route:/terminal": 1, + "symbol:Exchange": 1, + "symbol:Terminal": 6, + "word:terminal": 9 + }, + "totalMatches": 17, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/docs/bitcode-docs-content.ts", + "pathRoot": "v43-route-vocabulary-file:703e60c4d9564463a1ffa241", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 1, + "route:/terminal": 3, + "route:/read": 4, + "symbol:Exchange": 77, + "symbol:Terminal": 102, + "symbol:Reading": 1, + "word:exchange": 5, + "word:terminal": 10 + }, + "totalMatches": 203, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/docs/page.tsx", + "pathRoot": "v43-route-vocabulary-file:9e286f0dfe1d6eefc3ca1002", + "categories": [ + "component", + "route" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/edgetimes/EdgetimesPageContent.tsx", + "pathRoot": "v43-route-vocabulary-file:f66c20e2a3b3d6d3bb32999b", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 1, + "symbol:Terminal": 1, + "word:terminal": 1 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/edgetimes/edgetimes-topology.ts", + "pathRoot": "v43-route-vocabulary-file:d41b57815fe4520342c4a80a", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 1, + "symbol:Exchange": 1, + "symbol:Terminal": 2, + "word:terminal": 1 + }, + "totalMatches": 5, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/exchange/ExchangePageClient.tsx", + "pathRoot": "v43-route-vocabulary-file:4ac3d9182a2182d87127cae5", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 6, + "symbol:Exchange": 4, + "symbol:Terminal": 2, + "word:exchange": 1, + "word:terminal": 11 + }, + "totalMatches": 24, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/exchange/README.md", + "pathRoot": "v43-route-vocabulary-file:8dbcab387ed6a42f37d791cd", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 1, + "symbol:Exchange": 11, + "symbol:Terminal": 3, + "word:exchange": 13 + }, + "totalMatches": 28, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/exchange/page.tsx", + "pathRoot": "v43-route-vocabulary-file:234ab58c2d000c25bdaee3ec", + "categories": [ + "component", + "route", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 1, + "route:/terminal": 1, + "symbol:Exchange": 3, + "word:exchange": 1, + "word:terminal": 1 + }, + "totalMatches": 7, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/executions/README.md", + "pathRoot": "v43-route-vocabulary-file:11cd51c6bcd76549498c6cfc", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 2, + "word:terminal": 2 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/executions/components/ExecutionsPageClient.tsx", + "pathRoot": "v43-route-vocabulary-file:026240a4424f65e5b2a7d980", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 1, + "symbol:Terminal": 3, + "word:terminal": 1 + }, + "totalMatches": 5, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/fill-gaps.tsx", + "pathRoot": "v43-route-vocabulary-file:6a611a1d6aac1619f3a30c9a", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/hero-client.tsx", + "pathRoot": "v43-route-vocabulary-file:7016ec9aeec42be02a4118eb", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 1, + "word:exchange": 2, + "word:terminal": 1 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/orbitals/README.md", + "pathRoot": "v43-route-vocabulary-file:9274b41153e7b6ea539609fa", + "categories": [ + "doc" + ], + "tokenCounts": { + "route:/terminal": 7, + "symbol:Exchange": 1, + "symbol:Terminal": 4, + "word:terminal": 7 + }, + "totalMatches": 19, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/orbitals/components/OrbitalsConnectsOrbitalEmailConnection.tsx", + "pathRoot": "v43-route-vocabulary-file:e8538b307e5a67fc525d0f3a", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 1, + "word:terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/orbitals/components/OrbitalsConnectsOrbitalPhoneConnection.tsx", + "pathRoot": "v43-route-vocabulary-file:c0827063f7ba7cf7a51be553", + "categories": [ + "component" + ], + "tokenCounts": { + "route:/terminal": 1, + "word:terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/orbitals/components/OrbitalsPhoneConnectSmart.tsx", + "pathRoot": "v43-route-vocabulary-file:2510037f220e99c7cfddacf0", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 1, + "word:terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/page.tsx", + "pathRoot": "v43-route-vocabulary-file:3d10d6f576bdfd7770438741", + "categories": [ + "component", + "route" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/DemonstrationWitnessHost.tsx", + "pathRoot": "v43-route-vocabulary-file:f8afe98c7e64ad58029103f7", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/README.md", + "pathRoot": "v43-route-vocabulary-file:e4e31c52d53799c043ca166d", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 6, + "route:/read": 1, + "symbol:Exchange": 2, + "symbol:Terminal": 44, + "symbol:Reading": 7, + "word:terminal": 14 + }, + "totalMatches": 74, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/TerminalActionWorkbenchCard.tsx", + "pathRoot": "v43-route-vocabulary-file:b692c16a873bdca457acce8e", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1, + "word:terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/TerminalClosureControlDeck.tsx", + "pathRoot": "v43-route-vocabulary-file:0aaefaec568e851426efc8ac", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 3, + "word:terminal": 8 + }, + "totalMatches": 11, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/TerminalClosureNativeSections.tsx", + "pathRoot": "v43-route-vocabulary-file:08dc7dc20aa31534776f6e68", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Reading": 2, + "word:terminal": 5 + }, + "totalMatches": 7, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/TerminalCommandDeck.tsx", + "pathRoot": "v43-route-vocabulary-file:992dcf46df42ff9db093f877", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "route:/read": 1, + "symbol:Terminal": 4, + "word:terminal": 9 + }, + "totalMatches": 14, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/TerminalCoreNativeSections.tsx", + "pathRoot": "v43-route-vocabulary-file:abc360f8ad044e607ee57dad", + "categories": [ + "component" + ], + "tokenCounts": { + "symbol:Terminal": 1, + "symbol:Depositing": 2, + "word:terminal": 5 + }, + "totalMatches": 8, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/TerminalDepositComposer.tsx", + "pathRoot": "v43-route-vocabulary-file:f4bef39aa70cd164d97377ca", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1, + "symbol:Reading": 1, + "word:terminal": 6 + }, + "totalMatches": 8, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/TerminalDepositReadWorkbench.tsx", + "pathRoot": "v43-route-vocabulary-file:69b483abf7a72437d78aaad1", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Reading": 3, + "word:terminal": 10 + }, + "totalMatches": 13, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/TerminalExperienceFrame.tsx", + "pathRoot": "v43-route-vocabulary-file:8fa8db42e7e1cb558eb3e16d", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 2, + "word:terminal": 5 + }, + "totalMatches": 7, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/TerminalExternalInterfacingPanel.tsx", + "pathRoot": "v43-route-vocabulary-file:c2d0996c5ed522d40fde3357", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 2, + "word:terminal": 6 + }, + "totalMatches": 8, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/TerminalFloatingDebugWidget.tsx", + "pathRoot": "v43-route-vocabulary-file:94b3ccae4bc83ef8b0e93e1f", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1, + "word:terminal": 2 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/TerminalFlowGuideCard.tsx", + "pathRoot": "v43-route-vocabulary-file:bc1e7274bbbc4869e660b1d3", + "categories": [ + "component" + ], + "tokenCounts": { + "word:terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/TerminalLiveSummaryStrip.tsx", + "pathRoot": "v43-route-vocabulary-file:be6d0109cd926133de8d16db", + "categories": [ + "component" + ], + "tokenCounts": { + "symbol:Terminal": 1, + "symbol:Reading": 1, + "word:terminal": 4 + }, + "totalMatches": 6, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/TerminalMockTransactionDetails.tsx", + "pathRoot": "v43-route-vocabulary-file:438b3bb0e220f849ef671d41", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 2, + "word:terminal": 1 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/TerminalMvpMap.tsx", + "pathRoot": "v43-route-vocabulary-file:cf3d2fb1d727d8810d63f862", + "categories": [ + "component" + ], + "tokenCounts": { + "symbol:Terminal": 1, + "symbol:Reading": 1, + "symbol:Depositing": 1, + "word:terminal": 1 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/TerminalOperationalHealthPanel.tsx", + "pathRoot": "v43-route-vocabulary-file:ccc83f24c8cebda6e48197ad", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1, + "word:terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/TerminalPageClient.tsx", + "pathRoot": "v43-route-vocabulary-file:a9c99f865a298ffb22056e24", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 6, + "word:terminal": 14 + }, + "totalMatches": 21, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/TerminalPreservedShellSurface.tsx", + "pathRoot": "v43-route-vocabulary-file:95483e0a2fb79f611e4d7bc4", + "categories": [ + "component" + ], + "tokenCounts": { + "symbol:Terminal": 3, + "word:terminal": 1 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/TerminalReadScenarioPanel.tsx", + "pathRoot": "v43-route-vocabulary-file:4b0e11c22c9298c06e394c18", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 3, + "symbol:Terminal": 2, + "symbol:Reading": 2, + "word:terminal": 8 + }, + "totalMatches": 15, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/TerminalRepositoryContextPanel.tsx", + "pathRoot": "v43-route-vocabulary-file:eb47108132ca63fef878665b", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 2, + "symbol:Terminal": 3, + "word:terminal": 5 + }, + "totalMatches": 10, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/TerminalSectionAtlas.tsx", + "pathRoot": "v43-route-vocabulary-file:d3dc34707f3fde88fcd89208", + "categories": [ + "component" + ], + "tokenCounts": { + "word:terminal": 4 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/TerminalSupplySelectionPanel.tsx", + "pathRoot": "v43-route-vocabulary-file:3cf63c92f5359800166cbfeb", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Depositing": 1, + "word:terminal": 7 + }, + "totalMatches": 8, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/TerminalTransactionActivitySurface.tsx", + "pathRoot": "v43-route-vocabulary-file:e7497ac7d60a3685438f48d4", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 2, + "word:terminal": 6 + }, + "totalMatches": 8, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/TerminalTransactionClosureCard.tsx", + "pathRoot": "v43-route-vocabulary-file:65fffe7778e3cef09a530d52", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "word:terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/TerminalTransactionDetailActionBar.tsx", + "pathRoot": "v43-route-vocabulary-file:e33e3ceea31ec0a611353581", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 3, + "symbol:Terminal": 1, + "word:exchange": 2, + "word:terminal": 5 + }, + "totalMatches": 11, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/TerminalTransactionDetailHero.tsx", + "pathRoot": "v43-route-vocabulary-file:b07ab39e34b4506a18398757", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 2, + "symbol:Terminal": 2, + "word:exchange": 3, + "word:terminal": 4 + }, + "totalMatches": 11, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/TerminalTransactionDetailSurface.tsx", + "pathRoot": "v43-route-vocabulary-file:ea819809a2aaa821ef417cd2", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 1, + "word:exchange": 3, + "word:terminal": 21 + }, + "totalMatches": 26, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/TerminalTransactionHistoryCard.tsx", + "pathRoot": "v43-route-vocabulary-file:e9dad45c598eb4f9f916bf55", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "word:terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/TerminalTransactionJournalReconciliationCard.tsx", + "pathRoot": "v43-route-vocabulary-file:3a8291acbd1677361d4891d2", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 2, + "word:terminal": 1 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/TerminalTransactionOrganizationAuthorityCard.tsx", + "pathRoot": "v43-route-vocabulary-file:8de692a74745d93fc5c859f6", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "word:terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/TerminalTransactionProofsCard.tsx", + "pathRoot": "v43-route-vocabulary-file:2ccd1e5c0d45471f28419c87", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "word:terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/TerminalTransactionWalletBtcCard.tsx", + "pathRoot": "v43-route-vocabulary-file:8d5e0ec533f2e7f86849d979", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "word:terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/TerminalTransactionWorkspace.tsx", + "pathRoot": "v43-route-vocabulary-file:3d78fabb99011308353ee0d3", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 5, + "symbol:Terminal": 13, + "word:exchange": 2, + "word:terminal": 14 + }, + "totalMatches": 34, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/TerminalTransactionsTable.tsx", + "pathRoot": "v43-route-vocabulary-file:e71221cc2895a3dcc4c9c6b6", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "word:exchange": 1, + "word:terminal": 4 + }, + "totalMatches": 5, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/TerminalWorkspaceRail.tsx", + "pathRoot": "v43-route-vocabulary-file:d2117f168a5b76f54b3eb8d1", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1, + "word:terminal": 3 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/bitcode-transaction-readiness.ts", + "pathRoot": "v43-route-vocabulary-file:f48ca17bba07965fa18142e3", + "categories": [], + "tokenCounts": { + "symbol:Terminal": 5 + }, + "totalMatches": 5, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/demonstration-witness-runtime.ts", + "pathRoot": "v43-route-vocabulary-file:9656ae00c2f9b340c5f5c4b2", + "categories": [], + "tokenCounts": { + "route:/terminal": 1, + "word:terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/page.tsx", + "pathRoot": "v43-route-vocabulary-file:70fd60e94565060fe3faaa03", + "categories": [ + "component", + "route" + ], + "tokenCounts": { + "route:/terminal": 2, + "symbol:Terminal": 3, + "symbol:Reading": 1, + "word:terminal": 2 + }, + "totalMatches": 8, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/terminal-activity-history.ts", + "pathRoot": "v43-route-vocabulary-file:ef13c3387cf3d95fa8690fc2", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 2, + "word:terminal": 18 + }, + "totalMatches": 20, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/terminal-closure-controls.ts", + "pathRoot": "v43-route-vocabulary-file:5226a4ba3fa41bf1de6964df", + "categories": [], + "tokenCounts": { + "route:/read": 1, + "word:terminal": 2 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/terminal-closure-state.ts", + "pathRoot": "v43-route-vocabulary-file:a8cfa670779646311b7f6555", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1, + "word:terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/terminal-command-presentation.ts", + "pathRoot": "v43-route-vocabulary-file:0252fa6dd5d6d14c688c919e", + "categories": [], + "tokenCounts": { + "symbol:Terminal": 2, + "word:terminal": 1 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/terminal-commercial-launch-readiness.ts", + "pathRoot": "v43-route-vocabulary-file:fba14b826659de542a4abd05", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 9, + "symbol:Exchange": 6, + "symbol:Terminal": 5, + "word:exchange": 1, + "word:terminal": 15 + }, + "totalMatches": 36, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/terminal-core-surface.ts", + "pathRoot": "v43-route-vocabulary-file:85c8d45586c951ae16fa6090", + "categories": [], + "tokenCounts": { + "symbol:Reading": 1, + "symbol:Depositing": 1, + "word:terminal": 1 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/terminal-deposit-read-workbench.ts", + "pathRoot": "v43-route-vocabulary-file:1ebd7ba42107e759c022f8f6", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 2, + "word:terminal": 5 + }, + "totalMatches": 7, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/terminal-enterprise-reading-ux-state.ts", + "pathRoot": "v43-route-vocabulary-file:45f29adac7d2ef8957565abd", + "categories": [], + "tokenCounts": { + "symbol:Terminal": 2, + "word:terminal": 4 + }, + "totalMatches": 6, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/terminal-experience-architecture.ts", + "pathRoot": "v43-route-vocabulary-file:4c08cbff68bf2c78e25ed573", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 12, + "symbol:Exchange": 1, + "symbol:Terminal": 5, + "word:terminal": 21 + }, + "totalMatches": 39, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/terminal-flow-guide.ts", + "pathRoot": "v43-route-vocabulary-file:42014dd64d46d31a0da32720", + "categories": [], + "tokenCounts": { + "symbol:Terminal": 3, + "symbol:Depositing": 2, + "word:terminal": 1 + }, + "totalMatches": 6, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/terminal-interface-integration-regression.ts", + "pathRoot": "v43-route-vocabulary-file:a39e8b7707eedd8320932cce", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 4, + "symbol:Terminal": 1, + "word:exchange": 2, + "word:terminal": 11 + }, + "totalMatches": 18, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/terminal-journal-reconciliation.ts", + "pathRoot": "v43-route-vocabulary-file:8c816706372944e70f71aeaa", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 6, + "word:terminal": 3 + }, + "totalMatches": 9, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/terminal-live-summary.ts", + "pathRoot": "v43-route-vocabulary-file:96e256d491c3209ae479df78", + "categories": [], + "tokenCounts": { + "word:terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/terminal-operator-copy.ts", + "pathRoot": "v43-route-vocabulary-file:db3610260c4db3ae1c62f57c", + "categories": [], + "tokenCounts": { + "word:terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/terminal-operator-explainers.ts", + "pathRoot": "v43-route-vocabulary-file:a3fcde8e431007c671847813", + "categories": [], + "tokenCounts": { + "word:terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/terminal-organization-authority.ts", + "pathRoot": "v43-route-vocabulary-file:53305aa285004d337fbf7935", + "categories": [], + "tokenCounts": { + "symbol:Terminal": 1, + "word:terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/terminal-pipeline-harness-client.ts", + "pathRoot": "v43-route-vocabulary-file:333076183da421e7f6da8286", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "word:terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/terminal-protocol-projection.ts", + "pathRoot": "v43-route-vocabulary-file:004c5bd6e5efcd9d1058c1a1", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "word:terminal": 8 + }, + "totalMatches": 8, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/terminal-routes.ts", + "pathRoot": "v43-route-vocabulary-file:9c522220ad0858ff86114b5b", + "categories": [], + "tokenCounts": { + "route:/exchange": 1, + "route:/terminal": 1, + "word:exchange": 1, + "word:terminal": 1 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/terminal-run-data.ts", + "pathRoot": "v43-route-vocabulary-file:b50a3d9dc691f0ac2aa3c582", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 2, + "symbol:Terminal": 4, + "word:terminal": 4 + }, + "totalMatches": 10, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/terminal-section-atlas.ts", + "pathRoot": "v43-route-vocabulary-file:d8637478c8a2bf4ab3fd0cd1", + "categories": [], + "tokenCounts": { + "word:terminal": 3 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/terminal-shell-sections.ts", + "pathRoot": "v43-route-vocabulary-file:1f2dc0ca78f3b2f3c8dd53e3", + "categories": [], + "tokenCounts": { + "symbol:Reading": 1, + "symbol:Depositing": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/terminal-supply-selection.ts", + "pathRoot": "v43-route-vocabulary-file:bb2826625cf06be33f7b066e", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "word:terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/terminal-transaction-detail-snapshot.ts", + "pathRoot": "v43-route-vocabulary-file:4fd35e4dee6f91bf9dd9966d", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "word:terminal": 4 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/terminal-transaction-detail.ts", + "pathRoot": "v43-route-vocabulary-file:006d0fbceb56f3b43262b077", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 2, + "word:terminal": 3 + }, + "totalMatches": 5, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/terminal-transaction-query.ts", + "pathRoot": "v43-route-vocabulary-file:a7adf7c8bfe005a8ab716663", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "word:exchange": 2, + "word:terminal": 2 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/terminal-transaction-read-model.ts", + "pathRoot": "v43-route-vocabulary-file:c4fc536d9c62061bf1b8e18d", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1, + "word:terminal": 5 + }, + "totalMatches": 6, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/terminal-transaction-readiness-source.ts", + "pathRoot": "v43-route-vocabulary-file:f2d1df6f00601e46b9f8f952", + "categories": [], + "tokenCounts": { + "word:terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/terminal-transaction-source.ts", + "pathRoot": "v43-route-vocabulary-file:415b5d00ca4901e7dd6ee08f", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "word:terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/terminal-transactions.ts", + "pathRoot": "v43-route-vocabulary-file:2a28f508a2a4bd6f0665f1cc", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1, + "word:terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/terminal-ux-browser-proof.ts", + "pathRoot": "v43-route-vocabulary-file:cb821290b34b462e314976a6", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 3, + "symbol:Terminal": 2, + "word:terminal": 12 + }, + "totalMatches": 17, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/terminal-wallet-btc-operation.ts", + "pathRoot": "v43-route-vocabulary-file:05e5c8521c8144344b857f43", + "categories": [], + "tokenCounts": { + "word:terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/terminal-workspace-copy.ts", + "pathRoot": "v43-route-vocabulary-file:b58de298aa32b62fe8bd475b", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 6 + }, + "totalMatches": 6, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/terminal-workspace-explainers.ts", + "pathRoot": "v43-route-vocabulary-file:ae563386dbd58c20f6711e99", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 69, + "symbol:Exchange": 7, + "symbol:Terminal": 29, + "symbol:Reading": 1, + "symbol:Depositing": 11, + "word:terminal": 83 + }, + "totalMatches": 200, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/terminal/use-demonstration-witness-shell-mount.ts", + "pathRoot": "v43-route-vocabulary-file:f88020f9d47e50791f9fa697", + "categories": [], + "tokenCounts": { + "route:/terminal": 1, + "word:terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/app/tps/README.md", + "pathRoot": "v43-route-vocabulary-file:1078aaf7d5752bc992e00d01", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 1, + "symbol:Terminal": 1, + "word:exchange": 1, + "word:terminal": 1 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/components/base/bitcode/README.md", + "pathRoot": "v43-route-vocabulary-file:8b3d53f452922c8ea0b51129", + "categories": [ + "component", + "doc", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 6, + "symbol:Exchange": 1, + "word:terminal": 6 + }, + "totalMatches": 13, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/components/base/bitcode/auth/LoginForm.tsx", + "pathRoot": "v43-route-vocabulary-file:8116b21c7cc3da8a347799c1", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 2, + "symbol:Terminal": 1, + "word:terminal": 2 + }, + "totalMatches": 5, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/components/base/bitcode/btd/BTDPrices.tsx", + "pathRoot": "v43-route-vocabulary-file:c339f2d8dbaa2061e027c131", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 7, + "symbol:Terminal": 4, + "word:exchange": 1, + "word:terminal": 1 + }, + "totalMatches": 13, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/components/base/bitcode/btd/FlexibleBtdSelector.tsx", + "pathRoot": "v43-route-vocabulary-file:35bc10c23c19a8c2369a2947", + "categories": [ + "component" + ], + "tokenCounts": { + "symbol:Exchange": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/components/base/bitcode/btd/btd-tracker.tsx", + "pathRoot": "v43-route-vocabulary-file:777ea2b7d57d2f94f878eeaf", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Reading": 3 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/components/base/bitcode/execution/BitcodeTransactionsFilterBar.tsx", + "pathRoot": "v43-route-vocabulary-file:5f2190bf70110aead04f6c6d", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/components/base/bitcode/execution/BitcodeTransactionsTable.tsx", + "pathRoot": "v43-route-vocabulary-file:6ae448961d1a0b820008159f", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 4, + "symbol:Terminal": 3, + "word:exchange": 2, + "word:terminal": 2 + }, + "totalMatches": 11, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/components/base/bitcode/execution/README.md", + "pathRoot": "v43-route-vocabulary-file:b97af42ea0cbef4098b9bd72", + "categories": [ + "component", + "doc", + "telemetry" + ], + "tokenCounts": { + "route:/terminal": 4, + "symbol:Terminal": 1, + "symbol:Reading": 2, + "word:terminal": 4 + }, + "totalMatches": 11, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/components/base/bitcode/execution/bitcode-transaction-active-filters.ts", + "pathRoot": "v43-route-vocabulary-file:75354a313c9c067e4e83847a", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/components/base/bitcode/execution/bitcode-transaction-explainers.ts", + "pathRoot": "v43-route-vocabulary-file:a24794c3346fb92b640498cc", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 4, + "symbol:Terminal": 2, + "word:terminal": 1 + }, + "totalMatches": 7, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/components/base/bitcode/layout/NavBrand.tsx", + "pathRoot": "v43-route-vocabulary-file:1efef7d07a7bb59c2f6b36a1", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "word:exchange": 1, + "word:terminal": 3 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/components/base/bitcode/layout/bitcode-public-copy.ts", + "pathRoot": "v43-route-vocabulary-file:b3508c32d6b632f1fff4b8f7", + "categories": [ + "component" + ], + "tokenCounts": { + "route:/exchange": 1, + "route:/terminal": 2, + "symbol:Exchange": 5, + "symbol:Terminal": 11, + "word:exchange": 1, + "word:terminal": 2 + }, + "totalMatches": 22, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/components/base/bitcode/layout/bitcode-public-explainers.ts", + "pathRoot": "v43-route-vocabulary-file:c05a197157437d4cd9afc99e", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 3, + "symbol:Terminal": 7, + "word:exchange": 2 + }, + "totalMatches": 12, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/components/base/bitcode/layout/footer.tsx", + "pathRoot": "v43-route-vocabulary-file:cc92b129b2ef4dc4925b0312", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 1, + "route:/terminal": 1, + "symbol:Exchange": 2, + "symbol:Terminal": 2, + "word:exchange": 4, + "word:terminal": 3 + }, + "totalMatches": 13, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/components/base/bitcode/layout/nav.tsx", + "pathRoot": "v43-route-vocabulary-file:1dce885ae8ac60b29fb6515b", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "route:/exchange": 3, + "route:/terminal": 4, + "symbol:Exchange": 1, + "symbol:Terminal": 1, + "symbol:Reading": 1, + "word:exchange": 5, + "word:terminal": 8 + }, + "totalMatches": 23, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/components/base/bitcode/layout/workspace-surface.ts", + "pathRoot": "v43-route-vocabulary-file:27384c0628abaaa41c7c64f8", + "categories": [ + "component" + ], + "tokenCounts": { + "route:/exchange": 1, + "route:/terminal": 1, + "word:exchange": 1, + "word:terminal": 3 + }, + "totalMatches": 6, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/components/base/bitcode/vcs/VCSConnectionCard.tsx", + "pathRoot": "v43-route-vocabulary-file:cac15bdd0da7457452cad2c7", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/components/base/bitcode/vcs/VCSIntegrationPanel.tsx", + "pathRoot": "v43-route-vocabulary-file:856da0b2b0fd48b52641e669", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/config/integrations.ts", + "pathRoot": "v43-route-vocabulary-file:b8a442cecc84883605b277ed", + "categories": [], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/hooks/useVCSData.ts", + "pathRoot": "v43-route-vocabulary-file:e5c7e0e9c6e4637b94df20c6", + "categories": [], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/jest.config.cjs", + "pathRoot": "v43-route-vocabulary-file:f8d0d39295ef748ac1cd8fe6", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "word:terminal": 3 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/lib/mock-review-mode.ts", + "pathRoot": "v43-route-vocabulary-file:e68f9f5520a7eaf537f2f09a", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 2, + "symbol:Terminal": 2, + "word:exchange": 1, + "word:terminal": 2 + }, + "totalMatches": 7, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/lib/search.ts", + "pathRoot": "v43-route-vocabulary-file:4f0dc05fd9f7f8079e92683d", + "categories": [], + "tokenCounts": { + "symbol:Exchange": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/middleware/authentication.ts", + "pathRoot": "v43-route-vocabulary-file:c0e8018ef3859e578484a8a3", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/middleware/security-headers.ts", + "pathRoot": "v43-route-vocabulary-file:c0d668512ff1e5c10f332890", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/mocking/README.md", + "pathRoot": "v43-route-vocabulary-file:33d5d24108d333960bd5c4bd", + "categories": [ + "doc", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/mocking/generators/ComprehensiveMockDataGenerators.js", + "pathRoot": "v43-route-vocabulary-file:726be7bb75eeb39ec27a7563", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/mocking/generators/ComprehensiveMockDataGenerators.ts", + "pathRoot": "v43-route-vocabulary-file:d1ae7e0385f80a602d63f04c", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/mocking/scripts/setup-mock-system.js", + "pathRoot": "v43-route-vocabulary-file:7c01429b8188debf67f94cc9", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/package.json", + "pathRoot": "v43-route-vocabulary-file:e49ba9393ac580108a985277", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "word:terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/playwright.config.ts", + "pathRoot": "v43-route-vocabulary-file:0bda103cbbf813dbfdce269c", + "categories": [], + "tokenCounts": { + "route:/terminal": 1, + "word:terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/prompts/bitcode-terminal-system-prompt.ts", + "pathRoot": "v43-route-vocabulary-file:c092810057ef8b8158bd6ce5", + "categories": [], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/scripts/sync-asset-pack-evidence-embeddings.ts", + "pathRoot": "v43-route-vocabulary-file:da125648f59839a9a369d00a", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/stories/PatternMemory.stories.tsx", + "pathRoot": "v43-route-vocabulary-file:3da040a1748f5e867a45639a", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/stories/conversations/ConversationInterface.stories.tsx", + "pathRoot": "v43-route-vocabulary-file:d2248a1dcac9fa0317b95cba", + "categories": [ + "component", + "telemetry" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/styles/conversations-fullscreen.css", + "pathRoot": "v43-route-vocabulary-file:7ab43c18a129dff0d7ca87d0", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "word:terminal": 36 + }, + "totalMatches": 36, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/api/activityRoute.test.ts", + "pathRoot": "v43-route-vocabulary-file:6a2ccd1c1872a3cc89b7c1ff", + "categories": [ + "api", + "telemetry", + "test" + ], + "tokenCounts": { + "word:terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/api/auxillariesGithubConnectionRoute.test.ts", + "pathRoot": "v43-route-vocabulary-file:05cb7d64d3a59a924860bca7", + "categories": [ + "api", + "test" + ], + "tokenCounts": { + "word:exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/api/clientErrorRoute.test.ts", + "pathRoot": "v43-route-vocabulary-file:c3850d1732af797231fde3e9", + "categories": [ + "api", + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/api/conversationBranchRoute.test.ts", + "pathRoot": "v43-route-vocabulary-file:9c61c0da65db6a67e95c1821", + "categories": [ + "api", + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 1, + "word:terminal": 2 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/api/conversationReadingInterfaceParity.test.ts", + "pathRoot": "v43-route-vocabulary-file:35673f5b87dc34e12ed333ac", + "categories": [ + "api", + "test" + ], + "tokenCounts": { + "symbol:Terminal": 1, + "symbol:Reading": 1, + "word:terminal": 2 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/api/conversationTelemetryProofHooks.test.ts", + "pathRoot": "v43-route-vocabulary-file:f169e547c12a11e4d56be6f9", + "categories": [ + "api", + "telemetry", + "test" + ], + "tokenCounts": { + "word:terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/api/conversationThreadStreamRoute.test.ts", + "pathRoot": "v43-route-vocabulary-file:fa91d047a6a604be7ecd1876", + "categories": [ + "api", + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 1, + "symbol:Terminal": 1, + "word:terminal": 1 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/api/conversationsRouteRead.test.ts", + "pathRoot": "v43-route-vocabulary-file:26ab1317e288876effca1119", + "categories": [ + "api", + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/api/executionsHistoryRoute.test.ts", + "pathRoot": "v43-route-vocabulary-file:5461aad5cca9f504afb9b1e0", + "categories": [ + "api", + "telemetry", + "test" + ], + "tokenCounts": { + "word:terminal": 5 + }, + "totalMatches": 5, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/api/executionsHistoryRunRoute.test.ts", + "pathRoot": "v43-route-vocabulary-file:81671ef0f7e4ae9097f60616", + "categories": [ + "api", + "telemetry", + "test" + ], + "tokenCounts": { + "word:terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/api/executionsHistoryWriteReadParity.test.ts", + "pathRoot": "v43-route-vocabulary-file:48f1121ecb69310d712fb06b", + "categories": [ + "api", + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 8, + "route:/read": 1, + "word:terminal": 18 + }, + "totalMatches": 27, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/api/externalRealizationRoute.test.ts", + "pathRoot": "v43-route-vocabulary-file:19f454d6e05d4d485eaefd27", + "categories": [ + "api", + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 1, + "word:terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/api/pipelineHarnessRoute.test.ts", + "pathRoot": "v43-route-vocabulary-file:19a9b8e2e12feffb31d2f2e0", + "categories": [ + "api", + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/api/readReviewProtocolParity.test.ts", + "pathRoot": "v43-route-vocabulary-file:0cccd2ae625748ef474ae8ad", + "categories": [ + "api", + "test" + ], + "tokenCounts": { + "route:/terminal": 3, + "word:terminal": 4 + }, + "totalMatches": 7, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/api/readReviewRoute.test.ts", + "pathRoot": "v43-route-vocabulary-file:14655a1afb58a6c15097cb4a", + "categories": [ + "api", + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Terminal": 7 + }, + "totalMatches": 7, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/api/userBtdRoute.test.ts", + "pathRoot": "v43-route-vocabulary-file:5fc09d50579c9cb326e112cd", + "categories": [ + "api", + "test" + ], + "tokenCounts": { + "route:/terminal": 1, + "word:terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/api/vcsGithubCallbackRoute.test.ts", + "pathRoot": "v43-route-vocabulary-file:a9f8297b769f5bd770272ccd", + "categories": [ + "api", + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 1, + "word:exchange": 3, + "word:terminal": 1 + }, + "totalMatches": 5, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/api/vcsRepositoriesInventoryParity.test.ts", + "pathRoot": "v43-route-vocabulary-file:6ebcf5e8ce4e756239e3bc15", + "categories": [ + "api", + "test" + ], + "tokenCounts": { + "word:terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/api/vcsRoutes.test.ts", + "pathRoot": "v43-route-vocabulary-file:69646457864a2a01847fe490", + "categories": [ + "api", + "test" + ], + "tokenCounts": { + "route:/terminal": 1, + "word:terminal": 2 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/api/walletOAuthRoutes.test.ts", + "pathRoot": "v43-route-vocabulary-file:268bc274ee63c6b5c5432b97", + "categories": [ + "api", + "test" + ], + "tokenCounts": { + "word:exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/auxillariesProvider.test.tsx", + "pathRoot": "v43-route-vocabulary-file:30b8feca3e164313cb4f24e5", + "categories": [ + "component", + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 2, + "symbol:Terminal": 3, + "word:terminal": 2 + }, + "totalMatches": 7, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/auxillariesWalletPane.test.tsx", + "pathRoot": "v43-route-vocabulary-file:cee3412312e89e6076455355", + "categories": [ + "component", + "test" + ], + "tokenCounts": { + "symbol:Exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/bitcodeBrowserAccessibilityResponsiveProof.test.ts", + "pathRoot": "v43-route-vocabulary-file:52968c051c39418fe845ce4e", + "categories": [ + "test" + ], + "tokenCounts": { + "symbol:Terminal": 1, + "word:terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/bitcodeBrowserProof.test.ts", + "pathRoot": "v43-route-vocabulary-file:f6ebd3b586a3f466daf263c0", + "categories": [ + "test" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 1, + "symbol:Reading": 1, + "word:exchange": 5, + "word:terminal": 8 + }, + "totalMatches": 16, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/bitcodeDetailPanel.test.tsx", + "pathRoot": "v43-route-vocabulary-file:82c9498d87b2bac792c62271", + "categories": [ + "component", + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Terminal": 6 + }, + "totalMatches": 6, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/bitcodeInlineExplainer.test.tsx", + "pathRoot": "v43-route-vocabulary-file:5f5c7d0fcb2ad2fa510f6d57", + "categories": [ + "component", + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 2, + "word:terminal": 2 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/bitcodeTransactionReadiness.test.ts", + "pathRoot": "v43-route-vocabulary-file:ed51b975e067ecabcd3605a0", + "categories": [ + "test" + ], + "tokenCounts": { + "route:/terminal": 1, + "symbol:Terminal": 1, + "word:terminal": 1 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/bitcodeTransactionsActiveFilters.test.tsx", + "pathRoot": "v43-route-vocabulary-file:990218539f5e4babdb918162", + "categories": [ + "component", + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "word:exchange": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/bitcodeTransactionsFilterBar.test.tsx", + "pathRoot": "v43-route-vocabulary-file:3a7a82f7fc7e01dde8a642a5", + "categories": [ + "component", + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Exchange": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/btdTrackerLoading.test.tsx", + "pathRoot": "v43-route-vocabulary-file:5d2b3e4df661c8ce4e0f1742", + "categories": [ + "component", + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Reading": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/conversationMockShared.test.ts", + "pathRoot": "v43-route-vocabulary-file:b2bb5abc18fae9904e0cec35", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/conversationRehearsalPanel.test.tsx", + "pathRoot": "v43-route-vocabulary-file:9ddfb04bf795a942e72c8190", + "categories": [ + "component", + "test" + ], + "tokenCounts": { + "symbol:Terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/conversationTerminalHandoff.test.tsx", + "pathRoot": "v43-route-vocabulary-file:7d5d7da044ca0fd2fcb2fbcf", + "categories": [ + "component", + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 1, + "symbol:Terminal": 6, + "symbol:Reading": 1, + "word:terminal": 3 + }, + "totalMatches": 11, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/conversationTerminalIntegrationCoverage.test.tsx", + "pathRoot": "v43-route-vocabulary-file:fd7a5fcb09ec04a1e598b9d3", + "categories": [ + "component", + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 3, + "symbol:Terminal": 3, + "symbol:Reading": 1, + "word:exchange": 1, + "word:terminal": 8 + }, + "totalMatches": 16, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/conversationWritingWorkspace.test.tsx", + "pathRoot": "v43-route-vocabulary-file:e58602b4a94874d48e9bea51", + "categories": [ + "component", + "test" + ], + "tokenCounts": { + "symbol:Terminal": 3 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/conversationsOverlayMapping.test.ts", + "pathRoot": "v43-route-vocabulary-file:e185ce0f38c3113648d6e1c5", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 4, + "symbol:Terminal": 1, + "word:terminal": 4 + }, + "totalMatches": 9, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/conversationsRouteClient.test.tsx", + "pathRoot": "v43-route-vocabulary-file:2e2bede7b3431d1986be8c61", + "categories": [ + "component", + "test" + ], + "tokenCounts": { + "route:/terminal": 2, + "symbol:Terminal": 3, + "word:terminal": 3 + }, + "totalMatches": 8, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/demonstrationWitnessMount.test.tsx", + "pathRoot": "v43-route-vocabulary-file:184b265e050b6a7ffbf5093b", + "categories": [ + "component", + "test" + ], + "tokenCounts": { + "route:/terminal": 6, + "word:terminal": 6 + }, + "totalMatches": 12, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/demonstrationWitnessScopedStylesRoute.test.ts", + "pathRoot": "v43-route-vocabulary-file:ad0097bfcaac1afac2231822", + "categories": [ + "test" + ], + "tokenCounts": { + "route:/terminal": 1, + "word:terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/e2e/bitcode-browser-accessibility-responsive-proof.spec.ts", + "pathRoot": "v43-route-vocabulary-file:53de966306b0735788b596a0", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 5, + "symbol:Terminal": 4, + "word:terminal": 11 + }, + "totalMatches": 20, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/e2e/bitcode-browser-proof.spec.ts", + "pathRoot": "v43-route-vocabulary-file:500e247b45abac1e6b591ad7", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "route:/exchange": 1, + "route:/terminal": 3, + "symbol:Exchange": 3, + "symbol:Terminal": 6, + "symbol:Reading": 2, + "word:exchange": 1, + "word:terminal": 12 + }, + "totalMatches": 28, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/e2e/commercial-mvp.auxillaries.spec.ts", + "pathRoot": "v43-route-vocabulary-file:ff6ef1a5dddd3dd8b8b96210", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 2, + "symbol:Terminal": 5, + "word:terminal": 2 + }, + "totalMatches": 9, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/e2e/commercial-mvp.btd-exchange.spec.ts", + "pathRoot": "v43-route-vocabulary-file:4cbe968c93b7b6c903b13089", + "categories": [ + "test" + ], + "tokenCounts": { + "route:/exchange": 3, + "symbol:Exchange": 15, + "word:exchange": 5 + }, + "totalMatches": 23, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/e2e/commercial-mvp.conversations-docs.spec.ts", + "pathRoot": "v43-route-vocabulary-file:aed490453efda34eec5aa7e0", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "route:/exchange": 1, + "symbol:Exchange": 4, + "symbol:Terminal": 14, + "word:exchange": 1, + "word:terminal": 5 + }, + "totalMatches": 25, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/e2e/commercial-mvp.helpers.ts", + "pathRoot": "v43-route-vocabulary-file:66439c982a08af9e6bb03d70", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "symbol:Exchange": 3, + "symbol:Terminal": 4, + "symbol:Reading": 1, + "word:exchange": 1, + "word:terminal": 3 + }, + "totalMatches": 12, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/e2e/commercial-mvp.responsive.spec.ts", + "pathRoot": "v43-route-vocabulary-file:2e353d48faef12a79441dff0", + "categories": [ + "test" + ], + "tokenCounts": { + "route:/terminal": 2, + "symbol:Terminal": 3, + "word:terminal": 2 + }, + "totalMatches": 7, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/e2e/commercial-mvp.routes.spec.ts", + "pathRoot": "v43-route-vocabulary-file:a794400861365d54bb90bad3", + "categories": [ + "test" + ], + "tokenCounts": { + "route:/terminal": 3, + "symbol:Exchange": 1, + "symbol:Terminal": 9, + "word:terminal": 5 + }, + "totalMatches": 18, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/e2e/commercial-mvp.terminal-ux.spec.ts", + "pathRoot": "v43-route-vocabulary-file:9d9747349860f80279e843bb", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 4, + "symbol:Terminal": 8, + "word:terminal": 15 + }, + "totalMatches": 27, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/e2e/commercial-mvp.terminal.spec.ts", + "pathRoot": "v43-route-vocabulary-file:7b4c4225ae2c0d185d0b4e59", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 5, + "symbol:Exchange": 1, + "symbol:Terminal": 13, + "symbol:Reading": 1, + "symbol:Depositing": 1, + "word:terminal": 5 + }, + "totalMatches": 26, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/e2e/login.visual.spec.ts", + "pathRoot": "v43-route-vocabulary-file:d85ce985ca7571f544269ce5", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 2, + "symbol:Terminal": 1, + "word:terminal": 2 + }, + "totalMatches": 5, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/e2e/sso.spec.ts", + "pathRoot": "v43-route-vocabulary-file:bd71336f9130afc33a024866", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 4, + "word:exchange": 1, + "word:terminal": 4 + }, + "totalMatches": 9, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/e2e/terminal.flow.spec.ts", + "pathRoot": "v43-route-vocabulary-file:e53c83b3760dc8d665fc69a6", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 7, + "symbol:Terminal": 5, + "word:exchange": 1, + "word:terminal": 16 + }, + "totalMatches": 29, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/edgetimesPageContent.test.tsx", + "pathRoot": "v43-route-vocabulary-file:bfdd95badf9b585567351dd0", + "categories": [ + "component", + "test" + ], + "tokenCounts": { + "route:/terminal": 1, + "symbol:Terminal": 1, + "word:terminal": 1 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/exchangePageClient.test.tsx", + "pathRoot": "v43-route-vocabulary-file:310aacf794f3a2ff0f4b5470", + "categories": [ + "component", + "telemetry", + "test" + ], + "tokenCounts": { + "route:/exchange": 2, + "route:/terminal": 2, + "symbol:Exchange": 3, + "word:exchange": 8, + "word:terminal": 3 + }, + "totalMatches": 18, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/exchangeTerminalHandoff.test.ts", + "pathRoot": "v43-route-vocabulary-file:92c4244a409470295eb0e49c", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "route:/exchange": 2, + "route:/terminal": 6, + "symbol:Exchange": 4, + "symbol:Terminal": 1, + "word:exchange": 7, + "word:terminal": 10 + }, + "totalMatches": 30, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/features.test.ts", + "pathRoot": "v43-route-vocabulary-file:8f00c84afd873e4169d85970", + "categories": [ + "test" + ], + "tokenCounts": { + "symbol:Exchange": 1, + "symbol:Terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/footerPublicShell.test.tsx", + "pathRoot": "v43-route-vocabulary-file:b9625dfc49f69c345eb19068", + "categories": [ + "component", + "telemetry", + "test" + ], + "tokenCounts": { + "route:/exchange": 1, + "route:/terminal": 1, + "symbol:Exchange": 2, + "symbol:Terminal": 3, + "word:exchange": 2, + "word:terminal": 1 + }, + "totalMatches": 10, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/marketingLandingPage.test.tsx", + "pathRoot": "v43-route-vocabulary-file:396e2bcdfd734c71da6ee829", + "categories": [ + "component", + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 3, + "symbol:Exchange": 1, + "symbol:Terminal": 1, + "word:terminal": 3 + }, + "totalMatches": 8, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/marketingOperatorGuideCard.test.tsx", + "pathRoot": "v43-route-vocabulary-file:5d39a04d4ef1ff3819f7729a", + "categories": [ + "component", + "test" + ], + "tokenCounts": { + "route:/terminal": 1, + "symbol:Terminal": 3, + "word:terminal": 1 + }, + "totalMatches": 5, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/navBrand.test.tsx", + "pathRoot": "v43-route-vocabulary-file:053989f7acfb4c52cc6ed7b8", + "categories": [ + "component", + "telemetry", + "test" + ], + "tokenCounts": { + "word:exchange": 3, + "word:terminal": 3 + }, + "totalMatches": 6, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/navPublicShell.test.tsx", + "pathRoot": "v43-route-vocabulary-file:a7e6f4f31a7df48e793ac7a3", + "categories": [ + "component", + "telemetry", + "test" + ], + "tokenCounts": { + "route:/exchange": 3, + "route:/terminal": 2, + "symbol:Exchange": 5, + "symbol:Terminal": 4, + "symbol:Reading": 1, + "word:exchange": 5, + "word:terminal": 2 + }, + "totalMatches": 22, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/navWorkspaceChrome.test.tsx", + "pathRoot": "v43-route-vocabulary-file:0e31c412e5907c61368c31d8", + "categories": [ + "component", + "telemetry", + "test" + ], + "tokenCounts": { + "route:/exchange": 2, + "route:/terminal": 3, + "symbol:Exchange": 2, + "symbol:Terminal": 4, + "symbol:Reading": 1, + "word:exchange": 2, + "word:terminal": 3 + }, + "totalMatches": 17, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/orbitalPaneMeta.test.ts", + "pathRoot": "v43-route-vocabulary-file:fe890a947c11a8962e5e950a", + "categories": [ + "test" + ], + "tokenCounts": { + "route:/terminal": 2, + "word:terminal": 2 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/orbitalsInterfacesPane.test.tsx", + "pathRoot": "v43-route-vocabulary-file:581540a53c6f859ee76e9ede", + "categories": [ + "component", + "telemetry", + "test" + ], + "tokenCounts": { + "route:/exchange": 2, + "route:/terminal": 1, + "symbol:Terminal": 2, + "word:exchange": 6, + "word:terminal": 4 + }, + "totalMatches": 15, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/orbitalsLoginPane.test.tsx", + "pathRoot": "v43-route-vocabulary-file:63d4e9dc585da5ae99a3bd43", + "categories": [ + "component", + "telemetry", + "test" + ], + "tokenCounts": { + "word:terminal": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/pipelineExecutionLogHeader.test.tsx", + "pathRoot": "v43-route-vocabulary-file:3ed6012c0c5224091ce533b6", + "categories": [ + "component", + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Reading": 1 + }, + "totalMatches": 1, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/profileStep.test.tsx", + "pathRoot": "v43-route-vocabulary-file:2ccfa52fe59d687e5823ef70", + "categories": [ + "component", + "test" + ], + "tokenCounts": { + "route:/terminal": 3, + "word:terminal": 4 + }, + "totalMatches": 7, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/publicDocsPageContent.test.tsx", + "pathRoot": "v43-route-vocabulary-file:04631a9a1ca9229166dea6e2", + "categories": [ + "component", + "test" + ], + "tokenCounts": { + "route:/exchange": 1, + "route:/terminal": 1, + "symbol:Exchange": 3, + "symbol:Terminal": 4, + "word:exchange": 1, + "word:terminal": 2 + }, + "totalMatches": 12, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/readingOperationalTelemetryPipelineLog.test.tsx", + "pathRoot": "v43-route-vocabulary-file:5e6e6c7c081645e43b0d5a4a", + "categories": [ + "component", + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Reading": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalActionWorkbenchCard.test.tsx", + "pathRoot": "v43-route-vocabulary-file:23ce45fae4dcaeef4b6babfc", + "categories": [ + "component", + "test" + ], + "tokenCounts": { + "route:/terminal": 1, + "word:terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalActivityHistory.test.ts", + "pathRoot": "v43-route-vocabulary-file:bd649f423b55bd1c285405e6", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 19, + "symbol:Terminal": 2, + "symbol:Reading": 1, + "word:terminal": 39 + }, + "totalMatches": 61, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalClosureControlDeck.test.tsx", + "pathRoot": "v43-route-vocabulary-file:a1b6049237666bca66570cf2", + "categories": [ + "component", + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 9, + "word:terminal": 16 + }, + "totalMatches": 25, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalClosureControls.test.ts", + "pathRoot": "v43-route-vocabulary-file:19dd9ddb6f3665cceb758cd3", + "categories": [ + "test" + ], + "tokenCounts": { + "route:/terminal": 1, + "route:/read": 1, + "word:terminal": 2 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalClosureState.test.ts", + "pathRoot": "v43-route-vocabulary-file:d7c4073e867b729120dde967", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 1, + "word:terminal": 2 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalCommandDeck.test.tsx", + "pathRoot": "v43-route-vocabulary-file:dcc9dbc9d8210d6204b68128", + "categories": [ + "component", + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 11, + "word:terminal": 19 + }, + "totalMatches": 30, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalCommandPresentation.test.ts", + "pathRoot": "v43-route-vocabulary-file:68dbfeeb20fbbe26bdc10b62", + "categories": [ + "test" + ], + "tokenCounts": { + "route:/terminal": 2, + "symbol:Terminal": 1, + "word:terminal": 4 + }, + "totalMatches": 7, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalCommandState.test.ts", + "pathRoot": "v43-route-vocabulary-file:b83bab1a6d64bd830c8ee355", + "categories": [ + "test" + ], + "tokenCounts": { + "route:/terminal": 1, + "symbol:Terminal": 1, + "word:terminal": 2 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalCommercialLaunchReadiness.test.ts", + "pathRoot": "v43-route-vocabulary-file:bc161f68a853b8d378af2277", + "categories": [ + "test" + ], + "tokenCounts": { + "route:/terminal": 1, + "symbol:Exchange": 1, + "symbol:Terminal": 1, + "word:exchange": 1, + "word:terminal": 3 + }, + "totalMatches": 7, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalCoreNativeSections.test.tsx", + "pathRoot": "v43-route-vocabulary-file:95b5e84a08ce7b372c3fd240", + "categories": [ + "component", + "test" + ], + "tokenCounts": { + "route:/terminal": 3, + "symbol:Depositing": 1, + "word:terminal": 5 + }, + "totalMatches": 9, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalCoreSurface.test.ts", + "pathRoot": "v43-route-vocabulary-file:4e38b1aa4d894bc7cd9a44dc", + "categories": [ + "test" + ], + "tokenCounts": { + "route:/terminal": 1, + "symbol:Reading": 2, + "symbol:Depositing": 4, + "word:terminal": 2 + }, + "totalMatches": 9, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalDepositComposer.test.ts", + "pathRoot": "v43-route-vocabulary-file:59ad7a9268c62c7fcab24337", + "categories": [ + "test" + ], + "tokenCounts": { + "route:/terminal": 1, + "word:terminal": 2 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalDepositComposerCard.test.tsx", + "pathRoot": "v43-route-vocabulary-file:e536abbdb3c4820e74d8ebd3", + "categories": [ + "component", + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 7, + "word:terminal": 12 + }, + "totalMatches": 19, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalDepositReadWorkbench.test.ts", + "pathRoot": "v43-route-vocabulary-file:abacb113608e987f570e2505", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 2, + "symbol:Terminal": 1, + "symbol:Reading": 1, + "word:terminal": 5 + }, + "totalMatches": 9, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalEnterpriseReadingUxState.test.ts", + "pathRoot": "v43-route-vocabulary-file:3d0abd662cb0ef038d6dca88", + "categories": [ + "test" + ], + "tokenCounts": { + "route:/terminal": 1, + "symbol:Reading": 2, + "word:terminal": 4 + }, + "totalMatches": 7, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalExperienceArchitecture.test.ts", + "pathRoot": "v43-route-vocabulary-file:17eb74f8160952e62b2c7f00", + "categories": [ + "test" + ], + "tokenCounts": { + "route:/terminal": 4, + "symbol:Terminal": 2, + "word:terminal": 6 + }, + "totalMatches": 12, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalExternalInterfacingPanel.test.tsx", + "pathRoot": "v43-route-vocabulary-file:282333991ac2c45a925a581b", + "categories": [ + "component", + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 4, + "word:terminal": 6 + }, + "totalMatches": 10, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalExternalRuntime.test.ts", + "pathRoot": "v43-route-vocabulary-file:84d3f60bf821535bed09e555", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 1, + "symbol:Terminal": 1, + "word:terminal": 2 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalFloatingDebugWidget.test.tsx", + "pathRoot": "v43-route-vocabulary-file:32338b47920e449a7c340ac5", + "categories": [ + "component", + "test" + ], + "tokenCounts": { + "route:/terminal": 1, + "symbol:Terminal": 1, + "word:terminal": 1 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalFlowGuide.test.ts", + "pathRoot": "v43-route-vocabulary-file:3d3fd4f959e349c43f2b6a0e", + "categories": [ + "test" + ], + "tokenCounts": { + "route:/terminal": 3, + "word:terminal": 5 + }, + "totalMatches": 8, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalFlowGuideCard.test.tsx", + "pathRoot": "v43-route-vocabulary-file:0e2cc041f97fd6ce94e96882", + "categories": [ + "component", + "test" + ], + "tokenCounts": { + "route:/terminal": 2, + "word:terminal": 3 + }, + "totalMatches": 5, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalInterfaceIntegrationRegression.test.ts", + "pathRoot": "v43-route-vocabulary-file:ed1c88949ef2b07023288fa1", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 1, + "symbol:Terminal": 1, + "word:terminal": 5 + }, + "totalMatches": 7, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalJournalReconciliation.test.ts", + "pathRoot": "v43-route-vocabulary-file:1f7c91f8943b05c5fd64dd98", + "categories": [ + "test" + ], + "tokenCounts": { + "route:/terminal": 2, + "word:terminal": 7 + }, + "totalMatches": 9, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalLiveSummary.test.ts", + "pathRoot": "v43-route-vocabulary-file:84363e552bd994fc999cc9d8", + "categories": [ + "test" + ], + "tokenCounts": { + "route:/terminal": 1, + "symbol:Terminal": 1, + "word:terminal": 2 + }, + "totalMatches": 4, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalLiveSummaryStrip.test.tsx", + "pathRoot": "v43-route-vocabulary-file:78f0ad0d9c319db29f2285a3", + "categories": [ + "component", + "test" + ], + "tokenCounts": { + "route:/terminal": 4, + "symbol:Terminal": 1, + "word:terminal": 6 + }, + "totalMatches": 11, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalOperationalHealthPanel.test.tsx", + "pathRoot": "v43-route-vocabulary-file:480a4c0e515bb90ed39f44a2", + "categories": [ + "component", + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 1, + "symbol:Terminal": 1, + "word:terminal": 5 + }, + "totalMatches": 7, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalOperatorCard.test.tsx", + "pathRoot": "v43-route-vocabulary-file:ddf918a64085d1e173b6059d", + "categories": [ + "component", + "test" + ], + "tokenCounts": { + "route:/terminal": 1, + "word:terminal": 1 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalOrganizationAuthority.test.ts", + "pathRoot": "v43-route-vocabulary-file:cb4fefe6ea371b76dfe54d32", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 3, + "symbol:Terminal": 6, + "word:terminal": 27 + }, + "totalMatches": 36, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalPageShell.test.tsx", + "pathRoot": "v43-route-vocabulary-file:aaa1a26c75549108000d4d22", + "categories": [ + "component", + "test" + ], + "tokenCounts": { + "route:/terminal": 1, + "symbol:Terminal": 2, + "word:terminal": 5 + }, + "totalMatches": 8, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalPipelineHarnessClient.test.ts", + "pathRoot": "v43-route-vocabulary-file:28f59a166624ccebd5eac952", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 3, + "symbol:Terminal": 1, + "word:terminal": 9 + }, + "totalMatches": 13, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalPreservedShellSurface.test.tsx", + "pathRoot": "v43-route-vocabulary-file:de410c28d6d938aeb5451959", + "categories": [ + "component", + "test" + ], + "tokenCounts": { + "route:/terminal": 4, + "word:terminal": 4 + }, + "totalMatches": 8, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalProtocolProjection.test.ts", + "pathRoot": "v43-route-vocabulary-file:224972944d9516d9504e24f6", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 16, + "word:terminal": 24 + }, + "totalMatches": 40, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalReadScenarios.test.ts", + "pathRoot": "v43-route-vocabulary-file:c0904753c63bb1d5cd16dbca", + "categories": [ + "test" + ], + "tokenCounts": { + "route:/terminal": 1, + "symbol:Exchange": 1, + "symbol:Terminal": 1, + "word:terminal": 2 + }, + "totalMatches": 5, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalRepositoryContext.test.ts", + "pathRoot": "v43-route-vocabulary-file:98d6e3eca357b728e87c4c36", + "categories": [ + "test" + ], + "tokenCounts": { + "route:/terminal": 1, + "symbol:Terminal": 3, + "word:terminal": 2 + }, + "totalMatches": 6, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalRepositoryContextPanel.test.tsx", + "pathRoot": "v43-route-vocabulary-file:34e1c174beaf6f6c3a3ee899", + "categories": [ + "component", + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 5, + "symbol:Exchange": 2, + "word:terminal": 6 + }, + "totalMatches": 13, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalSectionAtlas.test.ts", + "pathRoot": "v43-route-vocabulary-file:5cfabbd8f814fe634100ed55", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 1, + "symbol:Reading": 2, + "symbol:Depositing": 4, + "word:terminal": 2 + }, + "totalMatches": 9, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalShellBridge.test.tsx", + "pathRoot": "v43-route-vocabulary-file:3cabf3268dfb9513f89b3c1b", + "categories": [ + "component", + "test" + ], + "tokenCounts": { + "route:/terminal": 3, + "word:terminal": 4 + }, + "totalMatches": 7, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalSupplySelection.test.ts", + "pathRoot": "v43-route-vocabulary-file:bc3565fc610e9f44c7e4994c", + "categories": [ + "test" + ], + "tokenCounts": { + "route:/terminal": 1, + "word:terminal": 2 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalSupplySelectionPanel.test.tsx", + "pathRoot": "v43-route-vocabulary-file:1738237f925689eca9c93383", + "categories": [ + "component", + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 5, + "word:terminal": 8 + }, + "totalMatches": 13, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalSurfaceCopy.test.ts", + "pathRoot": "v43-route-vocabulary-file:69e196652119c62a253495aa", + "categories": [ + "test" + ], + "tokenCounts": { + "route:/terminal": 3, + "symbol:Exchange": 1, + "symbol:Terminal": 9, + "word:terminal": 5 + }, + "totalMatches": 18, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalSurfaceSection.test.tsx", + "pathRoot": "v43-route-vocabulary-file:c1af33d0e93e8d1e6ef5ff89", + "categories": [ + "component", + "test" + ], + "tokenCounts": { + "route:/terminal": 1, + "symbol:Terminal": 3, + "word:terminal": 1 + }, + "totalMatches": 5, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalTransactionActivity.test.ts", + "pathRoot": "v43-route-vocabulary-file:6965444cc55ef395fdab391e", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 1, + "symbol:Terminal": 1, + "word:terminal": 3 + }, + "totalMatches": 5, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalTransactionActivitySurface.test.tsx", + "pathRoot": "v43-route-vocabulary-file:2785a7066e4bbf3a1d8aaf7e", + "categories": [ + "component", + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 3, + "word:terminal": 5 + }, + "totalMatches": 8, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalTransactionDetail.test.ts", + "pathRoot": "v43-route-vocabulary-file:5cdfa63e14c7488f5b99df32", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 4, + "symbol:Terminal": 1, + "word:terminal": 10 + }, + "totalMatches": 15, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalTransactionDetailCards.test.tsx", + "pathRoot": "v43-route-vocabulary-file:7169a020ba44d4e442401eec", + "categories": [ + "component", + "test" + ], + "tokenCounts": { + "route:/terminal": 6, + "symbol:Terminal": 1, + "word:terminal": 6 + }, + "totalMatches": 13, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalTransactionDetailSnapshot.test.ts", + "pathRoot": "v43-route-vocabulary-file:39737fcd04d500beba5089df", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 3, + "word:terminal": 12 + }, + "totalMatches": 15, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalTransactionQuery.test.ts", + "pathRoot": "v43-route-vocabulary-file:38a3343c4ebd5de2b2c2b616", + "categories": [ + "test" + ], + "tokenCounts": { + "route:/terminal": 1, + "symbol:Terminal": 2, + "symbol:Reading": 1, + "word:terminal": 7 + }, + "totalMatches": 11, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalTransactionReadModel.test.ts", + "pathRoot": "v43-route-vocabulary-file:5588995ff7388208b7b61a5a", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "route:/exchange": 1, + "route:/terminal": 4, + "word:exchange": 1, + "word:terminal": 8 + }, + "totalMatches": 14, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalTransactionReadinessSource.test.ts", + "pathRoot": "v43-route-vocabulary-file:7aa20f49b09b360d142ad5a9", + "categories": [ + "test" + ], + "tokenCounts": { + "route:/terminal": 1, + "word:terminal": 2 + }, + "totalMatches": 3, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalTransactionSource.test.ts", + "pathRoot": "v43-route-vocabulary-file:772fc054a9e02798165ff5e9", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 2, + "word:terminal": 7 + }, + "totalMatches": 9, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalTransactions.test.ts", + "pathRoot": "v43-route-vocabulary-file:e66c84f907672fa1e2bd0bbd", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 2, + "word:terminal": 5 + }, + "totalMatches": 7, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalUxBrowserProof.test.tsx", + "pathRoot": "v43-route-vocabulary-file:6690572f654db7e7b7ebccbe", + "categories": [ + "component", + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 5, + "symbol:Terminal": 6, + "word:terminal": 11 + }, + "totalMatches": 22, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalWalletBtcOperation.test.ts", + "pathRoot": "v43-route-vocabulary-file:7420fd077a0d20fe651e9c3a", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "route:/terminal": 3, + "symbol:Terminal": 1, + "word:terminal": 6 + }, + "totalMatches": 10, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalWorkspaceRail.test.tsx", + "pathRoot": "v43-route-vocabulary-file:4fe66fdf754a661078663b1e", + "categories": [ + "component", + "test" + ], + "tokenCounts": { + "route:/terminal": 3, + "word:terminal": 3 + }, + "totalMatches": 6, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/terminalWorkspaceRailCard.test.tsx", + "pathRoot": "v43-route-vocabulary-file:815c064bf0b7177c7f5c4d48", + "categories": [ + "component", + "test" + ], + "tokenCounts": { + "route:/terminal": 2, + "symbol:Reading": 2, + "word:terminal": 3 + }, + "totalMatches": 7, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/useConversationStream.firstWrite.test.ts", + "pathRoot": "v43-route-vocabulary-file:a628eb899095011007fbe870", + "categories": [ + "telemetry", + "test" + ], + "tokenCounts": { + "symbol:Terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tests/workspaceSurface.test.ts", + "pathRoot": "v43-route-vocabulary-file:49a536b2d6bfc1c3a848c7dc", + "categories": [ + "test" + ], + "tokenCounts": { + "route:/terminal": 4, + "word:terminal": 6 + }, + "totalMatches": 10, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + }, + { + "path": "uapi/tsconfig.json", + "pathRoot": "v43-route-vocabulary-file:727b9f9e8a1cb53c8c422d73", + "categories": [ + "telemetry" + ], + "tokenCounts": { + "word:terminal": 2 + }, + "totalMatches": 2, + "sourceSafeMetadataOnly": true, + "rawSourceTextSerialized": false, + "sourceSnippetSerialized": false + } + ], + "coverage": { + "sourceFileCount": 896, + "tokenTotals": { + "route:/exchange": 157, + "route:/terminal": 1444, + "route:/packs": 71, + "route:/read": 239, + "route:/deposit": 82, + "symbol:Exchange": 1999, + "symbol:Terminal": 3095, + "symbol:Packs": 20, + "symbol:Reading": 1286, + "symbol:Depositing": 234, + "symbol:PackActivity": 17, + "symbol:DepositAssetPackOption": 12, + "word:exchange": 1736, + "word:terminal": 3670, + "word:self-referential": 30 + }, + "categoryTotals": { + "route": 12, + "component": 146, + "test": 215, + "doc": 169, + "api": 43, + "telemetry": 648, + "workflow": 12, + "script": 116, + "package": 308, + "spec": 76 + }, + "routeVocabularyInventoryComplete": true, + "migrationMatrixComplete": true, + "packsMigrationPlanned": true, + "readMigrationPlanned": true, + "depositMigrationPlanned": true, + "retainedDebugCockpitBoundaryPlanned": true, + "redirectCompatibilityPlanned": true, + "selfReferentialCopyRemovalPlanned": true, + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawSourceTextVisible": false, + "sourceSnippetVisible": false, + "credentialsSerialized": false, + "walletPrivateMaterialVisible": false, + "unpaidAssetPackSourceVisible": false, + "settlementPrivatePayloadVisible": false, + "forbiddenPayloadClasses": [ + "secret-values", + "provider-tokens", + "wallet-private-material", + "protected-source-payloads", + "raw-protected-prompts", + "raw-model-responses-with-protected-source", + "unpaid-assetpack-source", + "source-snippets" + ], + "requiredPredicateCount": 24, + "passedPredicateCount": 24, + "failedPredicateIds": [] + } +} diff --git a/.github/workflows/bitcode-canon-quality.yml b/.github/workflows/bitcode-canon-quality.yml index a5d10c2f..0ed6bffc 100644 --- a/.github/workflows/bitcode-canon-quality.yml +++ b/.github/workflows/bitcode-canon-quality.yml @@ -328,6 +328,9 @@ jobs: if [ -f BITCODE_SPEC_V43.md ]; then node scripts/check-bitcode-spec-family.mjs --version V43 --mode draft --current-target V42 node scripts/check-v43-gate1-packs-read-deposit-roadmap.mjs --skip-branch-check + if [ -f scripts/check-v43-gate2-route-vocabulary-inventory.mjs ]; then + node scripts/check-v43-gate2-route-vocabulary-inventory.mjs --skip-branch-check + fi fi else echo "Unexpected BITCODE_SPEC.txt pointer: $POINTER" >&2 diff --git a/.github/workflows/bitcode-gate-quality.yml b/.github/workflows/bitcode-gate-quality.yml index cfbf747c..17883887 100644 --- a/.github/workflows/bitcode-gate-quality.yml +++ b/.github/workflows/bitcode-gate-quality.yml @@ -457,6 +457,9 @@ jobs: if [ -f BITCODE_SPEC_V43.md ]; then node scripts/check-bitcode-spec-family.mjs --version V43 --mode draft --current-target V42 node scripts/check-v43-gate1-packs-read-deposit-roadmap.mjs --skip-branch-check + if [ -f scripts/check-v43-gate2-route-vocabulary-inventory.mjs ]; then + node scripts/check-v43-gate2-route-vocabulary-inventory.mjs --skip-branch-check + fi fi else echo "Unexpected BITCODE_SPEC.txt pointer: $POINTER" >&2 @@ -490,6 +493,9 @@ jobs: if [ -f scripts/check-v43-gate1-packs-read-deposit-roadmap.mjs ]; then node scripts/check-v43-gate1-packs-read-deposit-roadmap.mjs --skip-branch-check fi + if [ -f scripts/check-v43-gate2-route-vocabulary-inventory.mjs ]; then + node scripts/check-v43-gate2-route-vocabulary-inventory.mjs --skip-branch-check + fi pnpm --filter @bitcode/protocol test pnpm --filter @bitcode/btd exec jest --config jest.config.cjs --runInBand --forceExit pnpm --filter @bitcode/pipeline-asset-pack exec jest --config jest.config.cjs --passWithNoTests --forceExit diff --git a/BITCODE_SPEC_V43.md b/BITCODE_SPEC_V43.md index c3d44bdb..c8e784f9 100644 --- a/BITCODE_SPEC_V43.md +++ b/BITCODE_SPEC_V43.md @@ -107,6 +107,33 @@ Gate 1 opens the V43 specification family, branch posture, workflow posture, che Gate 2 must inventory every `/exchange`, Exchange, `/terminal`, Terminal, Reading, Depositing, and pack-activity route/component/test/doc/API/telemetry reference. It must produce a migration matrix for Packs, Read, Deposit, retained debug cockpit surfaces, redirects, compatibility boundaries, and removal of self-referential product copy. +Gate 2 closes with the package-backed route vocabulary inventory +`V43RouteVocabularyInventory` and deterministic generated artifact +`.bitcode/v43-route-vocabulary-inventory.json`. The artifact records only +source-safe file/token counts, token totals, category totals, migration rows, +and proof roots. It does not serialize source snippets, raw prompts, protected +source, unpaid AssetPack source, provider responses, wallet private material, +private settlement payloads, credentials, or secrets. + +The migration matrix is binding for later gates: + +- `/exchange`, Exchange, and exchange activity names migrate to `/packs`, + Packs, and PackActivity under Gate 3, with redirect compatibility until old + links are retired. +- `/terminal` Reading state migrates to `/read` under Gate 4, preserving the + five-step Reading path and all Need review, Finding Fits, settlement, BTD + rights, delivery, and telemetry boundaries. +- `/terminal` Depositing state migrates to `/deposit` under Gate 5, where + deposit AssetPack options remain unminted, source-safe proposals until + depositor approval and Depository admission. +- Any retained debug cockpit is internal/operator-only and cannot be the + default product path or a parallel authority route. +- Redirect compatibility preserves transaction ids, reading stages, deposit + anchors, and proof roots without changing protocol authority. +- Self-referential product copy outside public docs must be removed during the + Gate 8 UX pass and replaced by route structure, labels, status, and + progressive proof detail. + ## V43 Gate 3 Packs Activity Master-Detail Data Model Gate 3 must implement PackActivity data contracts, route APIs, table search, column sort, filtering, detail projection, source-safe metadata expansion, proof-root display, settlement/compensation/delivery/repair state readback, and no-source leak tests. diff --git a/BITCODE_SPEC_V43_DELTA.md b/BITCODE_SPEC_V43_DELTA.md index 1aac0161..e8e06ece 100644 --- a/BITCODE_SPEC_V43_DELTA.md +++ b/BITCODE_SPEC_V43_DELTA.md @@ -8,7 +8,7 @@ - Prior canonical anchor: `BITCODE_SPEC_V42.md` - Prior generated proof appendix: `BITCODE_SPEC_V42_PROVEN.md` - Generated structured artifact inventory: `.bitcode/v43-spec-family-report.json`, `.bitcode/v43-canonical-input-report.json`, and V43 gate artifacts as introduced -- Source parity state: Gate 1 opens V43 specification and validation posture; implementation parity is gate-scoped +- Source parity state: Gate 1 opens V43 specification and validation posture; Gate 2 adds source-safe route vocabulary inventory and migration-matrix proof ## Why V43 exists @@ -23,6 +23,7 @@ V42 proved the reliable MVP path, but the product route vocabulary is still tran 5. Deposit options must expose source-safe measurements, sub-criticality, demand, likely ROI, BTD potential, compensation posture, and admission blockers before approval. 6. `/read` remains the five-step Reading path: request read, review synthesized Need, request Finding Fits, review source-safe AssetPack preview, settle/buy/deliver. 7. Product UX outside public documentation must be self-explanatory through structure, labels, progressive detail, rich components, and visual quality, not self-referential copy. +8. Gate 2 records the route vocabulary inventory in `.bitcode/v43-route-vocabulary-inventory.json` as source-safe file/token counts and a migration matrix only; the actual route rename and split remain owned by later gates. ## Explicitly deferred @@ -43,6 +44,18 @@ V42 proved the reliable MVP path, but the product route vocabulary is still tran 9. Rehearse cross-route local/staging-testnet path. 10. Close promotion readiness. +## Gate 2 delta closure + +Gate 2 adds `V43RouteVocabularyInventory`, the generated +`.bitcode/v43-route-vocabulary-inventory.json` artifact, package exports, +protocol tests, workflow checks, and `check:v43-gate2`. The artifact inventories +`/exchange`, Exchange, `/terminal`, Terminal, `/packs`, `/read`, `/deposit`, +Reading, Depositing, PackActivity, DepositAssetPackOption, and self-referential +copy references with source-safe file/token counts. It also formalizes migration +rows for `/packs`, `/read`, `/deposit`, retained debug cockpit boundaries, +redirect compatibility, and product-copy cleanup without serializing source +snippets or source-bearing payloads. + ## Commit-Body Direction V43 gate commits should state the route/product surface changed, the protocol objects preserved, the proof/test commands run, and the source-safety boundaries maintained. Gate PR titles must begin with `V43 Gate N:`. diff --git a/BITCODE_SPEC_V43_NOTES.md b/BITCODE_SPEC_V43_NOTES.md index 41f2948c..517af3a5 100644 --- a/BITCODE_SPEC_V43_NOTES.md +++ b/BITCODE_SPEC_V43_NOTES.md @@ -47,3 +47,16 @@ The deposit-side pipeline should help an enterprise decide what IP to sell. It s ## V43 copy boundary Outside public docs, avoid self-referential copy such as text explaining that a component is powerful or that Bitcode is doing a thing. Use clear route names, labels, status rows, measurement summaries, empty states, and expandable proof metadata. Public docs may explain the protocol; product UI should operate it. + +## Gate 2 route vocabulary inventory note + +Gate 2 closes by proving the current vocabulary surface before renaming it. The +source-safe `.bitcode/v43-route-vocabulary-inventory.json` artifact records +file/token counts for `/exchange`, Exchange, `/terminal`, Terminal, `/packs`, +`/read`, `/deposit`, Reading, Depositing, PackActivity, +DepositAssetPackOption, and self-referential copy references. Its migration +matrix prepares `/packs`, `/read`, `/deposit`, retained debug cockpit, +redirect compatibility, and later copy-removal work. The artifact is metadata +only; it intentionally excludes source snippets, raw prompts, provider +responses, protected source, unpaid AssetPack source, credentials, and wallet +or settlement private material. diff --git a/BITCODE_SPEC_V43_PARITY_MATRIX.md b/BITCODE_SPEC_V43_PARITY_MATRIX.md index 2a25e175..192aa875 100644 --- a/BITCODE_SPEC_V43_PARITY_MATRIX.md +++ b/BITCODE_SPEC_V43_PARITY_MATRIX.md @@ -8,7 +8,7 @@ - Prior canonical anchor: `BITCODE_SPEC_V42.md` - Prior generated proof appendix: `BITCODE_SPEC_V42_PROVEN.md` - Generated structured artifact inventory: `.bitcode/v43-spec-family-report.json`, `.bitcode/v43-canonical-input-report.json`, and future V43 gate artifacts -- Source parity state: V43 Gate 1 parity is documentation/workflow posture; implementation parity is pending +- Source parity state: V43 Gate 1 parity is documentation/workflow posture; V43 Gate 2 parity is source-safe inventory and migration planning ## Purpose @@ -23,7 +23,7 @@ Audit V43 against `BITCODE_SPEC_V43.md`, V42 active canon, route source, package | Area | Required V43 result | Source evidence | Judgment | | --- | --- | --- | --- | | Gate 1 roadmap | Active V42 / draft V43 posture, route vocabulary, gate plan, docs, checker, workflows | `BITCODE_SPEC_V43.md`, `scripts/check-v43-gate1-packs-read-deposit-roadmap.mjs` | drafted | -| Route vocabulary | `/exchange` renamed to `/packs`; `/terminal` split into `/read` and `/deposit` default paths | future Gate 2 artifact | draft-required | +| Route vocabulary | `/exchange` to `/packs` and `/terminal` to `/read`/`/deposit` are inventoried with route vocabulary inventory, migration matrix, retained debug cockpit boundary, redirect compatibility, self-referential copy audit, and source-safe file/token counts | `packages/protocol/src/canonical/v43-route-vocabulary-inventory.js`, `.bitcode/v43-route-vocabulary-inventory.json`, `scripts/check-v43-gate2-route-vocabulary-inventory.mjs` | implemented | | Packs master-detail | Searchable, sortable, filterable pack activity table and source-safe detail route | future Gate 3 artifact | draft-required | | Read route | Five-step Reading UX owns Read Request through settlement/delivery | future Gate 4 artifact | draft-required | | Deposit route | Connected-source deposit AssetPack option synthesis and review | future Gate 5 artifact | draft-required | @@ -41,11 +41,14 @@ Audit V43 against `BITCODE_SPEC_V43.md`, V42 active canon, route source, package | Package script | `check:v43-gate1` exists | drafted | | Workflows | Gate/canon quality know active V42 / draft V43 | drafted | | Documentation | README and roadmap name V43 route/product scope | drafted | -| Implementation | Route and pipeline source changes are not part of Gate 1 | accepted boundary | +| Gate 2 package proof | `V43RouteVocabularyInventory` exports, generated artifact, package test, workflow checks, and `check:v43-gate2` exist | implemented | +| Implementation | Route and pipeline source changes are not part of Gates 1 or 2 | accepted boundary | ## V43 accepted boundaries -Gate 1 is allowed to specify and wire validation posture only. It must not rename application routes or add deposit option synthesis behavior before the migration inventory is complete. +Gate 1 is allowed to specify and wire validation posture only. Gate 2 is allowed +to inventory and plan migration only. Neither gate may rename application routes +or add deposit option synthesis behavior before their owning implementation gates. ## V43 completion condition diff --git a/README.md b/README.md index ee372b7e..dd6af0e7 100644 --- a/README.md +++ b/README.md @@ -183,6 +183,18 @@ That later UX cleanup should remove self-referential product copy outside public docs and make Depositing, Reading, and Pack activity understandable through route structure, concise labels, progressive disclosure, and rich themed reusable components. +V43 Gate 2 adds `V43RouteVocabularyInventory`, +`.bitcode/v43-route-vocabulary-inventory.json`, +`generate:v43-route-vocabulary-inventory`, +`check:v43-route-vocabulary-inventory`, and `check:v43-gate2`. It inventories +`/exchange`, Exchange, `/terminal`, Terminal, `/packs`, `/read`, `/deposit`, +Reading, Depositing, PackActivity, DepositAssetPackOption, and +self-referential copy references as source-safe file/token counts. It also +records the migration matrix for `/packs`, `/read`, `/deposit`, retained debug +cockpit boundaries, redirect compatibility, and later copy cleanup without +renaming routes in Gate 2 or serializing source snippets, protected source, raw +prompts, provider responses, unpaid AssetPack source, credentials, or wallet +and settlement private material. Exchange is inherited V36 canon: market-wide activity master-detail, buy/sell/ bid/ask/cancel/accept/settle/history flows, AssetPack range trading, diff --git a/SPECIFICATIONS_ROADMAP.md b/SPECIFICATIONS_ROADMAP.md index d6aa197d..3112ed8e 100644 --- a/SPECIFICATIONS_ROADMAP.md +++ b/SPECIFICATIONS_ROADMAP.md @@ -5,8 +5,8 @@ - Current active canonical pointer: `BITCODE_SPEC.txt` -> `V42` - Current active canon: `BITCODE_SPEC_V42.md` - Current draft target: `BITCODE_SPEC_V43.md`. -- Current working gate: V43 Gate 1 Packs, Read, Deposit Roadmap And Spec Opening. -- Next queued work after V43 Gate 1: route-vocabulary inventory and migration planning for `/exchange` to `/packs` and `/terminal` split into `/read` and `/deposit`. +- Current working gate: V43 Gate 2 Route Vocabulary Inventory And Migration Plan. +- Next queued work after V43 Gate 2: Packs activity master-detail data contracts and source-safe searchable activity projection. - Latest closed version: V42 Reliable MVP Experience, which promoted shortest-path Depositing, five-step Reading, ReadNeed review/resynthesis, ReadFitsFinding source-safe preview and quote, settlement rights transfer, repository delivery, AI-reading demonstration, local/staging MVP rehearsal, and V42 promotion readiness. - Recent V42 canonical promotion anchor: V42 canonical promotion updated `BITCODE_SPEC.txt` to `V42`, generated `BITCODE_SPEC_V42_PROVEN.md`, preserved active V42 / draft V43 runtime posture, and closed reliable MVP experience canon. - Recent V42 opening anchor: reliable MVP experience opens over promoted V41 with V42 SPEC, DELTA, NOTES, and PARITY files, `check:v42-gate1`, active V41 / draft V42 posture, and a nine-gate plan for shortest-path Depositing, five-step Reading, ReadNeed product closure, ReadFitsFinding preview and quote closure, settlement and repository delivery, AI-reading demonstration, local/staging rehearsal, and promotion readiness. @@ -18,6 +18,7 @@ - V42 Gate 7 closure anchor: reliable MVP experience now owns AI-reading demonstration proof through `protocol-demonstration/src/ai-reading-demonstration.js`, public-data-only baseline scoring, reviewed local ReadNeed synthesis, local Depository Finding Fits selection, source-safe AssetPack preview, AssetPack-enhanced AI-reading answer scoring, deterministic benchmark uplift, `.bitcode/v42-ai-reading-demonstration.json`, focused demonstration/protocol tests, workflow wiring, and `check:v42-gate7`. - V42 Gate 8 closure anchor: reliable MVP experience now owns local/staging-testnet full MVP rehearsal proof through `ReadingLocalStagingRehearsal`, source-safe V42 operator receipts, staging-testnet Supabase project `tkpyosihuouusyaxtbau`, Gates 2 through 7 generated artifact binding, deposit source, request read, review synthesized Need, request Finding Fits, review source-safe AssetPack preview and quote, buy/settle, receive repository delivery, rich telemetry/database readback, ledger/database/storage reconciliation, blocked value-bearing mainnet, deterministic `.bitcode/v42-local-staging-mvp-rehearsal.json`, focused package/protocol/UAPI checks, workflow wiring, and `check:v42-gate8`. - V42 Gate 9 closure anchor: reliable MVP experience now owns package-backed `V42PromotionReadinessReport`, deterministic `.bitcode/v42-promotion-readiness-report.json`, `BITCODE_SPEC_V42_PROVEN.md` generation support, `v42-canon-promotion.yml`, promotion command dry-run support, gate/canon workflow posture, active V42 / draft V43 runtime preparation, all V42 reliable MVP artifacts covered, source-safe, parseable, and workflow-bound, and value-bearing mainnet admission blocked through `check:v42-gate9`. +- V43 Gate 2 closure anchor: route-product cleanup now owns package-backed `V43RouteVocabularyInventory`, deterministic `.bitcode/v43-route-vocabulary-inventory.json`, source-safe file/token counts across `/exchange`, Exchange, `/terminal`, Terminal, `/packs`, `/read`, `/deposit`, Reading, Depositing, PackActivity, DepositAssetPackOption, and self-referential copy references, a migration matrix for `/packs`, `/read`, `/deposit`, retained debug cockpit boundaries, redirect compatibility, and copy cleanup, package exports, protocol tests, workflow wiring, and `check:v43-gate2`. - Recent V41 closure anchor: V41 canonical promotion updated `BITCODE_SPEC.txt` to `V41`, generated `BITCODE_SPEC_V41_PROVEN.md`, preserved active V41 / draft V42 runtime posture, and closed prompt-program excellence canon. - Recent V40 closure anchor: V40 canonical promotion updated `BITCODE_SPEC.txt` to `V40`, generated `BITCODE_SPEC_V40_PROVEN.md`, preserved active V40 / draft V41 runtime posture, and closed exhaustive commercial application testing canon. - Recent V39 closure anchor: V39 canonical promotion updated `BITCODE_SPEC.txt` to `V39`, generated `BITCODE_SPEC_V39_PROVEN.md`, preserved active V39 / draft V40 runtime posture, and closed commercial Reading readiness canon. @@ -196,6 +197,6 @@ They are referenced here for specification history only; active implementation w - Do use `_legacy/` specifications to understand why current Bitcode concepts exist and what must not regress. - V43 work must build on V42 active canon and V27 `$BTD` law unless a future promoted spec explicitly supersedes it. - V43 is the active draft target for agentic deposit-side AssetPack option synthesis, `/read` and `/deposit` route separation, `/packs` renaming, searchable pack activity master-detail, and UX/product cleanup. -- V43 Gate 1 is specification/documentation/workflow posture only; later V43 gates own route migration, data models, pipelines, UI implementation, rehearsal, and promotion. +- V43 Gate 1 is specification/documentation/workflow posture only; V43 Gate 2 inventories route vocabulary and migration plans only. Later V43 gates own route migration, data models, pipelines, UI implementation, rehearsal, and promotion. - No implementation route should be versioned by spec number; source should move in place with the active canon. - Future notes files are planning memory only until their version is explicitly opened as the draft-target SPEC family. diff --git a/package.json b/package.json index ec793b07..cf46df7b 100644 --- a/package.json +++ b/package.json @@ -330,6 +330,9 @@ "check:v42-promotion-readiness": "node scripts/generate-v42-promotion-readiness-report.mjs --check", "check:v42-gate9": "node scripts/check-v42-gate9-promotion-readiness.mjs", "check:v43-gate1": "node scripts/check-v43-gate1-packs-read-deposit-roadmap.mjs", + "generate:v43-route-vocabulary-inventory": "node scripts/generate-v43-route-vocabulary-inventory.mjs", + "check:v43-route-vocabulary-inventory": "node scripts/generate-v43-route-vocabulary-inventory.mjs --check", + "check:v43-gate2": "node scripts/check-v43-gate2-route-vocabulary-inventory.mjs", "generate:v38-inference-surface-inventory": "node scripts/generate-v38-inference-surface-inventory.mjs", "check:v38-inference-surface-inventory": "node scripts/generate-v38-inference-surface-inventory.mjs --check", "check:v38-gate2": "node scripts/check-v38-gate2-inference-surface-inventory.mjs", diff --git a/packages/protocol/README.md b/packages/protocol/README.md index 18e32a0c..64eb7f50 100644 --- a/packages/protocol/README.md +++ b/packages/protocol/README.md @@ -63,6 +63,7 @@ Current exported commercial helpers include: - `V42AiReadingDemonstration` helpers for V42 source-safe AI-reading demonstration proof: public-data-only baseline, reviewed local Need, local Finding Fits, source-safe AssetPack preview, AssetPack-enhanced AI answer, deterministic benchmark uplift, self-contained demonstration boundary, and workflow wiring; - `V42LocalStagingMvpRehearsal` helpers for V42 source-safe local/staging-testnet full MVP rehearsal proof across Depositing, Reading, Finding Fits, preview/quote, settlement, BTD rights transfer, repository delivery, AI-reading uplift, telemetry/database readback, operator receipts, and blocked value-bearing mainnet; - `V42PromotionReadinessReport` helpers for V42 source-safe promotion readiness across all V42 reliable MVP artifacts, generated proof support, workflow posture, promotion dry-run support, value-bearing mainnet blocking, and `V42` active, `V43` draft runtime preparation; +- `V43RouteVocabularyInventory` helpers for V43 source-safe route vocabulary inventory, source-safe file/token counts, `/exchange` to `/packs` planning, `/terminal` to `/read` and `/deposit` planning, retained debug cockpit boundary, redirect compatibility, self-referential copy cleanup, and migration matrix proof; - canonical proven-generation helpers; - the package app/server context used by commercial interfaces. @@ -72,6 +73,17 @@ into `/read` and `/deposit`, agentic deposit AssetPack option synthesis, searchable pack activity master-detail, source-safe option review, and product UX cleanup through `check:v43-gate1`. +V43 Gate 2 adds `V43RouteVocabularyInventory` through +`packages/protocol/src/canonical/v43-route-vocabulary-inventory.js`, +`packages/protocol/test/v43-route-vocabulary-inventory.test.js`, +`.bitcode/v43-route-vocabulary-inventory.json`, +`generate:v43-route-vocabulary-inventory`, +`check:v43-route-vocabulary-inventory`, and `check:v43-gate2`. +The artifact is source-safe metadata only: it records file paths, token counts, +category counts, migration rows, and proof roots, but never source snippets, +protected source, raw prompts, provider responses, unpaid AssetPack source, +credentials, wallet private material, or private settlement payloads. + Historical V39 promotion moved this package through the `V39` active, `V40` draft posture. V40 promotion has since advanced the current package posture to `V40` active, `V41` draft. diff --git a/packages/protocol/src/canonical/v43-route-vocabulary-inventory.js b/packages/protocol/src/canonical/v43-route-vocabulary-inventory.js new file mode 100644 index 00000000..b635cdf4 --- /dev/null +++ b/packages/protocol/src/canonical/v43-route-vocabulary-inventory.js @@ -0,0 +1,486 @@ +// @ts-check + +import crypto from 'node:crypto'; +import { execFileSync } from 'node:child_process'; +import { existsSync, readdirSync, readFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const DEFAULT_REPO_ROOT = path.resolve(__dirname, '..', '..', '..', '..'); + +export const V43_ROUTE_VOCABULARY_INVENTORY_ARTIFACT_PATH = + '.bitcode/v43-route-vocabulary-inventory.json'; +export const V43_ROUTE_VOCABULARY_INVENTORY_SCHEMA_ID = + 'bitcode.v43.routeVocabularyInventory.v1'; +export const V43_ROUTE_VOCABULARY_INVENTORY_VERSION = 'V43'; +export const V43_ROUTE_VOCABULARY_INVENTORY_CURRENT_TARGET = 'V42'; +export const V43_ROUTE_VOCABULARY_INVENTORY_SOURCE_SAFETY_VERDICT = + 'source-safe-route-vocabulary-inventory-metadata'; + +export const V43_ROUTE_VOCABULARY_TOKEN_IDS = Object.freeze([ + 'route:/exchange', + 'route:/terminal', + 'route:/packs', + 'route:/read', + 'route:/deposit', + 'symbol:Exchange', + 'symbol:Terminal', + 'symbol:Packs', + 'symbol:Reading', + 'symbol:Depositing', + 'symbol:PackActivity', + 'symbol:DepositAssetPackOption', + 'word:exchange', + 'word:terminal', + 'word:self-referential', +]); + +export const V43_ROUTE_VOCABULARY_CATEGORY_IDS = Object.freeze([ + 'route', + 'component', + 'test', + 'doc', + 'api', + 'telemetry', + 'workflow', + 'script', + 'package', + 'spec', +]); + +export const V43_ROUTE_VOCABULARY_MIGRATION_ROW_IDS = Object.freeze([ + 'packs-route-master-detail', + 'read-route-five-step-reading', + 'deposit-route-agentic-options', + 'retained-debug-cockpit', + 'redirect-compatibility', + 'self-referential-copy-removal', +]); + +const TOKEN_SPECS = Object.freeze([ + ['route:/exchange', /\/exchange(?=$|[/?#"'`\s),\]}])/gu], + ['route:/terminal', /\/terminal(?=$|[/?#"'`\s),\]}])/gu], + ['route:/packs', /\/packs(?=$|[/?#"'`\s),\]}])/gu], + ['route:/read', /\/read(?=$|[/?#"'`\s),\]}])/gu], + ['route:/deposit', /\/deposit(?=$|[/?#"'`\s),\]}])/gu], + ['symbol:Exchange', /\bExchange\b/gu], + ['symbol:Terminal', /\bTerminal\b/gu], + ['symbol:Packs', /\bPacks\b/gu], + ['symbol:Reading', /\bReading\b/gu], + ['symbol:Depositing', /\bDepositing\b/gu], + ['symbol:PackActivity', /\bPackActivity\b/gu], + ['symbol:DepositAssetPackOption', /\bDepositAssetPackOption\b/gu], + ['word:exchange', /\bexchange\b/gu], + ['word:terminal', /\bterminal\b/gu], + ['word:self-referential', /\bself-referential\b/giu], +]); + +const TEXT_FILE_EXTENSIONS = new Set([ + '.cjs', + '.css', + '.d.ts', + '.js', + '.json', + '.jsx', + '.mjs', + '.md', + '.mdx', + '.ts', + '.tsx', + '.txt', + '.yaml', + '.yml', +]); + +const EXCLUDED_DIRECTORIES = new Set([ + '.git', + '.bitcode', + '.next', + '.pnpm-store', + '.supabase', + '.turbo', + '.vercel', + '.workbench', + '_legacy', + 'coverage', + 'dist', + 'node_modules', + 'out', +]); + +const EXCLUDED_FILE_NAMES = new Set(['pnpm-lock.yaml']); + +const FORBIDDEN_PAYLOAD_CLASSES = Object.freeze([ + 'secret-values', + 'provider-tokens', + 'wallet-private-material', + 'protected-source-payloads', + 'raw-protected-prompts', + 'raw-model-responses-with-protected-source', + 'unpaid-assetpack-source', + 'source-snippets', +]); + +function digest(value) { + return crypto.createHash('sha256').update(value).digest('hex').slice(0, 24); +} + +function rowRoot(id) { + return `v43-route-vocabulary-migration-row:${digest(id)}`; +} + +function fileRoot(relativePath, tokenCounts) { + return `v43-route-vocabulary-file:${digest(JSON.stringify([relativePath, tokenCounts]))}`; +} + +function readSource(repoRoot, sourcePath) { + const absolutePath = path.join(repoRoot, sourcePath); + return existsSync(absolutePath) ? readFileSync(absolutePath, 'utf8') : ''; +} + +function predicateResult(id, sourcePath, passed) { + return { id, sourcePath, passed: Boolean(passed) }; +} + +function lexicalCompare(left, right) { + if (left < right) return -1; + if (left > right) return 1; + return 0; +} + +function countMatches(content, regex) { + regex.lastIndex = 0; + let count = 0; + while (regex.exec(content) !== null) count += 1; + return count; +} + +function isTextFile(filePath) { + if (EXCLUDED_FILE_NAMES.has(path.basename(filePath))) return false; + return TEXT_FILE_EXTENSIONS.has(path.extname(filePath)); +} + +function isExcludedRelativePath(relativePath) { + return relativePath.split('/').some((part) => EXCLUDED_DIRECTORIES.has(part)); +} + +function listGitTrackedTextFiles(repoRoot) { + try { + return execFileSync('git', ['ls-files'], { cwd: repoRoot, encoding: 'utf8' }) + .split('\n') + .filter(Boolean) + .filter((relativePath) => !isExcludedRelativePath(relativePath)) + .filter(isTextFile) + .sort(lexicalCompare); + } catch { + return null; + } +} + +function listTextFiles(repoRoot, currentDirectory = repoRoot) { + if (currentDirectory === repoRoot) { + const gitTrackedFiles = listGitTrackedTextFiles(repoRoot); + if (gitTrackedFiles) return gitTrackedFiles; + } + + const entries = readdirSync(currentDirectory, { withFileTypes: true }); + const files = []; + + for (const entry of entries) { + if (entry.isSymbolicLink()) continue; + const absolutePath = path.join(currentDirectory, entry.name); + + if (entry.isDirectory()) { + if (EXCLUDED_DIRECTORIES.has(entry.name)) continue; + files.push(...listTextFiles(repoRoot, absolutePath)); + continue; + } + + if (!entry.isFile() || !isTextFile(absolutePath)) continue; + files.push(path.relative(repoRoot, absolutePath).split(path.sep).join('/')); + } + + return files.sort(lexicalCompare); +} + +function categorizeFile(relativePath, content) { + const categories = new Set(); + const extension = path.extname(relativePath); + + if ( + relativePath.startsWith('uapi/app/') && + (relativePath.endsWith('/page.tsx') || + relativePath.endsWith('/layout.tsx') || + relativePath.endsWith('/route.ts') || + relativePath.endsWith('/route.tsx')) + ) { + categories.add('route'); + } + if (relativePath.includes('/api/') || relativePath.endsWith('/route.ts')) categories.add('api'); + if (relativePath.endsWith('.tsx') || relativePath.includes('/components/')) categories.add('component'); + if (/(\btest\b|\.test\.|\.spec\.|__tests__)/u.test(relativePath)) categories.add('test'); + if (extension === '.md' || extension === '.mdx' || path.basename(relativePath).startsWith('README')) { + categories.add('doc'); + } + if (relativePath.startsWith('.github/workflows/')) categories.add('workflow'); + if (relativePath.startsWith('scripts/')) categories.add('script'); + if (relativePath.startsWith('packages/')) categories.add('package'); + if (relativePath.startsWith('BITCODE_SPEC') || relativePath === 'SPECIFICATIONS_ROADMAP.md') { + categories.add('spec'); + } + if (/(telemetry|stream|execution|log)/iu.test(relativePath) || /(telemetry|stream|execution|log)/iu.test(content)) { + categories.add('telemetry'); + } + + return [...categories].sort(lexicalCompare); +} + +function scanRouteVocabulary(repoRoot) { + const files = []; + const tokenTotals = Object.fromEntries(V43_ROUTE_VOCABULARY_TOKEN_IDS.map((tokenId) => [tokenId, 0])); + const categoryTotals = Object.fromEntries(V43_ROUTE_VOCABULARY_CATEGORY_IDS.map((categoryId) => [categoryId, 0])); + + for (const relativePath of listTextFiles(repoRoot)) { + const content = readSource(repoRoot, relativePath); + const tokenCounts = {}; + let totalMatches = 0; + + for (const [tokenId, regex] of TOKEN_SPECS) { + const count = countMatches(content, regex); + if (count > 0) { + tokenCounts[tokenId] = count; + tokenTotals[tokenId] += count; + totalMatches += count; + } + } + + if (totalMatches === 0) continue; + + const categories = categorizeFile(relativePath, content); + for (const category of categories) categoryTotals[category] += 1; + + files.push({ + path: relativePath, + pathRoot: fileRoot(relativePath, tokenCounts), + categories, + tokenCounts, + totalMatches, + sourceSafeMetadataOnly: true, + rawSourceTextSerialized: false, + sourceSnippetSerialized: false, + }); + } + + return { + tokenTotals, + categoryTotals, + files, + fileCount: files.length, + }; +} + +function migrationRow(input) { + return { + ...input, + rowRoot: rowRoot(input.rowId), + sourceSafetyClass: 'source_safe_route_vocabulary_migration_metadata', + sourceSafeMetadataOnly: true, + protectedSourceVisible: false, + rawSourceTextVisible: false, + sourceSnippetVisible: false, + credentialsSerialized: false, + walletPrivateMaterialVisible: false, + unpaidAssetPackSourceVisible: false, + settlementPrivatePayloadVisible: false, + forbiddenPayloadClasses: [...FORBIDDEN_PAYLOAD_CLASSES], + }; +} + +export const V43_ROUTE_VOCABULARY_MIGRATION_ROWS = Object.freeze([ + migrationRow({ + rowId: 'packs-route-master-detail', + fromVocabulary: ['/exchange', 'Exchange', 'exchange'], + toVocabulary: ['/packs', 'Packs', 'PackActivity'], + owningGate: 'V43 Gate 3 Packs Activity Master-Detail Data Model', + compatibilityBoundary: + 'Existing exchange activity history is projected as source-safe PackActivity metadata; no unpaid AssetPack source becomes visible.', + requiredMigrationWork: [ + 'rename route path and app references to /packs', + 'rename component prefixes to Packs where the user-facing activity surface is meant', + 'preserve historical ledger and proof labels as metadata when old records already contain exchange wording', + 'add /exchange to /packs redirect until external links can be retired', + ], + }), + migrationRow({ + rowId: 'read-route-five-step-reading', + fromVocabulary: ['/terminal', 'Terminal Reading'], + toVocabulary: ['/read', 'ReadRouteSession', 'Reading'], + owningGate: 'V43 Gate 4 Read Route Extraction And Five-Step UX', + compatibilityBoundary: + 'Reading remains accepted-Need gated; retained cockpit code cannot bypass Need review, Finding Fits, settlement, rights transfer, or delivery reconciliation.', + requiredMigrationWork: [ + 'extract five-step Reading UX into /read', + 'hydrate historical readingStage and transaction query state into /read', + 'preserve rich execution log streaming and source-safe proof expansion', + 'keep unpaid AssetPack source hidden before settlement', + ], + }), + migrationRow({ + rowId: 'deposit-route-agentic-options', + fromVocabulary: ['/terminal', 'Terminal Depositing'], + toVocabulary: ['/deposit', 'DepositAssetPackOption', 'Depositing'], + owningGate: 'V43 Gate 5 Deposit Route And Agentic AssetPack Option Synthesis', + compatibilityBoundary: + 'Deposit options are unminted source-safe AssetPack proposals; approval admits supply to the Depository but does not mint BTD or expose source to readers.', + requiredMigrationWork: [ + 'extract source connection, depositor instructions, option synthesis, review, and admission into /deposit', + 'use Depository state and Reading demand as source-safe option-synthesis context', + 'show source criticality, likely demand, ROI posture, BTD potential, and compensation route', + 'synchronize admitted options into /packs activity', + ], + }), + migrationRow({ + rowId: 'retained-debug-cockpit', + fromVocabulary: ['/terminal', 'Terminal'], + toVocabulary: ['internal cockpit', 'operator/debug surface'], + owningGate: 'V43 Gate 8 UX/UI Product Excellence Pass', + compatibilityBoundary: + 'If retained, cockpit surfaces are explicit internal/debug affordances and never the default product path for Depositing or Reading.', + requiredMigrationWork: [ + 'separate operator cockpit naming from product navigation', + 'remove default product links to /terminal', + 'verify retained cockpit cannot create second authority paths', + ], + }), + migrationRow({ + rowId: 'redirect-compatibility', + fromVocabulary: ['/exchange', '/terminal'], + toVocabulary: ['/packs', '/read', '/deposit'], + owningGate: 'V43 Gate 9 Cross-Route Rehearsal, Telemetry, And Repair', + compatibilityBoundary: + 'Redirects preserve transaction ids, reading stages, deposit anchors, and proof roots without changing protocol authority.', + requiredMigrationWork: [ + 'redirect /exchange to /packs', + 'route Reading terminal state to /read', + 'route Depositing terminal state to /deposit', + 'prove telemetry, database, ledger, and storage readback remain synchronized after redirects', + ], + }), + migrationRow({ + rowId: 'self-referential-copy-removal', + fromVocabulary: ['self-referential product explanation', 'instructional route copy'], + toVocabulary: ['concise labels', 'progressive detail', 'source-safe proof expansion'], + owningGate: 'V43 Gate 8 UX/UI Product Excellence Pass', + compatibilityBoundary: + 'Public docs may explain the protocol; product UI should communicate through route structure, labels, state, and reusable components.', + requiredMigrationWork: [ + 'audit in-app self-referential copy outside public docs', + 'replace copy that describes the design with operational labels and state', + 'keep advanced detail available through expandable metadata and proof rows', + ], + }), +]); + +function buildPredicateResults(repoRoot, scan) { + const spec = readSource(repoRoot, 'BITCODE_SPEC_V43.md'); + const delta = readSource(repoRoot, 'BITCODE_SPEC_V43_DELTA.md'); + const notes = readSource(repoRoot, 'BITCODE_SPEC_V43_NOTES.md'); + const parity = readSource(repoRoot, 'BITCODE_SPEC_V43_PARITY_MATRIX.md'); + const roadmap = readSource(repoRoot, 'SPECIFICATIONS_ROADMAP.md'); + const readme = readSource(repoRoot, 'README.md'); + const protocolReadme = readSource(repoRoot, 'packages/protocol/README.md'); + const packageJson = readSource(repoRoot, 'package.json'); + const gateWorkflow = readSource(repoRoot, '.github/workflows/bitcode-gate-quality.yml'); + const canonWorkflow = readSource(repoRoot, '.github/workflows/bitcode-canon-quality.yml'); + const index = readSource(repoRoot, 'packages/protocol/src/index.js'); + const declarations = readSource(repoRoot, 'packages/protocol/src/index.d.ts'); + const generator = readSource(repoRoot, 'scripts/generate-v43-route-vocabulary-inventory.mjs'); + const checker = readSource(repoRoot, 'scripts/check-v43-gate2-route-vocabulary-inventory.mjs'); + const test = readSource(repoRoot, 'packages/protocol/test/v43-route-vocabulary-inventory.test.js'); + return [ + predicateResult('active-canon-pointer-remains-v42', 'BITCODE_SPEC.txt', readSource(repoRoot, 'BITCODE_SPEC.txt').trim() === 'V42'), + predicateResult('spec-defines-gate2-inventory', 'BITCODE_SPEC_V43.md', spec.includes('V43 Gate 2') && spec.includes('route vocabulary inventory')), + predicateResult('spec-defines-migration-matrix', 'BITCODE_SPEC_V43.md', spec.includes('migration matrix') && spec.includes('retained debug cockpit')), + predicateResult('delta-records-gate2-artifact', 'BITCODE_SPEC_V43_DELTA.md', delta.includes('v43-route-vocabulary-inventory')), + predicateResult('notes-record-gate2-artifact', 'BITCODE_SPEC_V43_NOTES.md', notes.includes('v43-route-vocabulary-inventory')), + predicateResult('parity-records-gate2-artifact', 'BITCODE_SPEC_V43_PARITY_MATRIX.md', parity.includes('v43-route-vocabulary-inventory')), + predicateResult('roadmap-records-gate2-closure', 'SPECIFICATIONS_ROADMAP.md', roadmap.includes('V43 Gate 2 closure anchor')), + predicateResult('readme-records-gate2', 'README.md', readme.includes('V43 Gate 2')), + predicateResult('protocol-readme-records-gate2', 'packages/protocol/README.md', protocolReadme.includes('V43 Gate 2')), + predicateResult('package-exposes-gate2-scripts', 'package.json', packageJson.includes('"generate:v43-route-vocabulary-inventory"') && packageJson.includes('"check:v43-gate2"')), + predicateResult('gate-workflow-runs-gate2', '.github/workflows/bitcode-gate-quality.yml', gateWorkflow.includes('check-v43-gate2-route-vocabulary-inventory.mjs')), + predicateResult('canon-workflow-runs-gate2', '.github/workflows/bitcode-canon-quality.yml', canonWorkflow.includes('check-v43-gate2-route-vocabulary-inventory.mjs')), + predicateResult('protocol-index-exports-gate2', 'packages/protocol/src/index.js', index.includes('buildV43RouteVocabularyInventory')), + predicateResult('protocol-types-export-gate2', 'packages/protocol/src/index.d.ts', declarations.includes('buildV43RouteVocabularyInventory')), + predicateResult('generator-exists', 'scripts/generate-v43-route-vocabulary-inventory.mjs', generator.includes('buildV43RouteVocabularyInventory')), + predicateResult('checker-exists', 'scripts/check-v43-gate2-route-vocabulary-inventory.mjs', checker.includes('V43 Gate 2 route vocabulary inventory check')), + predicateResult('protocol-test-exists', 'packages/protocol/test/v43-route-vocabulary-inventory.test.js', test.includes('buildV43RouteVocabularyInventory')), + predicateResult('legacy-exchange-inventory-nonempty', 'source scan', scan.tokenTotals['route:/exchange'] > 0 || scan.tokenTotals['symbol:Exchange'] > 0 || scan.tokenTotals['word:exchange'] > 0), + predicateResult('legacy-terminal-inventory-nonempty', 'source scan', scan.tokenTotals['route:/terminal'] > 0 || scan.tokenTotals['symbol:Terminal'] > 0 || scan.tokenTotals['word:terminal'] > 0), + predicateResult('target-route-vocabulary-present', 'source scan', scan.tokenTotals['route:/packs'] > 0 && scan.tokenTotals['route:/read'] > 0 && scan.tokenTotals['route:/deposit'] > 0), + predicateResult('pack-activity-vocabulary-present', 'source scan', scan.tokenTotals['symbol:PackActivity'] > 0), + predicateResult('deposit-option-vocabulary-present', 'source scan', scan.tokenTotals['symbol:DepositAssetPackOption'] > 0), + predicateResult('migration-rows-complete', 'packages/protocol/src/canonical/v43-route-vocabulary-inventory.js', V43_ROUTE_VOCABULARY_MIGRATION_ROWS.length === V43_ROUTE_VOCABULARY_MIGRATION_ROW_IDS.length), + predicateResult('required-categories-covered', 'source scan', V43_ROUTE_VOCABULARY_CATEGORY_IDS.every((categoryId) => scan.categoryTotals[categoryId] > 0)), + ]; +} + +export function buildV43RouteVocabularyInventory(options = {}) { + const repoRoot = options.repoRoot || DEFAULT_REPO_ROOT; + const scan = scanRouteVocabulary(repoRoot); + const predicateResults = buildPredicateResults(repoRoot, scan); + const failedPredicateIds = predicateResults + .filter((predicate) => !predicate.passed) + .map((predicate) => predicate.id); + const artifactRoot = `v43-route-vocabulary-inventory:${digest(JSON.stringify({ + tokenTotals: scan.tokenTotals, + categoryTotals: scan.categoryTotals, + files: scan.files.map((file) => [file.path, file.pathRoot, file.totalMatches]), + migrationRows: V43_ROUTE_VOCABULARY_MIGRATION_ROWS.map((row) => row.rowRoot), + failedPredicateIds, + }))}`; + + return { + artifactId: 'v43-route-vocabulary-inventory', + schemaId: V43_ROUTE_VOCABULARY_INVENTORY_SCHEMA_ID, + version: V43_ROUTE_VOCABULARY_INVENTORY_VERSION, + currentTarget: V43_ROUTE_VOCABULARY_INVENTORY_CURRENT_TARGET, + sourceSafetyVerdict: V43_ROUTE_VOCABULARY_INVENTORY_SOURCE_SAFETY_VERDICT, + generatedAt: 'deterministic', + artifactRoot, + passed: failedPredicateIds.length === 0, + tokenIds: [...V43_ROUTE_VOCABULARY_TOKEN_IDS], + categoryIds: [...V43_ROUTE_VOCABULARY_CATEGORY_IDS], + migrationRowIds: [...V43_ROUTE_VOCABULARY_MIGRATION_ROW_IDS], + migrationRows: V43_ROUTE_VOCABULARY_MIGRATION_ROWS, + predicateResults, + sourceFiles: scan.files, + coverage: { + sourceFileCount: scan.fileCount, + tokenTotals: scan.tokenTotals, + categoryTotals: scan.categoryTotals, + routeVocabularyInventoryComplete: true, + migrationMatrixComplete: true, + packsMigrationPlanned: true, + readMigrationPlanned: true, + depositMigrationPlanned: true, + retainedDebugCockpitBoundaryPlanned: true, + redirectCompatibilityPlanned: true, + selfReferentialCopyRemovalPlanned: true, + sourceSafeMetadataOnly: true, + protectedSourceVisible: false, + rawSourceTextVisible: false, + sourceSnippetVisible: false, + credentialsSerialized: false, + walletPrivateMaterialVisible: false, + unpaidAssetPackSourceVisible: false, + settlementPrivatePayloadVisible: false, + forbiddenPayloadClasses: [...FORBIDDEN_PAYLOAD_CLASSES], + requiredPredicateCount: predicateResults.length, + passedPredicateCount: predicateResults.length - failedPredicateIds.length, + failedPredicateIds, + }, + }; +} diff --git a/packages/protocol/src/index.d.ts b/packages/protocol/src/index.d.ts index cc8a5930..185afef9 100644 --- a/packages/protocol/src/index.d.ts +++ b/packages/protocol/src/index.d.ts @@ -581,6 +581,16 @@ export const V42_PROMOTION_READINESS_GATE_ARTIFACT_PATHS: readonly string[]; export const V42_PROMOTION_READINESS_GENERATED_OUTPUTS: readonly string[]; export function buildV42PromotionReadinessReport(input?: Record): BitcodeProtocolReport; export function listMissingV42PromotionReadinessSources(repoRoot?: string): string[]; +export const V43_ROUTE_VOCABULARY_INVENTORY_ARTIFACT_PATH: string; +export const V43_ROUTE_VOCABULARY_INVENTORY_CURRENT_TARGET: string; +export const V43_ROUTE_VOCABULARY_INVENTORY_SCHEMA_ID: string; +export const V43_ROUTE_VOCABULARY_INVENTORY_VERSION: string; +export const V43_ROUTE_VOCABULARY_INVENTORY_SOURCE_SAFETY_VERDICT: string; +export const V43_ROUTE_VOCABULARY_TOKEN_IDS: readonly string[]; +export const V43_ROUTE_VOCABULARY_CATEGORY_IDS: readonly string[]; +export const V43_ROUTE_VOCABULARY_MIGRATION_ROW_IDS: readonly string[]; +export const V43_ROUTE_VOCABULARY_MIGRATION_ROWS: readonly Record[]; +export function buildV43RouteVocabularyInventory(input?: Record): BitcodeProtocolReport; export const EXCHANGE_INTENT_ORDER_CONTRACTS_ARTIFACT_PATH: string; export const EXCHANGE_INTENT_ORDER_CONTRACTS_CURRENT_TARGET: string; export const EXCHANGE_INTENT_ORDER_CONTRACTS_SCHEMA_ID: string; diff --git a/packages/protocol/src/index.js b/packages/protocol/src/index.js index e39c9272..aacf0f2f 100644 --- a/packages/protocol/src/index.js +++ b/packages/protocol/src/index.js @@ -655,6 +655,18 @@ export { buildV42PromotionReadinessReport, listMissingV42PromotionReadinessSources } from './canonical/v42-promotion-readiness-report.js'; +export { + V43_ROUTE_VOCABULARY_CATEGORY_IDS, + V43_ROUTE_VOCABULARY_INVENTORY_ARTIFACT_PATH, + V43_ROUTE_VOCABULARY_INVENTORY_CURRENT_TARGET, + V43_ROUTE_VOCABULARY_INVENTORY_SCHEMA_ID, + V43_ROUTE_VOCABULARY_INVENTORY_SOURCE_SAFETY_VERDICT, + V43_ROUTE_VOCABULARY_INVENTORY_VERSION, + V43_ROUTE_VOCABULARY_MIGRATION_ROW_IDS, + V43_ROUTE_VOCABULARY_MIGRATION_ROWS, + V43_ROUTE_VOCABULARY_TOKEN_IDS, + buildV43RouteVocabularyInventory +} from './canonical/v43-route-vocabulary-inventory.js'; export { EXCHANGE_INTENT_ACTION_KINDS, EXCHANGE_INTENT_ORDER_CONTRACTS_ARTIFACT_PATH, diff --git a/packages/protocol/test/v43-route-vocabulary-inventory.test.js b/packages/protocol/test/v43-route-vocabulary-inventory.test.js new file mode 100644 index 00000000..bec3b2c9 --- /dev/null +++ b/packages/protocol/test/v43-route-vocabulary-inventory.test.js @@ -0,0 +1,84 @@ +import assert from 'node:assert/strict'; +import test from 'node:test'; + +import { + V43_ROUTE_VOCABULARY_CATEGORY_IDS, + V43_ROUTE_VOCABULARY_INVENTORY_ARTIFACT_PATH, + V43_ROUTE_VOCABULARY_INVENTORY_SCHEMA_ID, + V43_ROUTE_VOCABULARY_INVENTORY_SOURCE_SAFETY_VERDICT, + V43_ROUTE_VOCABULARY_MIGRATION_ROW_IDS, + V43_ROUTE_VOCABULARY_MIGRATION_ROWS, + V43_ROUTE_VOCABULARY_TOKEN_IDS, + buildV43RouteVocabularyInventory, +} from '../src/canonical/v43-route-vocabulary-inventory.js'; + +test('V43 route vocabulary inventory binds source-safe route migration metadata', () => { + const report = buildV43RouteVocabularyInventory(); + + assert.equal(V43_ROUTE_VOCABULARY_INVENTORY_ARTIFACT_PATH, '.bitcode/v43-route-vocabulary-inventory.json'); + assert.equal(report.artifactId, 'v43-route-vocabulary-inventory'); + assert.equal(report.schemaId, V43_ROUTE_VOCABULARY_INVENTORY_SCHEMA_ID); + assert.equal(report.version, 'V43'); + assert.equal(report.currentTarget, 'V42'); + assert.equal(report.sourceSafetyVerdict, V43_ROUTE_VOCABULARY_INVENTORY_SOURCE_SAFETY_VERDICT); + assert.equal(report.passed, true); + assert.ok(report.artifactRoot.startsWith('v43-route-vocabulary-inventory:')); + assert.deepEqual(report.tokenIds, [...V43_ROUTE_VOCABULARY_TOKEN_IDS]); + assert.deepEqual(report.categoryIds, [...V43_ROUTE_VOCABULARY_CATEGORY_IDS]); + assert.deepEqual(report.migrationRowIds, [...V43_ROUTE_VOCABULARY_MIGRATION_ROW_IDS]); + assert.equal(report.migrationRows.length, V43_ROUTE_VOCABULARY_MIGRATION_ROWS.length); + assert.equal(report.coverage.routeVocabularyInventoryComplete, true); + assert.equal(report.coverage.migrationMatrixComplete, true); + assert.equal(report.coverage.packsMigrationPlanned, true); + assert.equal(report.coverage.readMigrationPlanned, true); + assert.equal(report.coverage.depositMigrationPlanned, true); + assert.equal(report.coverage.retainedDebugCockpitBoundaryPlanned, true); + assert.equal(report.coverage.redirectCompatibilityPlanned, true); + assert.equal(report.coverage.selfReferentialCopyRemovalPlanned, true); + assert.equal(report.coverage.tokenTotals['route:/exchange'] > 0 || report.coverage.tokenTotals['symbol:Exchange'] > 0, true); + assert.equal(report.coverage.tokenTotals['route:/terminal'] > 0 || report.coverage.tokenTotals['symbol:Terminal'] > 0, true); + assert.equal(report.coverage.tokenTotals['route:/packs'] > 0, true); + assert.equal(report.coverage.tokenTotals['route:/read'] > 0, true); + assert.equal(report.coverage.tokenTotals['route:/deposit'] > 0, true); + assert.equal(report.coverage.categoryTotals.route > 0, true); + assert.equal(report.coverage.categoryTotals.component > 0, true); + assert.equal(report.coverage.categoryTotals.test > 0, true); + assert.equal(report.coverage.categoryTotals.doc > 0, true); + assert.equal(report.coverage.categoryTotals.api > 0, true); + assert.equal(report.coverage.categoryTotals.telemetry > 0, true); + assert.deepEqual(report.coverage.failedPredicateIds, []); +}); + +test('V43 route vocabulary migration rows and inventory files remain source-safe metadata only', () => { + const report = buildV43RouteVocabularyInventory(); + + assert.equal(report.coverage.sourceSafeMetadataOnly, true); + assert.equal(report.coverage.protectedSourceVisible, false); + assert.equal(report.coverage.rawSourceTextVisible, false); + assert.equal(report.coverage.sourceSnippetVisible, false); + assert.equal(report.coverage.credentialsSerialized, false); + assert.equal(report.coverage.walletPrivateMaterialVisible, false); + assert.equal(report.coverage.unpaidAssetPackSourceVisible, false); + assert.equal(report.coverage.settlementPrivatePayloadVisible, false); + assert.ok(report.coverage.forbiddenPayloadClasses.includes('source-snippets')); + assert.ok(report.coverage.forbiddenPayloadClasses.includes('unpaid-assetpack-source')); + + for (const row of report.migrationRows) { + assert.ok(row.rowRoot.startsWith('v43-route-vocabulary-migration-row:')); + assert.equal(row.sourceSafetyClass, 'source_safe_route_vocabulary_migration_metadata'); + assert.equal(row.sourceSafeMetadataOnly, true); + assert.equal(row.rawSourceTextVisible, false); + assert.equal(row.sourceSnippetVisible, false); + assert.equal(row.unpaidAssetPackSourceVisible, false); + } + + for (const sourceFile of report.sourceFiles) { + assert.ok(sourceFile.pathRoot.startsWith('v43-route-vocabulary-file:')); + assert.equal(sourceFile.sourceSafeMetadataOnly, true); + assert.equal(sourceFile.rawSourceTextSerialized, false); + assert.equal(sourceFile.sourceSnippetSerialized, false); + assert.equal(typeof sourceFile.path, 'string'); + assert.equal(typeof sourceFile.totalMatches, 'number'); + assert.ok(!Object.values(sourceFile.tokenCounts).some((value) => typeof value !== 'number')); + } +}); diff --git a/scripts/check-v43-gate1-packs-read-deposit-roadmap.mjs b/scripts/check-v43-gate1-packs-read-deposit-roadmap.mjs index 626d228f..5c42a290 100644 --- a/scripts/check-v43-gate1-packs-read-deposit-roadmap.mjs +++ b/scripts/check-v43-gate1-packs-read-deposit-roadmap.mjs @@ -151,7 +151,7 @@ function main() { } assertCheck(failures, roadmap.includes('Current active canonical pointer: `BITCODE_SPEC.txt` -> `V42`'), 'Roadmap must state V42 active pointer.'); - assertCheck(failures, roadmap.includes('Current working gate: V43 Gate 1'), 'Roadmap must state active V43 Gate 1.'); + assertCheck(failures, roadmap.includes('Current working gate: V43 Gate'), 'Roadmap must state active V43 gate work.'); assertCheck(failures, roadmap.includes('| V43 | `BITCODE_SPEC_V43.md` | active draft target |'), 'Roadmap must list V43 as active draft target.'); assertCheck(failures, readme.includes('resolves to `V42`; V43 is the active draft target'), 'README must state V42 active / V43 draft posture.'); assertCheck(failures, readme.includes('/packs') && readme.includes('/read') && readme.includes('/deposit'), 'README must document V43 routes.'); diff --git a/scripts/check-v43-gate2-route-vocabulary-inventory.mjs b/scripts/check-v43-gate2-route-vocabulary-inventory.mjs new file mode 100644 index 00000000..d50d134a --- /dev/null +++ b/scripts/check-v43-gate2-route-vocabulary-inventory.mjs @@ -0,0 +1,173 @@ +#!/usr/bin/env node + +import { execFileSync } from 'node:child_process'; +import { existsSync, readFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { + V43_ROUTE_VOCABULARY_INVENTORY_ARTIFACT_PATH, + buildV43RouteVocabularyInventory, +} from '../packages/protocol/src/canonical/v43-route-vocabulary-inventory.js'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const defaultRepoRoot = path.resolve(__dirname, '..'); + +function read(root, relativePath) { + return readFileSync(path.join(root, relativePath), 'utf8'); +} + +function exists(root, relativePath) { + return existsSync(path.join(root, relativePath)); +} + +function git(root, args) { + return execFileSync('git', args, { cwd: root, encoding: 'utf8' }).trim(); +} + +function assertCheck(failures, condition, message) { + if (!condition) failures.push(message); +} + +function parseArgs(argv) { + const args = { repoRoot: defaultRepoRoot, skipBranchCheck: false }; + for (let index = 0; index < argv.length; index += 1) { + const arg = argv[index]; + if (arg === '--repo-root') args.repoRoot = path.resolve(argv[++index]); + else if (arg === '--skip-branch-check') args.skipBranchCheck = true; + else if (arg === '--help' || arg === '-h') args.help = true; + else throw new Error(`Unknown argument ${arg}`); + } + return args; +} + +function printHelp() { + process.stdout.write( + [ + 'Usage: node scripts/check-v43-gate2-route-vocabulary-inventory.mjs [--skip-branch-check] [--repo-root ]', + '', + 'Checks V43 Gate 2 route vocabulary inventory, migration matrix, generated artifact, docs, workflows, exports, and source-safe disclosure posture.', + ].join('\n'), + ); + process.stdout.write('\n'); +} + +function main() { + const args = parseArgs(process.argv.slice(2)); + if (args.help) { + printHelp(); + return; + } + + const root = args.repoRoot; + const failures = []; + const pointer = read(root, 'BITCODE_SPEC.txt').trim(); + + assertCheck(failures, pointer === 'V42', `BITCODE_SPEC.txt must remain V42 during V43 gate work. Observed ${pointer || 'empty'}.`); + + if (!args.skipBranchCheck) { + const branch = git(root, ['branch', '--show-current']); + assertCheck( + failures, + branch === 'version/v43' || /^v43\/gate-\d+-[a-z0-9][a-z0-9-]*$/u.test(branch), + `V43 work must occur on version/v43 or v43/gate-N-* branches. Observed ${branch || 'detached HEAD'}.`, + ); + } + + for (const relativePath of [ + V43_ROUTE_VOCABULARY_INVENTORY_ARTIFACT_PATH, + 'BITCODE_SPEC_V43.md', + 'BITCODE_SPEC_V43_DELTA.md', + 'BITCODE_SPEC_V43_NOTES.md', + 'BITCODE_SPEC_V43_PARITY_MATRIX.md', + 'SPECIFICATIONS_ROADMAP.md', + 'README.md', + 'packages/protocol/README.md', + 'packages/protocol/src/canonical/v43-route-vocabulary-inventory.js', + 'packages/protocol/test/v43-route-vocabulary-inventory.test.js', + 'scripts/generate-v43-route-vocabulary-inventory.mjs', + 'scripts/check-v43-gate2-route-vocabulary-inventory.mjs', + '.github/workflows/bitcode-gate-quality.yml', + '.github/workflows/bitcode-canon-quality.yml', + 'package.json', + ]) { + assertCheck(failures, exists(root, relativePath), `Missing required V43 Gate 2 file: ${relativePath}`); + } + + const artifact = buildV43RouteVocabularyInventory({ repoRoot: root }); + assertCheck(failures, artifact.passed, `V43 route vocabulary inventory predicates failed: ${artifact.coverage.failedPredicateIds.join(', ')}`); + assertCheck(failures, artifact.coverage.sourceSafeMetadataOnly === true, 'Inventory artifact must be source-safe metadata only.'); + assertCheck(failures, artifact.coverage.protectedSourceVisible === false, 'Inventory artifact must not expose protected source.'); + assertCheck(failures, artifact.coverage.rawSourceTextVisible === false, 'Inventory artifact must not serialize raw source text.'); + assertCheck(failures, artifact.coverage.sourceSnippetVisible === false, 'Inventory artifact must not serialize source snippets.'); + assertCheck(failures, artifact.coverage.unpaidAssetPackSourceVisible === false, 'Inventory artifact must not expose unpaid AssetPack source.'); + assertCheck(failures, artifact.coverage.routeVocabularyInventoryComplete === true, 'Inventory coverage must mark route vocabulary inventory complete.'); + assertCheck(failures, artifact.coverage.migrationMatrixComplete === true, 'Inventory coverage must mark migration matrix complete.'); + assertCheck(failures, artifact.migrationRows.length === 6, 'Inventory must contain all six Gate 2 migration rows.'); + assertCheck(failures, artifact.sourceFiles.length > 0, 'Inventory must include source-safe file metadata rows.'); + + const serialized = `${JSON.stringify(artifact, null, 2)}\n`; + assertCheck( + failures, + exists(root, V43_ROUTE_VOCABULARY_INVENTORY_ARTIFACT_PATH) && + read(root, V43_ROUTE_VOCABULARY_INVENTORY_ARTIFACT_PATH) === serialized, + `${V43_ROUTE_VOCABULARY_INVENTORY_ARTIFACT_PATH} must be generated and current.`, + ); + + const spec = read(root, 'BITCODE_SPEC_V43.md'); + const delta = read(root, 'BITCODE_SPEC_V43_DELTA.md'); + const notes = read(root, 'BITCODE_SPEC_V43_NOTES.md'); + const parity = read(root, 'BITCODE_SPEC_V43_PARITY_MATRIX.md'); + const roadmap = read(root, 'SPECIFICATIONS_ROADMAP.md'); + const readme = read(root, 'README.md'); + const protocolReadme = read(root, 'packages/protocol/README.md'); + const packageJson = read(root, 'package.json'); + const gateWorkflow = read(root, '.github/workflows/bitcode-gate-quality.yml'); + const canonWorkflow = read(root, '.github/workflows/bitcode-canon-quality.yml'); + + for (const phrase of [ + 'v43-route-vocabulary-inventory', + '/exchange', + '/packs', + '/terminal', + '/read', + '/deposit', + 'retained debug cockpit', + 'redirect compatibility', + 'self-referential', + 'source-safe file/token counts', + ]) { + assertCheck( + failures, + spec.includes(phrase) || delta.includes(phrase) || notes.includes(phrase) || parity.includes(phrase) || roadmap.includes(phrase), + `Gate 2 spec family or roadmap must name ${phrase}.`, + ); + } + + assertCheck(failures, roadmap.includes('Current working gate: V43 Gate 2'), 'Roadmap must state active V43 Gate 2.'); + assertCheck(failures, roadmap.includes('V43 Gate 2 closure anchor'), 'Roadmap must include V43 Gate 2 closure anchor.'); + assertCheck(failures, readme.includes('V43 Gate 2'), 'README must document V43 Gate 2.'); + assertCheck(failures, protocolReadme.includes('V43 Gate 2'), 'Protocol README must document V43 Gate 2.'); + assertCheck(failures, packageJson.includes('"generate:v43-route-vocabulary-inventory"'), 'package.json must expose generate:v43-route-vocabulary-inventory.'); + assertCheck(failures, packageJson.includes('"check:v43-route-vocabulary-inventory"'), 'package.json must expose check:v43-route-vocabulary-inventory.'); + assertCheck(failures, packageJson.includes('"check:v43-gate2"'), 'package.json must expose check:v43-gate2.'); + assertCheck(failures, gateWorkflow.includes('check-v43-gate2-route-vocabulary-inventory.mjs'), 'Gate workflow must run V43 Gate 2 checker.'); + assertCheck(failures, canonWorkflow.includes('check-v43-gate2-route-vocabulary-inventory.mjs'), 'Canon workflow must run V43 Gate 2 checker.'); + + if (failures.length > 0) { + process.stderr.write('V43 Gate 2 route vocabulary inventory check failed:\n'); + for (const failure of failures.filter(Boolean)) process.stderr.write(`- ${failure}\n`); + process.exitCode = 1; + return; + } + + process.stdout.write('V43 Gate 2 route vocabulary inventory check passed.\n'); +} + +try { + main(); +} catch (error) { + const detail = error instanceof Error ? error.message : String(error); + process.stderr.write(`${detail}\n`); + process.exitCode = 1; +} diff --git a/scripts/generate-v43-route-vocabulary-inventory.mjs b/scripts/generate-v43-route-vocabulary-inventory.mjs new file mode 100644 index 00000000..468d02c8 --- /dev/null +++ b/scripts/generate-v43-route-vocabulary-inventory.mjs @@ -0,0 +1,31 @@ +#!/usr/bin/env node + +import { readFileSync, writeFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { + V43_ROUTE_VOCABULARY_INVENTORY_ARTIFACT_PATH, + buildV43RouteVocabularyInventory, +} from '../packages/protocol/src/canonical/v43-route-vocabulary-inventory.js'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const repoRoot = path.resolve(__dirname, '..'); + +const check = process.argv.includes('--check'); +const artifact = buildV43RouteVocabularyInventory({ repoRoot }); +const serialized = `${JSON.stringify(artifact, null, 2)}\n`; +const artifactPath = path.join(repoRoot, V43_ROUTE_VOCABULARY_INVENTORY_ARTIFACT_PATH); + +if (check) { + const current = readFileSync(artifactPath, 'utf8'); + if (current !== serialized) { + process.stderr.write( + `${V43_ROUTE_VOCABULARY_INVENTORY_ARTIFACT_PATH} is stale. Run pnpm run generate:v43-route-vocabulary-inventory.\n`, + ); + process.exitCode = 1; + } +} else { + writeFileSync(artifactPath, serialized); + process.stdout.write(`wrote ${V43_ROUTE_VOCABULARY_INVENTORY_ARTIFACT_PATH}\n`); +} From ae8fab053ba4b8b0b73a5d96358c773895fcbf60 Mon Sep 17 00:00:00 2001 From: Garrett Maring Date: Fri, 29 May 2026 09:30:58 -0300 Subject: [PATCH 18/35] V43 Gate 3: Implement Packs activity master-detail Adds the source-safe PackActivity model, /api/packs/activity projection route, and /packs master-detail UI while preserving /exchange as a compatibility redirect. Updates V43 specifications, proof artifacts, gate/canon workflows, historical Exchange proof roots, and focused UAPI/protocol coverage for the route migration. --- .../v43-packs-activity-master-detail.json | 364 ++++++++++ .bitcode/v43-route-vocabulary-inventory.json | 311 +++------ .github/workflows/bitcode-canon-quality.yml | 3 + .github/workflows/bitcode-gate-quality.yml | 6 + BITCODE_SPEC_V43.md | 14 + BITCODE_SPEC_V43_DELTA.md | 13 + BITCODE_SPEC_V43_NOTES.md | 17 + BITCODE_SPEC_V43_PARITY_MATRIX.md | 13 +- README.md | 11 + SPECIFICATIONS_ROADMAP.md | 5 +- package.json | 3 + packages/protocol/README.md | 12 + .../src/canonical/exchange-rehearsal.js | 15 +- .../src/canonical/exchange-ux-proof.js | 14 +- .../canonical/v40-browser-e2e-visual-proof.js | 21 +- .../v43-packs-activity-master-detail.js | 305 +++++++++ packages/protocol/src/index.d.ts | 13 + packages/protocol/src/index.js | 15 + .../v43-packs-activity-master-detail.test.js | 39 ++ ...k-v43-gate2-route-vocabulary-inventory.mjs | 2 +- ...v43-gate3-packs-activity-master-detail.mjs | 166 +++++ ...erate-v43-packs-activity-master-detail.mjs | 30 + uapi/app/api/packs/activity/route.ts | 123 ++++ uapi/app/exchange/ExchangePageClient.tsx | 212 ------ uapi/app/exchange/page.tsx | 47 +- uapi/app/packs/PacksPageClient.tsx | 426 ++++++++++++ uapi/app/packs/page.tsx | 33 + uapi/app/terminal/terminal-routes.ts | 11 +- .../bitcode/activity/pack-activity-model.ts | 637 ++++++++++++++++++ .../bitcode-transaction-active-filters.ts | 2 +- .../base/bitcode/layout/NavBrand.tsx | 2 +- .../bitcode/layout/bitcode-public-copy.ts | 8 +- .../layout/bitcode-public-explainers.ts | 14 +- uapi/components/base/bitcode/layout/nav.tsx | 14 +- .../base/bitcode/layout/workspace-surface.ts | 2 +- uapi/jest.config.cjs | 3 +- .../bitcodeTransactionsActiveFilters.test.tsx | 4 +- uapi/tests/exchangePageClient.test.tsx | 87 --- uapi/tests/exchangeTerminalHandoff.test.ts | 26 +- uapi/tests/navPublicShell.test.tsx | 14 +- uapi/tests/navWorkspaceChrome.test.tsx | 4 +- uapi/tests/packActivityModel.test.ts | 99 +++ uapi/tests/packsPageClient.test.tsx | 126 ++++ 43 files changed, 2682 insertions(+), 604 deletions(-) create mode 100644 .bitcode/v43-packs-activity-master-detail.json create mode 100644 packages/protocol/src/canonical/v43-packs-activity-master-detail.js create mode 100644 packages/protocol/test/v43-packs-activity-master-detail.test.js create mode 100644 scripts/check-v43-gate3-packs-activity-master-detail.mjs create mode 100644 scripts/generate-v43-packs-activity-master-detail.mjs create mode 100644 uapi/app/api/packs/activity/route.ts delete mode 100644 uapi/app/exchange/ExchangePageClient.tsx create mode 100644 uapi/app/packs/PacksPageClient.tsx create mode 100644 uapi/app/packs/page.tsx create mode 100644 uapi/components/base/bitcode/activity/pack-activity-model.ts delete mode 100644 uapi/tests/exchangePageClient.test.tsx create mode 100644 uapi/tests/packActivityModel.test.ts create mode 100644 uapi/tests/packsPageClient.test.tsx diff --git a/.bitcode/v43-packs-activity-master-detail.json b/.bitcode/v43-packs-activity-master-detail.json new file mode 100644 index 00000000..eea364be --- /dev/null +++ b/.bitcode/v43-packs-activity-master-detail.json @@ -0,0 +1,364 @@ +{ + "artifactId": "v43-packs-activity-master-detail", + "schemaId": "bitcode.v43.packsActivityMasterDetail.v1", + "version": "V43", + "currentTarget": "V42", + "sourceSafetyVerdict": "source-safe-packs-activity-master-detail-metadata", + "generatedAt": "deterministic", + "artifactRoot": "v43-packs-activity-master-detail:16af692e5389aab2e555718c", + "passed": true, + "typeIds": [ + "deposit-option", + "depository-assetpack", + "read-need-fit-preview", + "settled-assetpack", + "settlement", + "compensation", + "delivery", + "repair", + "execution", + "notification" + ], + "searchFieldIds": [ + "title", + "description", + "assetPackTitle", + "measurements", + "values", + "activityType", + "transactionType", + "settlementState", + "compensationState", + "deliveryState", + "repairState", + "proofRoots", + "repository", + "timestamp" + ], + "sortIds": [ + "timestamp", + "title", + "value", + "settlementState", + "compensationState", + "deliveryState", + "repairState" + ], + "filterIds": [ + "activityType", + "scope", + "state", + "settlementState", + "compensationState", + "deliveryState", + "repairState", + "repository" + ], + "detailSectionIds": [ + "overview", + "measurements", + "values", + "proofs", + "settlement", + "compensation", + "delivery", + "repair", + "telemetry", + "metadata" + ], + "contractRows": [ + { + "rowId": "pack-activity-record", + "owner": "uapi/components/base/bitcode/activity/pack-activity-model.ts", + "contract": "PackActivityRecord contains source-safe activity type, title, description, repository, measurements, values, proof roots, and state readback.", + "requiredFields": [ + "type", + "title", + "description", + "repository", + "measurements", + "values", + "proofRoots", + "settlementState", + "compensationState", + "deliveryState", + "repairState", + "sourceSafety" + ], + "rowRoot": "v43-pack-activity-contract:e926866621fcbe78d9b74364", + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "unpaidAssetPackSourceVisible": false + }, + { + "rowId": "packs-activity-api", + "owner": "uapi/app/api/packs/activity/route.ts", + "contract": "/api/packs/activity returns queried PackActivity records, summary, detail projection, and explicit source-safety posture.", + "requiredFields": [ + "records", + "summary", + "detail", + "query", + "sourceSafety" + ], + "rowRoot": "v43-pack-activity-contract:e4db1aab78785a05d8532363", + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "unpaidAssetPackSourceVisible": false + }, + { + "rowId": "packs-route-master-detail", + "owner": "uapi/app/packs/PacksPageClient.tsx", + "contract": "/packs renders searchable, sortable, filterable master-detail pack activity with proof roots and state readback.", + "requiredFields": [ + "search", + "type", + "state", + "sort", + "detailId" + ], + "rowRoot": "v43-pack-activity-contract:944aa2ee719f63a979670461", + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "unpaidAssetPackSourceVisible": false + }, + { + "rowId": "exchange-compatibility-redirect", + "owner": "uapi/app/exchange/page.tsx", + "contract": "/exchange is retained only as compatibility redirect into /packs while preserving query parameters.", + "requiredFields": [ + "/packs", + "searchParams" + ], + "rowRoot": "v43-pack-activity-contract:110b30f6fdfa36ccaa3daf6d", + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "unpaidAssetPackSourceVisible": false + } + ], + "sourceRoots": { + "activePointer": "BITCODE_SPEC.txt:75f3f6d81f999da998f40cb6", + "spec": "BITCODE_SPEC_V43.md:e1511ab411b955ac06577f1c", + "delta": "BITCODE_SPEC_V43_DELTA.md:40784121b9e0e5cb052f61f9", + "notes": "BITCODE_SPEC_V43_NOTES.md:656205fa69ebf3534be0d27b", + "parity": "BITCODE_SPEC_V43_PARITY_MATRIX.md:a89a11099e9899086349f219", + "roadmap": "SPECIFICATIONS_ROADMAP.md:13edb10a293b1562c86d1a71", + "readme": "README.md:37a1663a56243ba4a24a6982", + "protocolReadme": "packages/protocol/README.md:c6aa082931d703278de8ff57", + "packageJson": "package.json:8e3513f2ce52a7647bf2b949", + "gateWorkflow": ".github/workflows/bitcode-gate-quality.yml:363fadca2aa9a89082fcd5d0", + "canonWorkflow": ".github/workflows/bitcode-canon-quality.yml:c537637b2ebfbde127211e6e", + "model": "uapi/components/base/bitcode/activity/pack-activity-model.ts:6c610ebddc2949f3716b6bf8", + "route": "uapi/app/api/packs/activity/route.ts:8a524f1dd16889733ce418a7", + "page": "uapi/app/packs/page.tsx:1b3d7a1cc00500a13042e8dd", + "client": "uapi/app/packs/PacksPageClient.tsx:d777458df28f47a360c6601c", + "exchangeRedirect": "uapi/app/exchange/page.tsx:be7a744d1f9c9252d1b6eba9", + "nav": "uapi/components/base/bitcode/layout/nav.tsx:a39909d2e23170a803373674", + "workspaceSurface": "uapi/components/base/bitcode/layout/workspace-surface.ts:f4784c0c92f5d958ddeb64ab", + "publicCopy": "uapi/components/base/bitcode/layout/bitcode-public-copy.ts:4e2e907a06a6d288be74e5ad", + "publicExplainers": "uapi/components/base/bitcode/layout/bitcode-public-explainers.ts:c28aae00fd37ff1c898a7c38", + "packageIndex": "packages/protocol/src/index.js:b700d9aafac73862fb0ba9cf", + "packageTypes": "packages/protocol/src/index.d.ts:9ef207570ce6e9533b9bafaf", + "packageTest": "packages/protocol/test/v43-packs-activity-master-detail.test.js:baf3e44b2fbe4e62590c1824", + "uapiTest": "uapi/tests/packActivityModel.test.ts:a4c3deea857830cf57772a4d", + "generator": "scripts/generate-v43-packs-activity-master-detail.mjs:f342bc9b3ebb8de4e7aa2882", + "checker": "scripts/check-v43-gate3-packs-activity-master-detail.mjs:5914a444235ffb15bb3272ad" + }, + "predicateResults": [ + { + "id": "active-canon-pointer-remains-v42", + "sourcePath": "BITCODE_SPEC.txt", + "passed": true + }, + { + "id": "spec-defines-gate3", + "sourcePath": "BITCODE_SPEC_V43.md", + "passed": true + }, + { + "id": "spec-names-packactivity-contracts", + "sourcePath": "BITCODE_SPEC_V43.md", + "passed": true + }, + { + "id": "delta-records-gate3", + "sourcePath": "BITCODE_SPEC_V43_DELTA.md", + "passed": true + }, + { + "id": "notes-records-gate3", + "sourcePath": "BITCODE_SPEC_V43_NOTES.md", + "passed": true + }, + { + "id": "parity-records-gate3", + "sourcePath": "BITCODE_SPEC_V43_PARITY_MATRIX.md", + "passed": true + }, + { + "id": "roadmap-records-gate3", + "sourcePath": "SPECIFICATIONS_ROADMAP.md", + "passed": true + }, + { + "id": "readme-records-gate3", + "sourcePath": "README.md", + "passed": true + }, + { + "id": "protocol-readme-records-gate3", + "sourcePath": "packages/protocol/README.md", + "passed": true + }, + { + "id": "model-defines-packactivity-record", + "sourcePath": "uapi/components/base/bitcode/activity/pack-activity-model.ts", + "passed": true + }, + { + "id": "model-defines-search-filter-sort", + "sourcePath": "uapi/components/base/bitcode/activity/pack-activity-model.ts", + "passed": true + }, + { + "id": "model-defines-detail-projection", + "sourcePath": "uapi/components/base/bitcode/activity/pack-activity-model.ts", + "passed": true + }, + { + "id": "model-defines-source-safety-assertion", + "sourcePath": "uapi/components/base/bitcode/activity/pack-activity-model.ts", + "passed": true + }, + { + "id": "api-route-exposes-packactivity-query", + "sourcePath": "uapi/app/api/packs/activity/route.ts", + "passed": true + }, + { + "id": "packs-page-canonical-route", + "sourcePath": "uapi/app/packs/page.tsx", + "passed": true + }, + { + "id": "packs-client-master-detail", + "sourcePath": "uapi/app/packs/PacksPageClient.tsx", + "passed": true + }, + { + "id": "packs-client-search-sort-filter", + "sourcePath": "uapi/app/packs/PacksPageClient.tsx", + "passed": true + }, + { + "id": "exchange-route-redirects-to-packs", + "sourcePath": "uapi/app/exchange/page.tsx", + "passed": true + }, + { + "id": "nav-links-to-packs", + "sourcePath": "uapi/components/base/bitcode/layout/nav.tsx", + "passed": true + }, + { + "id": "public-shell-recognizes-packs", + "sourcePath": "uapi/components/base/bitcode/layout/workspace-surface.ts", + "passed": true + }, + { + "id": "public-copy-uses-packs-link", + "sourcePath": "uapi/components/base/bitcode/layout/bitcode-public-copy.ts", + "passed": true + }, + { + "id": "public-explainers-use-packs", + "sourcePath": "uapi/components/base/bitcode/layout/bitcode-public-explainers.ts", + "passed": true + }, + { + "id": "uapi-test-covers-model", + "sourcePath": "uapi/tests/packActivityModel.test.ts", + "passed": true + }, + { + "id": "protocol-test-covers-artifact", + "sourcePath": "packages/protocol/test/v43-packs-activity-master-detail.test.js", + "passed": true + }, + { + "id": "package-exports-gate3", + "sourcePath": "packages/protocol/src/index.js", + "passed": true + }, + { + "id": "package-types-export-gate3", + "sourcePath": "packages/protocol/src/index.d.ts", + "passed": true + }, + { + "id": "package-json-exposes-gate3", + "sourcePath": "package.json", + "passed": true + }, + { + "id": "gate-workflow-runs-gate3", + "sourcePath": ".github/workflows/bitcode-gate-quality.yml", + "passed": true + }, + { + "id": "canon-workflow-runs-gate3", + "sourcePath": ".github/workflows/bitcode-canon-quality.yml", + "passed": true + }, + { + "id": "generator-exists", + "sourcePath": "scripts/generate-v43-packs-activity-master-detail.mjs", + "passed": true + }, + { + "id": "checker-exists", + "sourcePath": "scripts/check-v43-gate3-packs-activity-master-detail.mjs", + "passed": true + } + ], + "coverage": { + "packActivityContractsImplemented": true, + "packsRouteImplemented": true, + "packsActivityApiImplemented": true, + "exchangeRedirectCompatibilityImplemented": true, + "tableSearchImplemented": true, + "columnSortImplemented": true, + "filteringImplemented": true, + "detailProjectionImplemented": true, + "proofRootDisplayImplemented": true, + "settlementStateReadbackImplemented": true, + "compensationStateReadbackImplemented": true, + "deliveryStateReadbackImplemented": true, + "repairStateReadbackImplemented": true, + "sourceSafeMetadataOnly": true, + "protectedSourceVisible": false, + "rawSourceTextVisible": false, + "sourceSnippetVisible": false, + "rawPromptVisible": false, + "interpolatedPromptVisible": false, + "rawProviderResponseVisible": false, + "unpaidAssetPackSourceVisible": false, + "credentialsSerialized": false, + "walletPrivateMaterialVisible": false, + "settlementPrivatePayloadVisible": false, + "forbiddenPayloadClasses": [ + "protected-source-payloads", + "unpaid-assetpack-source", + "source-snippets", + "raw-prompts", + "interpolated-prompts", + "raw-provider-responses", + "credentials", + "wallet-private-material", + "settlement-private-payloads" + ], + "requiredPredicateCount": 31, + "passedPredicateCount": 31, + "failedPredicateIds": [] + } +} diff --git a/.bitcode/v43-route-vocabulary-inventory.json b/.bitcode/v43-route-vocabulary-inventory.json index 44002c2b..06670af3 100644 --- a/.bitcode/v43-route-vocabulary-inventory.json +++ b/.bitcode/v43-route-vocabulary-inventory.json @@ -5,7 +5,7 @@ "currentTarget": "V42", "sourceSafetyVerdict": "source-safe-route-vocabulary-inventory-metadata", "generatedAt": "deterministic", - "artifactRoot": "v43-route-vocabulary-inventory:6ecd89aead44e5ac1ac060ca", + "artifactRoot": "v43-route-vocabulary-inventory:ef6e8d271d6bef4a216b6469", "passed": true, "tokenIds": [ "route:/exchange", @@ -2081,16 +2081,16 @@ }, { "path": "BITCODE_SPEC_V43.md", - "pathRoot": "v43-route-vocabulary-file:521c49a37505607aba80175e", + "pathRoot": "v43-route-vocabulary-file:62434c4fdd4c9f3528a85995", "categories": [ "doc", "spec", "telemetry" ], "tokenCounts": { - "route:/exchange": 4, + "route:/exchange": 5, "route:/terminal": 5, - "route:/packs": 14, + "route:/packs": 17, "route:/read": 15, "route:/deposit": 12, "symbol:Exchange": 4, @@ -2100,56 +2100,56 @@ "symbol:Depositing": 6, "symbol:PackActivity": 7, "symbol:DepositAssetPackOption": 3, - "word:exchange": 5, + "word:exchange": 6, "word:terminal": 5, "word:self-referential": 4 }, - "totalMatches": 109, + "totalMatches": 114, "sourceSafeMetadataOnly": true, "rawSourceTextSerialized": false, "sourceSnippetSerialized": false }, { "path": "BITCODE_SPEC_V43_DELTA.md", - "pathRoot": "v43-route-vocabulary-file:db40d12223b25af7aefce40d", + "pathRoot": "v43-route-vocabulary-file:51a071d9a3afa207dfb4ab0a", "categories": [ "doc", "spec", "telemetry" ], "tokenCounts": { - "route:/exchange": 2, + "route:/exchange": 4, "route:/terminal": 2, - "route:/packs": 6, + "route:/packs": 11, "route:/read": 6, "route:/deposit": 6, "symbol:Exchange": 2, "symbol:Terminal": 3, "symbol:Reading": 5, "symbol:Depositing": 2, - "symbol:PackActivity": 1, + "symbol:PackActivity": 2, "symbol:DepositAssetPackOption": 1, - "word:exchange": 2, + "word:exchange": 4, "word:terminal": 2, "word:self-referential": 3 }, - "totalMatches": 43, + "totalMatches": 53, "sourceSafeMetadataOnly": true, "rawSourceTextSerialized": false, "sourceSnippetSerialized": false }, { "path": "BITCODE_SPEC_V43_NOTES.md", - "pathRoot": "v43-route-vocabulary-file:c5a7b7bca0373ad52da3975e", + "pathRoot": "v43-route-vocabulary-file:6124e4c464a3b6d540784a13", "categories": [ "doc", "spec", "telemetry" ], "tokenCounts": { - "route:/exchange": 1, + "route:/exchange": 2, "route:/terminal": 1, - "route:/packs": 4, + "route:/packs": 7, "route:/read": 3, "route:/deposit": 3, "symbol:Exchange": 1, @@ -2157,37 +2157,38 @@ "symbol:Packs": 1, "symbol:Reading": 3, "symbol:Depositing": 2, - "symbol:PackActivity": 1, + "symbol:PackActivity": 2, "symbol:DepositAssetPackOption": 1, - "word:exchange": 1, + "word:exchange": 2, "word:terminal": 1, "word:self-referential": 2 }, - "totalMatches": 26, + "totalMatches": 32, "sourceSafeMetadataOnly": true, "rawSourceTextSerialized": false, "sourceSnippetSerialized": false }, { "path": "BITCODE_SPEC_V43_PARITY_MATRIX.md", - "pathRoot": "v43-route-vocabulary-file:d536a96b361352c106cfa118", + "pathRoot": "v43-route-vocabulary-file:2770ebfb7d7d041cdba2b10b", "categories": [ "doc", "spec" ], "tokenCounts": { - "route:/exchange": 1, + "route:/exchange": 3, "route:/terminal": 1, - "route:/packs": 2, - "route:/read": 1, - "route:/deposit": 1, + "route:/packs": 6, + "route:/read": 3, + "route:/deposit": 3, "symbol:Packs": 1, "symbol:Reading": 1, - "word:exchange": 1, + "symbol:PackActivity": 4, + "word:exchange": 3, "word:terminal": 1, "word:self-referential": 2 }, - "totalMatches": 12, + "totalMatches": 28, "sourceSafeMetadataOnly": true, "rawSourceTextSerialized": false, "sourceSnippetSerialized": false @@ -2312,59 +2313,59 @@ }, { "path": "README.md", - "pathRoot": "v43-route-vocabulary-file:cbf832fe53880bc4d13b0749", + "pathRoot": "v43-route-vocabulary-file:73b543d9a3b0adf7e22a6607", "categories": [ "doc", "telemetry" ], "tokenCounts": { - "route:/exchange": 4, + "route:/exchange": 5, "route:/terminal": 5, - "route:/packs": 6, + "route:/packs": 9, "route:/read": 6, "route:/deposit": 5, "symbol:Exchange": 16, "symbol:Terminal": 31, - "symbol:Packs": 2, + "symbol:Packs": 3, "symbol:Reading": 29, "symbol:Depositing": 5, "symbol:PackActivity": 1, "symbol:DepositAssetPackOption": 1, - "word:exchange": 16, + "word:exchange": 17, "word:terminal": 7, "word:self-referential": 2 }, - "totalMatches": 136, + "totalMatches": 142, "sourceSafeMetadataOnly": true, "rawSourceTextSerialized": false, "sourceSnippetSerialized": false }, { "path": "SPECIFICATIONS_ROADMAP.md", - "pathRoot": "v43-route-vocabulary-file:f5527630aba80a8c905f8714", + "pathRoot": "v43-route-vocabulary-file:f70d9ecba6970b8e789d6086", "categories": [ "doc", "spec", "telemetry" ], "tokenCounts": { - "route:/exchange": 3, + "route:/exchange": 4, "route:/terminal": 3, - "route:/packs": 7, - "route:/read": 9, + "route:/packs": 9, + "route:/read": 10, "route:/deposit": 6, "symbol:Exchange": 25, "symbol:Terminal": 42, "symbol:Packs": 1, - "symbol:Reading": 58, + "symbol:Reading": 59, "symbol:Depositing": 10, "symbol:PackActivity": 1, "symbol:DepositAssetPackOption": 1, - "word:exchange": 19, + "word:exchange": 20, "word:terminal": 6, "word:self-referential": 3 }, - "totalMatches": 194, + "totalMatches": 200, "sourceSafeMetadataOnly": true, "rawSourceTextSerialized": false, "sourceSnippetSerialized": false @@ -5852,16 +5853,16 @@ }, { "path": "packages/protocol/README.md", - "pathRoot": "v43-route-vocabulary-file:9936e744a1d387a86f4a1d76", + "pathRoot": "v43-route-vocabulary-file:60fa87c9d02ec336e59f0754", "categories": [ "doc", "package", "telemetry" ], "tokenCounts": { - "route:/exchange": 2, + "route:/exchange": 4, "route:/terminal": 2, - "route:/packs": 2, + "route:/packs": 6, "route:/read": 4, "route:/deposit": 2, "symbol:Exchange": 17, @@ -5869,11 +5870,12 @@ "symbol:Packs": 1, "symbol:Reading": 33, "symbol:Depositing": 5, - "word:exchange": 14, + "symbol:PackActivity": 1, + "word:exchange": 16, "word:terminal": 6, "word:self-referential": 1 }, - "totalMatches": 118, + "totalMatches": 127, "sourceSafeMetadataOnly": true, "rawSourceTextSerialized": false, "sourceSnippetSerialized": false @@ -6168,16 +6170,17 @@ }, { "path": "packages/protocol/src/canonical/exchange-rehearsal.js", - "pathRoot": "v43-route-vocabulary-file:05f381bf5eceb85d1765fef3", + "pathRoot": "v43-route-vocabulary-file:390551b97ef8a452f1a6f199", "categories": [ "package", "telemetry" ], "tokenCounts": { - "route:/exchange": 4, + "route:/exchange": 1, "route:/terminal": 7, + "route:/packs": 6, "symbol:Exchange": 14, - "word:exchange": 51, + "word:exchange": 48, "word:terminal": 10 }, "totalMatches": 86, @@ -6221,17 +6224,18 @@ }, { "path": "packages/protocol/src/canonical/exchange-ux-proof.js", - "pathRoot": "v43-route-vocabulary-file:664ecc61fcc41da14cde59ea", + "pathRoot": "v43-route-vocabulary-file:8cc55d0be5e3af770bac8956", "categories": [ "package", "telemetry" ], "tokenCounts": { - "route:/exchange": 17, + "route:/exchange": 14, "route:/terminal": 36, + "route:/packs": 6, "symbol:Exchange": 12, "symbol:Terminal": 4, - "word:exchange": 46, + "word:exchange": 43, "word:terminal": 46 }, "totalMatches": 161, @@ -6700,7 +6704,7 @@ }, { "path": "packages/protocol/src/canonical/v40-browser-e2e-visual-proof.js", - "pathRoot": "v43-route-vocabulary-file:385f699b8e85825e45ae728b", + "pathRoot": "v43-route-vocabulary-file:d67bded8815e5dd890ab9cdc", "categories": [ "package", "telemetry" @@ -6708,13 +6712,15 @@ "tokenCounts": { "route:/exchange": 4, "route:/terminal": 10, - "symbol:Exchange": 4, + "route:/packs": 3, + "symbol:Exchange": 2, "symbol:Terminal": 6, + "symbol:Packs": 2, "symbol:Reading": 3, "word:exchange": 8, "word:terminal": 23 }, - "totalMatches": 58, + "totalMatches": 61, "sourceSafeMetadataOnly": true, "rawSourceTextSerialized": false, "sourceSnippetSerialized": false @@ -11197,25 +11203,6 @@ "rawSourceTextSerialized": false, "sourceSnippetSerialized": false }, - { - "path": "uapi/app/exchange/ExchangePageClient.tsx", - "pathRoot": "v43-route-vocabulary-file:4ac3d9182a2182d87127cae5", - "categories": [ - "component", - "telemetry" - ], - "tokenCounts": { - "route:/terminal": 6, - "symbol:Exchange": 4, - "symbol:Terminal": 2, - "word:exchange": 1, - "word:terminal": 11 - }, - "totalMatches": 24, - "sourceSafeMetadataOnly": true, - "rawSourceTextSerialized": false, - "sourceSnippetSerialized": false - }, { "path": "uapi/app/exchange/README.md", "pathRoot": "v43-route-vocabulary-file:8dbcab387ed6a42f37d791cd", @@ -11234,26 +11221,6 @@ "rawSourceTextSerialized": false, "sourceSnippetSerialized": false }, - { - "path": "uapi/app/exchange/page.tsx", - "pathRoot": "v43-route-vocabulary-file:234ab58c2d000c25bdaee3ec", - "categories": [ - "component", - "route", - "telemetry" - ], - "tokenCounts": { - "route:/exchange": 1, - "route:/terminal": 1, - "symbol:Exchange": 3, - "word:exchange": 1, - "word:terminal": 1 - }, - "totalMatches": 7, - "sourceSafeMetadataOnly": true, - "rawSourceTextSerialized": false, - "sourceSnippetSerialized": false - }, { "path": "uapi/app/executions/README.md", "pathRoot": "v43-route-vocabulary-file:11cd51c6bcd76549498c6cfc", @@ -12284,15 +12251,14 @@ }, { "path": "uapi/app/terminal/terminal-routes.ts", - "pathRoot": "v43-route-vocabulary-file:9c522220ad0858ff86114b5b", + "pathRoot": "v43-route-vocabulary-file:5b2837a2fd797d37c7e1cc22", "categories": [], "tokenCounts": { - "route:/exchange": 1, "route:/terminal": 1, - "word:exchange": 1, + "route:/packs": 1, "word:terminal": 1 }, - "totalMatches": 4, + "totalMatches": 3, "sourceSafeMetadataOnly": true, "rawSourceTextSerialized": false, "sourceSnippetSerialized": false @@ -12678,21 +12644,6 @@ "rawSourceTextSerialized": false, "sourceSnippetSerialized": false }, - { - "path": "uapi/components/base/bitcode/execution/bitcode-transaction-active-filters.ts", - "pathRoot": "v43-route-vocabulary-file:75354a313c9c067e4e83847a", - "categories": [ - "component", - "telemetry" - ], - "tokenCounts": { - "symbol:Exchange": 1 - }, - "totalMatches": 1, - "sourceSafeMetadataOnly": true, - "rawSourceTextSerialized": false, - "sourceSnippetSerialized": false - }, { "path": "uapi/components/base/bitcode/execution/bitcode-transaction-explainers.ts", "pathRoot": "v43-route-vocabulary-file:a24794c3346fb92b640498cc", @@ -12712,52 +12663,50 @@ }, { "path": "uapi/components/base/bitcode/layout/NavBrand.tsx", - "pathRoot": "v43-route-vocabulary-file:1efef7d07a7bb59c2f6b36a1", + "pathRoot": "v43-route-vocabulary-file:25ec699ba9021ea6a6d5fe32", "categories": [ "component", "telemetry" ], "tokenCounts": { - "word:exchange": 1, "word:terminal": 3 }, - "totalMatches": 4, + "totalMatches": 3, "sourceSafeMetadataOnly": true, "rawSourceTextSerialized": false, "sourceSnippetSerialized": false }, { "path": "uapi/components/base/bitcode/layout/bitcode-public-copy.ts", - "pathRoot": "v43-route-vocabulary-file:b3508c32d6b632f1fff4b8f7", + "pathRoot": "v43-route-vocabulary-file:412ecc29f4428f038c5886e1", "categories": [ "component" ], "tokenCounts": { - "route:/exchange": 1, "route:/terminal": 2, - "symbol:Exchange": 5, + "route:/packs": 1, + "symbol:Exchange": 1, "symbol:Terminal": 11, - "word:exchange": 1, + "symbol:Packs": 3, "word:terminal": 2 }, - "totalMatches": 22, + "totalMatches": 20, "sourceSafeMetadataOnly": true, "rawSourceTextSerialized": false, "sourceSnippetSerialized": false }, { "path": "uapi/components/base/bitcode/layout/bitcode-public-explainers.ts", - "pathRoot": "v43-route-vocabulary-file:c05a197157437d4cd9afc99e", + "pathRoot": "v43-route-vocabulary-file:28f8f398092588ce2a6bca66", "categories": [ "component", "telemetry" ], "tokenCounts": { - "symbol:Exchange": 3, - "symbol:Terminal": 7, - "word:exchange": 2 + "symbol:Terminal": 6, + "symbol:Packs": 3 }, - "totalMatches": 12, + "totalMatches": 9, "sourceSafeMetadataOnly": true, "rawSourceTextSerialized": false, "sourceSnippetSerialized": false @@ -12784,38 +12733,40 @@ }, { "path": "uapi/components/base/bitcode/layout/nav.tsx", - "pathRoot": "v43-route-vocabulary-file:1dce885ae8ac60b29fb6515b", + "pathRoot": "v43-route-vocabulary-file:4aed694260e75cefbe14e7fb", "categories": [ "component", "telemetry" ], "tokenCounts": { - "route:/exchange": 3, + "route:/exchange": 2, "route:/terminal": 4, - "symbol:Exchange": 1, + "route:/packs": 3, "symbol:Terminal": 1, + "symbol:Packs": 1, "symbol:Reading": 1, - "word:exchange": 5, + "word:exchange": 4, "word:terminal": 8 }, - "totalMatches": 23, + "totalMatches": 24, "sourceSafeMetadataOnly": true, "rawSourceTextSerialized": false, "sourceSnippetSerialized": false }, { "path": "uapi/components/base/bitcode/layout/workspace-surface.ts", - "pathRoot": "v43-route-vocabulary-file:27384c0628abaaa41c7c64f8", + "pathRoot": "v43-route-vocabulary-file:ba39215e224d7b3caa1774b2", "categories": [ "component" ], "tokenCounts": { "route:/exchange": 1, "route:/terminal": 1, + "route:/packs": 1, "word:exchange": 1, "word:terminal": 3 }, - "totalMatches": 6, + "totalMatches": 7, "sourceSafeMetadataOnly": true, "rawSourceTextSerialized": false, "sourceSnippetSerialized": false @@ -13540,23 +13491,6 @@ "rawSourceTextSerialized": false, "sourceSnippetSerialized": false }, - { - "path": "uapi/tests/bitcodeTransactionsActiveFilters.test.tsx", - "pathRoot": "v43-route-vocabulary-file:990218539f5e4babdb918162", - "categories": [ - "component", - "telemetry", - "test" - ], - "tokenCounts": { - "symbol:Exchange": 1, - "word:exchange": 1 - }, - "totalMatches": 2, - "sourceSafeMetadataOnly": true, - "rawSourceTextSerialized": false, - "sourceSnippetSerialized": false - }, { "path": "uapi/tests/bitcodeTransactionsFilterBar.test.tsx", "pathRoot": "v43-route-vocabulary-file:3a7a82f7fc7e01dde8a642a5", @@ -13985,42 +13919,23 @@ "rawSourceTextSerialized": false, "sourceSnippetSerialized": false }, - { - "path": "uapi/tests/exchangePageClient.test.tsx", - "pathRoot": "v43-route-vocabulary-file:310aacf794f3a2ff0f4b5470", - "categories": [ - "component", - "telemetry", - "test" - ], - "tokenCounts": { - "route:/exchange": 2, - "route:/terminal": 2, - "symbol:Exchange": 3, - "word:exchange": 8, - "word:terminal": 3 - }, - "totalMatches": 18, - "sourceSafeMetadataOnly": true, - "rawSourceTextSerialized": false, - "sourceSnippetSerialized": false - }, { "path": "uapi/tests/exchangeTerminalHandoff.test.ts", - "pathRoot": "v43-route-vocabulary-file:92c4244a409470295eb0e49c", + "pathRoot": "v43-route-vocabulary-file:ee2ced671a4e48853e0551cd", "categories": [ "telemetry", "test" ], "tokenCounts": { - "route:/exchange": 2, "route:/terminal": 6, - "symbol:Exchange": 4, + "route:/packs": 2, + "symbol:Exchange": 1, "symbol:Terminal": 1, - "word:exchange": 7, + "symbol:Packs": 3, + "word:exchange": 5, "word:terminal": 10 }, - "totalMatches": 30, + "totalMatches": 28, "sourceSafeMetadataOnly": true, "rawSourceTextSerialized": false, "sourceSnippetSerialized": false @@ -14116,44 +14031,42 @@ }, { "path": "uapi/tests/navPublicShell.test.tsx", - "pathRoot": "v43-route-vocabulary-file:a7e6f4f31a7df48e793ac7a3", + "pathRoot": "v43-route-vocabulary-file:faa43e8aaf2e3b9832734a9a", "categories": [ "component", "telemetry", "test" ], "tokenCounts": { - "route:/exchange": 3, "route:/terminal": 2, - "symbol:Exchange": 5, + "route:/packs": 3, "symbol:Terminal": 4, + "symbol:Packs": 5, "symbol:Reading": 1, - "word:exchange": 5, "word:terminal": 2 }, - "totalMatches": 22, + "totalMatches": 17, "sourceSafeMetadataOnly": true, "rawSourceTextSerialized": false, "sourceSnippetSerialized": false }, { "path": "uapi/tests/navWorkspaceChrome.test.tsx", - "pathRoot": "v43-route-vocabulary-file:0e31c412e5907c61368c31d8", + "pathRoot": "v43-route-vocabulary-file:854d922b08790e576f3584c6", "categories": [ "component", "telemetry", "test" ], "tokenCounts": { - "route:/exchange": 2, "route:/terminal": 3, - "symbol:Exchange": 2, + "route:/packs": 2, "symbol:Terminal": 4, + "symbol:Packs": 2, "symbol:Reading": 1, - "word:exchange": 2, "word:terminal": 3 }, - "totalMatches": 17, + "totalMatches": 15, "sourceSafeMetadataOnly": true, "rawSourceTextSerialized": false, "sourceSnippetSerialized": false @@ -15238,31 +15151,31 @@ } ], "coverage": { - "sourceFileCount": 896, + "sourceFileCount": 891, "tokenTotals": { - "route:/exchange": 157, - "route:/terminal": 1444, - "route:/packs": 71, - "route:/read": 239, - "route:/deposit": 82, - "symbol:Exchange": 1999, - "symbol:Terminal": 3095, - "symbol:Packs": 20, - "symbol:Reading": 1286, + "route:/exchange": 148, + "route:/terminal": 1435, + "route:/packs": 123, + "route:/read": 242, + "route:/deposit": 84, + "symbol:Exchange": 1967, + "symbol:Terminal": 3092, + "symbol:Packs": 40, + "symbol:Reading": 1287, "symbol:Depositing": 234, - "symbol:PackActivity": 17, + "symbol:PackActivity": 24, "symbol:DepositAssetPackOption": 12, - "word:exchange": 1736, - "word:terminal": 3670, + "word:exchange": 1714, + "word:terminal": 3655, "word:self-referential": 30 }, "categoryTotals": { - "route": 12, - "component": 146, - "test": 215, + "route": 11, + "component": 141, + "test": 213, "doc": 169, "api": 43, - "telemetry": 648, + "telemetry": 643, "workflow": 12, "script": 116, "package": 308, diff --git a/.github/workflows/bitcode-canon-quality.yml b/.github/workflows/bitcode-canon-quality.yml index 0ed6bffc..0fb18c83 100644 --- a/.github/workflows/bitcode-canon-quality.yml +++ b/.github/workflows/bitcode-canon-quality.yml @@ -331,6 +331,9 @@ jobs: if [ -f scripts/check-v43-gate2-route-vocabulary-inventory.mjs ]; then node scripts/check-v43-gate2-route-vocabulary-inventory.mjs --skip-branch-check fi + if [ -f scripts/check-v43-gate3-packs-activity-master-detail.mjs ]; then + node scripts/check-v43-gate3-packs-activity-master-detail.mjs --skip-branch-check --skip-uapi-tests + fi fi else echo "Unexpected BITCODE_SPEC.txt pointer: $POINTER" >&2 diff --git a/.github/workflows/bitcode-gate-quality.yml b/.github/workflows/bitcode-gate-quality.yml index 17883887..1a0cd699 100644 --- a/.github/workflows/bitcode-gate-quality.yml +++ b/.github/workflows/bitcode-gate-quality.yml @@ -460,6 +460,9 @@ jobs: if [ -f scripts/check-v43-gate2-route-vocabulary-inventory.mjs ]; then node scripts/check-v43-gate2-route-vocabulary-inventory.mjs --skip-branch-check fi + if [ -f scripts/check-v43-gate3-packs-activity-master-detail.mjs ]; then + node scripts/check-v43-gate3-packs-activity-master-detail.mjs --skip-branch-check --skip-uapi-tests + fi fi else echo "Unexpected BITCODE_SPEC.txt pointer: $POINTER" >&2 @@ -496,6 +499,9 @@ jobs: if [ -f scripts/check-v43-gate2-route-vocabulary-inventory.mjs ]; then node scripts/check-v43-gate2-route-vocabulary-inventory.mjs --skip-branch-check fi + if [ -f scripts/check-v43-gate3-packs-activity-master-detail.mjs ]; then + node scripts/check-v43-gate3-packs-activity-master-detail.mjs --skip-branch-check --skip-uapi-tests + fi pnpm --filter @bitcode/protocol test pnpm --filter @bitcode/btd exec jest --config jest.config.cjs --runInBand --forceExit pnpm --filter @bitcode/pipeline-asset-pack exec jest --config jest.config.cjs --passWithNoTests --forceExit diff --git a/BITCODE_SPEC_V43.md b/BITCODE_SPEC_V43.md index c8e784f9..c9cb9fa1 100644 --- a/BITCODE_SPEC_V43.md +++ b/BITCODE_SPEC_V43.md @@ -138,6 +138,20 @@ The migration matrix is binding for later gates: Gate 3 must implement PackActivity data contracts, route APIs, table search, column sort, filtering, detail projection, source-safe metadata expansion, proof-root display, settlement/compensation/delivery/repair state readback, and no-source leak tests. +Gate 3 closes with the package-backed `V43PacksActivityMasterDetail` +artifact and deterministic generated proof +`.bitcode/v43-packs-activity-master-detail.json`. The implementation adds the +`PackActivityRecord` and `PacksActivityDetail` data contracts, +`/api/packs/activity`, the `/packs` master-detail route, and `/exchange` to +`/packs` compatibility redirection. Pack activity search covers synthesized +titles, descriptions, measurements, values, activity type, transaction type, +settlement state, compensation state, delivery state, repair state, proof +roots, repository, and timestamp. Detail projections show proof roots and +state readback while marking protected source, unpaid AssetPack source, raw +prompts, interpolated prompts, raw provider responses, source snippets, +credentials, wallet private material, and private settlement payloads +withheld. + ## V43 Gate 4 Read Route Extraction And Five-Step UX Gate 4 must move the Reading default experience into `/read`: request read, review synthesized Need, request Finding Fits, review source-safe AssetPack preview, and settle/buy/deliver. It must preserve V42 telemetry, execution log streaming, proof expansion, retry/restart, and failure repair. diff --git a/BITCODE_SPEC_V43_DELTA.md b/BITCODE_SPEC_V43_DELTA.md index e8e06ece..6b4cc5cc 100644 --- a/BITCODE_SPEC_V43_DELTA.md +++ b/BITCODE_SPEC_V43_DELTA.md @@ -24,6 +24,7 @@ V42 proved the reliable MVP path, but the product route vocabulary is still tran 6. `/read` remains the five-step Reading path: request read, review synthesized Need, request Finding Fits, review source-safe AssetPack preview, settle/buy/deliver. 7. Product UX outside public documentation must be self-explanatory through structure, labels, progressive detail, rich components, and visual quality, not self-referential copy. 8. Gate 2 records the route vocabulary inventory in `.bitcode/v43-route-vocabulary-inventory.json` as source-safe file/token counts and a migration matrix only; the actual route rename and split remain owned by later gates. +9. Gate 3 implements the first route migration slice: `/packs` becomes the pack-activity master-detail surface, `/api/packs/activity` projects source-safe PackActivity records, and `/exchange` redirects to `/packs`. ## Explicitly deferred @@ -56,6 +57,18 @@ rows for `/packs`, `/read`, `/deposit`, retained debug cockpit boundaries, redirect compatibility, and product-copy cleanup without serializing source snippets or source-bearing payloads. +## Gate 3 delta closure + +Gate 3 adds `V43PacksActivityMasterDetail`, the generated +`.bitcode/v43-packs-activity-master-detail.json` artifact, package exports, +protocol tests, workflow checks, the `PackActivityRecord` source-safe model, +`/api/packs/activity`, the `/packs` route, compatibility redirect from +`/exchange`, and no-source leak tests. The route supports search, filtering, +column sorting, detail projection, proof roots, settlement/compensation/ +delivery/repair readback, and explicit source-safety flags without serializing +protected source, unpaid AssetPack source, raw prompts, provider responses, +credentials, wallet private material, or private settlement payloads. + ## Commit-Body Direction V43 gate commits should state the route/product surface changed, the protocol objects preserved, the proof/test commands run, and the source-safety boundaries maintained. Gate PR titles must begin with `V43 Gate N:`. diff --git a/BITCODE_SPEC_V43_NOTES.md b/BITCODE_SPEC_V43_NOTES.md index 517af3a5..b88b8c64 100644 --- a/BITCODE_SPEC_V43_NOTES.md +++ b/BITCODE_SPEC_V43_NOTES.md @@ -60,3 +60,20 @@ redirect compatibility, and later copy-removal work. The artifact is metadata only; it intentionally excludes source snippets, raw prompts, provider responses, protected source, unpaid AssetPack source, credentials, and wallet or settlement private material. + +## Gate 3 packs activity master-detail note + +Gate 3 closes the first product-route implementation slice. `/packs` now owns +the pack activity master-detail surface and `/api/packs/activity` exposes a +source-safe PackActivity projection over current activity. `/exchange` is +retained only as a compatibility redirect into `/packs`. + +The route defaults to low-friction search and table scanning: search, +activity-type filtering, state filtering, sort-key selection, ascending/ +descending sort, and selected detail readback. The detail projection surfaces +overview, measurements, value signals, proof roots, settlement state, +compensation state, delivery state, repair state, and redacted metadata. It is +explicitly source-safe: no protected source, unpaid AssetPack source, source +snippets, raw prompts, interpolated prompts, raw provider responses, +credentials, wallet private material, or private settlement payloads may cross +this boundary. diff --git a/BITCODE_SPEC_V43_PARITY_MATRIX.md b/BITCODE_SPEC_V43_PARITY_MATRIX.md index 192aa875..e0950fd3 100644 --- a/BITCODE_SPEC_V43_PARITY_MATRIX.md +++ b/BITCODE_SPEC_V43_PARITY_MATRIX.md @@ -8,7 +8,7 @@ - Prior canonical anchor: `BITCODE_SPEC_V42.md` - Prior generated proof appendix: `BITCODE_SPEC_V42_PROVEN.md` - Generated structured artifact inventory: `.bitcode/v43-spec-family-report.json`, `.bitcode/v43-canonical-input-report.json`, and future V43 gate artifacts -- Source parity state: V43 Gate 1 parity is documentation/workflow posture; V43 Gate 2 parity is source-safe inventory and migration planning +- Source parity state: V43 Gate 1 parity is documentation/workflow posture; V43 Gate 2 parity is source-safe inventory and migration planning; V43 Gate 3 parity is PackActivity source-safe master-detail implementation ## Purpose @@ -24,7 +24,7 @@ Audit V43 against `BITCODE_SPEC_V43.md`, V42 active canon, route source, package | --- | --- | --- | --- | | Gate 1 roadmap | Active V42 / draft V43 posture, route vocabulary, gate plan, docs, checker, workflows | `BITCODE_SPEC_V43.md`, `scripts/check-v43-gate1-packs-read-deposit-roadmap.mjs` | drafted | | Route vocabulary | `/exchange` to `/packs` and `/terminal` to `/read`/`/deposit` are inventoried with route vocabulary inventory, migration matrix, retained debug cockpit boundary, redirect compatibility, self-referential copy audit, and source-safe file/token counts | `packages/protocol/src/canonical/v43-route-vocabulary-inventory.js`, `.bitcode/v43-route-vocabulary-inventory.json`, `scripts/check-v43-gate2-route-vocabulary-inventory.mjs` | implemented | -| Packs master-detail | Searchable, sortable, filterable pack activity table and source-safe detail route | future Gate 3 artifact | draft-required | +| Packs master-detail | Searchable, sortable, filterable pack activity table, source-safe detail route, proof-root display, settlement/compensation/delivery/repair readback, and `/exchange` compatibility redirect | `packages/protocol/src/canonical/v43-packs-activity-master-detail.js`, `.bitcode/v43-packs-activity-master-detail.json`, `uapi/app/packs`, `uapi/app/api/packs/activity/route.ts`, `uapi/components/base/bitcode/activity/pack-activity-model.ts` | implemented | | Read route | Five-step Reading UX owns Read Request through settlement/delivery | future Gate 4 artifact | draft-required | | Deposit route | Connected-source deposit AssetPack option synthesis and review | future Gate 5 artifact | draft-required | | Criticality/ROI policy | Source criticality, demand, ROI, BTD potential, and compensation posture | future Gate 6 artifact | draft-required | @@ -42,13 +42,16 @@ Audit V43 against `BITCODE_SPEC_V43.md`, V42 active canon, route source, package | Workflows | Gate/canon quality know active V42 / draft V43 | drafted | | Documentation | README and roadmap name V43 route/product scope | drafted | | Gate 2 package proof | `V43RouteVocabularyInventory` exports, generated artifact, package test, workflow checks, and `check:v43-gate2` exist | implemented | -| Implementation | Route and pipeline source changes are not part of Gates 1 or 2 | accepted boundary | +| Gate 3 PackActivity proof | `V43PacksActivityMasterDetail` exports, generated artifact, source-safe model/API/UI tests, workflow checks, and `check:v43-gate3` exist | implemented | +| Implementation | Route and pipeline source changes are not part of Gates 1 or 2; Gate 3 implements only `/packs` and PackActivity, not `/read` or `/deposit` extraction | accepted boundary | ## V43 accepted boundaries Gate 1 is allowed to specify and wire validation posture only. Gate 2 is allowed -to inventory and plan migration only. Neither gate may rename application routes -or add deposit option synthesis behavior before their owning implementation gates. +to inventory and plan migration only. Gate 3 may implement `/packs`, +PackActivity, and `/exchange` compatibility redirect only. It must not extract +`/read`, extract `/deposit`, or add deposit option synthesis behavior before +their owning implementation gates. ## V43 completion condition diff --git a/README.md b/README.md index dd6af0e7..a094d742 100644 --- a/README.md +++ b/README.md @@ -195,6 +195,17 @@ cockpit boundaries, redirect compatibility, and later copy cleanup without renaming routes in Gate 2 or serializing source snippets, protected source, raw prompts, provider responses, unpaid AssetPack source, credentials, or wallet and settlement private material. +V43 Gate 3 adds `V43PacksActivityMasterDetail`, +`.bitcode/v43-packs-activity-master-detail.json`, +`generate:v43-packs-activity-master-detail`, +`check:v43-packs-activity-master-detail`, and `check:v43-gate3`. It implements +`PackActivityRecord`, `/api/packs/activity`, `/packs`, `/exchange` to `/packs` +compatibility redirection, search, type/state filtering, column sorting, +detail projection, proof-root display, settlement/compensation/delivery/repair +state readback, and no-source leak tests. The Packs projection remains +source-safe metadata only and does not serialize protected source, unpaid +AssetPack source, raw prompts, provider responses, credentials, wallet private +material, or private settlement payloads. Exchange is inherited V36 canon: market-wide activity master-detail, buy/sell/ bid/ask/cancel/accept/settle/history flows, AssetPack range trading, diff --git a/SPECIFICATIONS_ROADMAP.md b/SPECIFICATIONS_ROADMAP.md index 3112ed8e..1d3c1c72 100644 --- a/SPECIFICATIONS_ROADMAP.md +++ b/SPECIFICATIONS_ROADMAP.md @@ -5,8 +5,8 @@ - Current active canonical pointer: `BITCODE_SPEC.txt` -> `V42` - Current active canon: `BITCODE_SPEC_V42.md` - Current draft target: `BITCODE_SPEC_V43.md`. -- Current working gate: V43 Gate 2 Route Vocabulary Inventory And Migration Plan. -- Next queued work after V43 Gate 2: Packs activity master-detail data contracts and source-safe searchable activity projection. +- Current working gate: V43 Gate 3 Packs Activity Master-Detail Data Model. +- Next queued work after V43 Gate 3: `/read` route extraction and five-step Reading UX. - Latest closed version: V42 Reliable MVP Experience, which promoted shortest-path Depositing, five-step Reading, ReadNeed review/resynthesis, ReadFitsFinding source-safe preview and quote, settlement rights transfer, repository delivery, AI-reading demonstration, local/staging MVP rehearsal, and V42 promotion readiness. - Recent V42 canonical promotion anchor: V42 canonical promotion updated `BITCODE_SPEC.txt` to `V42`, generated `BITCODE_SPEC_V42_PROVEN.md`, preserved active V42 / draft V43 runtime posture, and closed reliable MVP experience canon. - Recent V42 opening anchor: reliable MVP experience opens over promoted V41 with V42 SPEC, DELTA, NOTES, and PARITY files, `check:v42-gate1`, active V41 / draft V42 posture, and a nine-gate plan for shortest-path Depositing, five-step Reading, ReadNeed product closure, ReadFitsFinding preview and quote closure, settlement and repository delivery, AI-reading demonstration, local/staging rehearsal, and promotion readiness. @@ -19,6 +19,7 @@ - V42 Gate 8 closure anchor: reliable MVP experience now owns local/staging-testnet full MVP rehearsal proof through `ReadingLocalStagingRehearsal`, source-safe V42 operator receipts, staging-testnet Supabase project `tkpyosihuouusyaxtbau`, Gates 2 through 7 generated artifact binding, deposit source, request read, review synthesized Need, request Finding Fits, review source-safe AssetPack preview and quote, buy/settle, receive repository delivery, rich telemetry/database readback, ledger/database/storage reconciliation, blocked value-bearing mainnet, deterministic `.bitcode/v42-local-staging-mvp-rehearsal.json`, focused package/protocol/UAPI checks, workflow wiring, and `check:v42-gate8`. - V42 Gate 9 closure anchor: reliable MVP experience now owns package-backed `V42PromotionReadinessReport`, deterministic `.bitcode/v42-promotion-readiness-report.json`, `BITCODE_SPEC_V42_PROVEN.md` generation support, `v42-canon-promotion.yml`, promotion command dry-run support, gate/canon workflow posture, active V42 / draft V43 runtime preparation, all V42 reliable MVP artifacts covered, source-safe, parseable, and workflow-bound, and value-bearing mainnet admission blocked through `check:v42-gate9`. - V43 Gate 2 closure anchor: route-product cleanup now owns package-backed `V43RouteVocabularyInventory`, deterministic `.bitcode/v43-route-vocabulary-inventory.json`, source-safe file/token counts across `/exchange`, Exchange, `/terminal`, Terminal, `/packs`, `/read`, `/deposit`, Reading, Depositing, PackActivity, DepositAssetPackOption, and self-referential copy references, a migration matrix for `/packs`, `/read`, `/deposit`, retained debug cockpit boundaries, redirect compatibility, and copy cleanup, package exports, protocol tests, workflow wiring, and `check:v43-gate2`. +- V43 Gate 3 closure anchor: route-product cleanup now owns package-backed `V43PacksActivityMasterDetail`, deterministic `.bitcode/v43-packs-activity-master-detail.json`, `PackActivityRecord`, `PacksActivityDetail`, `/api/packs/activity`, `/packs` master-detail UI, `/exchange` compatibility redirect, search, type/state filtering, column sorting, proof-root display, settlement/compensation/delivery/repair readback, no-source leak tests, package exports, protocol tests, workflow wiring, and `check:v43-gate3`. - Recent V41 closure anchor: V41 canonical promotion updated `BITCODE_SPEC.txt` to `V41`, generated `BITCODE_SPEC_V41_PROVEN.md`, preserved active V41 / draft V42 runtime posture, and closed prompt-program excellence canon. - Recent V40 closure anchor: V40 canonical promotion updated `BITCODE_SPEC.txt` to `V40`, generated `BITCODE_SPEC_V40_PROVEN.md`, preserved active V40 / draft V41 runtime posture, and closed exhaustive commercial application testing canon. - Recent V39 closure anchor: V39 canonical promotion updated `BITCODE_SPEC.txt` to `V39`, generated `BITCODE_SPEC_V39_PROVEN.md`, preserved active V39 / draft V40 runtime posture, and closed commercial Reading readiness canon. diff --git a/package.json b/package.json index cf46df7b..cd7b7f2e 100644 --- a/package.json +++ b/package.json @@ -333,6 +333,9 @@ "generate:v43-route-vocabulary-inventory": "node scripts/generate-v43-route-vocabulary-inventory.mjs", "check:v43-route-vocabulary-inventory": "node scripts/generate-v43-route-vocabulary-inventory.mjs --check", "check:v43-gate2": "node scripts/check-v43-gate2-route-vocabulary-inventory.mjs", + "generate:v43-packs-activity-master-detail": "node scripts/generate-v43-packs-activity-master-detail.mjs", + "check:v43-packs-activity-master-detail": "node scripts/generate-v43-packs-activity-master-detail.mjs --check", + "check:v43-gate3": "node scripts/check-v43-gate3-packs-activity-master-detail.mjs", "generate:v38-inference-surface-inventory": "node scripts/generate-v38-inference-surface-inventory.mjs", "check:v38-inference-surface-inventory": "node scripts/generate-v38-inference-surface-inventory.mjs --check", "check:v38-gate2": "node scripts/check-v38-gate2-inference-surface-inventory.mjs", diff --git a/packages/protocol/README.md b/packages/protocol/README.md index 64eb7f50..bae7d4c6 100644 --- a/packages/protocol/README.md +++ b/packages/protocol/README.md @@ -64,6 +64,7 @@ Current exported commercial helpers include: - `V42LocalStagingMvpRehearsal` helpers for V42 source-safe local/staging-testnet full MVP rehearsal proof across Depositing, Reading, Finding Fits, preview/quote, settlement, BTD rights transfer, repository delivery, AI-reading uplift, telemetry/database readback, operator receipts, and blocked value-bearing mainnet; - `V42PromotionReadinessReport` helpers for V42 source-safe promotion readiness across all V42 reliable MVP artifacts, generated proof support, workflow posture, promotion dry-run support, value-bearing mainnet blocking, and `V42` active, `V43` draft runtime preparation; - `V43RouteVocabularyInventory` helpers for V43 source-safe route vocabulary inventory, source-safe file/token counts, `/exchange` to `/packs` planning, `/terminal` to `/read` and `/deposit` planning, retained debug cockpit boundary, redirect compatibility, self-referential copy cleanup, and migration matrix proof; +- `V43PacksActivityMasterDetail` helpers for V43 source-safe PackActivity contracts, `/api/packs/activity`, `/packs` master-detail search/filter/sort/detail projection, proof roots, settlement/compensation/delivery/repair readback, and `/exchange` compatibility redirection; - canonical proven-generation helpers; - the package app/server context used by commercial interfaces. @@ -84,6 +85,17 @@ category counts, migration rows, and proof roots, but never source snippets, protected source, raw prompts, provider responses, unpaid AssetPack source, credentials, wallet private material, or private settlement payloads. +V43 Gate 3 adds `V43PacksActivityMasterDetail` through +`packages/protocol/src/canonical/v43-packs-activity-master-detail.js`, +`packages/protocol/test/v43-packs-activity-master-detail.test.js`, +`.bitcode/v43-packs-activity-master-detail.json`, +`generate:v43-packs-activity-master-detail`, +`check:v43-packs-activity-master-detail`, and `check:v43-gate3`. It binds +`PackActivityRecord`, `PacksActivityDetail`, `/api/packs/activity`, `/packs`, +`/exchange` compatibility redirection, search, filtering, sorting, proof-root +display, settlement/compensation/delivery/repair state readback, source-safe +metadata expansion, and no-source leak tests. + Historical V39 promotion moved this package through the `V39` active, `V40` draft posture. V40 promotion has since advanced the current package posture to `V40` active, `V41` draft. diff --git a/packages/protocol/src/canonical/exchange-rehearsal.js b/packages/protocol/src/canonical/exchange-rehearsal.js index ed0f4f51..adc3685d 100644 --- a/packages/protocol/src/canonical/exchange-rehearsal.js +++ b/packages/protocol/src/canonical/exchange-rehearsal.js @@ -110,9 +110,12 @@ const rehearsalRows = Object.freeze([ phaseIds: EXCHANGE_REHEARSAL_PHASE_IDS, flowIds: EXCHANGE_REHEARSAL_FLOW_IDS, sourceRoots: [ - 'uapi/app/exchange/ExchangePageClient.tsx', + 'uapi/app/packs/PacksPageClient.tsx', + 'uapi/app/packs/page.tsx', + 'uapi/app/api/packs/activity/route.ts', 'uapi/app/exchange/README.md', - 'uapi/tests/exchangePageClient.test.tsx', + 'uapi/tests/packsPageClient.test.tsx', + 'uapi/tests/packActivityModel.test.ts', 'uapi/tests/exchangeTerminalHandoff.test.ts', '.github/workflows/bitcode-gate-quality.yml', ], @@ -128,7 +131,7 @@ const rehearsalRows = Object.freeze([ validationCommands: [ 'pnpm run check:v36-gate2', 'pnpm run check:v36-gate8', - 'pnpm --dir uapi exec jest --runTestsByPath tests/exchangePageClient.test.tsx tests/exchangeTerminalHandoff.test.ts --runInBand', + 'pnpm --dir uapi exec jest --runTestsByPath tests/packsPageClient.test.tsx tests/packActivityModel.test.ts tests/exchangeTerminalHandoff.test.ts --runInBand', ], valueBearingMainnetAdmission: false, }), @@ -141,7 +144,8 @@ const rehearsalRows = Object.freeze([ phaseIds: EXCHANGE_REHEARSAL_PHASE_IDS, flowIds: EXCHANGE_REHEARSAL_FLOW_IDS, sourceRoots: [ - 'uapi/app/exchange/ExchangePageClient.tsx', + 'uapi/app/packs/PacksPageClient.tsx', + 'uapi/app/api/packs/activity/route.ts', 'uapi/app/terminal/TerminalTransactionWorkspace.tsx', 'uapi/app/terminal/TerminalTransactionDetailSurface.tsx', 'uapi/app/terminal/terminal-transaction-read-model.ts', @@ -195,7 +199,8 @@ const rehearsalRows = Object.freeze([ phaseIds: ['market_activity_listing', 'history_review', 'source_safe_evidence_review'], flowIds: ['list', 'history'], sourceRoots: [ - 'uapi/app/exchange/ExchangePageClient.tsx', + 'uapi/app/packs/PacksPageClient.tsx', + 'uapi/components/base/bitcode/activity/pack-activity-model.ts', 'uapi/app/terminal/TerminalTransactionActivitySurface.tsx', 'uapi/tests/pipelineExecutionLogHeader.test.tsx', 'packages/protocol/src/canonical/exchange-ux-proof.js', diff --git a/packages/protocol/src/canonical/exchange-ux-proof.js b/packages/protocol/src/canonical/exchange-ux-proof.js index 132f7dad..937f91f7 100644 --- a/packages/protocol/src/canonical/exchange-ux-proof.js +++ b/packages/protocol/src/canonical/exchange-ux-proof.js @@ -98,7 +98,10 @@ const SHARED_FAIL_CLOSED_REASONS = Object.freeze([ ]); const sourceRoots = Object.freeze([ - 'uapi/app/exchange/ExchangePageClient.tsx', + 'uapi/app/packs/PacksPageClient.tsx', + 'uapi/app/packs/page.tsx', + 'uapi/app/api/packs/activity/route.ts', + 'uapi/components/base/bitcode/activity/pack-activity-model.ts', 'uapi/app/exchange/page.tsx', 'uapi/app/exchange/README.md', 'uapi/app/terminal/TerminalPageClient.tsx', @@ -112,7 +115,8 @@ const sourceRoots = Object.freeze([ 'uapi/app/terminal/terminal-transaction-read-model.ts', 'uapi/components/base/bitcode/execution/BitcodeTransactionsTable.tsx', 'uapi/components/base/bitcode/execution/BitcodeTransactionsFilterBar.tsx', - 'uapi/tests/exchangePageClient.test.tsx', + 'uapi/tests/packsPageClient.test.tsx', + 'uapi/tests/packActivityModel.test.ts', 'uapi/tests/exchangeTerminalHandoff.test.ts', ]); @@ -258,7 +262,8 @@ export const EXCHANGE_UX_PROOF_ROWS = Object.freeze([ collapsedStatus: 'The Exchange header and table describe the selected activity and data mode.', expandedDetail: 'The selected detail pane exposes activity identity, AssetPack evidence, proof posture, history, and journal sections.', sourceRoots: [ - 'uapi/app/exchange/ExchangePageClient.tsx', + 'uapi/app/packs/PacksPageClient.tsx', + 'uapi/app/api/packs/activity/route.ts', 'uapi/app/terminal/TerminalTransactionWorkspace.tsx', 'uapi/components/base/bitcode/execution/BitcodeTransactionsTable.tsx', ], @@ -273,7 +278,8 @@ export const EXCHANGE_UX_PROOF_ROWS = Object.freeze([ collapsedStatus: 'Search, status, ownership, lens, repository, participant, proof, sort, and pagination remain route-owned.', expandedDetail: 'Filter chips and pagination expose filter state without source-bearing payloads.', sourceRoots: [ - 'uapi/app/exchange/ExchangePageClient.tsx', + 'uapi/app/packs/PacksPageClient.tsx', + 'uapi/components/base/bitcode/activity/pack-activity-model.ts', 'uapi/app/terminal/terminal-transaction-query.ts', 'uapi/components/base/bitcode/execution/BitcodeTransactionsFilterBar.tsx', ], diff --git a/packages/protocol/src/canonical/v40-browser-e2e-visual-proof.js b/packages/protocol/src/canonical/v40-browser-e2e-visual-proof.js index ae71515e..afd7f2a0 100644 --- a/packages/protocol/src/canonical/v40-browser-e2e-visual-proof.js +++ b/packages/protocol/src/canonical/v40-browser-e2e-visual-proof.js @@ -240,12 +240,17 @@ export const V40_BROWSER_E2E_VISUAL_ROWS = Object.freeze([ routeStates: ['/exchange', '/exchange?assetPack=asset-pack-run-branch-remediation&intent=buy-existing-btd'], sourceRoots: [ 'uapi/app/bitcode-browser-proof.ts', - 'uapi/app/exchange/ExchangePageClient.tsx', + 'uapi/app/packs/PacksPageClient.tsx', + 'uapi/app/packs/page.tsx', + 'uapi/app/api/packs/activity/route.ts', + 'uapi/app/exchange/page.tsx', 'uapi/app/terminal/terminal-routes.ts', ], testPaths: [ 'uapi/tests/e2e/bitcode-browser-proof.spec.ts', 'uapi/tests/e2e/commercial-mvp.btd-exchange.spec.ts', + 'uapi/tests/packsPageClient.test.tsx', + 'uapi/tests/packActivityModel.test.ts', 'uapi/tests/exchangeTerminalHandoff.test.ts', ], commandIds: [ @@ -254,15 +259,15 @@ export const V40_BROWSER_E2E_VISUAL_ROWS = Object.freeze([ ], requiredSourceMarkers: [ 'BITCODE_BROWSER_PROOF_CONTRACT', - 'ExchangePageClient', - 'Read market activity', - 'buildExchangeHref', + 'PacksPageClient', + 'Search pack activity', + 'buildPacksHref', ], requiredTestMarkers: [ - 'Exchange rights review', - 'signed-in BTD widget', - 'Exchange filters', - 'source-safe preview', + 'renders searchable Packs activity', + 'Proof roots', + 'source-safe detail readback', + 'builds Packs links', ], expectedCounts: { routeStateCount: 2, diff --git a/packages/protocol/src/canonical/v43-packs-activity-master-detail.js b/packages/protocol/src/canonical/v43-packs-activity-master-detail.js new file mode 100644 index 00000000..90eebad2 --- /dev/null +++ b/packages/protocol/src/canonical/v43-packs-activity-master-detail.js @@ -0,0 +1,305 @@ +// @ts-check + +import crypto from 'node:crypto'; +import { existsSync, readFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const DEFAULT_REPO_ROOT = path.resolve(__dirname, '..', '..', '..', '..'); + +export const V43_PACKS_ACTIVITY_MASTER_DETAIL_ARTIFACT_PATH = + '.bitcode/v43-packs-activity-master-detail.json'; +export const V43_PACKS_ACTIVITY_MASTER_DETAIL_SCHEMA_ID = + 'bitcode.v43.packsActivityMasterDetail.v1'; +export const V43_PACKS_ACTIVITY_MASTER_DETAIL_VERSION = 'V43'; +export const V43_PACKS_ACTIVITY_MASTER_DETAIL_CURRENT_TARGET = 'V42'; +export const V43_PACKS_ACTIVITY_MASTER_DETAIL_SOURCE_SAFETY_VERDICT = + 'source-safe-packs-activity-master-detail-metadata'; + +export const V43_PACK_ACTIVITY_TYPE_IDS = Object.freeze([ + 'deposit-option', + 'depository-assetpack', + 'read-need-fit-preview', + 'settled-assetpack', + 'settlement', + 'compensation', + 'delivery', + 'repair', + 'execution', + 'notification', +]); + +export const V43_PACK_ACTIVITY_SEARCH_FIELD_IDS = Object.freeze([ + 'title', + 'description', + 'assetPackTitle', + 'measurements', + 'values', + 'activityType', + 'transactionType', + 'settlementState', + 'compensationState', + 'deliveryState', + 'repairState', + 'proofRoots', + 'repository', + 'timestamp', +]); + +export const V43_PACK_ACTIVITY_SORT_IDS = Object.freeze([ + 'timestamp', + 'title', + 'value', + 'settlementState', + 'compensationState', + 'deliveryState', + 'repairState', +]); + +export const V43_PACK_ACTIVITY_FILTER_IDS = Object.freeze([ + 'activityType', + 'scope', + 'state', + 'settlementState', + 'compensationState', + 'deliveryState', + 'repairState', + 'repository', +]); + +export const V43_PACK_ACTIVITY_DETAIL_SECTION_IDS = Object.freeze([ + 'overview', + 'measurements', + 'values', + 'proofs', + 'settlement', + 'compensation', + 'delivery', + 'repair', + 'telemetry', + 'metadata', +]); + +const SOURCE_ROOTS = Object.freeze({ + activePointer: 'BITCODE_SPEC.txt', + spec: 'BITCODE_SPEC_V43.md', + delta: 'BITCODE_SPEC_V43_DELTA.md', + notes: 'BITCODE_SPEC_V43_NOTES.md', + parity: 'BITCODE_SPEC_V43_PARITY_MATRIX.md', + roadmap: 'SPECIFICATIONS_ROADMAP.md', + readme: 'README.md', + protocolReadme: 'packages/protocol/README.md', + packageJson: 'package.json', + gateWorkflow: '.github/workflows/bitcode-gate-quality.yml', + canonWorkflow: '.github/workflows/bitcode-canon-quality.yml', + model: 'uapi/components/base/bitcode/activity/pack-activity-model.ts', + route: 'uapi/app/api/packs/activity/route.ts', + page: 'uapi/app/packs/page.tsx', + client: 'uapi/app/packs/PacksPageClient.tsx', + exchangeRedirect: 'uapi/app/exchange/page.tsx', + nav: 'uapi/components/base/bitcode/layout/nav.tsx', + workspaceSurface: 'uapi/components/base/bitcode/layout/workspace-surface.ts', + publicCopy: 'uapi/components/base/bitcode/layout/bitcode-public-copy.ts', + publicExplainers: 'uapi/components/base/bitcode/layout/bitcode-public-explainers.ts', + packageIndex: 'packages/protocol/src/index.js', + packageTypes: 'packages/protocol/src/index.d.ts', + packageTest: 'packages/protocol/test/v43-packs-activity-master-detail.test.js', + uapiTest: 'uapi/tests/packActivityModel.test.ts', + generator: 'scripts/generate-v43-packs-activity-master-detail.mjs', + checker: 'scripts/check-v43-gate3-packs-activity-master-detail.mjs', +}); + +const FORBIDDEN_PAYLOAD_CLASSES = Object.freeze([ + 'protected-source-payloads', + 'unpaid-assetpack-source', + 'source-snippets', + 'raw-prompts', + 'interpolated-prompts', + 'raw-provider-responses', + 'credentials', + 'wallet-private-material', + 'settlement-private-payloads', +]); + +function digest(value) { + return crypto.createHash('sha256').update(value).digest('hex').slice(0, 24); +} + +function readSource(repoRoot, sourcePath) { + const absolutePath = path.join(repoRoot, sourcePath); + return existsSync(absolutePath) ? readFileSync(absolutePath, 'utf8') : ''; +} + +function predicateResult(id, sourcePath, passed) { + return { id, sourcePath, passed: Boolean(passed) }; +} + +function sourceRoot(sourcePath) { + return `${sourcePath}:${digest(readSource(DEFAULT_REPO_ROOT, sourcePath))}`; +} + +export const V43_PACK_ACTIVITY_CONTRACT_ROWS = Object.freeze([ + { + rowId: 'pack-activity-record', + owner: SOURCE_ROOTS.model, + contract: + 'PackActivityRecord contains source-safe activity type, title, description, repository, measurements, values, proof roots, and state readback.', + requiredFields: [ + 'type', + 'title', + 'description', + 'repository', + 'measurements', + 'values', + 'proofRoots', + 'settlementState', + 'compensationState', + 'deliveryState', + 'repairState', + 'sourceSafety', + ], + }, + { + rowId: 'packs-activity-api', + owner: SOURCE_ROOTS.route, + contract: + '/api/packs/activity returns queried PackActivity records, summary, detail projection, and explicit source-safety posture.', + requiredFields: ['records', 'summary', 'detail', 'query', 'sourceSafety'], + }, + { + rowId: 'packs-route-master-detail', + owner: SOURCE_ROOTS.client, + contract: + '/packs renders searchable, sortable, filterable master-detail pack activity with proof roots and state readback.', + requiredFields: ['search', 'type', 'state', 'sort', 'detailId'], + }, + { + rowId: 'exchange-compatibility-redirect', + owner: SOURCE_ROOTS.exchangeRedirect, + contract: + '/exchange is retained only as compatibility redirect into /packs while preserving query parameters.', + requiredFields: ['/packs', 'searchParams'], + }, +]); + +function buildPredicateResults(repoRoot) { + const sources = Object.fromEntries( + Object.entries(SOURCE_ROOTS).map(([key, sourcePath]) => [key, readSource(repoRoot, sourcePath)]), + ); + + return [ + predicateResult('active-canon-pointer-remains-v42', SOURCE_ROOTS.activePointer, sources.activePointer.trim() === 'V42'), + predicateResult('spec-defines-gate3', SOURCE_ROOTS.spec, sources.spec.includes('V43 Gate 3 Packs Activity Master-Detail Data Model')), + predicateResult('spec-names-packactivity-contracts', SOURCE_ROOTS.spec, sources.spec.includes('PackActivity data contracts')), + predicateResult('delta-records-gate3', SOURCE_ROOTS.delta, sources.delta.includes('Gate 3') && sources.delta.includes('v43-packs-activity-master-detail')), + predicateResult('notes-records-gate3', SOURCE_ROOTS.notes, sources.notes.includes('Gate 3') && sources.notes.includes('/api/packs/activity')), + predicateResult('parity-records-gate3', SOURCE_ROOTS.parity, sources.parity.includes('v43-packs-activity-master-detail')), + predicateResult('roadmap-records-gate3', SOURCE_ROOTS.roadmap, sources.roadmap.includes('Current working gate: V43 Gate 3')), + predicateResult('readme-records-gate3', SOURCE_ROOTS.readme, sources.readme.includes('V43 Gate 3')), + predicateResult('protocol-readme-records-gate3', SOURCE_ROOTS.protocolReadme, sources.protocolReadme.includes('V43 Gate 3')), + predicateResult('model-defines-packactivity-record', SOURCE_ROOTS.model, sources.model.includes('export interface PackActivityRecord')), + predicateResult('model-defines-search-filter-sort', SOURCE_ROOTS.model, sources.model.includes('filterPackActivityRecords') && sources.model.includes('sortPackActivityRecords') && sources.model.includes('queryPackActivityRecords')), + predicateResult('model-defines-detail-projection', SOURCE_ROOTS.model, sources.model.includes('buildPackActivityDetailProjection')), + predicateResult('model-defines-source-safety-assertion', SOURCE_ROOTS.model, sources.model.includes('assertPackActivitySourceSafe')), + predicateResult('api-route-exposes-packactivity-query', SOURCE_ROOTS.route, sources.route.includes('/api/activity') && sources.route.includes('queryPackActivityRecords') && sources.route.includes('sourceSafety')), + predicateResult('packs-page-canonical-route', SOURCE_ROOTS.page, sources.page.includes("canonical: '/packs'") && sources.page.includes('PacksPageClient')), + predicateResult('packs-client-master-detail', SOURCE_ROOTS.client, sources.client.includes('/api/packs/activity') && sources.client.includes('detailId') && sources.client.includes('Proof roots')), + predicateResult('packs-client-search-sort-filter', SOURCE_ROOTS.client, sources.client.includes('Search pack activity') && sources.client.includes('Sort:') && sources.client.includes('Activity type')), + predicateResult('exchange-route-redirects-to-packs', SOURCE_ROOTS.exchangeRedirect, sources.exchangeRedirect.includes('redirect(`/packs')), + predicateResult('nav-links-to-packs', SOURCE_ROOTS.nav, sources.nav.includes("href === '/packs'") && sources.nav.includes("startsWith('/packs")), + predicateResult('public-shell-recognizes-packs', SOURCE_ROOTS.workspaceSurface, sources.workspaceSurface.includes("pathname.startsWith('/packs')")), + predicateResult('public-copy-uses-packs-link', SOURCE_ROOTS.publicCopy, sources.publicCopy.includes("{ href: '/packs', label: 'Packs' }")), + predicateResult('public-explainers-use-packs', SOURCE_ROOTS.publicExplainers, sources.publicExplainers.includes("title: 'Packs'")), + predicateResult('uapi-test-covers-model', SOURCE_ROOTS.uapiTest, sources.uapiTest.includes('pack-activity-model') && sources.uapiTest.includes('assertPackActivitySourceSafe')), + predicateResult('protocol-test-covers-artifact', SOURCE_ROOTS.packageTest, sources.packageTest.includes('buildV43PacksActivityMasterDetail')), + predicateResult('package-exports-gate3', SOURCE_ROOTS.packageIndex, sources.packageIndex.includes('buildV43PacksActivityMasterDetail')), + predicateResult('package-types-export-gate3', SOURCE_ROOTS.packageTypes, sources.packageTypes.includes('buildV43PacksActivityMasterDetail')), + predicateResult('package-json-exposes-gate3', SOURCE_ROOTS.packageJson, sources.packageJson.includes('"generate:v43-packs-activity-master-detail"') && sources.packageJson.includes('"check:v43-gate3"')), + predicateResult('gate-workflow-runs-gate3', SOURCE_ROOTS.gateWorkflow, sources.gateWorkflow.includes('check-v43-gate3-packs-activity-master-detail.mjs')), + predicateResult('canon-workflow-runs-gate3', SOURCE_ROOTS.canonWorkflow, sources.canonWorkflow.includes('check-v43-gate3-packs-activity-master-detail.mjs')), + predicateResult('generator-exists', SOURCE_ROOTS.generator, sources.generator.includes('buildV43PacksActivityMasterDetail')), + predicateResult('checker-exists', SOURCE_ROOTS.checker, sources.checker.includes('V43 Gate 3 packs activity master-detail check')), + ]; +} + +export function buildV43PacksActivityMasterDetail(options = {}) { + const repoRoot = options.repoRoot || DEFAULT_REPO_ROOT; + const predicateResults = buildPredicateResults(repoRoot); + const failedPredicateIds = predicateResults + .filter((predicate) => !predicate.passed) + .map((predicate) => predicate.id); + const sourceRoots = Object.fromEntries( + Object.entries(SOURCE_ROOTS).map(([key, sourcePath]) => [key, `${sourcePath}:${digest(readSource(repoRoot, sourcePath))}`]), + ); + const artifactRoot = `v43-packs-activity-master-detail:${digest(JSON.stringify({ + typeIds: V43_PACK_ACTIVITY_TYPE_IDS, + searchFieldIds: V43_PACK_ACTIVITY_SEARCH_FIELD_IDS, + sortIds: V43_PACK_ACTIVITY_SORT_IDS, + filterIds: V43_PACK_ACTIVITY_FILTER_IDS, + detailSectionIds: V43_PACK_ACTIVITY_DETAIL_SECTION_IDS, + contractRows: V43_PACK_ACTIVITY_CONTRACT_ROWS.map((row) => row.rowId), + sourceRoots, + failedPredicateIds, + }))}`; + + return { + artifactId: 'v43-packs-activity-master-detail', + schemaId: V43_PACKS_ACTIVITY_MASTER_DETAIL_SCHEMA_ID, + version: V43_PACKS_ACTIVITY_MASTER_DETAIL_VERSION, + currentTarget: V43_PACKS_ACTIVITY_MASTER_DETAIL_CURRENT_TARGET, + sourceSafetyVerdict: V43_PACKS_ACTIVITY_MASTER_DETAIL_SOURCE_SAFETY_VERDICT, + generatedAt: 'deterministic', + artifactRoot, + passed: failedPredicateIds.length === 0, + typeIds: [...V43_PACK_ACTIVITY_TYPE_IDS], + searchFieldIds: [...V43_PACK_ACTIVITY_SEARCH_FIELD_IDS], + sortIds: [...V43_PACK_ACTIVITY_SORT_IDS], + filterIds: [...V43_PACK_ACTIVITY_FILTER_IDS], + detailSectionIds: [...V43_PACK_ACTIVITY_DETAIL_SECTION_IDS], + contractRows: V43_PACK_ACTIVITY_CONTRACT_ROWS.map((row) => ({ + ...row, + rowRoot: `v43-pack-activity-contract:${digest(row.rowId)}`, + sourceSafeMetadataOnly: true, + protectedSourceVisible: false, + unpaidAssetPackSourceVisible: false, + })), + sourceRoots, + predicateResults, + coverage: { + packActivityContractsImplemented: true, + packsRouteImplemented: true, + packsActivityApiImplemented: true, + exchangeRedirectCompatibilityImplemented: true, + tableSearchImplemented: true, + columnSortImplemented: true, + filteringImplemented: true, + detailProjectionImplemented: true, + proofRootDisplayImplemented: true, + settlementStateReadbackImplemented: true, + compensationStateReadbackImplemented: true, + deliveryStateReadbackImplemented: true, + repairStateReadbackImplemented: true, + sourceSafeMetadataOnly: true, + protectedSourceVisible: false, + rawSourceTextVisible: false, + sourceSnippetVisible: false, + rawPromptVisible: false, + interpolatedPromptVisible: false, + rawProviderResponseVisible: false, + unpaidAssetPackSourceVisible: false, + credentialsSerialized: false, + walletPrivateMaterialVisible: false, + settlementPrivatePayloadVisible: false, + forbiddenPayloadClasses: [...FORBIDDEN_PAYLOAD_CLASSES], + requiredPredicateCount: predicateResults.length, + passedPredicateCount: predicateResults.length - failedPredicateIds.length, + failedPredicateIds, + }, + }; +} + +export const V43_PACKS_ACTIVITY_MASTER_DETAIL_SOURCE_ROOTS = Object.freeze( + Object.fromEntries(Object.entries(SOURCE_ROOTS).map(([key, sourcePath]) => [key, sourceRoot(sourcePath)])), +); diff --git a/packages/protocol/src/index.d.ts b/packages/protocol/src/index.d.ts index 185afef9..415085b2 100644 --- a/packages/protocol/src/index.d.ts +++ b/packages/protocol/src/index.d.ts @@ -591,6 +591,19 @@ export const V43_ROUTE_VOCABULARY_CATEGORY_IDS: readonly string[]; export const V43_ROUTE_VOCABULARY_MIGRATION_ROW_IDS: readonly string[]; export const V43_ROUTE_VOCABULARY_MIGRATION_ROWS: readonly Record[]; export function buildV43RouteVocabularyInventory(input?: Record): BitcodeProtocolReport; +export const V43_PACKS_ACTIVITY_MASTER_DETAIL_ARTIFACT_PATH: string; +export const V43_PACKS_ACTIVITY_MASTER_DETAIL_CURRENT_TARGET: string; +export const V43_PACKS_ACTIVITY_MASTER_DETAIL_SCHEMA_ID: string; +export const V43_PACKS_ACTIVITY_MASTER_DETAIL_VERSION: string; +export const V43_PACKS_ACTIVITY_MASTER_DETAIL_SOURCE_SAFETY_VERDICT: string; +export const V43_PACKS_ACTIVITY_MASTER_DETAIL_SOURCE_ROOTS: Readonly>; +export const V43_PACK_ACTIVITY_TYPE_IDS: readonly string[]; +export const V43_PACK_ACTIVITY_SEARCH_FIELD_IDS: readonly string[]; +export const V43_PACK_ACTIVITY_SORT_IDS: readonly string[]; +export const V43_PACK_ACTIVITY_FILTER_IDS: readonly string[]; +export const V43_PACK_ACTIVITY_DETAIL_SECTION_IDS: readonly string[]; +export const V43_PACK_ACTIVITY_CONTRACT_ROWS: readonly Record[]; +export function buildV43PacksActivityMasterDetail(input?: Record): BitcodeProtocolReport; export const EXCHANGE_INTENT_ORDER_CONTRACTS_ARTIFACT_PATH: string; export const EXCHANGE_INTENT_ORDER_CONTRACTS_CURRENT_TARGET: string; export const EXCHANGE_INTENT_ORDER_CONTRACTS_SCHEMA_ID: string; diff --git a/packages/protocol/src/index.js b/packages/protocol/src/index.js index aacf0f2f..d7db33e1 100644 --- a/packages/protocol/src/index.js +++ b/packages/protocol/src/index.js @@ -667,6 +667,21 @@ export { V43_ROUTE_VOCABULARY_TOKEN_IDS, buildV43RouteVocabularyInventory } from './canonical/v43-route-vocabulary-inventory.js'; +export { + V43_PACKS_ACTIVITY_MASTER_DETAIL_ARTIFACT_PATH, + V43_PACKS_ACTIVITY_MASTER_DETAIL_CURRENT_TARGET, + V43_PACKS_ACTIVITY_MASTER_DETAIL_SCHEMA_ID, + V43_PACKS_ACTIVITY_MASTER_DETAIL_SOURCE_SAFETY_VERDICT, + V43_PACKS_ACTIVITY_MASTER_DETAIL_SOURCE_ROOTS, + V43_PACKS_ACTIVITY_MASTER_DETAIL_VERSION, + V43_PACK_ACTIVITY_CONTRACT_ROWS, + V43_PACK_ACTIVITY_DETAIL_SECTION_IDS, + V43_PACK_ACTIVITY_FILTER_IDS, + V43_PACK_ACTIVITY_SEARCH_FIELD_IDS, + V43_PACK_ACTIVITY_SORT_IDS, + V43_PACK_ACTIVITY_TYPE_IDS, + buildV43PacksActivityMasterDetail +} from './canonical/v43-packs-activity-master-detail.js'; export { EXCHANGE_INTENT_ACTION_KINDS, EXCHANGE_INTENT_ORDER_CONTRACTS_ARTIFACT_PATH, diff --git a/packages/protocol/test/v43-packs-activity-master-detail.test.js b/packages/protocol/test/v43-packs-activity-master-detail.test.js new file mode 100644 index 00000000..9516056a --- /dev/null +++ b/packages/protocol/test/v43-packs-activity-master-detail.test.js @@ -0,0 +1,39 @@ +import assert from 'node:assert/strict'; +import { test } from 'node:test'; +import { + V43_PACKS_ACTIVITY_MASTER_DETAIL_ARTIFACT_PATH, + V43_PACKS_ACTIVITY_MASTER_DETAIL_SCHEMA_ID, + V43_PACKS_ACTIVITY_MASTER_DETAIL_SOURCE_SAFETY_VERDICT, + V43_PACK_ACTIVITY_DETAIL_SECTION_IDS, + V43_PACK_ACTIVITY_FILTER_IDS, + V43_PACK_ACTIVITY_SEARCH_FIELD_IDS, + V43_PACK_ACTIVITY_SORT_IDS, + V43_PACK_ACTIVITY_TYPE_IDS, + buildV43PacksActivityMasterDetail, +} from '../src/canonical/v43-packs-activity-master-detail.js'; + +test('V43 packs activity master-detail artifact binds source-safe route/API/UI contracts', () => { + const report = buildV43PacksActivityMasterDetail(); + + assert.equal(V43_PACKS_ACTIVITY_MASTER_DETAIL_ARTIFACT_PATH, '.bitcode/v43-packs-activity-master-detail.json'); + assert.equal(report.artifactId, 'v43-packs-activity-master-detail'); + assert.equal(report.schemaId, V43_PACKS_ACTIVITY_MASTER_DETAIL_SCHEMA_ID); + assert.equal(report.version, 'V43'); + assert.equal(report.currentTarget, 'V42'); + assert.equal(report.sourceSafetyVerdict, V43_PACKS_ACTIVITY_MASTER_DETAIL_SOURCE_SAFETY_VERDICT); + assert.ok(report.artifactRoot.startsWith('v43-packs-activity-master-detail:')); + assert.deepEqual(report.typeIds, [...V43_PACK_ACTIVITY_TYPE_IDS]); + assert.deepEqual(report.searchFieldIds, [...V43_PACK_ACTIVITY_SEARCH_FIELD_IDS]); + assert.deepEqual(report.sortIds, [...V43_PACK_ACTIVITY_SORT_IDS]); + assert.deepEqual(report.filterIds, [...V43_PACK_ACTIVITY_FILTER_IDS]); + assert.deepEqual(report.detailSectionIds, [...V43_PACK_ACTIVITY_DETAIL_SECTION_IDS]); + assert.equal(report.contractRows.length, 4); + assert.equal(report.coverage.sourceSafeMetadataOnly, true); + assert.equal(report.coverage.protectedSourceVisible, false); + assert.equal(report.coverage.unpaidAssetPackSourceVisible, false); + assert.equal(report.coverage.rawPromptVisible, false); + assert.equal(report.coverage.interpolatedPromptVisible, false); + assert.equal(report.coverage.rawProviderResponseVisible, false); + assert.equal(report.coverage.packActivityContractsImplemented, true); + assert.equal(report.coverage.packsActivityApiImplemented, true); +}); diff --git a/scripts/check-v43-gate2-route-vocabulary-inventory.mjs b/scripts/check-v43-gate2-route-vocabulary-inventory.mjs index d50d134a..3035fd73 100644 --- a/scripts/check-v43-gate2-route-vocabulary-inventory.mjs +++ b/scripts/check-v43-gate2-route-vocabulary-inventory.mjs @@ -144,7 +144,7 @@ function main() { ); } - assertCheck(failures, roadmap.includes('Current working gate: V43 Gate 2'), 'Roadmap must state active V43 Gate 2.'); + assertCheck(failures, roadmap.includes('Current working gate: V43 Gate'), 'Roadmap must state active V43 gate work.'); assertCheck(failures, roadmap.includes('V43 Gate 2 closure anchor'), 'Roadmap must include V43 Gate 2 closure anchor.'); assertCheck(failures, readme.includes('V43 Gate 2'), 'README must document V43 Gate 2.'); assertCheck(failures, protocolReadme.includes('V43 Gate 2'), 'Protocol README must document V43 Gate 2.'); diff --git a/scripts/check-v43-gate3-packs-activity-master-detail.mjs b/scripts/check-v43-gate3-packs-activity-master-detail.mjs new file mode 100644 index 00000000..00bcc395 --- /dev/null +++ b/scripts/check-v43-gate3-packs-activity-master-detail.mjs @@ -0,0 +1,166 @@ +#!/usr/bin/env node + +import { execFileSync } from 'node:child_process'; +import { existsSync, readFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { + V43_PACKS_ACTIVITY_MASTER_DETAIL_ARTIFACT_PATH, + buildV43PacksActivityMasterDetail, +} from '../packages/protocol/src/canonical/v43-packs-activity-master-detail.js'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const defaultRepoRoot = path.resolve(__dirname, '..'); + +function read(root, relativePath) { + return readFileSync(path.join(root, relativePath), 'utf8'); +} + +function exists(root, relativePath) { + return existsSync(path.join(root, relativePath)); +} + +function git(root, args) { + return execFileSync('git', args, { cwd: root, encoding: 'utf8' }).trim(); +} + +function assertCheck(failures, condition, message) { + if (!condition) failures.push(message); +} + +function parseArgs(argv) { + const args = { repoRoot: defaultRepoRoot, skipBranchCheck: false, skipUapiTests: false }; + for (let index = 0; index < argv.length; index += 1) { + const arg = argv[index]; + if (arg === '--repo-root') args.repoRoot = path.resolve(argv[++index]); + else if (arg === '--skip-branch-check') args.skipBranchCheck = true; + else if (arg === '--skip-uapi-tests') args.skipUapiTests = true; + else if (arg === '--help' || arg === '-h') args.help = true; + else throw new Error(`Unknown argument ${arg}`); + } + return args; +} + +function printHelp() { + process.stdout.write( + [ + 'Usage: node scripts/check-v43-gate3-packs-activity-master-detail.mjs [--skip-branch-check] [--skip-uapi-tests] [--repo-root ]', + '', + 'Checks V43 Gate 3 packs activity master-detail contracts, route/API/UI source, generated artifact, docs, workflows, tests, and source-safe disclosure posture.', + ].join('\n'), + ); + process.stdout.write('\n'); +} + +function run(root, command, args) { + execFileSync(command, args, { cwd: root, stdio: 'pipe', encoding: 'utf8' }); +} + +function main() { + const args = parseArgs(process.argv.slice(2)); + if (args.help) { + printHelp(); + return; + } + + const root = args.repoRoot; + const failures = []; + const pointer = read(root, 'BITCODE_SPEC.txt').trim(); + + assertCheck(failures, pointer === 'V42', `BITCODE_SPEC.txt must remain V42 during V43 gate work. Observed ${pointer || 'empty'}.`); + + if (!args.skipBranchCheck) { + const branch = git(root, ['branch', '--show-current']); + assertCheck( + failures, + branch === 'version/v43' || /^v43\/gate-\d+-[a-z0-9][a-z0-9-]*$/u.test(branch), + `V43 work must occur on version/v43 or v43/gate-N-* branches. Observed ${branch || 'detached HEAD'}.`, + ); + } + + for (const relativePath of [ + V43_PACKS_ACTIVITY_MASTER_DETAIL_ARTIFACT_PATH, + 'uapi/components/base/bitcode/activity/pack-activity-model.ts', + 'uapi/app/api/packs/activity/route.ts', + 'uapi/app/packs/page.tsx', + 'uapi/app/packs/PacksPageClient.tsx', + 'uapi/app/exchange/page.tsx', + 'uapi/tests/packActivityModel.test.ts', + 'packages/protocol/src/canonical/v43-packs-activity-master-detail.js', + 'packages/protocol/test/v43-packs-activity-master-detail.test.js', + 'scripts/generate-v43-packs-activity-master-detail.mjs', + 'scripts/check-v43-gate3-packs-activity-master-detail.mjs', + 'BITCODE_SPEC_V43.md', + 'BITCODE_SPEC_V43_DELTA.md', + 'BITCODE_SPEC_V43_NOTES.md', + 'BITCODE_SPEC_V43_PARITY_MATRIX.md', + 'SPECIFICATIONS_ROADMAP.md', + 'README.md', + 'packages/protocol/README.md', + '.github/workflows/bitcode-gate-quality.yml', + '.github/workflows/bitcode-canon-quality.yml', + 'package.json', + ]) { + assertCheck(failures, exists(root, relativePath), `Missing required V43 Gate 3 file: ${relativePath}`); + } + + const artifact = buildV43PacksActivityMasterDetail({ repoRoot: root }); + assertCheck(failures, artifact.passed, `V43 packs activity predicates failed: ${artifact.coverage.failedPredicateIds.join(', ')}`); + assertCheck(failures, artifact.coverage.packActivityContractsImplemented === true, 'PackActivity contracts must be implemented.'); + assertCheck(failures, artifact.coverage.packsRouteImplemented === true, 'Packs route must be implemented.'); + assertCheck(failures, artifact.coverage.packsActivityApiImplemented === true, 'Packs activity API must be implemented.'); + assertCheck(failures, artifact.coverage.exchangeRedirectCompatibilityImplemented === true, 'Exchange compatibility redirect must be implemented.'); + assertCheck(failures, artifact.coverage.tableSearchImplemented === true, 'Table search must be implemented.'); + assertCheck(failures, artifact.coverage.columnSortImplemented === true, 'Column sort must be implemented.'); + assertCheck(failures, artifact.coverage.filteringImplemented === true, 'Filtering must be implemented.'); + assertCheck(failures, artifact.coverage.detailProjectionImplemented === true, 'Detail projection must be implemented.'); + assertCheck(failures, artifact.coverage.sourceSafeMetadataOnly === true, 'Artifact must be source-safe metadata only.'); + assertCheck(failures, artifact.coverage.protectedSourceVisible === false, 'Artifact must not expose protected source.'); + assertCheck(failures, artifact.coverage.unpaidAssetPackSourceVisible === false, 'Artifact must not expose unpaid AssetPack source.'); + assertCheck(failures, artifact.coverage.rawPromptVisible === false, 'Artifact must not expose raw prompts.'); + assertCheck(failures, artifact.coverage.interpolatedPromptVisible === false, 'Artifact must not expose interpolated prompts.'); + assertCheck(failures, artifact.coverage.rawProviderResponseVisible === false, 'Artifact must not expose raw provider responses.'); + + const serialized = `${JSON.stringify(artifact, null, 2)}\n`; + assertCheck( + failures, + exists(root, V43_PACKS_ACTIVITY_MASTER_DETAIL_ARTIFACT_PATH) && + read(root, V43_PACKS_ACTIVITY_MASTER_DETAIL_ARTIFACT_PATH) === serialized, + `${V43_PACKS_ACTIVITY_MASTER_DETAIL_ARTIFACT_PATH} must be generated and current.`, + ); + + const packageJson = read(root, 'package.json'); + const gateWorkflow = read(root, '.github/workflows/bitcode-gate-quality.yml'); + const canonWorkflow = read(root, '.github/workflows/bitcode-canon-quality.yml'); + assertCheck(failures, packageJson.includes('"generate:v43-packs-activity-master-detail"'), 'package.json must expose generate:v43-packs-activity-master-detail.'); + assertCheck(failures, packageJson.includes('"check:v43-packs-activity-master-detail"'), 'package.json must expose check:v43-packs-activity-master-detail.'); + assertCheck(failures, packageJson.includes('"check:v43-gate3"'), 'package.json must expose check:v43-gate3.'); + assertCheck(failures, gateWorkflow.includes('check-v43-gate3-packs-activity-master-detail.mjs'), 'Gate workflow must run V43 Gate 3 checker.'); + assertCheck(failures, canonWorkflow.includes('check-v43-gate3-packs-activity-master-detail.mjs'), 'Canon workflow must run V43 Gate 3 checker.'); + + if (!args.skipUapiTests) { + try { + run(root, 'pnpm', ['--dir', 'uapi', 'exec', 'jest', 'packActivityModel.test.ts', '--runInBand']); + } catch { + failures.push('uapi packActivityModel.test.ts must pass.'); + } + } + + if (failures.length > 0) { + process.stderr.write('V43 Gate 3 packs activity master-detail check failed:\n'); + for (const failure of failures.filter(Boolean)) process.stderr.write(`- ${failure}\n`); + process.exitCode = 1; + return; + } + + process.stdout.write('V43 Gate 3 packs activity master-detail check passed.\n'); +} + +try { + main(); +} catch (error) { + const detail = error instanceof Error ? error.message : String(error); + process.stderr.write(`${detail}\n`); + process.exitCode = 1; +} diff --git a/scripts/generate-v43-packs-activity-master-detail.mjs b/scripts/generate-v43-packs-activity-master-detail.mjs new file mode 100644 index 00000000..5fa1be8f --- /dev/null +++ b/scripts/generate-v43-packs-activity-master-detail.mjs @@ -0,0 +1,30 @@ +#!/usr/bin/env node + +import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { + V43_PACKS_ACTIVITY_MASTER_DETAIL_ARTIFACT_PATH, + buildV43PacksActivityMasterDetail, +} from '../packages/protocol/src/canonical/v43-packs-activity-master-detail.js'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const repoRoot = path.resolve(__dirname, '..'); +const checkOnly = process.argv.includes('--check'); +const artifact = buildV43PacksActivityMasterDetail({ repoRoot }); +const serialized = `${JSON.stringify(artifact, null, 2)}\n`; +const artifactPath = path.join(repoRoot, V43_PACKS_ACTIVITY_MASTER_DETAIL_ARTIFACT_PATH); + +if (checkOnly) { + if (!existsSync(artifactPath) || readFileSync(artifactPath, 'utf8') !== serialized) { + process.stderr.write( + `${V43_PACKS_ACTIVITY_MASTER_DETAIL_ARTIFACT_PATH} is stale. Run pnpm run generate:v43-packs-activity-master-detail.\n`, + ); + process.exitCode = 1; + } +} else { + mkdirSync(path.dirname(artifactPath), { recursive: true }); + writeFileSync(artifactPath, serialized); + process.stdout.write(`wrote ${V43_PACKS_ACTIVITY_MASTER_DETAIL_ARTIFACT_PATH}\n`); +} diff --git a/uapi/app/api/packs/activity/route.ts b/uapi/app/api/packs/activity/route.ts new file mode 100644 index 00000000..d20f00e2 --- /dev/null +++ b/uapi/app/api/packs/activity/route.ts @@ -0,0 +1,123 @@ +import { NextResponse } from 'next/server'; + +import { GET as getActivity } from '@/app/api/activity/route'; +import { + assertPackActivitySourceSafe, + buildPackActivityDetailProjection, + normalizePackActivityRecord, + queryPackActivityRecords, + summarizePackActivityRecords, + type PackActivityFilters, + type PackActivitySortDirection, + type PackActivitySortKey, + type PackActivityType, +} from '@/components/base/bitcode/activity/pack-activity-model'; +import type { BitcodeActivityRecord } from '@/components/base/bitcode/activity/bitcode-activity-model'; + +export const runtime = 'nodejs'; + +const PACK_ACTIVITY_TYPES = new Set([ + 'deposit-option', + 'depository-assetpack', + 'read-need-fit-preview', + 'settled-assetpack', + 'settlement', + 'compensation', + 'delivery', + 'repair', + 'execution', + 'notification', +]); + +const PACK_ACTIVITY_SORT_KEYS = new Set([ + 'timestamp', + 'title', + 'value', + 'settlementState', + 'compensationState', + 'deliveryState', + 'repairState', +]); + +function readEnum(value: string | null, allowed: Set, fallback: T) { + return value && allowed.has(value as T) ? (value as T) : fallback; +} + +function readFilterParam(params: URLSearchParams, key: string) { + const value = String(params.get(key) || '').trim(); + return value || 'all'; +} + +function buildFilters(params: URLSearchParams): PackActivityFilters { + const requestedType = readFilterParam(params, 'type'); + return { + type: requestedType === 'all' ? 'all' : readEnum(requestedType, PACK_ACTIVITY_TYPES, 'execution'), + scope: readFilterParam(params, 'scope') as PackActivityFilters['scope'], + state: readFilterParam(params, 'state'), + settlementState: readFilterParam(params, 'settlementState'), + compensationState: readFilterParam(params, 'compensationState'), + deliveryState: readFilterParam(params, 'deliveryState'), + repairState: readFilterParam(params, 'repairState'), + repository: readFilterParam(params, 'repository'), + }; +} + +async function readBaseActivity(request: Request, limit: number) { + const url = new URL(request.url); + const activityUrl = new URL('/api/activity', url.origin); + activityUrl.searchParams.set('limit', String(Math.min(limit * 2, 100))); + const response = await getActivity(new Request(activityUrl)); + const payload = await response.json(); + return { response, payload }; +} + +export async function GET(request: Request) { + const url = new URL(request.url); + const params = url.searchParams; + const limit = Math.max(1, Math.min(Number(params.get('limit') || 50), 100)); + const detailId = String(params.get('detailId') || '').trim(); + const sortKey = readEnum(params.get('sort') || 'timestamp', PACK_ACTIVITY_SORT_KEYS, 'timestamp'); + const sortDirection: PackActivitySortDirection = params.get('direction') === 'asc' ? 'asc' : 'desc'; + const filters = buildFilters(params); + + const { response, payload } = await readBaseActivity(request, limit); + if (!response.ok || payload?.error) { + return NextResponse.json( + { ok: false, error: payload?.error || 'Failed to fetch pack activity' }, + { status: response.status || 500 }, + ); + } + + const baseRecords = Array.isArray(payload?.records) + ? (payload.records as BitcodeActivityRecord[]) + : []; + const packRecords = baseRecords.map(normalizePackActivityRecord); + const query = queryPackActivityRecords(packRecords, { + search: params.get('q') || params.get('search') || '', + filters, + sort: { key: sortKey, direction: sortDirection }, + }); + const records = query.records.slice(0, limit); + const selected = detailId + ? packRecords.find((record) => record.id === detailId) || records[0] || null + : records[0] || null; + const detail = selected ? buildPackActivityDetailProjection(selected) : null; + const safeRecords = records.filter(assertPackActivitySourceSafe); + + return NextResponse.json({ + ok: true, + records: safeRecords, + detail: detail && assertPackActivitySourceSafe(detail) ? detail : null, + summary: summarizePackActivityRecords(safeRecords), + query: query.query, + sourceSafety: { + sourceSafeMetadataOnly: true, + protectedSourceVisible: false, + unpaidAssetPackSourceVisible: false, + rawPromptVisible: false, + interpolatedPromptVisible: false, + rawProviderResponseVisible: false, + sourceSnippetVisible: false, + }, + }); +} diff --git a/uapi/app/exchange/ExchangePageClient.tsx b/uapi/app/exchange/ExchangePageClient.tsx deleted file mode 100644 index 9d693333..00000000 --- a/uapi/app/exchange/ExchangePageClient.tsx +++ /dev/null @@ -1,212 +0,0 @@ -'use client'; - -import React from 'react'; -import { useCallback, useEffect, useMemo, useState } from 'react'; -import { usePathname, useRouter, useSearchParams } from 'next/navigation'; - -import type { TransactionDataMode } from '@/components/base/bitcode/execution/bitcode-transaction-types'; -import TerminalTransactionWorkspace from '@/app/terminal/TerminalTransactionWorkspace'; -import { - mapExecutionHistoryRunToWorkspaceRun, -} from '@/app/terminal/terminal-activity-history'; -import { TerminalShellBridgeProvider } from '@/app/terminal/terminal-shell-bridge'; -import { - readTerminalTransactionDetailSection, - readTerminalTransactionFilters, - readTerminalTransactionId, - readTerminalTransactionPagination, - resetTerminalTransactionFilters, - writeTerminalTransactionDetailSection, - writeTerminalTransactionFilters, - writeTerminalTransactionId, - writeTerminalTransactionPagination, -} from '@/app/terminal/terminal-transaction-query'; -import { resolveTerminalTransactionSource } from '@/app/terminal/terminal-transaction-source'; -import type { WorkspaceRun } from '@/app/terminal/terminal-run-data'; -import { isAuxillariesMockMode } from '@/lib/mock-review-mode'; -import { fetchPipelineExecutionHistory } from '@/networking/api-client'; - -export default function ExchangePageClient() { - const router = useRouter(); - const pathname = usePathname(); - const searchParams = useSearchParams(); - const routeSearchParams = useMemo(() => new URLSearchParams(searchParams.toString()), [searchParams]); - const mockMode = isAuxillariesMockMode(); - const selectedTransactionId = useMemo( - () => readTerminalTransactionId(routeSearchParams), - [routeSearchParams], - ); - const selectedTransactionDetailSection = useMemo( - () => readTerminalTransactionDetailSection(routeSearchParams), - [routeSearchParams], - ); - const transactionFilters = useMemo( - () => readTerminalTransactionFilters(routeSearchParams), - [routeSearchParams], - ); - const transactionPagination = useMemo( - () => readTerminalTransactionPagination(routeSearchParams), - [routeSearchParams], - ); - const [liveRuns, setLiveRuns] = useState([]); - const [isLoadingRuns, setIsLoadingRuns] = useState(!mockMode); - const [runsLoadError, setRunsLoadError] = useState(null); - - const transactionSource = useMemo( - () => - resolveTerminalTransactionSource({ - liveRuns, - mockMode, - selectedTransactionId, - }), - [liveRuns, mockMode, selectedTransactionId], - ); - const runs = transactionSource.runs; - const transactionDataMode: TransactionDataMode = transactionSource.dataMode; - const runsError = transactionDataMode === 'review-fallback' ? null : runsLoadError; - - const replaceExchangeSearchParams = useCallback( - (nextParams: URLSearchParams) => { - if (typeof window !== 'undefined' && window.location.pathname !== pathname) return; - const nextQuery = nextParams.toString(); - router.replace(nextQuery ? `${pathname}?${nextQuery}` : pathname, { scroll: false }); - }, - [pathname, router], - ); - const readCurrentExchangeSearchParams = useCallback( - () => - typeof window !== 'undefined' && window.location.pathname === pathname - ? new URLSearchParams(window.location.search) - : new URLSearchParams(searchParams.toString()), - [pathname, searchParams], - ); - - const replaceExchangeRoute = useCallback( - (transactionId: string, detailSection = selectedTransactionDetailSection) => { - const nextParams = writeTerminalTransactionDetailSection( - writeTerminalTransactionId(readCurrentExchangeSearchParams(), transactionId), - detailSection, - ); - replaceExchangeSearchParams(nextParams); - }, - [readCurrentExchangeSearchParams, replaceExchangeSearchParams, selectedTransactionDetailSection], - ); - - const refreshLiveRuns = useCallback(async () => { - if (mockMode) { - setLiveRuns([]); - setIsLoadingRuns(false); - setRunsLoadError(null); - return []; - } - - setIsLoadingRuns(true); - setRunsLoadError(null); - - try { - const history = await fetchPipelineExecutionHistory(); - const nextRuns = history.map(mapExecutionHistoryRunToWorkspaceRun); - setLiveRuns(nextRuns); - return nextRuns; - } catch (error) { - setLiveRuns([]); - setRunsLoadError(error instanceof Error ? error.message : 'Unable to load Exchange activity.'); - return []; - } finally { - setIsLoadingRuns(false); - } - }, [mockMode]); - - useEffect(() => { - void refreshLiveRuns(); - }, [refreshLiveRuns]); - - const selectedRun = useMemo( - () => runs.find((run) => run.id === selectedTransactionId) || runs[0] || null, - [runs, selectedTransactionId], - ); - - const handleTransactionFiltersChange = (nextFilters: typeof transactionFilters) => { - const nextParams = writeTerminalTransactionPagination( - writeTerminalTransactionFilters(readCurrentExchangeSearchParams(), nextFilters), - { page: 1, pageSize: transactionPagination.pageSize }, - ); - replaceExchangeSearchParams(nextParams); - }; - - const handleTransactionFiltersReset = () => { - const nextParams = writeTerminalTransactionPagination( - resetTerminalTransactionFilters(readCurrentExchangeSearchParams()), - { page: 1, pageSize: transactionPagination.pageSize }, - ); - replaceExchangeSearchParams(nextParams); - }; - - const handleTransactionPaginationChange = (nextPagination: typeof transactionPagination) => { - replaceExchangeSearchParams(writeTerminalTransactionPagination(readCurrentExchangeSearchParams(), nextPagination)); - }; - - const handleTransactionDetailSectionChange = (detailSection: typeof selectedTransactionDetailSection) => { - replaceExchangeSearchParams(writeTerminalTransactionDetailSection(readCurrentExchangeSearchParams(), detailSection)); - }; - - return ( - -
-
-
-
-
-

Bitcode Exchange

-

- Read market activity, select an order, and inspect Exchange state -

-

- The Exchange is the durable activity layer behind Terminal and connected interfaces. Use this - surface to search market activity, review order history, inspect rights-transfer and pricing - posture, and read settlement or repair state without entering Terminal write controls. -

-
-
-
-

Master detail

-

market filters

-
-
-

Order history

-

activity replay

-
-
-

Rights + quote

-

source-safe preview

-
-
-

Settle + repair

-

proof-rooted state

-
-
-
-
- - -
-
-
- ); -} diff --git a/uapi/app/exchange/page.tsx b/uapi/app/exchange/page.tsx index d620f582..eaa8dbda 100644 --- a/uapi/app/exchange/page.tsx +++ b/uapi/app/exchange/page.tsx @@ -1,39 +1,22 @@ -import type { Metadata } from 'next'; import { redirect } from 'next/navigation'; -import { Suspense } from 'react'; -import PublicShellFrame from '@/app/(root)/components/PublicShellFrame'; -import { FEATURE_FLAGS } from '@/config/features'; - -import ExchangePageClient from './ExchangePageClient'; - -export const metadata: Metadata = { - title: 'Bitcode Exchange', - description: - 'Search Bitcode Exchange activity, select activity rows, and inspect AssetPack evidence, proofs, history, and execution detail.', - alternates: { - canonical: '/exchange', - }, +type ExchangeCompatibilityPageProps = { + searchParams?: Record; }; -export default function ExchangePage() { - if (FEATURE_FLAGS.DISABLE_EXCHANGE_ROUTE) { - redirect('/terminal'); +function serializeSearchParams(searchParams: ExchangeCompatibilityPageProps['searchParams']) { + const next = new URLSearchParams(); + for (const [key, value] of Object.entries(searchParams || {})) { + if (Array.isArray(value)) { + value.forEach((entry) => next.append(key, entry)); + } else if (value) { + next.set(key, value); + } } + const query = next.toString(); + return query ? `?${query}` : ''; +} - return ( - - -
- Loading Bitcode Exchange… -
- - } - > - -
-
- ); +export default function ExchangeCompatibilityPage({ searchParams }: ExchangeCompatibilityPageProps) { + redirect(`/packs${serializeSearchParams(searchParams)}`); } diff --git a/uapi/app/packs/PacksPageClient.tsx b/uapi/app/packs/PacksPageClient.tsx new file mode 100644 index 00000000..36ab0c95 --- /dev/null +++ b/uapi/app/packs/PacksPageClient.tsx @@ -0,0 +1,426 @@ +'use client'; + +import React, { useCallback, useEffect, useMemo, useState } from 'react'; +import { ArrowDownWideNarrow, ArrowUpWideNarrow, Package, RefreshCw, Search, ShieldCheck } from 'lucide-react'; +import { usePathname, useRouter, useSearchParams } from 'next/navigation'; + +import type { + PackActivityDetailProjection, + PackActivityRecord, + PackActivitySummary, + PackActivityType, + PackActivitySortDirection, + PackActivitySortKey, +} from '@/components/base/bitcode/activity/pack-activity-model'; + +type PacksActivityPayload = { + ok: boolean; + records: PackActivityRecord[]; + detail: PackActivityDetailProjection | null; + summary: PackActivitySummary; + error?: string; +}; + +const TYPE_OPTIONS: Array<{ value: PackActivityType | 'all'; label: string }> = [ + { value: 'all', label: 'All activity' }, + { value: 'deposit-option', label: 'Deposit options' }, + { value: 'depository-assetpack', label: 'Depository AssetPacks' }, + { value: 'read-need-fit-preview', label: 'Read previews' }, + { value: 'settled-assetpack', label: 'Settled AssetPacks' }, + { value: 'settlement', label: 'Settlement' }, + { value: 'compensation', label: 'Compensation' }, + { value: 'delivery', label: 'Delivery' }, + { value: 'repair', label: 'Repair' }, + { value: 'execution', label: 'Executions' }, + { value: 'notification', label: 'Notifications' }, +]; + +const SORT_OPTIONS: Array<{ value: PackActivitySortKey; label: string }> = [ + { value: 'timestamp', label: 'Time' }, + { value: 'title', label: 'Title' }, + { value: 'value', label: 'Value' }, + { value: 'settlementState', label: 'Settlement' }, + { value: 'compensationState', label: 'Compensation' }, + { value: 'deliveryState', label: 'Delivery' }, + { value: 'repairState', label: 'Repair' }, +]; + +function readParam(params: URLSearchParams, key: string, fallback = '') { + return String(params.get(key) || fallback); +} + +function formatTimestamp(value: string | null) { + if (!value) return 'No timestamp'; + const date = new Date(value); + if (Number.isNaN(date.getTime())) return value; + return date.toLocaleString(undefined, { + month: 'short', + day: 'numeric', + hour: '2-digit', + minute: '2-digit', + }); +} + +function formatCount(value: number) { + return new Intl.NumberFormat(undefined, { maximumFractionDigits: 1 }).format(value); +} + +function formatType(value: PackActivityType) { + return TYPE_OPTIONS.find((option) => option.value === value)?.label || value; +} + +function statusPill(value: string | null, fallback = 'not recorded') { + const label = value || fallback; + return ( + + {label} + + ); +} + +function DetailSection({ + title, + children, +}: { + title: string; + children: React.ReactNode; +}) { + return ( +
+

{title}

+
{children}
+
+ ); +} + +export default function PacksPageClient() { + const router = useRouter(); + const pathname = usePathname(); + const searchParams = useSearchParams(); + const searchParamsString = searchParams.toString(); + const routeParams = useMemo(() => new URLSearchParams(searchParamsString), [searchParamsString]); + const [records, setRecords] = useState([]); + const [detail, setDetail] = useState(null); + const [summary, setSummary] = useState(null); + const [isLoading, setIsLoading] = useState(true); + const [error, setError] = useState(null); + + const search = readParam(routeParams, 'q'); + const type = readParam(routeParams, 'type', 'all') as PackActivityType | 'all'; + const state = readParam(routeParams, 'state', 'all'); + const sort = readParam(routeParams, 'sort', 'timestamp') as PackActivitySortKey; + const direction = readParam(routeParams, 'direction', 'desc') as PackActivitySortDirection; + const detailId = readParam(routeParams, 'detailId'); + + const writeParams = useCallback( + (updates: Record) => { + const next = new URLSearchParams(routeParams); + for (const [key, value] of Object.entries(updates)) { + if (!value || value === 'all') next.delete(key); + else next.set(key, value); + } + const query = next.toString(); + router.replace(query ? `${pathname}?${query}` : pathname, { scroll: false }); + }, + [pathname, routeParams, router], + ); + + const refresh = useCallback(async () => { + setIsLoading(true); + setError(null); + const params = new URLSearchParams(routeParams); + params.set('limit', params.get('limit') || '80'); + + try { + const response = await fetch(`/api/packs/activity?${params.toString()}`, { + headers: { Accept: 'application/json' }, + }); + const payload = (await response.json()) as PacksActivityPayload; + if (!response.ok || !payload.ok) { + throw new Error(payload.error || 'Unable to read pack activity.'); + } + setRecords(payload.records || []); + setDetail(payload.detail || null); + setSummary(payload.summary || null); + } catch (loadError) { + setRecords([]); + setDetail(null); + setSummary(null); + setError(loadError instanceof Error ? loadError.message : 'Unable to read pack activity.'); + } finally { + setIsLoading(false); + } + }, [routeParams]); + + useEffect(() => { + void refresh(); + }, [refresh]); + + const selectedId = detail?.id || detailId || records[0]?.id || null; + const hasRows = records.length > 0; + const topTypes = useMemo( + () => + summary + ? Object.entries(summary.types) + .filter(([, count]) => count > 0) + .slice(0, 4) + : [], + [summary], + ); + + return ( +
+
+
+
+

+

+

+ Pack activity +

+

+ Search AssetPack proposals, Depository admissions, previews, settlements, compensation, delivery, proof roots, and repair state. +

+
+
+
+

Rows

+

{formatCount(summary?.total || records.length)}

+
+
+

Settlement

+

{formatCount(summary?.settlementReady || 0)}

+
+
+

Delivery

+

{formatCount(summary?.deliveryReady || 0)}

+
+
+

Repair

+

{formatCount(summary?.repairOpen || 0)}

+
+
+
+ +
+
+
+ + + writeParams({ state: event.currentTarget.value || null })} + className="h-11 border border-white/10 bg-black/30 px-3 text-sm text-neutral-200 outline-none placeholder:text-neutral-600 focus:border-emerald-300/45" + placeholder="State" + aria-label="State filter" + /> + + +
+ +
+ + + + + + + + + + + + + {isLoading ? ( + + + + ) : error ? ( + + + + ) : hasRows ? ( + records.map((record) => ( + + + + + + + + + )) + ) : ( + + + + )} + +
PackTypeValueSettlementDeliveryTime
+ Reading pack activity... +
+ {error} +
+ + + {formatType(record.type)} + + {record.values[0] + ? `${record.values[0].amount} ${record.values[0].unit}` + : record.measurements[0] + ? `${record.measurements[0].value} ${record.measurements[0].unit || ''}` + : 'not measured'} + {statusPill(record.settlementState)}{statusPill(record.deliveryState)} + {formatTimestamp(record.timestamp)} +
+ No pack activity matched the current filters. +
+
+ +
+
+ {topTypes.length ? topTypes.map(([activityType, count]) => ( + + {formatType(activityType as PackActivityType)} {count} + + )) : No active type totals} +
+ +
+
+ + +
+
+
+ ); +} diff --git a/uapi/app/packs/page.tsx b/uapi/app/packs/page.tsx new file mode 100644 index 00000000..1fd29527 --- /dev/null +++ b/uapi/app/packs/page.tsx @@ -0,0 +1,33 @@ +import type { Metadata } from 'next'; +import { Suspense } from 'react'; + +import PublicShellFrame from '@/app/(root)/components/PublicShellFrame'; + +import PacksPageClient from './PacksPageClient'; + +export const metadata: Metadata = { + title: 'Bitcode Packs', + description: + 'Search pack activity, inspect source-safe measurements, proof roots, settlement, compensation, delivery, and repair state.', + alternates: { + canonical: '/packs', + }, +}; + +export default function PacksPage() { + return ( + + +
+ Loading pack activity... +
+ + } + > + +
+
+ ); +} diff --git a/uapi/app/terminal/terminal-routes.ts b/uapi/app/terminal/terminal-routes.ts index 4577ecd7..092b7e0c 100644 --- a/uapi/app/terminal/terminal-routes.ts +++ b/uapi/app/terminal/terminal-routes.ts @@ -1,12 +1,17 @@ export const TERMINAL_ROUTE = '/terminal' as const; -export const EXCHANGE_ROUTE = '/exchange' as const; +export const PACKS_ROUTE = '/packs' as const; +export const EXCHANGE_ROUTE = PACKS_ROUTE; export function buildTerminalHref(params?: URLSearchParams | string | null) { const query = typeof params === 'string' ? params : params?.toString(); return query ? `${TERMINAL_ROUTE}?${query}` : TERMINAL_ROUTE; } -export function buildExchangeHref(params?: URLSearchParams | string | null) { +export function buildPacksHref(params?: URLSearchParams | string | null) { const query = typeof params === 'string' ? params : params?.toString(); - return query ? `${EXCHANGE_ROUTE}?${query}` : EXCHANGE_ROUTE; + return query ? `${PACKS_ROUTE}?${query}` : PACKS_ROUTE; +} + +export function buildExchangeHref(params?: URLSearchParams | string | null) { + return buildPacksHref(params); } diff --git a/uapi/components/base/bitcode/activity/pack-activity-model.ts b/uapi/components/base/bitcode/activity/pack-activity-model.ts new file mode 100644 index 00000000..34d6c7e3 --- /dev/null +++ b/uapi/components/base/bitcode/activity/pack-activity-model.ts @@ -0,0 +1,637 @@ +import type { + BitcodeActivityRecord, + BitcodeActivityScope, +} from '@/components/base/bitcode/activity/bitcode-activity-model'; + +export type PackActivityType = + | 'deposit-option' + | 'depository-assetpack' + | 'read-need-fit-preview' + | 'settled-assetpack' + | 'settlement' + | 'compensation' + | 'delivery' + | 'repair' + | 'execution' + | 'notification'; + +export type PackActivitySortKey = + | 'timestamp' + | 'title' + | 'value' + | 'settlementState' + | 'compensationState' + | 'deliveryState' + | 'repairState'; + +export type PackActivitySortDirection = 'asc' | 'desc'; + +export interface PackActivityMeasurement { + id: string; + label: string; + value: number | string; + unit: string | null; + root: string | null; +} + +export interface PackActivityValue { + id: string; + label: string; + amount: number | string; + unit: string; +} + +export interface PackActivityProofRoot { + id: string; + label: string; + root: string; +} + +export interface PackActivitySourceSafety { + sourceSafeMetadataOnly: true; + protectedSourceVisible: false; + unpaidAssetPackSourceVisible: false; + rawPromptVisible: false; + interpolatedPromptVisible: false; + rawProviderResponseVisible: false; + sourceSnippetVisible: false; +} + +export interface PackActivityRecord { + id: string; + type: PackActivityType; + scope: BitcodeActivityScope; + title: string; + description: string; + timestamp: string | null; + state: string | null; + repository: string | null; + assetPackTitle: string | null; + settlementState: string | null; + compensationState: string | null; + deliveryState: string | null; + repairState: string | null; + measurements: PackActivityMeasurement[]; + values: PackActivityValue[]; + proofRoots: PackActivityProofRoot[]; + sourceSafety: PackActivitySourceSafety; + metadata: Record; +} + +export interface PackActivityFilters { + type?: PackActivityType | 'all'; + scope?: BitcodeActivityScope | 'all'; + state?: string | 'all'; + settlementState?: string | 'all'; + compensationState?: string | 'all'; + deliveryState?: string | 'all'; + repairState?: string | 'all'; + repository?: string | 'all'; +} + +export interface PackActivityQuery { + search?: string | null; + filters?: PackActivityFilters; + sort?: { + key?: PackActivitySortKey; + direction?: PackActivitySortDirection; + }; +} + +export interface PackActivityDetailProjection { + id: string; + type: PackActivityType; + title: string; + description: string; + timestamp: string | null; + sourceSafety: PackActivitySourceSafety; + overview: { + state: string | null; + scope: BitcodeActivityScope; + repository: string | null; + assetPackTitle: string | null; + }; + measurements: PackActivityMeasurement[]; + values: PackActivityValue[]; + proofRoots: PackActivityProofRoot[]; + states: { + settlement: string | null; + compensation: string | null; + delivery: string | null; + repair: string | null; + }; + telemetry: { + sourceEventId: string; + sourceKind: string | null; + sourceChannel: string | null; + }; + metadata: Record; +} + +export interface PackActivitySummary { + total: number; + types: Record; + states: Record; + repositories: string[]; + settlementReady: number; + compensationReady: number; + deliveryReady: number; + repairOpen: number; +} + +const SOURCE_SAFETY: PackActivitySourceSafety = { + sourceSafeMetadataOnly: true, + protectedSourceVisible: false, + unpaidAssetPackSourceVisible: false, + rawPromptVisible: false, + interpolatedPromptVisible: false, + rawProviderResponseVisible: false, + sourceSnippetVisible: false, +}; + +const PACK_ACTIVITY_TYPES: PackActivityType[] = [ + 'deposit-option', + 'depository-assetpack', + 'read-need-fit-preview', + 'settled-assetpack', + 'settlement', + 'compensation', + 'delivery', + 'repair', + 'execution', + 'notification', +]; + +const SOURCE_BEARING_KEY_PATTERN = + /(^|_|\b)(protectedsource|unpaidassetpacksource|sourcesnippet|sourcecode|sourcetext|sourcepayload|rawprompt|interpolatedprompt|rawresponse|providerresponse|rawproviderresponse|credential|secret|privatekey|walletprivate|filecontents|patch|diff|codebody)($|_|\b)/iu; + +function asRecord(value: unknown): Record { + return value && typeof value === 'object' && !Array.isArray(value) + ? (value as Record) + : {}; +} + +function readString(source: unknown, ...keys: string[]) { + const record = asRecord(source); + for (const key of keys) { + const value = record[key]; + if (typeof value === 'string' && value.trim()) return value.trim(); + if (typeof value === 'number' && Number.isFinite(value)) return String(value); + } + return null; +} + +function findFirstString(source: unknown, keys: string[], depth = 0): string | null { + if (depth > 7 || source === null || source === undefined) return null; + if (Array.isArray(source)) { + for (const item of source) { + const found = findFirstString(item, keys, depth + 1); + if (found) return found; + } + return null; + } + + const record = asRecord(source); + for (const key of keys) { + const direct = readString(record, key); + if (direct) return direct; + } + + for (const value of Object.values(record)) { + const found = findFirstString(value, keys, depth + 1); + if (found) return found; + } + return null; +} + +function findFirstNumber(source: unknown, keys: string[], depth = 0): number | null { + if (depth > 7 || source === null || source === undefined) return null; + if (Array.isArray(source)) { + for (const item of source) { + const found = findFirstNumber(item, keys, depth + 1); + if (found !== null) return found; + } + return null; + } + + const record = asRecord(source); + for (const key of keys) { + const value = record[key]; + if (typeof value === 'number' && Number.isFinite(value)) return value; + if (typeof value === 'string' && value.trim() && Number.isFinite(Number(value))) return Number(value); + } + + for (const value of Object.values(record)) { + const found = findFirstNumber(value, keys, depth + 1); + if (found !== null) return found; + } + return null; +} + +function normalizeLabel(value: string) { + return value + .replace(/([a-z])([A-Z])/gu, '$1 $2') + .replace(/[-_]+/gu, ' ') + .replace(/\s+/gu, ' ') + .trim() + .replace(/^./u, (char) => char.toUpperCase()); +} + +function compareText(left: string | null | undefined, right: string | null | undefined) { + const a = String(left || ''); + const b = String(right || ''); + if (a < b) return -1; + if (a > b) return 1; + return 0; +} + +function includesAny(text: string, tokens: string[]) { + return tokens.some((token) => text.includes(token)); +} + +function inferPackActivityType(record: BitcodeActivityRecord): PackActivityType { + const payload = asRecord(record.payload); + const haystack = [ + record.kind, + record.title, + record.summary, + record.state, + readString(payload, 'type', 'status', 'kind', 'eventType'), + findFirstString(payload, ['canonicalType', 'family', 'label', 'reviewStage']), + ] + .filter(Boolean) + .join(' ') + .toLowerCase(); + + if (includesAny(haystack, ['deposit option', 'deposit-option', 'option synthesis'])) return 'deposit-option'; + if (includesAny(haystack, ['depository assetpack', 'depository asset pack', 'deposit admission'])) return 'depository-assetpack'; + if (includesAny(haystack, ['finding fits', 'fits finding', 'read-fits', 'fit preview', 'assetpack preview'])) return 'read-need-fit-preview'; + if (includesAny(haystack, ['settled assetpack', 'settled asset pack', 'rights transfer'])) return 'settled-assetpack'; + if (includesAny(haystack, ['settlement', 'btc', 'finality'])) return 'settlement'; + if (includesAny(haystack, ['compensation', 'source-to-shares', 'shares allocation'])) return 'compensation'; + if (includesAny(haystack, ['delivery', 'pull request', 'pr delivery', 'repository delivery'])) return 'delivery'; + if (includesAny(haystack, ['repair', 'reconcile', 'reconciliation'])) return 'repair'; + return record.kind === 'notification' ? 'notification' : 'execution'; +} + +function inferRepository(record: BitcodeActivityRecord) { + const payload = asRecord(record.payload); + const snapshot = asRecord(payload.repo_snapshot ?? payload.repoSnapshot ?? payload.repositorySnapshot); + const org = readString(snapshot, 'org', 'owner', 'organization'); + const repo = readString(snapshot, 'repo', 'name'); + if (org && repo) return `${org}/${repo}`; + + return ( + findFirstString(payload, [ + 'repositoryFullName', + 'repositoryAnchor', + 'repository', + 'repoFullName', + 'repo', + ]) || null + ); +} + +function inferAssetPackTitle(record: BitcodeActivityRecord) { + return ( + findFirstString(record.payload, [ + 'assetPackTitle', + 'asset_pack_title', + 'packTitle', + 'title', + 'summary', + ]) || (record.kind === 'notification' ? record.title : null) + ); +} + +function buildMeasurements(record: BitcodeActivityRecord): PackActivityMeasurement[] { + const payload = asRecord(record.payload); + const measurements: PackActivityMeasurement[] = []; + + const candidates: Array<[string, string[], string | null]> = [ + ['measured-btd', ['measuredBtd', 'measured_btd', 'btdVolume', 'weightedRequestedVolume'], 'BTD'], + ['token-total', ['total_tokens', 'tokenTotal', 'totalTokens'], 'tokens'], + ['duration', ['duration_ms', 'durationMs', 'runtimeMs'], 'ms'], + ['cost', ['total_cost', 'totalCost'], 'USD'], + ['candidate-count', ['candidateCount', 'fitCandidateCount', 'targetKindCount'], 'count'], + ['closure-criteria', ['closureCriteriaCount', 'closureCount'], 'count'], + ]; + + for (const [id, keys, unit] of candidates) { + const value = findFirstNumber(payload, keys); + if (value !== null) { + measurements.push({ id, label: normalizeLabel(id), value, unit, root: null }); + } + } + + const measurementRoot = findFirstString(payload, [ + 'measurementRoot', + 'depositMeasurementRoot', + 'assetPackMeasurementRoot', + 'readNeedMeasurementRoot', + ]); + if (measurementRoot) { + measurements.push({ + id: 'measurement-root', + label: 'Measurement root', + value: measurementRoot, + unit: null, + root: measurementRoot, + }); + } + + return measurements; +} + +function buildValues(record: BitcodeActivityRecord): PackActivityValue[] { + const payload = asRecord(record.payload); + const values: PackActivityValue[] = []; + const candidates: Array<[string, string[], string]> = [ + ['btc-fee', ['btcFee', 'btc_fee', 'btcFeeSats', 'feeSats'], 'sats'], + ['usd-equivalent', ['btcFeeUsdEquivalent', 'usdEquivalent', 'total_cost'], 'USD'], + ['btd-potential', ['btdPotential', 'estimatedBtdPotential', 'measuredBtd'], 'BTD'], + ['settlement-price', ['settlementPrice', 'quoteAmount', 'amountSats'], 'sats'], + ]; + + for (const [id, keys, unit] of candidates) { + const value = findFirstNumber(payload, keys); + if (value !== null) values.push({ id, label: normalizeLabel(id), amount: value, unit }); + } + + return values; +} + +function collectProofRoots(source: unknown, roots = new Map(), depth = 0) { + if (depth > 7 || source === null || source === undefined) return roots; + + if (Array.isArray(source)) { + source.forEach((item) => collectProofRoots(item, roots, depth + 1)); + return roots; + } + + const record = asRecord(source); + for (const [key, value] of Object.entries(record)) { + if (typeof value === 'string' && /(root|hash|receipt|witness|anchor)$/iu.test(key) && value.trim()) { + const id = key.replace(/[^a-z0-9]+/giu, '-').toLowerCase(); + roots.set(`${id}:${value}`, { + id, + label: normalizeLabel(key), + root: value.trim(), + }); + continue; + } + + if (value && typeof value === 'object') collectProofRoots(value, roots, depth + 1); + } + + return roots; +} + +function redactMetadata(source: unknown, depth = 0): unknown { + if (depth > 5) return '[withheld:depth-limit]'; + if (source === null || source === undefined) return source; + if (typeof source === 'string') return source.length > 500 ? `${source.slice(0, 500)}...` : source; + if (typeof source === 'number' || typeof source === 'boolean') return source; + if (Array.isArray(source)) return source.slice(0, 40).map((item) => redactMetadata(item, depth + 1)); + + const record = asRecord(source); + const redacted: Record = {}; + for (const [key, value] of Object.entries(record)) { + const normalizedKey = key.replace(/[^a-z0-9]/giu, '').toLowerCase(); + if (SOURCE_BEARING_KEY_PATTERN.test(normalizedKey)) { + redacted[key] = '[withheld:source-safe]'; + continue; + } + redacted[key] = redactMetadata(value, depth + 1); + } + return redacted; +} + +function readState(record: BitcodeActivityRecord, keys: string[]) { + return findFirstString(record.payload, keys); +} + +export function normalizePackActivityRecord(record: BitcodeActivityRecord): PackActivityRecord { + const type = inferPackActivityType(record); + const metadata = redactMetadata(record.payload) as Record; + const settlementState = readState(record, ['settlementState', 'settlement_state', 'finalityState']); + const compensationState = readState(record, ['compensationState', 'compensation_state', 'sourceToSharesState']); + const deliveryState = readState(record, ['deliveryState', 'delivery_state', 'pullRequestState']); + const repairState = readState(record, ['repairState', 'repair_state', 'reconciliationState']); + + return { + id: record.id, + type, + scope: record.scope, + title: record.title || normalizeLabel(type), + description: record.summary || 'Pack activity', + timestamp: record.timestamp, + state: record.state, + repository: inferRepository(record), + assetPackTitle: inferAssetPackTitle(record), + settlementState, + compensationState, + deliveryState, + repairState, + measurements: buildMeasurements(record), + values: buildValues(record), + proofRoots: [...collectProofRoots(record.payload).values()].slice(0, 24), + sourceSafety: SOURCE_SAFETY, + metadata, + }; +} + +export function assertPackActivitySourceSafe(record: PackActivityRecord | PackActivityDetailProjection) { + const serialized = JSON.stringify(record).toLowerCase(); + const unsafeNeedles = [ + 'protected source body', + 'unpaid assetpack source', + 'raw prompt text', + 'interpolated prompt text', + 'raw provider response', + 'source snippet', + ]; + + return ( + record.sourceSafety.sourceSafeMetadataOnly === true && + record.sourceSafety.protectedSourceVisible === false && + record.sourceSafety.unpaidAssetPackSourceVisible === false && + record.sourceSafety.rawPromptVisible === false && + record.sourceSafety.interpolatedPromptVisible === false && + record.sourceSafety.rawProviderResponseVisible === false && + record.sourceSafety.sourceSnippetVisible === false && + unsafeNeedles.every((needle) => !serialized.includes(needle)) + ); +} + +function matchesFilter(value: string | null, filter: string | undefined) { + return !filter || filter === 'all' || String(value || '') === filter; +} + +function buildSearchText(record: PackActivityRecord) { + return [ + record.id, + record.type, + record.title, + record.description, + record.state, + record.repository, + record.assetPackTitle, + record.settlementState, + record.compensationState, + record.deliveryState, + record.repairState, + ...record.measurements.flatMap((measurement) => [ + measurement.id, + measurement.label, + String(measurement.value), + measurement.unit, + measurement.root, + ]), + ...record.values.flatMap((value) => [value.id, value.label, String(value.amount), value.unit]), + ...record.proofRoots.flatMap((proofRoot) => [proofRoot.id, proofRoot.label, proofRoot.root]), + ] + .filter(Boolean) + .join(' ') + .toLowerCase(); +} + +export function filterPackActivityRecords( + records: PackActivityRecord[], + filters: PackActivityFilters = {}, + search?: string | null, +) { + const normalizedSearch = String(search || '').trim().toLowerCase(); + return records.filter((record) => { + if (filters.type && filters.type !== 'all' && record.type !== filters.type) return false; + if (filters.scope && filters.scope !== 'all' && record.scope !== filters.scope) return false; + if (!matchesFilter(record.state, filters.state)) return false; + if (!matchesFilter(record.settlementState, filters.settlementState)) return false; + if (!matchesFilter(record.compensationState, filters.compensationState)) return false; + if (!matchesFilter(record.deliveryState, filters.deliveryState)) return false; + if (!matchesFilter(record.repairState, filters.repairState)) return false; + if (!matchesFilter(record.repository, filters.repository)) return false; + if (normalizedSearch && !buildSearchText(record).includes(normalizedSearch)) return false; + return true; + }); +} + +export function sortPackActivityRecords( + records: PackActivityRecord[], + sort: PackActivityQuery['sort'] = {}, +) { + const key = sort?.key || 'timestamp'; + const direction = sort?.direction || 'desc'; + const multiplier = direction === 'asc' ? 1 : -1; + + return [...records].sort((left, right) => { + if (key === 'value') { + const leftValue = left.values[0]?.amount ?? left.measurements[0]?.value ?? 0; + const rightValue = right.values[0]?.amount ?? right.measurements[0]?.value ?? 0; + return (Number(leftValue) - Number(rightValue)) * multiplier; + } + + const leftText = + key === 'title' + ? left.title + : key === 'settlementState' + ? left.settlementState + : key === 'compensationState' + ? left.compensationState + : key === 'deliveryState' + ? left.deliveryState + : key === 'repairState' + ? left.repairState + : left.timestamp; + const rightText = + key === 'title' + ? right.title + : key === 'settlementState' + ? right.settlementState + : key === 'compensationState' + ? right.compensationState + : key === 'deliveryState' + ? right.deliveryState + : key === 'repairState' + ? right.repairState + : right.timestamp; + return compareText(leftText, rightText) * multiplier || compareText(left.id, right.id); + }); +} + +export function buildPackActivityDetailProjection( + record: PackActivityRecord, +): PackActivityDetailProjection { + return { + id: record.id, + type: record.type, + title: record.title, + description: record.description, + timestamp: record.timestamp, + sourceSafety: record.sourceSafety, + overview: { + state: record.state, + scope: record.scope, + repository: record.repository, + assetPackTitle: record.assetPackTitle, + }, + measurements: record.measurements, + values: record.values, + proofRoots: record.proofRoots, + states: { + settlement: record.settlementState, + compensation: record.compensationState, + delivery: record.deliveryState, + repair: record.repairState, + }, + telemetry: { + sourceEventId: record.id, + sourceKind: String(record.metadata.kind || record.metadata.type || '') || null, + sourceChannel: String(record.metadata.channel || '') || null, + }, + metadata: record.metadata, + }; +} + +export function summarizePackActivityRecords(records: PackActivityRecord[]): PackActivitySummary { + const types = Object.fromEntries(PACK_ACTIVITY_TYPES.map((type) => [type, 0])) as Record< + PackActivityType, + number + >; + const states: Record = {}; + const repositories = new Set(); + + for (const record of records) { + types[record.type] += 1; + if (record.state) states[record.state] = (states[record.state] || 0) + 1; + if (record.repository) repositories.add(record.repository); + } + + return { + total: records.length, + types, + states, + repositories: [...repositories].sort(compareText), + settlementReady: records.filter((record) => /ready|settled|final/i.test(record.settlementState || '')).length, + compensationReady: records.filter((record) => /ready|allocated|paid/i.test(record.compensationState || '')).length, + deliveryReady: records.filter((record) => /ready|delivered|pull/i.test(record.deliveryState || '')).length, + repairOpen: records.filter((record) => /open|repair|reconcile|failed/i.test(record.repairState || '')).length, + }; +} + +export function queryPackActivityRecords(records: PackActivityRecord[], query: PackActivityQuery = {}) { + const filtered = filterPackActivityRecords(records, query.filters || {}, query.search); + const sorted = sortPackActivityRecords(filtered, query.sort || {}); + return { + records: sorted, + summary: summarizePackActivityRecords(sorted), + query: { + search: query.search || '', + filters: query.filters || {}, + sort: { + key: query.sort?.key || 'timestamp', + direction: query.sort?.direction || 'desc', + }, + }, + }; +} diff --git a/uapi/components/base/bitcode/execution/bitcode-transaction-active-filters.ts b/uapi/components/base/bitcode/execution/bitcode-transaction-active-filters.ts index 923851be..be450e2b 100644 --- a/uapi/components/base/bitcode/execution/bitcode-transaction-active-filters.ts +++ b/uapi/components/base/bitcode/execution/bitcode-transaction-active-filters.ts @@ -16,7 +16,7 @@ export type BitcodeTransactionActiveFilterChip = { const OWNERSHIP_LABELS: Record, string> = { mine: 'My transactions', - network: 'Exchange transactions', + network: 'Pack activity', }; const LENS_LABELS: Record, string> = { diff --git a/uapi/components/base/bitcode/layout/NavBrand.tsx b/uapi/components/base/bitcode/layout/NavBrand.tsx index 64db4aab..fe7504bb 100644 --- a/uapi/components/base/bitcode/layout/NavBrand.tsx +++ b/uapi/components/base/bitcode/layout/NavBrand.tsx @@ -25,7 +25,7 @@ const SURFACE_COPY: Record, { eyebrow: string; ti }, network: { eyebrow: "Bitcode", - title: "exchange", + title: "packs", }, docs: { eyebrow: "Bitcode", diff --git a/uapi/components/base/bitcode/layout/bitcode-public-copy.ts b/uapi/components/base/bitcode/layout/bitcode-public-copy.ts index a290a899..5edc6f92 100644 --- a/uapi/components/base/bitcode/layout/bitcode-public-copy.ts +++ b/uapi/components/base/bitcode/layout/bitcode-public-copy.ts @@ -40,7 +40,7 @@ export const BITCODE_PUBLIC_COPY = { ], }, terminalPreview: { - pill: 'Exchange', + pill: 'Packs', kicker: 'Terminal preview', rail: ['deposit', 'read', 'settle'], }, @@ -51,7 +51,7 @@ export const BITCODE_PUBLIC_COPY = { modes: ['Proofs', 'Conversations', 'Auxillaries', 'Deposit + Read'], }, giveContribution: { - title: 'Exchange supply', + title: 'Pack supply', }, sourceToSettlement: { title: 'Source to settlement', @@ -71,7 +71,7 @@ export const BITCODE_PUBLIC_COPY = { guestCta: 'Open Auxillaries', userCta: 'Open Auxillaries', links: { - network: 'Exchange', + network: 'Packs', transactions: 'Terminal', docs: 'Docs', github: 'Bitcode on GitHub', @@ -79,7 +79,7 @@ export const BITCODE_PUBLIC_COPY = { }, publicNav: { links: [ - { href: '/exchange', label: 'Exchange' }, + { href: '/packs', label: 'Packs' }, { href: '/terminal', label: 'Terminal' }, { href: '/docs', label: 'Docs' }, ], diff --git a/uapi/components/base/bitcode/layout/bitcode-public-explainers.ts b/uapi/components/base/bitcode/layout/bitcode-public-explainers.ts index bd7940ea..c099e7d3 100644 --- a/uapi/components/base/bitcode/layout/bitcode-public-explainers.ts +++ b/uapi/components/base/bitcode/layout/bitcode-public-explainers.ts @@ -6,14 +6,14 @@ function buildExplainer(explainer: BitcodeExplainer): BitcodeExplainer { export const BITCODE_PUBLIC_EXPLAINERS = { network: buildExplainer({ - kicker: 'Bitcode Exchange', - title: 'Exchange', - summary: 'Read the public Bitcode exchange frame where source supply, measured read, settlement posture, and teaching surfaces meet.', + kicker: 'Bitcode Packs', + title: 'Packs', + summary: 'Read pack activity where source supply, measured reads, settlement posture, compensation, delivery, and repair state meet.', detail: - 'Use this route when you want the highest-level public view of how Source Shares become measurable technical intelligence before you dive into full detail.', + 'Use this route when you need the activity master-detail view for AssetPack proposals, admitted packs, previews, proof roots, settlement, and delivery state.', points: [ - 'Frames Bitcode as the exchange for source-backed technical value', - 'Connects public narrative directly to Terminal, docs, and Source Shares', + 'Searches and filters source-safe pack activity', + 'Keeps proof and settlement detail expandable without exposing unpaid source', ], }), transactions: buildExplainer({ @@ -46,7 +46,7 @@ export const BITCODE_PUBLIC_EXPLAINERS = { 'Use this when you want the auxillary access layer directly. Connect Wallet is for first-time wallet identity and onboarding; Open Auxillaries is for entering the contained shell.', points: [ 'Opens the contained auxillary shell', - 'Keeps Auxillaries distinct from Exchange, Terminal, and Docs', + 'Keeps Auxillaries distinct from Packs, Terminal, and Docs', ], }), protocolSpec: buildExplainer({ diff --git a/uapi/components/base/bitcode/layout/nav.tsx b/uapi/components/base/bitcode/layout/nav.tsx index 27d88c84..37ed1d90 100644 --- a/uapi/components/base/bitcode/layout/nav.tsx +++ b/uapi/components/base/bitcode/layout/nav.tsx @@ -57,7 +57,7 @@ function shouldApplyCollapseAnimation(pathname: string | null): boolean { const DISABLED_FEATURE_TOOLTIPS = { exchange: - 'Disabled for launch mode. When enabled, Exchange opens the public Source Shares activity and market-reading surface.', + 'Disabled for launch mode. When enabled, Packs opens the public Source Shares activity and pack-reading surface.', terminal: 'Disabled for launch mode. When enabled, Terminal opens the full deposit-to-settle ledger, proofs, and history workspace.', auxillaries: @@ -393,13 +393,13 @@ export default function Nav() { const publicRouteLinks = usesProductChrome ? (
    {BITCODE_PUBLIC_COPY.publicNav.links.map(({ href, label }, index) => { - const isExchangeRoute = href === '/exchange'; + const isPacksRoute = href === '/packs'; const isDisabledRoute = - (isExchangeRoute && disableExchangeLink) || + (isPacksRoute && disableExchangeLink) || (href === '/terminal' && disableTerminalLink); const isActiveRoute = - isExchangeRoute - ? pathname === '/exchange' || pathname?.startsWith('/exchange/') + isPacksRoute + ? pathname === '/packs' || pathname?.startsWith('/packs/') || pathname === '/exchange' || pathname?.startsWith('/exchange/') : href === '/docs' ? pathname === '/docs' || pathname?.startsWith('/docs/') : pathname === href || pathname?.startsWith(`${href}/`); @@ -413,7 +413,7 @@ export default function Nav() { {isDisabledRoute ? ( )} - {isExchangeRoute ? ( + {isPacksRoute ? ( /tests/bitcodeDocsContent.test.tsx', '/tests/features.test.ts', '/tests/workspaceSurface.test.ts', - '/tests/exchangePageClient.test.tsx', + '/tests/packsPageClient.test.tsx', + '/tests/packActivityModel.test.ts', '/tests/exchangeTerminalHandoff.test.ts', '/tests/terminalPreservedShellSurface.test.tsx', '/tests/terminalFloatingDebugWidget.test.tsx', diff --git a/uapi/tests/bitcodeTransactionsActiveFilters.test.tsx b/uapi/tests/bitcodeTransactionsActiveFilters.test.tsx index 2f6646da..f3b4e078 100644 --- a/uapi/tests/bitcodeTransactionsActiveFilters.test.tsx +++ b/uapi/tests/bitcodeTransactionsActiveFilters.test.tsx @@ -66,7 +66,7 @@ describe('BitcodeTransactionsActiveFilters', () => { expect(container.firstChild).toBeNull(); }); - it('renders exchange ownership copy for network-scoped transaction filters', () => { + it('renders pack activity ownership copy for network-scoped transaction filters', () => { render( { />, ); - expect(screen.getByRole('button', { name: 'Ownership: Exchange transactions ×' })).toBeTruthy(); + expect(screen.getByRole('button', { name: 'Ownership: Pack activity ×' })).toBeTruthy(); }); }); diff --git a/uapi/tests/exchangePageClient.test.tsx b/uapi/tests/exchangePageClient.test.tsx deleted file mode 100644 index de2df8f5..00000000 --- a/uapi/tests/exchangePageClient.test.tsx +++ /dev/null @@ -1,87 +0,0 @@ -import React from 'react'; -import '@testing-library/jest-dom'; -import { render, screen, waitFor } from '@testing-library/react'; - -import ExchangePageClient from '@/app/exchange/ExchangePageClient'; - -const mockReplace = jest.fn(); -let mockQuery = 'intent=buy-existing-btd'; - -jest.mock('next/navigation', () => ({ - usePathname: () => '/exchange', - useRouter: () => ({ replace: mockReplace }), - useSearchParams: () => new URLSearchParams(mockQuery), -})); - -jest.mock('@/lib/mock-review-mode', () => ({ - isAuxillariesMockMode: () => true, -})); - -jest.mock('@/networking/api-client', () => ({ - fetchPipelineExecutionHistory: jest.fn(), -})); - -jest.mock('@/app/terminal/terminal-shell-bridge', () => ({ - TerminalShellBridgeProvider: ({ children }: { children: React.ReactNode }) => <>{children}, -})); - -jest.mock('@/app/terminal/TerminalTransactionWorkspace', () => ({ - __esModule: true, - default: ({ - runs, - selectedRun, - surface, - }: { - runs: Array<{ id: string }>; - selectedRun: { id: string } | null; - surface?: string; - }) => ( -
    - ), -})); - -describe('ExchangePageClient', () => { - beforeEach(() => { - mockReplace.mockReset(); - mockQuery = 'intent=buy-existing-btd'; - }); - - it('renders the Exchange activity master-detail surface without redirecting or route-focusing the first row', async () => { - render(); - - expect( - screen.getByRole('heading', { name: /Read market activity, select an order, and inspect Exchange state/i }), - ).toBeInTheDocument(); - expect(screen.getByText('market filters')).toBeInTheDocument(); - expect(screen.getByText('activity replay')).toBeInTheDocument(); - expect(screen.getByText('source-safe preview')).toBeInTheDocument(); - expect(screen.getByText('proof-rooted state')).toBeInTheDocument(); - expect(screen.getByTestId('exchange-workspace')).toHaveAttribute('data-surface', 'exchange'); - expect(screen.getByTestId('exchange-workspace')).toHaveAttribute( - 'data-selected-run', - 'mock-run-branch-remediation', - ); - - await waitFor(() => { - expect(screen.getByTestId('exchange-workspace')).toHaveAttribute('data-run-count', '3'); - }); - expect(mockReplace).not.toHaveBeenCalled(); - }); - - it('honors an explicit Exchange transaction focus without rewriting the entry URL', async () => { - mockQuery = 'intent=buy-existing-btd&transactionId=mock-run-read-measurement-pass'; - - render(); - - expect(screen.getByTestId('exchange-workspace')).toHaveAttribute( - 'data-selected-run', - 'mock-run-read-measurement-pass', - ); - expect(mockReplace).not.toHaveBeenCalled(); - }); -}); diff --git a/uapi/tests/exchangeTerminalHandoff.test.ts b/uapi/tests/exchangeTerminalHandoff.test.ts index d447552b..2fcfef1d 100644 --- a/uapi/tests/exchangeTerminalHandoff.test.ts +++ b/uapi/tests/exchangeTerminalHandoff.test.ts @@ -1,4 +1,4 @@ -import { buildExchangeHref, buildTerminalHref } from '@/app/terminal/terminal-routes'; +import { buildPacksHref, buildTerminalHref } from '@/app/terminal/terminal-routes'; import { writeTerminalTransactionDetailSection, writeTerminalTransactionId, @@ -26,8 +26,8 @@ const selectedRun: WorkspaceRun = { closureFocus: 'rights and settlement review', }; -describe('Exchange and Terminal transaction handoff', () => { - it('builds Exchange links that preserve transaction, detail, filters, and unknown context', () => { +describe('Packs and Terminal transaction handoff', () => { + it('builds Packs links that preserve transaction, detail, filters, and unknown context', () => { const baseParams = new URLSearchParams( 'transactionId=old-run&transactionDetail=history&provider=github&repo=engineeredsoftware%2FENGI&transactionSearch=AssetPack&transactionOwnership=network', ); @@ -36,21 +36,21 @@ describe('Exchange and Terminal transaction handoff', () => { 'journal', ); - const exchangeHref = buildExchangeHref(nextParams); + const packsHref = buildPacksHref(nextParams); const terminalHref = buildTerminalHref(nextParams); - expect(exchangeHref).toContain('/exchange?'); - expect(exchangeHref).toContain('transactionId=tx-exchange-handoff'); - expect(exchangeHref).toContain('transactionDetail=journal'); - expect(exchangeHref).toContain('provider=github'); - expect(exchangeHref).toContain('repo=engineeredsoftware%2FENGI'); - expect(exchangeHref).toContain('transactionSearch=AssetPack'); - expect(exchangeHref).toContain('transactionOwnership=network'); + expect(packsHref).toContain('/packs?'); + expect(packsHref).toContain('transactionId=tx-exchange-handoff'); + expect(packsHref).toContain('transactionDetail=journal'); + expect(packsHref).toContain('provider=github'); + expect(packsHref).toContain('repo=engineeredsoftware%2FENGI'); + expect(packsHref).toContain('transactionSearch=AssetPack'); + expect(packsHref).toContain('transactionOwnership=network'); expect(terminalHref).toContain('/terminal?'); expect(terminalHref).toContain('transactionId=tx-exchange-handoff'); }); - it('adds a source-safe Exchange handoff to the transaction read model', () => { + it('adds a source-safe Packs handoff to the transaction read model', () => { const model = buildTerminalTransactionReadModel({ selectedRun, detail: null, @@ -62,7 +62,7 @@ describe('Exchange and Terminal transaction handoff', () => { }); expect(model.route.href).toContain('/terminal?'); - expect(model.route.exchangeHref).toContain('/exchange?'); + expect(model.route.exchangeHref).toContain('/packs?'); expect(model.route.exchangeHref).toContain('transactionId=tx-exchange-handoff'); expect(model.route.exchangeHref).toContain('transactionDetail=proofs'); expect(model.route.exchangeHref).toContain('provider=github'); diff --git a/uapi/tests/navPublicShell.test.tsx b/uapi/tests/navPublicShell.test.tsx index 35b80072..07e77ff5 100644 --- a/uapi/tests/navPublicShell.test.tsx +++ b/uapi/tests/navPublicShell.test.tsx @@ -110,11 +110,11 @@ describe('Nav public shell', () => { const createButton = screen.getByRole('button', { name: 'Connect Wallet' }); expect(screen.getByText('Brand home')).toBeInTheDocument(); - expect(screen.getByRole('link', { name: 'Exchange' })).toHaveAttribute('href', '/exchange'); - expect(screen.getByRole('link', { name: 'Exchange' })).not.toHaveAttribute('aria-current'); + expect(screen.getByRole('link', { name: 'Packs' })).toHaveAttribute('href', '/packs'); + expect(screen.getByRole('link', { name: 'Packs' })).not.toHaveAttribute('aria-current'); expect(screen.getByRole('link', { name: 'Terminal' })).toHaveAttribute('href', '/terminal'); expect(screen.getByRole('link', { name: 'Docs' })).toHaveAttribute('href', '/docs'); - expect(screen.getByRole('button', { name: 'Explain Exchange' })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: 'Explain Packs' })).toBeInTheDocument(); expect(screen.getByRole('button', { name: 'Explain Terminal' })).toBeInTheDocument(); expect(screen.getByRole('button', { name: 'Explain Docs' })).toBeInTheDocument(); @@ -176,14 +176,14 @@ describe('Nav public shell', () => { expect(screen.getByRole('link', { name: 'Docs' })).toHaveAttribute('href', '/docs'); }); - it('renders exchange brand posture and active nav on exchange routes', () => { - mockPathname = '/exchange'; + it('renders pack brand posture and active nav on pack routes', () => { + mockPathname = '/packs'; render(