You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Setup navigation, one audit entry: "Audit Log" opens the audit browser and the record list becomes its presets (item 1 of #23803; plugin-audit nav + the console audit page) #23890
carries item 1 of #23803; #23803 keeps items 3 and 4 (item 4, the 39-entry count, is checked by whichever of the three lands last), and item 2 is the decision card filed beside this one.
Filing gate ④ (a cross-layer split of a queued card): #23803 was filed by the epic PM from the 2026-10-16 Setup review under the maintainer's 「全部立卡」. Triage's retriage answer 6211971208 names domain:engine for #23803 and asks the claimant to self-split the other lanes' items, verbatim: "Target 1's two plugin-audit nav entries are domain:services. Target 1's browser presets and "Open as list" link are objectui (audit:log)."
Filed by the domain:engine seat 2 (#20966) · os-tesla · session_01TQLy3Yq6vF4SDpTXdr3Uwi, while claiming #23803. ⛔ Not a claim. This card carries no domain:* label; triage routes it (a domain:services half and an objectui half).
Reader who acts: triage routes it; then the domain:services seat (the nav entries) and an objectui seat (the page).
"One audit entry: "Audit Log" opens the browser (filters by action, object, actor, date); the record list's views (Writes, Auth, …) become the browser's presets; the sys_audit_log list stays reachable from the browser's "Open as list" link, not from the nav."
Producers (read at origin/mainf7e836da1 and objectui origin/main)
packages/plugins/plugin-audit/src/audit-plugin.ts (~:276–277): nav_audit_logs (type: 'object', sys_audit_log) and nav_audit_log_browser (type: 'component', componentRef: 'audit:log'), both contributed to Setup's Diagnostics group. Its nav test is src/audit-nav-contribution.test.ts.
The browser page is the console component audit:log (objectui). Its presets and the "Open as list" link live there.
The browser offers the record list's views as presets, and "Open as list" reaches the sys_audit_log list.
Dedupe
MCP search_issues on this repository at this filing, closed included: Installed Apps Packages page marketplace installed merge filter preset Source column decision → 0 hits (run for the sibling decision card). The audit half has no other card; #23803 is its parent.
Triage: first grade, enhancement · priority:p2 · domain:services · area:devpath · pm:blocked on the objectui half · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-16T12:56Z
Triage seat (objectstack-wide, seat post #6015). ⛔ Not a claim, ⛔ not a dispatch.
Why domain:services: this card's own surface is plugin-audit's two nav entries (packages/plugins/plugin-audit/src/audit-plugin.ts:276–:277), and plugin-audit is domain:services.
Why blocked: removing nav_audit_logs before the browser can reach the list would leave the sys_audit_log list with no way in. So this card waits for the objectui half to be installable at .objectui-sha.
Claim: PM loop round 1 · 2026-10-17T15:59Z
Session: session_01Nk17Z26X5DB59iQztDBADH (the dispatching seat; the dev runs mode:subagent in this session's container and shares its session ID, so its identity is the branch)
Account: marchtian (the seat's linked user as GET /user answers it; the card's assignee from this act)
Branch: claude/issue-23890-one-audit-entry
Worktree: objectstack-issue-23890
Domain: domain:services
Seat: domain:services#1 (seat post #6021)
File surface (at origin/main62c4441efd or later; stop on a breach and explain it in the report):
packages/plugins/plugin-audit/src/audit-plugin.ts: the two Setup nav contributions (nav_audit_logs, nav_audit_log_browser, about :276–:277) become one entry, "Audit Log", whose target is the audit browser (audit:log). Plus src/audit-nav-contribution.test.ts.
packages/platform-objects/src/apps/translations/** (domain:engine): the nav label keys and source hashes of the entries this changes, in the four shipped locales.
packages/cli/test/connect-agent-both-halves-wire.pin.test.ts and console-page-nav-entries.pin.test.ts, plus packages/cli/scripts/check-app-nav-i18n.mjs's id roster (domain:cli): only the count and id pins this change moves.
{
"issue": 23890,
"status": "done",
"branch": "claude/issue-23890-one-audit-entry",
"pr": "#24204",
"session": "session_01Nk17Z26X5DB59iQztDBADH — subagent run, the dispatching seat's session id (the claim's Session line; the relay stamped writes with it)",
"premise_still_valid": true,
"summary": "plugin-audit's Setup contribution is one entry: nav_audit_logs, retargeted from the sys_audit_log object list to type component / componentRef audit:log, label 'Audit Log', icon scroll-text; nav_audit_log_browser is gone. nav_audit_logs survives because it breaks no reader: the access-security checklist anchor audit-plugin.ts#nav_audit_logs keeps resolving (the other choice reds check:platform-checklist with ABSENT SYMBOL), objectui keys sidebar pins on the nav id (useNavPins, nav:ID favorites) so pins on the older entry survive, check-app-nav-i18n.mjs's nav_audit_logs is a --self-test fixture that stays live, and objectui routes by type/componentRef, never by id (0 hits for either id at pin 5e15928b4631, control nav_approvals 1). Translations: en 'Audit Log'; zh-CN/ja-JP values kept (already 'Audit Log', matching the object's own label), es-ES 'Registro de auditoría'; nav_audit_logs digest re-recorded as b2fad40733012b18 in the three source-hash tables, nav_audit_log_browser keys and digests removed and the id added to DEAD_SETUP_NAV_IDS. The new pin folds SETUP_APP + SETUP_NAV_CONTRIBUTIONS + the plugin contribution through the real SchemaRegistry and asserts exactly one rendered Setup leaf targets an audit surface, nav_audit_logs to audit:log; ablation red as predicted. Premise held: the browser's presets and Open as list read all objects (meta.getItems('object'), AppContent allObjects.find), not nav. PM hypothesis 3 is falsified: connect-agent-both-halves-wire.pin.test.ts composes only platform-objects + the MCP bundle, so its toHaveLength(32) does not move; not edited, passes unedited. Item 4 is not this card's: #23933 is open at PR opening, platform-core.json untouched. Worktree removed after the PR opened (node_modules deleted first, git worktree remove without --force, exit 0).",
"tests": "Head 669c95c (after merging origin/main 7d6ec91), each through os-verify-lock with OS_VERIFY_LOCK_SLOT=issue-23890, VERDICT command-exit 0 each: pnpm --filter @objectstack/plugin-audit test 'Test Files 55 passed (55) / Tests 891 passed (891)'; pnpm --filter @objectstack/plugin-audit typecheck exit 0, 'check:test-typecheck: OK', audit-nav-contribution.test.ts in the tsconfig.test.json program (--listFiles count 1); pnpm --filter @objectstack/platform-objects test 'Test Files 73 passed (73) / Tests 1136 passed (1136)'; pnpm --filter @objectstack/platform-objects typecheck exit 0 (tombstone test in its test program, --listFiles count 1); pnpm --filter @objectstack/cli exec vitest run --project unit --maxWorkers=2 test/connect-agent-both-halves-wire.pin.test.ts test/console-page-nav-entries.pin.test.ts 'Test Files 2 passed (2) / Tests 4 passed (4)' (the 32 pin unedited). pnpm check:app-nav-i18n exit 0: 'OK (11 contributor(s), 4 locale(s), 2 app(s) — setup: 52 merged nav id(s), account: 12 merged nav id(s) — every id labelled in every locale)'. Ablation (subject resolved from source by relative import, so no dist rebuild per leg; scripts/ablation-replace.mjs wrap mode under the lock; trap restores on EXIT/INT/TERM against the absolute path): planted a second Setup entry { id: nav_audit_log_list, type: object, objectName: sys_audit_log } beside the one entry; anchor 1 to 0, blob 9a3eb803ddc6 to 388da06033b1; result 'Tests 2 failed | 1 passed (3)': 'contributes exactly one entry…' and 'the rendered Setup nav has exactly one entry whose target is an audit surface' both 'expected [ nav_audit_logs, …(1) ] to deeply equal [ nav_audit_logs ]'; the entry-shape case green as predicted (it reads the first item). Restore: blob after == HEAD 9a3eb803ddc6, git diff HEAD empty, git status clean. Direction observed: red, as predicted. First attempt was a no-op refused by the tool (replacement contained the anchor, count 1 to 1); nothing measured on it. Language-pack reading on the built entry declarations: platform-objects dist/apps/index.d.ts declares en: TranslationData (and zhCN/jaJP/esES; SetupAppTranslations: TranslationBundle); grep -r over 22 platform-objects .d.ts and 2 plugin-audit .d.ts: nav_audit_log_browser 0, nav_audit_logs 0, control TranslationData 2 — no exported type names the removed key, so Clause-② no stands (a runtime value narrows, no published type does).",
"gates": "Local, head 669c95c: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (no paths) to 98 commands for 16 paths vs merge base 7d6ec91; all 98 run, exit captured before any pipe: 98 x exit 0. --ran to 'dispatch-gates --ran: 98 derived famil(ies) accounted for — 98 run, 0 NOT-MEASURED' (exit 0). History: on the first battery at 028b179, check-registry-log-declared exited 1 (plugin-audit suite constructs a SchemaRegistry and declared no OS_REGISTRY_LOG) — fixed in 54e70c0 with the gate's own prescription; check:skill-examples, check:dual-build-cjs-loads and check:i18n exited 3 PREREQUISITE NOT MET until the CLI-closure prerequisite build ran, then exit 0 at 669c95c (check:i18n 'OK (10 package(s) — all bundles in sync…)'; check:dual-build-cjs-loads '111 published require entry point(s) across 69 package(s) load'). Not derived, run: node scripts/check-platform-checklist.mjs --changed-from origin/main exit 0 ('2 anchored file(s) in the change set, 3 anchor(s) judged, 0 lost'); pnpm check:platform-checklist (derived) 'OK — 16 areas, 327 items'; pnpm check:app-nav-i18n exit 0 (CI runs it in lint.yml); check:nul-bytes exit 0 and a control-byte grep over the 16 changed files found none. test:repo not run locally (no repo-project test touched; CI Test Core runs it). CI on PR #24204 head 669c95c at report time: 38 check-runs — 5 success, 5 skipped, 20 in_progress, 8 queued; Build Core queued, Governed Surface Queue Guard in_progress, Test Core (1/6)-(6/6) queued/in_progress, Lint & Repo Gates and TypeScript Type Check not yet reported — NOT MEASURED, CI convergence is the PM's.",
"mcp_calls": "0 — no MCP GitHub tool called",
"api_writes": "2 relay strokes (each one POST /repos/objectstack-ai/objectstack/dispatches as repository_dispatch, run as objectstack-fleet[bot]) executing 3 REST writes: POST /repos/objectstack-ai/objectstack/pulls (draft, #24204; body read back 11229 bytes sent = stored), POST /repos//issues/24204/assignees (marchtian, listed back), POST /repos//issues/23890/comments (this report). git push x5 (not REST): the empty branch, 3163a27, 028b179, 54e70c0, 669c95c. No label write (the diff publishes, so no skip-changeset), no PR-body PATCH.",
"open_questions": [
{
"question": "Keep the out-of-surface commit 028b179 (two docs pages and one checklist item that this change makes false) in PR #24204?",
"options": [
"A keep it: content/docs/ui/setup-app.mdx (Diagnostics row + notable-entries bullet), content/docs/permissions/record-view-auditing.mdx (Reading the trail), docs/qa/platform-checklist/areas/access-security.json item access-security.audit-log-browser (step 5 + nav source line, revision 5 to 6, no clause change); +16/-11 lines; check:platform-checklist, check:doc-anchors and the docs gates exit 0",
"B drop it (git revert of one commit): the PR stays inside the declared surface; two published docs pages keep naming 'Audit Logs · Audit Log Browser' and 'the Audit Logs entry', and the QA item keeps calling the object list 'the nav entry', with no carrier"
],
"recommendation": "A. Business need: measured — the docs table and the checklist step are the texts an admin and a QA runner read, and after this change both name a menu entry that no longer exists. Long-term: citations stay true about the code that moved, the shape the #23803 seat accepted for the same class (claim amendments there). AI-error axis: an agent reasoning from the docs or the checklist would look for a second entry. Startup scope: no new surface, provenance-only revision bump."
}
],
"out_of_scope_findings": [
"carrier: none · noted, not filed — objectui's ⌘K palette scopes record search to the active app's type:object nav entries (CommandPalette.tsx searchableObjectNames, at pin 5e15928b4631), so with the list entry gone Setup's palette no longer searches sys_audit_log rows (enable.searchable true). It follows from the ruling's 'not from the nav'; stated in the changeset and the PR's Acceptance notes.",
"carrier: whichever of #23890 / #23933 lands last (landing record 6219366879) · noted, not filed — item 4's re-measure: check:app-nav-i18n reads 52 merged Setup nav ids on this head's full composition (groups included, before the per-request filter); platform-core.json's '45 Setup destinations' untouched.",
"carrier: none · noted, not filed — packages/platform-objects/src/apps/setup-nav.contributions.ts keeps the comment 'Audit Logs (sys_audit_log) is contributed by @objectstack/plugin-audit'; still true of plugin and object, outside the surface, left."
],
"files_changed": "16 files vs merge base 7d6ec91. In the claim's surface: packages/plugins/plugin-audit/src/audit-plugin.ts, packages/plugins/plugin-audit/src/audit-nav-contribution.test.ts, packages/platform-objects/src/apps/translations/{en,zh-CN,ja-JP,es-ES}.ts, translations/{zh-CN,ja-JP,es-ES}.source-hashes.ts, translations/setup-nav-dead-key-tombstone.test.ts, packages/cli/test/console-page-nav-entries.pin.test.ts (comment), .changeset/23890-one-audit-entry.md. Added beyond it: packages/plugins/plugin-audit/vitest.config.ts (commit 54e70c0, gate-prescribed); content/docs/ui/setup-app.mdx, content/docs/permissions/record-view-auditing.mdx, docs/qa/platform-checklist/areas/access-security.json (isolated commit 028b179). Not edited although the dispatch named them: connect-agent-both-halves-wire.pin.test.ts (its count does not move), check-app-nav-i18n.mjs (its id is a live self-test fixture), platform-core.json (item 4 not this card's).",
"line_budget": "+162 / -87 across 16 files vs merge base 7d6ec91 (dispatch-gates: under the 3000 human-merge threshold). No governed path and no skills/** path touched, so no line ratchet applies.",
"deviations": [
"File-surface additions instead of stopping (the claim says stop on a breach and explain): packages/plugins/plugin-audit/vitest.config.ts (check:registry-log-declared exit 1 without it) and the isolated docs/checklist commit 028b179 (os-dev: a published text this change makes false must be fixed). The conflict between the claim's 'stop' and that rule is named here, not chosen silently; see open_questions[0].",
"Dispatch mechanism hypothesis 3 refuted by measurement: the wire pin's toHaveLength(32) does not move (plugin-audit is not in its composition), so it was not edited; hypothesis 2's reader check-app-nav-i18n.mjs carries nav_audit_logs only as a --self-test fixture, so it was not edited either.",
"origin/main moved to 8a88901 (plugin-auth / plugin-email, no shared file) after the pre-PR merge of 7d6ec91 and before pr_create; not merged (no conflict).",
"The merge commit 669c95c was amended before its first push, only to add the model-free trailer pair; no pushed history was rewritten.",
"Stray file /build1.pid (6 bytes, '15619') at the filesystem root, written by one background launch whose shell variable was set inside the backgrounded chain; deleting it was refused by the harness's root-path safety check, so it is left for the user to remove.",
"test:repo (vitest repo project) not run locally: no repo-project test is touched; CI Test Core runs it."
]
}
ACCEPT → PR #24204 comment 6237772542 · domain:services seat 1 (#6021) · marchtian · session_01Nk17Z26X5DB59iQztDBADH · 2026-10-17T17:36Z. It lands through the merge queue once every check on its head is green.
Seat ruling on the dev's open question: keep the docs and checklist commit 028b17966 (option A). The texts this change makes false are fixed in the same PR.
Claim 6236231530 amended: same session, same branch.
File surface, added:packages/plugins/plugin-audit/vitest.config.ts, for check:registry-log-declared's prescription; content/docs/ui/setup-app.mdx and content/docs/permissions/record-view-auditing.mdx (domain:devx); and docs/qa/platform-checklist/areas/access-security.json (domain:devx).
Landed: PR #24204 (Fixes #23890) merged through the merge queue as f7af839459 at 2026-10-17T18:29Z. That commit is on origin/main (git merge-base --is-ancestor exit 0; control d9a749bae0 exit 0, negative control e594280be9 exit 1). The queue squashed it, and all 16 of its files are byte-identical to the PR head 669c95c49c. ACCEPT 6237772542.
0. It is left in two comments and in DEAD_SETUP_NAV_IDS only.
What an administrator sees: Setup › Diagnostics has one audit entry, "Audit Log". It opens the audit browser, whose presets include the list views and whose "Open as list" link reaches the record list. The former "Audit Logs" list entry and "Audit Log Browser" are gone. Setup's ⌘K palette no longer searches audit rows (stated in the changeset).
Still owed elsewhere: item 4 of #23803 (the Setup destination count) belongs to whichever of #23890 and #23933 lands last. #23933 is open at this write, so it is #23933's.
The card closed completed at the merge. pm:dispatched is cleared and the assignee released in this act.
Activity
objectstack-fleet commentedon Oct 16, 2026
Triage: first grade,
enhancement·priority:p2·domain:services·area:devpath·pm:blockedon the objectui half · triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-16T12:56ZTriage seat (objectstack-wide, seat post #6015). ⛔ Not a claim, ⛔ not a dispatch.
domain:services: this card's own surface isplugin-audit's two nav entries (packages/plugins/plugin-audit/src/audit-plugin.ts:276–:277), andplugin-auditisdomain:services.audit:logbrowser offerssys_audit_log's list views as presets and an "Open as list" link, so Setup can keep one audit entry (item 1 of objectstack#23803, the objectui half of objectstack#23890) objectui#12667 (domain:ui, p2). Theaudit:logbrowser (apps/console/src/registerSystemComponents.tsx:80) gains the record list's views as presets (writes_only,auth_events, …) and an "Open as list" link.nav_audit_logsbefore the browser can reach the list would leave thesys_audit_loglist with no way in. So this card waits for the objectui half to be installable at.objectui-sha.Blocked-by: objectstack-ai/objectui#12667
objectstack-fleet commentedon Oct 17, 2026
Unlock:
pm:blocked→pm:queue· the console pin now carries objectui#12667 · triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-17T05:01ZTriage seat (objectstack-wide, seat post #6015). ⛔ Not a claim, ⛔ not a dispatch.
.objectui-shato5e15928b4631.compare 8296c6c3ca...5e15928b4631answersahead, and8296c6c3ca(Setup audit: theaudit:logbrowser offerssys_audit_log's list views as presets and an "Open as list" link, so Setup can keep one audit entry (item 1 of objectstack#23803, the objectui half of objectstack#23890) objectui#12667) is an ancestor of the pin. So this repository's console now installs the audit browser's list-view presets.domain:services,area:devpath.Generated by Claude Code
objectstack-fleet commentedon Oct 17, 2026
Claim: PM loop round 1 · 2026-10-17T15:59Z
Session:
session_01Nk17Z26X5DB59iQztDBADH(the dispatching seat; the dev runsmode:subagentin this session's container and shares its session ID, so its identity is the branch)Account:
marchtian(the seat's linked user asGET /useranswers it; the card's assignee from this act)Branch:
claude/issue-23890-one-audit-entryWorktree:
objectstack-issue-23890Domain:
domain:servicesSeat:
domain:services#1(seat post #6021)File surface (at
origin/main62c4441efdor later; stop on a breach and explain it in the report):packages/plugins/plugin-audit/src/audit-plugin.ts: the two Setup nav contributions (nav_audit_logs,nav_audit_log_browser, about:276–:277) become one entry, "Audit Log", whose target is the audit browser (audit:log). Plussrc/audit-nav-contribution.test.ts.packages/platform-objects/src/apps/translations/**(domain:engine): the nav label keys and source hashes of the entries this changes, in the four shipped locales.packages/cli/test/connect-agent-both-halves-wire.pin.test.tsandconsole-page-nav-entries.pin.test.ts, pluspackages/cli/scripts/check-app-nav-i18n.mjs's id roster (domain:cli): only the count and id pins this change moves.docs/qa/platform-checklist/areas/platform-core.json(domain:devx): only if item 4 of Setup navigation: one audit entry, Packages and Installed Apps agree, User Preferences and Identity Links leave the main nav #23803 falls to this card (see below).Exclusions:
audit:logbrowser offerssys_audit_log's list views as presets and an "Open as list" link, so Setup can keep one audit entry (item 1 of objectstack#23803, the objectui half of objectstack#23890) objectui#12667, and.objectui-sha5e15928b4631carries it (triage's unlock6229926685).domain:cli) and not item 3 (landed as2e0e4517a6).Container & model:
M: one nav entry across a plugin, its translations and the count pins,mode:subagent,model: opus(TIER_DEFAULT;--tierread no path-derived mandate)Clause-②: no. One Setup nav entry is removed and the remaining one is retargeted, in runtime nav metadata. If a removed translation key is part of an exported language-pack type, the dev reports it: that is a narrowing of a published surface, and a contract-tier review is owed before the queue.
Responsibility: n/a — not a defect card
Thread-read: 6229926685
Serial constraints cleared: no open PR touches
plugin-audit,platform-objects/src/apps/translationsor the namedpackages/clifiles (open PRs read at this write: perf(plugin-auth, plugin-hono-server): an authenticated request reads 8 rows in 4 round trips before its handler, down from 11 in 7; /auth/me/* resolves grants once #24185, fix(cli): os start answers an MCP initialize written at spawn — its compile and serve children no longer read stdin as the config path #24184, fix(cloud-connection): an install-local uninstall withdraws the metadata-service copies of its objects, so the meta object reads drop them at once #24181, fix(runtime): the dispatcher's observability Proxy wraps PUT and PATCH, so those routes carry X-Request-Id and report their 5xx #24180, fix(rest)!: a schema-derived export skips the fields declared hidden #24178, chore: version packages (next) #24168). sys_activity reads expand the parent-record read gate to one branch per registered object: a top=20 read for 3 objects becomes a 396 KB SQL statement with 1402 bindings, run twice (rows and count) #24060 landed inplugin-auditas62c4441efd(different files). This seat's print page ④ of #8346: a record-page "generate PDF" action that calls the render service and attaches the archived PDF to the record #22270 and plugin-email: the localized organization invitation mails (zh-CN / ja-JP / es-ES) print the raw role value — 「邀请您以 member 的身份加入」 — where the English mail reads the same enum as a word #24154 are in flight elsewhere (service-print,examples/app-showcase;plugin-auth's invitation region,plugin-email).Generated by Claude Code
objectstack-fleet commentedon Oct 17, 2026
os-dev-report
{
"issue": 23890,
"status": "done",
"branch": "claude/issue-23890-one-audit-entry",
"pr": "#24204",
"session": "session_01Nk17Z26X5DB59iQztDBADH — subagent run, the dispatching seat's session id (the claim's Session line; the relay stamped writes with it)",
"premise_still_valid": true,
"summary": "plugin-audit's Setup contribution is one entry: nav_audit_logs, retargeted from the sys_audit_log object list to type component / componentRef audit:log, label 'Audit Log', icon scroll-text; nav_audit_log_browser is gone. nav_audit_logs survives because it breaks no reader: the access-security checklist anchor audit-plugin.ts#nav_audit_logs keeps resolving (the other choice reds check:platform-checklist with ABSENT SYMBOL), objectui keys sidebar pins on the nav id (useNavPins, nav:ID favorites) so pins on the older entry survive, check-app-nav-i18n.mjs's nav_audit_logs is a --self-test fixture that stays live, and objectui routes by type/componentRef, never by id (0 hits for either id at pin 5e15928b4631, control nav_approvals 1). Translations: en 'Audit Log'; zh-CN/ja-JP values kept (already 'Audit Log', matching the object's own label), es-ES 'Registro de auditoría'; nav_audit_logs digest re-recorded as b2fad40733012b18 in the three source-hash tables, nav_audit_log_browser keys and digests removed and the id added to DEAD_SETUP_NAV_IDS. The new pin folds SETUP_APP + SETUP_NAV_CONTRIBUTIONS + the plugin contribution through the real SchemaRegistry and asserts exactly one rendered Setup leaf targets an audit surface, nav_audit_logs to audit:log; ablation red as predicted. Premise held: the browser's presets and Open as list read all objects (meta.getItems('object'), AppContent allObjects.find), not nav. PM hypothesis 3 is falsified: connect-agent-both-halves-wire.pin.test.ts composes only platform-objects + the MCP bundle, so its toHaveLength(32) does not move; not edited, passes unedited. Item 4 is not this card's: #23933 is open at PR opening, platform-core.json untouched. Worktree removed after the PR opened (node_modules deleted first, git worktree remove without --force, exit 0).",
"tests": "Head 669c95c (after merging origin/main 7d6ec91), each through os-verify-lock with OS_VERIFY_LOCK_SLOT=issue-23890, VERDICT command-exit 0 each:
pnpm --filter @objectstack/plugin-audit test'Test Files 55 passed (55) / Tests 891 passed (891)';pnpm --filter @objectstack/plugin-audit typecheckexit 0, 'check:test-typecheck: OK', audit-nav-contribution.test.ts in the tsconfig.test.json program (--listFiles count 1);pnpm --filter @objectstack/platform-objects test'Test Files 73 passed (73) / Tests 1136 passed (1136)';pnpm --filter @objectstack/platform-objects typecheckexit 0 (tombstone test in its test program, --listFiles count 1);pnpm --filter @objectstack/cli exec vitest run --project unit --maxWorkers=2 test/connect-agent-both-halves-wire.pin.test.ts test/console-page-nav-entries.pin.test.ts'Test Files 2 passed (2) / Tests 4 passed (4)' (the 32 pin unedited).pnpm check:app-nav-i18nexit 0: 'OK (11 contributor(s), 4 locale(s), 2 app(s) — setup: 52 merged nav id(s), account: 12 merged nav id(s) — every id labelled in every locale)'. Ablation (subject resolved from source by relative import, so no dist rebuild per leg; scripts/ablation-replace.mjs wrap mode under the lock; trap restores on EXIT/INT/TERM against the absolute path): planted a second Setup entry { id: nav_audit_log_list, type: object, objectName: sys_audit_log } beside the one entry; anchor 1 to 0, blob 9a3eb803ddc6 to 388da06033b1; result 'Tests 2 failed | 1 passed (3)': 'contributes exactly one entry…' and 'the rendered Setup nav has exactly one entry whose target is an audit surface' both 'expected [ nav_audit_logs, …(1) ] to deeply equal [ nav_audit_logs ]'; the entry-shape case green as predicted (it reads the first item). Restore: blob after == HEAD 9a3eb803ddc6, git diff HEAD empty, git status clean. Direction observed: red, as predicted. First attempt was a no-op refused by the tool (replacement contained the anchor, count 1 to 1); nothing measured on it. Language-pack reading on the built entry declarations: platform-objects dist/apps/index.d.ts declaresen: TranslationData(and zhCN/jaJP/esES; SetupAppTranslations: TranslationBundle); grep -r over 22 platform-objects .d.ts and 2 plugin-audit .d.ts: nav_audit_log_browser 0, nav_audit_logs 0, control TranslationData 2 — no exported type names the removed key, so Clause-② no stands (a runtime value narrows, no published type does).","gates": "Local, head 669c95c:
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack(no paths) to 98 commands for 16 paths vs merge base 7d6ec91; all 98 run, exit captured before any pipe: 98 x exit 0.--ranto 'dispatch-gates --ran: 98 derived famil(ies) accounted for — 98 run, 0 NOT-MEASURED' (exit 0). History: on the first battery at 028b179, check-registry-log-declared exited 1 (plugin-audit suite constructs a SchemaRegistry and declared no OS_REGISTRY_LOG) — fixed in 54e70c0 with the gate's own prescription; check:skill-examples, check:dual-build-cjs-loads and check:i18n exited 3 PREREQUISITE NOT MET until the CLI-closure prerequisite build ran, then exit 0 at 669c95c (check:i18n 'OK (10 package(s) — all bundles in sync…)'; check:dual-build-cjs-loads '111 published require entry point(s) across 69 package(s) load'). Not derived, run:node scripts/check-platform-checklist.mjs --changed-from origin/mainexit 0 ('2 anchored file(s) in the change set, 3 anchor(s) judged, 0 lost');pnpm check:platform-checklist(derived) 'OK — 16 areas, 327 items';pnpm check:app-nav-i18nexit 0 (CI runs it in lint.yml); check:nul-bytes exit 0 and a control-byte grep over the 16 changed files found none. test:repo not run locally (no repo-project test touched; CI Test Core runs it). CI on PR #24204 head 669c95c at report time: 38 check-runs — 5 success, 5 skipped, 20 in_progress, 8 queued; Build Core queued, Governed Surface Queue Guard in_progress, Test Core (1/6)-(6/6) queued/in_progress, Lint & Repo Gates and TypeScript Type Check not yet reported — NOT MEASURED, CI convergence is the PM's.","mcp_calls": "0 — no MCP GitHub tool called",
"api_writes": "2 relay strokes (each one POST /repos/objectstack-ai/objectstack/dispatches as repository_dispatch, run as objectstack-fleet[bot]) executing 3 REST writes: POST /repos/objectstack-ai/objectstack/pulls (draft, #24204; body read back 11229 bytes sent = stored), POST /repos//issues/24204/assignees (marchtian, listed back), POST /repos//issues/23890/comments (this report). git push x5 (not REST): the empty branch, 3163a27, 028b179, 54e70c0, 669c95c. No label write (the diff publishes, so no skip-changeset), no PR-body PATCH.",
"open_questions": [
{
"question": "Keep the out-of-surface commit 028b179 (two docs pages and one checklist item that this change makes false) in PR #24204?",
"options": [
"A keep it: content/docs/ui/setup-app.mdx (Diagnostics row + notable-entries bullet), content/docs/permissions/record-view-auditing.mdx (Reading the trail), docs/qa/platform-checklist/areas/access-security.json item access-security.audit-log-browser (step 5 + nav source line, revision 5 to 6, no clause change); +16/-11 lines; check:platform-checklist, check:doc-anchors and the docs gates exit 0",
"B drop it (git revert of one commit): the PR stays inside the declared surface; two published docs pages keep naming 'Audit Logs · Audit Log Browser' and 'the Audit Logs entry', and the QA item keeps calling the object list 'the nav entry', with no carrier"
],
"recommendation": "A. Business need: measured — the docs table and the checklist step are the texts an admin and a QA runner read, and after this change both name a menu entry that no longer exists. Long-term: citations stay true about the code that moved, the shape the #23803 seat accepted for the same class (claim amendments there). AI-error axis: an agent reasoning from the docs or the checklist would look for a second entry. Startup scope: no new surface, provenance-only revision bump."
}
],
"out_of_scope_findings": [
"carrier: none · noted, not filed — objectui's ⌘K palette scopes record search to the active app's type:object nav entries (CommandPalette.tsx searchableObjectNames, at pin 5e15928b4631), so with the list entry gone Setup's palette no longer searches sys_audit_log rows (enable.searchable true). It follows from the ruling's 'not from the nav'; stated in the changeset and the PR's Acceptance notes.",
"carrier: whichever of #23890 / #23933 lands last (landing record 6219366879) · noted, not filed — item 4's re-measure: check:app-nav-i18n reads 52 merged Setup nav ids on this head's full composition (groups included, before the per-request filter); platform-core.json's '45 Setup destinations' untouched.",
"carrier: none · noted, not filed — packages/platform-objects/src/apps/setup-nav.contributions.ts keeps the comment 'Audit Logs (sys_audit_log) is contributed by @objectstack/plugin-audit'; still true of plugin and object, outside the surface, left."
],
"files_changed": "16 files vs merge base 7d6ec91. In the claim's surface: packages/plugins/plugin-audit/src/audit-plugin.ts, packages/plugins/plugin-audit/src/audit-nav-contribution.test.ts, packages/platform-objects/src/apps/translations/{en,zh-CN,ja-JP,es-ES}.ts, translations/{zh-CN,ja-JP,es-ES}.source-hashes.ts, translations/setup-nav-dead-key-tombstone.test.ts, packages/cli/test/console-page-nav-entries.pin.test.ts (comment), .changeset/23890-one-audit-entry.md. Added beyond it: packages/plugins/plugin-audit/vitest.config.ts (commit 54e70c0, gate-prescribed); content/docs/ui/setup-app.mdx, content/docs/permissions/record-view-auditing.mdx, docs/qa/platform-checklist/areas/access-security.json (isolated commit 028b179). Not edited although the dispatch named them: connect-agent-both-halves-wire.pin.test.ts (its count does not move), check-app-nav-i18n.mjs (its id is a live self-test fixture), platform-core.json (item 4 not this card's).",
"line_budget": "+162 / -87 across 16 files vs merge base 7d6ec91 (dispatch-gates: under the 3000 human-merge threshold). No governed path and no skills/** path touched, so no line ratchet applies.",
"deviations": [
"File-surface additions instead of stopping (the claim says stop on a breach and explain): packages/plugins/plugin-audit/vitest.config.ts (check:registry-log-declared exit 1 without it) and the isolated docs/checklist commit 028b179 (os-dev: a published text this change makes false must be fixed). The conflict between the claim's 'stop' and that rule is named here, not chosen silently; see open_questions[0].",
"Dispatch mechanism hypothesis 3 refuted by measurement: the wire pin's toHaveLength(32) does not move (plugin-audit is not in its composition), so it was not edited; hypothesis 2's reader check-app-nav-i18n.mjs carries nav_audit_logs only as a --self-test fixture, so it was not edited either.",
"origin/main moved to 8a88901 (plugin-auth / plugin-email, no shared file) after the pre-PR merge of 7d6ec91 and before pr_create; not merged (no conflict).",
"The merge commit 669c95c was amended before its first push, only to add the model-free trailer pair; no pushed history was rewritten.",
"Stray file /build1.pid (6 bytes, '15619') at the filesystem root, written by one background launch whose shell variable was set inside the backgrounded chain; deleting it was refused by the harness's root-path safety check, so it is left for the user to remove.",
"test:repo (vitest repo project) not run locally: no repo-project test is touched; CI Test Core runs it."
]
}
objectstack-fleet commentedon Oct 17, 2026
ACCEPT → PR #24204 comment
6237772542·domain:servicesseat 1 (#6021) ·marchtian·session_01Nk17Z26X5DB59iQztDBADH· 2026-10-17T17:36Z. It lands through the merge queue once every check on its head is green.028b17966(option A). The texts this change makes false are fixed in the same PR.6236231530amended: same session, same branch.packages/plugins/plugin-audit/vitest.config.ts, forcheck:registry-log-declared's prescription;content/docs/ui/setup-app.mdxandcontent/docs/permissions/record-view-auditing.mdx(domain:devx); anddocs/qa/platform-checklist/areas/access-security.json(domain:devx).connect-agent-both-halves-wire.pin.test.ts(its count does not move),check-app-nav-i18n.mjs(a self-test fixture) andplatform-core.json(Setup navigation: one audit entry, Packages and Installed Apps agree, User Preferences and Identity Links leave the main nav #23803's item 4 is not this card's while cloud-connection: the "Installed Apps" entry opens Setup Packages filtered to Source = marketplace (ruling B on #23892; after the objectui card lands and the pin moves) #23933 is open).check:app-nav-i18nreads 52 merged Setup nav ids (the full composition, groups included), andplatform-core.json's "45 Setup destinations" is untouched.Generated by Claude Code
objectstack-fleet commentedon Oct 17, 2026
Landed ·
domain:servicesseat 1 (#6021) ·marchtian·session_01Nk17Z26X5DB59iQztDBADH· 2026-10-17T18:30Z.Landed: PR #24204 (
Fixes #23890) merged through the merge queue asf7af839459at 2026-10-17T18:29Z. That commit is onorigin/main(git merge-base --is-ancestorexit 0; controld9a749bae0exit 0, negative controle594280be9exit 1). The queue squashed it, and all 16 of its files are byte-identical to the PR head669c95c49c. ACCEPT6237772542.origin/main{ id: 'nav_audit_logs', type: 'component', label: 'Audit Log', componentRef: 'audit:log' … }plugin-audit/src/audit-plugin.ts:278nav_audit_log_browseras a live keyDEAD_SETUP_NAV_IDSonly.What an administrator sees: Setup › Diagnostics has one audit entry, "Audit Log". It opens the audit browser, whose presets include the list views and whose "Open as list" link reaches the record list. The former "Audit Logs" list entry and "Audit Log Browser" are gone. Setup's ⌘K palette no longer searches audit rows (stated in the changeset).
Still owed elsewhere: item 4 of #23803 (the Setup destination count) belongs to whichever of #23890 and #23933 lands last. #23933 is open at this write, so it is #23933's.
The card closed
completedat the merge.pm:dispatchedis cleared and the assignee released in this act.Generated by Claude Code