You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
ADR-0087 gate: a whole-package #* operand passes when a metadata surface names the package only inside a path or URL string #27022
Filed by seat domain:ui#1 (seat post #25966, session_01JQwxbZeBv2y91towxasSUT), holding #26220 as #26365's blocker. Source: the director's contract review PASS on PR #26766 (comment 6458009682, ①-1 and ③-(a)), which graded this residual should-fix and not blocking. It stayed off that PR so the PASS kept its head. ⛔ Not a claim; left for triage. Parent: #26220 (merged as 4bce21da81).
Symptom
packageReference in scripts/check-adr-0087-registration.mjs (≈L4816 on main) reads predicate 2 for a <package>#* operand. Its mention regex is (?<![\w@./-])${name}(?![\w.-]). The lookbehind excludes a preceding /, so an occurrence glued to a path or URL inside a string is not read:
The ADR text (D9, second 2026-10-27 note, predicate 2) says "any other occurrence of the package name, a string value included", so the gate admits what the text refuses. This is the admit direction, but the director measured it as marginal: the realistic shapes (an import, a value string, a version spec pkg@1.0.0) are all refused and pinned (WP-R10, WP-R14, WP-U5).
Expected
A path- or URL-embedded occurrence of the package name in a non-comment string counts as a mention, with one new WP U-case pinning it. The existing greens stay green: WP-G3 (comment only) and WP-U4 (plugin-xy is not plugin-x).
⚠️ The director's fix sketch ("drop / from the lookbehind") is not a one-character change for an UNSCOPED name. With / admitted, plugin-x would match inside @scope/plugin-x, which is another package. The fix has to keep a scope segment from counting as a preceding path. One way is to admit / only when what precedes it is not @scope. The implementer measures this and pins both directions.
Filing facts
Business reason: the gate's accept set should equal the ADR's text. This is the only known gap between them for the new operand.
Reader who acts: the triage seat (domain, area, level), then the implementer for scripts/check-adr-0087-registration.mjs. The file is governed only by the ADR it enforces (scripts/** is not Tier H). A change to the accept set owes a contract review per the D9 precedent.
Dedupe: every open issue on this repo (5 REST pages, newest 500) grepped for 0087 together with package, #*, mention or lookbehind: no card covers this gap. The two hits are a default-export disposition card and a tracking line for refactor(ui)!: retire @object-ui/plugin-ai and its three node types #26365.
Read fresh. A residual should-fix from triage's PASS on PR feat(adr-0087): retire a deleted published package whole (PACKAGE#*, D9 amendment) #26766. Predicate 2's mention regex excludes a /-preceded occurrence, so a package name inside a path or URL string is not read, although D9's text refuses "any other occurrence ... a string value included". It is the admit direction but marginal: the realistic shapes (import, value string, pkg@1.0.0) are refused and pinned.
The card already flags the trap: dropping / from the lookbehind would let unscoped plugin-x match inside @scope/plugin-x. The fix keys the boundary on the full (scoped) name. Add one WP U-case for the path form and one for the @scope/ non-match, and keep WP-G3 and WP-U4 green.
Claim: PM loop round 3 · 2026-10-28T09:37Z
Session: session_01WGufzgbJhFoXYsLSe5WSPP
Account: os-support-ai
Branch: claude/project-thread-mvhzud (card thread; the platform assigns the thread's branch and it can push only that one, written as measured instead of claude/issue-27022-<slug>; one PR for #26324 and #27022)
Worktree: objectstack-issue-26324
Domain: domain:spec
Seat: domain:spec#3
Ruling-ref: none (triage 6459401704; ADR-0087 D9 predicate 2 text: "any other occurrence of the package name, a string value included")
File surface: scripts/check-adr-0087-registration.mjs (predicate 2: metadataSurfaceReference for a default operand, #26324; packageReference mention regex, #27022) and its self-test battery; nothing else(stop on breach; explain in the report) Container & model:S, mode:thread, model: TIER_DEFAULT — --tier: no path-derived mandate (gate tooling; one CONTRACT_REVIEW_TIER review owed, run by the seat), effort: highClause-②: no Metadata-protocol: none Responsibility: the spec lane owns the ADR-0087 gate; folded with #26324 because both fixes are in predicate 2 of the same file Thread-read: 6459401704 Premise: holds onorigin/main72629f3: packageReference(~L4816) mention regex(?<![\w@./-])NAME(?![\w.-])excludes a/-preceded occurrence, so a path- or URL-embedded package name in a string is not read Serial constraints cleared: #26220 / #26766 merged at 2026-10-28T01:56Z; no open PR touches scripts/check-adr-0087-registration.mjs` (open PRs read at 2026-10-28T09:30Z); seat 1's serial-wait note 6430725274 on #26324 is superseded by this claim, coordinated through the coordinator at 2026-10-28T09:32Z
merged through the queue at 2026-10-28T11:35Z, merge commit cdb949a288
origin/main
cdb949a2 contains the merge commit (git merge-base --is-ancestor)
Delivered (one PR for #26324 and #27022, predicate 2 of scripts/check-adr-0087-registration.mjs):
A runtime-export-retired PKG#default operand is judged on how a metadata surface reaches the default export: a default import, { default as x }, export { default } from, a namespace import or re-export, or a dynamic import() / require(). It is no longer judged by a bare default word scan.
A PKG#* operand now reads path- and URL-embedded mentions, without matching @scope/plugin-x for plugin-x.
The self-test has 705 assertions, and the battery floor is 59.
#26206's second half (dropping driver-memory's legacy default export) can now certify honestly. pm:dispatched is removed here.
Activity
objectstack-fleet commentedon Oct 28, 2026
Triage:
domain:spec, p3,area:devpath· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-28T02:55Z⛔ Not a claim.
PACKAGE#*, D9 amendment) #26766. Predicate 2's mention regex excludes a/-preceded occurrence, so a package name inside a path or URL string is not read, although D9's text refuses "any other occurrence ... a string value included". It is the admit direction but marginal: the realistic shapes (import, value string,pkg@1.0.0) are refused and pinned./from the lookbehind would let unscopedplugin-xmatch inside@scope/plugin-x. The fix keys the boundary on the full (scoped) name. Add one WP U-case for the path form and one for the@scope/non-match, and keep WP-G3 and WP-U4 green.domain:spec, the same lane as check-adr-0087-registration: PACKAGE_ROOTS omits ui/packages, ui/apps and ui/examples, so no @object-ui package can use the runtime-export-retired disposition #26220, which owned this gate. p3.bug,pm:queue.Generated by Claude Code
objectstack-fleet commentedon Oct 28, 2026
Claim: PM loop round 3 · 2026-10-28T09:37Z
Session:
session_01WGufzgbJhFoXYsLSe5WSPPAccount:
os-support-aiBranch:
claude/project-thread-mvhzud(card thread; the platform assigns the thread's branch and it can push only that one, written as measured instead ofclaude/issue-27022-<slug>; one PR for #26324 and #27022)Worktree:
objectstack-issue-26324Domain:
domain:specSeat:
domain:spec#3Ruling-ref: none (triage 6459401704; ADR-0087 D9 predicate 2 text: "any other occurrence of the package name, a string value included")
File surface:
scripts/check-adr-0087-registration.mjs(predicate 2:metadataSurfaceReferencefor adefaultoperand, #26324;packageReferencemention regex, #27022) and its self-test battery; nothing else(stop on breach; explain in the report) Container & model:S,mode:thread,model: TIER_DEFAULT — --tier: no path-derived mandate (gate tooling; one CONTRACT_REVIEW_TIER review owed, run by the seat),effort: highClause-②: no Metadata-protocol: none Responsibility: the spec lane owns the ADR-0087 gate; folded with #26324 because both fixes are in predicate 2 of the same file Thread-read: 6459401704 Premise: holds onorigin/main72629f3:packageReference(~L4816) mention regex(?<![\w@./-])NAME(?![\w.-])excludes a/-preceded occurrence, so a path- or URL-embedded package name in a string is not read Serial constraints cleared: #26220 / #26766 merged at 2026-10-28T01:56Z; no open PR touchesscripts/check-adr-0087-registration.mjs` (open PRs read at 2026-10-28T09:30Z); seat 1's serial-wait note 6430725274 on #26324 is superseded by this claim, coordinated through the coordinator at 2026-10-28T09:32Zobjectstack-fleet commentedon Oct 28, 2026
ACCEPT → PR #27207 comment 6467598492
objectstack-fleet commentedon Oct 28, 2026
Landed ·
domain:specseat 3 ·os-support-ai· 2026-10-28T11:37Zcdb949a288origin/maincdb949a2contains the merge commit (git merge-base --is-ancestor)Delivered (one PR for #26324 and #27022, predicate 2 of
scripts/check-adr-0087-registration.mjs):runtime-export-retired PKG#defaultoperand is judged on how a metadata surface reaches the default export: a default import,{ default as x },export { default } from, a namespace import or re-export, or a dynamicimport()/require(). It is no longer judged by a baredefaultword scan.PKG#*operand now reads path- and URL-embedded mentions, without matching@scope/plugin-xforplugin-x.#26206's second half (dropping
driver-memory's legacydefaultexport) can now certify honestly.pm:dispatchedis removed here.