Skip to content

docs: correct site repository name, visibility, protection, and conformance coverage - #20

Merged
qmarcelle merged 2 commits into
mainfrom
wave-0/standard-shell-truth
Aug 5, 2026
Merged

qmarcelle merged 2 commits into
mainfrom
wave-0/standard-shell-truth

Conversation

@qmarcelle

@qmarcelle qmarcelle commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

Wave 0 documentation truth for this repository. META-246 (ledger items 21, 23) and META-267 (items 24, 25).

No schema bytes, no stable read paths, no package metadata, no types. Nothing in AGENTS.md's "do not change without an issue" list is touched.

Site repository name — item 21

workspacejson/site does not exist and never did. The repository is workspacejson/workspacejson.dev.

Corrected in 11 places across 8 files — README, OWNERSHIP, GOVERNANCE, SUPPORT, CONTRIBUTING, SECURITY, AGENTS, and the Copilot instructions. The audit listed three; the name had spread further than that. Both ASCII dependency diagrams were recentred for the longer label.

One occurrence is deliberately left alone: docs/adr/002-bounded-enrichment-program.md:47. ADR-002 is a governance record under an amendment protocol, and silently editing a record is precisely what that protocol exists to prevent. It is flagged for amendment rather than fixed here. ADR-002 is Proposed, so nothing currently relies on it.

Branch protection — item 23

The README claimed the repository is private and on a plan without branch protection. It is public, and protection is enabled. But the correct replacement is neither the inverse of that claim nor a simple missing-control list. Measured against the GitHub API on 2026-08-04:

required_approving_review_count : 0
require_code_owner_reviews      : true
enforce_admins                  : false
rulesets                        : []
required checks                 : test (20), test (22), Four-path producer conformance  (strict)
dismiss_stale_reviews           : true
required_conversation_resolution: true
allow_force_pushes / deletions  : false

docs/repository-settings.md asserted "a pull request with at least one approving review" and "enforce on admins". Both are false.

The actual defect is structural, not a missing toggle

An earlier revision of this PR said the code-owner requirement "cannot bind" while the general count is 0. That was wrong and has been corrected in dcdba7f. require_code_owner_reviews is an independent control — it blocks an affected pull request until a code owner approves, regardless of the general count. It is not inert.

The real problem is the combination of four facts:

  1. general approving-review count is 0, so paths no code-owner rule reaches get no review requirement;
  2. code-owner review is enabled and does bind;
  3. .github/CODEOWNERS assigns * and every specific path to a single owner, @qmarcelle, who authors the changes — and GitHub does not let an author approve their own pull request, so the code-owner gate cannot be satisfied from within;
  4. enforce_admins: false, so the same account can bypass the protection entirely.

The controls are configured. What is missing is a second person.

Remediation therefore is not "set the count to 1". It needs an independent maintainer/code owner first, then a required approval, then admin enforcement or a no-bypass ruleset with a bounded release exception, with .github/CODEOWNERS itself staying protected (already true at CODEOWNERS:29).

This is not currently a credentialed package-publication risk — this repository holds no npm credential and ships no release workflow. It is not harmless in general: main here is the public canonical source of the standard, so unreviewed schema, guard and governance changes land the same way. Relevant to META-243, which requires reviewed release paths before a repository holds a credential.

Schema $id bullet — stale in the other direction

The README described the $id host as disagreeing with the canonical domain. main already carries the bare-host $id after META-272; the published @workspacejson/spec@0.4.4 still serves www.. Restated as the candidate-versus-released distinction rather than a live disagreement — the same distinction META-293 assertion 7 exists to enforce.

Producer conformance coverage — items 24, 25

docs/conformance.md "Known gaps" claimed producer conformance is not mechanically checked here. It has been since PR #9. Per META-267 the bullet is corrected in place rather than dropped, and expanded to state what the suite actually does:

  • the invocation command, including WORKSPACEJSON_CLI_CANDIDATE;
  • the five assertion groups;
  • the external-candidate boundary — the producer does not grade itself;
  • the mutation red tests, including the baseline case that stops the suite passing by rejecting everything;
  • what it deliberately does not assert — nothing about per-file fileIndex values, carried over from the suite's own header, which is ADR-003 amendment A-004's open question.

The adjacent "no external conformance suite" bullet is narrowed, not deleted: a producer suite exists, but it requires a caller-supplied candidate path, so an unaided third-party implementer still cannot point at one published battery. That gap is real and remains stated.

Verification

pnpm -r build && pnpm -r typecheck && pnpm -r test
  221 passed  (48 spec, 173 rules)

check:docs         4 confirmed in the schema; 9 prose enumerations complete
check:schema       PASS
check:examples     PASS
check:architecture PASS
check:architecture:test PASS
check:adr          index matches the records; no Accepted record on an unresolved placeholder
check:conformance  28 passed, 0 failed   (against the local workspacejson/cli candidate)

check:docs carries the stable-read-path gate from PR #16, so the prose enumerations touched here are mechanically verified against the schema.

Refs META-246, META-267.

…rmance coverage

META-246 (ledger items 21, 23) and META-267 (items 24, 25). Documentation truth
only — no schema bytes, no stable read paths, no package metadata, no types.

Site repository name (item 21)
  `workspacejson/site` does not exist and never did; the repository is
  `workspacejson/workspacejson.dev`. Corrected in 11 places across 8 files —
  README, OWNERSHIP, GOVERNANCE, SUPPORT, CONTRIBUTING, SECURITY, AGENTS and the
  Copilot instructions — not the three the audit listed. Both ASCII dependency
  diagrams recentred for the longer name.

  One occurrence is deliberately NOT changed: docs/adr/002-bounded-enrichment-
  program.md:47. ADR-002 is a governance record under an amendment protocol, and
  silently editing a record is exactly what that protocol exists to prevent. It
  is flagged for amendment instead.

Repository visibility and protection (item 23)
  The README claimed the repository is private and on a plan without branch
  protection. It is public, and protection is enabled. But the replacement is
  not simply the inverse: measured against the GitHub API on 2026-08-04,

    required_approving_review_count : 0
    enforce_admins                  : false
    rulesets                        : []

  docs/repository-settings.md asserted "a pull request with at least one
  approving review" and "enforce on admins". Both are false. A pull request can
  merge with no human approval once CI is green, and the code-owner requirement
  cannot bind while the required count is 0 — GitHub requests code-owner review
  but does not block on it.

  That document then concluded the authority transfer "can proceed without
  creating a supply-chain window". That conclusion does not follow and is
  removed. The gap is currently harmless — this repository holds no npm
  credential and ships no release workflow — but it must be closed before
  authority transfers, not after.

Schema $id bullet
  Also stale, in the opposite direction: `main` already carries the bare-host
  $id after META-272, while published @workspacejson/spec@0.4.4 still serves the
  `www.` host. Restated as the candidate-versus-released distinction rather than
  a live disagreement.

Producer conformance coverage (items 24, 25)
  docs/conformance.md "Known gaps" claimed producer conformance is not
  mechanically checked here. It has been since PR #9. Corrected in place rather
  than dropped, and expanded to describe what the suite actually does: the
  invocation command, the five assertion groups, the external-candidate boundary
  so the producer does not grade itself, the mutation red tests including the
  baseline that stops it passing by rejecting everything, and — per the suite's
  own header — what it deliberately does not assert about per-file fileIndex
  values, which is ADR-003 amendment A-004's open question.

  The adjacent "no external conformance suite" bullet is narrowed rather than
  deleted: a producer suite exists, but it needs a caller-supplied candidate
  path, so an unaided implementer still cannot point at one published battery.

Verification
  pnpm -r build && pnpm -r typecheck && pnpm -r test   221 passed (48 spec, 173 rules)
  check:docs        4 confirmed in the schema; 9 prose enumerations complete
  check:schema, check:examples, check:architecture, check:architecture:test  PASS
  check:adr         index matches records; no Accepted record on a placeholder
  check:conformance 28 passed, 0 failed, against the local workspacejson/cli candidate
Copilot AI lite review requested due to automatic review settings August 4, 2026 15:15

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

…endent reviewer

The prior wording claimed `required_approving_review_count: 0` makes the
code-owner requirement unable to bind. That is wrong, and it understated the
problem in one place while overstating it in another.

`require_code_owner_reviews` is an independent control: it blocks an affected
pull request until a code owner approves, regardless of the general count. It is
not inert.

The actual defect is structural. Every path in .github/CODEOWNERS is owned solely
by @qmarcelle, who authors the changes, and GitHub does not permit an author to
approve their own pull request — so the code-owner gate cannot be satisfied from
within. Administrator enforcement is off, so the same account can bypass it. The
controls are configured; what is missing is a second person.

Remediation restated accordingly: an independent code owner is the first
requirement, not a higher approval count. Raising the count alone changes
nothing while one account owns every path and authors every change.

Also narrows "currently harmless". It is not a credentialed publication risk —
no npm credential, no release workflow — but main here is the public canonical
source of the standard, so unreviewed schema, guard and governance changes land
the same way.
@qmarcelle
qmarcelle merged commit 08b9454 into main Aug 5, 2026
3 checks passed
@qmarcelle
qmarcelle deleted the wave-0/standard-shell-truth branch August 5, 2026 02:01
qmarcelle added a commit that referenced this pull request Aug 9, 2026
Steward acceptance given 2026-08-09 by Qwynn Marcelle, sole steward, in
explicit terms. Status moves Proposed → Accepted, the decision date is the date
acceptance was given rather than the drafting date, the README index row is
updated, and docs/adr/index.json is regenerated.

Acceptance authorized ratification only. It did not authorize implementation:
the executable corpus, the standard-owned validation contract, producer and
reader convergence, and the public-documentation sync remain separate work
items under the ratification issue.

Four scope corrections were issued with the acceptance and are recorded in the
record itself, because they narrow what it authorizes and a reader who has only
the record should see them:

  1. validateStoredKey is standard-owned, pure, total and filesystem-free.
  2. canonicalizeHostQuery is not the schema package's to implement. Hosts and
     integrations implement it against these semantics; a filesystem-aware
     implementation in the spec package needs its own architectural decision.
  3. A genuine U+FFFD in a filename is valid. Lossy-decoding detection belongs
     at raw-byte acquisition, where re-encoded bytes can be compared against
     the originals, not in a pure string validator that has no bytes.
  4. Acquisition repair is a separate change from stored-key validation and
     needs its own caller trace and watched-red evidence first.

Rebuilt on bd14f39 rather than merged from the stale f85039b base. The only
conflict was docs/adr/index.json, resolved exclusively by regeneration — the
generator is its sole author. Regeneration also enriched ADR-003's revision pin
to bd14f39, now that #21 has published those bytes.

No file from #20 or #21 is reverted or reintroduced. The two edits to shared
files are pure additions: one README index row and one path in
scripts/check-docs.mjs.

Refs: META-278
qmarcelle added a commit that referenced this pull request Aug 10, 2026
… not commands (#19)

Accepted 2026-08-09 by Qwynn Marcelle, sole steward.

Stored artifact paths are data, not commands. Every path-bearing value must
already be a canonical repository-relative key; readers reject non-canonical
stored keys and never resolve, repair, collapse or reinterpret them. Host-query
canonicalization is a separate operation, scoped to POSIX, and canonicalizing a
host query into an existing tracked identity is not repairing a stored key.

Decision-only. No schema bytes, no implementation, no matcher replaced. The
executable corpus, the standard-owned validation contract, producer and reader
convergence, and the public-documentation sync are separate work items.

Four scope corrections issued with the acceptance are recorded in the record:
validateStoredKey is standard-owned, pure, total and filesystem-free;
canonicalizeHostQuery belongs to hosts and integrations, not the spec package;
a genuine U+FFFD filename is valid and lossy-decode detection belongs at
raw-byte acquisition; acquisition repair is a separate change needing its own
caller trace and watched-red evidence.

Rebuilt on bd14f39; docs/adr/index.json resolved exclusively by regeneration.
No file from #20 or #21 reverted or reintroduced.

Refs: META-278
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.

2 participants