Skip to content

docs: three stale claims that contradict what the code and the scorecard say - #111

Merged
wshallwshall merged 1 commit into
mainfrom
docs-three-stale-claims
Aug 1, 2026
Merged

docs: three stale claims that contradict what the code and the scorecard say#111
wshallwshall merged 1 commit into
mainfrom
docs-three-stale-claims

Conversation

@wshallwshall

Copy link
Copy Markdown
Collaborator

Four lines across four files. No behavior changes — docs and workflow comments only; cla.yml's triggers are untouched and re-verified after the edit.

Each is a documented fact that HEAD disproves.

1. Secure_Development_Standards.md:378 — ASVS V3 marked out of scope

The row reads:

V3 | Web Frontend Security | No | No browser-delivered UI (PySide6 desktop + APIs); documented exclusion. Re-scope if a web/admin UI is added

That trigger fired and nobody pulled it. BACKLOG #103 retired the desktop console on 2026-07-13 and made the browser console at /ui the sole operator UI.

The important part: the assessment of record already disagrees with this row. It scores V3 in full — 31 requirements, 18 Pass / 9 Partial / 0 Fail / 4 N/A — and makes no exclusion claim anywhere. So this was never a scope decision awaiting a ruling; it was stale prose contradicting the scorecard. SECURITY-LOOSENING.md:396 had already mapped serve_web_console to V3, so the tree contradicted itself.

Also corrects the :394 roll-up: 12 → 13 chapters active, and "Documented exclusions: V3, V17""Documented exclusion: V17".

2. EARLY-ADOPTER-GUIDE.md:636 — "there is no Prometheus exporter"

There is one.

This is the one with real cost. An adopter reading that line wires up log parsing and /stats polling for a capability that already ships. /metrics and /metrics/history are now listed first, with the auth and PHI properties stated.

3. security.yml:16 and cla.yml:19 — "this private repo"

The repo is public (gh repo viewvisibility=PUBLIC).

security.yml claimed CodeQL needs GitHub Advanced Security here. CodeQL runs and passes as a required context on every PR, which is its own disproof.

cla.yml is the one that matters. It justifies omitting the closed trigger as "moot on this private repo", and its own re-add condition is "if the repo ever takes fork PRs from non-allowlisted contributors" — which a public repo can do today. Corrected to say the allowlist, not repo visibility, is what makes the on-close behavior unnecessary. Triggers unchanged: this flags a decision for you, it does not make one.

Deliberately left alone

  • release.yml:84 — past-tense history of a step removed at the cutover. Correct as written.
  • release.yml:271, scorecard.yml:9 — both already state the repo is public.
  • Secure_Build_Scorecard_MEFOR.md:64 — also says "documented V3/V17 exclusions", but it is a dated 2026-07-14 reconciliation record citing a since-superseded assessment. Editing it would revise history rather than fix a claim.

Verification

  • 117 tests greentest_security_doc_drift, test_security_static, test_security_posture, test_dast_claims.
  • Both edited workflows re-parsed as YAML; cla.yml's pull_request_target.types confirmed still [opened, synchronize].
  • Pre-commit passed, including the ledger gate and the GitHub Actions linter.

…ard say

Each of these is a documented fact that HEAD disproves. No behavior changes --
docs and workflow comments only; cla.yml's triggers are untouched.

1. Secure_Development_Standards.md:378 -- ASVS V3 marked OUT of scope

   Reason given: "No browser-delivered UI (PySide6 desktop + APIs); documented
   exclusion. Re-scope if a web/admin UI is added." That trigger fired and
   nobody pulled it: BACKLOG #103 retired the desktop console on 2026-07-13 and
   made the browser console at /ui the SOLE operator UI.

   The assessment of record already disagrees with this row -- it scores V3 in
   full (31 requirements: 18 Pass / 9 Partial / 0 Fail / 4 N/A) and claims no
   exclusion anywhere. So this was stale prose contradicting the scorecard, not
   a scope decision awaiting a ruling. SECURITY-LOOSENING.md:396 had already
   mapped serve_web_console to V3, so the tree contradicted itself.

   Also corrects the :394 roll-up: 12 -> 13 chapters active, and "Documented
   exclusions: V3, V17" -> "Documented exclusion: V17".

2. EARLY-ADOPTER-GUIDE.md:636 -- "there is no Prometheus exporter"

   There is. messagefoundry/api/metrics.py IS the Prometheus exporter, and
   api/app.py:4147 registers GET /metrics returning Prometheus exposition
   (text/plain), gated by monitoring:read exactly like /stats, PHI-safe by
   construction (BACKLOG #21 -- labels are operator-assigned identifiers only,
   never a message field). prometheus_client is a hard import, not optional.

   This is the one with real cost: an adopter reading it wires up log parsing
   and /stats polling for a capability that already ships. /metrics and
   /metrics/history are now listed first.

3. security.yml:16 and cla.yml:19 -- "this private repo"

   The repo is PUBLIC (gh repo view: visibility=PUBLIC). security.yml's claim
   was that CodeQL needs GitHub Advanced Security here; CodeQL runs and passes
   as a required context on every PR, which is its own disproof.

   cla.yml's is the one that matters: it justifies omitting the `closed`
   trigger as "moot on this private repo", and its own re-add condition is
   "if the repo ever takes fork PRs from non-allowlisted contributors" -- which
   a public repo can do today. Corrected to say the ALLOWLIST, not visibility,
   is what makes the on-close behavior unnecessary. Triggers unchanged; this
   flags a decision, it does not make one.

   Left alone deliberately: release.yml:84 (past-tense history of a step
   REMOVED at the cutover), release.yml:271 and scorecard.yml:9 (both already
   state the repo IS public). Secure_Build_Scorecard_MEFOR.md:64 also mentions
   "documented V3/V17 exclusions" but is a dated 2026-07-14 reconciliation
   record citing a superseded assessment -- editing it would revise history.

Verified: 117 tests green across test_security_doc_drift, test_security_static,
test_security_posture and test_dast_claims; both edited workflows re-parsed and
their triggers confirmed unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@wshallwshall
wshallwshall merged commit ef45c04 into main Aug 1, 2026
34 checks passed
@wshallwshall
wshallwshall deleted the docs-three-stale-claims branch August 1, 2026 03:18
wshallwshall added a commit that referenced this pull request Aug 1, 2026
…superseded assessment (#114)

`Secure_Build_Scorecard_MEFOR.md` named ASVS-L3-ASSESSMENT-2026-07-16 as "the
CURRENT canonical verdict-of-record" and instructed "Grade off this doc."

Both claims were wrong. Four dated re-scores have landed since, and its Posture
A/B counts rest on a posture split that no longer exists -- there is one scored
posture now, not two.

Repoints at the current verdict-of-record and marks the old entry superseded.
Following this file's existing "cited, not restated" convention for the
maintainer-internal corpus, no new counts are published here; the pre-existing
published figures are retained only to mark them stale.

Replaces PR #112, whose other half (the ASVS V3 exclusion row) was fixed
independently by #111 while it was open.
wshallwshall added a commit that referenced this pull request Aug 1, 2026
§A.3's roll-up reads "In scope: 14 chapters active today (V1–V8, V11–V16)"
— it said 13. V1–V8 is 8 and V11–V16 is 6.

The table directly above it is the authority and agrees with 14: exactly 14
rows carry an in-scope "Yes" (V1–V8, V11–V16), V17 is the sole "No", and V9
and V10 carry their own qualified verdicts.

This is the same off-by-one that was already in the line before #111 — it
read "12 chapters active (V1, V2, V4–V8, V11–V16)", which is 13. #111
correctly brought V3 into scope but carried the arithmetic error forward
rather than recomputing it, so the count moved 12→13 when the list moved
13→14.

Found because the website mirrors this file as
`docs/secure-development-standards.md` and publishes it as
`assets/MessageFoundry-Secure-Development-Standards.pdf`. That copy was
corrected to 14 in website PR #105, so the two have been disagreeing since
#111 merged. This makes them agree, with the engine as the correct one.

The "17 chapters" statements at :243 and :248 are right and untouched — that
is the total in ASVS 5.0, not the in-scope count.

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
wshallwshall added a commit that referenced this pull request Aug 2, 2026
…ments in the item itself

The #340 filing was agreed to need cost evidence. The hand account it was to be
built from ("#132 took four full CI cycles to land, none from a failure — green ->
main moved -> rebase, x3, ~80 min of runner time for a change correct on the first
pass") was wrong in every load-bearing figure, so this re-derives all of it from the
Actions API instead of relaying it.

What #132 actually did: nine CI runs / ten attempts across eleven head moves in a
3h28m window; two attempts failed on real defects (one on the head it opened at, so
it was not correct on the first pass — it opened at one commit and merged at five);
four runs cancelled in flight by cancel-in-progress; five head moves were rebases,
four of them onto a main tip that had landed 1-14 min earlier. Cost 212.7 min run
wall-clock / 442.5 min job wall-clock — quantities that differ by 2.08x, so the unit
is load-bearing. No billable figure exists: /timing reports 0 billable ms (self-hosted).

Two statements already in the item were false and are corrected:

  - "A hand-coordinated merge freeze ... *did* hold main still for a full window."
    It did not. main advanced four times between #119's first fully-green head and
    its merge, one of them 8m26s after the freeze was recorded in a work claim.
  - "#119 still failed" / "the bounds that actually killed #119" reads as the PR
    dying. #119 merged at 2026-08-02T01:45:00Z, 12h15m after arming.

The caveat is stated level with the cost, per the standard this repo keeps
violating. Notably the overnight serialization is NOT evidence hand coordination
worked — it is entailed by strict + a 20-25 min suite — and strict does not always
serialize (#110/#111 merged 24s apart; mechanism not established). Also measured:
no workflow carries a merge_group: trigger, so zero of the 13 required contexts
would report on a queue ref, which makes Proposed step 2 a precondition rather than
a follow-up.

Adds the measurement-cost linkage to #344: supersession-and-re-run produces
multi-attempt runs, and the default actions/runs/{id}/jobs endpoint returns only the
latest attempt, so failed earlier attempts vanish from any duration table built from
it — at exactly the tight end where a margin is decided.

#344's own figures are untouched; another session holds that item.
wshallwshall added a commit that referenced this pull request Aug 2, 2026
…ments in the item itself (#143)

* backlog(#340): the merge-queue cost, re-derived — and two false statements in the item itself

The #340 filing was agreed to need cost evidence. The hand account it was to be
built from ("#132 took four full CI cycles to land, none from a failure — green ->
main moved -> rebase, x3, ~80 min of runner time for a change correct on the first
pass") was wrong in every load-bearing figure, so this re-derives all of it from the
Actions API instead of relaying it.

What #132 actually did: nine CI runs / ten attempts across eleven head moves in a
3h28m window; two attempts failed on real defects (one on the head it opened at, so
it was not correct on the first pass — it opened at one commit and merged at five);
four runs cancelled in flight by cancel-in-progress; five head moves were rebases,
four of them onto a main tip that had landed 1-14 min earlier. Cost 212.7 min run
wall-clock / 442.5 min job wall-clock — quantities that differ by 2.08x, so the unit
is load-bearing. No billable figure exists: /timing reports 0 billable ms (self-hosted).

Two statements already in the item were false and are corrected:

  - "A hand-coordinated merge freeze ... *did* hold main still for a full window."
    It did not. main advanced four times between #119's first fully-green head and
    its merge, one of them 8m26s after the freeze was recorded in a work claim.
  - "#119 still failed" / "the bounds that actually killed #119" reads as the PR
    dying. #119 merged at 2026-08-02T01:45:00Z, 12h15m after arming.

The caveat is stated level with the cost, per the standard this repo keeps
violating. Notably the overnight serialization is NOT evidence hand coordination
worked — it is entailed by strict + a 20-25 min suite — and strict does not always
serialize (#110/#111 merged 24s apart; mechanism not established). Also measured:
no workflow carries a merge_group: trigger, so zero of the 13 required contexts
would report on a queue ref, which makes Proposed step 2 a precondition rather than
a follow-up.

Adds the measurement-cost linkage to #344: supersession-and-re-run produces
multi-attempt runs, and the default actions/runs/{id}/jobs endpoint returns only the
latest attempt, so failed earlier attempts vanish from any duration table built from
it — at exactly the tight end where a margin is decided.

#344's own figures are untouched; another session holds that item.

* backlog(#340): the protocol cost, and a measurement claim of mine that was imprecise

Two amendments from peer review, both of which improve on what I wrote.

1. My measurement-cost paragraph conflated two different prunings. Corrected by
   the ci-margin-correction session, who hit the same trap from the other side and
   re-measured with ?filter=all. The precise statement:

     - filtering on JOB conclusion deletes job-cancelled/step-succeeded rows, which
       are the tightest by construction;
     - the default latest-attempt view hides FAILED earlier attempts. It does NOT
       move a step-success maximum -- so my implication that it changes the margin
       was wrong. What it hides is that the sample is RIGHT-CENSORED: the largest
       observable step is the largest that FIT under the cap.

   Keying on the step's own conclusion (not the job's) and reading ?filter=all are
   two separate fixes for two separate defects. Still no #344 figure is quoted here.

2. Adds the protocol cost, relayed independently by two sessions and assembled by
   sandbox-codec. It is the strongest argument in the item and is not a throughput
   argument: with no queue, sessions invent an ordering ritual, and the ritual is
   less reliable than the mechanism it replaces. The self-reported instance -- a
   session promising not to jump the queue while its own PR had auto-merge armed --
   is already named as a failure mode in WORKTREES.md, which that session had read
   about this very freeze hours earlier.

Also: re-read the open-PR set nine hours after the first measurement. 15 open, 10
armed, still 0 CLEAN. Membership churns; the condition has never lifted.

Removes a "20-25 min" suite duration I restated twice without deriving it -- the
What section already states it once, which is where it belongs.
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