Repository navigation
Open
Labels
domain:devxDomain lane — seat card indexed by label:pm:seatDomain lane — seat card indexed by label:pm:seatneeds-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PRBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PRpriority:p2Medium: important, M3Medium: important, M3toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surfaceFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface
Description
triage#1 · hotlong · session_01Q4EjjMnyLqJdzuktEmRPXH
Source: v18.4.0 sweep close-out, #32908 comment 6881136418 (devx#4 ledger, read at 87330e89), routed by triage.
Checklist rows that can't score because the stock fixtures lack a seed, grant or recipe. Each needs a fixture change, not new item text. Row numbers refer to the source ledger.
A. Seed and fixture additions (16)
- 80: stock personas need a
sys_attachmentpermission grant before attachment hooks are reachable. - 89:
platform-core.settings-hub-roundtriphas no stock user-scope secret. - 90: the activation-ledger ambiguous-row leg needs a second holding package.
- 91: the
identity-auth.self-signup-gateemail_domain and open variants need a declared audience. - 92: showcase
task_own_rowscomparesassignee == current_user.email, butassigneestores a user id, so the rule never matches. Compare ids, as the platform's user lookups do. This is a showcase fixture bug, not a question for the maintainer. - 135:
approvals.quorum-m-of-nknownGaps[1]: Ada holds onlyshowcase_auditor. - 151: a mandatory notification topic that is reachable without a constructor option.
- 152: an agent catalog for the AI-chat half of keyboard-shortcut.
- 153: an inactive-app or single-active-app seed for command-palette N3.
- 155: a loop in the stock flow fixture, for the back-edge step of flow-edge-type-authoring.
- 208: a member-less user on a walled boot (no-active-org A0, producer 1).
- 209:
cli-18-prerelease-dbrestore doesn't re-date rotation shards, sosys_activity__r20261027falls outside the 7-day window. fixture-as-of exists in the harness only. - 218: a stock boot, or a hosted-runtime recipe, that stamps environment rows with the host package (metadata: unregisterPackage of the host package deletes the environment's own object, view, app, hook and dashboard rows the boot pass stamped with the host (follow-up of #32198) #32986 and metadata: a rewrite that keeps the host's stamp turns an environment row into the host's own, and unregistering the host deletes it again (gates the release shipping #32198) #33003-class items).
- 220:
records-forms.multi-currency-invoice: only INV-1004 and INV-1008 carry a non-zero foreign amount. - 227: a connector instance and an assignment rule in the 18.3.0 upgrade fixture (R11, R13).
- 263:
records-forms.gantt-interactionspassed only on fixtures extended by metadata overlays, which were reverted. Make the extension permanent, or narrow the item.
B. Bound by the environment (6): record as known gaps, don't build
- 79: the browser-slice pins (metadata-registry-serving A6 form screenshot, customization-pair-ensure-door ui/e2e) need a Console build.
- 150: a datasource driver that carries a schema, for
datasource-introspect --schema. - 154: real OAuth client credentials for linked-accounts-social.
- 210: the egress proxy blocks marketplace catalog content.
- 238: SCIM adopts an SSO account only on a verified domain (DNS TXT,
OS_SSO_DOMAIN_VERIFICATION). - 239: magic-link and passkeys UI (objectui#4179, not_planned).
Write B into the items' knownGaps, or into RUNNER.md next to #33334's environment facts, so the next sweep doesn't count them as failures.
Grade
p2 (fixture work). Row 92 gives wrong row visibility in the showcase. It stays at p2 because only the example app is affected.
Reader
domain:devx.
Metadata
Metadata
Assignees
Labels
domain:devxDomain lane — seat card indexed by label:pm:seatDomain lane — seat card indexed by label:pm:seatneeds-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PRBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PRpriority:p2Medium: important, M3Medium: important, M3toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surfaceFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface
Activity
objectstack-fleet commentedon Nov 14, 2026
domain:devx#4 · os-project-manager · session_01FEkQ5ooRyyS95kdyC2dPEX
Claim: PM loop round 4 · 2026-11-14T17:30Z
Session:
session_01FEkQ5kWURVLmS49GR3jwxs(card thread, dev) · seatsession_01FEkQ5ooRyyS95kdyC2dPEXAccount:
os-project-managerBranch:
claude/project-thread-hxh3ksWorktree:
objectstack-issue-33351Domain:
domain:devxSeat:
domain:devx#4File surface: section A only:
examples/app-showcase/**seed, permission and fixture files;scripts/qa/**fixture helpers if a row needs one (⛔ notqa-fixture.mjswalled-boot/contributor-member, held by #33334); area recipe text only where no sibling batch PR holds the file. ⛔ No product package code, no new product door, no RUNNER.md (section B is a later slice).Container & model: M,
mode:thread,model: default tier,effort: defaultClause-②: no
Metadata-protocol: none
Responsibility: the stock showcase fixtures (objectstack
examples/app-showcase) lack seeds and grants 16 checklist rows need; row 92'stask_own_rowscompares an id column with an email | none | every QA sweep that scores those rows; row 92 also shows wrong rows to showcase usersThread-read: none
Premise: holds: triage#1's routing of the #32908 ledger rows (card body); the dev re-measures each row on current
mainfirstSerial constraints cleared: #33334 holds RUNNER.md and two
qa-fixture.mjssubcommands; batches #33328–#33332 holdareas/*.jsonitem text (open PR #33359 = batch E) — area recipe edits only on files no open batch PR touchesScope: section A, one PR,
Part of #33351(section B follows after #33334 and the batches land), budget stop at ~600 lines or ~25 files. Order:/mnt/project-files/pm-orders/devx/order-33351.md. Summons: the maintainer's 「在开一个 devx」「都处理 p1 p2 卡」 (this project, 2026-11-14T15:37Z).objectstack-fleet commentedon Nov 14, 2026
domain:devx#4 · os-project-manager · session_01FEkQ5kWURVLmS49GR3jwxs
os-dev-report
{
"issue": 33351,
"status": "done",
"branch": "claude/project-thread-hxh3ks",
"pr": "#33376",
"session": "session_01FEkQ5kWURVLmS49GR3jwxs",
"premise_still_valid": true,
"summary": "Section A, all 16 rows re-measured on main d3f3f4a; PR #33376 (draft, Part of #33351, head 2b2bca1) lands the two that are fixture additions today: row 220, one seed line each under INV-1007 (JPY), INV-1009 and INV-1010 (EUR), so all five foreign invoices carry a non-zero total (stock-boot probe: 95400/2016/276, both rate rows of each currency used); row 209, the cli-18-prerelease-db restore re-dates its rotation shards through fixture-as-of.ts (sys_activity__r20261027 -> r20261113 on 2026-11-14, 66 rows; base still writes r20261027). Row 153 was tried and withdrawn: an app package defines at most one app (build refusal, ADR-0019). Rows 80 (member sys_attachment grant on main since fd63747) and 91 (env door already runnable; text owed to batch A #33362) are already done. Rows 155, 227 and the 91/220 item text are owed in held area files (#33360, #33330, #33362); 208 is held by #33334; 89, 151, 218 are product; 152 is environment-bound. Four questions need a decision: 92 (premise does not hold: assignee stores an email by the showcase's convention, rule left unchanged), 135, 90+153, 263. Section B untouched.",
"tests": "head 2b2bca1: pnpm --filter @objectstack/example-showcase test -> Test Files 48 passed (48), Tests 545 passed (545); showcase typecheck + dogfood typecheck exit 0 (os-verify-lock VERDICT command-exit 0). Dogfood, 9 files that boot the showcase and read invoice lines (seed-isolation, invoice-cbp, line-contributor-pair, readonly-when-parent, crud-persona-matrix, master-detail-batch-atomic, home-amount-projection, upgrade-harness-fixture-as-of, external-member-directory): 153 passed, 15 skipped, VERDICT command-exit 0. Stock-boot probe (throwaway file, deleted) read INV-1004 450/500, INV-1007 95400/629.7, INV-1008 237864/1593.73, INV-1009 2016/2191.3, INV-1010 276/300. Restore control leg at base wrote sys_activity__r20261027; head writes r20261113 (66 rows). No ablation: seed rows and a fixture script, no new pinned behaviour.",
"gates": "head 2b2bca1: dispatch-gates --commands derived 54; ran 54; --ran exit 0: 53 run, 1 NOT MEASURED (pnpm check:dual-build-cjs-loads exit 3 PREREQUISITE NOT MET, needs a full workspace build; diff touches no published dist; CI Build Core runs it). check-plugin-teardown-shape --self-test exit 3 on the shallow clone, exit 0 (48 cases) after git fetch --depth=1 of 621a487. eslint --no-inline-config on both touched files exit 0. CI check-runs on #33376: in_progress at report time, the seat reads them. Record: /mnt/project-files/pm-orders/devx/33351-gates-ran.txt.",
"dogfood_battery": "n/a — no
!in the PR title and no (narrowing) arm","line_budget": "2 files, +33 / -3 vs merge base (under the ~600 lines / ~25 files budget)",
"files_changed": [
"examples/app-showcase/src/data/seed/index.ts",
"packages/qa/dogfood/test/upgrade-harness/cli-prerelease-fixture.ts"
],
"changeset": "none: @objectstack/example-showcase and @objectstack/dogfood are both private; skip-changeset sent with pr_create and read back",
"mcp_calls": "3 — reads only: issue_read (#33351), list_pull_requests (open PRs, area-file holders), pull_request_read (#33359 labels/shape); no MCP write",
"api_writes": "2 relay writes — pr_create #33376 (run 43624582312, body read back identical 12465 bytes, labels skip-changeset, assignees none) and this os-dev-report comment via post-stamped.mjs; plus git push (not REST). Public REST reads: the 8 source record comments and claim comment 6881478656",
"deviations": [
"Row 92 left unchanged against the order's ruling: its premise (assignee stores a user id) is false on main; put back as a question, not reversed silently.",
"Two commits on the branch: d2faa4b added the inactive app, the next withdrew it after the build refusal; net diff carries no app change.",
"pr_create carried no assignees (order, AGENTS.md claim paragraph); os-dev.md rule 63 still says 'assignees' — order wins per the seat's standing line.",
"The PR body footer is os-dev.md's session-URL form; the harness reminder's two-line PR footer was not added (repo rule takes precedence)."
],
"open_questions": [
{
"row": 92,
"status": "needs_decision",
"question": "The order ruled 'fix task_own_rows to compare ids' on the premise that showcase_task.assignee stores a user id. On main d3f3f4a it stores an EMAIL by the showcase's own convention (seed/index.ts persona emails, notify flows read it as a recipient, invoice.owner and private_note.owner use the same email rule, search.json and records-forms.json tell runners to assign by email); the QA run had PATCHed a user id by hand. Keep the email rule, or move the showcase to ids?",
"options": [
"A Keep
assignee == current_user.email(no change). The sweep's 'contributor reads zero tasks' was the run assigning an id; the item text that already says 'assign by email' stands. Cost: none.","B Move the showcase to ids: assignee becomes a sys_user lookup, the seed resolves persona ids at boot (they are minted then, so the static seed cannot carry them), the notify flows, invoice/private_note owner rules and two area files' text follow. Cost: a showcase-wide data-model change across about ten files plus held area files."
],
"four_axes": {
"business_need": "A matches every measured writer and reader in the stock app: the seed, the notify recipients and the runner recipes all use emails. B serves no measured consumer; the only id writer was one hand-run probe.",
"long_term": "B (a lookup to sys_user) is the more modelled shape for a person field, but it is a showcase-wide redesign, not a fixture fix; A leaves a consistent, documented convention.",
"ai_proofing": "A is consistent: one convention across the app. Changing only task_own_rows to ids (the ruling's literal fix) would make the rule and the stored value disagree, hiding every seeded task from its assignee, which is the exact silent-wrong class the axes warn about.",
"startup_focus": "A adds nothing. B expands an example app with no pull."
},
"recommendation": "A, because every reader and writer on main uses the email and the literal fix would itself create the mismatch the row describes."
},
{
"row": 135,
"status": "needs_decision",
"question": "Seed Ada into a committee position so approvals.quorum-m-of-n gets a real 2-of-2 on a stock boot? Ada holding showcase_finance or showcase_legal also makes her a required approver of the seeded unanimous invoice dual sign-off (showcase_invoice_signoff, finance + legal), and EXP-DEMO (opened at seed time) stops being the 1-of-1 clamp contrast the item cites.",
"options": [
"A Add the seed line (Ada → showcase_finance) and accept the knock-on: the invoice dual sign-off demo needs Ada's approval too, EXP-DEMO opens as a real 2-of-2, and approvals.json item text (held by PR #33327 / batch C) is re-pointed after. Cost: one seed line plus approvals text and any dogfood pins on the invoice demo.",
"B Keep the runtime fixture the item already documents (run #21845: bind Ada over the admin API before the quorum steps) and close knownGaps[1] as by design. Cost: item text only.",
"C Add a THIRD seeded persona bound to showcase_legal only for the quorum. Cost: a new persona (credential provisioning in seed-approval-demo.ts), and it still joins the invoice dual sign-off slate."
],
"four_axes": {
"business_need": "The quorum is real and seeded; what is missing is a second distinct holder. The runtime fixture already makes the item scorable (B); a seed line saves one admin call per run.",
"long_term": "A or C change two seeded demos at once because finance and legal both route the invoice sign-off; B keeps each demo self-contained.",
"ai_proofing": "Neutral: all three keep the runtime's slate rules strict; none adds tolerance.",
"startup_focus": "B adds no seeded identity and no demo churn."
},
"recommendation": "B, because the item is already runnable through its documented runtime fixture and either seed option silently changes the invoice dual sign-off demo as well."
},
{
"rows": [
90,
153
],
"status": "needs_decision",
"question": "Both rows need a SECOND package on the stock boot: row 90 a package holding an item name the showcase also holds (activation-ledger ambiguous-row leg), row 153 a switched-off app (command-palette N3). Measured: a second app in the showcase package is refused at build ('An app package must define at most one app', ADR-0019). Add a module package to the example, or leave both legs to runner-built fixtures?",
"options": [
"A Add a small module package beside the showcase (e.g. examples/app-showcase-archive), composed with composeStacks(..., { manifest: 'preserve' }), carrying one inactive app and one same-named flow. Cost: a new example package, its build/compose wiring, and every stock-boot census that counts packages/apps (dogfood pins) re-read.",
"B Keep both legs runner-built and say so in the items: platform-core (batch D) keeps route (a)/(b) planting; search.command-palette-navigation knownGaps names the inactive-app leg as needing a scratch module package. Cost: item text only."
],
"four_axes": {
"business_need": "Two checklist legs want it; no product consumer does. Measured pull is QA-only.",
"long_term": "A gives a reusable multi-package stock boot, which several future items may want; it also changes what every stock-boot census sees.",
"ai_proofing": "Neutral to slightly A: a committed fixture is harder to stage wrong than a recipe; but a recipe already proved route (b) works.",
"startup_focus": "B: no new example package without product pull."
},
"recommendation": "B for now, because both legs are runnable from recipes and a new stock package changes every census the dogfood suite pins; revisit A if a third item needs a multi-package stock boot."
},
{
"row": 263,
"status": "needs_decision",
"question": "records-forms.gantt-interactions passed only on reverted view overlays. Make the showcase task gantt declare lockField (and a dependenciesField with a dependency field and seed), or narrow the item to the overlay route it already documents?",
"options": [
"A Make it permanent: add
lockField: 'done'to listViews.gantt in task.view.ts, plus adepends_onfield on showcase_task,dependenciesField, and seeded dependencies for the auto-schedule half. Cost: example metadata + seed + any view snapshot pins; lockField alone is one line.","B Narrow: the item scores the locked-leaf drag on its documented overlay (PUT /meta/view/showcase_task.gantt, run-proven #27438) and marks the auto-schedule half blocked(fixture) by design. Cost: records-forms.json text (batch B #33360's file).",
"C Split: A's one-line lockField now (declared key, observed live), B's narrowing for the dependency half."
],
"four_axes": {
"business_need": "Locked tasks and dependencies are real scheduling needs and the GanttConfig declares the keys; the showcase's own rule is 'feed every view'.",
"long_term": "A or C put declared, enforced keys in the stock example, so the surface is exercised on every boot instead of on a temporary overlay.",
"ai_proofing": "A/C: an example that uses lockField shows authors the key works; B leaves the only demonstration in a QA overlay.",
"startup_focus": "C is the smallest step that removes the overlay for the locked half; the dependency field is new example data model with no product pull."
},
"recommendation": "C, because lockField is one declared key the runtime already honours, while a dependency field is new example data model the startup axis says to hold back."
}
],
"security_findings": "none",
"out_of_scope_findings": [
"row 89 · class: none (product capability, not a defect) · no built-in settings manifest declares scope 'user' and app packages cannot author settings namespaces · carrier: none, noted in the PR",
"row 151 · class: none · MessagingServicePlugin mandatoryTopics reachable only as a constructor option · carrier: #33352 (test doors)",
"row 218 · class: none · host-package stamping of environment rows is hosted-runtime behaviour · carrier: #33352",
"row 152 · environment-bound (Cloud/EE service-ai agent catalog) · carrier: #33351 section B",
"rows 155, 227, 91 and 220 item text · owed in held area files · carrier: #33360 (studio-authoring, records-forms), #33330 (platform-core, cli), #33362 (identity-auth)",
"row 208 · held · carrier: #33334 (qa-fixture.mjs walled-boot)"
]
}
Generated by Claude Code
objectstack-fleet commentedon Nov 14, 2026
domain:devx#4 · os-project-manager · session_01FEkQ5ooRyyS95kdyC2dPEX
待维护者裁决 · 第一段四问 · 2026-11-14T18:09Z
第一段开发报告 6881946265 的
open_questions有四题,按 pm-dispatch「dev 的 needs_decision 一律呈人工,不代答」已呈维护者(经评估线程)。四题只关系 showcase 示例应用与清单文字,不涉及产品代码或公开契约。showcase_task.assignee存邮箱还是用户 id(派发令前提「存 id」实测不成立)lockField/ 依赖字段Governing text:
examples/app-showcase的种子与视图约定;ADR-0019(一个应用包最多一个应用);docs/qa/platform-checklist/README.md的条目规则。四维分析逐题见报告。第一段不需裁决的两行(220、209)在 PR #33376,照常落地;第二段与裁决结果一并派发。
两个状态标签同时成立:
pm:dispatched(第一段 PR #33376 仍在本席位认领下落地)与needs-user-decision(上述四行待裁决)。PR #33376 合并后席位移除pm:dispatched;裁决到手后移除needs-user-decision并派发第二段。objectstack-fleet commentedon Nov 14, 2026
domain:devx#4 · os-project-manager · session_01FEkQ5ooRyyS95kdyC2dPEX
ACCEPT → PR #33376 comment 6882159294 (2026-11-14T18:23Z); auto-merge armed. Section A rows 220 and 209 only; the card stays open for the ruled rows, the owed item text and section B.
objectstack-fleet commentedon Nov 14, 2026
domain:devx#4 · os-project-manager · session_01FEkQ5ooRyyS95kdyC2dPEX
Landed · #33351 section A (rows 220, 209) · PR #33376 · 2026-11-14T19:51Z
c6de6a8251(Part of, so this card stays open);pm:dispatchedremoved in this stroke, as the decision anchor 6881987608 said.needs-user-decision), the item text for rows 91, 155, 220 and 227 (all their area files are now free: qa(checklist): re-point 36 stale identity-auth / ai / search / ux items to the product (batch A of #32908) #33362, qa(checklist): re-point stale studio-authoring, records-forms and attachments-storage items to the product #33360 and qa(checklist): re-point 30 platform-core and cli items to what main does (batch D) #33365 landed), and section B. The seat dispatches them together once the ruling arrives.