Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
a4ce68f
fix(database): the generic-ODBC TLS detector is value-blind, and the …
wshallwshall Aug 10, 2026
6988eb7
fix(parsing): refuse an HL7 field-path index below 1 (#1089)
wshallwshall Aug 10, 2026
001f608
fix(asvs): print every verdict state, reconciled against the cell cou…
wshallwshall Aug 10, 2026
dbbc791
fix(store): give the reference-snapshot sink a json default= hook (#1…
wshallwshall Aug 10, 2026
20e9800
feat(security): report the two per-connection TLS deviations in the l…
wshallwshall Aug 10, 2026
12bed64
docs: the loosening register now covers both per-connection TLS devia…
wshallwshall Aug 10, 2026
b9ba7b0
docs(connections): the generic-ODBC TLS reminder now reads the keywor…
wshallwshall Aug 10, 2026
f906ee9
docs(wiring): record why the DB reader skips registry.lookups (#333)
wshallwshall Aug 10, 2026
f911ebe
fix(hooks): route every gate deny value through one helper per class …
wshallwshall Aug 10, 2026
d79a879
docs: correct an overclaim I just introduced -- the serve warning doe…
wshallwshall Aug 10, 2026
ce0347d
ci: a step-margin gate that can go red, and a cap of its own for the …
wshallwshall Aug 10, 2026
6d9b897
ci(step-margin): refuse a baseline row whose recorded maximum is zero
wshallwshall Aug 10, 2026
608738e
fix(hooks): fold caller-supplied values in the collision gate's notic…
wshallwshall Aug 10, 2026
26deb08
fix(store): bound the store pooled-connection acquire (#1052)
wshallwshall Aug 10, 2026
590b68f
fix(hooks): the backstop must not rewrite the gate's own literal reme…
wshallwshall Aug 10, 2026
4ad0c8a
test(connscale): the CPU-probe fixture must move handles/RSS with the…
wshallwshall Aug 10, 2026
7c2957d
fix(connscale): validate the subtree walk so a stale-ppid adoption is…
wshallwshall Aug 10, 2026
74f0178
docs(connscale): scope the probe's process-topology note to what was …
wshallwshall Aug 10, 2026
d00f697
docs(quality): disambiguate the rubric's own signal citations from ba…
wshallwshall Aug 10, 2026
edce8c4
docs(service): SERVICE.md called JSON logging and off-box forwarding …
wshallwshall Aug 10, 2026
72e6709
fix(ci): delete security.yml's header claim denying the push trigger …
wshallwshall Aug 10, 2026
1e23705
feat(ci): diff-scoped backlog citation gate -- a number must name the…
wshallwshall Aug 10, 2026
697d34d
docs: repoint six ledger citations that named the live file for an ar…
wshallwshall Aug 10, 2026
812e9a0
docs(quality): scope-audit the record's own machine-enforcement claim…
wshallwshall Aug 10, 2026
828a908
test(ci): prove the citation gate sees every ledger link the link che…
wshallwshall Aug 10, 2026
b8ea358
fix(ci): the citation gate must read the file AT --head, not the work…
wshallwshall Aug 10, 2026
0e8db2a
fix(harness): size the connscale API port range from the sweep, not f…
wshallwshall Aug 10, 2026
a84edf1
test(connscale): reserve all three port families as whole contiguous …
wshallwshall Aug 10, 2026
a94273e
test(connscale): reserve the full API and sink ranges at both call si…
wshallwshall Aug 10, 2026
5358c0b
Merge branch 'w2-l2-quality-record' into w2-integration
wshallwshall Aug 10, 2026
2d7dbe8
Merge branch 'w2-l3-gate-emitter' into w2-integration
wshallwshall Aug 10, 2026
f779497
Merge branch 'w2-l4-ci-margin-asvs' into w2-integration
wshallwshall Aug 10, 2026
3bc30c5
Merge branch 'w2-l5-tls-loosening' into w2-integration
wshallwshall Aug 10, 2026
30d91d7
Merge branch 'w2-l6-store-parser' into w2-integration
wshallwshall Aug 10, 2026
b83ef34
Merge branch 'w2-l7-connscale-provenance' into w2-integration
wshallwshall Aug 10, 2026
12cfae7
Merge branch 'w2-l8-connscale-ports' into w2-integration
wshallwshall Aug 10, 2026
96e7d74
backlog: flip 15 banners wave 2 landed, and close the citation gate's…
wshallwshall Aug 10, 2026
b962919
test(citation): pin the CHILD's encoding, not just the parent's
wshallwshall Aug 10, 2026
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
8 changes: 8 additions & 0 deletions .github/required-contexts.txt
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,14 @@ cla
#
# The quoting in backlog-hygiene.yml is load-bearing: the job name contains " #", which YAML would
# truncate at the comment marker, and the job NAME is the context string.
#
# THIS CONTEXT STRING NOW UNDER-DESCRIBES ITS JOB, deliberately. Since BACKLOG #1095 the job also runs
# the diff-scoped CITATION gate: every backlog number a PR adds beside a ledger path must name the
# file that item actually lives in. It rides this context rather than taking its own because a new
# context would be UNREQUIRED and therefore decoration -- the promotion note above is that reasoning
# -- and because renaming a job to describe both checks CHANGES the context string, which is the
# required-but-absent trap and would wedge every PR. The name is frozen; what the job covers is
# documented in backlog-hygiene.yml's header and here.
a PR that implements BACKLOG #N must update BACKLOG.md

# (Historical note, kept because it is the reasoning that made the promotion safe: it triggers on
Expand Down
30 changes: 30 additions & 0 deletions .github/workflows/backlog-hygiene.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,14 @@
# implement a backlog item (`BACKLOG #N` in its title or body) and touches engine/IDE code, then
# it must also update `docs/BACKLOG.md`. That is the step whose omission caused #60.
#
# THE JOB BELOW NOW RUNS TWO CHECKS, and its `name:` describes only the first. That is deliberate and
# must stay: the name is the branch-protection CONTEXT STRING, so renaming it makes the required
# context stop reporting and wedges every PR (see .github/required-contexts.txt). The second check is
# the CITATION gate (BACKLOG #1095) — every backlog number this PR adds beside a ledger path must
# name the file that item actually lives in. It rides this job rather than a new one for the same
# reason: an unrequired context is decoration, since auto-merge blocks only on required ones, and
# adding one to branch protection is not an in-repo change.
#
# Read-only. No secrets. Workflow expressions are hoisted into `env` and never interpolated into a
# `run:` body (zizmor: a PR title/body is attacker-controlled on a fork PR and must arrive as data).
name: backlog-hygiene
Expand Down Expand Up @@ -110,3 +118,25 @@ jobs:
item body — then drop the 'BACKLOG #$n' token from this PR's title/body.
EOF
exit 1

# BACKLOG #1095. Retiring an item MOVES it verbatim from docs/BACKLOG.md into
# docs/archive/backlog/, and every citation that named the live file keeps pointing at a file
# the item is no longer in. No link checker can see this: docs/BACKLOG.md resolves perfectly,
# and only the human-readable number beside it is stale.
#
# DIFF-SCOPED, and that is the design rather than a convenience. PR #271 declined a gate partly
# because "a gate that fails on a legitimate archive is one people delete"; with pre-existing
# violations a corpus-wide gate is red on day one and gets suppressed. --base/--head restricts
# findings to lines THIS PR added, so it can only be red about something the PR wrote. Run the
# script with neither flag for the repo-wide report, which is a measurement, not a merge gate.
#
# No setup-python: the checker and the parse_items module it imports are stdlib-only, so the
# runner's preinstalled python3 is enough and the job stays a checkout plus two scripts.
- name: Every backlog citation this PR adds must name the file its item lives in
env:
# Hoisted, never interpolated into the script body (zizmor: template injection).
BASE_SHA: ${{ github.event.pull_request.base.sha }}
HEAD_SHA: ${{ github.event.pull_request.head.sha }}
run: |
set -euo pipefail
python3 scripts/docs/backlog_citation_check.py --base "$BASE_SHA" --head "$HEAD_SHA"
175 changes: 148 additions & 27 deletions .github/workflows/ci.yml

Large diffs are not rendered by default.

15 changes: 9 additions & 6 deletions .github/workflows/security.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,15 @@ name: Security
# it scans on the same run as the other gates rather than relying on native push protection.
# See docs/SECURITY.md.
#
# NO push-to-main trigger (dropped for CI cost): every push to main is an auto-merged PR whose head
# was JUST scanned by the pull_request run of this same workflow, so the post-merge re-scan re-ran
# identical scanners on identical content minutes later (~376 runs/month at ~8 billed min each).
# The drift a push run could in principle catch (a CVE disclosed between the PR scan and the merge)
# is exactly what the daily cron below exists for — caught within ~24h, the same bound as a CVE
# against an unchanged main. On-demand full scans: workflow_dispatch.
# THE TRIGGER SET IS THE `on:` BLOCK BELOW AND NOTHING ELSE. Each arm carries its own reason there,
# so this header states none of them and must not start. A header paragraph that ALSO describes the
# triggers is a second definition, free to drift from the first — and one did: for months a paragraph
# here denied a trigger the `on:` block declared ten lines beneath it, at length and with costings.
# It was DELETED rather than corrected, because correcting it would have left the second definition
# in place to drift again. The cost of that drift is not to CI, which behaved as the `on:` block says;
# it is that the rest of this header is load-bearing (the continue-on-error trap above), and a reader
# who finds one paragraph of it demonstrably false has no way to tell which of the others still hold.
# tests/test_security_posture.py refuses the return of a header claim that denies a declared trigger.
on:
pull_request:
# Post-merge re-scan (main only). A fork PR is scanned STRUCTURAL-ONLY by design -- the secret is
Expand Down
Loading
Loading