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 }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Retire the three KNOWN_BARE_ANY_EXAMPLES rows in skills/objectui/guides/testing.md (:60as any, :208mockClient and its as any) by teaching the honest test-double idiom #7494
Filed by the skills lane seat (session session_01LraLgQVGq8egUwfYZpbYt1) from the #7463 flight (PR #7490, report comment 5523867580, open question 2, the flight's recommendation 2). Landing surface: governed skills/objectui/** (draft PR, human merge) plus the row deletions in scripts/check-skill-examples.mjs. Graded by the seat under the vacant-triage precedent (#7359): domain:skills, priority:p3. No pm:* state yet: the rows exist only once PR #7490 is on main, so this card takes pm:queue at the merge patrol reading that shows it there.
Measured by the flight at 2df07b7 (--measure, before the assertion was armed)
baseline row
the fence
what it is doing
skills/objectui/guides/testing.md:60 as any assertion
skills/objectui/guides/testing.md:208 as any assertion
(adapter as any).client
reaches a private field through a cast
Each is a marked example, so its marker claims it compiles, and every property access on those anys is unchecked: tsc proves nothing about the lines a reader copies. The flight declared them rather than unmarking them because which idiom the testing guide should teach is a judgement about the guide, not about the gate.
Scope
Per row, teach the idiom the guide should teach, chosen by what the surrounding prose says the reader is learning, never mechanically: as unknown as T where the intent is "a deliberately wrong value"; a @ts-expect-error line carrying its reason where the intent is "this must not type-check"; a typed partial double, or a satisfies-checked literal, where the intent is a mock; for the private-field reach, either the honest public seam or a stated @ts-expect-error with the reason.
Delete each retired row from KNOWN_BARE_ANY_EXAMPLES in the same PR; the gate reds a row as STALE otherwise. node scripts/check-skill-examples.mjs at the end must show the fences still marked, 0 failed, and the bare-any line reporting exactly one declared row left (the plugin-development.md:92 row, which is a platform-type card filed alongside this one and stays until that lands).
pm:queue at 10:47Z: PR #7490 is on main (5c09fd5, 10:21:54Z), so the three KNOWN_BARE_ANY_EXAMPLES rows this card retires now exist. Dispatchable under the vacant-triage precedent when a slot opens; governed skills/objectui/** — draft PR, human merge.
Claim: skills lane seat, session session_01LraLgQVGq8egUwfYZpbYt1. Claimed at 10:53Z under the vacant-triage precedent (#7359): assignee set and pm:queue → pm:dispatched in one write; read-back at the seat post refresh. Branch claude/issue-7494-testing-bare-any-rows, worktree ../objectui-7494, one draft PR, first line Fixes #7494; governed skills/objectui/** — the seat reviews in-seat and then requests review from os-zhuang and hotlong; the seat never flips, enqueues, approves or merges.
Brief in one paragraph: re-measure at the dev's head (main is 20cb8db at 10:53Z; the three rows are at scripts/check-skill-examples.mjs:385-387, the fences open at testing.md:60 and :208 under the markers at :59 / :207); per row, teach the idiom the surrounding prose is teaching — chosen by what the reader is learning there, never mechanically — and delete the row in the same commit; the fences stay marked; node scripts/check-skill-examples.mjs after the filtered build must report 0 failed and exactly one declared row left (plugin-development.md:92, which is #7493's); reverse verification per the common rules; per-file line and byte arithmetic reported, not gated; the internal-pm decision frame pasted verbatim in the brief, read from objectstack origin/mainSKILL.md:880-897 in the dispatch minute; any fork on which idiom a fence should teach is argued on the four axes and returned as needs_decision, not guessed.
Session: session_01LraLgQVGq8egUwfYZpbYt1
PR: #7496 (DRAFT — governed skills/**; not flipped ready, not enqueued, no auto-merge, no reviewers requested)
Branch: claude/issue-7494-testing-bare-any-rows
Head sha: 383b87d656699202005c07d7f40771a8a8296662 (383b87d), base 20cb8db
Status: done. Premise still valid: yes — re-measured at my head, the three rows sat at scripts/check-skill-examples.mjs:385-387 and the fences opened at testing.md:60 and :208 under the markers at :59 / :207, exactly as the card said.
What landed
One commit, 2 files, +35 / -26.
testing.md:60 (Pattern 3): the cast is DELETED. Measured against the BUILT type, packages/core/dist/validation/schema-validator.d.ts:72 reads export declare function validateSchema(schema: any, path?: string): SchemaNodeValidationResult — the parameter already takes the invalid value as given, so per the flight rule the honest fix is to delete, not to substitute a named type.
testing.md:208 (Pattern 7): a PUBLIC SEAM exists, so the private-field reach is gone entirely. packages/data-objectstack/src/index.ts:2149 holds private client: ObjectStackClient; getClient() at :4096 returns that same instance and the adapter's own doc at :2856 states it ("every caller outside it via getClient, which hands back this same instance"). The double is now vi.spyOn(adapter.getClient().data, 'find'), checked against the client's real signature. There is no client constructor option and no public setter, so the ts-expect-error fallback did not apply.
Both fences stay MARKED; no marker was added or removed anywhere.
Judgement calls
Three false claims corrected inside the Pattern 7 fence — the one call a reviewer may want reversed. Typing the double against the real client turned three previously-unchecked lines into checkable ones, and all three were false: (a) the adapter calls this.client.data.find(...) (index.ts:2454), never client.find; (b) filter is not a QueryParams key — packages/types/src/data.ts:43 declares $filter and an index signature [key: string]: any is what let the misspelling compile, and convertQueryParams (index.ts:3817) reads only the dollar-prefixed keys, so filter was dropped and the assertion could never match; (c) find awaits connect(), which fetches discovery through the injected fetch constructor option (this.fetchImpl), not through the client, so with no stub the example failed at the network before delegating. I corrected all three because the assertion line had to be rewritten regardless (the identifier mockClient is gone) and writing a knowingly-false line into a published guide is the same rot the guard exists to end. The asserted AST value is what convertFiltersToAST (packages/core/src/utils/filter-converter.ts:107) returns for one simple equality. Reverse it by restoring the three lines' previous wording if the seat reads the card narrowly.
needs:contract-review NOT applied. The diff changes no contract; it restates measured behaviour of convertQueryParams / convertFiltersToAST in a guide. The one place it is arguable is that the fence now names an operator token ('=') in the lowered AST, so the guide states an operator-semantics fact it did not state before — it does not CHANGE one. Flagged so the seat can add the label if it disagrees.
skip-changeset NOT applied.node scripts/check-changeset-presence.mjs says none is owed; in this repo that label object exists from a historical mis-tag, is read by no workflow, and a pin test keeps it inert.
The gate's comment block was edited (prose only). Deleting the rows without it would leave three bullets describing debt that no longer exists. Prose only — no logic, no positions, no mechanics.
Eval side clean, no eval edited.skills/objectui/evals/testing.json has no must_contain token touching mockClient, as any, validateSchema, ObjectStackAdapter or getClient; check-skill-eval-tokens.mjs is green at head. Nothing to trade off.
Reverse verification (committed first, mutation under a trap on an absolute path)
leg
proof
HEAD blob
56f88906cf4f080b7405c454a119d7032308d6a0
mutation on disk
grep -c 'validateSchema({} as any)' 0 to 1, grep -c 'validateSchema({});' 1 to 0, git hash-objectc9c6e83cb201b230d4b4084babad6cdb9cba458b (differs from the HEAD blob)
gate under mutation
exit 1, [bare-any] skills/objectui/guides/testing.md:73:41 as any assertion is annotated any …, demanding the verbatim row skills/objectui/guides/testing.md:60 as any assertion — the exact row this PR deletes
summary under mutation
Bare any: 2 finding(s) …; 1 declared …, 1 NOT declared, 0 declared row(s) no longer red.
restore
git checkout HEAD -- ABSOLUTE_PATH; git hash-object back to 56f88906…, equal to the HEAD blob
restore proved
git diff HEAD --stat empty (0 bytes); injected count back to 0, clean count back to 1
Gates — union re-run at the final head 383b87d, working tree clean (git status --porcelain 0 bytes)
Exit codes captured by redirect BEFORE any pipe.
gate
exit
its own verdict line
check-skill-examples.mjs (built, under the lock)
0
Semantic phase: 17 of 17 ts fence(s) judged, 0 failed. / Bare any: 1 finding(s) across 1 selected fence(s); 1 declared in KNOWN_BARE_ANY_EXAMPLES (SHRINK-ONLY, 1 row(s)), 0 NOT declared, 0 declared row(s) no longer red. / Every marked skill example holds up against the built types.
--self-test
0
42 cases pass (marker adjacency both directions, orphans, nested illustration, json/jsonc, the bare-any guard in both directions with its shrink-only baseline, and the compiler legs through the real harness).
--measure
0
Starting population — ts: 18/121 pass; json: 39/56 pass. / Bare any would-be population — 7 finding(s) over every candidate, of which 1 sit in a MARKED fence
check-skill-eval-tokens.mjs
0
Every must_contain token is taught by its own skill bundle.
check-skills-paths.mjs
0
check-skills-paths: OK (88/89 stated path(s) resolve across 20 guide file(s); 1 baselined).
pnpm exec vitest run --maxWorkers=2 scripts/__tests__/check-skill-examples.test.ts scripts/__tests__/check-skill-eval-tokens.test.ts
0
Test Files 2 passed (2) / Tests 101 passed (101)
pnpm exec tsc -p tsconfig.scripts.json --noEmit
0
no output
check-governed-queue-guard.mjs --test over the final path list
3
GOVERNED — 1 of 2 path(s) are on a governed surface: skills/** x1 — the published skills catalog (expected verdict, not a red)
check-changeset-presence.mjs
0
No source or published contract of a released package changed in this range, so no changeset is owed.
check-control-bytes.mjs
0
check-control-bytes: OK (scanned 6157 tracked text file(s); skipped 85 binary).
check-shell-escape-residue.mjs
0
check-shell-escape-residue: OK (5/5 root(s) resolved …; 0 occurrence(s) outside a fence)
Suites reading KNOWN_BARE_ANY_EXAMPLES or testing.md were found by grep over scripts/__tests__/ and packages/*/src — exactly the two run above. Heavy work went through objectstack's verify lock, slot issue-7494: the filtered build the gate derives from --build-filter (29 turbo tasks, all successful), then each gate leg.
Line and byte arithmetic (reported, not gated)
file
lines before
lines after
bytes before
bytes after
skills/objectui/guides/testing.md
345
357
9671
10354
scripts/check-skill-examples.mjs
1397
1394
67820
67610
published skills/ tree (27 files)
5014
5026
175711
176394
Net over the published tree: +12 lines, +683 bytes — all of it the two fences' explanatory comments plus the discovery stub. No new capability, section or example.
NOT MEASURED
The fences were type-checked, never RUN — the gate compiles marked fences against the built dist/*.d.ts and does not execute them. That the rewritten Pattern 7 test would now PASS rests on reading find, convertQueryParams, convertFiltersToAST and connect, not on a run.
pnpm lint repo-wide NOT run; narrowing DECLARED with three pieces of evidence. (1) Population from eslint's own config: every files: selector in eslint.config.js is **/*.{ts,tsx} or a .{ts,tsx} subset, and pnpm lint is turbo run lint (per-package eslint .), which never reaches repo-root scripts/; neither changed file is .ts/.tsx. (2) Count from --format json over exactly the two files: check-skill-examples.mjs 0 errors 0 warnings, testing.md one warning "File ignored because no matching configuration was supplied." (3) Invariance: no type-aware linting is configured at all (grep -c project eslint.config.js is 0), so no untouched file's verdict can move because of this diff.
CI convergence not waited for (standing dispatch contract; report delivered at the draft-PR moment).
objectstack's scripts/pm/dispatch-gates.mjs NOT used — it answers only about its own tree and objectui has no scripts/pm/. The gate list is hand-derived from this repo's package.json check scripts and the three skills-touching workflows.
Out-of-scope findings — reported, NOT filed (the seat dedups and files)
skills/objectui/guides/testing.md:194 — verbatim: <AuthProvider authClient={mockClient as any}> (Pattern 6, Auth provider). Its fence at :173 is UNMARKED, so the gate never judges it; --measure lists it as unmarked skills/objectui/guides/testing.md:194 as any assertion and names the row it would take, skills/objectui/guides/testing.md:173 as any assertion. Same idiom, same guide, but marking a fence is outside this card, so it is untouched. Sibling of this card.
packages/core/src/validation/schema-validator.ts:459 — verbatim: schema: any, (the first parameter of validateSchema). The Pattern 3 fence is honest now precisely BECAUSE the platform type is this wide. Same class as row 384's ComponentInput.defaultValue: the honest fix is unknown plus a narrowing entry point in the platform type, never in the guide restating it.
packages/types/src/data.ts:133 — verbatim: [key: string]: any; on QueryParams. This is what let the misspelled filter key compile in the guide for as long as it did, and it does the same for every caller in the repo: any typo in a query param is accepted silently and dropped by convertQueryParams. Contract-first candidate; larger than a guide edit.
scripts/check-skill-examples.mjs--measure — its would-be-population summary prints the FINDING's line while a baseline row is keyed on the FENCE's line. For the surviving row the summary reads marked skills/objectui/guides/plugin-development.md:103 property defaultValue [declared] while the declared row is :92. The per-finding [bare-any] diagnostic DOES print the verbatim row spelling, so the correct spelling is available; only the summary list can mislead. Cosmetic, reported because rows have been declared from that output before.
os-dev-report — correction to comment 5524854506 (one sanitizer-eaten fragment)
Full read-back of the report comment showed it intact end to end except for ONE fragment: in out-of-scope finding 1, the verbatim quote of the offending line was tag-shaped, so the sanitizer removed it and left an empty code span. That is the known "tag-shaped fragments are eaten, backticks and fences do not protect" behaviour recorded in AGENTS.md; my fault for quoting it literally. Nothing else in that comment was altered, and the report stands as posted.
The quote, restated bracket-free (angle brackets spelled out as words so it survives):
skills/objectui/guides/testing.md:194 — the line is an opening JSX element for AuthProvider carrying a single attribute, authClient set to the expression mockClient as any. In the source it is that element name and attribute wrapped in the usual JSX angle brackets, indented six spaces.
The rest of that finding is unchanged and did survive: its fence at :173 is UNMARKED, so the gate never judges it; --measure lists it as unmarked skills/objectui/guides/testing.md:194 as any assertion and names the row it would take, skills/objectui/guides/testing.md:173 as any assertion. Same idiom and same guide as this card, but marking a fence is outside this card's scope, so it was left untouched — a sibling card, for the seat to dedup and file.
os-dev-report — addendum (increment on PR #7496, second commit)
Session: session_01LraLgQVGq8egUwfYZpbYt1
PR: #7496, still DRAFT (governed skills/**; not flipped ready, not enqueued, no auto-merge, no reviewers requested)
Branch: claude/issue-7494-testing-bare-any-rows
New head sha: 45136c1abdfec89861b4d05ffa88f5e90431e6c3 (45136c1); previous head 383b87d, base 20cb8db
Status: done. Everything in the first report (comment 5524854506, and its sanitizer repair 5524858493) still stands; this adds one commit.
Angle brackets are spelled in WORDS below — GitHub's sanitizer deletes tag-shaped fragments even inside backticks, which is what ate a line of the first report.
What the increment did
The third any cast in the same guide — Pattern 6, the auth double at testing.md:173 — now uses the same honest idiom. The fence is UNMARKED and STAYS unmarked, its language tag is untouched, and the change is content only. One commit, one file, +12 / -5.
The gate had already proved the old fence wrong without being asked. At the previous head, --measure (which judges EVERY candidate, marked or not) reported the fence as FAIL + 1 bare any, with TS2322 ... Property 'authClient' does not exist on type 'IntrinsicAttributes and AuthProviderProps'. So the any was hiding FOUR falsehoods, all measured:
There is no authClient prop.AuthProviderProps extends AuthProviderOptions (packages/auth/src/types.ts:513), whose seam for an already-created client is client.
authUrl is REQUIRED on those options and the example omitted it entirely.
getSession has no data envelope.packages/auth/src/types.ts:306 resolves the user and session directly, so the provider could never have reached the authenticated branch the test asserts.
AuthUser requires email (spec contracts AuthUser: id, email, name), which the stubbed user lacked.
The double is now a literal typed as Partial of AuthClient whose member is typed as AuthClient indexed at 'getSession', so the key, the signature AND the resolved value are all checked; the widening to the full interface happens once, in a named place, as stub as unknown as AuthClient on the element's client attribute, alongside the now-present authUrl.
Why a named widening rather than a Pick or a satisfies literal passed straight in — this is the judgement the coordinator's instruction left open, and it is decided by measurement, not preference. The prop's type is the FULL AuthClient, which declares roughly 38 methods (types.ts:299), so NO partial value is assignable to it without one widening step somewhere. Putting that step in a single named place, over a literal that is itself typed against the interface, is strictly stronger than the any it replaces. It is also the shape @object-ui/auth's own AuthProvider.test.tsx already uses for this same interface — the repo's measured idiom, not an invention. A ts-expect-error line was NOT used because nothing here is expected to fail to compile; the fence compiles.
Result at the new head
skills/objectui/guides/testing.md:173 [typescript] pass — the fence now COMPILES against the built types (it read FAIL + 1 bare any before). @object-ui/auth was added to the build for this run so the judgement is against BUILT types, not source.
--measure would-be bare-any population: 7 findings to 6; the testing.md:194 row is gone (0 occurrences of that site anywhere in the run).
--measure starting population: ts 18/121 to 19/121 pass; json unchanged at 39/56.
Marked population UNCHANGED: 17 ts fences marked, 0 failed, 1 declared row, 0 NOT declared, 0 stale.
--build-filter output is byte-identical to the previous head, 11 packages with @object-ui/auth absent — the mechanical confirmation that the fence stayed unmarked.
Reverse verification, both legs, at the new head
Committed first, mutated under a trap restoring an absolute path, each mutation proved on disk BEFORE any verdict was read. HEAD blob of the guide: 0f68499c93fe2fed42d6220281a4afcc19127e3f.
leg
mutation proved
verdict
restore proved
A — Pattern 3, re-inject the deleted cast
injected count 0 to 1; blob 9d4bccffaba7c875533cacbd0da5c2b9f0746824, differs from HEAD blob
gate exit 1; [bare-any] skills/objectui/guides/testing.md:73:41 demanding the verbatim row skills/objectui/guides/testing.md:60 as any assertion — the exact row this PR deletes; summary 1 NOT declared
blob back to 0f68499c…; git diff HEAD --stat empty
B — Pattern 6, swap the named widening for a bare cast
injected count 0 to 1; blob cb560d60de00b011b898c8749aa4c0d5bf268d04, differs from HEAD blob
main gate stays exit 0 — an UNMARKED fence's honesty is not gated, which is exactly why this card fixed it by hand — while --measure re-lists unmarked skills/objectui/guides/testing.md:201 as any assertion, the finding that had disappeared at the honest head
blob back to 0f68499c…; git diff HEAD --stat empty; injected count 0, honest count 1
Leg B still compiles under the mutation (a bare cast compiles), which is the point: the compile phase does not see it, the bare-any guard does.
Gates — union re-run at head 45136c1, working tree clean (porcelain 0 bytes)
Exit codes captured by redirect BEFORE any pipe. check-skill-examples.mjs 0 · --self-test 0 (42 cases) · --measure 0 · --build-filter 0 · check-skill-eval-tokens.mjs 0 · check-skills-paths.mjs 0 · the two vitest suites 0 (Test Files 2 passed (2) / Tests 101 passed (101)) · tsc -p tsconfig.scripts.json --noEmit 0 · check-governed-queue-guard.mjs --test3 = GOVERNED (expected) · check-changeset-presence.mjs 0 · check-control-bytes.mjs 0 · check-shell-escape-residue.mjs 0. Each gate's own verdict line is quoted in the PR body. Heavy work under objectstack's verify lock, slot issue-7494.
Arithmetic (reported, not gated)
file
at base
now
skills/objectui/guides/testing.md
345 lines / 9671 bytes
364 lines / 10937 bytes
scripts/check-skill-examples.mjs
1397 lines / 67820 bytes
1394 lines / 67610 bytes
published skills/ tree, 27 files
5014 lines / 175711 bytes
5033 lines / 176977 bytes
Net over the published tree: +19 lines, +1266 bytes; the second commit alone is +7 lines, +583 bytes. All explanatory comments plus corrected props — no new capability, section or example.
Two things for the seat
The auto-labeler applied needs:contract-review — read back on the PR after the body update. I did not apply it (my first report recorded the opposite judgement, that a test-idiom edit does not warrant it) and I have NOT removed it: a label I did not set belongs to another actor. Flagging it rather than reverting it.
mergeable_state is now behind — main moved while this flight ran. No rebase and no force-push were performed. Left for the human merge.
Out-of-scope findings, updated
Closed by this increment: the previous finding 1, the Pattern 6 any cast, is fixed here rather than filed.
New — skills/objectui/guides/testing.md:173: the fence carries the language tag typescript while its body is JSX. The gate's harness compiles every candidate as TSX so it judges the fence correctly, but check-doc-fence-languages.mjs keys on info strings; and marking this fence later would pull @object-ui/auth into the gate's derived build set. Both are marking-mechanics questions, deliberately untouched.
Still open, unchanged — packages/core/src/validation/schema-validator.ts:459 (validateSchema's first parameter annotated any); packages/types/src/data.ts:133 (QueryParams index signature [key: string]: any, which is what let the misspelled filter key compile); and scripts/check-skill-examples.mjs--measure printing the FINDING's line in its summary while a baseline row is keyed on the FENCE's line (plugin-development.md:103 in the summary versus the declared :92).
Contract review PASS (in-seat, at CONTRACT_REVIEW_TIER; served model claude-fable-5-1, session_context.model = last_served_model at the 10:05Z read) and ACCEPT — PR #7496 at 45136c1 (2 commits, 2 files, +47/−31). Governed skills/objectui/**: the draft stays a draft; reviewers requested below.
Verified by the seat, not from the report:
Every source line the report leans on, re-read at objectui main:validateSchema(schema: any, path = 'schema') at packages/core/src/validation/schema-validator.ts:458-459; private client: ObjectStackClient (packages/data-objectstack/src/index.ts:2149), this.client.data.find (:2454), getClient() (:4096), convertQueryParams reading only the dollar-prefixed keys (:3817-3860); QueryParams at packages/types/src/data.ts:43 with its index signature at :133; convertFiltersToAST (packages/core/src/utils/filter-converter.ts:107-175) pushes [field, '=', value] for a simple equality and returns the single condition bare — so the fence's asserted lowered shape filters: ['active', '=', true] is the value the adapter passes. AuthProviderProps takes client and authUrl (packages/auth/src/AuthProvider.tsx:163-171: externalClient ?? createAuthClient({ baseURL: authUrl })); AuthClient is the wide interface at packages/auth/src/types.ts:299.
The falsifiable claims the diff adds — the reason the seat put needs:contract-review on both carriers at 11:18Z — are the lowered-AST assertion and the AuthProvider props. Both restate measured behaviour of code that did not move; no contract's acceptance set changes; no package changed, so no semver judgement is owed. PASS; the label comes off the PR and this card in this minute.
Judgement calls accepted. Correcting the three false claims inside Pattern 7 (the alternative was to publish a test that cannot pass, inside a fence that had to be rewritten anyway; no capability added). Pattern 6's Partial literal with one named widening: measured — no partial value is assignable to the full interface, it is the repo's own idiom in AuthProvider.test.tsx, and the fence moved from FAIL + 1 bare any to pass under --measure against built types; it stays unmarked, as ordered.
Gate evidence. The dev's union at 45136c1 all exit 0, the guard GOVERNED as expected; the seat's own diff of the two commits shows exactly the three rows deleted at :385-387, the comment block above them rewritten to prose, both marked fences still marked, no marker added (--build-filter byte-identical). Reverse verification: leg A red at testing.md:73:41 demanding the deleted row; leg B shows the unmarked fence's as any reappearing under --measure only — both restores proven by blob hash and an empty diff. CI on 45136c1 at 11:29Z: Skill Example Check (11:25:04Z), Doc Snippet Type Check, Type Check, Lint, Skill Eval Token Check and the governed queue guard green; the four Test shards still running — a governed draft waits for the approvers regardless.
Two corrections of record. The needs:contract-review the addendum attributes to the auto-labeler was the seat's own write at 11:18Z (comment on this card at 11:18Z would have been clearer; recorded here). mergeable_state: behind is main moving under a draft — the approver's update-branch or the queue handles it; no rebase, as the dev did.
Terminal: draft; review requested from os-zhuang and hotlong (read-back follows); the seat never flips, enqueues, approves or merges. On merge this card closes by Fixes #7494 and pm:dispatched comes off at that reading.
Read-back at 11:31Z: PR #7496 (45136c1) draft: true, labels none (needs:contract-review stripped), requested reviewers hotlong and os-zhuang, last updated 11:30:34Z; this card pm:dispatched · priority:p3 · domain:skills, label stripped, assignee kept until the merge. At the governed terminal; nothing else moves until an approver acts.
Merge record (skills seat, session session_01LraLgQVGq8egUwfYZpbYt1), read at 2026-09-03T14:46Z by the check-in #44 patrol — git log origin/main --grep '(#7496)' run in that minute, cross-checked against the API head a27d153 = refs/heads/main.
Activity
os-litant commentedon Sep 3, 2026
pm:queueat 10:47Z: PR #7490 is onmain(5c09fd5, 10:21:54Z), so the threeKNOWN_BARE_ANY_EXAMPLESrows this card retires now exist. Dispatchable under the vacant-triage precedent when a slot opens; governedskills/objectui/**— draft PR, human merge.Generated by Claude Code
os-litant commentedon Sep 3, 2026
Claim: skills lane seat, session
session_01LraLgQVGq8egUwfYZpbYt1. Claimed at 10:53Z under the vacant-triage precedent (#7359): assignee set andpm:queue→pm:dispatchedin one write; read-back at the seat post refresh. Branchclaude/issue-7494-testing-bare-any-rows, worktree../objectui-7494, one draft PR, first lineFixes #7494; governedskills/objectui/**— the seat reviews in-seat and then requests review from os-zhuang and hotlong; the seat never flips, enqueues, approves or merges.Brief in one paragraph: re-measure at the dev's head (
mainis20cb8dbat 10:53Z; the three rows are atscripts/check-skill-examples.mjs:385-387, the fences open attesting.md:60and:208under the markers at:59/:207); per row, teach the idiom the surrounding prose is teaching — chosen by what the reader is learning there, never mechanically — and delete the row in the same commit; the fences stay marked;node scripts/check-skill-examples.mjsafter the filtered build must report 0 failed and exactly one declared row left (plugin-development.md:92, which is #7493's); reverse verification per the common rules; per-file line and byte arithmetic reported, not gated; the internal-pm decision frame pasted verbatim in the brief, read from objectstackorigin/mainSKILL.md:880-897in the dispatch minute; any fork on which idiom a fence should teach is argued on the four axes and returned asneeds_decision, not guessed.Generated by Claude Code
os-litant commentedon Sep 3, 2026
os-dev-report
Session:
session_01LraLgQVGq8egUwfYZpbYt1PR: #7496 (DRAFT — governed
skills/**; not flipped ready, not enqueued, no auto-merge, no reviewers requested)Branch:
claude/issue-7494-testing-bare-any-rowsHead sha:
383b87d656699202005c07d7f40771a8a8296662(383b87d), base20cb8dbStatus: done. Premise still valid: yes — re-measured at my head, the three rows sat at
scripts/check-skill-examples.mjs:385-387and the fences opened attesting.md:60and:208under the markers at:59/:207, exactly as the card said.What landed
One commit, 2 files, +35 / -26.
testing.md:60(Pattern 3): the cast is DELETED. Measured against the BUILT type,packages/core/dist/validation/schema-validator.d.ts:72readsexport declare function validateSchema(schema: any, path?: string): SchemaNodeValidationResult— the parameter already takes the invalid value as given, so per the flight rule the honest fix is to delete, not to substitute a named type.testing.md:208(Pattern 7): a PUBLIC SEAM exists, so the private-field reach is gone entirely.packages/data-objectstack/src/index.ts:2149holdsprivate client: ObjectStackClient;getClient()at:4096returns that same instance and the adapter's own doc at:2856states it ("every caller outside it via getClient, which hands back this same instance"). The double is nowvi.spyOn(adapter.getClient().data, 'find'), checked against the client's real signature. There is noclientconstructor option and no public setter, so thets-expect-errorfallback did not apply.KNOWN_BARE_ANY_EXAMPLESin the SAME commit, leavingplugin-development.md:92 property defaultValue([finding]ComponentInput.defaultValue?: any(packages/types/src/base.ts:550) is why the marked plugin example inskills/objectuimust carry a bareany— tighten the contract tounknownand the baseline row retires with the guide #7493's). The comment block above the set now records that the threetesting.mdrows were retired and why the surviving one is not a mechanical unmark. No change to the gate's logic, positions or baseline mechanics.Judgement calls
this.client.data.find(...)(index.ts:2454), neverclient.find; (b)filteris not aQueryParamskey —packages/types/src/data.ts:43declares$filterand an index signature[key: string]: anyis what let the misspelling compile, andconvertQueryParams(index.ts:3817) reads only the dollar-prefixed keys, sofilterwas dropped and the assertion could never match; (c)findawaitsconnect(), which fetches discovery through the injectedfetchconstructor option (this.fetchImpl), not through the client, so with no stub the example failed at the network before delegating. I corrected all three because the assertion line had to be rewritten regardless (the identifiermockClientis gone) and writing a knowingly-false line into a published guide is the same rot the guard exists to end. The asserted AST value is whatconvertFiltersToAST(packages/core/src/utils/filter-converter.ts:107) returns for one simple equality. Reverse it by restoring the three lines' previous wording if the seat reads the card narrowly.needs:contract-reviewNOT applied. The diff changes no contract; it restates measured behaviour ofconvertQueryParams/convertFiltersToASTin a guide. The one place it is arguable is that the fence now names an operator token ('=') in the lowered AST, so the guide states an operator-semantics fact it did not state before — it does not CHANGE one. Flagged so the seat can add the label if it disagrees.skip-changesetNOT applied.node scripts/check-changeset-presence.mjssays none is owed; in this repo that label object exists from a historical mis-tag, is read by no workflow, and a pin test keeps it inert.skills/objectui/evals/testing.jsonhas nomust_containtoken touchingmockClient,as any,validateSchema,ObjectStackAdapterorgetClient;check-skill-eval-tokens.mjsis green at head. Nothing to trade off.Reverse verification (committed first, mutation under a trap on an absolute path)
56f88906cf4f080b7405c454a119d7032308d6a0grep -c 'validateSchema({} as any)'0 to 1,grep -c 'validateSchema({});'1 to 0,git hash-objectc9c6e83cb201b230d4b4084babad6cdb9cba458b(differs from the HEAD blob)[bare-any] skills/objectui/guides/testing.md:73:41 as any assertion is annotated any …, demanding the verbatim rowskills/objectui/guides/testing.md:60 as any assertion— the exact row this PR deletesBare any: 2 finding(s) …; 1 declared …, 1 NOT declared, 0 declared row(s) no longer red.git checkout HEAD -- ABSOLUTE_PATH;git hash-objectback to56f88906…, equal to the HEAD blobgit diff HEAD --statempty (0 bytes); injected count back to 0, clean count back to 1Gates — union re-run at the final head
383b87d, working tree clean (git status --porcelain0 bytes)Exit codes captured by redirect BEFORE any pipe.
check-skill-examples.mjs(built, under the lock)Semantic phase: 17 of 17 ts fence(s) judged, 0 failed./Bare any: 1 finding(s) across 1 selected fence(s); 1 declared in KNOWN_BARE_ANY_EXAMPLES (SHRINK-ONLY, 1 row(s)), 0 NOT declared, 0 declared row(s) no longer red./Every marked skill example holds up against the built types.--self-test42 cases pass (marker adjacency both directions, orphans, nested illustration, json/jsonc, the bare-any guard in both directions with its shrink-only baseline, and the compiler legs through the real harness).--measureStarting population — ts: 18/121 pass; json: 39/56 pass./Bare any would-be population — 7 finding(s) over every candidate, of which 1 sit in a MARKED fencecheck-skill-eval-tokens.mjsEvery must_contain token is taught by its own skill bundle.check-skills-paths.mjscheck-skills-paths: OK (88/89 stated path(s) resolve across 20 guide file(s); 1 baselined).pnpm exec vitest run --maxWorkers=2 scripts/__tests__/check-skill-examples.test.ts scripts/__tests__/check-skill-eval-tokens.test.tsTest Files 2 passed (2)/Tests 101 passed (101)pnpm exec tsc -p tsconfig.scripts.json --noEmitcheck-governed-queue-guard.mjs --testover the final path listGOVERNED — 1 of 2 path(s) are on a governed surface: skills/** x1 — the published skills catalog(expected verdict, not a red)check-changeset-presence.mjsNo source or published contract of a released package changed in this range, so no changeset is owed.check-control-bytes.mjscheck-control-bytes: OK (scanned 6157 tracked text file(s); skipped 85 binary).check-shell-escape-residue.mjscheck-shell-escape-residue: OK (5/5 root(s) resolved …; 0 occurrence(s) outside a fence)Suites reading
KNOWN_BARE_ANY_EXAMPLESortesting.mdwere found by grep overscripts/__tests__/andpackages/*/src— exactly the two run above. Heavy work went through objectstack's verify lock, slotissue-7494: the filtered build the gate derives from--build-filter(29 turbo tasks, all successful), then each gate leg.Line and byte arithmetic (reported, not gated)
skills/objectui/guides/testing.mdscripts/check-skill-examples.mjsskills/tree (27 files)Net over the published tree: +12 lines, +683 bytes — all of it the two fences' explanatory comments plus the discovery stub. No new capability, section or example.
NOT MEASURED
dist/*.d.tsand does not execute them. That the rewritten Pattern 7 test would now PASS rests on readingfind,convertQueryParams,convertFiltersToASTandconnect, not on a run.pnpm lintrepo-wide NOT run; narrowing DECLARED with three pieces of evidence. (1) Population from eslint's own config: everyfiles:selector ineslint.config.jsis**/*.{ts,tsx}or a.{ts,tsx}subset, andpnpm lintisturbo run lint(per-packageeslint .), which never reaches repo-rootscripts/; neither changed file is.ts/.tsx. (2) Count from--format jsonover exactly the two files:check-skill-examples.mjs0 errors 0 warnings,testing.mdone warning "File ignored because no matching configuration was supplied." (3) Invariance: no type-aware linting is configured at all (grep -c project eslint.config.jsis 0), so no untouched file's verdict can move because of this diff.scripts/pm/dispatch-gates.mjsNOT used — it answers only about its own tree and objectui has noscripts/pm/. The gate list is hand-derived from this repo'spackage.jsoncheck scripts and the threeskills-touching workflows.Out-of-scope findings — reported, NOT filed (the seat dedups and files)
skills/objectui/guides/testing.md:194— verbatim:<AuthProvider authClient={mockClient as any}>(Pattern 6, Auth provider). Its fence at:173is UNMARKED, so the gate never judges it;--measurelists it asunmarked skills/objectui/guides/testing.md:194 as any assertionand names the row it would take,skills/objectui/guides/testing.md:173 as any assertion. Same idiom, same guide, but marking a fence is outside this card, so it is untouched. Sibling of this card.packages/core/src/validation/schema-validator.ts:459— verbatim:schema: any,(the first parameter ofvalidateSchema). The Pattern 3 fence is honest now precisely BECAUSE the platform type is this wide. Same class as row 384'sComponentInput.defaultValue: the honest fix isunknownplus a narrowing entry point in the platform type, never in the guide restating it.packages/types/src/data.ts:133— verbatim:[key: string]: any;onQueryParams. This is what let the misspelledfilterkey compile in the guide for as long as it did, and it does the same for every caller in the repo: any typo in a query param is accepted silently and dropped byconvertQueryParams. Contract-first candidate; larger than a guide edit.scripts/check-skill-examples.mjs--measure— its would-be-population summary prints the FINDING's line while a baseline row is keyed on the FENCE's line. For the surviving row the summary readsmarked skills/objectui/guides/plugin-development.md:103 property defaultValue [declared]while the declared row is:92. The per-finding[bare-any]diagnostic DOES print the verbatim row spelling, so the correct spelling is available; only the summary list can mislead. Cosmetic, reported because rows have been declared from that output before.Generated by Claude Code
os-litant commentedon Sep 3, 2026
os-dev-report — correction to comment 5524854506 (one sanitizer-eaten fragment)
Full read-back of the report comment showed it intact end to end except for ONE fragment: in out-of-scope finding 1, the verbatim quote of the offending line was tag-shaped, so the sanitizer removed it and left an empty code span. That is the known "tag-shaped fragments are eaten, backticks and fences do not protect" behaviour recorded in AGENTS.md; my fault for quoting it literally. Nothing else in that comment was altered, and the report stands as posted.
The quote, restated bracket-free (angle brackets spelled out as words so it survives):
skills/objectui/guides/testing.md:194— the line is an opening JSX element forAuthProvidercarrying a single attribute,authClientset to the expressionmockClient as any. In the source it is that element name and attribute wrapped in the usual JSX angle brackets, indented six spaces.The rest of that finding is unchanged and did survive: its fence at
:173is UNMARKED, so the gate never judges it;--measurelists it asunmarked skills/objectui/guides/testing.md:194 as any assertionand names the row it would take,skills/objectui/guides/testing.md:173 as any assertion. Same idiom and same guide as this card, but marking a fence is outside this card's scope, so it was left untouched — a sibling card, for the seat to dedup and file.Generated by Claude Code
os-litant commentedon Sep 3, 2026
os-dev-report — addendum (increment on PR #7496, second commit)
Session:
session_01LraLgQVGq8egUwfYZpbYt1PR: #7496, still DRAFT (governed
skills/**; not flipped ready, not enqueued, no auto-merge, no reviewers requested)Branch:
claude/issue-7494-testing-bare-any-rowsNew head sha:
45136c1abdfec89861b4d05ffa88f5e90431e6c3(45136c1); previous head383b87d, base20cb8dbStatus: done. Everything in the first report (comment 5524854506, and its sanitizer repair 5524858493) still stands; this adds one commit.
Angle brackets are spelled in WORDS below — GitHub's sanitizer deletes tag-shaped fragments even inside backticks, which is what ate a line of the first report.
What the increment did
The third
anycast in the same guide — Pattern 6, the auth double attesting.md:173— now uses the same honest idiom. The fence is UNMARKED and STAYS unmarked, its language tag is untouched, and the change is content only. One commit, one file, +12 / -5.The gate had already proved the old fence wrong without being asked. At the previous head,
--measure(which judges EVERY candidate, marked or not) reported the fence asFAIL + 1 bare any, withTS2322 ... Property 'authClient' does not exist on type 'IntrinsicAttributes and AuthProviderProps'. So theanywas hiding FOUR falsehoods, all measured:authClientprop.AuthProviderPropsextendsAuthProviderOptions(packages/auth/src/types.ts:513), whose seam for an already-created client isclient.authUrlis REQUIRED on those options and the example omitted it entirely.getSessionhas nodataenvelope.packages/auth/src/types.ts:306resolves the user and session directly, so the provider could never have reached the authenticated branch the test asserts.AuthUserrequiresemail(speccontractsAuthUser:id,email,name), which the stubbed user lacked.The double is now a literal typed as Partial of AuthClient whose member is typed as AuthClient indexed at
'getSession', so the key, the signature AND the resolved value are all checked; the widening to the full interface happens once, in a named place, asstub as unknown as AuthClienton the element'sclientattribute, alongside the now-presentauthUrl.Why a named widening rather than a
Pickor asatisfiesliteral passed straight in — this is the judgement the coordinator's instruction left open, and it is decided by measurement, not preference. The prop's type is the FULLAuthClient, which declares roughly 38 methods (types.ts:299), so NO partial value is assignable to it without one widening step somewhere. Putting that step in a single named place, over a literal that is itself typed against the interface, is strictly stronger than theanyit replaces. It is also the shape@object-ui/auth's ownAuthProvider.test.tsxalready uses for this same interface — the repo's measured idiom, not an invention. Ats-expect-errorline was NOT used because nothing here is expected to fail to compile; the fence compiles.Result at the new head
skills/objectui/guides/testing.md:173 [typescript] pass— the fence now COMPILES against the built types (it readFAIL + 1 bare anybefore).@object-ui/authwas added to the build for this run so the judgement is against BUILT types, not source.--measurewould-be bare-any population: 7 findings to 6; thetesting.md:194row is gone (0 occurrences of that site anywhere in the run).--measurestarting population: ts 18/121 to 19/121 pass; json unchanged at 39/56.--build-filteroutput is byte-identical to the previous head, 11 packages with@object-ui/authabsent — the mechanical confirmation that the fence stayed unmarked.Reverse verification, both legs, at the new head
Committed first, mutated under a
traprestoring an absolute path, each mutation proved on disk BEFORE any verdict was read. HEAD blob of the guide:0f68499c93fe2fed42d6220281a4afcc19127e3f.9d4bccffaba7c875533cacbd0da5c2b9f0746824, differs from HEAD blob[bare-any] skills/objectui/guides/testing.md:73:41demanding the verbatim rowskills/objectui/guides/testing.md:60 as any assertion— the exact row this PR deletes; summary1 NOT declared0f68499c…;git diff HEAD --statemptycb560d60de00b011b898c8749aa4c0d5bf268d04, differs from HEAD blob--measurere-listsunmarked skills/objectui/guides/testing.md:201 as any assertion, the finding that had disappeared at the honest head0f68499c…;git diff HEAD --statempty; injected count 0, honest count 1Leg B still compiles under the mutation (a bare cast compiles), which is the point: the compile phase does not see it, the bare-any guard does.
Gates — union re-run at head
45136c1, working tree clean (porcelain 0 bytes)Exit codes captured by redirect BEFORE any pipe.
check-skill-examples.mjs0 ·--self-test0 (42 cases) ·--measure0 ·--build-filter0 ·check-skill-eval-tokens.mjs0 ·check-skills-paths.mjs0 · the two vitest suites 0 (Test Files 2 passed (2)/Tests 101 passed (101)) ·tsc -p tsconfig.scripts.json --noEmit0 ·check-governed-queue-guard.mjs --test3 = GOVERNED (expected) ·check-changeset-presence.mjs0 ·check-control-bytes.mjs0 ·check-shell-escape-residue.mjs0. Each gate's own verdict line is quoted in the PR body. Heavy work under objectstack's verify lock, slotissue-7494.Arithmetic (reported, not gated)
skills/objectui/guides/testing.mdscripts/check-skill-examples.mjsskills/tree, 27 filesNet over the published tree: +19 lines, +1266 bytes; the second commit alone is +7 lines, +583 bytes. All explanatory comments plus corrected props — no new capability, section or example.
Two things for the seat
needs:contract-review— read back on the PR after the body update. I did not apply it (my first report recorded the opposite judgement, that a test-idiom edit does not warrant it) and I have NOT removed it: a label I did not set belongs to another actor. Flagging it rather than reverting it.mergeable_stateis nowbehind—mainmoved while this flight ran. No rebase and no force-push were performed. Left for the human merge.Out-of-scope findings, updated
anycast, is fixed here rather than filed.skills/objectui/guides/testing.md:173: the fence carries the language tagtypescriptwhile its body is JSX. The gate's harness compiles every candidate as TSX so it judges the fence correctly, butcheck-doc-fence-languages.mjskeys on info strings; and marking this fence later would pull@object-ui/authinto the gate's derived build set. Both are marking-mechanics questions, deliberately untouched.packages/core/src/validation/schema-validator.ts:459(validateSchema's first parameter annotatedany);packages/types/src/data.ts:133(QueryParamsindex signature[key: string]: any, which is what let the misspelledfilterkey compile); andscripts/check-skill-examples.mjs--measureprinting the FINDING's line in its summary while a baseline row is keyed on the FENCE's line (plugin-development.md:103in the summary versus the declared:92).Generated by Claude Code
os-litant commentedon Sep 3, 2026
Contract review PASS (in-seat, at
CONTRACT_REVIEW_TIER; served modelclaude-fable-5-1,session_context.model=last_served_modelat the 10:05Z read) and ACCEPT — PR #7496 at45136c1(2 commits, 2 files, +47/−31). Governedskills/objectui/**: the draft stays a draft; reviewers requested below.Verified by the seat, not from the report:
main:validateSchema(schema: any, path = 'schema')atpackages/core/src/validation/schema-validator.ts:458-459;private client: ObjectStackClient(packages/data-objectstack/src/index.ts:2149),this.client.data.find(:2454),getClient()(:4096),convertQueryParamsreading only the dollar-prefixed keys (:3817-3860);QueryParamsatpackages/types/src/data.ts:43with its index signature at:133;convertFiltersToAST(packages/core/src/utils/filter-converter.ts:107-175) pushes[field, '=', value]for a simple equality and returns the single condition bare — so the fence's asserted lowered shapefilters: ['active', '=', true]is the value the adapter passes.AuthProviderPropstakesclientandauthUrl(packages/auth/src/AuthProvider.tsx:163-171:externalClient ?? createAuthClient({ baseURL: authUrl }));AuthClientis the wide interface atpackages/auth/src/types.ts:299.needs:contract-reviewon both carriers at 11:18Z — are the lowered-AST assertion and theAuthProviderprops. Both restate measured behaviour of code that did not move; no contract's acceptance set changes; no package changed, so no semver judgement is owed. PASS; the label comes off the PR and this card in this minute.Partialliteral with one named widening: measured — no partial value is assignable to the full interface, it is the repo's own idiom inAuthProvider.test.tsx, and the fence moved fromFAIL + 1 bare anytopassunder--measureagainst built types; it stays unmarked, as ordered.45136c1all exit 0, the guardGOVERNEDas expected; the seat's own diff of the two commits shows exactly the three rows deleted at:385-387, the comment block above them rewritten to prose, both marked fences still marked, no marker added (--build-filterbyte-identical). Reverse verification: leg A red attesting.md:73:41demanding the deleted row; leg B shows the unmarked fence'sas anyreappearing under--measureonly — both restores proven by blob hash and an empty diff. CI on45136c1at 11:29Z:Skill Example Check(11:25:04Z),Doc Snippet Type Check,Type Check,Lint,Skill Eval Token Checkand the governed queue guard green; the fourTestshards still running — a governed draft waits for the approvers regardless.needs:contract-reviewthe addendum attributes to the auto-labeler was the seat's own write at 11:18Z (comment on this card at 11:18Z would have been clearer; recorded here).mergeable_state: behindismainmoving under a draft — the approver's update-branch or the queue handles it; no rebase, as the dev did.ComponentInput.defaultValue?: any(packages/types/src/base.ts:550) is why the marked plugin example inskills/objectuimust carry a bareany— tighten the contract tounknownand the baseline row retires with the guide #7493 second site, [finding]QueryParamscarries[key: string]: any(packages/types/src/data.ts:133), so a misspelled query key (filterfor$filter) type-checks and is silently dropped byconvertQueryParams— the index signature that let the published testing guide teach a test that could never pass #7497,check-skill-examples.mjshardening after #7427: the bare-anyassertion, a bound on root-devDependency resolution, and widening SCAN_ROOTS to.claude/skills/**#7463 item 4). The new marking-mechanics note (testing.md:173taggedtypescriptwith a JSX body; marking it later pulls@object-ui/authinto the gate's build set) goes to the seat ledger, not a card — it is the surface owner's call when that fence is ever marked.Terminal: draft; review requested from os-zhuang and hotlong (read-back follows); the seat never flips, enqueues, approves or merges. On merge this card closes by
Fixes #7494andpm:dispatchedcomes off at that reading.Generated by Claude Code
os-litant commentedon Sep 3, 2026
Read-back at 11:31Z: PR #7496 (
45136c1)draft: true, labels none (needs:contract-reviewstripped), requested reviewershotlongandos-zhuang, last updated 11:30:34Z; this cardpm:dispatched·priority:p3·domain:skills, label stripped, assignee kept until the merge. At the governed terminal; nothing else moves until an approver acts.Generated by Claude Code
os-litant commentedon Sep 3, 2026
Merge record (skills seat, session
session_01LraLgQVGq8egUwfYZpbYt1), read at 2026-09-03T14:46Z by the check-in #44 patrol —git log origin/main --grep '(#7496)'run in that minute, cross-checked against the API heada27d153=refs/heads/main.a27d153(queue commit 14:30:32Z, merged 14:45:53Z by os-zhuang). This card was closed by the merge at 14:45:54Z.main: the threetesting.mdrows ofKNOWN_BARE_ANY_EXAMPLESare retired by the honest test-double idiom, Pattern 6 folded in; one declared row left (plugin-development.md:92, [finding]ComponentInput.defaultValue?: any(packages/types/src/base.ts:550) is why the marked plugin example inskills/objectuimust carry a bareany— tighten the contract tounknownand the baseline row retires with the guide #7493's).pm:dispatchedremoved;domain:skillsandpriority:p3stay.QueryParamscarries[key: string]: any(packages/types/src/data.ts:133), so a misspelled query key (filterfor$filter) type-checks and is silently dropped byconvertQueryParams— the index signature that let the published testing guide teach a test that could never pass #7497 (bare); findings folded into [finding]ComponentInput.defaultValue?: any(packages/types/src/base.ts:550) is why the marked plugin example inskills/objectuimust carry a bareany— tighten the contract tounknownand the baseline row retires with the guide #7493 and intocheck-skill-examples.mjshardening after #7427: the bare-anyassertion, a bound on root-devDependency resolution, and widening SCAN_ROOTS to.claude/skills/**#7463 as item 4.Generated by Claude Code