Skip to content

fix(zig): use the Io awake clock in the bench harness (Zig 0.16) - #354

Merged
hyperpolymath merged 1 commit into
mainfrom
fix/zig-bench-0.16
Oct 7, 2026
Merged

hyperpolymath merged 1 commit into
mainfrom
fix/zig-bench-0.16

Conversation

@hyperpolymath

Copy link
Copy Markdown
Owner

Summary

zig build failed on main under the pinned Zig 0.16.0 with 13 errors. All 13 were the same error in ffi/zig/src/bench.zig:27: enum 'Io.Clock' has no member named 'monotonic'. This turned the E2E and Bench jobs red. Zig 0.16's std.Io.Clock has real, awake and boot. awake is the monotonic clock that excludes suspend time, which is the correct clock for a latency benchmark.

Type of change

Bug fix (build break). No behaviour change outside the benchmark harness.

📌 New pins

Head SHA: 74e839d9c583d822227e8afd535aa223740e43cf. This PR adds or changes no pins: no action uses:, actions.lock, lockfile or container digest changes.

Changes

  • ffi/zig/src/bench.zig: std.Io.Clock.Timestamp.now(shim.io(), .monotonic) → .awake, at both call sites. The comment now names the clock.

RSR Quality Checklist

Required

  • Tests pass: zig build test --summary all reports "41/41 steps succeeded; 316/316 tests passed". The one failed command: line in its output is the runner echoing a test that prints timing figures to stderr, not a failure.
  • Code is formatted: zig fmt --check src/bench.zig exits 0.
  • Linter is clean: zig build rc 0, with no warnings.
  • No banned language patterns: one Zig file edited, no new files.
  • No unsafe blocks without // SAFETY: comments: N/A, no new unsafe code.
  • No banned functions: none added.
  • SPDX license headers present: the file keeps its MPL-2.0 header; no new files.
  • No secrets, credentials, or .env files included.

As Applicable

  • .machine_readable/*.a2ml updated: N/A. A2ML is retired (D308), and project state is otherwise unchanged.
  • Documentation updated: N/A, nothing user-facing changed.
  • TOPOLOGY.md updated: N/A, architecture unchanged.
  • CHANGELOG or release notes updated: N/A; the release notes for v0.5.0 come with the tag.
  • New dependencies reviewed: N/A, none added.
  • ABI/FFI changes validated: no ABI or FFI symbols changed; the edit is confined to the bench executable.

Testing

Run locally with Zig 0.16.0 in ffi/zig/:

  • zig build → rc 0. Before the change: 13 errors, all bench.zig:27:60.
  • zig build bench (the E2E workflow's bench step) → rc 0, ending with "Benchmark complete.".
  • zig build test --summary all → 316/316 tests passed.

docs/AFFIRMATION.adoc is deliberately left untouched. A fixed bench is a new state, so it gets a fresh affirmation against the post-merge anchor, drafted for the owner to sign.

🤖 Generated with Claude Code

https://claude.ai/code/session_019j8She9eTFx54r6aL6sCHP

Zig 0.16's std.Io.Clock has real, awake and boot; .monotonic does not
exist, so zig build failed with 13 errors in src/bench.zig and the E2E
and Bench jobs on main were red. .awake is the monotonic clock that
excludes suspend time, which is what a latency benchmark wants.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019j8She9eTFx54r6aL6sCHP
Signed-off-by: Jonathan D.A. Jewell <6759885+hyperpolymath@users.noreply.github.com>
@coderabbitai

coderabbitai Bot commented Oct 7, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: 99dc6955-0b70-4554-b4e3-86c6b108ed67
📥 Commits

Reviewing files that changed from the base of the PR and between 10f10bf and 74e839d.

📒 Files selected for processing (1)
  • ffi/zig/src/bench.zig

Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.

📜 Recent review details
⏰ Context from checks skipped due to timeout. (17)
  • GitHub Check: Catalogue truthfulness (available ⇒ built + real)
  • GitHub Check: Zig FFI Tests
  • GitHub Check: E2E — Full REST + MCP Bridge
  • GitHub Check: Bench — FFI Catalogue + Mount/Unmount + Hash
  • GitHub Check: Bench — mcp-bridge (path-claims)
  • GitHub Check: Aspect — Thread Safety + ABI Contract + SPDX
  • GitHub Check: E2E — Order Ticket (FFI layer)
  • GitHub Check: semgrep-cloud-platform/scan
  • GitHub Check: Bridge — bun (unit + boot smoke)
  • GitHub Check: Bridge — deno (unit + boot smoke)
  • GitHub Check: governance / Check Workflow Staleness
  • GitHub Check: governance / Workflow security linter
  • GitHub Check: governance / Language / package anti-pattern policy
  • GitHub Check: analyze (javascript-typescript, none)
  • GitHub Check: Idris2 type-check (core + all cartridge ABIs)
  • GitHub Check: Hypatia Neurosymbolic Analysis
  • GitHub Check: SonarQube
⚠️ CI failures not shown inline (17)

GitHub Actions: Build / 0_SonarQube.txt: fix(zig): use the Io awake clock in the bench harness (Zig 0.16)

Conclusion: failure

View job details

##[group]Run SonarSource/sonarqube-scan-action@v8.1.0
 with:
   projectBaseDir: .
   scannerVersion: 8.1.0.6389
   scannerBinariesUrl: https://binaries.sonarsource.com/Distribution/sonar-scanner-cli
   skipSignatureVerification: false
 env:
   SONAR_***REDACTED_SECRET_ASSIGNMENT***
 ##[endgroup]
 Installing Sonar Scanner CLI 8.1.0.6389 for linux-x64...
 Downloading from: https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-8.1.0.6389-linux-x64.zip
 Downloading signature from: https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-8.1.0.6389-linux-x64.zip.asc
 Importing SonarSource public key from hkps://keyserver.ubuntu.com...
 [command]/usr/bin/gpg --homedir /home/runner/work/_temp/gpg-home-1791371375467-2276 --batch --keyserver hkps://keyserver.ubuntu.com --recv-keys 679F1EE92B19609DE816FDE81DB198F93525EC1A
 gpg: keybox '/home/runner/work/_temp/gpg-home-1791371375467-2276/pubring.kbx' created
 gpg: /home/runner/work/_temp/gpg-home-1791371375467-2276/trustdb.gpg: trustdb created
 gpg: key 1DB198F93525EC1A: public key "SonarSource S.A. <infra@sonarsource.com>" imported
 gpg: Total number processed: 1
 gpg:               imported: 1
 Successfully imported key from hkps://keyserver.ubuntu.com
 ✓ SonarSource public key imported successfully
 Verifying GPG signature...
 [command]/usr/bin/gpg --homedir /home/runner/work/_temp/gpg-home-1791371375467-2276 --batch --verify /home/runner/work/_temp/d46d15f4-bb67-451b-bd56-09654f012558 /home/runner/work/_temp/66bed079-25e7-4bb4-a631-24f01062d809
 gpg: Signature made Tue Apr 21 07:20:26 2026 UTC
 gpg:                using RSA key D1436C0DBACEA48702AF97C363F1DD7753B8B315
 gpg: Good signature from "SonarSource S.A. <infra@sonarsource.com>" [unknown]
 gpg: WARNING: This key is not certified with a trusted signature!
 gpg:          There is no indication that the signature belongs to the owner.
 Primary key fingerprint: 679F 1EE9 2B19 609D E816  FDE8 1DB1 98F9 3525 EC1A
   ...

GitHub Actions: Build / SonarQube: fix(zig): use the Io awake clock in the bench harness (Zig 0.16)

Conclusion: failure

View job details

##[group]Run SonarSource/sonarqube-scan-action@v8.1.0
 with:
   projectBaseDir: .
   scannerVersion: 8.1.0.6389
   scannerBinariesUrl: https://binaries.sonarsource.com/Distribution/sonar-scanner-cli
   skipSignatureVerification: false
 env:
   SONAR_***REDACTED_SECRET_ASSIGNMENT***
 ##[endgroup]
 Installing Sonar Scanner CLI 8.1.0.6389 for linux-x64...
 Downloading from: https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-8.1.0.6389-linux-x64.zip
 Downloading signature from: https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-8.1.0.6389-linux-x64.zip.asc
 Importing SonarSource public key from hkps://keyserver.ubuntu.com...
 [command]/usr/bin/gpg --homedir /home/runner/work/_temp/gpg-home-1791371375467-2276 --batch --keyserver hkps://keyserver.ubuntu.com --recv-keys 679F1EE92B19609DE816FDE81DB198F93525EC1A
 gpg: keybox '/home/runner/work/_temp/gpg-home-1791371375467-2276/pubring.kbx' created
 gpg: /home/runner/work/_temp/gpg-home-1791371375467-2276/trustdb.gpg: trustdb created
 gpg: key 1DB198F93525EC1A: public key "SonarSource S.A. <infra@sonarsource.com>" imported
 gpg: Total number processed: 1
 gpg:               imported: 1
 Successfully imported key from hkps://keyserver.ubuntu.com
 ✓ SonarSource public key imported successfully
 Verifying GPG signature...
 [command]/usr/bin/gpg --homedir /home/runner/work/_temp/gpg-home-1791371375467-2276 --batch --verify /home/runner/work/_temp/d46d15f4-bb67-451b-bd56-09654f012558 /home/runner/work/_temp/66bed079-25e7-4bb4-a631-24f01062d809
 gpg: Signature made Tue Apr 21 07:20:26 2026 UTC
 gpg:                using RSA key D1436C0DBACEA48702AF97C363F1DD7753B8B315
 gpg: Good signature from "SonarSource S.A. <infra@sonarsource.com>" [unknown]
 gpg: WARNING: This key is not certified with a trusted signature!
 gpg:          There is no indication that the signature belongs to the owner.
 Primary key fingerprint: 679F 1EE9 2B19 609D E816  FDE8 1DB1 98F9 3525 EC1A
   ...

GitHub Actions: Truthfulness / 0_Catalogue truthfulness (available ⇒ built + real).txt: fix(zig): use the Io awake clock in the bench harness (Zig 0.16)

Conclusion: failure

View job details

##[group]Run bash tests/truthfulness_check.sh --probe
 �[36;1mbash tests/truthfulness_check.sh --probe�[0m
 shell: /usr/bin/bash -e {0}
 env:
   ZIG_GLOBAL_CACHE_DIR: /home/runner/work/boj-server/boj-server/.zig-cache
   ZIG_LOCAL_CACHE_DIR: /home/runner/work/boj-server/boj-server/.zig-cache
 ##[endgroup]
 Building boj-invoke (required for --probe)…
 invoke
 +- install boj-invoke
    +- compile exe boj-invoke Debug x86_64-linux-gnu 1 errors
 src/boj_invoke_cli.zig:45:23: error: root source file struct 'heap' has no member named 'GeneralPurposeAllocator'
     var gpa = std.heap.GeneralPurposeAllocator(.{}){};
               ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
 /home/runner/work/_temp/29160786-0be8-4517-9765-3c54534a11ef/zig-x86_64-linux-0.16.0/lib/std/heap.zig:1:1: note: struct declared here
 const std = @import("std.zig");
 ^~~~~
 referenced by:
     callMain [inlined]: /home/runner/work/_temp/29160786-0be8-4517-9765-3c54534a11ef/zig-x86_64-linux-0.16.0/lib/std/start.zig:698:59
     callMainWithArgs [inlined]: /home/runner/work/_temp/29160786-0be8-4517-9765-3c54534a11ef/zig-x86_64-linux-0.16.0/lib/std/start.zig:638:20
     main: /home/runner/work/_temp/29160786-0be8-4517-9765-3c54534a11ef/zig-x86_64-linux-0.16.0/lib/std/start.zig:663:28
     1 reference(s) hidden; use '-freference-trace=4' to see all references
 error: 1 compilation errors
 failed command: /home/runner/work/_temp/29160786-0be8-4517-9765-3c54534a11ef/zig-x86_64-linux-0.16.0/zig build-exe -ODebug -target x86_64-linux-gnu -mcpu baseline -Mroot=/home/runner/work/boj-server/boj-server/ffi/zig/src/boj_invoke_cli.zig -lc --cache-dir /home/runner/work/boj-server/boj-server/.zig-cache --global-cache-dir /home/runner/work/boj-server/boj-server/.zig-cache --name boj-invoke --zig-lib-dir /home/runner/work/_temp/29160786-0be8-4517-9765-3c54534a11ef/zig-x86_64-linux-0.16.0/lib/ --listen=-
 Build Summary: 0/3 steps succeeded (1 failed)
 invoke transitive failure
 +- install boj-invoke transitive failure
    +- com...

GitHub Actions: Truthfulness / Catalogue truthfulness (available ⇒ built + real): fix(zig): use the Io awake clock in the bench harness (Zig 0.16)

Conclusion: failure

View job details

##[group]Run bash tests/truthfulness_check.sh --probe
 �[36;1mbash tests/truthfulness_check.sh --probe�[0m
 shell: /usr/bin/bash -e {0}
 env:
   ZIG_GLOBAL_CACHE_DIR: /home/runner/work/boj-server/boj-server/.zig-cache
   ZIG_LOCAL_CACHE_DIR: /home/runner/work/boj-server/boj-server/.zig-cache
 ##[endgroup]
 Building boj-invoke (required for --probe)…
 invoke
 +- install boj-invoke
    +- compile exe boj-invoke Debug x86_64-linux-gnu 1 errors
 src/boj_invoke_cli.zig:45:23: error: root source file struct 'heap' has no member named 'GeneralPurposeAllocator'
     var gpa = std.heap.GeneralPurposeAllocator(.{}){};
               ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
 /home/runner/work/_temp/29160786-0be8-4517-9765-3c54534a11ef/zig-x86_64-linux-0.16.0/lib/std/heap.zig:1:1: note: struct declared here
 const std = @import("std.zig");
 ^~~~~
 referenced by:
     callMain [inlined]: /home/runner/work/_temp/29160786-0be8-4517-9765-3c54534a11ef/zig-x86_64-linux-0.16.0/lib/std/start.zig:698:59
     callMainWithArgs [inlined]: /home/runner/work/_temp/29160786-0be8-4517-9765-3c54534a11ef/zig-x86_64-linux-0.16.0/lib/std/start.zig:638:20
     main: /home/runner/work/_temp/29160786-0be8-4517-9765-3c54534a11ef/zig-x86_64-linux-0.16.0/lib/std/start.zig:663:28
     1 reference(s) hidden; use '-freference-trace=4' to see all references
 error: 1 compilation errors
 failed command: /home/runner/work/_temp/29160786-0be8-4517-9765-3c54534a11ef/zig-x86_64-linux-0.16.0/zig build-exe -ODebug -target x86_64-linux-gnu -mcpu baseline -Mroot=/home/runner/work/boj-server/boj-server/ffi/zig/src/boj_invoke_cli.zig -lc --cache-dir /home/runner/work/boj-server/boj-server/.zig-cache --global-cache-dir /home/runner/work/boj-server/boj-server/.zig-cache --name boj-invoke --zig-lib-dir /home/runner/work/_temp/29160786-0be8-4517-9765-3c54534a11ef/zig-x86_64-linux-0.16.0/lib/ --listen=-
 Build Summary: 0/3 steps succeeded (1 failed)
 invoke transitive failure
 +- install boj-invoke transitive failure
    +- com...

GitHub Actions: Governance / 2_governance _ Actions lockfile verify.txt: fix(zig): use the Io awake clock in the bench harness (Zig 0.16)

Conclusion: failure

View job details

##[group]Run set -uo pipefail
 �[36;1mset -uo pipefail�[0m
 �[36;1m# Stage the gate, the verifier and the exemption ledger. When THIS�[0m
 �[36;1m# repository is standards, its own working tree already holds all�[0m
 �[36;1m# three (self-lint); every other caller uses the pinned checkout.�[0m
 �[36;1mif [ "$GITHUB_REPOSITORY" = hyperpolymath/standards ]; then�[0m
 �[36;1m  SRC=scripts�[0m
 �[36;1m  LEDGERSRC=.machine_readable�[0m
 �[36;1m  echo "Using this repository's own gate + verifier + ledger (standards self-lint)."�[0m
 �[36;1melse�[0m
 �[36;1m  SRC=.standards-lock/scripts�[0m
 �[36;1m  LEDGERSRC=.standards-lock/.machine_readable�[0m
 �[36;1mfi�[0m
 �[36;1mfor f in check-actions-lock-gate.sh update-actions-lock.sh; do�[0m
 �[36;1m  if [ ! -f "$SRC/$f" ]; then�[0m
 �[36;1m    echo "::error::actions-lock gate: $f not found in $SRC (pinned standards checkout failed?)"�[0m

GitHub Actions: Governance / governance _ Actions lockfile verify: fix(zig): use the Io awake clock in the bench harness (Zig 0.16)

Conclusion: failure

View job details

##[group]Run set -uo pipefail
 �[36;1mset -uo pipefail�[0m
 �[36;1m# Stage the gate, the verifier and the exemption ledger. When THIS�[0m
 �[36;1m# repository is standards, its own working tree already holds all�[0m
 �[36;1m# three (self-lint); every other caller uses the pinned checkout.�[0m
 �[36;1mif [ "$GITHUB_REPOSITORY" = hyperpolymath/standards ]; then�[0m
 �[36;1m  SRC=scripts�[0m
 �[36;1m  LEDGERSRC=.machine_readable�[0m
 �[36;1m  echo "Using this repository's own gate + verifier + ledger (standards self-lint)."�[0m
 �[36;1melse�[0m
 �[36;1m  SRC=.standards-lock/scripts�[0m
 �[36;1m  LEDGERSRC=.standards-lock/.machine_readable�[0m
 �[36;1mfi�[0m
 �[36;1mfor f in check-actions-lock-gate.sh update-actions-lock.sh; do�[0m
 �[36;1m  if [ ! -f "$SRC/$f" ]; then�[0m
 �[36;1m    echo "::error::actions-lock gate: $f not found in $SRC (pinned standards checkout failed?)"�[0m

GitHub Actions: Governance / 3_governance _ Well-Known (RFC 9116 + RSR).txt: fix(zig): use the Io awake clock in the bench harness (Zig 0.16)

Conclusion: failure

View job details

##[group]Run SECTXT=""
 �[36;1mSECTXT=""�[0m
 �[36;1m[ -f ".well-known/security.txt" ] && SECTXT=".well-known/security.txt"�[0m
 �[36;1m[ -f "security.txt" ] && SECTXT="security.txt"�[0m
 �[36;1mif [ -z "$SECTXT" ]; then�[0m
 �[36;1m  echo "::warning::No security.txt found."�[0m
 �[36;1m  exit 0�[0m
 �[36;1mfi�[0m
 �[36;1mgrep -q "^Contact:" "$SECTXT" || { echo "::error::Missing Contact field"; exit 1; }�[0m

GitHub Actions: Governance / governance _ Well-Known (RFC 9116 + RSR): fix(zig): use the Io awake clock in the bench harness (Zig 0.16)

Conclusion: failure

View job details

##[group]Run SECTXT=""
 �[36;1mSECTXT=""�[0m
 �[36;1m[ -f ".well-known/security.txt" ] && SECTXT=".well-known/security.txt"�[0m
 �[36;1m[ -f "security.txt" ] && SECTXT="security.txt"�[0m
 �[36;1mif [ -z "$SECTXT" ]; then�[0m
 �[36;1m  echo "::warning::No security.txt found."�[0m
 �[36;1m  exit 0�[0m
 �[36;1mfi�[0m
 �[36;1mgrep -q "^Contact:" "$SECTXT" || { echo "::error::Missing Contact field"; exit 1; }�[0m

GitHub Actions: Governance / governance _ Well-Known (RFC 9116 + RSR): fix(zig): use the Io awake clock in the bench harness (Zig 0.16)

Conclusion: failure

View job details

##[group]Run MIXED=$(grep -rE 'src="http://|href="http://' --include="*.html" --include="*.htm" . 2>/dev/null | grep -vE 'localhost|127\.0\.0\.1|example\.com|lol/|node_modules/|third-party/|vendor/' | head -5)
 �[36;1mMIXED=$(grep -rE 'src="http://|href="http://' --include="*.html" --include="*.htm" . 2>/dev/null | grep -vE 'localhost|127\.0\.0\.1|example\.com|lol/|node_modules/|third-party/|vendor/' | head -5)�[0m
 �[36;1mif [ -n "$MIXED" ]; then�[0m
 �[36;1m  echo "::error::Mixed content (HTTP in HTML)"�[0m

GitHub Actions: Governance / 4_governance _ Code quality + docs.txt: fix(zig): use the Io awake clock in the bench harness (Zig 0.16)

Conclusion: failure

View job details

##[group]Run set -eo pipefail
 �[36;1mset -eo pipefail�[0m
 �[36;1m# Arming policy, and the evidence it rests on: standards#991.�[0m
 �[36;1m#�[0m
 �[36;1m#   retired-filename -> BLOCKS. A STABLE predicate:�[0m
 �[36;1m#   the retired `.a2ml` spelling of the launcher standard was�[0m
 �[36;1m#   deleted upstream on 2026-09-22�[0m
 �[36;1m#   (standards#952) and stays deleted, so a caller that is clean�[0m
 �[36;1m#   today cannot become defective without editing the citation�[0m
 �[36;1m#   itself. Measured 2026-09-22 over EVERY clone in the estate --�[0m
 �[36;1m#   595 scanned, 553 carrying an origin/main. 432 reference this�[0m
 �[36;1m#   reusable workflow, but only 12 do so at a MUTABLE ref (@main),�[0m
 �[36;1m#   and a new step reaches ONLY those 12: a caller pinned at a SHA�[0m
 �[36;1m#   freezes this whole file, this step included, so it can never�[0m
 �[36;1m#   receive the step at all. The real gate was run against all 12:�[0m
 �[36;1m#   12/12 rc=0, retired=0. Five slugs do carry the retired literal�[0m
 �[36;1m#   (tma-mark2, canonical-ums, the-nash-equilibrium,�[0m
 �[36;1m#   launch-scaffolder, trigger) and their overlap with the armed 12�[0m
 �[36;1m#   is ZERO -- so arming this tier reds ZERO live callers. A�[0m
 �[36;1m#   known-answer positive control fired (rc=1) on three of those�[0m
 �[36;1m#   defective repos through the identical harness, so the twelve�[0m
 �[36;1m#   zeros are a real measurement and not a broken probe.�[0m
 �[36;1m#�[0m
 �[36;1m#   stale-version -> WARNS, and does not block. A TIME-DEPENDENT�[0m
 �[36;1m#   predicate: the gate compares against its own CURRENT_VERSION, so�[0m
 �[36;1m#   every correctly-citing caller flips to defect the moment the�[0m
 �[36;1m#   standard bumps, having done nothing. A baked-in cutoff DATE does�[0m
 �[36;1m#   not cure that -- the #505 split above can use one because its�[0m
 �[36;1m#   missing-CONTRIBUTING population is static, while this population�[0m
 �[36;1m#   is regenerated at every...

GitHub Actions: Governance / governance _ Code quality + docs: fix(zig): use the Io awake clock in the bench harness (Zig 0.16)

Conclusion: failure

View job details

##[group]Run set -eo pipefail
 �[36;1mset -eo pipefail�[0m
 �[36;1m# Arming policy, and the evidence it rests on: standards#991.�[0m
 �[36;1m#�[0m
 �[36;1m#   retired-filename -> BLOCKS. A STABLE predicate:�[0m
 �[36;1m#   the retired `.a2ml` spelling of the launcher standard was�[0m
 �[36;1m#   deleted upstream on 2026-09-22�[0m
 �[36;1m#   (standards#952) and stays deleted, so a caller that is clean�[0m
 �[36;1m#   today cannot become defective without editing the citation�[0m
 �[36;1m#   itself. Measured 2026-09-22 over EVERY clone in the estate --�[0m
 �[36;1m#   595 scanned, 553 carrying an origin/main. 432 reference this�[0m
 �[36;1m#   reusable workflow, but only 12 do so at a MUTABLE ref (@main),�[0m
 �[36;1m#   and a new step reaches ONLY those 12: a caller pinned at a SHA�[0m
 �[36;1m#   freezes this whole file, this step included, so it can never�[0m
 �[36;1m#   receive the step at all. The real gate was run against all 12:�[0m
 �[36;1m#   12/12 rc=0, retired=0. Five slugs do carry the retired literal�[0m
 �[36;1m#   (tma-mark2, canonical-ums, the-nash-equilibrium,�[0m
 �[36;1m#   launch-scaffolder, trigger) and their overlap with the armed 12�[0m
 �[36;1m#   is ZERO -- so arming this tier reds ZERO live callers. A�[0m
 �[36;1m#   known-answer positive control fired (rc=1) on three of those�[0m
 �[36;1m#   defective repos through the identical harness, so the twelve�[0m
 �[36;1m#   zeros are a real measurement and not a broken probe.�[0m
 �[36;1m#�[0m
 �[36;1m#   stale-version -> WARNS, and does not block. A TIME-DEPENDENT�[0m
 �[36;1m#   predicate: the gate compares against its own CURRENT_VERSION, so�[0m
 �[36;1m#   every correctly-citing caller flips to defect the moment the�[0m
 �[36;1m#   standard bumps, having done nothing. A baked-in cutoff DATE does�[0m
 �[36;1m#   not cure that -- the #505 split above can use one because its�[0m
 �[36;1m#   missing-CONTRIBUTING population is static, while this population�[0m
 �[36;1m#   is regenerated at every...

GitHub Actions: Governance / 6_governance _ Security policy checks.txt: fix(zig): use the Io awake clock in the bench harness (Zig 0.16)

Conclusion: failure

View job details

##[group]Run set -uo pipefail
 �[36;1mset -uo pipefail�[0m
 �[36;1mDIR=.github/canonical-references�[0m
 �[36;1mif [ ! -d "$DIR" ]; then�[0m
 �[36;1m  echo "ℹ️  [R5] no $DIR/ — skipped (repo has not opted in)"�[0m
 �[36;1m  exit 0�[0m
 �[36;1mfi�[0m
 �[36;1m# Rule files are read with yq, never a hand parser (YAML-POLICY Y-1); this�[0m
 �[36;1m# gate previously parsed them with Python, which the estate bans.�[0m
 �[36;1mif ! command -v yq >/dev/null 2>&1 || ! command -v jq >/dev/null 2>&1; then�[0m
 �[36;1m  echo "❌ [R5] yq and jq are required on the runner for YAML rule parsing"�[0m
 �[36;1m  exit 2�[0m
 �[36;1mfi�[0m
 �[36;1mmapfile -t files < <(find "$DIR" -maxdepth 1 -type f \( -name '*.yml' -o -name '*.yaml' \) ! -name '.*' | LC_ALL=C sort)�[0m
 �[36;1mif [ "${#files[@]}" -eq 0 ]; then�[0m
 �[36;1m  echo "ℹ️  [R5] $DIR/ has no .yml/.yaml rules — skipped"�[0m
 �[36;1m  exit 0�[0m
 �[36;1mfi�[0m
 �[36;1m�[0m
 �[36;1merr=$(mktemp)�[0m
 �[36;1mtrap 'rm -f "$err"' EXIT�[0m
 �[36;1mtotal=0�[0m
 �[36;1mfor rf in "${files[@]}"; do�[0m
 �[36;1m  if ! cfg=$(yq -o json '.' "$rf" 2>&1); then�[0m
 �[36;1m    echo "❌ [R5] $rf: not parseable YAML: $cfg"; total=$((total + 1)); continue�[0m
 �[36;1m  fi�[0m
 �[36;1m  if [ "$(jq -r 'type' <<<"$cfg")" != object ]; then�[0m
 �[36;1m    echo "❌ [R5] $rf: top-level must be a mapping"; total=$((total + 1)); continue�[0m
 �[36;1m  fi�[0m
 �[36;1m  rid=$(jq -r --arg b "$(basename "$rf")" 'if has("id") then .id | tostring else $b end' <<<"$cfg")�[0m
 �[36;1m  desc=$(jq -r '.description // ""' <<<"$cfg")�[0m
 �[36;1m  canon=$(jq -r '.canonical_pointer // ""' <<<"$cfg")�[0m
 �[36;1m  mapfile -t pats < <(jq -r '(.patterns // [])[]' <<<"$cfg")�[0m
 �[36;1m  mapfile -t includes < <(jq -r '((.scope // {}).include // [])[]' <<<"$cfg")�[0m
 �[36;1m  if [ "${#pats[@]}" -eq 0 ] || [ "${#includes[@]}" -eq 0 ]; then�[0m
 �[36;1m    echo "❌ [R5:$rid] missing patterns or scope.include in $rf"�[0m
 �[36;1m    total=$((total + 1)); continue�[0m
 �[36...

GitHub Actions: Governance / governance _ Security policy checks: fix(zig): use the Io awake clock in the bench harness (Zig 0.16)

Conclusion: failure

View job details

##[group]Run set -uo pipefail
 �[36;1mset -uo pipefail�[0m
 �[36;1mDIR=.github/canonical-references�[0m
 �[36;1mif [ ! -d "$DIR" ]; then�[0m
 �[36;1m  echo "ℹ️  [R5] no $DIR/ — skipped (repo has not opted in)"�[0m
 �[36;1m  exit 0�[0m
 �[36;1mfi�[0m
 �[36;1m# Rule files are read with yq, never a hand parser (YAML-POLICY Y-1); this�[0m
 �[36;1m# gate previously parsed them with Python, which the estate bans.�[0m
 �[36;1mif ! command -v yq >/dev/null 2>&1 || ! command -v jq >/dev/null 2>&1; then�[0m
 �[36;1m  echo "❌ [R5] yq and jq are required on the runner for YAML rule parsing"�[0m
 �[36;1m  exit 2�[0m
 �[36;1mfi�[0m
 �[36;1mmapfile -t files < <(find "$DIR" -maxdepth 1 -type f \( -name '*.yml' -o -name '*.yaml' \) ! -name '.*' | LC_ALL=C sort)�[0m
 �[36;1mif [ "${#files[@]}" -eq 0 ]; then�[0m
 �[36;1m  echo "ℹ️  [R5] $DIR/ has no .yml/.yaml rules — skipped"�[0m
 �[36;1m  exit 0�[0m
 �[36;1mfi�[0m
 �[36;1m�[0m
 �[36;1merr=$(mktemp)�[0m
 �[36;1mtrap 'rm -f "$err"' EXIT�[0m
 �[36;1mtotal=0�[0m
 �[36;1mfor rf in "${files[@]}"; do�[0m
 �[36;1m  if ! cfg=$(yq -o json '.' "$rf" 2>&1); then�[0m
 �[36;1m    echo "❌ [R5] $rf: not parseable YAML: $cfg"; total=$((total + 1)); continue�[0m
 �[36;1m  fi�[0m
 �[36;1m  if [ "$(jq -r 'type' <<<"$cfg")" != object ]; then�[0m
 �[36;1m    echo "❌ [R5] $rf: top-level must be a mapping"; total=$((total + 1)); continue�[0m
 �[36;1m  fi�[0m
 �[36;1m  rid=$(jq -r --arg b "$(basename "$rf")" 'if has("id") then .id | tostring else $b end' <<<"$cfg")�[0m
 �[36;1m  desc=$(jq -r '.description // ""' <<<"$cfg")�[0m
 �[36;1m  canon=$(jq -r '.canonical_pointer // ""' <<<"$cfg")�[0m
 �[36;1m  mapfile -t pats < <(jq -r '(.patterns // [])[]' <<<"$cfg")�[0m
 �[36;1m  mapfile -t includes < <(jq -r '((.scope // {}).include // [])[]' <<<"$cfg")�[0m
 �[36;1m  if [ "${#pats[@]}" -eq 0 ] || [ "${#includes[@]}" -eq 0 ]; then�[0m
 �[36;1m    echo "❌ [R5:$rid] missing patterns or scope.include in $rf"�[0m
 �[36;1m    total=$((total + 1)); continue�[0m
 �[36...

GitHub Actions: Governance / 11_governance _ Workflow security linter.txt: fix(zig): use the Io awake clock in the bench harness (Zig 0.16)

Conclusion: failure

View job details

##[group]Run # GitHub Actions REJECTS a workflow with duplicate keys: the run is
 �[36;1m# GitHub Actions REJECTS a workflow with duplicate keys: the run is�[0m
 �[36;1m# `failure` with no jobs, no log and no check run. Nothing else here�[0m
 �[36;1m# can see it, because yaml.safe_load silently keeps the LAST�[0m
 �[36;1m# duplicate and reports success — so the file "parses" and every�[0m
 �[36;1m# other lint passes. Measured 2026-08-05: nine workflows in hypatia�[0m
 �[36;1m# were dead this way, including a CodeQL workflow with zero�[0m
 �[36;1m# successful runs in its entire lifetime.�[0m
 �[36;1mset -euo pipefail�[0m
 �[36;1mSCRIPT=".standards-dupkey/scripts/check-workflow-duplicate-keys.sh"�[0m
 �[36;1m# Self-hosting fallback: when THIS repository is standards, its own�[0m
 �[36;1m# working tree already holds the script, and during a rename that copy�[0m
 �[36;1m# is the only correct one — the pinned main checkout still has the old�[0m
 �[36;1m# name. Preferring the fetched copy keeps every other caller on the�[0m
 �[36;1m# canonical version.�[0m
 �[36;1mif [ ! -f "$SCRIPT" ] && [ -f scripts/check-workflow-duplicate-keys.sh ]; then�[0m
 �[36;1m  SCRIPT="scripts/check-workflow-duplicate-keys.sh"�[0m
 �[36;1m  echo "Using this repository's own copy (standards self-lint)."�[0m
 �[36;1mfi�[0m
 �[36;1mif [ ! -f "$SCRIPT" ]; then�[0m
 �[36;1m  echo "::error::duplicate-key checker not found — neither fetched from" \�[0m

GitHub Actions: Governance / governance _ Workflow security linter: fix(zig): use the Io awake clock in the bench harness (Zig 0.16)

Conclusion: failure

View job details

##[group]Run # GitHub Actions REJECTS a workflow with duplicate keys: the run is
 �[36;1m# GitHub Actions REJECTS a workflow with duplicate keys: the run is�[0m
 �[36;1m# `failure` with no jobs, no log and no check run. Nothing else here�[0m
 �[36;1m# can see it, because yaml.safe_load silently keeps the LAST�[0m
 �[36;1m# duplicate and reports success — so the file "parses" and every�[0m
 �[36;1m# other lint passes. Measured 2026-08-05: nine workflows in hypatia�[0m
 �[36;1m# were dead this way, including a CodeQL workflow with zero�[0m
 �[36;1m# successful runs in its entire lifetime.�[0m
 �[36;1mset -euo pipefail�[0m
 �[36;1mSCRIPT=".standards-dupkey/scripts/check-workflow-duplicate-keys.sh"�[0m
 �[36;1m# Self-hosting fallback: when THIS repository is standards, its own�[0m
 �[36;1m# working tree already holds the script, and during a rename that copy�[0m
 �[36;1m# is the only correct one — the pinned main checkout still has the old�[0m
 �[36;1m# name. Preferring the fetched copy keeps every other caller on the�[0m
 �[36;1m# canonical version.�[0m
 �[36;1mif [ ! -f "$SCRIPT" ] && [ -f scripts/check-workflow-duplicate-keys.sh ]; then�[0m
 �[36;1m  SCRIPT="scripts/check-workflow-duplicate-keys.sh"�[0m
 �[36;1m  echo "Using this repository's own copy (standards self-lint)."�[0m
 �[36;1mfi�[0m
 �[36;1mif [ ! -f "$SCRIPT" ]; then�[0m
 �[36;1m  echo "::error::duplicate-key checker not found — neither fetched from" \�[0m

GitHub Actions: Governance / 15_governance _ UUID v7 conformance.txt: fix(zig): use the Io awake clock in the bench harness (Zig 0.16)

Conclusion: failure

View job details

##[group]Run chmod +x .standards-uuid/scripts/check-uuid-v7.sh
 �[36;1mchmod +x .standards-uuid/scripts/check-uuid-v7.sh�[0m
 �[36;1m.standards-uuid/scripts/check-uuid-v7.sh .�[0m
 shell: /usr/bin/bash -e {0}
 ##[endgroup]
 ./.machine_readable/CLADE.a2ml: non-v7 UUID literal (5f5df93b-789d-5ff6-8a44-9dc6ed90a7b1)
 UUID v7 check failed. Use the estate UUID v7 standard and type external/legacy IDs explicitly.
 ##[error]Process completed with exit code 1.

GitHub Actions: Governance / governance _ UUID v7 conformance: fix(zig): use the Io awake clock in the bench harness (Zig 0.16)

Conclusion: failure

View job details

##[group]Run chmod +x .standards-uuid/scripts/check-uuid-v7.sh
 �[36;1mchmod +x .standards-uuid/scripts/check-uuid-v7.sh�[0m
 �[36;1m.standards-uuid/scripts/check-uuid-v7.sh .�[0m
 shell: /usr/bin/bash -e {0}
 ##[endgroup]
 ./.machine_readable/CLADE.a2ml: non-v7 UUID literal (5f5df93b-789d-5ff6-8a44-9dc6ed90a7b1)
 UUID v7 check failed. Use the estate UUID v7 standard and type external/legacy IDs explicitly.
 ##[error]Process completed with exit code 1.
🧰 Additional context used
📚 Code guidelines (1)
.github/copilot-instructions.md — auto-discovered
📓 Path-based instructions (2)
Source excerpt: SPDX: `MPL-2.0` on all new files.

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Files:

  • ffi/zig/src/bench.zig
Source excerpt: FFI implementations in Zig (`ffi/zig/`).

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Files:

  • ffi/zig/src/bench.zig
🔇 Additional comments (1)
ffi/zig/src/bench.zig (1)

26-27: LGTM!

Also applies to: 33-33


📝 Summary

Summary by CodeRabbit

  • Performance
    • Benchmark timings now use the awake clock; warmup and benchmark iterations are unchanged.

Walkthrough

The benchmark function now measures elapsed time with the .awake clock instead of the .monotonic clock. The warmup and benchmark iterations are unchanged.

Changes

Benchmark timing

Layer / File(s) Summary
Benchmark clock selection
ffi/zig/src/bench.zig
The comment and both timestamp calls now use .awake instead of .monotonic.

Priority: ⬇️ Low

Estimated code review effort: 2 (Simple) | ~5 minutes

Change: Bug fix

Merge Risk: ⚪ Minimal · up to 74e83

The benchmark timing change is limited to the intended clock selection; no merge-blocking risk is evident.

Architecture Summary

Architecture risk: 🔵 Low · up to 74e83

The change affects 1 system.

Changed systems: ffi

Architecture concerns
No architecture-level concerns identified.

Review details

Systems and components

  • observed — ffi (service) was modified; 1 changed file maps to changed impact.

Before / after behavior

  • observed — Modified behavior in ffi/zig/src/bench.zig: The clock comment now identifies .awake as the replacement, and both timestamps use .awake instead of .monotonic.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely states the Zig benchmark clock change and the Zig 0.16 context.
Description check ✅ Passed The description covers the purpose, changes, testing results and applicable checklist items. The omitted screenshots section is not applicable to this code change.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 0…
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Commit to this branch
  • Create a new PR
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

A rabbit checks the clock at dawn
The awake ticks carry timing on
Warmups hop along unchanged
The measured loops keep their range
Then off the rabbit bounds to play

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Oct 7, 2026

Copy link
Copy Markdown

🏁 path-claims bench

Commit a3fe4b2

Numbers
path-claims bench  (node v22.23.3)

  scenario                                              iters       ms        ns/op          ops/s
  --------------------------------------------------------------------------------------------------------------
  register: 10 active claims, 3 new paths               50000 iters    188 ms      3.78 µs/op    264.9k ops/s
  register: 100 active claims, 3 new paths              20000 iters    321 ms     16.07 µs/op     62.2k ops/s
  register: 1000 active claims, 3 new paths              5000 iters    953 ms    190.69 µs/op      5.2k ops/s
  register: 100 active claims, 20 new paths              5000 iters    368 ms     73.68 µs/op     13.6k ops/s

  pathsOverlap: deep diverge at segment 4             1000000 iters    154 ms     155.0 ns/op     6.45M ops/s
  pathsOverlap: short prefix match                    1000000 iters    137 ms     137.3 ns/op     7.28M ops/s

  refresh (existing claim)                             100000 iters     11 ms     112.7 ns/op     8.87M ops/s
  list (100 active claims)                              50000 iters    285 ms      5.70 µs/op    175.4k ops/s

  (Bench numbers depend on host; use deltas across commits, not absolute values.)

Host-dependent — compare deltas across commits, not absolute values.

@github-actions

github-actions Bot commented Oct 7, 2026

Copy link
Copy Markdown

🔍 Hypatia Security Scan

Findings: 113 issues detected

Severity Count
🔴 Critical 10
🟠 High 20
🟡 Medium 83

⚠️ Action Required: Critical security issues found!

View findings
[
  {
    "reason": "Job `sonarqube` in build.yml has no `timeout-minutes:` declaration. Default is 6 hours — a stuck codeload fetch or runner hang can burn budget. Add `timeout-minutes: 10` (or proportional).",
    "type": "missing_timeout_minutes",
    "file": ".github/workflows/build.yml",
    "action": "flag",
    "rule_module": "workflow_audit",
    "severity": "medium",
    "recipe_id": "recipe-add-workflow-timeout-minutes",
    "job": "sonarqube"
  },
  {
    "reason": "Job `triage` in label-triage.yml has no `timeout-minutes:` declaration. Default is 6 hours — a stuck codeload fetch or runner hang can burn budget. Add `timeout-minutes: 10` (or proportional).",
    "type": "missing_timeout_minutes",
    "file": ".github/workflows/label-triage.yml",
    "action": "flag",
    "rule_module": "workflow_audit",
    "severity": "medium",
    "recipe_id": "recipe-add-workflow-timeout-minutes",
    "job": "triage"
  },
  {
    "reason": "Job `sync` in labels.yml has no `timeout-minutes:` declaration. Default is 6 hours — a stuck codeload fetch or runner hang can burn budget. Add `timeout-minutes: 10` (or proportional).",
    "type": "missing_timeout_minutes",
    "file": ".github/workflows/labels.yml",
    "action": "flag",
    "rule_module": "workflow_audit",
    "severity": "medium",
    "recipe_id": "recipe-add-workflow-timeout-minutes",
    "job": "sync"
  },
  {
    "reason": "Job `deploy` in pages-deploy.yml has no `timeout-minutes:` declaration. Default is 6 hours — a stuck codeload fetch or runner hang can burn budget. Add `timeout-minutes: 10` (or proportional).",
    "type": "missing_timeout_minutes",
    "file": ".github/workflows/pages-deploy.yml",
    "action": "flag",
    "rule_module": "workflow_audit",
    "severity": "medium",
    "recipe_id": "recipe-add-workflow-timeout-minutes",
    "job": "deploy"
  },
  {
    "reason": "Step uses `peter-evans/repository-dispatch` with `token: ${{ secrets.FARM_DISPATCH_TOKEN }}` but has no `if: secrets.FARM_DISPATCH_TOKEN != ''` gate. On repos where the secret hasn't been propagated the action fails on every push, red-maining the repo. Add the step-level gate (or env+if pattern) so the missing-secret path is a clean skip instead of a red.",
    "type": "secret_action_without_presence_gate",
    "file": ".github/workflows/instant-sync.yml",
    "action": "peter-evans/repository-dispatch",
    "rule_module": "workflow_audit",
    "severity": "high",
    "fix_recipe": "add_secret_presence_gate"
  },
  {
    "reason": "codeql.yml does not list `language: actions` in its matrix, but the repo has workflow files. CodeQL's `actions` language scans workflow YAML for injection and other CI/CD-specific weaknesses — every repo with workflows benefits. Add an entry to `matrix.include` with `language: actions` + `build-mode: none`.",
    "type": "codeql_missing_actions_language",
    "file": ".github/workflows/codeql.yml",
    "action": "flag",
    "rule_module": "workflow_audit",
    "severity": "medium",
    "fix_recipe": "add_codeql_actions_language"
  },
  {
    "line": 39,
    "reason": "job in .github/workflows/labels.yml references `secrets.*` but does not install `step-security/harden-runner` — review outbound-egress monitoring",
    "type": "RE001",
    "file": ".github/workflows/labels.yml",
    "action": "report",
    "rule_module": "research_extensions",
    "severity": "medium"
  },
  {
    "line": 46,
    "reason": "job in .github/workflows/push-email-notify.yml references `secrets.*` but does not install `step-security/harden-runner` — review outbound-egress monitoring",
    "type": "RE001",
    "file": ".github/workflows/push-email-notify.yml",
    "action": "report",
    "rule_module": "research_extensions",
    "severity": "medium"
  },
  {
    "line": 32,
    "reason": "job in .github/workflows/build.yml references `secrets.*` but does not install `step-security/harden-runner` — review outbound-egress monitoring",
    "type": "RE001",
    "file": ".github/workflows/build.yml",
    "action": "report",
    "rule_module": "research_extensions",
    "severity": "medium"
  },
  {
    "line": 44,
    "reason": "job in .github/workflows/container-publish.yml references `secrets.*` but does not install `step-security/harden-runner` — review outbound-egress monitoring",
    "type": "RE001",
    "file": ".github/workflows/container-publish.yml",
    "action": "report",
    "rule_module": "research_extensions",
    "severity": "medium"
  }
]

Powered by Hypatia Neurosymbolic CI/CD Intelligence

@hyperpolymath
hyperpolymath merged commit 8b62444 into main Oct 7, 2026
56 of 60 checks passed
@hyperpolymath
hyperpolymath deleted the fix/zig-bench-0.16 branch October 7, 2026 11:15
hyperpolymath added a commit that referenced this pull request Oct 7, 2026
## Summary

Follow-up to #354 (the bench). Zig 0.16 also removed
`std.heap.GeneralPurposeAllocator` and `std.process.argsAlloc`. Because
of that, `zig build invoke` fails with `src/boj_invoke_cli.zig:45:23:
error: root source file struct 'heap' has no member named
'GeneralPurposeAllocator'`. That takes down **E2E — Full REST + MCP
Bridge**, which is red on main, and the **Catalogue truthfulness**
`--probe` job. Plain `zig build` never builds the `invoke` step, which
is why the local check on #354 missed it.

## Changes

- `ffi/zig/src/boj_invoke_cli.zig`: `main` now takes `std.process.Init`
and uses `init.gpa`, `init.io`, and `init.minimal.args.toSlice(arena)`.
stdout/stderr are `std.Io.File`, written with `writeStreamingAll(io,
…)`. `emitJson` threads `io` through.
- Docstrings added on `main` and `emitJson` (§5d).
- `zig fmt` applied. The file was already failing `zig fmt --check` on
main.

## Type of change

Bug fix (build break under the pinned Zig 0.16.0 toolchain). No
behaviour change: the verbs, JSON output and exit codes are the same.

## 📌 New pins

Head SHA: **cfe598951808d75f8268f122e275cb7a31efc6e5**. No action,
lockfile or container pins are added or changed.

## RSR Quality Checklist

### Required

- [x] Tests pass: `zig build test --summary all` reports 41/41 steps
succeeded and 316/316 tests passed.
- [x] Code is formatted: `zig fmt --check
ffi/zig/src/boj_invoke_cli.zig` rc 0.
- [x] Linter is clean: zig compile has no warnings. The repo has no
separate Zig linter.
- [x] No banned language patterns: Zig only.
- [x] No `unsafe` blocks without `// SAFETY:` comments. Not applicable:
Zig, and no new unsafe constructs.
- [x] No banned functions.
- [x] SPDX license headers: the existing MPL-2.0 header is unchanged.
- [x] No secrets, credentials, or `.env` files.

### As Applicable

- [ ] `.machine_readable/*` updates. Not applicable: no project-state
change. A2ML is retired estate-wide (D308).
- [ ] Documentation. Not applicable: the CLI usage is unchanged.
- [ ] `TOPOLOGY.md`. Not applicable.
- [ ] CHANGELOG. Not applicable: an internal build fix, covered by the
v0.5.0 release notes.
- [ ] New dependencies. Not applicable: none.
- [x] ABI/FFI consistency: the five-symbol ADR-0006 calls are unchanged.
The fixture cartridge probe passes.

## Testing

Run locally with Zig 0.16.0:
- `zig build invoke`: rc 0 (it failed on main).
- `boj-invoke libfeedback_mcp.so probe` printed
`{"ok":true,"name":"feedback-mcp","version":"0.1.0"}` with rc 0. The
error paths were also checked: no args gives rc 2, a missing .so gives
`FileNotFound` with rc 3, and an unknown verb gives rc 2.
- `bash tests/truthfulness_check.sh --probe`: `truthfulness: OK — 23
cartridges checked (probe=1)`.
- `zig build test`: 316/316 tests pass.

## Pre-existing red checks (deferred, not introduced here)

- `SonarQube`: red on main, tracked in #338.
- `governance / UUID v7 conformance`: red on main, tracked in #347.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_019j8She9eTFx54r6aL6sCHP

Signed-off-by: Jonathan D.A. Jewell <6759885+hyperpolymath@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
hyperpolymath added a commit that referenced this pull request Oct 7, 2026
…-empty (#356)

## Summary

This is the last red check on the Zig 0.16 path (#354 bench, #355 invoke
CLI). With #355 merged, **E2E — Full REST + MCP Bridge** builds and
runs: 38 of 39 pass. The one failure is `teranga tier has cartridges
(expected '1', got '0')`. The bundled `cartridges/` tree was retired, so
the E2E catalogue is now `tests/fixtures/cartridges`, and all 23 of its
manifests declare `"tier": "Ayo"`. The assertion can never pass against
that catalogue, so this is a stale test rather than a defect in the
menu.

## Changes

- `tests/e2e_full.sh` Step 3: the "Teranga is non-empty" check is
replaced by:
- for each tier (teranga, shield, ayo), the menu count equals the number
of manifests under `$BOJ_CARTRIDGES_PATH` declaring that tier
(case-folded, matching `router.ex`);
- `tier_teranga + tier_shield + tier_ayo == summary.total`, so no
cartridge can silently fall outside the three tiers.
- The new assertions don't assume any tier is non-empty. Tier
assignments are being re-audited under the trust-tier ruling, so adding
a fake Teranga fixture would have pre-empted that work.

## Type of change

Test fix. No production code changes.

## 📌 New pins

Head SHA: **7c192f068f9b20d5e70fd722ebe6bc3d1f41f98b**. No action,
lockfile or container pins are added or changed.

## RSR Quality Checklist

### Required

- [x] Tests pass: `bash tests/e2e_full.sh` locally reports `Results: 42
passed, 0 failed, 0 skipped (of 42)` with rc 0.
- [x] Code is formatted: `bash -n tests/e2e_full.sh` reports no syntax
errors. The repo has no shell formatter gate.
- [x] Linter is clean: no new warnings.
- [x] No banned language patterns: shell and jq only.
- [x] No `unsafe` blocks. Not applicable.
- [x] No banned functions.
- [x] SPDX headers: the existing header is unchanged.
- [x] No secrets.

### As Applicable

- [ ] `.machine_readable/*`. Not applicable: A2ML is retired (D308).
- [ ] Documentation, TOPOLOGY, CHANGELOG. Not applicable: test-only
change.
- [ ] New dependencies. Not applicable: `jq` is already installed by the
workflow.
- [ ] ABI/FFI. Not applicable.

## Testing

- Full suite locally on Zig 0.16.0 and the Elixir backend: 42/42 pass.
The new checks report teranga 0, shield 0, ayo 23, total 23.
- Mutant controls, run on the new block in isolation against the real
fixtures:
  - correct menu: 4/4 pass;
- one cartridge dropped from `tier_ayo`: 2 fail (the ayo count and the
total);
- a cartridge in the wrong tier: 2 fail (the teranga count and the ayo
count).

## Pre-existing red checks (deferred, not introduced here)

- `SonarQube`: red on main, tracked in #338.
- `governance / UUID v7 conformance`: red on main, tracked in #347.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_019j8She9eTFx54r6aL6sCHP

Signed-off-by: Jonathan D.A. Jewell <6759885+hyperpolymath@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant