Skip to content

docs(sds): independent review is no longer a deployment gate (v2.2) - #89

Merged
wshallwshall merged 2 commits into
mainfrom
claude/standards-independent-review-not-a-gate
Jul 31, 2026
Merged

docs(sds): independent review is no longer a deployment gate (v2.2)#89
wshallwshall merged 2 commits into
mainfrom
claude/standards-independent-review-not-a-gate

Conversation

@wshallwshall

Copy link
Copy Markdown
Collaborator

Owner decision, 2026-07-30.

What changed

The Secure Development Standards stated that an independent ASVS-L3 review and DAST were "required before any off-loopback/production exposure". MessageFoundry is self-hosted, so that decision — and the assessment supporting it — belong to the implementing organization. The standard now records what has and has not been independently verified rather than gating deployment on it.

The engagement remains planned, at an estimated $25,000–$50,000, intended to be grant- or sponsor-funded rather than paid for out of licence revenue.

Why this PR exists

The same document is published in two places: here, and on the marketing site at messagefoundry.org/docs/secure-development-standards.md. The website copy was updated first. Until this lands, the two published versions of the same standard contradict each other — one gates production deployment on an independent review, the other does not. The deviation bullet is now byte-identical in both.

This repo's copy is the authoritative one, which is why the divergence needed closing rather than leaving the website as the odd one out.

Also fixed

The bullet cited security/RELEASE-GATE.md. No such path exists in this repository, so the reference did not resolve for anyone following it. Removed.

Bumped to v2.2 with a version-history entry. No change to the SSDF / ASVS / HIPAA mappings or Appendix A.

One thing for a maintainer, not fixed here

The signed risk-acceptance register that governs this residual is scoped by the same loopback restriction — ASVS-HIPAA-Penalty.md describes it as "void on any off-loopback or production exposure". Its stated justification for having no third-party assessment is the loopback limit. With that restriction removed from the standard, the register likely wants re-scoping so the two agree.

It lives in the maintainer-internal docs/security/ set, which is not present in this checkout, so it is untouched here — flagged rather than silently reconciled.

🤖 Generated with Claude Code

wshallwshall and others added 2 commits July 30, 2026 19:12
Owner decision, 2026-07-30. The Secure Development Standards stated that an
independent ASVS-L3 review and DAST were "required before any off-loopback/
production exposure". MessageFoundry is self-hosted, so that call — and the
assessment behind it — belong to the implementing organization. The standard
now records what has and has not been independently verified instead of
gating deployment on it. The engagement remains planned, at an estimated
$25,000-$50,000, intended to be grant- or sponsor-funded.

This brings the engine copy back in line with the website's copy of the same
document (messagefoundry.org/docs/secure-development-standards.md), which was
updated first; the deviation bullet is now byte-identical in both. Without
this the two published versions of the same standard disagree.

Also drops a citation to `security/RELEASE-GATE.md` in that bullet — no such
path exists in this repository, so the reference did not resolve for readers.

Bumped to v2.2 with a version-history entry. No change to the SSDF / ASVS /
HIPAA mappings or Appendix A.

Note for a maintainer: the signed risk-acceptance register that governs this
residual is scoped by the same loopback restriction ("void on any off-loopback
or production exposure"). With the restriction gone from the standard, that
register likely wants re-scoping so the two agree. It lives in the
maintainer-internal docs/security/ set, which is not present in this
checkout, so it is untouched here and flagged rather than fixed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@wshallwshall
wshallwshall enabled auto-merge (squash) July 31, 2026 01:15
wshallwshall added a commit to wshallwshall/messagefoundry-website that referenced this pull request Jul 31, 2026
…red capacity (#96)

Owner-directed. Twelve commits, ~46 files.

MATURITY. New canonical /status.html - started May 2026, Early Access and beta-level, sole maintainer, AI-assisted development disclosed, no freemium, no support organization, self-assessed but not externally audited - linked from all 32 pages and the sitemap, plus a site-wide de-hyping sweep and a standing CLAUDE.md rule so the posture is not silently reverted. A site-wide Early Access notice bar and 'get involved before 1.0' copy follow, because 19 of 32 pages previously carried no maturity signal at all.

STANDARDS. Independent ASVS-L3 review and DAST are no longer stated as a gate on off-loopback/production exposure; that decision belongs to the implementing organization. Doc bumped to v2.2 and both affected PDFs re-rendered. The engine's authoritative copy is updated in MEFORORG/MessageFoundry#89 so the two do not diverge.

CAPACITY. Publishes 40 million message events/day at a stated >20% reserve against a measured ~603 events/s ceiling, in total events (in and out), replacing a superseded ~8.4M/day figure whose own source forbade citing it as a product ceiling. Ships a Throughput & Capacity PDF as the citable basis, and discloses the limits alongside the number - loaded store, point estimate rather than soak, and a multi-shard topology not yet blessed for production.

ACCURACY. Removes figures the engine's own ADR 0074 condemned (~450 msg/s intake, '~65x faster' NVMe, ~16ms mislabelled as engine-only overhead), corrects the store commit ceiling, re-sources the 2.7x burst factor and ~11.5 KB message size as de-identified live-hospital-feed data, and removes the 'aggregate is the sum of the interfaces' rule from six places including four halves of FAQ/JSON-LD pairs - measured concurrent runs land well below the naive total.

QUALITY. Fixes regressions found by verification rather than assumed absent: an invisible 2.00:1 link in a dark hero, focus rings failing 3:1 on light surfaces inside dark scopes, 515px and 366px of trapped whitespace, feature-set hedging that CLAUDE.md forbids, and h1-to-h3 heading skips on five pages. A pre-merge sweep caught a blocker - 'certified' used eight times, a word CLAUDE.md bans by name and that security.html explicitly promises never to use.

Verified throughout by measurement in a browser rather than by eye: alpha backgrounds composited, CSS cache busted, 0 contrast failures, 0 horizontal overflow at 1280px and 375px, one h1 per page, 47 JSON-LD blocks parsing and all 73 FAQ pairs byte-identical to their visible answers.
@wshallwshall
wshallwshall merged commit a28441d into main Jul 31, 2026
31 checks passed
@wshallwshall
wshallwshall deleted the claude/standards-independent-review-not-a-gate branch July 31, 2026 01:16
wshallwshall added a commit that referenced this pull request Aug 7, 2026
… file #1098-#1100 (BACKLOG #1095) (#283)

* docs: convert 21 dead BACKLOG line anchors to item references

A `BACKLOG.md:<line>` anchor cannot survive an actively edited ledger. The file
moved 6,318 -> 6,616 lines during this work alone, and of 43 anchors repo-wide,
every one examined had drifted onto unrelated text. Five that were past EOF a day
earlier are now IN range and land on plausible-looking wrong items, which is worse
than dangling. Item numbers survive both editing and archival, so that is what
these become.

Root cause, and it is not gradual drift: commit 4ea1501 (the master test plan) is
NOT a descendant of 03f1fbd (the 185-item archival). They were parallel branches.
The plan's anchors were authored against an 8,742-line ledger and landed beside a
commit that cut it to 3,858, so they were stale on arrival, not over time.

Recovery was per-site reading with the citing prose as the primary evidence -- it
usually names the item inline -- backed by resolving each anchor against the
pre-archival ledger at 03f1fbd^. Every mapping was then put to an adversarial
reviewer instructed to refute by default. 32 of 43 survived; the 11 refusals were
not noise and are deliberately NOT converted here:

- Eight sites where the citing CLAIM is dead, not just the pointer. The alerting
  chapter still asserts #139 and PHI.md "currently contradict each other" when
  #139 was corrected 2026-08-01 and the code fixed by #323 on 2026-08-02; the
  ranked-backlog row for #338 is a pre-shipping snapshot. Repointing those would
  relaunder a false present-tense claim as a fresh, durable-looking reference.
  They need a content fix, which is a different change.
- Six anchors that cannot be attributed to any item, including one pointing at an
  un-numbered narrative bullet. Left uniform rather than half-repaired: uniform
  staleness is at least detectable, and a confident wrong pointer is not.
- Three that are not citations at all -- two inside a fenced transcript in #1083
  reproducing scanner output, and #347's own Source paragraph narrating the
  falsification test that made the status checker fail on purpose.

One mapping was recovered after the review: 16-security-phi:891's "no dormancy
contingency" quotes #89's title ("hl7apy security hardening -- dormant-upstream
contingency") almost verbatim. One proposal was refuted only on fragment
uniqueness, not on the item; applying line-scoped rather than globally makes it
safe, which is how all of these were applied.

* docs(testing): move the line number out of 23 source-link targets

The repo's file_path:line_number citation convention had leaked inside the href:
[`pipeline/alerts.py:27`](messagefoundry/pipeline/alerts.py:27). No prefix makes
that resolve. Owner's ruling was to move the line out of the target and keep it in
the link text, where it already sits -- no second convention, and nothing lost.

These carry a second defect that hid behind the first. The targets were also
root-relative, the class #280 repaired across 333 hrefs in this same subtree; they
were skipped there because link_check.py deliberately skips ":<line>" targets, so
each defect concealed the other. Both are fixed here: the line comes out and the
../../../ prefix goes in, matching the form #280 established in these files.

All 23 targets were confirmed to exist before rewriting. Repo-wide there are now
zero file:line hrefs, so --include-line-cites reports nothing new -- the checker's
skip is now a safety net rather than a suppression.

* backlog: correct #1095's own counts, and file #1098, #1099, #1100

#1095 recorded four measured counts and three of them were wrong -- in the way the
item itself is about. Its href figure of 13 was low by two orders of magnitude
against at least 629 repaired sites. Its two anchor counts moved between filing and
repair, and not because anything improved: this file grew 6,318 -> 6,616 lines, so
five anchors that were safely past EOF came back INTO range and now land on
plausible-looking wrong items. A dangling pointer degrades into a confident one as
the file grows, which is the sharpest argument for the item-number convention.

Root cause of the anchor class recorded, because it is not gradual drift: commit
4ea1501 (the master test plan) is not a descendant of 03f1fbd (the 185-item
archival). Parallel branches, so anchors written against an 8,742-line ledger
landed beside a commit that cut it to 3,858 -- stale on arrival. It also explains
the anchor citing line 8429, absurd against 6,616 and ordinary against 8,742.

The markdown-only scope note is discharged rather than left open. The predicted
sweep of harness/, ide/src/, messagefoundry/, scripts/, tests/, packaging/ and
.github/workflows/ ran over 1,219 files: 68 nonexistent paths, none of them a
rotted citation -- test fixtures, withheld directories, and past-tense historical
comments. The prediction was wrong and the reason is kept: citations in code are
written about the past, prose citations are written as pointers.

Three items filed, numbers allocated with alloc.ps1:

#1098 -- the coordination hook prints a session UUID in the column a commit SHA
occupies. Small, but it is an instrument answering a different question from the
one its header asks, with nothing in the output saying so.

#1099 -- #1094 says "the archival pass generates the anchor". There is no archival
tooling at all; the move is manual. The sentence sits in the archive as settled
record and points maintenance at a generator that was never built.

#1100 -- the nine sites where the citing CLAIM is dead, not just the pointer,
split out of #1095 rather than repointed. The alerting chapter still sets exit
criteria requiring that #139 and PHI.md be made to agree when #139 was corrected
2026-08-01 and the code fixed by #323 on 2026-08-02. Converting those pointers
would attach a durable reference to a false claim, which is worse than leaving the
stale anchor visible. Found by the adversarial pass: every one was proposed as a
clean repoint by a first reader and refuted by a second who checked the claim
against the code rather than against the anchor.
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