Skip to content

Commit 5ca8f99

Browse files
V30 Gate 10: Prove promotion readiness
Add the V30 promotion workflow, Gate 10 readiness checker, promotion command support, and generated V30 proof artifacts. Extend canonical proven generation and runtime/spec-family promotion helpers for V30, update roadmap and QA documentation, and wire Gate 10 into repository checks.\n\nProof: pnpm run check:v30-gate10; git diff --cached --check; staged secret-marker scan for Supabase/OpenAI credential markers.
1 parent f177157 commit 5ca8f99

23 files changed

Lines changed: 3816 additions & 20 deletions
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
{
2+
"reportId": "v30-canon-posture-drift-report",
3+
"version": "V30",
4+
"checkedActiveCanonVersion": "V30",
5+
"checkedDraftTargetVersion": "V31",
6+
"pointerVersion": "V29",
7+
"proofSourceCommit": "f1771573c885652055c86ced1b43ba06a3ba7706",
8+
"generatedAt": "2026-05-21T20:27:10-03:00",
9+
"generatorId": "bitcode.proven-generator.v1",
10+
"worktreeState": "dirty-preview",
11+
"passed": false,
12+
"checkCount": 10,
13+
"blockingFailureCount": 7,
14+
"blockingFailures": [
15+
"pointer-active-canon-alignment: BITCODE_SPEC.txt points to V29 while runtime expects V30.",
16+
"canon-posture-constant-alignment: canon-posture constants resolve V29/V30 with operator label V29 active canon / V30 system draft.",
17+
"proven-appendix-alignment: active generated appendix path is BITCODE_SPEC_V29_PROVEN.md.",
18+
"policy-ref-alignment: policy reference is policy://bitcode/spec-v29-active-v30-system-draft/current.",
19+
"runtime-state-alignment: buildInitialState() reports Bitcode Spec V29 active canon / V30 system draft with canon posture V29/V30.",
20+
"public-state-alignment: publicState() reports Bitcode Spec V29 active canon / V30 system draft with canon posture V29/V30.",
21+
"readme-alignment: README states V30 active canon and BITCODE_SPEC_V29_PROVEN.md as the current generated appendix."
22+
],
23+
"runtimeSpecVersion": "Bitcode Spec V29 active canon / V30 system draft",
24+
"publicSpecVersion": "Bitcode Spec V29 active canon / V30 system draft",
25+
"activeProvenAppendixPath": "BITCODE_SPEC_V29_PROVEN.md",
26+
"policyRef": "policy://bitcode/spec-v29-active-v30-system-draft/current",
27+
"checkedFiles": [
28+
"protocol-demonstration/README.md",
29+
"protocol-demonstration/public/index.html",
30+
"protocol-demonstration/public/app.js",
31+
"protocol-demonstration/server.js"
32+
],
33+
"checks": [
34+
{
35+
"checkId": "pointer-active-canon-alignment",
36+
"passed": false,
37+
"detail": "BITCODE_SPEC.txt points to V29 while runtime expects V30."
38+
},
39+
{
40+
"checkId": "canon-posture-constant-alignment",
41+
"passed": false,
42+
"detail": "canon-posture constants resolve V29/V30 with operator label V29 active canon / V30 system draft."
43+
},
44+
{
45+
"checkId": "proven-appendix-alignment",
46+
"passed": false,
47+
"detail": "active generated appendix path is BITCODE_SPEC_V29_PROVEN.md."
48+
},
49+
{
50+
"checkId": "policy-ref-alignment",
51+
"passed": false,
52+
"detail": "policy reference is policy://bitcode/spec-v29-active-v30-system-draft/current."
53+
},
54+
{
55+
"checkId": "runtime-state-alignment",
56+
"passed": false,
57+
"detail": "buildInitialState() reports Bitcode Spec V29 active canon / V30 system draft with canon posture V29/V30."
58+
},
59+
{
60+
"checkId": "public-state-alignment",
61+
"passed": false,
62+
"detail": "publicState() reports Bitcode Spec V29 active canon / V30 system draft with canon posture V29/V30."
63+
},
64+
{
65+
"checkId": "server-api-alignment",
66+
"passed": true,
67+
"detail": "server.js keeps API posture sourced from SPEC_VERSION and buildPublicState(...)."
68+
},
69+
{
70+
"checkId": "browser-shell-placeholder-alignment",
71+
"passed": true,
72+
"detail": "public/index.html exposes canon-posture placeholders and no stale hardcoded hero posture."
73+
},
74+
{
75+
"checkId": "browser-shell-render-alignment",
76+
"passed": true,
77+
"detail": "public/app.js renders canon posture from runtime state and omits stale V15 explainer keys."
78+
},
79+
{
80+
"checkId": "readme-alignment",
81+
"passed": false,
82+
"detail": "README states V30 active canon and BITCODE_SPEC_V29_PROVEN.md as the current generated appendix."
83+
}
84+
]
85+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{
2+
"reportId": "v30-canonical-input-report",
3+
"version": "V30",
4+
"proofSourceCommit": "f1771573c885652055c86ced1b43ba06a3ba7706",
5+
"generatedAt": "2026-05-21T20:27:10-03:00",
6+
"generatorId": "bitcode.proven-generator.v1",
7+
"worktreeState": "dirty-preview",
8+
"checkedTargetVersion": "V30",
9+
"pointerVersion": "V29",
10+
"passed": true,
11+
"failureCount": 0,
12+
"failures": [],
13+
"specPath": "BITCODE_SPEC_V30.md",
14+
"notesPath": "BITCODE_SPEC_V30_NOTES.md",
15+
"provenPath": "BITCODE_SPEC_V30_PROVEN.md",
16+
"parityPath": "BITCODE_SPEC_V30_PARITY_MATRIX.md",
17+
"requiredGeneratedArtifactPaths": [
18+
".bitcode/v30-spec-family-report.json",
19+
".bitcode/v30-canonical-input-report.json",
20+
".bitcode/v30-canon-posture-drift-report.json",
21+
".bitcode/v30-protocol-telemetry-proof-hooks.json"
22+
],
23+
"requiredGeneratedArtifactCount": 4
24+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
{
2+
"reportId": "v30-protocol-telemetry-proof-hooks",
3+
"version": "V30",
4+
"proofSourceCommit": "f1771573c885652055c86ced1b43ba06a3ba7706",
5+
"generatedAt": "2026-05-21T20:27:10-03:00",
6+
"generatorId": "bitcode.proven-generator.v1",
7+
"worktreeState": "dirty-preview",
8+
"passed": true,
9+
"sourceSafe": true,
10+
"checkedFileCount": 12,
11+
"checkedFiles": [
12+
"packages/btd/src/telemetry.ts",
13+
"packages/btd/src/api-boundaries.ts",
14+
"packages/btd/__tests__/telemetry.test.ts",
15+
"packages/api/src/routes/btd-crypto.ts",
16+
"packages/api/src/routes/__tests__/btd-crypto.test.ts",
17+
"uapi/app/api/btd/protocol-telemetry/route.ts",
18+
"packages/btd/README.md",
19+
"uapi/app/terminal/README.md",
20+
"BITCODE_SPEC_V30.md",
21+
"BITCODE_SPEC_V30_DELTA.md",
22+
"BITCODE_SPEC_V30_NOTES.md",
23+
"BITCODE_SPEC_V30_PARITY_MATRIX.md"
24+
],
25+
"requiredTelemetryFamilies": [
26+
"btd_receipt",
27+
"btc_fee_state",
28+
"ledger_projection",
29+
"source_to_shares_proof",
30+
"bridge_readiness_posture"
31+
],
32+
"proofHookCoverage": [
33+
"theorem ids",
34+
"replay step ids",
35+
"witness artifact paths",
36+
"generated artifact paths",
37+
"evidence roots",
38+
"telemetry roots"
39+
],
40+
"compatibleWith": [
41+
"V32",
42+
"V35"
43+
],
44+
"failures": []
45+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
{
2+
"reportId": "v30-spec-family-report",
3+
"version": "V30",
4+
"proofSourceCommit": "f1771573c885652055c86ced1b43ba06a3ba7706",
5+
"generatedAt": "2026-05-21T20:27:10-03:00",
6+
"generatorId": "bitcode.proven-generator.v1",
7+
"worktreeState": "dirty-preview",
8+
"checkedVersion": "V30",
9+
"mode": "draft",
10+
"currentTarget": "V29",
11+
"pointerVersion": "V29",
12+
"passed": true,
13+
"failureCount": 0,
14+
"failures": [],
15+
"requiredFiles": [
16+
"BITCODE_SPEC_V30.md",
17+
"BITCODE_SPEC_V30_DELTA.md",
18+
"BITCODE_SPEC_V30_NOTES.md",
19+
"BITCODE_SPEC_V30_PARITY_MATRIX.md"
20+
],
21+
"supportFiles": [
22+
"BITCODE_SPECIFYING.md",
23+
"BITCODE_SPEC_TEMPLATEGUIDE.md"
24+
],
25+
"requiredStatusLabelCount": 4,
26+
"requiredPromotedStatusLabelCount": 1,
27+
"requiredSpecSectionCount": 18,
28+
"requiredAppendixSectionCount": 14,
29+
"requiredProofFamilyCount": 9,
30+
"requiredGeneratedArtifactCatalogSectionCount": 9,
31+
"requiredGeneratedArtifactPathCount": 4,
32+
"requiredNotesSectionCount": 4,
33+
"requiredSubsystemCoverageCount": 18
34+
}

.github/workflows/bitcode-canon-quality.yml

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ jobs:
3333
node scripts/check-bitcode-canon-posture-drift.mjs --active-canon V29 --draft-target V30
3434
node scripts/check-bitcode-spec-family.mjs --version V29 --mode promoted --current-target V29
3535
node scripts/check-bitcode-spec-family.mjs --version V30 --mode draft --current-target V29
36+
elif [ "$POINTER" = "V30" ]; then
37+
node scripts/check-bitcode-canonical-inputs.mjs --current-target V30
38+
node scripts/check-bitcode-canon-posture-drift.mjs --active-canon V30 --draft-target V31
39+
node scripts/check-bitcode-spec-family.mjs --version V30 --mode promoted --current-target V30
3640
else
3741
echo "Unexpected BITCODE_SPEC.txt pointer: $POINTER" >&2
3842
exit 1
@@ -77,7 +81,12 @@ jobs:
7781
fi
7882
;;
7983
spec:\ V30*|spec:\ v30*)
80-
node scripts/check-bitcode-spec-family.mjs --version V30 --mode draft --current-target V29
84+
POINTER="$(cat BITCODE_SPEC.txt)"
85+
if [ "$POINTER" = "V30" ]; then
86+
node scripts/check-bitcode-spec-family.mjs --version V30 --mode promoted --current-target V30
87+
else
88+
node scripts/check-bitcode-spec-family.mjs --version V30 --mode draft --current-target V29
89+
fi
8190
;;
8291
*)
8392
echo "Skipping strict spec-title conformance; title is not a V29/V30 spec change."

.github/workflows/bitcode-gate-quality.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,12 @@ jobs:
8888
node scripts/check-v30-gate7-bridge-readiness-research-boundaries.mjs --skip-branch-check
8989
node scripts/check-v30-gate8-protocol-telemetry-proof-hooks.mjs --skip-branch-check
9090
node scripts/check-v30-gate9-interface-integration-regression-proof.mjs --skip-branch-check
91+
node scripts/check-v30-gate10-promotion-readiness.mjs --promotion-mode --skip-branch-check
92+
elif [ "$POINTER" = "V30" ]; then
93+
node scripts/check-bitcode-spec-family.mjs --version V30 --mode promoted --current-target V30
94+
node scripts/check-bitcode-canonical-inputs.mjs --current-target V30
95+
node scripts/check-bitcode-canon-posture-drift.mjs --active-canon V30 --draft-target V31
96+
node scripts/check-v30-gate10-promotion-readiness.mjs --promotion-mode --skip-branch-check
9197
else
9298
echo "Unexpected BITCODE_SPEC.txt pointer: $POINTER" >&2
9399
exit 1
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
name: V30 Canon Promotion
2+
3+
on:
4+
pull_request:
5+
branches:
6+
- main
7+
types:
8+
- opened
9+
- synchronize
10+
- reopened
11+
- ready_for_review
12+
workflow_dispatch:
13+
14+
concurrency:
15+
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
16+
cancel-in-progress: true
17+
18+
permissions:
19+
contents: write
20+
pull-requests: read
21+
22+
jobs:
23+
promote-v30:
24+
name: V30 Promotion Validation
25+
if: >-
26+
${{
27+
github.event_name == 'workflow_dispatch' ||
28+
(
29+
github.event.pull_request.base.ref == 'main' &&
30+
github.event.pull_request.head.ref == 'version/v30' &&
31+
github.event.pull_request.head.repo.full_name == github.repository
32+
)
33+
}}
34+
runs-on: ubuntu-latest
35+
36+
steps:
37+
- name: Checkout version branch
38+
uses: actions/checkout@v4
39+
with:
40+
ref: ${{ github.event.pull_request.head.ref || github.ref_name }}
41+
token: ${{ github.token }}
42+
fetch-depth: 0
43+
44+
- name: Setup pnpm
45+
uses: pnpm/action-setup@v4
46+
47+
- name: Setup Node
48+
uses: actions/setup-node@v4
49+
with:
50+
node-version: "24"
51+
cache: pnpm
52+
53+
- name: Install dependencies
54+
run: pnpm install --frozen-lockfile
55+
56+
- name: Validate V30 promotion readiness
57+
run: |
58+
POINTER="$(cat BITCODE_SPEC.txt)"
59+
if [ "$POINTER" = "V29" ]; then
60+
node scripts/check-bitcode-spec-family.mjs --version V30 --mode draft --current-target V29
61+
node scripts/check-bitcode-canon-posture-drift.mjs --active-canon V29 --draft-target V30
62+
node scripts/check-bitcode-canonical-inputs.mjs --current-target V29
63+
node scripts/check-v30-gate1-roadmap-and-gating.mjs --skip-branch-check
64+
node scripts/check-v30-gate2-protocol-package-api-boundaries.mjs --skip-branch-check
65+
node scripts/check-v30-gate3-bitcoin-taproot-psbt-fee-rigor.mjs --skip-branch-check
66+
node scripts/check-v30-gate4-btd-assetpack-mint-read-receipts.mjs --skip-branch-check
67+
node scripts/check-v30-gate5-testnet-ledger-projection-hardening.mjs --skip-branch-check
68+
node scripts/check-v30-gate6-source-to-shares-proof-cleanup.mjs --skip-branch-check
69+
node scripts/check-v30-gate7-bridge-readiness-research-boundaries.mjs --skip-branch-check
70+
node scripts/check-v30-gate8-protocol-telemetry-proof-hooks.mjs --skip-branch-check
71+
node scripts/check-v30-gate9-interface-integration-regression-proof.mjs --skip-branch-check
72+
node scripts/check-v30-gate10-promotion-readiness.mjs --promotion-mode --skip-branch-check
73+
node scripts/promote-bitcode-canon.mjs --version V30 --commit HEAD --dry-run
74+
elif [ "$POINTER" = "V30" ]; then
75+
node scripts/check-bitcode-spec-family.mjs --version V30 --mode promoted --current-target V30
76+
node scripts/check-bitcode-canonical-inputs.mjs --current-target V30
77+
node scripts/check-bitcode-canon-posture-drift.mjs --active-canon V30 --draft-target V31
78+
node scripts/check-v30-gate10-promotion-readiness.mjs --promotion-mode --skip-branch-check
79+
else
80+
echo "Unexpected BITCODE_SPEC.txt pointer: $POINTER" >&2
81+
exit 1
82+
fi
83+
pnpm test:qa:v28:pipeline-readback
84+
pnpm --filter @bitcode/protocol typecheck
85+
pnpm --filter @bitcode/protocol test
86+
pnpm --filter @bitcode/btd typecheck
87+
pnpm --filter @bitcode/btd test
88+
npm --prefix protocol-demonstration test
89+
npm --prefix protocol-demonstration run test:v28-mvp-qa
90+
pnpm --filter @bitcode/pipeline-asset-pack typecheck
91+
pnpm --filter @bitcode/pipeline-hosts typecheck
92+
pnpm --filter @bitcode/pipeline-asset-pack exec jest --config jest.config.cjs --passWithNoTests --forceExit
93+
pnpm --filter @bitcode/pipeline-hosts exec jest --config jest.config.cjs --passWithNoTests --forceExit
94+
pnpm --dir uapi exec jest --runTestsByPath \
95+
tests/api/readReviewRoute.test.ts \
96+
tests/api/pipelineHarnessRoute.test.ts \
97+
tests/terminalPipelineHarnessClient.test.ts \
98+
tests/terminalDepositReadWorkbench.test.ts \
99+
tests/terminalTransactionQuery.test.ts \
100+
tests/terminalTransactionReadModel.test.ts \
101+
tests/terminalProtocolProjection.test.ts \
102+
tests/terminalInterfaceIntegrationRegression.test.ts \
103+
tests/terminalWalletBtcOperation.test.ts \
104+
tests/terminalJournalReconciliation.test.ts \
105+
tests/terminalOrganizationAuthority.test.ts \
106+
tests/protocolCommercialBoundary.test.ts \
107+
tests/terminalTransactionDetailCards.test.tsx \
108+
tests/terminalTransactionDetailSnapshot.test.ts \
109+
tests/terminalUxBrowserProof.test.tsx \
110+
tests/pipelineExecutionLogHeader.test.tsx \
111+
--runInBand
112+
pnpm --dir uapi exec playwright install chromium --with-deps
113+
pnpm --dir uapi run test:e2e:terminal-ux
114+
git diff --check
115+
116+
- name: Promote V30 canon files
117+
if: >-
118+
${{
119+
github.event_name == 'pull_request' &&
120+
github.event.pull_request.head.ref == 'version/v30'
121+
}}
122+
env:
123+
HEAD_BRANCH: ${{ github.event.pull_request.head.ref }}
124+
run: |
125+
if [ "$(cat BITCODE_SPEC.txt)" = "V30" ]; then
126+
echo "BITCODE_SPEC.txt already points to V30."
127+
exit 0
128+
fi
129+
PROOF_SOURCE_COMMIT="$(git rev-parse HEAD)"
130+
npm run promote:canon -- --version V30 --commit "$PROOF_SOURCE_COMMIT"
131+
git config user.name "github-actions[bot]"
132+
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
133+
git add \
134+
BITCODE_SPEC.txt \
135+
BITCODE_SPEC_V30.md \
136+
BITCODE_SPEC_V30_DELTA.md \
137+
BITCODE_SPEC_V30_NOTES.md \
138+
BITCODE_SPEC_V30_PARITY_MATRIX.md \
139+
BITCODE_SPEC_V30_PROVEN.md \
140+
protocol-demonstration/src/canon-posture.js \
141+
protocol-demonstration/README.md \
142+
packages/protocol/src/canon-posture.js \
143+
packages/protocol/data/state.json \
144+
packages/protocol/README.md \
145+
.bitcode
146+
git commit -m "Promote Bitcode canon to V30"
147+
git push origin "HEAD:$HEAD_BRANCH"

0 commit comments

Comments
 (0)