Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1862,6 +1862,38 @@ jobs:
- name: Teaching-corpus lexical anti-drift ratchet
run: pnpm check:corpus-claim-drift

# #13678: the third gate over this corpus, and the only one asking an
# EXISTENCE question rather than a lexical one. The two steps above ask
# whether a forbidden word appears, and whether a spelling stands next to
# prose naming a semantic it does not have. This one asks, in both
# directions, whether the identifiers the catalog names and the schema
# members it enumerates are the same set:
#
# Leg 1 (phantom row) a table row citing an identifier that greps to
# zero in `packages/**` is a red. Measured: 3 of 6
# falsehoods in one skill were this class, every one
# catchable by a single grep of the cited name.
# Leg 2 (missing row) a section REGISTERED as exhaustive over a schema
# symbol that does not document every member is a
# red. Measured on a later flight: 15 of 20.
#
# Leg 2 is table-driven rather than inferred, and that is a measurement
# result, not a preference — auto-binding a doc table to any enum it is a
# subset of scored 1 true positive in 3 on this corpus, because deliberate
# subsets ("Three action types dispatch headlessly") and semantically mixed
# enums are indistinguishable from real gaps without a human. The heuristic
# ships as `--suggest`, which cannot fail anything.
#
# It lives in this job for the reason every other docs guard does
# (`check:doc-anchors`, `check:role-word`, `check:corpus-claim-drift`
# above): this job carries the whole `check:*` gate family and has no paths
# filter. That matters more here than for its neighbours — the gate's two
# inputs are `skills/**` and `packages/**`, so a paths filter on either
# would let the OTHER side drift a member in or an identifier out without
# ever running the check that notices.
- name: Published-skills identifier liveness gate (two legs)
run: pnpm check:skill-identifier-liveness

# #11671: `os i18n extract --fill=default` fills GAPS only, so revising a
# source string rewrites `en` and strands the previous source text in every
# other locale. The bundle stays in sync BY KEY, so `check:i18n` reports OK
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
"check:template-version-sync": "node scripts/sync-template-versions.mjs --self-test",
"check:role-word": "node scripts/check-role-word.mjs --self-test && node scripts/check-role-word.mjs",
"check:corpus-claim-drift": "node scripts/check-corpus-claim-drift.mjs --self-test && node scripts/check-corpus-claim-drift.mjs",
"check:skill-identifier-liveness": "node scripts/check-skill-identifier-liveness.mjs --self-test && node scripts/check-skill-identifier-liveness.mjs",
"check:quick-reference-counts": "node scripts/check-quick-reference-counts.mjs --self-test && node scripts/check-quick-reference-counts.mjs",
"check:overlay-whitelist-table": "node scripts/check-overlay-whitelist-table.mjs --self-test && node scripts/check-overlay-whitelist-table.mjs",
"check:runtime-services-index": "node scripts/check-runtime-services-index.mjs --self-test && node scripts/check-runtime-services-index.mjs",
Expand Down
28 changes: 28 additions & 0 deletions scripts/check-ratchet-remedy-authority.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -756,6 +756,34 @@ const CONTROL = {
why: 'PR for #13582. Its per-file, per-rule baseline is shrink-only; the author\'s remedy is to reword the sentence, and the baseline path that admits a genuinely true construction beside a pinned spelling is offered only as a maintainer\'s.',
},

// The eleventh, and the third gate over the published catalog (#13678). It
// carries TWO offers on ONE ledger file and both are marked, which is why the
// row is worth reading rather than counting:
//
// LEG 1 offers an EXEMPTION — "this identifier is live somewhere this repo
// cannot index". That half is shrink-only BY CONSTRUCTION rather than by
// policy: `--update` prunes entries the scan no longer reaches and there is
// no code path that adds one, because the `kind`/`note` a row must carry are
// human judgements nothing in the tree encodes. A hand edit is therefore the
// only way in, and it is the maintainer's.
//
// LEG 2 offers a GAP entry — a measured count of schema members a section
// registered as exhaustive does not document. That half IS regenerated from
// the tree, so its flag moves whichever way the tree moved and only policy
// tells a ratchet-down from a weakening apart. Same treatment as the two
// `--update` gates above.
//
// Both messages offer the author's own remedy first and unmarked (correct the
// row; document the member), which is the shape this convention wants.
//
// ⚠️ Recorded from the sweep's own verdict — this gate reported it as `marked`
// before the row was written, and the row was written because the sweep
// demanded it. Author intent and detector agreeing is the point of the corpus.
'check-skill-identifier-liveness.mjs': {
expect: 'marked',
why: 'PR for #13678. A two-legged liveness gate over skills/**: a row citing an identifier that greps to zero, and a section registered exhaustive that omits a live schema member. One ledger, two halves — the Leg 1 exemptions are shrink-only by construction (--update only prunes them), the Leg 2 gaps are a regenerated shrink-only ratchet — and both weakening paths are the maintainer\'s, offered after the author\'s own.',
},

// ── Declaration registries and near-misses: recording the fact IS the fix ──
'check-agent-model-declared.mjs': {
expect: 'excluded',
Expand Down
Loading
Loading