Repository navigation
chore: raise the @objectstack/spec pin from ^17.0.0-rc.6 to 17.0.0 GA (lockfile resolution + green-keeping adaptations) #4636
Description
Filed by the repo:objectui seat (session session_01RnQd8iMMUwXQEV1crFmQiQ, round 1, 2026-08-14), acting on the handoff record #4635's first-check item.
Blocked-by: #4910
Blocked-by: #4911
(Blocker history — #4648 exhausted 2026-08-17: PR #4901 merged 03:05Z. The 2026-08-17 re-point round (PR #4639 @ 47c7cc3, takeover claim by session session_01DbRmJD3iPhXjKr6vhd4Qkv) then met the lockfile criterion in full and cut the farm red from 9 files / 17 tests to 3 / 3 — every remaining red owned by the two cards above (#4910 owns two, #4911 owns one); see the os-dev report and PM disposition comments of 2026-08-17. Earlier: Blocked-by lines for #4649 and #4650 removed 2026-08-14 ~16:35Z — both adaptation PRs MERGED (#4657, #4660). Sequencing ruled 2026-08-14, option A of the dev report on this card: the bump PR #4639 stays a parked draft until its expected-red list is empty, then flips; gate-weakening option C is rejected.)
Context
@objectstack/spec@17.0.0 (GA) is published on npm (dist-tags.latest = 17.0.0; the former rc tag stops at 17.0.0-rc.6). objectui's package.json ranges say ^17.0.0-rc.6, and the criterion that matters is the lockfile-resolved version (established on the old tracking card #3374: the ^ range is not the pin).
Re-check commands:
git grep -h '"@objectstack/spec"' origin/main -- '**/package.json' | sort -ugrep -A1 '@objectstack/spec' pnpm-lock.yaml | head(resolved version)npm view @objectstack/spec dist-tags --json
The work
- Raise the pin so the lockfile resolves
@objectstack/spec@17.0.0everywhere in the workspace (allpackage.jsonoccurrences +pnpm-lock.yaml). Done in PR chore(deps): raise the @objectstack/* pin from ^17.0.0-rc.6 to 17.0.0 GA #4639 (withclient/formula/lintraised too — their exact pins otherwise nest a second rc.6 spec copy; measured in that PR). Re-pointed onto post-adaptation main 2026-08-17 (47c7cc3): all 30 importers resolve 17.0.0, single physical copy, zero rc.6 strings in the lockfile. - Run the full regression; adaptations beyond green-keeping were split out: Unwind the objectstack#7176 striped/bordered/virtualScroll forwarding chain (types → react spec-bridge → plugin-list → plugin-view → app-shell) + drop ObjectGrid.component.yml's retired declarations #4649 (retirement unwind, MERGED as PR refactor: unwind the retired striped/bordered/virtualScroll list-view surface (objectstack#7176) #4657), Resolve the spec-named symbol collisions with 17.0.0 GA exports (check:spec-symbols): SECRET_MASK + ObjectCalendarProps/ObjectFormProps/ObjectGridProps/ObjectKanbanProps + one more #4650 (symbol collisions, MERGED as PR fix(plugins,app-shell): resolve the six spec-named symbol collisions with 17.0.0 GA #4660), [Decision] spec 17.0.0 GA declares four new authorable object-* blocks and new keys on three existing ones — what does objectui publish as authoring surface? #4648 (authoring-surface ruling, CLOSED via PR feat(plugins): publish the four GA object-* blocks' authoring surfaces (#4648) #4901), spec 17.0.0 GA made the element props schemas strict — two spec-parity tests still encode rc.6 strip-mode as their control #4910 (GA strict-mode parity probes, open), FilterConditionField cannot author spec 17.0.0 GA's new
$like/$ilike— the same shape as the closed$icontainsgap (#4023) #4911 ($like/$ilike builder reachability, open — decision box).
Known unlocks gated on this bump (do NOT do them in this PR)
- console: FormPage's post-submit redirect uses the authored URL verbatim — undecided whether it is a console route or an arbitrary destination #4190 and Reconcile
exportOptionswith the spec's new object form (#8010 spec half): false alignment comment, local'pdf', and theas anystreamingread #4535 (item 4) — both hold on "the spec pin covers objectstack#7657's schema change"; their restart conditions are written on each card. objectstack#7100— already unblocked (retirement present in rc.6; measured in PR chore(deps): raise the @objectstack/* pin from ^17.0.0-rc.6 to 17.0.0 GA #4639); dispatched independently.- objectstack#6275 — final pin-bump batch anchor.
- [tracking] 抬 spec pin 至 rc.4+(发布后):联动适配清单 —— 等 rc.4 的单都挂这里 #3374 — the stale rc.4-era tracking umbrella; the seat will disposition it separately after this lands.
Acceptance
- Lockfile resolves 17.0.0 (evidence in PR chore(deps): raise the @objectstack/* pin from ^17.0.0-rc.6 to 17.0.0 GA #4639's body). ✅ met at
47c7cc3 - Full farm green; every adaptation included is named in the PR body with its trigger. ⏳ 3 tests red, owned by spec 17.0.0 GA made the element props schemas strict — two spec-parity tests still encode rc.6 strip-mode as their control #4910 / FilterConditionField cannot author spec 17.0.0 GA's new
$like/$ilike— the same shape as the closed$icontainsgap (#4023) #4911
Activity
yinlianghui commentedon Aug 14, 2026
Claim: PM loop round 1
Session:
session_01RnQd8iMMUwXQEV1crFmQiQBranch:
claude/issue-4636-spec-pin-gaWorktree:
objectui-issue-4636Domain:
repo:objectuiFile surface: workspace
package.jsonfiles (the@objectstack/specrange lines only) +pnpm-lock.yaml+ minimal green-keeping adaptations wherever the rc.6→GA delta forces them (stop on breach; explain in the report)Container & model: M,
mode:subagent,model: opusSerial constraints cleared: in-flight #8500 declares
packages/app-shell/src/views/, #8096 declarespackages/app-shell/src/layout/+src/console/organizations/, #4633 declaresscripts/regenerate-catalog-index.py+examples/schema-catalog/src/index.ts— if a green-keeping adaptation lands inside ANY of those declared regions, stop and report instead of editing (serial with the in-flight card). Lockfile is exclusive to this card this batch (no other in-flight card changes dependencies).Generated by Claude Code
yinlianghui commentedon Aug 14, 2026
{ "issue": 4636, "status": "needs_decision", "branch": "claude/issue-4636-spec-pin-ga", "pr": "https://github.com/objectstack-ai/objectui/pull/4639", "premise_still_valid": true, "summary": "Premise verified and the bump landed: npm dist-tags.latest = 17.0.0 (rc stops at 17.0.0-rc.6) and main's lockfile did resolve rc.6. Raised the range on all 32 package.json occurrences; the lockfile now resolves @objectstack/spec@17.0.0 for all 30 importers with a single copy in the tree. Measured and important: a spec-ONLY bump does NOT achieve this — @objectstack/client, /formula and /lint each EXACT-pin their own spec ('17.0.0-rc.6' at rc.6, '17.0.0' at GA), so raising spec alone produced two copies (17.0.0 for importers + a nested 17.0.0-rc.6). Raising all four is what yields the single GA resolution, so it is part of the bump. STOPPED before adaptations per the card's own 机制假设 instruction: the rc.6->GA delta is NOT small (165 json-schema files differ beyond version-string churn, 9 schemas removed, 8 added, 2 source modules deleted), and the adaptations it forces exceed the scope ceiling. PR is DRAFT and says 'Part of #4636', not 'Fixes' — merging it would not complete the card (farm is red) and I must not silently close the card. Also note: PM assumption #2 answered — 17.0.0 DOES contain the global_nav ACTION_LOCATIONS retirement, but it was ALREADY in rc.6, so anything gated purely on that fact was already unblocked and never needed this bump.", "tests": "All at pushed HEAD 48b0fde (working tree clean). BUILD: turbo run build --filter=!@object-ui/site --concurrency=2 => 43/43 successful. TYPE-CHECK: turbo run type-check => 1 error, packages/types/src/__tests__/p1-spec-alignment.test.ts(67,7) TS2322 'Type true is not assignable to type undefined' (virtualScroll retired). app-shell type-checks clean standalone; its earlier failure was a turbo cascade. FULL FARM: pnpm exec vitest run --maxWorkers=2 => 'Test Files 9 failed | 1452 passed (1461); Tests 17 failed | 18340 passed | 1 skipped (18358)', Duration 1741.65s. SCOPED RE-RUN of all 193 spec-importing test files => 8 failed | 185 passed, 15 failing tests, reproducing consistently. GATES at 48b0fde: check-changeset-presence PASS, check-changeset-fixed PASS, check-changeset-no-major PASS, check-phantom-dependencies PASS, check-control-bytes PASS, check-spec-symbol-derivation FAIL (exit 1, 6 symbol collisions). LOCKFILE EVIDENCE: 30 importers 'specifier: ^17.0.0' / 'version: 17.0.0(ai@7.0.56(zod@4.4.3))'; package entries show a single @objectstack/{client,core,formula,lint,sdui-parser,spec}@17.0.0. ACCOUNTING GAP, stated rather than papered over: farm said 9 files/17 tests, scoped reproduction finds 8 files/15 tests; 1 file + 2 tests are outside the spec-importing set and I did NOT identify them. Possibly load-dependent flakes (documented in this repo) but unproven, so recorded as unknown. NO ablation/reverse-verification was applicable here (dependency bump, no fix to ablate).", "open_questions": [ { "question": "Keeping the farm green after this bump requires work the card explicitly puts OUT of scope, and part of it lands inside regions declared by in-flight sibling cards. How should the remaining adaptation surface be sequenced? (Surfacing rather than choosing, per the stop instruction.) The surface: (a) FOUR brand-new GA authorable blocks — object-form, object-grid, object-master-detail-form, object-metric — auto-discovered by apps/console's repo-wide registry-inputs parity test; object-grid alone needs 34 top-level keys published, and page:header / page:tabs / record:details gained keys; (b) the objectstack#7176 retirement of striped/bordered/virtualScroll, whose forwarding chain the spec itself traces react spec-bridge -> plugin-list -> plugin-view/app-shell and which TERMINATES at packages/app-shell/src/views/ObjectView.tsx:1766-1838 — inside #8500's declared region; (c) six spec-named symbol collisions failing check:spec-symbols, one of which (SECRET_MASK, packages/app-shell/src/views/metadata-admin/widgets.tsx:1852) is ALSO inside #8500's region; (d) six smaller parity decisions about what objectui publishes as an authoring surface (record_picker filter, text_input defaultValue, record:highlights readonly now stripped, record:details section member key, a new FormFieldSchema key needing a behavioral row, and GA's new $like/$ilike operators that no filter-builder operator can author).", "options": [ "A — Land this bump PR only after a follow-up batch makes the farm green: file (a)-(d) as separate cards, sequence (b) and (c) AFTER #8500 releases packages/app-shell/src/views/, then flip this PR ready last. Keeps main green at all times; costs the most rounds.", "B — Widen THIS card's scope to cover (b), (c) and (d) but not (a), and wait for #8500 to land before the app-shell edits. Fewer PRs, but it still cannot go green — (a) alone keeps apps/console's parity test red, so main would still not accept it.", "C — Land the bump now with the failing gates accepted as known-red (e.g. temporary skips/allowlist entries on the parity and symbol gates) and pay down (a)-(d) afterwards. Fastest to get GA resolved into the lockfile; deliberately blinds the exact gates that are reporting real authoring-surface drift.", "D — Treat (a) as the real product question first: decide whether objectui SHOULD publish authoring surfaces for the four new object-* blocks at all, since the maintainer's #7176 ruling already established that a spec key objectui only forwards without applying is dead and gets retired rather than implemented." ], "recommendation": "A, with D answered first as its input — and explicitly NOT C. On real business need: (a) is the only large item, and nothing measured shows a consumer for those four blocks' authoring surfaces in this repo today — the spec declared them, objectui publishes none of their keys, and no example app or console flow was found reading them. That is exactly the shape the maintainer's 2026-08-10 #7176 ruling addressed from the other side (a forwarded-but-never-applied key is dead and gets retired, and 'if objectui wants one of these as real behavior, that is an implementation card filed first'). So (a) should be answered as a product question (D) before anyone writes 34 inspector keys on the assumption that a declared surface must be consumed — startup focus says a declared surface with no pull is handled implementation-first. On long-term soundness: C is the one option that damages it — skipping or allowlisting the parity and symbol gates disables precisely the mechanisms that detect producer/renderer contract drift, and this bump is the first event proving those gates work as designed; a temporary skip on a drift detector reliably outlives its justification. B is dominated because it cannot reach green, so it buys no merge and still splits the work. On making AI-written metadata hard to get wrong: the parity gates failing loudly is the CORRECT behavior — they are catching that GA declares authorable keys the renderer would silently ignore, which is the exact class of authoring error (author gets a success receipt for configuration that does nothing) that these tests exist to prevent. Keeping them honest, sequencing behind #8500, and deciding (a) deliberately preserves that. One caveat I cannot resolve from here: the 1 unaccounted failing file must be identified before any 'green' claim, since an unexplained failure could be a real regression rather than a flake." }, { "question": "Two deviations from the dispatch prompt that I did not decide silently, per the instruction to surface conflicts rather than pick a side.", "options": [ "The prompt said the PR's first line must be 'Fixes #4636'. I wrote 'Part of #4636' instead, because merging this PR does not satisfy the card's own acceptance criterion ('Full farm green') and a closing keyword would close the card on merge while the work is unfinished.", "The prompt scoped the bump to @objectstack/spec. I also raised client/formula/lint, because their exact pins otherwise leave a nested spec@17.0.0-rc.6 in the tree and the stated acceptance criterion (lockfile resolves 17.0.0 GA across the workspace) is not actually met by a spec-only bump. Evidence is in the PR body." ], "recommendation": "Keep both. Re-point them if the PM disagrees — the 'Part of' wording is a one-line change, and the client/formula/lint bump can be split into its own commit, though splitting it would knowingly leave two spec copies in the tree." } ], "out_of_scope_findings": [ "NOT filed as issues — deliberately, since the card said 'report such findings, do not implement them here' and stated the seat would sequence them; filing four overlapping cards unilaterally would duplicate that sequencing. Say the word and I will file them. The list: (1) apps/console registry-inputs parity — four new GA blocks (object-form/object-grid/object-master-detail-form/object-metric) publish zero of their declared keys, object-grid needs 34; page:header/page:tabs/record:details gained keys. (2) objectstack#7176 striped/bordered/virtualScroll retirement follow-through across types -> react spec-bridge -> plugin-list -> plugin-view -> app-shell. (3) check:spec-symbols — 6 collisions: SECRET_MASK, ObjectCalendarProps, ObjectFormProps, ObjectGridProps, ObjectKanbanProps. (4) six authoring-surface parity decisions incl. GA's new $like/$ilike filter operators unreachable from the builder.", "Informational, affects another card's premise: the global_nav ACTION_LOCATIONS retirement (objectstack#6888) was already present in 17.0.0-rc.6, not introduced at GA. objectstack#7100 was gated on 'the retirement is present in the installed spec' and was therefore already unblocked before this bump.", "Informational, no action: the GA removals of external-lookup and message-queue surfaces (ExternalLookup, ExternalDataSource, ExternalFieldMapping, MessageQueueConfig, MessageQueueProvider, TopicConfig, ConsumerConfig, DeadLetterQueue) have zero references in objectui — verified by grep across packages/apps/examples/scripts/e2e.", "Process note: my full-farm run held the shared /tmp/os-heavy-verify.lock for ~29 minutes with two sibling agents queued behind it. I released it and switched to scoped runs. A full-farm verification and a shared single-lock convention are in tension for dependency-bump cards; worth a convention tweak (e.g. a separate lock class or an agreed budget) if whole-farm cards recur." ] }Generated by Claude Code
yinlianghui commentedon Aug 14, 2026
Sequencing ruling recorded (seat
repo:objectui, sessionsession_01RnQd8iMMUwXQEV1crFmQiQ, 2026-08-14) — the body above now carries the state; this comment is the audit trail for the dev report's open questions:Part ofinstead ofFixes(a closing keyword would have closed this card with the farm red — correct catch), and raisingclient/formula/lintalongsidespec(a spec-only bump measurably fails the card's own acceptance criterion by nesting a second rc.6 copy).findingfor the skills lane per the three-category rule.Generated by Claude Code
yinlianghui commentedon Aug 15, 2026
Dependency update (PM): the third pre-re-point adaptation landed — PR #4671 (parity gates made pin-aware; GA parity failures 8 → 4). But #4648's headline item forked: the delegated ruling's premise was falsified in implementation (all 78 unpublished keys on the four GA
object-*blocks are honoured by the renderers today), so #4648 is back toneeds-user-decisionwith re-framed options. The 4 remaining GA-tree parity failures are exactly that item, which means the re-point of PR #4639 stays red until #4648 rules again — it is now this card's last known gating decision. #4668 (five honoured-but-unpublished keys) also queues behind this pin bump, riding #4639 or a follow-up.Generated by Claude Code
os-steve commentedon Aug 17, 2026
Dependency update (PM session
session_01DbRmJD3iPhXjKr6vhd4Qkv, 2026-08-17): the last pre-re-point adaptation has landed — #4648 closed via PR #4901 (merged 03:05Z): 68 GA authoring-surface keys declared, 10 deprecated aliases carved out with cited exemptions, GA-tree parity failures 4 → 0.PR #4639's re-point is now unlocked, and it is smaller than this card's plan assumed. The #4901 implementation measured the sequencing premise directly: the parity gate's forward direction never sees the four GA blocks on rc.6 (
coveredrequires ComponentPropsMap membership), so the declarations merged to main today and simply arm themselves when the pin moves. Consequence: the re-point is a pure pin bump — merge currentmainintoclaude/issue-4636-spec-pin-ga(or redo the 32 range lines + lockfile on a fresh branch), re-run the farm, and the previously-red parity/symbol/retirement failures should all be resolved by the already-merged adaptations (#4649 / #4650 / PR #4671 / PR #4901). The one open checklist line from the original report remains: identify the 1 unaccounted failing file / 2 tests from the first farm run before any green claim.Note on the claim state: the original claim on this card belongs to session
session_01RnQd8iMMUwXQEV1crFmQiQ, which wrapped on 2026-08-16 (handoff #4754) — the branch and parked draft PR #4639 survive it. Per the handoff, the re-point is inherited by whichever seat drives the next round; whoever picks it up should say so here with their session ID before pushing to that branch.Generated by Claude Code
os-steve commentedon Aug 17, 2026
Claim: PM loop round 2 — TAKEOVER of the re-point step (prior claim's session
session_01RnQd8iMMUwXQEV1crFmQiQwrapped 2026-08-16 per handoff #4754; its branch and parked draft PR #4639 are inherited, not discarded)Session:
session_01DbRmJD3iPhXjKr6vhd4QkvBranch:
claude/issue-4636-spec-pin-ga(existing — the dev continues it; ⛔ no new branch)Worktree:
objectui-issue-4636-repointDomain:
repo:objectuiFile surface: workspace
package.json@objectstack/*range lines +pnpm-lock.yaml+ PR #4639 body refresh; green-keeping edits ⛔ out of scope — all four adaptation cards (#4649 / #4650 / PR #4671 / PR #4901) are merged, so any farm red beyond the known 1-file/2-test accounting gap is a stop-and-report, not an in-place fix (stop on breach; explain in the report)Container & model: M,
mode:subagent,model: opusSerial constraints cleared: lockfile is exclusive to this card this batch — in-flight #4003 (PR #4892, examples/schema-catalog), #4884 (PR #4888, plugin-gantt), #4308 (PR #4885, app-shell metadata-admin) change no dependencies; no other open PR touches
pnpm-lock.yaml(checked this round). Label flippedpm:blocked→pm:dispatched— the recorded blocker (#4648) closed via PR #4901 at 03:05Z.Generated by Claude Code
os-steve commentedon Aug 17, 2026
{ "issue": 4636, "status": "rework", "branch": "claude/issue-4636-spec-pin-ga", "pr": "https://github.com/objectstack-ai/objectui/pull/4639", "premise_still_valid": true, "summary": "Re-pointed PR #4639 onto post-adaptation main and pushed to the inherited branch (48b0fde -> 47c7cc3, no new branch, no force-push, still draft). The card's FIRST acceptance criterion is fully met: the lockfile resolves @objectstack/spec@17.0.0 for all 30 importers with a single copy in the tree (zero 'rc.6' strings anywhere in pnpm-lock.yaml; one physical store copy). package.json range lines merged with NO conflicts and the only diff vs main across all 32 manifests is the range lines; pnpm-lock.yaml was REGENERATED from main's copy rather than hand-merged, and its diff vs main touches only the six @objectstack/* packages. The SECOND criterion (farm green) is NOT met: 3 files / 3 tests remain red, down from 9/17. The PM's 'pure pin bump' mechanism assumption is therefore FALSIFIED, and this is the report it asked for: the four merged adaptations (#4649/#4650/PR #4671/PR #4901) did resolve everything they were scoped to, but GA carries one further behaviour change nobody had measured — the element props schemas flipped from STRIP mode to STRICT, so an undeclared key now fails with unrecognized_keys instead of being silently dropped. Two parity tests encode the old strip-mode behaviour as their deliberate contrast probe and fail on that probe only (every subject assertion passes, so `filter`/`defaultValue` are correctly published). Filed as #4910, not fixed here per the stop-and-report clause. The third red is the known $like/$ilike builder-reachability gap, filed as #4911. The 1-file/2-test accounting gap is IDENTIFIED and closed — see `tests`. I made exactly ONE edit beyond ranges+lockfile: two lines in QUICK_REFERENCE.md, named prominently in the PR body; rationale below. I did not flip the PR out of draft and did not enable auto-merge.", "tests": "All at pushed HEAD 47c7cc3 (working tree clean; gate union re-run AT that commit, after the final edit). BUILD: turbo run build --filter=!@object-ui/site --concurrency=2 => 'Tasks: 43 successful, 43 total'. TYPE-CHECK: turbo run type-check --concurrency=2 => 'Tasks: 81 successful, 81 total' — the previously-red packages/types p1-spec-alignment TS2322 is gone (PR #4657). FARM: pnpm exec vitest run --maxWorkers=2 run as 8 shards (a single pass took ~29min for the previous dev and cannot fit one bounded call; each shard was wrapped in flock -E 99 on /tmp/os-heavy-verify.lock and the lock released between shards — shard 5 hit exit 99 once and was retried after doing lock-free work). Summed: 1558 files / 19817 tests; 3 files / 3 tests failed after the doc fix, 1555 files / 19813 passed, 1 skipped. Shards 2/3/7/8 fully green. RED SET, complete: (1) packages/components/src/__tests__/record-picker-inputs-spec-parity.test.ts:101 'expected false to be true' on `expect(undeclared.success).toBe(true)`; (2) packages/components/src/__tests__/text-input-inputs-spec-parity.test.ts:83, same assertion shape; (3) packages/fields/src/widgets/__tests__/FilterConditionField.operators.test.ts:134 \\\"FieldOperatorsSchema accepts these but no builder operator can author them: expected [ '$like', '$ilike' ] to deeply equal []\\\". Root cause of (1)+(2) measured directly against the installed GA package: ElementRecordPickerPropsSchema.safeParse({object:'account', notASpecKey:1}) => success:false, issues[0].code==='unrecognized_keys' — GA went strict. GATE UNION at 47c7cc3, all 18 PASS: check-changeset-presence, check-changeset-fixed, check-changeset-no-major, check-phantom-dependencies, check-control-bytes, check-spec-symbol-derivation (was exit 1 with 6 collisions), check-package-self-import, check-doc-component-types, check-lint-coverage, check-type-check-coverage, check-action-forward-parity, check-i18n-call-site-keys, check-i18n-en-drift, check-i18n-dead-keys, check-skills-paths, check-published-dist-tooling; plus a control-byte self-scan over every changed path (clean). PARITY GATE ARMING, as asked: apps/console/src/__tests__/registry-inputs-spec-parity.test.ts => 62 tests, ALL PASS. 'the four GA blocks enter coverage exactly when the installed spec carries them' PASSES (asserts an equality, so it fails in either direction); all four of object-form/object-grid/object-master-detail-form/object-metric are in the installed ComponentPropsMap — 0 of 4 on rc.6, 4 of 4 here — carrying 108 top-level keys between them (object-form 39, object-grid 37, object-master-detail-form 14, object-metric 18), and each passes its own 'publishes every top-level key its spec props schema declares' case. 'every GA-pending exemption arms exactly with the installed spec, all fifteen together' PASSES: all 15 GA-pending entries (10 object-grid deprecated-alias carve-outs ruled on #4648 + 5 honoured-but-unpublished keys tracked by #4668) are now LIVE rather than dormant. 'the four GA blocks resolve their ruled split — declared vs carved out' PASSES. ACCOUNTING GAP — IDENTIFIED, and NOT flakes: the file is scripts/__tests__/quick-reference-current-release-4143.test.ts, which imports no spec (it reads QUICK_REFERENCE.md + the manifests), which is exactly why a re-run scoped to the 193 spec-importing files could not reproduce it. The two tests had two DIFFERENT causes: (a) 'states the one version every workspace package carries' was pre-existing red ON MAIN and unrelated to the bump — at branch point 5bf5d2cb6 the doc said 17.4.0 while every manifest carried 17.5.0; (b) 'contains only version literals this test derives from a manifest' was caused by the bump (the rc.6 literals). This is not inference: #4642 was filed the same day, names the SAME two assertions, and states 'PRs #4638 / #4639 / #4641 show the same shard red on the same base' — independent confirmation. (a) was corrected on main by PR #4643; (b) I fixed here. REVERSE VERIFICATION direction observed: standard red->green. The pre-fix red is the shard-5 reading above; post-fix, `vitest run scripts/__tests__/quick-reference-current-release-4143.test.ts` => 'Test Files 1 passed (1), Tests 8 passed (8)'. No ablation was applicable (dependency bump, no guard to mutate); no dist/ ablation involved, so no rebuild claim is owed.", "open_questions": [ { "question": "I made ONE edit outside the dispatched file surface (workspace package.json range lines + pnpm-lock.yaml + PR body): two lines in QUICK_REFERENCE.md, `^17.0.0-rc.6` -> `^17.0.0` on the Spec and Client rows. Flagging it rather than burying it, since the surface was stated explicitly. My reading: the dispatch carves the accounting gap OUT of the stop-and-report clause ('any farm red BEYOND the known 1-file/2-test accounting gap is a stop-and-report'), and this IS that gap; and the edit meets all four bounded-in-place conditions — same defect class (the doc block is the mirror of the very range lines this card owns, and that file's own header says every value in it is pinned to the manifest that owns it), mechanical (the failing gate derives and prints the required literal, so there is zero judgement), no other claim holds the file (#4003/#4884/#4308 declare unrelated regions; PR #4643 already merged), and same gate family with no new verification surface. Without it the card cannot reach green on a two-word doc mirror of its own change.", "options": [ "A — keep it. The card's remaining red is then exactly the three genuinely-out-of-scope files, each on its own card.", "B — revert it and let a follow-up card own QUICK_REFERENCE.md. Costs a dispatch round for two words, and leaves the branch red on a mechanical mirror of its own range lines." ], "recommendation": "A. It is a one-commit revert (47c7cc3) if you disagree, and it is named in its own PR body section rather than folded in silently. B's only real argument is surface discipline, which I have honoured by declaring it here and in the PR body instead of expanding scope quietly." }, { "question": "The PM mechanism assumption 'pure pin bump, no follow-up edits' (PR #4901's measured claim, Ablation B as positive control) is falsified — but narrowly, and the distinction matters for how you triage #4910. PR #4901's claim was about the PARITY gate's forward direction, and that claim held exactly as measured: all four GA blocks arm and the gate is 62/62 green. What it did not cover is a separate GA change in the same release — the props schemas going strict — which no adaptation card was scoped to.", "options": [ "A — treat #4910 as the last pre-merge blocker on this branch: land it, then this PR goes green and can flip ready.", "B — treat #4910 and #4911 as independent cards that may land in any order, and keep PR #4639 parked until both are in.", "C — fold #4910 into this PR after all (it is arguably mechanical: replace the strip-mode probe with an unrecognized_keys assertion)." ], "recommendation": "A or B — both fine, and the ordering is yours; I deliberately did NOT take C. #4910 looks mechanical but it is a test-contract change on this repo's key-reachability convention (both files carry comments stating the strip-mode premise as load-bearing for non-vacuity), and the strict flip is schema-wide rather than specific to those two blocks, so the fix wants a deliberate scan of every parity test asserting a green safeParse with an extra key — which is more than a probe rewrite and squarely a named card's job. #4911 is genuinely independent of the other two and carries a real UX decision (whether the author writes the wildcards), so it should not gate on #4910." } ], "out_of_scope_findings": [ "filed as #4910: spec 17.0.0 GA made the element props schemas strict — two spec-parity tests (record-picker, text-input) still encode rc.6 strip-mode as their contrast probe. Blocks this branch. Duplicate-searched first; no open cover.", "filed as #4911: FilterConditionField cannot author GA's new $like / $ilike — the reachability gate from #2942 fires. Blocks this branch. Same shape as the closed $icontains gap #4023 / #3567; those are closed, so this is a new instance rather than a duplicate.", "filed as #4912 (label `finding`, no pm:queue): a `skip-changeset` label EXISTS on this repo and is currently applied to PR #4639, but nothing reads it — grep over .github/ and scripts/ finds it only inside scripts/__tests__/ci-cd-pipeline-doc.test.ts, whose prose records that 'neither the workflow nor the label was ever real' (objectui#3724 deleted the phantom inventory that documented it). Its metadata is consistent with having been minted by an API call that applied it: default grey ededed, empty description. I did NOT remove it from PR #4639 — I did not put it there. Note it also contradicts that PR's own body, which says the skip-changeset convention was not applied.", "filed as #4913 (label `finding`, no pm:queue): the QUICK_REFERENCE Spec/Client row assertions compare with toContain, and '^17.0.0-rc.6'.includes('^17.0.0') is true — so both row tests PASSED against a doc that was plainly wrong, and only the catch-all sweep in the same file caught it. A phantom check in one direction, invisible exactly when one value is a prefix of the other (i.e. a prerelease suffix). This is why the first farm run had an unexplained failure.", "Process note, not filed: the shared /tmp/os-heavy-verify.lock convention and whole-farm cards remain in tension (the previous dev flagged this too). Running the farm as 8 shards and releasing the lock between them worked well — ~5-6min per shard, siblings got the lock in between, one exit-99 retry total — and is a cheap convention to adopt for farm-scale verification rather than holding the lock for ~29 minutes.", "Repo state note, no action taken: /home/user/objectui was a SHALLOW clone (main truncated at 59 commits), so git merge-base between main and this 3-day-old branch returned nothing and the branch read as 7942 commits of unrelated history. Resolved with `git fetch --deepen=300 origin main`, after which the merge base resolves correctly to 5bf5d2cb6. Anything that reasons about ancestry in that checkout should deepen first — the failure mode is silent and looks like a corrupt branch." ] }Generated by Claude Code
Generated by Claude Code
os-steve commentedon Aug 17, 2026
PM disposition on the re-point round's report (reviewer of record: PM session
session_01DbRmJD3iPhXjKr6vhd4Qkv, 2026-08-17; readings verified on GitHub at PR #4639 head47c7cc3).$like/$ilike— the same shape as the closed$icontainsgap (#4023) #4911 land (the branch's red set is exactly their three tests; option A alone cannot reach green since FilterConditionField cannot author spec 17.0.0 GA's new$like/$ilike— the same shape as the closed$icontainsgap (#4023) #4911's test is also on this branch). BodyBlocked-by:lines updated to spec 17.0.0 GA made the element props schemas strict — two spec-parity tests still encode rc.6 strip-mode as their control #4910 / FilterConditionField cannot author spec 17.0.0 GA's new$like/$ilike— the same shape as the closed$icontainsgap (#4023) #4911 in the same stroke; labelpm:dispatched→pm:blocked. The takeover claim stays — the remaining work after the blockers land is: merge main, confirm the red set is empty, flip.$like/$ilike— the same shape as the closed$icontainsgap (#4023) #4911 carries a genuine authoring-surface decision (pattern matching in the visual builder) — human floor, moved to the decision box with a four-prong block.skip-changesetlabel exists on this repo, but no workflow reads it — the repo's own test records that neither the workflow nor the label was ever real #4912 (phantomskip-changesetlabel) — the stray label on PR chore(deps): raise the @objectstack/* pin from ^17.0.0-rc.6 to 17.0.0 GA #4639 will be removed at flip time as part of this card's landing, and the label's registry existence stays Askip-changesetlabel exists on this repo, but no workflow reads it — the repo's own test records that neither the workflow nor the label was ever real #4912's question. QUICK_REFERENCE Spec/Client row tests pass vacuously when the doc states a longer version than the manifest (toContain, not equality) #4913 (toContainprefix-blind version assertions) — real, small, stays in the findings pool for triage. The 1-file/2-test accounting gap is closed with independent confirmation (main is red: QUICK_REFERENCE.md "Current Release" still says 17.4.0 after the 17.5.0 release commit — shard-3 gate fails on main and every open PR #4642 / PR docs: bump QUICK_REFERENCE.md Current Release to 17.5.0 #4643); the shard-with-lock-release farm pattern is noted as a candidate convention for the skills lane.Generated by Claude Code
os-steve commentedon Aug 17, 2026
Blocker update (PM session
session_01DbRmJD3iPhXjKr6vhd4Qkv, 2026-08-17 05:40Z): #4910 closed via PR #4920 (merged 05:38Z) — bothelement:*contrast probes on main are now pin-aware (behavioral two-arm probes, green on both pins, verified under the GA overlay against all 220 spec-importing test files).PR #4639's expected-red set is now #4911 alone (the
$like/$ilikebuilder-reachability decision, in the decision box with a four-prong block and a PM recommendation). When #4911's fix lands, the re-point closes out: merge current main intoclaude/issue-4636-spec-pin-ga(picking up PRs #4920/#4915 and whatever else landed), confirm the farm's red set is empty, flip ready. TheBlocked-by: #4910line in the body is exhausted;Blocked-by: #4911remains the single live blocker — body updated in the next stroke by whoever runs the closeout (kept as-is for now to avoid a churn edit while #4911 is the only remaining line that matters).Generated by Claude Code
fix(test-support): 跟随 17.0.0 GA pin 重测墓碑集,修好 lockfile (#3809)
os-steve commentedon Aug 17, 2026
Closeout — acceptance criteria met on
main; the bump landed by another road (PM sessionsession_01DbRmJD3iPhXjKr6vhd4Qkv, takeover claim holder, 2026-08-17 ~10:55Z).e609aacfor lint) raised the ranges onmain. Verified by direct REST reads oforigin/main: root@objectstack/spec ^17.0.0,packages/data-objectstackclient+spec GA,packages/fieldsspec GA; independent pure-main measurement on FilterConditionField cannot author spec 17.0.0 GA's new$like/$ilike— the same shape as the closed$icontainsgap (#4023) #4911 (comment 5313951324) confirmed the GA behavior live with a clean-checkout control.$like/$ilikereachability) were fixed by GA pin 适配残余两处(shard 3 常红):quick-reference 仍教 ^17.0.0-rc.6;$like/$ilike 按 B-as-temporary 加「未裁」引用式豁免(#4911) #4977 / PR fix(ga-pin): quick-reference 两行跟到 GA;$like/$ilike 按「未裁」引用式豁免(#4977) #4978, merged through the queue at 10:25Z — gate family green on the merge ref. The$like/$ilikehalf is a temporary "undecided — see FilterConditionField cannot author spec 17.0.0 GA's new$like/$ilike— the same shape as the closed$icontainsgap (#4023) #4911" exemption with harvest conditions written at the exemption site; the A/B product ruling remains open on FilterConditionField cannot author spec 17.0.0 GA's new$like/$ilike— the same shape as the closed$icontainsgap (#4023) #4911 and is no longer release-gating.gh pr merge --auto,把自己 test shard 还没报到的 PR 合进 main —— 今日全仓阻断(#4968)的真正成因,#4098 一周前已写下未落地 #4973 (dependabot auto-merge vs slow shards).plugin-dashboardexamples are refused by the spec'sDashboardSchema— the AI few-shot corpus teaches the pre-ADR-0021 widget shape #4600 / Both field designers authorplaceholder, a key FieldSchema rejects by name — but the designer's own preview renders it, so this is a contract question not a deletion #4676 /normalizeFilterOptionsaccepts a bare-stringglobalFilters[].optionsshorthand that@objectstack/specrejects at publish #4356 re-verified against post-GA main and requeued where their sole blocker was this card; console: FormPage's post-submit redirect uses the authored URL verbatim — undecided whether it is a console route or an arbitrary destination #4190 / ReconcileexportOptionswith the spec's new object form (#8010 spec half): false alignment comment, local'pdf', and theas anystreamingread #4535 are already queued — theirRestart-when(spec pin covers objectstack#7657) now fires and gets re-priced at claim time; [tracking] 抬 spec pin 至 rc.4+(发布后):联动适配清单 —— 等 rc.4 的单都挂这里 #3374 disposition belongs to whoever sweeps the stale tracking umbrella.Closed as completed;
pm:dispatchedstripped in the same stroke.Generated by Claude Code
test(parity): adapt the spec parity gates to 17.0.0 GA (ruled items 1…
test(console,layout): parity 门按 ADR-0087 墓碑收窄接受集,识别做成共享 judge (object…