Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 12 additions & 15 deletions batten.toml
Original file line number Diff line number Diff line change
Expand Up @@ -491,17 +491,13 @@ spent by then."""
# command free of double quotes, which is what lets it be a plain TOML string
# with no escaping — one fewer way to retype a CLOUD-990-shaped remedy wrong.
#
# WHAT THIS FACT DOES NOT BIND, stated because the gate must not over-claim:
# **the record is not tied to the head it was taken on.** `facts::sourced_path`
# keys an agent-sourced record by the fact's NAME only, and its own doc says why
# — a `claimed-key` answer is about an issue row and is deliberately shared
# across branches. So `key = "head"` below is accepted and unread on this path,
# and it is measured rather than inferred: a record minted clear on one head
# still allowed `gh pr ready` on the next commit with no new record. The gate
# therefore binds once per branch rather than once per head, which is strictly
# better than today's nothing and weaker than the row's Acceptance. Fixing it
# changes the channel for every fact and contradicts a documented decision, so
# it is CLOUD-1064's rather than smuggled in here.
# WHAT THIS FACT BINDS, and it is the head rather than the branch. The record is
# filed under the subject `key = "head"` names below, so a commit pushed after a
# clear answer leaves the record under the previous head and the next `gh pr
# ready` is refused. That was NOT true when this row landed — `sourced_path` keyed
# on the fact's name alone, so the column was accepted and unread and the gate
# bound once per branch — and the limitation comment that stood here is deleted in
# the change that removed it (CLOUD-859).
[[fact]]
name = "review-answered"
returns = "json-array"
Expand All @@ -518,10 +514,11 @@ command = "gh api graphql -F id=$(gh pr view --json id --jq .id) -f query='query
# command rather than from prose. The module decides the COUNT and stays silent
# about absence, so one call never draws two refusals.
#
# `key = "head"` because an agent-sourced record is resolved from its own file
# rather than from the receipt store, so the keying is unread on this path — the
# column is required by `rules::validate` and `head` is the honest answer for a
# fact about a specific head.
# `key = "head"` and it DECIDES (CLOUD-859): an agent-sourced record is resolved
# from its own file rather than from the receipt store, and that file is named for
# the subject this column resolves to. `head` is the honest answer for a fact
# about a specific head — a review is of one set of bytes — and `branch` is what a
# fact about the WORK takes, which is why `claim-needs-receipt` below takes it.
[[rule]]
id = "ready-needs-an-answered-review"
kind = "receipt"
Expand Down
281 changes: 141 additions & 140 deletions bench/suites/RESULTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,167 +6,168 @@ runner measured it; the suite runs `--no-parallelize-within-files`, so a
file's number is its own serial cost and is what an author adding a case
to it pays.

- suites: 159
- serial total: 1382.6s
- suites: 160
- serial total: 1088.8s

| seconds | share | suite |
| ---: | ---: | --- |
| 158.4 | 11.5% | `tests/derived-check.bats` |
| 153.1 | 11.1% | `tests/land-lock.bats` |
| 105.9 | 7.7% | `tests/session-start.bats` |
| 102.6 | 7.4% | `tests/ci-wait.bats` |
| 95.7 | 6.9% | `tests/land.bats` |
| 77.0 | 5.6% | `tests/hooks-wiring-check.bats` |
| 50.1 | 3.6% | `tests/ci-local-parity.bats` |
| 38.5 | 2.8% | `tests/prebuilt-lint.bats` |
| 36.1 | 2.6% | `tests/helpers.bats` |
| 34.6 | 2.5% | `tests/main-watch.bats` |
| 28.2 | 2.0% | `tests/commit-convention.bats` |
| 24.7 | 1.8% | `tests/sbom-check.bats` |
| 24.4 | 1.8% | `tests/hook-latency-drift.bats` |
| 22.8 | 1.6% | `tests/graph-check.bats` |
| 21.4 | 1.6% | `tests/claim-check.bats` |
| 19.7 | 1.4% | `tests/config-deprecations.bats` |
| 17.6 | 1.3% | `tests/token-bench.bats` |
| 17.5 | 1.3% | `tests/board-diff-overlap.bats` |
| 16.8 | 1.2% | `tests/board-write-record.bats` |
| 15.3 | 1.1% | `tests/config-lint.bats` |
| 11.8 | 0.9% | `tests/run-shape-guard.bats` |
| 9.5 | 0.7% | `tests/filed-here-check.bats` |
| 9.5 | 0.7% | `tests/ready-lint.bats` |
| 9.5 | 0.7% | `tests/board-sweep.bats` |
| 9.0 | 0.6% | `tests/target-race.bats` |
| 8.9 | 0.6% | `tests/renovate-config-validator.bats` |
| 8.8 | 0.6% | `tests/replay.bats` |
| 8.6 | 0.6% | `tests/stop-guard.bats` |
| 8.5 | 0.6% | `tests/released.bats` |
| 8.3 | 0.6% | `tests/mutant.bats` |
| 7.6 | 0.6% | `tests/ready-guard.bats` |
| 7.0 | 0.5% | `tests/reference-check.bats` |
| 6.8 | 0.5% | `tests/lock-complete.bats` |
| 6.5 | 0.5% | `tests/release-tracking-check.bats` |
| 6.4 | 0.5% | `tests/sbom.bats` |
| 6.2 | 0.5% | `tests/mcp-allow-check.bats` |
| 6.2 | 0.4% | `tests/step-receipt.bats` |
| 5.8 | 0.4% | `tests/task-registry.bats` |
| 5.4 | 0.4% | `tests/in-progress-drain.bats` |
| 5.2 | 0.4% | `tests/schema-check.bats` |
| 5.0 | 0.4% | `tests/release-assets-check.bats` |
| 4.7 | 0.3% | `tests/hk-selection.bats` |
| 4.6 | 0.3% | `tests/singleton.bats` |
| 4.6 | 0.3% | `tests/ready-cites-check.bats` |
| 4.5 | 0.3% | `tests/land-divergence.bats` |
| 4.4 | 0.3% | `tests/ntia-check.bats` |
| 4.2 | 0.3% | `tests/target-ensure.bats` |
| 4.1 | 0.3% | `tests/rules-drift.bats` |
| 3.8 | 0.3% | `tests/suite-select.bats` |
| 3.7 | 0.3% | `tests/doctor-race.bats` |
| 3.6 | 0.3% | `tests/semver.bats` |
| 3.6 | 0.3% | `tests/pre-commit-staging.bats` |
| 3.4 | 0.2% | `tests/landed-check.bats` |
| 3.1 | 0.2% | `tests/with-lock.bats` |
| 3.0 | 0.2% | `tests/closing-key-check.bats` |
| 2.8 | 0.2% | `tests/unlanded-check.bats` |
| 2.7 | 0.2% | `tests/claim-race-check.bats` |
| 2.7 | 0.2% | `tests/tree-clean.bats` |
| 2.6 | 0.2% | `tests/review-answered.bats` |
| 2.5 | 0.2% | `tests/skill-check.bats` |
| 2.5 | 0.2% | `tests/target-prune.bats` |
| 2.4 | 0.2% | `tests/finding-sink-check.bats` |
| 2.4 | 0.2% | `tests/timeout-drift.bats` |
| 2.3 | 0.2% | `tests/spec-ref-check.bats` |
| 2.3 | 0.2% | `tests/ci-tools-check.bats` |
| 2.2 | 0.2% | `tests/signing-posture.bats` |
| 2.2 | 0.2% | `tests/bot-issue.bats` |
| 143.4 | 13.2% | `tests/land-lock.bats` |
| 122.0 | 11.2% | `tests/derived-check.bats` |
| 102.4 | 9.4% | `tests/ci-wait.bats` |
| 92.5 | 8.5% | `tests/land.bats` |
| 59.8 | 5.5% | `tests/hooks-wiring-check.bats` |
| 43.5 | 4.0% | `tests/ci-local-parity.bats` |
| 34.8 | 3.2% | `tests/main-watch.bats` |
| 26.2 | 2.4% | `tests/helpers.bats` |
| 24.3 | 2.2% | `tests/hook-latency-drift.bats` |
| 22.3 | 2.0% | `tests/sbom-check.bats` |
| 20.8 | 1.9% | `tests/graph-check.bats` |
| 19.2 | 1.8% | `tests/claim-check.bats` |
| 19.0 | 1.7% | `tests/prebuilt-lint.bats` |
| 15.8 | 1.5% | `tests/board-diff-overlap.bats` |
| 15.1 | 1.4% | `tests/board-write-record.bats` |
| 12.0 | 1.1% | `tests/config-lint.bats` |
| 10.4 | 1.0% | `tests/token-bench.bats` |
| 9.7 | 0.9% | `tests/run-shape-guard.bats` |
| 9.5 | 0.9% | `tests/ready-lint.bats` |
| 9.4 | 0.9% | `tests/target-race.bats` |
| 9.3 | 0.9% | `tests/released.bats` |
| 8.8 | 0.8% | `tests/filed-here-check.bats` |
| 8.5 | 0.8% | `tests/board-sweep.bats` |
| 8.2 | 0.8% | `tests/stop-guard.bats` |
| 7.6 | 0.7% | `tests/renovate-config-validator.bats` |
| 7.5 | 0.7% | `tests/release-tracking-check.bats` |
| 7.1 | 0.7% | `tests/mutant.bats` |
| 7.1 | 0.7% | `tests/ready-guard.bats` |
| 7.0 | 0.6% | `tests/step-receipt.bats` |
| 7.0 | 0.6% | `tests/mcp-allow-check.bats` |
| 6.7 | 0.6% | `tests/session-start.bats` |
| 6.2 | 0.6% | `tests/lock-complete.bats` |
| 6.2 | 0.6% | `tests/replay.bats` |
| 5.5 | 0.5% | `tests/sbom.bats` |
| 5.4 | 0.5% | `tests/release-assets-check.bats` |
| 5.3 | 0.5% | `tests/singleton.bats` |
| 5.3 | 0.5% | `tests/in-progress-drain.bats` |
| 5.2 | 0.5% | `tests/semver.bats` |
| 4.7 | 0.4% | `tests/land-divergence.bats` |
| 4.5 | 0.4% | `tests/schema-check.bats` |
| 4.5 | 0.4% | `tests/pre-commit-staging.bats` |
| 4.4 | 0.4% | `tests/task-registry.bats` |
| 4.3 | 0.4% | `tests/ready-cites-check.bats` |
| 4.1 | 0.4% | `tests/ntia-check.bats` |
| 3.8 | 0.3% | `tests/doctor-race.bats` |
| 3.6 | 0.3% | `tests/target-ensure.bats` |
| 3.6 | 0.3% | `tests/reference-check.bats` |
| 3.4 | 0.3% | `tests/hk-selection.bats` |
| 3.2 | 0.3% | `tests/with-lock.bats` |
| 3.0 | 0.3% | `tests/suite-select.bats` |
| 2.8 | 0.3% | `tests/skill-check.bats` |
| 2.7 | 0.2% | `tests/landed-check.bats` |
| 2.7 | 0.2% | `tests/rules-drift.bats` |
| 2.5 | 0.2% | `tests/config-deprecations.bats` |
| 2.5 | 0.2% | `tests/closing-key-check.bats` |
| 2.4 | 0.2% | `tests/spec-ref-check.bats` |
| 2.3 | 0.2% | `tests/signing-posture.bats` |
| 2.2 | 0.2% | `tests/claim-race-check.bats` |
| 2.2 | 0.2% | `tests/alive.bats` |
| 2.1 | 0.1% | `tests/claimed-keys.bats` |
| 2.0 | 0.1% | `tests/ci-slow-needed.bats` |
| 1.9 | 0.1% | `tests/run-shape.bats` |
| 1.8 | 0.1% | `tests/reclaim-census.bats` |
| 1.7 | 0.1% | `tests/ci-lease-precondition.bats` |
| 1.7 | 0.1% | `tests/awk-regex-check.bats` |
| 1.7 | 0.1% | `tests/ready-lint-deferral.bats` |
| 1.7 | 0.1% | `tests/verify.bats` |
| 1.7 | 0.1% | `tests/memories-check.bats` |
| 1.5 | 0.1% | `tests/mutant-census.bats` |
| 1.5 | 0.1% | `tests/spawn-census.bats` |
| 1.4 | 0.1% | `tests/perf-record.bats` |
| 2.2 | 0.2% | `tests/unlanded-check.bats` |
| 2.1 | 0.2% | `tests/finding-sink-check.bats` |
| 2.1 | 0.2% | `tests/bot-issue.bats` |
| 2.1 | 0.2% | `tests/ci-tools-check.bats` |
| 1.9 | 0.2% | `tests/ci-slow-needed.bats` |
| 1.9 | 0.2% | `tests/reclaim-census.bats` |
| 1.9 | 0.2% | `tests/verify.bats` |
| 1.8 | 0.2% | `tests/review-answered.bats` |
| 1.8 | 0.2% | `tests/claimed-keys.bats` |
| 1.8 | 0.2% | `tests/ci-lease-precondition.bats` |
| 1.7 | 0.2% | `tests/tree-clean.bats` |
| 1.7 | 0.2% | `tests/land-divergence-assert.bats` |
| 1.7 | 0.2% | `tests/awk-regex-check.bats` |
| 1.6 | 0.1% | `tests/spawn-census.bats` |
| 1.6 | 0.1% | `tests/install-check.bats` |
| 1.6 | 0.1% | `tests/mutant-census.bats` |
| 1.6 | 0.1% | `tests/ready-lint-deferral.bats` |
| 1.5 | 0.1% | `tests/memories-check.bats` |
| 1.5 | 0.1% | `tests/run-shape.bats` |
| 1.4 | 0.1% | `tests/deferral-check.bats` |
| 1.3 | 0.1% | `tests/land-divergence-assert.bats` |
| 1.3 | 0.1% | `tests/done-check.bats` |
| 1.3 | 0.1% | `tests/install-check.bats` |
| 1.3 | 0.1% | `tests/linear-check.bats` |
| 1.3 | 0.1% | `tests/nonverdict-scan.bats` |
| 1.3 | 0.1% | `tests/suite-bench-check.bats` |
| 1.3 | 0.1% | `tests/perf-record.bats` |
| 1.3 | 0.1% | `tests/release-backfill.bats` |
| 1.2 | 0.1% | `tests/linear-check.bats` |
| 1.2 | 0.1% | `tests/attestation-check.bats` |
| 1.2 | 0.1% | `tests/checks-green.bats` |
| 1.2 | 0.1% | `tests/perf-assert.bats` |
| 1.1 | 0.1% | `tests/release-backfill.bats` |
| 1.1 | 0.1% | `tests/gh-guard.bats` |
| 1.1 | 0.1% | `tests/transcript-corpus-check.bats` |
| 1.1 | 0.1% | `tests/done-pr-check.bats` |
| 1.1 | 0.1% | `tests/lint-deno.bats` |
| 1.0 | 0.1% | `tests/prose-only-check.bats` |
| 1.0 | 0.1% | `tests/sbom-binary.bats` |
| 1.0 | 0.1% | `tests/module-map-check.bats` |
| 1.0 | 0.1% | `tests/doctor.bats` |
| 1.0 | 0.1% | `tests/verified.bats` |
| 1.0 | 0.1% | `tests/render-cli.bats` |
| 0.9 | 0.1% | `tests/pr-unsubscribed.bats` |
| 0.9 | 0.1% | `tests/evaluator-closure-check.bats` |
| 0.9 | 0.1% | `tests/hook-matcher-check.bats` |
| 0.9 | 0.1% | `tests/suite-bench-check.bats` |
| 1.2 | 0.1% | `tests/nonverdict-scan.bats` |
| 1.1 | 0.1% | `tests/target-prune.bats` |
| 1.1 | 0.1% | `tests/perf-assert.bats` |
| 1.0 | 0.1% | `tests/pr-unsubscribed.bats` |
| 1.0 | 0.1% | `tests/checks-green.bats` |
| 1.0 | 0.1% | `tests/gh-guard.bats` |
| 0.9 | 0.1% | `tests/prose-only-check.bats` |
| 0.9 | 0.1% | `tests/lint-deno.bats` |
| 0.9 | 0.1% | `tests/module-map-check.bats` |
| 0.9 | 0.1% | `tests/render-cli.bats` |
| 0.9 | 0.1% | `tests/timeout-drift.bats` |
| 0.9 | 0.1% | `tests/doctor.bats` |
| 0.9 | 0.1% | `tests/done-pr-check.bats` |
| 0.8 | 0.1% | `tests/install.bats` |
| 0.8 | 0.1% | `tests/stop-posture-check.bats` |
| 0.8 | 0.1% | `tests/perf-compare.bats` |
| 0.8 | 0.1% | `tests/sbom-binary.bats` |
| 0.8 | 0.1% | `tests/duplicate-close-check.bats` |
| 0.8 | 0.1% | `tests/mcp-attach-check.bats` |
| 0.8 | 0.1% | `tests/timeout-check.bats` |
| 0.8 | 0.1% | `tests/mcp-timeout-budget.bats` |
| 0.8 | 0.1% | `tests/merged-pr-keys.bats` |
| 0.8 | 0.1% | `tests/hook-profile-check.bats` |
| 0.8 | 0.1% | `tests/lint-rego.bats` |
| 0.8 | 0.1% | `tests/install.bats` |
| 0.8 | 0.1% | `tests/verified.bats` |
| 0.8 | 0.1% | `tests/fact-record-keying.bats` |
| 0.8 | 0.1% | `tests/checksums.bats` |
| 0.7 | 0.1% | `tests/hook-pin-check.bats` |
| 0.7 | 0.1% | `tests/publish-credential-check.bats` |
| 0.7 | 0.1% | `tests/run-shape-guard-quoting.bats` |
| 0.7 | 0.0% | `tests/branch-age-check.bats` |
| 0.7 | 0.0% | `tests/macos-link-check.bats` |
| 0.6 | 0.0% | `tests/board-payloads.bats` |
| 0.6 | 0.0% | `tests/abandon-matrix.bats` |
| 0.6 | 0.0% | `tests/sonar-gate.bats` |
| 0.6 | 0.0% | `tests/pipefail-grep-check.bats` |
| 0.6 | 0.0% | `tests/land-lock-check.bats` |
| 0.6 | 0.0% | `tests/msrv-pin-agreement.bats` |
| 0.5 | 0.0% | `tests/report-only-check.bats` |
| 0.5 | 0.0% | `tests/digest-major-agreement.bats` |
| 0.5 | 0.0% | `tests/batten-glob-check.bats` |
| 0.8 | 0.1% | `tests/sonar-gate.bats` |
| 0.7 | 0.1% | `tests/perf-compare.bats` |
| 0.7 | 0.1% | `tests/merged-pr-keys.bats` |
| 0.7 | 0.1% | `tests/hook-matcher-check.bats` |
| 0.7 | 0.1% | `tests/mcp-timeout-budget.bats` |
| 0.7 | 0.1% | `tests/evaluator-closure-check.bats` |
| 0.7 | 0.1% | `tests/lint-rego.bats` |
| 0.7 | 0.1% | `tests/mcp-attach-check.bats` |
| 0.6 | 0.1% | `tests/publish-credential-check.bats` |
| 0.6 | 0.1% | `tests/hook-profile-check.bats` |
| 0.6 | 0.1% | `tests/pipefail-grep-check.bats` |
| 0.6 | 0.1% | `tests/msrv-pin-agreement.bats` |
| 0.6 | 0.1% | `tests/hook-pin-check.bats` |
| 0.6 | 0.1% | `tests/board-payloads.bats` |
| 0.6 | 0.1% | `tests/abandon-matrix.bats` |
| 0.5 | 0.0% | `tests/connector-allow-guard.bats` |
| 0.5 | 0.0% | `tests/pkl-check.bats` |
| 0.5 | 0.0% | `tests/token-bench-check.bats` |
| 0.5 | 0.0% | `tests/branch-age-check.bats` |
| 0.5 | 0.0% | `tests/macos-link-check.bats` |
| 0.5 | 0.0% | `tests/digest-major-agreement.bats` |
| 0.5 | 0.0% | `tests/transcript-corpus-check.bats` |
| 0.5 | 0.0% | `tests/land-lock-check.bats` |
| 0.5 | 0.0% | `tests/run-shape-guard-quoting.bats` |
| 0.5 | 0.0% | `tests/serena-mcp.bats` |
| 0.5 | 0.0% | `tests/cap-drift.bats` |
| 0.4 | 0.0% | `tests/privileged-lane.bats` |
| 0.4 | 0.0% | `tests/license-table-check.bats` |
| 0.4 | 0.0% | `tests/commit-attribution.bats` |
| 0.4 | 0.0% | `tests/timeout-check.bats` |
| 0.4 | 0.0% | `tests/batten-glob-check.bats` |
| 0.4 | 0.0% | `tests/release-due.bats` |
| 0.4 | 0.0% | `tests/test-bats-parallel.bats` |
| 0.4 | 0.0% | `tests/ci-drift.bats` |
| 0.4 | 0.0% | `tests/nonverdict-assert.bats` |
| 0.4 | 0.0% | `tests/pkl-check.bats` |
| 0.4 | 0.0% | `tests/no-doctests.bats` |
| 0.4 | 0.0% | `tests/cap-drift.bats` |
| 0.4 | 0.0% | `tests/license-table-check.bats` |
| 0.4 | 0.0% | `tests/mise-pin-agreement.bats` |
| 0.4 | 0.0% | `tests/report-only-check.bats` |
| 0.4 | 0.0% | `tests/ci-drift.bats` |
| 0.4 | 0.0% | `tests/container-preflight.bats` |
| 0.4 | 0.0% | `tests/coderabbit-config-check.bats` |
| 0.3 | 0.0% | `tests/mise-pin-agreement.bats` |
| 0.3 | 0.0% | `tests/privileged-lane.bats` |
| 0.3 | 0.0% | `tests/commit-attribution.bats` |
| 0.3 | 0.0% | `tests/connector-allow-resolve.bats` |
| 0.3 | 0.0% | `tests/rust-paths-check.bats` |
| 0.3 | 0.0% | `tests/task-fail-closed.bats` |
| 0.3 | 0.0% | `tests/mise-action-floor.bats` |
| 0.3 | 0.0% | `tests/commit-convention.bats` |
| 0.3 | 0.0% | `tests/coderabbit-config-check.bats` |
| 0.3 | 0.0% | `tests/git-hook.bats` |
| 0.2 | 0.0% | `tests/perf-gate.bats` |
| 0.2 | 0.0% | `tests/rust-paths-check.bats` |
| 0.2 | 0.0% | `tests/remedy-payload-source.bats` |
| 0.2 | 0.0% | `tests/mise-action-floor.bats` |
| 0.2 | 0.0% | `tests/perf-gate.bats` |
| 0.2 | 0.0% | `tests/token-bench-check.bats` |
| 0.2 | 0.0% | `tests/task-fail-closed.bats` |
| 0.2 | 0.0% | `tests/dist.bats` |
| 0.2 | 0.0% | `tests/test-bats-parallel.bats` |
| 0.1 | 0.0% | `tests/evaluator-io-check.bats` |
| 0.1 | 0.0% | `tests/egress-check.bats` |
| 0.1 | 0.0% | `tests/perf-pair.bats` |
| 0.1 | 0.0% | `tests/evaluator-io-check.bats` |
| 0.1 | 0.0% | `tests/zizmor-split.bats` |
| 0.1 | 0.0% | `tests/darwin-link.bats` |
| 0.1 | 0.0% | `tests/cross-check.bats` |
| 0.0 | 0.0% | `tests/zizmor-split.bats` |
4 changes: 4 additions & 0 deletions crates/batten/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -947,6 +947,10 @@ fn parse_ungated(text: &str, source: &str) -> Result<Config> {
// waiver carries an expiry" true of the resolved config rather than aspirational.
crate::waiver::validate(&config.waivers)?;
crate::facts::validate(&config.facts)?;
// The cross-table half (CLOUD-859), which needs both lists and so cannot live
// in either one's own validator: a `named` receipt row over an agent-sourced
// check is a gate no record can satisfy.
crate::facts::validate_keying(&config.facts, &config.rules)?;
crate::mint::validate(&config.mints)?;
// `[budget]` is a table rather than a list, so the census below (which scans
// `Vec<T>` fields) does not reach it — but the failure it guards against is
Expand Down
Loading
Loading