Commit 467762d
committed
feat(devx): gate the "startup registry verdict" class — read the registry all you like, never record the "no" (#4777)
One showcase cold start on 2026-08-03 produced three instances of one shape in
three unrelated subsystems, written by three people at three times: ask a
registry "is X there?" while the boot is still filling it, treat the "no" as
final, and RECORD it — cached on the instance (#4772 plugin-auth), asserted in
a warn (#4771 service-automation), or written to the database (#4769 objectql).
The provider registers a moment later; nothing undoes the record.
All three are fixed. This is what stops the class from coming back, built on
the #4632 machinery (declared vocabulary + AST + shrink-only baseline +
--self-test) rather than a parallel one.
The gate matches the three-part shape, and part 3 is what makes it a rule and
not noise:
1. a read of a registry still filling — the service registry during
init()/constructor, or an ADR-0018 open capability registry before its
seal;
2. a terminal conclusion drawn from "absent";
3. that conclusion recorded — cached in an instance field / module binding,
asserted in a warn, or persisted.
A read-only probe stays completely legal, and every cure passes untouched: a
probe deferred into a lazy accessor or a kernel:ready hook (nested bodies are
not descended into), a probe whose ordering an ADR-0116 declaration already
made final (dependencies / optionalDependencies / requiresServices — tolerance
lives in the plugin, never in a checker ledger), and a verdict drawn at a
declared seal (sealNodeTypeVocabulary). Rule B counts only registry
ENUMERATION, so a keyed has()/get() on a runtime path is not mistaken for a
boot-time membership verdict.
Proven in both directions, because a gate that has only ever been green cannot
be told apart from one that matches nothing (#4690):
f2eb850^ (both defects live) → 2 violations (auth-plugin, engine.ts)
25784cf^ (#4772 fixed only) → 1 violation (engine.ts)
main → clean, 47 seams seen, 41 read-only
Coverage is stated, not implied: it under-matches on purpose. #4769 is a
fixture, not a catch — its "registry" is the sys_migration table.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018iARDqtrhQgz6fVHDeDkbQ1 parent 9c040f1 commit 467762d
6 files changed
Lines changed: 1414 additions & 0 deletions
File tree
- .changeset
- .github/workflows
- scripts
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
204 | 204 | | |
205 | 205 | | |
206 | 206 | | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
207 | 225 | | |
208 | 226 | | |
209 | 227 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
601 | 601 | | |
602 | 602 | | |
603 | 603 | | |
| 604 | + | |
| 605 | + | |
| 606 | + | |
| 607 | + | |
| 608 | + | |
| 609 | + | |
| 610 | + | |
| 611 | + | |
| 612 | + | |
| 613 | + | |
| 614 | + | |
| 615 | + | |
| 616 | + | |
| 617 | + | |
| 618 | + | |
| 619 | + | |
| 620 | + | |
| 621 | + | |
| 622 | + | |
| 623 | + | |
| 624 | + | |
| 625 | + | |
| 626 | + | |
| 627 | + | |
| 628 | + | |
| 629 | + | |
| 630 | + | |
| 631 | + | |
| 632 | + | |
| 633 | + | |
| 634 | + | |
| 635 | + | |
| 636 | + | |
| 637 | + | |
| 638 | + | |
| 639 | + | |
| 640 | + | |
| 641 | + | |
| 642 | + | |
| 643 | + | |
| 644 | + | |
| 645 | + | |
| 646 | + | |
| 647 | + | |
| 648 | + | |
| 649 | + | |
| 650 | + | |
| 651 | + | |
| 652 | + | |
| 653 | + | |
| 654 | + | |
| 655 | + | |
| 656 | + | |
| 657 | + | |
| 658 | + | |
| 659 | + | |
| 660 | + | |
| 661 | + | |
| 662 | + | |
| 663 | + | |
| 664 | + | |
| 665 | + | |
| 666 | + | |
| 667 | + | |
| 668 | + | |
| 669 | + | |
604 | 670 | | |
605 | 671 | | |
606 | 672 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
45 | 45 | | |
46 | 46 | | |
47 | 47 | | |
| 48 | + | |
48 | 49 | | |
49 | 50 | | |
50 | 51 | | |
| |||
0 commit comments