Skip to content

qa fixtures: 22 seed and environment gaps that block checklist rows (v18.4.0 sweep) #33351

Open

Description

@objectstack-fleet

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_attachment permission grant before attachment hooks are reachable.
  • 89: platform-core.settings-hub-roundtrip has no stock user-scope secret.
  • 90: the activation-ledger ambiguous-row leg needs a second holding package.
  • 91: the identity-auth.self-signup-gate email_domain and open variants need a declared audience.
  • 92: showcase task_own_rows compares assignee == current_user.email, but assignee stores 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-n knownGaps[1]: Ada holds only showcase_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-db restore doesn't re-date rotation shards, so sys_activity__r20261027 falls 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-interactions passed 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.

Activity

  1. added
    toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface
    pm:queueReady for the PM dispatch loop
    domain:devxDomain lane — seat card indexed by label:pm:seat
    on Nov 14, 2026
  2. objectstack-fleet commented on Nov 14, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#4 · os-project-manager · session_01FEkQ5ooRyyS95kdyC2dPEX

    Claim: PM loop round 4 · 2026-11-14T17:30Z
    Session: session_01FEkQ5kWURVLmS49GR3jwxs (card thread, dev) · seat session_01FEkQ5ooRyyS95kdyC2dPEX
    Account: os-project-manager
    Branch: claude/project-thread-hxh3ks
    Worktree: objectstack-issue-33351
    Domain: domain:devx
    Seat: domain:devx#4
    File surface: section A only: examples/app-showcase/** seed, permission and fixture files; scripts/qa/** fixture helpers if a row needs one (⛔ not qa-fixture.mjs walled-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: default
    Clause-②: no
    Metadata-protocol: none
    Responsibility: the stock showcase fixtures (objectstack examples/app-showcase) lack seeds and grants 16 checklist rows need; row 92's task_own_rows compares an id column with an email | none | every QA sweep that scores those rows; row 92 also shows wrong rows to showcase users
    Thread-read: none
    Premise: holds: triage#1's routing of the #32908 ledger rows (card body); the dev re-measures each row on current main first
    Serial constraints cleared: #33334 holds RUNNER.md and two qa-fixture.mjs subcommands; batches #33328–#33332 hold areas/*.json item text (open PR #33359 = batch E) — area recipe edits only on files no open batch PR touches

    Scope: 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).

  3. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 14, 2026
  4. objectstack-fleet commented on Nov 14, 2026

    @objectstack-fleet
    ContributorAuthor

    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 a depends_on field 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

  5. objectstack-fleet commented on Nov 14, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#4 · os-project-manager · session_01FEkQ5ooRyyS95kdyC2dPEX

    待维护者裁决 · 第一段四问 · 2026-11-14T18:09Z

    第一段开发报告 6881946265 的 open_questions 有四题,按 pm-dispatch「dev 的 needs_decision 一律呈人工,不代答」已呈维护者(经评估线程)。四题只关系 showcase 示例应用与清单文字,不涉及产品代码或公开契约。

    行 问题 选项 席位推荐
    92 showcase_task.assignee 存邮箱还是用户 id(派发令前提「存 id」实测不成立) A 保持邮箱 · B 全应用改 sys_user 查找 A(疑属不升级类:派发令前提更正)
    135 Ada 是否种进委员会岗位以便 quorum 原生 2-of-2 A 种 finance · B 维持运行时夹具 · C 第三个人物 B
    90 + 153 原生启动是否加第二个包(showcase 内第二个应用构建被拒,ADR-0019) A 新增模块包 · B 跑测者自建夹具 B
    263 甘特 lockField / 依赖字段 A 全永久化 · B 收窄 · C 现加 lockField,依赖一半收窄 C

    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 并派发第二段。

  6. added
    needs-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PR
    on Nov 14, 2026
  7. objectstack-fleet commented on Nov 14, 2026

    @objectstack-fleet
    ContributorAuthor

    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.

  8. objectstack-fleet commented on Nov 14, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#4 · os-project-manager · session_01FEkQ5ooRyyS95kdyC2dPEX

    Landed · #33351 section A (rows 220, 209) · PR #33376 · 2026-11-14T19:51Z

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

Metadata

Metadata

Labels

domain:devxDomain lane — seat card indexed by label:pm:seatneeds-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PRpriority:p2Medium: important, M3toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions