Skip to content

Merge pull request #44 from engineeredsoftware/v31/gate-1-spec-roadma… #176

Merge pull request #44 from engineeredsoftware/v31/gate-1-spec-roadma…

Merge pull request #44 from engineeredsoftware/v31/gate-1-spec-roadma… #176

name: Bitcode Gate Quality
on:
push:
branches:
- "v*/gate-*"
- "version/**"
pull_request:
branches:
- "version/**"
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
permissions:
contents: read
jobs:
gate-quality:
name: Gate Quality
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- 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 gate pull request title
if: github.event_name == 'pull_request'
env:
PR_BASE_REF: ${{ github.base_ref }}
PR_HEAD_REF: ${{ github.head_ref }}
PR_TITLE: ${{ github.event.pull_request.title }}
run: |
if [[ "$PR_BASE_REF" == version/* && "$PR_HEAD_REF" =~ ^v([0-9]+)/gate-([0-9]+)- ]]; then
expected_version="V${BASH_REMATCH[1]}"
expected_gate="${BASH_REMATCH[2]}"
if [[ ! "$PR_TITLE" =~ ^${expected_version}[[:space:]]+Gate[[:space:]]+${expected_gate}:[[:space:]].+ ]]; then
echo "Gate pull request titles must begin with: ${expected_version} Gate ${expected_gate}:"
echo "Observed: ${PR_TITLE}"
exit 1
fi
fi
- name: Validate draft canon posture
run: |
POINTER="$(cat BITCODE_SPEC.txt)"
if [ "$POINTER" = "V28" ]; then
node scripts/check-bitcode-spec-family.mjs --version V28 --mode promoted --current-target V28
node scripts/check-bitcode-spec-family.mjs --version V29 --mode draft --current-target V28
node scripts/check-bitcode-canon-posture-drift.mjs --active-canon V28 --draft-target V29
node scripts/check-bitcode-canonical-inputs.mjs --current-target V28
node scripts/check-v29-gate1-objectives-and-gating.mjs --skip-branch-check
node scripts/check-v29-gate2-terminal-transaction-read-models.mjs --skip-branch-check
node scripts/check-v29-gate3-wallet-signer-btc-operations.mjs --skip-branch-check
node scripts/check-v29-gate4-reading-pipeline-observability.mjs --skip-branch-check
node scripts/check-v29-gate5-assetpack-disclosure-rights.mjs --skip-branch-check
node scripts/check-v29-gate6-settlement-reconciliation-repair.mjs --skip-branch-check
node scripts/check-v29-gate7-organization-permission-authority.mjs --skip-branch-check
node scripts/check-v29-gate8-demonstration-origin-formalization.mjs --skip-branch-check
node scripts/check-v29-gate9-terminal-ux-browser-proof.mjs --skip-branch-check
node scripts/check-v29-gate10-local-staging-promotion-readiness.mjs --skip-branch-check
elif [ "$POINTER" = "V29" ]; then
node scripts/check-bitcode-spec-family.mjs --version V29 --mode promoted --current-target V29
node scripts/check-bitcode-spec-family.mjs --version V30 --mode draft --current-target V29
node scripts/check-bitcode-canonical-inputs.mjs --current-target V29
node scripts/check-bitcode-canon-posture-drift.mjs --active-canon V29 --draft-target V30
node scripts/check-v29-gate10-local-staging-promotion-readiness.mjs --promotion-mode --skip-branch-check
node scripts/check-v30-gate1-roadmap-and-gating.mjs --skip-branch-check
node scripts/check-v30-gate2-protocol-package-api-boundaries.mjs --skip-branch-check
node scripts/check-v30-gate3-bitcoin-taproot-psbt-fee-rigor.mjs --skip-branch-check
node scripts/check-v30-gate4-btd-assetpack-mint-read-receipts.mjs --skip-branch-check
node scripts/check-v30-gate5-testnet-ledger-projection-hardening.mjs --skip-branch-check
node scripts/check-v30-gate6-source-to-shares-proof-cleanup.mjs --skip-branch-check
node scripts/check-v30-gate7-bridge-readiness-research-boundaries.mjs --skip-branch-check
node scripts/check-v30-gate8-protocol-telemetry-proof-hooks.mjs --skip-branch-check
node scripts/check-v30-gate9-interface-integration-regression-proof.mjs --skip-branch-check
node scripts/check-v30-gate10-promotion-readiness.mjs --promotion-mode --skip-branch-check
elif [ "$POINTER" = "V30" ]; then
node scripts/check-bitcode-spec-family.mjs --version V30 --mode promoted --current-target V30
node scripts/check-bitcode-spec-family.mjs --version V31 --mode draft --current-target V30
node scripts/check-bitcode-canonical-inputs.mjs --current-target V30
node scripts/check-bitcode-canon-posture-drift.mjs --active-canon V30 --draft-target V31
node scripts/check-v30-gate10-promotion-readiness.mjs --promotion-mode --skip-branch-check
node scripts/check-v31-gate1-spec-roadmap-opening.mjs --skip-branch-check
else
echo "Unexpected BITCODE_SPEC.txt pointer: $POINTER" >&2
exit 1
fi
- name: Validate source casing and imports
run: |
bash scripts/find-uppercase-raw-promptparts.sh
bash scripts/check-import-casing.sh
- name: Type-check gate packages
run: |
pnpm --filter @bitcode/btd typecheck
pnpm --filter @bitcode/api build
pnpm --dir packages/executions-mcp/src/mcp-server run type-check
pnpm --dir packages/chatgptapp exec tsc --noEmit --pretty false
pnpm --filter @bitcode/pipeline-asset-pack typecheck
pnpm --filter @bitcode/pipeline-hosts typecheck
pnpm --filter @bitcode/protocol typecheck
- name: Test gate packages
run: |
pnpm --filter @bitcode/btd test
pnpm --filter @bitcode/btd test -- --runTestsByPath __tests__/btc-fee-operation.test.ts
pnpm --filter @bitcode/btd test -- --runTestsByPath __tests__/btd.test.ts
pnpm --filter @bitcode/api exec jest --config jest.config.cjs --runTestsByPath src/routes/__tests__/btd-crypto.test.ts --runInBand
pnpm --dir packages/executions-mcp/src/mcp-server run test:mcp -- --runTestsByPath src/__tests__/unit/auth.test.ts --runInBand
pnpm --dir packages/chatgptapp exec jest --runTestsByPath src/__tests__/tools.test.ts --runInBand
pnpm --filter @bitcode/pipeline-hosts exec jest --config jest.config.cjs --runTestsByPath src/__tests__/asset-pack-harness.test.ts --runInBand
pnpm --filter @bitcode/pipeline-asset-pack exec jest --config jest.config.cjs --passWithNoTests --forceExit
pnpm --filter @bitcode/pipeline-asset-pack exec jest --config jest.config.cjs --runTestsByPath src/__tests__/reading-pipeline-observability.test.ts src/__tests__/reading-pipeline-contract.test.ts --runInBand
pnpm --filter @bitcode/pipeline-asset-pack exec jest --config jest.config.cjs --runTestsByPath src/__tests__/asset-pack-disclosure.test.ts src/__tests__/postprocess.test.ts src/__tests__/read-need.test.ts --runInBand
pnpm --filter @bitcode/pipeline-hosts exec jest --config jest.config.cjs --passWithNoTests --forceExit
pnpm --filter @bitcode/protocol test
- name: Test staged Reading route and Terminal harness contracts
run: |
pnpm --dir uapi exec jest --runTestsByPath \
tests/api/readReviewRoute.test.ts \
tests/api/pipelineHarnessRoute.test.ts \
tests/terminalPipelineHarnessClient.test.ts \
tests/terminalDepositReadWorkbench.test.ts \
tests/terminalTransactionQuery.test.ts \
tests/terminalTransactionReadModel.test.ts \
tests/terminalProtocolProjection.test.ts \
tests/terminalInterfaceIntegrationRegression.test.ts \
tests/terminalWalletBtcOperation.test.ts \
tests/terminalJournalReconciliation.test.ts \
tests/terminalOrganizationAuthority.test.ts \
tests/protocolCommercialBoundary.test.ts \
tests/terminalTransactionDetailCards.test.tsx \
tests/terminalTransactionDetailSnapshot.test.ts \
tests/terminalUxBrowserProof.test.tsx \
tests/pipelineExecutionLogHeader.test.tsx \
--runInBand
- name: Install Terminal browser proof browser
run: pnpm --dir uapi exec playwright install chromium --with-deps
- name: Browser proof Terminal cockpit
run: pnpm --dir uapi run test:e2e:terminal-ux
- name: Test pipeline readback verifier
run: pnpm test:qa:v28:pipeline-readback
- name: Test protocol demonstration
run: |
npm --prefix protocol-demonstration test
npm --prefix protocol-demonstration run test:v28-mvp-qa
- name: Check diff hygiene
run: git diff --check