Selective Disclosure — history
The dated record of how Selective Disclosure got here, moved out of the spec on 2026-10-19 because a reader does not need it to use the spec today. The spec keeps every section spec-format.md requires and its Deleted: tombstones; everything smaller is in git log -- atoms/selective-disclosure.md.
Decisions
Entries that record a migration or a repair rather than a turn the pattern took.
-
2026-09-12 — Rewritten in GRACE lang v0.40; nothing but language changed. Chose: the two actions as a signature block, Invariant 1 through 6 keeping their numbers, every success effect conditioned on a declared admitted record or admitted read so no effect binds a refused call (Hard invariant 16), the disclosure instant resolution routed through a declared resolved disclosure instant so no rule restates the default, the rejection precedence carried by
Operation 8andOperation 15rather than by a prose rejection priority line repeated in three sections, the six acceptance areas opened intoCheck 2.1 through 6.2with the three named audit gaps raised toExternal check 1 through 3, the Non-goals-and-edge-cases prose split into aNon-goal 1 through 22family and four edge-case families (String,Clock semantics,Concurrency,Correction), the Composition notes prose raised toComposition note 1 through 9with the named compositions moved into the WHY. Over: the prose spec. Because: the migration plan;cites.py --into selective-disclosurefound nothing in the corpus citing this atom by label, so the rewrite carried no frozen-number risk. 73.9 KB → 49.9 KB. -
2026-09-12 — A filter’s match semantics is a rule, not an assumption. Chose:
Operation 27(an admitted read answers every matching record) andOperation 28(an admitted read answers no record failing a filter). Over: the prose, which spelled out matching for the authority type axis alone and left the other four to be inferred from the word matching in the action description. Because: the migration’s Check 5.1 tests that a subject reference query answers every record carrying the reference, and no rule in the spec owned that proposition — a check resting on an unowned invariant, the class the docket has been collecting since council read 12. The gap was invisible to both tools and surfaced only when each check was made to name the rule it tests, which is the discipline earning its keep rather than a finding against the atom. -
2026-09-12 — Reference-level filtering is a non-goal, not an operation. Chose:
Non-goal 22. Over: anOperationrule saying [Read] must not offer the axis. Because:Term filter axesenumerates five axes andOperation 22rejects anything outside them, so the operation-level rule was entailed twice over (Authority 3); what is not entailed is the design claim — reference search is a composing-layer concept — and that belongs with the other surface refusals. -
2026-09-12 — Six defects the tools passed, found by a self-read before a council read. Chose:
Invariant 1.1rewritten from a garbled sentence that barely parsed;Concurrency 2restored to the prose’s claim — two concurrent calls are independent, which is what the spec said, not non-blocking, which is what I had written;Correction 4given a declared correction narrative, because naming the corrected record is unsatisfiable unless a field holds the naming and the prose named two;Identity 15changed from the deployment allocating an id (contradictingIdentity 2, where the host allocates) to the deployment choosing the id format;Operation 20’s lower-casewherereplaced by an admittedIF … THEN; the former first conformance check moved toExternal check 4. Over: shipping a file both checkers called clean. Because: zero tool findings has never once predicted zero council findings, and three of the six were changes in meaning rather than infelicities. The last is the repeatable one: a check asking an auditor to find every issued disclosure id cannot be cleared from the store, because the store is exactly what would be missing one — the same split council read 22 forced on Capability, applied here before a reader had to force it.
Migration notes
- 2026-09-15 — Capability requirement 1, moved from Operation. What the deployment supplies, which is what the family means. The rule stood under
Operation— one action’s rules — while naming no action, because this spec was migrated before the standard family had a home in an atom; the five atoms migrated a day later put the same obligation here. The words are the words the rule carried (council read 76).