ADR-0002 — P2, P3, P5 and P6¶
Status: proposed. Nothing here is accepted.
This file exists because there is currently no normative home for the four
principles the project is already building on. prototype/statements/,
APP-0001, and three answered library topics all assume P2 and P3. ARCH-0002
marks all six of P2–P7 [draft]. The gap between those two facts is what this
ADR closes.
1. What D-2 decided, and what it deferred¶
Weekly of 2026-09-28, decision D-2, verbatim:
D-2 · T1-B — accept P2, P3, P5, P6 provisionally; hold P4, P7. Accepted for review and initial progress: work may build on them now, but they are not yet normative — each becomes final only through an ADR after review (ARCH-0001 §9). P4 and P7 stay draft.
Two separate things, and conflating them is the error this file is written to avoid:
| what D-2 did | standing today | |
|---|---|---|
| granted | permission to build on P2, P3, P5, P6 | in force since 2026-09-28, and recorded nowhere normative until this file |
| deferred | making them normative | not done. Requires an ADR after review; the review has not happened |
ARCH-0002 carries needs_review: true, reviewed: false, and an empty
reviewers list. So the condition D-2 attached is unmet, and this ADR is
proposed rather than accepted.
2. The decision proposed¶
That P2, P3, P5 and P6 become normative, and that P4 and P7 remain draft.
Accepting this ADR does three things and no more: it flips the four principles
from [draft] to [accepted] in ARCH-0002, it records the consequences in §5
as owed work, and it leaves DEC-002, DEC-004, DEC-007, DEC-008 and DEC-009
untouched. It accepts no DEC-*.
Until it is accepted, the provisional grant of §1 stands on its own: build on the four, do not treat them as normative, and do not cite them as settled in a specification.
3. Why each of the four¶
P2 — the statement form, A says B has C. Demonstrated in the prototype:
naming and attestation take one form. Strengthened materially since D-2 by
two library topics that neither the sponsor nor the model had when D-2 was
taken. artifact-statements finds that a vCon has no speaker — it is signed
by whoever assembled it, that signer appears nowhere in the data model, and the
analysis[] object records vendor, product and schema and not who vouches for
the analysis. sbom finds the identical shape in NTIA and CISA: an SBOM is a
B-has-C payload whose A is absent, where the signature proves a key handled
the bytes rather than that any principal asserts the composition. Two live
specifications, found independently, with the same hole. That is the strongest
evidence the project has that the form earns its place, and it is evidence from
the world rather than from the prototype.
P3 — a type is a schema. The prototype renders EN and ES with no type-specific code, which is DEC-007's own acceptance test met one domain early. Accepting P3 makes multilingual description a requirement rather than a nicety; that cost is understood and is the point of the principle.
P5 — validity is checked, never assumed. RFC 8949's three levels, with
unknown-is-critical as the default. CVE-2025-59420 is the live instance:
Authlib accepted unknown crit parameters and produced a possible
authorization bypass. vCon's critical mechanism shows that producer opt-in is
the weaker arrangement. See §6 — P5's scope is about to change, and that is a
sequencing problem for this ADR.
P6 — a name is an attested string. Resolves register item 6a: ARCH-0001 §4.2's five statement kinds are five functions over one form, distinguished by predicate type. §4.3's separation of the three procedures is untouched and must stay untouched — that was always a claim about procedures, not object kinds, and reading it as the latter is what made 6a look like a contradiction.
4. Why P4 and P7 stay held — and what has changed since¶
P7 — unchanged. No profile has been written. Accepting a principle about profiles before writing one asserts a shape nobody has tested. Write the supply-chain profile (T1-A, now D-1) first.
P4 — held, and holding it now costs something it did not cost on 2026-09-28.
D-2 held P4 because it carries the largest downstream cost of the six and the least testing: one domain hash-identified in a spike, nobody has versioned a domain or had two reference each other, and those are where a set-hash gets hard. That reasoning stands.
What has changed is that P4 is now an input to DEC-002, which it was not
understood to be when it was held. The canonical-encoding answer makes
conditions (5) — a canonical order for set-valued fields carried in arrays — and
(6) — a declared Unicode normalisation rule — conditional on P4 and on
Threshold members being a set rather than a sequence. Dropping P4 would shrink
that answer to its original four conditions and restore DEC-002 option 3 to
contention.
So P4 is no longer only a semantic-layer question deferrable to the spring. It is load-bearing for an encoding decision due Oct 28. This ADR does not propose accepting it — the evidence has not improved — but it records that the cost of leaving it open has moved from the semantic layer to the critical path, and that whoever takes DEC-002 is taking a position on P4 whether or not they say so.
5. Consequences if accepted¶
| consequence | owed to | owner |
|---|---|---|
| ARCH-0001 §4.2 rewritten — five kinds become functions over one form | P6, register 6a | register item 4 |
| ARCH-0001 §4.3's three procedures stay separate, explicitly | P6 | same change |
| DEC-007 re-stated in P3's terms, or closed as answered by it | P3 | register item 5d |
| R-M-08 generalises from tags to every constrained object | P2 | ARCH-0001 v0.2.0 |
| Multilingual description becomes a requirement | P3 | WP1 schema |
| Encoder and verifier must reject unknown fields | P5 | WP1, T-034 |
None of these is done by accepting this ADR. They are the work it creates, and they belong in the ARCH-0001 v0.2.0 change, not here. ARCH-0002's own rule governs throughout: where it and ARCH-0001 §4 appear to conflict, ARCH-0001 governs and ARCH-0002 is wrong.
6. What acceptance requires — two conditions, one of them sequencing¶
(a) The review D-2 named. ARCH-0002 is reviewed: false with no reviewers.
D-2 said "final only through an ADR after review." A second person must read
ARCH-0002 and say so. Accepting without it would make D-2's own condition
decorative.
(b) P5's scope is about to change, and accepting it first would churn it.
mofn#72 proposes extending P5 to cover non-canonical serialisation of known
content — condition (2) from canonical-encoding. P5 as drafted speaks to
unknown content; condition (2) speaks to a non-canonical serialisation of
content that is perfectly well known. The library's answer judged that extending
P5 by a clause is cheaper and truer than minting an R-O-07, and explicitly
left the amendment to this repository.
If P5 is finalised at today's wording and #72 lands afterwards, a principle
accepted one week is amended the next — which is exactly the churn an ADR
exists to prevent, and the reason version_policy says an accepted ADR changes
only by superseding it.
Recommended sequencing: land #72's P5 clause first, then accept this ADR over the amended P5. The alternative — accept P2, P3, P6 now and hold P5 for #72 — is available and is worse, because P5 is the principle the prototype's reject-don't-repair behaviour already depends on, and splitting the four leaves it the only one still unwritable-against.
7. Alternatives rejected¶
Accept all six. Rejected: P4 and P7 have the evidence D-2 found wanting, and nothing since has improved it. §4 records that P4's cost has changed, which is not the same as its evidence changing.
Accept nothing until ARCH-0001 v0.2.0 lands. Rejected: that is the status
quo, and the status quo is the problem. Work already in the repository builds on
P2 and P3 with no normative basis — prototype/statements/, APP-0001,
PLAN-0004, and the artifact-statements, sbom and scitt topic answers.
Leaving them unbacked does not make them not depend on the principles; it only
makes the dependency undocumented.
Mark this ADR accepted now, citing D-2 as the authority. Rejected, and
this is the central judgement in the file. D-2 is a minute. CONTRIBUTING §5:
"Never mark a DEC-* accepted in a PR description, a Zoom note, or a commit
message. Only an ADR accepts a decision." More pointedly, D-2 itself said
these become final only through an ADR after review — so citing D-2 to skip the
ADR inverts the thing D-2 said. An ADR carries decision_makers; filling that
field with a name whose owner has not acted would be a forged provenance
record in a project whose subject is provenance. The field is left empty.
Write the four principles into ARCH-0001 §5 as requirements instead.
Rejected for the reason ADR-0001 already gave for R-M-12: a cross-cutting
principle that constrains three open decisions at once does not fit a table
cell, and ARCH-0002 is the home the project chose for exactly this.
8. Evidence¶
project/meetings/2026-09-28.md— D-2, verbatim in §1.spec/ARCH-0002-key-relative-naming.mdv0.5.0 — the six principles as drafted.design-log/0002-arch-0002-cycle/review.md— P2 and P4 were both model proposals the human overruled; P2 as drafted is the human's correction, not the model's. Relevant to how much weight §3's prototype evidence carries.library/topics/artifact-statements.yaml,topics/sbom.yaml— the two independent instances of the missing A (§3).library/topics/canonical-encoding.yaml— conditions (5) and (6), and their dependence on P4 (§4).mofn#72— the P5 amendment (§6).- CVE-2025-59420 — Authlib
crithandling (§3).