Repository navigation
[Decision] ui/ merge leftovers that no aftercare card names: six nested top-level docs, a second copy of four .claude hooks, an independently numbered ui/docs/adr, and a dead ui/.github/dependabot.yml #26080
Description
Ruled: 6417494426 · letter A · 2026-10-26T13:42Z
Filing gate ②: a maintainer-only decision. Maintainer, 2026-10-26, verbatim: 「完整的评估本项目, 还有哪些可以优化的地方。包括 ci 和文档」 then 「使用 pm-dispatch 技能创建 issue,需要决策的立为决策卡。」 and 「低优先级的先不考虑」. Batch-of: 19 (repository evaluation 2026-10-26, session_019a9XCWsbMFp75REzthE6cs; 9 decision cards + 10 execution cards). Reader: the director seat presents this card in a decision batch; after the ruling the lane named under "After the ruling" dispatches. ⛔ Not a claim. Dedupe: REST list (439 issues), grep ui/\.github|ui/AGENTS|ui/\.claude|nested → 3 hits: #25880 (closed, ruled A: port the 19 repo gates), #25728 (closed), #25712 (open, dispatched: AGENTS.md / ui/AGENTS.md nesting, the 18 governance workflows, pm scripts, liveness evidence). Read #25712's scope in full: it names ui/AGENTS.md, the workflows under ui/.github/, and the two .githooks trees; it does not name the files below. #25831 (ui changesets) and #25832 (ui skill bundle) cover those two. New for the remainder.
维护者速读
objectui 合入 ui/ 两天,#25712 / #25831 / #25832 / #25880 已经在收 AGENTS.md、治理 workflow、changeset、skills 和 repo-gates。还剩一组没人点名的重复面:① ui/ 下六份顶层文档 README.md(470 行)、CHANGELOG.md(807 行)、ROADMAP.md、CONTRIBUTING.md、QUICK_REFERENCE.md、LICENSE + LICENSE-THIRD-PARTY.md——根目录各有一份同名文件,两份 CONTRIBUTING 两套入门步骤、两份 ROADMAP 两条方向;② ui/.claude/hooks/ 与根 .claude/hooks/ 同名的四组守卫(guard-main-checkout、guard-main-checkout-bash、guard-shared-stash、guard-tree-enum 各带 selftest),Claude Code 只读根 .claude/,嵌套的一份永不执行;③ ui/docs/adr/ 11 份 ADR 独立编号(0001 起),与根 docs/adr/ 的 0001 重号,而 AGENTS.md 第 13 条说编号永不重分配、check-adr-anchors.mjs 只认根注册表;④ ui/.github/dependabot.yml Dependabot 只读根配置,这份是死文件;ui/lychee.toml、ui/turbo.objectui.json 同类。请裁:A 六份顶层文档并入根(README 的 UI 段落、CHANGELOG 作为 @object-ui 历史移到 content/docs/releases/ 或保留为 ui/CHANGELOG.md 只读历史、ROADMAP/CONTRIBUTING/QUICK_REFERENCE 删除并在根文档加 UI 小节、LICENSE 保留因 MIT≠Apache),删重复 hooks,ui/docs/adr 以 ui-NNNN 前缀登入根注册表索引(文件不动、不改号),删死配置;B 只删死文件(hooks、dependabot、lychee、turbo.objectui),文档与 ADR 不动;C 全部保留,作为 ui/ 子树自治的一部分。选 A / B / C?
Governing text
- AGENTS.md Prime Directive 14 (as amended for the merge): the governed register already lists
ui/docs/adr/**,ui/.claude/**,ui/skills/**,ui/AGENTS.md,ui/CLAUDE.md,ui/.github/workflows/**— soui/.claude/hooksis governed even though nothing runs it. - AGENTS.md Prime Directive 13: numbers are never reassigned; files never move between registries.
- tooling(ui-merge): governance in-repo — liveness evidence and spec tests stop citing objectui by commit, one sdui-parser, AGENTS.md / pm scripts drop
objectui#,ui/AGENTS.mdnests, 18 governance workflows merged or retired (parent #25677, 4b/6) #25712 scope items 4–5 and the.githooksnote (comment-free quote: "Two hook trees with overlapping names: a merged pre-commit must not run objectui's root-assuming hooks"). scripts/ui-import/README.md: the cutover procedure; it does not mention the files above.ui/CLAUDE.md(3 lines) points atui/AGENTS.md— stays as tooling(ui-merge): governance in-repo — liveness evidence and spec tests stop citing objectui by commit, one sdui-parser, AGENTS.md / pm scripts dropobjectui#,ui/AGENTS.mdnests, 18 governance workflows merged or retired (parent #25677, 4b/6) #25712 decides.
Premises
- P1 —
ls uishows README.md, CHANGELOG.md, ROADMAP.md, CONTRIBUTING.md, QUICK_REFERENCE.md, LICENSE, LICENSE-THIRD-PARTY.md, lychee.toml, turbo.objectui.json;ls ui/.githubshows dependabot.yml and workflows. - P2 —
ls ui/.claude/hooks→ eight files, four of them byte-different copies of root hooks:diff .claude/hooks/guard-shared-stash.sh ui/.claude/hooks/guard-shared-stash.sh. - P3 —
ls ui/docs/adr | wc -l→ 11;ls ui/docs/adr | head -1starts at 0001. - P4 — Dependabot reads only the root
.github/dependabot.yml(GitHub docs); the root file has nodirectory: /uientry. - P5 — licence:
ui/package.json"license": "MIT", root packages Apache-2.0 — the ui LICENSE file must stay.
One-sentence problem
Two days after the merge the tree still tells a reader two ways to contribute, two roadmaps, two hook sets of which one never runs, and two ADR 0001s.
Options
| Option | What | Consequence | Workload |
|---|---|---|---|
| A | Fold the six docs into the root equivalents (keep ui/LICENSE*; keep ui/CHANGELOG.md as frozen history or move it under releases); delete ui/.claude/hooks/* (root hooks already guard every repo path per their headers); register ui/docs/adr in the root index under a ui- prefix without renaming files; delete ui/.github/dependabot.yml, ui/lychee.toml, ui/turbo.objectui.json after confirming nothing reads them. |
One contributor story; the governed register shrinks by the dead hook tree; the anchor checker learns one more registry prefix (an edit to check-adr-anchors.mjs). |
devx + skills (hooks are .claude/**) · 3 PRs (docs; hooks Tier S; ADR index + dependabot Tier H for .github) · precedent: #25880 (closed) |
| B | Dead files only. | Quick; two CONTRIBUTINGs and two ROADMAPs remain. | 1–2 PRs |
| C | Keep. | The subtree stays a repository-in-a-repository. | 0 |
Business meaning
- A: one repository.
- B: one repository with a spare instruction manual in a drawer.
- C: two repositories sharing a lockfile.
四维分析
- 实际业务需求:读者是每个打开
ui/的贡献者与席位;ui/CONTRIBUTING.md还在讲 objectui 独立仓的 fork 流程,照做就是错的。 - 项目长远合理性:合并的目的(objectui 并入 objectstack 为
ui/workspace:D1 裁定(A+)的执行父单 — 一个 PR 同时改 spec 与渲染器,删除两仓互钉,@object-ui 保留包名并与 @objectstack 同一版本组,objectui 仓归档为迁移说明 #25677)是一个仓一套治理;留下第二套顶层文档与永不执行的 hooks 与之相反。ADR 不改号、只在根索引登记前缀,守第 13 条。 - 防 AI 犯错:席位按路径加载规则;
ui/.claude/hooks看起来像在守护,实际不运行——是「声明而未兑现」的治理面,正是北极星第 4 条反对的形态。 - 创业阶段不扩散:删重复、不加门禁;ADR 索引前缀是 D5 索引脚本的一个参数,不是新工具。
Recommendation
A, serialized after #25712's PR 2 lands (same directories). 只看①选 A;②③④ 是否翻转:否。
Confidence gaps: whether ui/turbo.objectui.json or ui/lychee.toml is read by any root script or workflow (grep -rn 'turbo.objectui\|ui/lychee' .github scripts package.json before deleting); whether #25712's dev already removed any of these in flight — the dispatching seat re-reads #25712's PR file lists first.
After the ruling
- A: devx seat for docs and dependabot; skills seat for
ui/.claude/hooks(Tier S); ADR prefix rides D5's index PR if that is ruled A, else its own small PR. - B: devx seat, one PR plus the Tier S hooks PR.
os-decision-facets
① 项目长远合理性:一个仓一套治理(#25677 的目的);ADR 不改号只登前缀,守第 13 条。
② 实际业务拉动:ui/CONTRIBUTING.md 讲的是独立仓流程,照做即错;两份 ROADMAP 两条方向。
③ 防 AI 犯错:永不执行的 hooks 是「声明而未兑现」的治理面,删除优于保留。
④ 创业阶段不扩散:删重复零新门禁;索引前缀复用 D5 的脚本。
Prior rulings read: ui merge,nested,aftercare,hooks → 3 hits (#25880 A, #25712, #25728); none; thread: none; repo: objectstack-ai/objectstack
Related
#25677 (epic), #25712 (open, dispatched), #25831, #25832, #25880 (closed, ruled A).
Activity
objectstack-fleet commentedon Oct 26, 2026
Triage: first grade —
documentation·tooling·priority:p2·domain:devx·area:devpath·needs-user-decision·pm:awaiting-maintainer· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-26T12:05Z⛔ Not a claim, ⛔ not a dispatch. On the maintainer's 「完整的评估本项目…」 / 「低优先级的先不考虑」 (repository evaluation, Batch-of 19). Low priorities were excluded at filing, so the execution cards grade p2.
objectui#,ui/AGENTS.mdnests, 18 governance workflows merged or retired (parent #25677, 4b/6) #25712 (same directories). Whatever the letter, the execution waits for tooling(ui-merge): governance in-repo — liveness evidence and spec tests stop citing objectui by commit, one sdui-parser, AGENTS.md / pm scripts dropobjectui#,ui/AGENTS.mdnests, 18 governance workflows merged or retired (parent #25677, 4b/6) #25712's PR 2.Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
Pointer from the README / brand evaluation the maintainer asked for on 2026-10-26 (「评估 objectstack readme该如何改进」, 「objectui 是否建议去掉」, then 「同意,派卡处理」) · written 2026-10-26T13:07Z ·
session_01FMuBZmssbfQkVrKRtxNvng. ⛔ Not a claim, not a ruling.Item ①
ui/README.mdis more than a nested duplicate of a top-level doc: it is still Object UI's product README, so it carries a second brand inside this repository. Read atmain679fc7c:license-MITbadge and a CI badge that points at the archived repository's workflow (objectstack-ai/objectui/workflows/CI), which will never run again.Documentation | Quick Start | Examples | Changelog | Roadmapnav pointing atui/ROADMAP.md/ui/CHANGELOG.md(the same files this card lists).Describe → ObjectStack / Render → Object UI / Operate → ObjectOS— that the organisation profile and the root README no longer use (two brands, not three).github.com/objectstack-ai/objectui(archived;grep -c 'github.com/objectstack-ai/objectui' ui/README.md→ 5).Whatever letter is ruled, the UI text that survives should read as a workspace README rather than a product one: first sentence along the lines of "
ui/is the view layer of ObjectStack: a schema-driven React renderer, usable on its own through@object-ui/*"; keep the Quick Start table, the package table and the screenshots; drop the badge row and the three-product block; links go toui/…paths, not to the archived repo.@object-ui/*package names and the objectui.org docs site (ui/apps/site) stay — they name a package and a site, not a brand.This supports A for item ①. The root README itself is a separate maintainer-directed card (slimming + three stale lines), filed today by this session; the organisation profile and pinned repositories are the maintainer's own action.
Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
Brief-claimed-by: session_01KrKXQVvgYk2AJ4VkqMobyb · batch #398 · 2026-10-26T13:30Z
Director seat, summon #51 continuation (ledger objectstack#12708). Presented to the maintainer in batch #398 (the docs family of the 2026-10-26 repository review) as item 4 of 5. Seat increment (re-verified on
origin/maincdd4eea9; the card's own analysis is not restated):ui/carriesREADME.md,CHANGELOG.md,ROADMAP.md,CONTRIBUTING.md,QUICK_REFERENCE.md,LICENSE,LICENSE-THIRD-PARTY.md,lychee.toml,turbo.objectui.json;ui/.claude/hooks/8 files;ui/docs/adr/11 files from 0001;ui/.github/dependabot.ymlexists and the rootdependabot.ymlhas nodirectory: /ui. The only reader ofturbo.objectui.json/ui/lychee.tomlon main isscripts/ui-import/README.md(prose), so both can go once that README is updated.ui/.claude/**is a register row (the card reads it Tier S like root.claude/**; the register row's tier decides — the dispatching seat readsGOVERNED_SURFACESbefore landing);.github/dependabot.ymlis not.github/workflows/**, so not governed; the ADR index prefix rides [Decision] docs/adr: 143 ADRs with no index, four numbers used twice, 19 Proposed older than three months, three status-line spellings — how the registry gets put in order #26076's PR (Tier H).objectui#,ui/AGENTS.mdnests, 18 governance workflows merged or retired (parent #25677, 4b/6) #25712 (open,pm:dispatched, epic) ownsui/AGENTS.mdand the nested workflows; this card's docs fold and hook deletion wait for its PR 2 and re-read its file list first, as the card says.ui/LICENSE*, delete the never-runui/.claude/hooks, registerui/docs/adrunder aui-prefix without renaming, delete the three dead config files). Workload: devx + skills · 3 PRs · precedent ci(ui-merge): the 19 objectui repo gates inui/.github/workflows/repo-gates.ymlhave run nowhere since the cutover — port them into the rootLint UIjob before 2d-3 deletes the nested workflows (roster row 24; parent #25677) #25880.Prior rulings read:
ui/.claude·ui/docs/adr·dependabot→ ci(ui-merge): the 19 objectui repo gates inui/.github/workflows/repo-gates.ymlhave run nowhere since the cutover — port them into the rootLint UIjob before 2d-3 deletes the nested workflows (roster row 24; parent #25677) #25880 A, tooling(ui-merge): governance in-repo — liveness evidence and spec tests stop citing objectui by commit, one sdui-parser, AGENTS.md / pm scripts dropobjectui#,ui/AGENTS.mdnests, 18 governance workflows merged or retired (parent #25677, 4b/6) #25712 scope, Prime Directive 13/14; thread: this card's triage comment.objectstack-fleet commentedon Oct 26, 2026
Ruling: batch #398 item 4 · letter A · maintainer 「其他同意」 2026-10-26T13:42Z
Recorded by the director seat (summon #51 continuation,
session_01KrKXQVvgYk2AJ4VkqMobyb, ledger objectstack#12708). The maintainer answered batch #398 with 「其他同意」 — every seat letter on the four cards other than #26073, whose letter is still open. Brief 6417246253. Letter A: fold the sixui/top-level documents into their root equivalents (README,ROADMAP,CONTRIBUTING,QUICK_REFERENCE;ui/CHANGELOG.mdkept as frozen history or moved under releases;ui/LICENSEandui/LICENSE-THIRD-PARTY.mdstay — the ui packages are MIT); deleteui/.claude/hooks/*(never loaded; the root hooks guard every repository path per their headers); registerui/docs/adr/in the root index under aui-prefix without renaming files (Prime Directive 13), riding #26076's index PR; deleteui/.github/dependabot.yml(GitHub reads only the root file),ui/lychee.tomlandui/turbo.objectui.jsonafterscripts/ui-import/README.md, their only reader onorigin/main, is updated. Not B (two CONTRIBUTINGs and two ROADMAPs would remain) and not C.Serialization: after #25712's PR 2 lands (it owns
ui/AGENTS.mdand the nested workflows); the dispatching seat re-reads #25712's PR file lists first.Workload of the chosen letter (card column): devx + skills · 3 PRs — docs fold (devx),
ui/.claude/hooksdeletion (the tier theGOVERNED_SURFACESrow forui/.claude/**carries; the landing seat reads the register, not this ruling), dependabot/config deletion (not.github/workflows/**, so not governed) with the ADR prefix on #26076's PR.Execution:
needs-user-decision→pm:queuein this act (domain:devx, p2);pm:awaiting-maintainerremoved in the same stroke.Ruling-ref:names this comment;Clause-②: no,Metadata-protocol: none.22 remaining items
objectstack-fleet commentedon Oct 28, 2026
Claim: PM loop round 7 · slice 2 · 2026-10-28T13:13Z
Session:
session_01QSeKYmTYfaPbLQD4BJfomW(the dispatching seat; the dispatch note under this claim names the cloud session)Account:
os-justin(the seat's linked user, asGET /useranswers it; the card's assignee)Branch:
claude/issue-26080-parked-configsWorktree: the cloud session's own container
Domain:
domain:devxSeat:
domain:devx#2File surface: remaining item (3) of the slice-1 landing 6458593211, and item (2) checked. MEASURE FIRST whether
ui/turbo.objectui.jsonandui/lychee.tomlare read by any real run onmain: a turbo invocation,check-links.yml(root,--config lychee.toml= the ROOT file) or any workflow. If a file is dead config, retarget each reader to the live file and delete the dead one. The readers areui/scripts/workspace-root.mjs(PARKED_TURBO_CONFIG) and its test,ui/scripts/__tests__/helpers/turbo-inputs.tsand the turbo-config tests that use it, andui/scripts/__tests__/check-links-workflow.test.ts. The live files are the rootturbo.jsonand the rootlychee.toml. Each test keeps asserting the same property against the config that actually runs, ⛔ never loosened or dropped. A test whose property has no live counterpart goes into the report, not into a deletion. If either file is LIVE, leave it and report. Item (2): confirm onmainwhetherui/docs/adr's index prefix is settled by #26076 (PR #26503), and report it, with no edit unless it is a one-line pointer. ⛔ui/.claude/hooks/*(item 1) isdomain:skillsper #26997 ruling B, out of scope. ⛔ No.github/workflows/**edit (stop on breach; explain in the report)Container & model: M,
mode:cloud,model: TIER_DEFAULT(dispatch-gates --tier: "no path-derived mandate"),effort: high(p2; tests that may be pinning a dead config)Clause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Ruling-ref: the card's ruling A, as cited in slice 1's claim
Thread-read: 6458593211
Premise: holds at
origin/main4d3a077f66. Both files exist.workspace-root.mjs:119exportsPARKED_TURBO_CONFIG = 'turbo.objectui.json'. Nineui/scripts/__tests__files read the parked turbo config throughturbo-inputs.ts/workspace-root.mjs.check-links-workflow.test.ts:55readslychee.tomlunder the ui root. Rootcheck-links.ymlpasses--config lychee.tomlfrom the repo root.Serial constraints cleared: no open PR touches
ui/scripts/workspace-root.mjs,ui/scripts/__tests__/helpers/turbo-inputs.ts,ui/turbo.objectui.jsonorui/lychee.toml.Generated by Claude Code
objectstack-fleet commentedon Oct 28, 2026
Dispatched under claim 6469923805 · 2026-10-28T13:16Z: cloud session
session_01QSeKYm6a7FAA3rBWrMCCij(mode:cloud,TIER_DEFAULT), branchclaude/issue-26080-parked-configs. The report comes back here asos-dev-report.Generated by Claude Code
docs(adr): ADR-0145 — mirror pairs retire together; one release clock…
objectstack-fleet commentedon Oct 28, 2026
os-dev-report
{ "issue": 26080, "status": "done", "branch": "claude/issue-26080-parked-configs", "pr": "https://github.com/objectstack-ai/objectstack/pull/27281", "session": "session_01QSeKYm6a7FAA3rBWrMCCij (cloud session; dispatched by seat session_01QSeKYmTYfaPbLQD4BJfomW, claim 6469923805, which names this branch)", "premise_still_valid": true, "summary": "Measured on main: no real run reads ui/turbo.objectui.json or ui/lychee.toml. Every turbo invocation (workflows, root package.json scripts, turbo's own resolution) reads the root turbo.json plus ui/apps/console/turbo.json; no --root-turbo-json is passed; ui/package.json has no turbo script; ui/.github is gone. check-links.yml passes the root lychee.toml. So both files are dead config. Retargeted to the live config, with no assertion dropped (338/338 before and after): turbo-type-check-inputs (via a new liveTurboConfig() in helpers/turbo-inputs.ts, which is uiScopedTurboConfig), the package-lint describe of turbo-lint-inputs, and check-links-workflow's no-remap pin (now on the root lychee.toml). Neither dead file is deleted. A probe that substitutes the live config for the parked one turns 147 assertions red in 8 files, and their properties have no live counterpart. So those guards stay on the parked copy unchanged, per the never-loosen rule; see open_questions. Item (2): settled on main. PR #26503 merged as 79cd9ef8 (merge-base --is-ancestor exit 0), and docs/adr/README.md:215 indexes ui/docs/adr under the ui- prefix. No edit made.", "tests": "Head 6bee0fba (after the origin/main merge): pnpm --dir ui exec vitest run --maxWorkers=2 scripts/ under os-verify-lock gave 'Test Files 174 passed | 2 skipped (176) / Tests 5003 passed | 2 skipped (5005)', 'VERDICT command-exit 0'. The 11 reader files (check-dist-completeness, e2e-type-check, select-type-check-scope, turbo-build-outputs-cover-published-entries, turbo-lint-inputs, turbo-task-guard-coverage, workspace-root, turbo-build-inputs, turbo-test-inputs, turbo-type-check-inputs, check-links-workflow): baseline 11 passed / 338, after the change 11 passed / 338. pnpm --dir ui run type-check:scripts exit 0. A first full run had 16 red files from unbuilt @objectstack/spec and @objectstack/formula dist; I built the ui_consumers set (spec, client, core, formula, lint, sdui-parser, types; VERDICT command-exit 0) and the 16 went green. Teeth: (1) node scripts/ablation-replace.mjs --file turbo.json --anchor the ui/tsconfig.json type-check input --delete (anchor 1 to 0, blob 6d3dece1ae49 to 5b5820c9f5f8) turned turbo-type-check-inputs 38 failed; restored, hash equal to the HEAD blob, git status clean. (2) appending a remap line to the root lychee.toml (grep -c remap 0 to 1) made 'carries no remap pretending to resolve fumadocs routes' fail; restored by hash. A first type-check mutation (removing ui/scripts/markdown-fence-scan.mjs) was a no-op for the guard, because that entry is in INPUTS_NOT_DERIVABLE; I re-ran with a derived entry. No ablation of runtime behaviour: tests and config readers only.", "gates": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack on 6bee0fba derived 18 families. Each was run with its exit captured before any pipe, and all 18 exit 0: check-closing-keyword-parity (scan and --self-test), check-comment-mask-corpus, ui vitest scripts/, check:cross-package-test-inputs, check:driver-memory-census, check:engine-double-contract, check:gitlink-declared, check:nul-bytes, check:published-files, check:query-options-erasure, check:refd-timer-probe, check:tier-file-adoption, check:type-check-coverage, check:type-check-debt, check:undeclared-dep-imports, check:watch-hint-literal, check:where-matcher. --ran reconciliation: '18 derived famil(ies) accounted for — 18 run, 0 NOT-MEASURED (a DERIVED zero — all 18 recorded an exit code and none of them is 3)'. The PR's CI check-runs have not been read yet (in_progress at report time).", "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "mcp_calls": "0", "api_writes": "2 relay writes plus git push. (1) pr_create via fleet-write dispatch: POST /repos/objectstack-ai/objectstack/dispatches, run 40704995766, which opened PR #27281 as a draft with assignees [os-justin] and labels [skip-changeset]; read-back: body 13707 bytes identical, labels [skip-changeset], assignee os-justin. (2) this report comment: POST /repos/objectstack-ai/objectstack/issues/26080/comments via scripts/pm/post-stamped.mjs.", "open_questions": [ { "question": "The live root turbo.json build and test tasks hash none of the ui tree's root files that the parked copy declares (ui/tsconfig.json, ui/scripts/vite-*.ts, build-plugin-stylesheet.mjs, check-dist-completeness.mjs, invoked-as.mjs, vitest-invocation-guard.mjs; the vitest config and setup set for test). turbo run build --filter=@object-ui/components --dry=json lists only scripts/check-dts-emitted.mjs, scripts/invoked-as.mjs and scripts/tsup-drop-sources-content.mjs as root-anchored inputs, while ui/packages/components/vite.config.ts:14-15 imports ui/scripts/vite-dts-*.ts. The guards that would catch it (turbo-build-inputs 38, turbo-test-inputs 41, check-dist-completeness 1) stay green only because they read the dead copy. Should the root config carry these entries?", "options": [ "A: port the ui entries into the root build/test inputs. This edits every @objectstack/* package's cache key too. Then retarget those guards and delete ui/turbo.objectui.json", "B: package-level turbo.json files in the ui packages, extending the root, carrying the ui inputs", "C: keep the status quo, and the parked file with it" ], "recommendation": "A, on its own card, because it closes a stale-build replay path and is the only route that makes the parked file deletable. It is a behaviour change to the real cache keys, outside this slice's file surface." }, { "question": "Properties with no live counterpart by construction: //#lint:root and //#type-check:e2e are root tasks of objectui's own manifest. In the root config, // is the objectstack package, and CI runs them as plain steps (pnpm --dir ui run type-check:e2e). Their guards (turbo-lint-inputs //#lint:root describe 5, e2e-type-check wiring 4, select-type-check-scope 2, and part of turbo-task-guard-coverage's 55) can only read the parked copy. What happens to them?", "options": [ "A: rewrite each against the CI step that runs the task", "B: retire each one that has a named duplicate at an equal or closer layer, per the test-deletion rule", "C: leave them on the parked copy" ], "recommendation": "A where a step exists, then B for the residue. Until then the parked file stays." }, { "question": "check-links-workflow's root_dir sentinel pin (site-absolute routes skipped into a non-existent namespace) has no root counterpart: the root lane RESOLVES site routes with --root-dir plus --fallback-extensions. Keep the pin on the dead ui/lychee.toml, retire it, or restate it against the root workflow's argv?", "options": [ "A: restate it against check-links.yml's LYCHEE_ARGS (--root-dir is present and points at content)", "B: retire it with ui/lychee.toml, naming check-links.yml as the owner", "C: keep it" ], "recommendation": "A, because it pins the live mechanism by path, after which ui/lychee.toml becomes deletable. A test read of the workflow is not a workflow edit." } ], "out_of_scope_findings": [ "class: a · reach: named producer: root pnpm build (turbo run build over @object-ui/* packages) hashes no ui/scripts/vite-*.ts or ui/tsconfig.json, measured by turbo --dry=json on @object-ui/components#build · evidence: the probe (turbo-build-inputs 38 red against uiScopedTurboConfig) and the dry-run input list · dedupe words: turbo build inputs ui scripts, stale cache object-ui build, TURBO_ROOT ui vite · carrier: open question 1 on this card", "noted, not filed: select-type-check-scope.test.ts drives the selector with the parked config, while the production selector (select-type-check-scope.mjs:324) reads uiScopedTurboConfig. The test and production disagree on e2e widening (2 cases red against live). In PR Acceptance notes · carrier: open question 2", "noted, not filed: ui/apps/console/turbo.json restates the parked build.outputs rather than the root's (it lacks json-schema/** and !.next/cache/**). Console emits neither path · carrier: none" ], "deviations": "Worked in place on the harness-pinned outcome branch in the cloud container, not in a separate worktree: the branch was already checked out there, and the container is this session's alone. The first commit carried a model-named co-author trailer; the push hook refused it, and I amended the unpublished commit to the model-free pair before the first push. pnpm install needed one retry: better-sqlite3's node-gyp header download aborted mid-TLS, and the second install exited 0. The PR body's 维护者速读 is six lines in Chinese, as required.", "files_changed": "4 files, +43 / -17 vs origin/main at 6bee0fba: ui/scripts/__tests__/helpers/turbo-inputs.ts, turbo-type-check-inputs.test.ts, turbo-lint-inputs.test.ts, check-links-workflow.test.ts" }Generated by Claude Code
objectstack-fleet commentedon Oct 28, 2026
domain:devx#2 · os-justin · session_01QSeKYm6a7FAA3rBWrMCCij
os-dev-report
{ "issue": 26080, "status": "done", "branch": "claude/issue-26080-parked-configs", "pr": "https://github.com/objectstack-ai/objectstack/pull/27281", "session": "session_01QSeKYm6a7FAA3rBWrMCCij (cloud session; dispatched by seat session_01QSeKYmTYfaPbLQD4BJfomW, claim 6469923805)", "premise_still_valid": true, "summary": "Addendum to report 6471544589, patch round on the seat's OQ3 answer (A). The check-links-workflow site-route pin now reads the lychee argv the live lane runs: `.github/workflows/check-links.yml` `env.LYCHEE_ARGS`, a test READ with no workflow edit. It asserts `--config lychee.toml`, an absolute `--root-dir` anchored on the workspace whose tree holds `docs/`, and `--fallback-extensions` carrying mdx and md. That is the same both-halves-or-neither property the root_dir-sentinel pin held, restated for the mechanism that runs. Its last reader retargeted, `ui/lychee.toml` is deleted. git grep finds no other reader, only prose naming the lychee tool in `ui/scripts/check-doc-links.mjs` and its test. `ui/turbo.objectui.json` and its 147 parked-copy assertions are untouched, per the seat's OQ1/OQ2 answer. Merged origin/main (0d45c0e7) with no rebase and no force-push. Head 88bd2bb7.", "tests": "Head 88bd2bb7: `pnpm --dir ui exec vitest run --maxWorkers=2 scripts/` under os-verify-lock gave 'Test Files 174 passed | 2 skipped (176) / Tests 5003 passed | 2 skipped (5005)', 'VERDICT command-exit 0'. check-links-workflow.test.ts 4/4. Teeth, via `node scripts/ablation-replace.mjs` on the on-disk `.github/workflows/check-links.yml` (local mutation only, never committed; blob fd75bd9ccaee restored both times, verified by hash, git status clean): leg 1, deleting the `--root-dir ${{ github.workspace }}/content` line (anchor 1 to 0), turned the pin red with 'check-links.yml must pass --root-dir, or site-absolute links are hard errors'; leg 2, deleting `--fallback-extensions mdx,md`, turned it red with '--root-dir alone leaves every extension-less route unresolved'. A first green run of the new pin was red: a whitespace split broke the `${{ github.workspace }}` expression into three tokens. Fixed in 88bd2bb7 by collapsing each expression to one token before splitting; both legs re-run after the fix.", "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack on 88bd2bb7 (5 paths vs merge base 0d45c0e71) derived the same 18 families. All 18 exit 0, each captured before any pipe: check-closing-keyword-parity (scan and --self-test), check-comment-mask-corpus, ui vitest scripts/, check:cross-package-test-inputs, check:driver-memory-census, check:engine-double-contract, check:gitlink-declared, check:nul-bytes, check:published-files, check:query-options-erasure, check:refd-timer-probe, check:tier-file-adoption, check:type-check-coverage, check:type-check-debt, check:undeclared-dep-imports, check:watch-hint-literal, check:where-matcher. --ran: '18 derived famil(ies) accounted for — 18 run, 0 NOT-MEASURED (a DERIVED zero — all 18 recorded an exit code and none of them is 3)'. PR check-runs on 88bd2bb7: not read (in_progress).", "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "mcp_calls": "0", "api_writes": "1 this round: this addendum comment, POST /repos/objectstack-ai/objectstack/issues/26080/comments via scripts/pm/post-stamped.mjs (relay); a first attempt was refused locally with zero writes (missing signature line). Plus git push (6bee0fba..e98b58a6 merge, ..9a1075c3, ..88bd2bb7). The PR body was not patched.", "pr_body_changes_for_the_seat": [ "Title: replace '...; both parked configs stay' with 'test(ui/scripts): the inputs guards and the lychee pins read the configs that run; ui/lychee.toml is deleted, ui/turbo.objectui.json stays'", "维护者速读 改了什么: append '另把 lychee 的站内路由守卫改为读 check-links.yml 的 lychee 参数(只读不改 workflow),`ui/lychee.toml` 已无读者,删除。'", "维护者速读 风险与回滚: replace '两份死文件这次**不删**' with '`ui/lychee.toml` 已删;`ui/turbo.objectui.json` 这次**不删**', and '4 个测试文件' with '4 个测试文件与 1 份死配置'", "维护者速读 需要你做的: replace with '无,席位落地(根 turbo.json 的 ui 输入缺口由席位另立卡)。'", "What changes table: the row 'check-links-workflow.test.ts, root_dir sentinel | no ... | unchanged, ui copy' becomes 'check-links-workflow.test.ts, site-route pin | yes: restated against check-links.yml LYCHEE_ARGS (--config lychee.toml, absolute --root-dir over the docs tree, --fallback-extensions mdx,md) | reads the workflow argv', plus a new sentence: '`ui/lychee.toml` has no reader left and is deleted.'", "What changes: 'Neither dead file is deleted.' becomes '`ui/turbo.objectui.json` is not deleted.'", "Tests, teeth: add '(3) deleting --root-dir, then --fallback-extensions, from the on-disk check-links.yml (ablation-replace, blob fd75bd9ccaee restored by hash, never committed) turns the site-route pin red with its own message each time.' Update the head and suite line to 88bd2bb7: 174 passed | 2 skipped (176), 5003 passed | 2 skipped.", "Acceptance notes item 3: replace with 'Resolved in this PR (seat answer A): the pin is restated against the live argv and `ui/lychee.toml` is deleted.' Items 1-2: append 'Seat: a separate card carries the root turbo.json ui-input gap, with these guards riding it.'", "Reading 4: head 6bee0fba becomes 88bd2bb7. Same 18 commands, all exit 0, same --ran line." ], "open_questions": [], "out_of_scope_findings": [ "unchanged from report 6471544589; the seat carries open questions 1-2 on its own card" ], "deviations": "The seat's patch instructions arrived as a cross-session message from the dispatching seat session (data from a peer). I acted on them because they answer this report's own OQ3 within the claim's file surface. No workflow file was committed: the teeth mutated the working copy only, and it was restored by hash. post-stamped now requires a signature first line (landed on main in #27263 during this round), so this comment opens with it, and the os-dev-report marker is the second line.", "files_changed": "vs origin/main at 88bd2bb7: 5 files, +99 / -148: ui/lychee.toml deleted; ui/scripts/__tests__/check-links-workflow.test.ts, helpers/turbo-inputs.ts, turbo-type-check-inputs.test.ts, turbo-lint-inputs.test.ts" }Generated by Claude Code
objectstack-fleet commentedon Oct 28, 2026
domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW
ACCEPT → PR #27281 comment 6472392906 · 2026-10-28T14:57Z · ready + auto-merge armed (slice 2). Dev OQ3 → A, done in the PR (
ui/lychee.tomldeleted). OQ1/OQ2 → #27283 (rootturbo.jsonui-input gap; deletesui/turbo.objectui.json). Item (1) → #27260 (domain:skills).Generated by Claude Code
objectstack-fleet commentedon Oct 28, 2026
domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW
Landed (partial): slice 2, via PR #27281, merged as
0e205feaffthrough the merge queue · 2026-10-28T15:42ZRelease:
session_01QSeKYmTYfaPbLQD4BJfomW(domain:devx#2) · partial landing, and the seat stands down on the maintainer's word 「当前任务处理完,合并后就下班」 · next: the card moves topm:blockedon its two carriers, with no assignee.Merged = reviewed. The merged diff matches the reviewed head
88bd2bb7e1: the sorted +/− lines are hash-identical, 5 files, +99/−148. ACCEPT → PR #27281 comment 6472392906. Cloud sessionsession_01QSeKYm6a7FAA3rBWrMCCijis archived in this act.Landed:
ui/lychee.tomlis deleted, since no run read it. The type-check inputs guard, the package-lint inputs guard and both lychee pins now read the configs that run: the rootturbo.json(ui scope), the rootlychee.toml, andcheck-links.yml'sLYCHEE_ARGS. Item (2), theui/docs/adrindex prefix, was checked and is settled onmainby PR #26503. No edit was needed.Still open, each with its own card:
ui/.claude/hooks/*: [skills] ui/ merge leftover: delete the nestedui/.claude/hooks/*(8 files) and theui/.claude/settings.jsonhook rows that wire them (#26080 item 1) #27260 (domain:skills, per [Decision] Is "governed" a lane or an approval tier? The lane table gives.github/workflows/**to skills and to spec, while devx carries the AGENTS.md and workflow cards in practice #26997 ruling B).ui/turbo.objectui.json: [devx] root turbo.json hashes none of the ui tree's root build/test inputs: editing ui/scripts/vite-*.ts or ui/tsconfig.json can replay a stale @object-ui/* build from cache #27283 (p2 bug). The rootturbo.jsondoes not hash the ui tree's root build and test inputs, so 147 parked-copy assertions have no live counterpart until it does. That card retargets them and deletes the file.Blocked-by: #27260
Blocked-by: #27283
Generated by Claude Code