Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
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 (:60 as any, :208 mockClient and its as any) by teaching the honest test-double idiom #7494

Closed

Description

@os-litant

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 validateSchema({} as any) feeds the validator an invalid value on purpose
skills/objectui/guides/testing.md:208 variable mockClient the test double a mock typed as any
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).
  • Report the per-file line and byte arithmetic; there is no token ratchet over skills/** in objectui (measured by the [finding] 17 of the 56 JSON fences in skills/objectui/ are tagged json while carrying // comments or ... elisions — jsonc is the honest tag, and no gate reaches fence language tags in skills/ #7462 flight), so the numbers are reported, not gated.

⛔ Not in scope: unmarking any fence; the plugin-development.md:92 row (its fix is packages/types, not the guide); widening the assertion's scope.

Verified

Refs: #7463 · PR #7490 · #7359 (the gate and its marker convention).

Activity

  1. os-litant commented on Sep 3, 2026

    @os-litant
    ContributorAuthor

    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.


    Generated by Claude Code

  2. self-assigned this
    on Sep 3, 2026
  3. os-litant commented on Sep 3, 2026

    @os-litant
    ContributorAuthor

    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/main SKILL.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.


    Generated by Claude Code

  4. os-litant commented on Sep 3, 2026

    @os-litant
    ContributorAuthor

    os-dev-report

    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.
    • The three rows are deleted from KNOWN_BARE_ANY_EXAMPLES in the SAME commit, leaving plugin-development.md:92 property defaultValue ([finding] ComponentInput.defaultValue?: any (packages/types/src/base.ts:550) is why the marked plugin example in skills/objectui must carry a bare any — tighten the contract to unknown and the baseline row retires with the guide #7493's). The comment block above the set now records that the three testing.md rows were retired and why the surviving one is not a mechanical unmark. No change to the gate's logic, positions or baseline mechanics.
    • Both fences stay MARKED; no marker was added or removed anywhere.

    Judgement calls

    1. 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.
    2. 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.
    3. 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.
    4. 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.
    5. 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-object c9c6e83cb201b230d4b4084babad6cdb9cba458b (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)

    1. 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.
    2. 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.
    3. 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.
    4. 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.

    Generated by Claude Code

  5. os-litant commented on Sep 3, 2026

    @os-litant
    ContributorAuthor

    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.


    Generated by Claude Code

  6. os-litant commented on Sep 3, 2026

    @os-litant
    ContributorAuthor

    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:

    1. There is no authClient prop. AuthProviderProps extends AuthProviderOptions (packages/auth/src/types.ts:513), whose seam for an already-created client is client.
    2. authUrl is REQUIRED on those options and the example omitted it entirely.
    3. 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.
    4. 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 --test 3 = 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

    1. 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.
    2. 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).

    Generated by Claude Code

  7. os-litant commented on Sep 3, 2026

    @os-litant
    ContributorAuthor

    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.
    • Routing. Findings 2–4 were routed before the addendum ([finding] ComponentInput.defaultValue?: any (packages/types/src/base.ts:550) is why the marked plugin example in skills/objectui must carry a bare any — tighten the contract to unknown and the baseline row retires with the guide #7493 second site, [finding] QueryParams carries [key: string]: any (packages/types/src/data.ts:133), so a misspelled query key (filter for $filter) type-checks and is silently dropped by convertQueryParams — the index signature that let the published testing guide teach a test that could never pass #7497, check-skill-examples.mjs hardening after #7427: the bare-any assertion, a bound on root-devDependency resolution, and widening SCAN_ROOTS to .claude/skills/** #7463 item 4). The new marking-mechanics note (testing.md:173 tagged typescript with a JSX body; marking it later pulls @object-ui/auth into 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 #7494 and pm:dispatched comes off at that reading.


    Generated by Claude Code

  8. os-litant commented on Sep 3, 2026

    @os-litant
    ContributorAuthor

    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.


    Generated by Claude Code

  9. os-litant commented on Sep 3, 2026

    @os-litant
    ContributorAuthor

    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.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions