Uh oh!
There was an error while loading. Please reload this page.
docs(skills): objectstack-platform states load-time refusal, not silent stripping - #10038
Merged
Conversation
…nt stripping An unknown top-level `defineStack` key has thrown since the outermost strict door closed; the published platform skill still taught that it was silently stripped and therefore a harmless no-op. The direction of that error is the harmful one: it ranks a stack that does not load as cosmetic. Four sites corrected, all re-measured against the built `@objectstack/spec`: - rules/bootstrap-patterns.md — the `driver:` mechanism sentence, the "(Silently Stripped)" heading, and the inline "no-op" comment. The prescription (drivers are plugins) is unchanged; only the stated mechanism moves, and it now quotes the real load-time and TS2353 output. - SKILL.md — the blanket "unknown keys are silently stripped" sentence is replaced by the measured per-surface split (refused vs warned-then-dropped) rather than flipped wholesale. - SKILL.md — the feature-flags aside repeating the same stale claim. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AeA3nU1B5Q2pgxqxgUrexd
os-warren
marked this pull request as ready for review
August 19, 2026 18:18
… refusal The quoted defineStack refusal used the ADR-0090 D3 reserved word as its example key, which added a third occurrence to a file baselined at two and red-lit check:role-word. The sibling example in the sentence above it is already `policies:`, so the quote now uses that instead. Not an edited quote: the refusal was re-measured live against the built @objectstack/spec with `policies` as the offending key, and the output is reproduced as measured. The two pre-existing occurrences are untouched, and the baseline is not modified — the ratchet returns to 2 by removing the new occurrence, which is the author-side remedy. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AeA3nU1B5Q2pgxqxgUrexd
Uh oh!
There was an error while loading. Please reload this page.
os-warren pushed a commit
that referenced
this pull request
Aug 20, 2026
…ivation check-role-word walks ROOTS = ['content/docs', 'skills'], but dispatch-gates builds its watch hints from path literals carrying a separator, so the bare word `skills` produced no hint at all: a skills-only card derived the content half and scored this gate `silent`. PR #10038 paid one repair round for it — a green local union, then `role-word count grew 2 to 3` in CI. Adds the provenance-only subtree declaration (`skills/**`) in the gate's own source, the same pattern root-file populations use, with the coupling to ROOTS pinned in both self-tests. The extractor and hintCovers are untouched: that refusal of bare single-segment literals is measured and deliberate. No scanning behaviour changes. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AeA3nU1B5Q2pgxqxgUrexd
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes#9907
The published
objectstack-platformskill taught that an undeclared top-leveldefineStackkey is silently stripped and therefore a harmless no-op. That hasnot been true since the outermost strict door closed: the parse refuses the key
and the stack does not load. The direction of the error is the harmful one — the
doc understates the failure, so an agent reading it ranks "the stack does not
load" as cosmetic, or spends a debugging pass hunting a runtime symptom that a
load-time refusal already produced loudly.
The prescription at every site was already correct and is unchanged (drivers are
plugins, not a
driver:key). Only the stated mechanism moves.Re-measured, not recalled
Both legs were measured in a worktree against a freshly built
@objectstack/spec, built under the shared verify lock(
VERDICT command-exit 0).Runtime leg —
defineStack({ manifest, driver: {…} }):Compile leg — the same literal through
tsc --noEmitagainst the builtdist/index.d.mts, exit 2:Negative control for the compile leg: the identical probe with
driver:removedcompiles clean, exit 0 — so the probe measures the key, not a broken setup.
The phantom-key example quoted in
SKILL.mdwas re-measured separately, againsta rebuilt spec, with
policiesas the offending key (see "Second commit" below);its control — the same stack with the phantom key deleted — loads normally.
The card's secondary premise did not survive re-measurement
The card asked for the general sentence to be split as "top level refuses;
ObjectSchema/FieldSchemastill warn". Measured, they do not warn — theyrefuse too, on the same parse path:
warnUnknownAuthoringKeysis still live, but its population has shrunk to theshapes that are still strip-mode. Its top-level half is now deliberately silent
by construction —
lintUnknownStackKeysreturns[]unless the stack schema'sposture is
strip, measured[]here, so the strict root reports once ratherthan twice.
listLintableAuthoringCollections()reports exactly two collectionsleft:
connectorsandviews.A live warn case on
connectors— warns, does not throw, value gone after theparse:
So the page states the split as measured — refused vs warned-then-dropped — and
is not flipped wholesale in either direction.
Sites changed
Four, all the same defect class. Three are the card's; the fourth came from the
prescribed sweep of the rest of the skill directory and is named here rather than
landed quietly.
rules/bootstrap-patterns.md(opening)driver:entry is a no-op"rules/bootstrap-patterns.md(heading)driver:Key (Silently Stripped)"driver:Key (Rejected at Load)"rules/bootstrap-patterns.md(inline comment)SKILL.mdFull Configuration ReferenceSKILL.mdFeature FlagsThe fourth site qualifies under the bounded in-place exemption: same defect class
as the card, mechanical with the correct form already pinned by the measurement
above, no other claim on the file, same gate family, no new verification surface.
A closing rescan of
skills/objectstack-platform/forsilently strip|stripped by strict|no-op|Silently Strippedleaves two hits, both the negations this PR wrote.Second commit — ADR-0090 D3 ratchet
CI caught a real defect in the first commit, not a flake. The quoted refusal used
the D3 reserved word as its example key, taking
SKILL.mdfrom its baselined 2occurrences to 3:
The example key in the quote is now
policies, which the sentence directly aboveit already uses as its sibling example. This is not an edited quote: the
refusal was re-measured live against a rebuilt
@objectstack/specwithpoliciesas the offending key, and the output is reproduced as measured. Thetwo pre-existing occurrences are untouched and
scripts/role-word-baseline.jsonis not modified — the ratchet returns to 2 by removing the new occurrence,
which is the author-side remedy; baseline expansion is maintainer-only and was
not taken.
Verification at
8e1b43c01node scripts/pm/dispatch-gates.mjswith no paths (change set derived by thescript itself from the real diff vs merge base
09b880b0c; committed 2, workingtree 0, untracked 0) matched one family. The union below was re-run on the final
commit and each row quotes the gate's own verdict line, with exit codes captured
before any pipe:
check:role-wordcheck-role-word: OK, no new occurrences of the reserved word.(ledger: 43 baselined files, 129 occurrences; this file back to 2)check:pm-governed-merges(matched)check-governed-merges --self-test: 81 assertions …check:skill-compatibilitycheck-skill-compatibility-version: 11 SKILL.md file(s) reconciled against 77 workspace packagescheck:skill-frame-synccheck-skill-frame-sync: 4 copies of the decision frame are structurally isomorphic across 3 filescheck:skill-frame-freshnesscheck-skill-frame-freshness: the decision frame in this tree is current with origin/main (fetched just now).check:pm-skill-ratchetcheck-skill-line-ratchet: AGENTS.md is 958 lines (ceiling 958; headroom 0).check:pm-skill-id-lintcheck-skill-id-lint: 15 file(s) clean (pattern /#[0-9]{3,}/g).check:pm-governed-prosecheck-governed-prose: 2 instruction surface(s) name all 5 registered governed surfaces …check:nul-bytescheck-nul-bytes: OK (scanned 6355 text file(s) … no raw ASCII control bytes).check:role-wordwas not in the derived set and was added by hand after CIfound it. The cause is recorded rather than papered over: the gate's population
is
['content/docs', 'skills'], and the derivation extracts onlycontent/docs, scripts/role-word-baseline.json— a bare separator-less literallike
skillsis refused as too generic byhintCovers, so the gate scoressilentfor everyskills/**card while genuinely covering it. Left forseparate triage; not touched here.
Residue derivation placed all 115 discovered families (1 matched, 35 undetermined,
79 silent). The published
skills/root carries no line ratchet, so this pays noline budget.
Notes
skills/**) — this PR opens draft and stays draft. Themaintainer merges; it is never queued, armed, or flipped ready. Review
requested from
os-zhuang. The second commit was added as a commit, never anamend or a force-push.
skills/appears in no package's publishedfileslist (checkedacross 73 package manifests, zero hits), so this PR releases nothing.
skip-changesetapplied, following the precedent of the most recentskills-only PR.
still open; the page says so without pinning a date.
Generated by Claude Code