Skip to content

qa(checklist): run the whole platform checklist on main (selector all, 272 items) and extract every new failure into its own card #23878

Closed

Description

@objectstack-fleet

Filing gate ③ — maintainer-directed. The maintainer, in session session_014eFvbvGK4FjXvscggDNTD4 (2026-10-16), verbatim and untranslated:

我说的全面测试也包括platform checklist

我不是马上要发布,就是测试看还有什么新问题,一起都要解决

复杂任务你可以派云卡片

Filed by the PM seat in that session · os-sales. Reader who acts: the domain:devx execution seat, dispatching one cloud session (mode:cloud) that runs .claude/skills/checklist-test/SKILL.md with selector all. This card is the wave anchor (the "sweep tracking issue" of docs/qa/platform-checklist/README.md): run records link here; checklist-accuracy findings and fixture gaps close out here.

Reading (origin/main c5cf546, 2026-10-16)

Done when

  • qa-run record(s) per checklist-test §4 — one per run, title in the strict QA run · … shape, every item with a verdict or an honest not-run plus a hand-off list.
  • Every fail carries a §5 disposition; each product defect is extracted to its own card on the repo where the fix lands (objectui defects on objectstack-ai/objectui), deduped first.
  • ⛔ No ledger edits on this card: an item whose steps or acceptance are wrong becomes a test-fix / re-point card (§5 table). This run therefore shares no file with the v18 authoring card filed in the same batch.
  • A close-out comment here listing the records, the extracted cards and the fixture gaps.

Dedupe

MCP search_issues on this repository, closed included, at this filing: full platform checklist run all areas release sweep tracking qa-run → 71 hits, top 10 read: the daily check:platform-checklist is red on main watchdog cards, #22017, #21932, #21851, #21845. None is a full run of the current ledger.

Dedupe words: full checklist run v18; selector all qa-run; platform checklist wave anchor.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_014eFvbvGK4FjXvscggDNTD4
    Account: os-sales
    Branch: claude/issue-23878-checklist-full-run
    Worktree: objectstack-issue-23878 (the cloud session's own checkout)
    Domain: domain:devx
    Seat: domain:devx#1 (seat post #6023)
    File surface: none in the tree — GitHub writes only: the qa-run record(s), the extracted defect cards, the close-out comment here (stop on breach; explain in the report)
    Container & model: L, mode:cloud, model: opus (dispatch-gates --tier on the checklist surface: "no path-derived mandate … floor sonnet · default opus · ceiling fable"; PM picks the default tier)
    Clause-②: no
    Responsibility: n/a — not a defect card
    Thread-read: none
    Serial constraints cleared: none — no tree edits; #23879 (same batch) owns the ledger files

  2. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    Slice: area:dashboards (cloud runner for session_01K3qUoyh1xFGoWzAACPMbXJ)

    Record: #23927 — QA run · area:dashboards (9/9) · 2034975a · 2026-10-16 · 9 PASS / 0 PARTIAL / 0 FAIL / 0 BLOCKED / 0 NOT-RUN. Selector resolved to 9 runnable items: 0 blocked-hidden, 0 planned. 2 retired entries (saved-report-ownership, report-schedule-dispatch-delivery, both #20102) are listed in the body. Browser verdicts ran on objectui daeb77fc built against spec a35f7a67^ (#23908 workaround), with check:console-sha matching. The run was sequential with no subagents.

    Extracted:
    Extracted: #23931 · dashboards.dataset-report-authoring · matrix is a true pivot whose cells reconcile
    This is a showcase report whose description says "Task counts" while its cells show summed estimated hours. It is a user-visible mislabel. The clause itself passed.

    Not filed (objectui landing, repo not attached to this session), for the objectui seat: on a metric widget with compareTo: { kind: 'previousPeriod' } whose previous window counts 0, the tile renders "↑100% vs previous period". A percent change from a zero baseline is undefined, so this is a judgment call for the renderer (a "new" or "—" marker is the usual answer). Repro: scratch dashboard with dateRange created_at last_90_days and metric task_count with compareTo on the stock showcase. The wire row is {task_count: 10, task_count__compare: 0}.

    Fixture gaps:

    • F1 dashboards.chart-type-matrix fixture requires[2]: the compareTo probe dashboard also needs a dateRange. Without one, the server answers a loud, correct 400 ("compareTo needs a dated window to shift…"), not a render.
    • F2 same item: on the stock seed the previous 90-day window is empty, so the comparison series is flat at 0 and the clause barely discriminates. It needs tasks older than 90 days.
    • F3 dashboards.system-overview-live-counts clause 1: a fresh boot has no revoked or expired sys_session row, so the live-session predicate cannot be shown to differ from the table count. The item needs a step that revokes or expires one session first.

    Checklist-accuracy findings:

    • C1 dashboards.cube-query clause 0 verify says "the meta response's cubes[] entry". The wire is a bare array under data (analytics.zod.ts states that there is no cubes wrapper).
    • C2 dashboards.dataset-report-authoring clause 5 ("open_block totals + done_block totals == unfiltered totals") cannot be computed as written, because the blocks carry different measures (est_hours vs task_count). It was reconciled per measure through the API.

    Time: environment ≈ 18 min (install + build + console build) vs test ≈ 19 min, about 1:1. The API probes and the 6 vitest pins ran while the console was building and are counted in neither figure.

    api_writes: 4 — 2 × issue-create (POST /repos/objectstack-ai/objectstack/issues: #23927, #23931) and 2 × comment (POST /repos/objectstack-ai/objectstack/issues/{n}/comments: #23927 close-out, this one). All went through the fleet-write relay.
    mcp_calls: 4 — issue_read ×2 (#23878 get + comments) and search_issues ×2 (dedupe for #23931).


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    Slice: area:automation (cloud runner for session_01K3qUoyh1xFGoWzAACPMbXJ)

    Record: #23940 — QA run · area:automation (17/17) · 2034975a · 2026-10-16 · 17 PASS / 0 PARTIAL / 0 FAIL / 0 BLOCKED / 0 NOT-RUN. The qa-rollup.mjs self-check parses it as 17/17.

    Extracted: #23928 · automation.flow-node-type-matrix · acceptance[4] — §5 disposition: product defect. A failing parallel drops every branch step; the summary says acted:0 while a sibling branch delivered. It was observed beside a passing clause and is the #13803 class, still open for parallel.
    Extracted: objectstack-ai/objectui#12672 · automation.time-relative-trigger · acceptance[0] — §5 disposition: product defect (objectui). The designer flags a live time-relative start node's sweep fields "Kept, not in effect". ⚠ The number comes from the relay run's annotation; the read-back from this session was 403, so the seat should confirm it landed.

    Environment. Browser verdicts ran on objectui daeb77fc built against spec a35f7a67^ (34b740f2), the #23908 workaround, copied into an os-qa worktree at 2034975a (check:console-sha matches). The run was sequential with one runner and no subagents.

    Fixture gaps and checklist-accuracy findings (for #23879 / the seat; detail in #23940):

    1. The schedule and time_relative legs need OS_AUTOMATION_SCHEDULED_WORK_ENABLED=1. On a default boot both showcase flows are unbound by deployment policy. trigger-type-matrix, time-relative-trigger and RUNNER are silent on this.
    2. showcase_task requires project, and status → done only from in_review (task_status_flow). The "POST a task, PATCH done" steps fail as written in node-matrix, error-handling, subflow-refusal, connector and toggle.
    3. The qa-flow-status-doors recipe is now proven live, but qa_always_fails should author an errorMessage, or trigger-status-contract c3's details.errorMessage never appears.
    4. GET /automation/connectors exposes no baseUrl. The connector premise-guard step and the RUNNER self-URL fact point at a key that isn't there.
    5. The activation-ledger boot line is info-level, so packaged-flow-disable-durable c2's log corroboration needs --log-level info (dev defaults to warn).
    6. packaged-flow-clone-contract c6: the automation: a cloned packaged flow reaches no Studio surface — the clone is stored with no package, and every Studio Automations rail lists only package-scoped flows #21332 expected-fail is stale. Studio /_console/studio/~org/automations lists and opens the package-less clone, so reachability passes now.
    7. flow-runs-page: the picker shows machine names, not the label the step names.
    8. node-matrix http: the stock owners need egress; success was located on a self-pinging scratch flow.

    Environment vs test time. Blocking environment time was ≈ 11 min (pnpm build 6m51s plus 4 server boots); test time was ≈ 45 min (12:35–13:20Z). The ≈ 15 min console build overlapped the API items, so the ratio is ≈ 1 : 4 blocking, or ≈ 26 : 45 counting the overlapped build.

    api_writes: 6. issue-create ×3 (#23928, objectui#12672, #23940 with label qa-run); post-stamped --body=23928 ×1 (QA-source re-pointed from #23878 to #23940); post-stamped --comment ×2 (#23940 close-out, this comment). All went through the fleet relay.

    mcp_calls: 12. issue_read ×5 (#23878 get + comments, #13803, #21332, objectui#12672 denied); search_issues ×4 (3 on objectstack, 1 on objectui); list_repos ×1; add_repo ×1 (read only); ToolSearch ×1.

    Not filed, recorded in #23940 as observations: a stale-suspension 404 leaves its sys_automation_run row paused indefinitely; the flow-trigger-unknown-object advisory misfires for a scratch-package flow targeting showcase_task.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    Slice: area:studio-authoring (cloud runner for session_01K3qUoyh1xFGoWzAACPMbXJ)

    Record: #23942 · QA run · area:studio-authoring (17/17) · 2034975a · 2026-10-16 · 16 PASS / 1 PARTIAL / 0 FAIL / 0 BLOCKED / 0 NOT-RUN.

    Extracted (no clause failed; both are product defects met outside the clauses, each reproduced 2/2 on fresh loads, with the mechanism read in objectui source at daeb77fc):

    Extracted: objectstack-ai/objectui#12680 · studio-authoring.object-designer-roundtrip · observation — in create mode, typing the Label overwrites an API name the author already typed (the nameTouched useRef guard in ObjectDefaultInspector does not survive; it strips the namespace prefix, so the publish gate then refuses NAMESPACE_PREFIX)
    Extracted: objectstack-ai/objectui#12681 · studio-authoring.expression-editors · observation — every formula edit flashes a false "carries the retired `formula` key" spec banner (ObjectFieldInspector patches `formula: undefined`)
    

    Fixture gaps

    Checklist-accuracy findings (no ledger edits made; for #23879 / the wave's re-point pass):

    1. org-override-registry-gate variants still say "field (… create open)", but the registry has field allowRuntimeCreate:false since meta-field-write-inert: an accepted field PUT never reaches the object — a runtime-created field is stored valid=true and is absent from fields forever #7893.
    2. metadata-diagnostics-sweep c1: the envelope lock is absent from the default GET /meta/TYPE/NAME, the cached arm, by design. Name GET /meta/TYPE/NAME/layers in the verify text.
    3. object-designer-roundtrip:
      • It names repair_asset / GET /meta/object/repair_asset, but in a namespaced writable package the object must be NS_repair_asset.
      • The route /apps/com.objectstack.studio/… renders in Showcase chrome, because studio is not loaded on stock boots.
    4. draft-publish-lifecycle c6:
      • "Changes · n" is now a numbered pill on the Changes button (objectui#12459).
      • A package-less dashboard draft is not counted in any package scope, so stage the draft in a writable package.
    5. packaged-automation-studio-lock:
      • c1: the forged flow write answers 403 ITEM_LOCKED (with ?package=) or 403 NOT_OVERRIDABLE (without), not 422 writable_package_required.
      • c2 / step 4: the switch's reason is in aria-describedby and a tooltip, not in a title (objectui#12303).
    6. packaged-display-class-direct-edit:
      • The flow banner text is "This item is locked and cannot be edited or deleted."
      • The showcase ships individual views, not a container.
      • system_overview /layers reports packageId com.objectstack.plugin-auth.
    7. permission-matrix-editor-ux c5: three read-only reasons exist (package / artifact / type), and the type gate is unreachable on stock.
    8. custom-page-source-tiers step 8(a): the compile panel is reachable only for a page in a writable package that an app's nav references (/studio/PKG/interfaces?surface=page:NAME).
    9. doc-on-app-menu knownGaps: daeb77fc is past the fork window.

    Non-clause observations, not filed (cosmetic, by-design, or not clearly a defect; listed so the seat can rule):

    Environment vs test time

    • Environment: about 20 min wall (12:27–12:47Z). That is about 30 min of build work run in parallel: pnpm build 9.5 min, console build 17.7 min, worktrees about 3 min.
    • Test: about 48 min wall (12:39–13:27Z). Lanes A 26 / B 32 / C 16.5 min, plus the parent's API legs, the picklist item, the pins and the re-verification.
    • Ratio: about 1 : 2.4 wall. Execution was three parallel browser lanes plus the parent, each with its own port and DB, and no server was up during any vitest run.

    api_writes: 5, all through the fleet relay.

    mcp_calls: 11 by the parent: issue_read ×3 (#23878 body + comments, #23166), search_issues ×5, list_repos ×1, add_repo (read) ×1, actions_get ×1. No MCP write tools were used.


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    Slice: area:identity-auth (cloud runner for session_01K3qUoyh1xFGoWzAACPMbXJ)

    Record: #23943, QA run · area:identity-auth (23/23) · 2034975a · 2026-10-16 · 18 PASS / 5 PARTIAL / 0 FAIL / 0 BLOCKED / 0 NOT-RUN.

    • Subject: main @ 2034975a. Browser verdicts ran on objectui daeb77fc, built against spec a35f7a67^ (the Console pin does not build on main: objectui daeb77fc imports checkPageComponentViewData, deleted from spec by #23784 #23908 workaround). pnpm check:console-sha matches.
    • Planned items: none. Blocked-hidden items: none.
    • All 7 automated pins passed: 3 + 4 + 3 + 5 + 7 + 7 + 23 tests.
    • node scripts/qa/qa-rollup.mjs (with NODE_USE_ENV_PROXY=1) parses the record (area:identity-auth … 18 | 5 | 0 | 0 | 0 | 23/23). The record is left open for the wave close-out.
    • No authentication or authorization hole was found, so nothing is withheld under the RUNNER rule-2 carve-out.

    Extracted: #23944 · identity-auth.api-key-ui-lifecycle · acceptance 2 — product defect: the API_KEY_REVOKED text says "a revoked key never works again" while the declared restore_api_key revives it.
    Extracted: #23945 · identity-auth.invitation-scope-gates · acceptance 1 — product defect: the invitation role-cap refusals (admin / delegated_admin by a delegated issuer) are 403 with no ADR-0112 code.
    Extracted: #23946 · identity-auth.email-verification-loop · negative 1 — product defect: --seed-admin on a verification-armed boot logs ERROR TEMPLATE_NOT_FOUND, because the seed send runs before plugin-email wires its template loader.
    Extracted: objectstack-ai/objectui#12682 · identity-auth.sso-enforced-first-paint · acceptance 1 — product defect (objectui): the SSO-enforced login shows password copy while pending, and a dangling "or continue with email" divider. Checked against objectui main dcd1041. The relay created it; read-back was 403 from this session, but MCP search confirms it is open and fleet-authored.

    objectui observations, not filed. None had a clean landing point plus a spec gate; listed for the seat:

    • Invite role picker: the Invite User dialog offers Owner and Admin to a delegated_admin, and the server refuses both. The options come from sys_invitation.role; narrowing them per caller would need a dynamic-options contract.
    • Identity import wizard: it offers "Update existing (skip if no match)". identityImport.ts refuses that mode honestly and skips every row with an explanation.
    • Stale org label: after a forged set-active to a non-member org is refused, the reloaded header still names the previous org while the server reports NO_ACTIVE_ORGANIZATION. Not checked against objectui main.

    Fixture gaps:

    • No provisionable passwordless (SSO/social-only) user on stock showcase. This blocks self-service-profile-password A5/N3.
    • deviceAuthorization and the @better-auth/sso plugin have no os dev boot door. This blocks the on-sides of auth-method-matrix A0/A4.
    • oidcProviders has no env switch, and a config file beside the showcase config is not git-ignored. Generic-OIDC items therefore need a scratch app copy plus a plugin calling auth.applyConfigPatch, with a localhost PKCE IdP. The recipe works and covered linked-accounts, implicit-linking and sso-enforced live.
    • workspace-org-switch A5's UI-error half has no UI gesture that can trigger it.
    • teams-bu-membership N2 (intermediate-depth scope) belongs to access-security.scope-depth-asymmetry.
    • Walled tenancy (group / isolated) needs a scratch showcase copy that adds @objectstack/organizations.

    Checklist-accuracy findings, for #23879 or the ledger seat:

    • Mail capture (password-reset, email-verification-loop, implicit-linking): EMAIL_TRANSPORT_PROVIDERS is a const, not an env switch. With no mail config LogTransport is the fallback, and it logs no body or link. Name the sys_email row (admin GET /api/v1/data/sys_email) as the capture oracle.
    • self-signup-gate step 6 / A4, first-run-owner-bootstrap step 8 / A4: on an OS_DISABLE_SIGNUP boot, an uninvited forge is refused by the audience gate first (403 SELF_REGISTRATION_CLOSED). Only an invited address reaches the toggle (400 EMAIL_PASSWORD_SIGN_UP_DISABLED). The items should say which address proves which door.
    • self-signup-gate knownGap: the open posture through the env door (OS_AUTH_AUDIENCE_POSTURE=open + OS_AUTH_AUDIENCE_SELF_REGISTRATION_PERMISSION_SET) is now measured on a live boot.
    • email-verification-loop:
      • A2: verify answers {status:true,user:null} with no session, so the clause should not imply a user object.
      • A3: a consumed or older token for an already-verified user answers a silent 200.
    • two-factor-verify-to-activate A1 / step 3: the cookie-lane TOTP_NOT_ENABLED branch is unreachable over HTTP. Sign-in never interposes a challenge while the factor is unverified (the factor is inert), and re-enable is refused TOTP_ALREADY_ENABLED.
    • two-factor-enrollment-reveal A4: get-totp-uri is password-gated but re-reveals the same secret before and after verification. The "shown only once" dialog copy holds only for backup codes; reword it or record the behaviour as accepted design.
    • two-factor-backup-codes step 8: it cites "step-5 regenerate"; the regenerate is step 4.
    • two-factor-disable (design observation): an MFA-gated admin gets 403 MFA_REQUIRED on PUT /api/settings/auth, so they must enroll before relaxing a policy they just set. The /two-factor/* routes stay open.
    • api-key-ui-lifecycle:
      • A2 should expect 403 API_KEY_REVOKED (unknown keys stay 401).
      • showcase_task returns the same rows to member and admin, so it cannot discriminate; use sys_session.
      • The Integrations page is at /_console/apps/com.objectstack.account/developer/integrations.
    • session-list-revoke:
      • revoked_at / revoke_reason live on the revoked view, not all_sessions.
      • The owner's raw list includes their own tombstones, so "two rows" is the wrong count.
    • workspace-org-switch: the sentinel-absent check holds only under isolated. Under group, reads span member orgs by design.
    • invitation-scope-gates:
      • Step 7: cancel is owner/admin only, so the delegate's cancel is refused 403 by design.
      • The delegate cannot open Setup. The invite affordance lives at /_console/apps/com.objectstack.account/sys_invitation, which no nav entry links to.
    • org-membership-team-management A4: after remove-member, reads granted by the everyone baseline still work on the single posture. Name an org-membership-scoped oracle.
    • admin-lifecycle-operations: Impersonate is only in the Users list row menu, not the record header.
    • linked-accounts-social:
      • sys_account apiMethods are live [get,list,aggregate,export].
      • link_social is retired, so A3 (no affordance on a provider-less boot) cannot discriminate.
      • The callbackURL lands on the "All" tab.
    • sso-enforced-first-paint:
      • Step 5 ("IdP never redirects back") is outside the console's watchdog; the watchdog covers the hung sign-in request (20 s).
      • The sign-up half of A2 cannot discriminate on invite_only showcase.
    • auth-method-matrix:
      • The no-SMS state needs NODE_ENV=production; on os dev the log SMS transport counts as deliverable.
      • Generic oidcProviders surface as socialProviders[] type oidc, while features.sso tracks only @better-auth/sso, so step 5 conflates two variants.
      • Magic-link is off on stock (404).
      • Generic OIDC is drivable with a localhost IdP and no longer needs to be blocked.
    • oauth-app-consent-loop step 2: create-client defaults to type web, which refuses http and loopback redirect URIs. Use an https non-loopback URI and capture the redirect. Note that replaying an authorization code revokes the token issued from it (RFC 6749 §4.1.2); this is correct, not a bug.

    Environment-vs-test time:

    • Environment: about 22 min (install + build 7 min, console client + build-console.sh about 14 min, worktree prep).
    • Test: about 40 min wall, across six parallel runner groups (at most 4 concurrent) plus the sequential pins.
    • Ratio about 0.55 : 1.

    Ops notes:

    api_writes: 8, all through scripts/pm/ via the fleet relay:

    mcp_calls: 15, all reads by the coordinator:

    • issue_read × 4, one of which was refused for objectui;
    • search_issues × 9;
    • list_repos × 1;
    • add_repo × 1 (read).

    Runner subagents made no GitHub calls.

  6. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    Slice: area:attachments-storage, area:i18n, area:ux-conventions (cloud runner for session_01K3qUoyh1xFGoWzAACPMbXJ)

    Records (subject 2034975a, console objectui daeb77fc built against spec a35f7a67^; all three parse in qa-rollup)

    No planned or blocked-hidden items in these three areas. Execution: this session drove attachments + the two non-browser i18n items. Two runner subagents ran the i18n browser items and ux-conventions in parallel, each on its own port and DB. I re-derived the i18n FAIL independently and checked every objectui FAIL's code path at the pin and on objectui main d66ceea5.

    Extracted (this repo)
    Extracted: #23932 · attachments-storage.field-accept-maxsize-server-enforced · clause 2 — rest logs declared client refusals (400 ERR_FILE_CONSTRAINT, 422 INVALID_METADATA) as [REST] Unhandled error with a stack. Found while the clause itself passed; also hit by every rejected save in i18n.strict-translation-key-rejection.

    objectui defects — NOT filed. For the seat to file on objectstack-ai/objectui. objectui is readable from this container, but the session's permission policy refused the cross-repo issue-create. I did not retry. Each is a product defect (§5 disposition: product defect, fix lands in objectui). Each was reproduced twice on a fresh load, and its code path is present on objectui main d66ceea5. Dedupe already done (MCP search_issues on objectui, closed included), with no open duplicate:

    Fixture gaps

    • attachments-storage qa-scratch-authz step 6:
    • i18n:
      • No showcase object field declares a placeholder.
      • No showcase page has a translated title or subtitle.
      • There is still no live confirmText specimen. The objectui pins passed at daeb77fc84dd, 7/7.
    • ux-conventions:
      • showcase_task has no create-time validation rule.
      • The stock member has no update or delete on showcase_task, so the member write rows are not drivable.
      • No stock surface disables a submit button.
      • No surface offers Undo (write-feedback clause 5 stays blocked(fixture)).

    Checklist-accuracy findings (details in each record's last section)

    Other observation (not filed, no user-visible cost): every data request re-registers each runtime-authored object. The log shows "[Registry] Overwriting object: …" once per scratch object per request.

    Time:

    • Environment, blocking: about 10 min (primary pnpm install && pnpm build, 8m37s).
    • Environment, in the background while testing: console worktree install and build, plus build-console.sh, about 18 min.
    • Testing: about 68 min wall in this session, with two runner subagents of about 35 min each in parallel.
    • Ratio: blocking env to test about 1:7. Counting the overlapped builds, about 1:2.4.

    api_writes: 5

    mcp_calls: 13 GitHub MCP reads

    • issue_read ×3, one of them denied for objectui.
    • search_issues ×8: 2 on objectstack, 6 on objectui.
    • list_repos ×1 and add_repo ×1 (read, nothing attached).
    • No MCP writes.

    Generated by Claude Code

  7. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    Wave close-out for #23878: the full platform checklist (selector all), run per area. Runner session session_01K3qUoyh1xFGoWzAACPMbXJ, dispatched by the domain:devx seat 1 PM, mode:cloud. The maintainer's mid-run instructions, verbatim: 「测试资源不够,你可以开云卡片吧?」 · 「测试遇到的问题,随时使用 pm-dispatch 技能提交issue」. In response:

    • 5 area groups went to cloud sessions;
    • defects were filed as each was confirmed, not batched at the end.

    Result: 272/272 judged · 248 PASS / 14 PARTIAL / 10 FAIL / 0 BLOCKED / 0 NOT-RUN

    Every runnable item has a verdict. Nothing was handed off.

    Two subjects.

    Records (all labelled qa-run only; titles parse in qa-rollup.mjs)

    area record sha judged P / Pa / F / B / NR
    access-security #23911 94114c1 26/26 24 / 2 / 0 / 0 / 0
    ai #23915 94114c1 9/9 8 / 0 / 1 / 0 / 0
    api-backend #23913 94114c1 23/23 22 / 0 / 1 / 0 / 0
    approvals #23926 94114c1 18/18 17 / 0 / 1 / 0 / 0
    cli #23921 94114c1 17/17 16 / 0 / 1 / 0 / 0
    integration-system #23922 94114c1 18/18 14 / 4 / 0 / 0 / 0
    platform-core #23939 94114c1 30/30 27 / 1 / 2 / 0 / 0
    records-forms #23949 94114c1 40/40 39 / 1 / 0 / 0 / 0
    search #23916 94114c1 8/8 8 / 0 / 0 / 0 / 0
    dashboards (cloud) #23927 2034975 9/9 9 / 0 / 0 / 0 / 0
    automation (cloud) #23940 2034975 17/17 17 / 0 / 0 / 0 / 0
    studio-authoring (cloud) #23942 2034975 17/17 16 / 1 / 0 / 0 / 0
    identity-auth (cloud) #23943 2034975 23/23 18 / 5 / 0 / 0 / 0
    attachments-storage (cloud) #23929 2034975 9/9 9 / 0 / 0 / 0 / 0
    i18n (cloud) #23951 2034975 5/5 4 / 0 / 1 / 0 / 0
    ux-conventions (cloud) #23953 2034975 3/3 0 / 0 / 3 / 0 / 0

    Every FAIL, with its §5 disposition

    Extracted: #23914 · api-backend.query-contract-matrix · clause 6 — product defect (P0; rule-7 independent re-derivation confirmed): a malformed JSON body is parsed as {} → a truncated POST /query answers 200 with the whole table; a truncated PATCH answers 200 with an empty update
    Extracted: #23950 · ai.mcp-stdio-fail-closed · clause 6 — stale spec (revocation text moved to API_KEY_REVOKED, #23367; fail-closed holds)
    Extracted: #23950 · cli.migrate-meta-codemod · clause 7 — stale spec (its restart trigger fired: --write landed, #9591/#22142)
    Extracted: #23950 · approvals.approver-resolution-matrix · clause 4 — stale spec (admin_rescue opens on org admins, ruling #22824)
    Extracted: #23950 · approvals.approver-resolution-matrix · clause 5 — stale spec (same)
    Extracted: #23950 · platform-core.shell-nav-personalization · clause 5 — stale spec (object routes draw no crumb, objectui#12461)
    Extracted: #23950 · platform-core.activation-ledger-row-contract · clause 4 — stale spec (catalog activation door writes position/permission rows, ADR-0131 D3/D6)
    Extracted: objectstack-ai/objectui#12688 · i18n.studio-follows-app-locale · clause 1 — product defect (objectui)
    Extracted: objectstack-ai/objectui#12690 · ux-conventions.write-feedback · clause 1 — product defect (objectui)
    Extracted: objectstack-ai/objectui#12691 · ux-conventions.disabled-control-reason · clause 0 — product defect (objectui; clauses 0–2)
    Extracted: objectstack-ai/objectui#12693 · ux-conventions.labels-over-machine-names · clause 0 — product defect (objectui; surfaces a + b)
    

    #23950 is one family card for the six stale-spec clauses (the filing gate's fold rule; #23121 is the precedent). No fail was an assertion defect or an invalid pairing.

    Defects found outside a failing clause (extracted as found)

    Extracted: #23908 · platform-core.boot-health · console mount precondition — pnpm objectui:build fails on main (pinned objectui daeb77fc imports checkPageComponentViewData, deleted by #23784; objectui main still imports it)
    Extracted: objectstack-ai/objectui#12683 · search.command-palette-navigation · clause 2 — ⌘K palette stays open after a theme command (stale setOpen)
    Extracted: objectstack-ai/objectui#12684 · platform-core.marketplace-console-honesty · observation — stale installedAdditiveNote (uninstall now unregisters live)
    Extracted: objectstack-ai/objectui#12686 · platform-core.docs-portal-render · observation — doc-to-doc links lack the /_console base → 404 in a new tab
    Extracted: objectstack-ai/objectui#12694 · i18n.surface-matrix · settings variant — Overrides / Inherited from hard-coded English
    Extracted: #23931 · dashboards.dataset-report-authoring · observation (cloud slice)
    Extracted: #23928 · automation.flow-node-type-matrix · acceptance 4 (cloud slice)
    Extracted: objectstack-ai/objectui#12672 · automation.time-relative-trigger · acceptance 0 (cloud slice)
    Extracted: objectstack-ai/objectui#12680 · studio-authoring.object-designer-roundtrip · observation (cloud slice)
    Extracted: objectstack-ai/objectui#12681 · studio-authoring.expression-editors · observation (cloud slice)
    Extracted: #23932 · attachments-storage.field-accept-maxsize-server-enforced · clause 2 observation (cloud slice)
    Extracted: #23944 · identity-auth.api-key-ui-lifecycle · acceptance 2 (cloud slice)
    Extracted: #23945 · identity-auth.invitation-scope-gates · acceptance 1 (cloud slice)
    Extracted: #23946 · identity-auth.email-verification-loop · negative 1 (cloud slice)
    Extracted: objectstack-ai/objectui#12682 · identity-auth.sso-enforced-first-paint · acceptance 1 (cloud slice)
    

    ⚠ objectui#12689 overlaps the per-item cards. The PM seat filed it as a six-item fold card in the same two minutes that this session filed the per-item split: #12688, #12690, #12691, #12693, #12694. The attachments slice's "Parked-on: #23878 · …" lines for those six are superseded by the cards above.

    • A cross-link comment is on objectui#12689. The relay run succeeded, but the read-back is 403 from this session, so it is unverified.
    • Neither filer closed the other's card. Which side closes is objectui triage's call.

    No authentication or authorization hole was found anywhere in the wave, so nothing is withheld under RUNNER rule 2.

    Coverage gaps on the PARTIAL items (parked here)

    Parked-on: #23878 · access-security.rls-both-sides · clause 5 blocked(dependency): the D11 spot-check needs the maintainer-held write-up
    Parked-on: #23878 · access-security.crud-permission-matrix · clause 5 blocked(fixture): guest_portal create-without-read is unobservable on a stock boot
    Parked-on: #23878 · integration-system.webhook-lifecycle · acceptance 2 blocked(dependency): bulk events carry no organizationId — maintainer question on #23166
    Parked-on: #23878 · integration-system.notify-inbox-delivery · acceptance 3 blocked(fixture): 501 half needs a boot without MessagingServicePlugin
    Parked-on: #23878 · integration-system.notification-preference-suppression · acceptance 3 blocked(fixture): no mandatory topic on showcase
    Parked-on: #23878 · integration-system.datasource-credential-refusal-matrix · acceptance 1, 6 blocked(environment): no reachable postgres/mysql/mongo in the container (P0)
    Parked-on: #23878 · platform-core.keyboard-shortcut-surface · clause 4 blocked(environment): on-page half needs an agent server
    Parked-on: #23878 · records-forms.gantt-interactions · clause 3 blocked(fixture): no veto path / server date rule on stock
    Parked-on: #23878 · studio-authoring.metadata-diagnostics-sweep · clause 6 blocked(fixture) (cloud slice, #23942)
    Parked-on: #23878 · identity-auth · 5 partial items, gaps itemized in #23943 and the slice comment above
    

    Other fixture gaps from this session's areas. Each was scored from a pin or a substitute fixture, and none is a red row:

    • access-security.crud-permission-matrix clause 5: guest_portal create-without-read cannot be observed on a stock boot (already recorded in knownGaps)
    • access-security.rls-both-sides clause 5: the D11 spot-check needs the maintainer-held private write-up (already recorded in knownGaps): blocked(dependency)
    • search.global-search-skips-unreadable clause 4: none blocking; last_login_ip / ban_reason are null on a fresh boot, so the hidden column used is sys_user.role ("user")
    • ai.mcp-oauth-private-host-transport clause 0: container holds no RFC1918 address (192.0.2.2 only) and there is no second machine; private arm scored on the advertised origin
    • approvals.decision-action-matrix clause 9: no org-less request on stock seeds — wire READ_BACK_FAILED envelope unobserved (scored from pin)
    • approvals.email-action-token-door clause 4: expired token leg has no live door (72h TTL, token API closed) — scored from pinned unit test
    • approvals.email-action-token-door clause 0: email-rendering leg needs the log mail transport; not exercised
    • integration-system.webhook-lifecycle clause 2: in-org predicate multi-write bulk events carry no organizationId; maintainer question open on QA run · surface:mixed (90/90) · 36b2889c · 2026-10-12 · 72 PASS / 10 PARTIAL / 8 FAIL / 0 BLOCKED / 0 NOT-RUN #23166
    • integration-system.notify-inbox-delivery clause 3: 501 half needs a boot without MessagingServicePlugin; showcase requires messaging
    • integration-system.notification-preference-suppression clause 3: mandatoryTopics is a constructor option, default []; no showcase topic is mandatory
    • integration-system.datasource-credential-refusal-matrix clause 1: no reachable credential-protected postgres/mysql/mongo in the container
    • integration-system.datasource-credential-refusal-matrix clause 6: connect half of the echoed-mask probe needs the same database
    • platform-core.docs-audience-gate clause 1: stock showcase authors no permissionSet-audience book; filled this run by runtime-authored books in a writable package (torn down)
    • platform-core.notification-center clause 0: showcase_scheduled_digest fixture is off by deployment policy (OS_AUTOMATION_SCHEDULED_WORK_ENABLED unset); coalescing used the 3 seeded approval.requested rows instead
    • records-forms.gantt-interactions clause 3: no veto path on stock: the task gantt has no host onBeforeTaskUpdate and showcase_task has no date rule the server would refuse; no objectui pin covers acceptance[3]
    • records-forms.gantt-interactions clause 2: direct drag of a locked LEAF bar still unreachable live (stock view declares no lockField) — sub-leg blocked(fixture); clause scored from pins
    • records-forms.action-location-matrix clause 4: half (a) needs a PACKAGED action with no locations key; none ships on stock (knownGaps) — scored on half (b)
    • records-forms.field-unique-enforcement clause 4: live two-organization collision probe not provisioned (needs 2 orgs); scored from memory + SQL pins
    • records-forms.delete-behavior-matrix clause 3: lesser-persona DELETE_RESTRICTED shape (count may be omitted) not driven; admin shape observed
    • records-forms.cascading-multilevel-and-clear clause null: no 3-level dependsOn fixture (knownGap, no clause)

    The two PM-carried readings: both confirmed

    • records-forms.concurrent-edit-conflict cites packages/rest/src/approvals-routes.ts#mapping for "CONCURRENT_UPDATE → 409". That map (L106–127) holds only VALIDATION_FAILED, DUPLICATE_REQUEST, INVALID_STATE, THROTTLED, FORBIDDEN, REQUEST_NOT_FOUND, RESUME_TARGET_LOST, RESUME_FAILED and READ_BACK_FAILED.
      • The real row is in packages/types/src/data-error-classification.ts (~L1046).
      • The error class is in packages/metadata-protocol/src/protocol.ts (~L2887).
      • Acceptance 0's "rest-server.ts error mapping" is not where the row lives either.
    • access-security.record-share-grant-revoke says the record-shares family is "registered inline, under no registrar of its own". registerSharingEndpoints (packages/rest/src/sharing-routes.ts L101) registers GET/POST …/:id/shares and DELETE …/shares/:shareId.

    Not filed (no clause red, and no user-visible wrong result or no clean landing), for the seat to rule on

    • Showcase docblock. showcase_approver_bindings is status: 'draft', yet it fires on every showcase_field_zoo update. The platform logs "draft flows still fire their triggers" by design. The showcase docblock claiming draft "keeps it out of the runtime" is what is wrong.
    • objectui (unverified, 1 sighting): field-group header strip. On a scratch object with no highlightFields, the auto-built header strip showed a field from a hidden group with its value (records-forms.field-group-visible-when).
    • objectui: grid save. A grid save blocked client-side still sends the batch. The server refuses it with 400 and writes nothing (records-forms.conditional-rules-grid).
    • Cloud slices' unfiled observations, listed in their comments above. Examples: the metric compareTo showing ↑100% from a zero baseline; the stale-suspension paused row; the kanban live region announcing raw ids.

    Checklist-accuracy findings

    No clause is red for any of these. They are for the ledger owner's next revision pass and are not extracted. The cloud slices' findings are in their comments above. This session's are listed below:

    • access-security.record-share-grant-revoke: Confirmed: source[1] says the record-shares family is 'registered inline, under no registrar of its own'. That is wrong. packages/rest/src/sharing-routes.ts exports registerSharingEndpoints (line 101), which registers GET and POST
    • access-security.crud-permission-matrix: knownGaps[4] (A1 is a KNOWN FAIL until [finding] The delegated-admin gate resolves an EMPTY subtree on a stock objectstack dev boot — seeded business units are organization-less while every session carries an active organization, so every in-scope delegated write is refused #21057) is stale. [finding] The delegated-admin gate resolves an EMPTY subtree on a stock objectstack dev boot — seeded business units are organization-less while every session carries an active organization, so every in-scope delegated write is refused #21057 was closed on 2026-10-08. On this boot the seeded sys_business_unit rows carry organization_id, the delegate's in-subtree sys_user_position create answers 201, and th
    • access-security.crud-permission-matrix: access-matrix.json now has 45 rows: 41 showcase_* plus 4 delegate x sys_* (sys_business_unit, sys_business_unit_member, sys_user, sys_user_position). The fixtures line, knownGaps and steps still say 47 rows / 6 delegate rows.
    • access-security.sharing-rules-widen: The position-audience variant is confounded. The manager position binds showcase_manager, which has readScope org on showcase_contact, so the audience member sees NON-matching contacts through depth (explain decidedBy depth). The
    • access-security.sharing-rules-widen: Step 7 / clause 5 (A13) says 'edit a materialized share'. sys_record_share is get/list only (PATCH answers 405 OBJECT_API_METHOD_NOT_ALLOWED), so the editable seeded artifact is the sys_sharing_rule row. A manual-share recipient a
    • access-security.write-path-guards: Wire shapes the steps leave out. createMany takes a bare JSON array. updateMany takes {records:[{id,data}]}. By default the bulk run stops at the first validation failure (later rows NOT_ATTEMPTED), so clause 6's mixed outcome nee
    • access-security.readonly-package-locks-studio: Step 5: POST /api/v1/packages is the install door. It needs a manifest with type (e.g. 'app'), or it answers 400 VALIDATION_ERROR. An object authored into the scratch base needs sharingModel, or it answers 422 security-owd-unset
    • access-security.fls-mask-and-strip: Clause 3 asks for the disabled state of three budget controls. The edit form renders only budget and spent. budget_remaining is a formula and is not on the form.
    • access-security.audit-log-browser: Clause 0's non-holder read: a fresh member is refused sys_audit_log at object level (403), not served an empty filtered list.
    • access-security.share-link-landing-page: knownGaps[2] and history rev 2 say objectui 1fb1ced36243 is 'still this repo's .objectui-sha'; .objectui-sha is now daeb77fc84dd. The behavior still holds there.
    • access-security.share-link-capability-tokens: Clause 8 says public routes carry 'exactly' Vary: X-Share-Password, X-Share-Password-Encoding. Live answers append Origin (CORS middleware), and authenticated routes carry Vary: Origin. Reword as 'Vary includes'.
    • access-security.capability-declaration-lifecycle: Step 3 says not to probe /api/v1/actions/..., but on this build the platform dispatcher /actions domain IS mounted at /api/v1/actions/:object/:action[/:recordId] and enforces actionPermissionError. Name it as the surface to drive.
    • access-security.capability-declaration-lifecycle: The REGRANT step edits OpsPermissionSet (showcase_ops), which is now sealed (PUT /meta/permission/showcase_ops 403 NOT_OVERRIDABLE, ADR-0126). The leg needs a scratch or cloned set carrying showcase.export_data.
    • access-security.capability-declaration-lifecycle: sys_capability is not a registered object any more (GET /data/sys_capability 404 OBJECT_NOT_FOUND). 'no sys_capability row' holds trivially; steps 7-8 still talk about a sys_capability upsert.
    • access-security.sharing-rule-authoring-ui: knownGaps[0] says no seeded rule covers showcase_contact and that there are four seeded rules. The stock boot serves two: 'Key-Account Qualified Contacts -> Managers' ON showcase_contact (position manager) and New Inquiries -> Fie
    • access-security.sharing-rule-authoring-ui: fixtures/source cite objectui packages/plugins/plugin-sharing/src/sharing-plugin.ts#nav_sharing_rules, which does not exist at daeb77fc. The Setup nav comes from platform-objects' setup app, and the list route is /_console/apps/se
    • access-security.record-view-read-audit: Clause 0/1 log greps: the install line is logged at INFO, and os dev's default log level is warn. So 'boot log lacks install line' is vacuous on a default boot, and the configured boot also omits it. Steps should say OS_LOG_LEVEL=
    • access-security.record-view-read-audit: The configured half has no stock fixture. A scratch copy outside the tree needs a hand-built node_modules: the original's entries symlinked, plus @objectstack/plugin-audit and @objectstack/platform-objects. Worth a scripted recipe
    • access-security.platform-owner-email-anchor: The step order runs the malformed variant while M is still unverified, so M's refusal there cannot be told apart from the unverified arm. The well-formed-sibling-confers-nothing check only bites once M is verified. Reorder, or not
    • access-security.public-form-intake: Clause 1 speaks of 'the server-stamped owner'. The landed anonymous row's owner_id is null (no owner), not a stamped user. The forged value is stripped either way.
    • access-security.public-form-intake: The public link /forms/contact-us redirects to /_console/f/contact-us. Console /_console/forms/:name is the authed internal route, which redirects anon to login. The public page heading shows the raw view name 'showcase_inquiry.co
    • access-security.activation-write-operator-gate: No API exposes the tenancy posture. The proof used is the boot banner line 'Tenancy: single'; the item could name it.
    • ai.mcp-validate-expression: fixtures/steps name showcase_task.est_hours; the field is estimate_hours (est_hours answers "unknown field")
    • ai.mcp-run-action-exposure-gate: step 1 calls list_actions with objectName: showcase_task; list_actions takes no arguments and refuses it -32602 unrecognized key
    • ai.mcp-http-surface: clause 4 tool list omits resume_run, which tools/list now returns (registered in mcp-http-tools.ts)
    • ai.agent-tool-skill-metadata-roundtrip: clause 3 says a GET with ?mode=draft serves the active item or 404s; it now answers 400 VALIDATION_ERROR "The mode query parameter is not supported by this endpoint"
    • ai.mcp-stdio-fail-closed: os start sign-in needs an Origin header (403 MISSING_OR_NULL_ORIGIN), worth a note for runners minting keys on the start boot
    • search.pinyin-flag-both-sides: clause 2 lists "wf" as an account initials form; wf is 王芳 (a contact); the roster numbers 48/47 are now 52/51
    • search.global-search-skips-unreadable: knownGaps calls pinyin OFF "the stock default"; on showcase the flag defaults ON via the zh-CN locale
    • ai.skill-instructions-mcp-prompts: step "flip active, reload metadata": under os dev, /meta serves the built dist artifact, so a restart alone leaves /meta stale vs the MCP projection; rebuild before re-listing
    • api-backend.error-envelope-ledger: Step 6 uses options {atomic:false}; batch.zod strips it and the batch SUCCEEDS (200, creates a row). The BATCH_NOT_ATOMIC sample needs TOP-LEVEL atomic:false (the batch-transactional-discovery item already says so).
    • api-backend.bulk-write-contract: updateMany/deleteMany are id-based (UpdateManyRequestSchema records[{id,data}], DeleteManyRequestSchema ids[]); the steps' "where clause" body answers 400 VALIDATION_FAILED. Also the baseline member has no allowDelete on showcase_
    • api-backend.package-rest-lifecycle: Step 2 manifest scope 'custom' is invalid (expected cloud|system|project) -> 400 VALIDATION_ERROR; the semver message reads 'version must be a SemVer 2.0.0 string (e.g. 1.0.0, 2.0.0-beta.1)', not the item's wording.
    • api-backend.route-ledger-live-parity: REST ledger now carries 18 families; 'reports' was RETIRED (retire the saved-report stack — sys_saved_report / sys_report_schedule, /api/v1/reports, client.reports, IReportService, the reports capability and @objectstack/plugin-reports (zero consumers; not the report metadata kind) #20102). The variants list and '19 REST families' wording are stale.
    • api-backend.server-timing-admin-gated: Span list total/auth/db/hooks/serialize is stale: the hono adapter emits parse, db, serialize, handler, total (no auth/hooks spans exist in source).
    • api-backend.rest-metadata-config-contract: The masking step names showcase_account, but no stock persona has FLS on any showcase_account field; the stock FLS fixture is showcase_project (client_liaison: budget/spent/budget_remaining readable:false).
    • api-backend.aggregate-contract-matrix: Restricted persona named as Mei/Ada: Mei is 403 at the invoice/contact object gate and Ada is VAMA, so neither gives a differing visible set; use search:qa-contributor-bound-member.
    • api-backend.batch-transactional-discovery: Fixture says showcase_task accepts baseline creates; a create needs the required 'project' lookup or answers 400 VALIDATION_FAILED.
    • api-backend.enforce-or-remove-authoring-gates: No concrete "silently-stripped-by-design display annotation" key is named and none was found in spec docblocks; the run used the documented non-strict strip of an unknown RestServerConfig.routes key. The migrate-meta output does n
    • api-backend.retired-def-refusal: RETIRED_DEFS entries are schema-export definitions with no metadata-type binding or stack collection, so "a stack that declares metadata of each sampled retired type" can only be an invented stack key or a tombstoned carrier key (
    • api-backend.declarative-endpoint-execution: os build reports "3 APIs" on stock showcase while the fixture text names two live endpoints.
    • approvals.approver-resolution-matrix: knownGaps says approver-bindings.flow.ts is a 'draft' specimen that does not run, but the platform says 'draft flows still fire their triggers' (service-automation plugin.ts boot log). showcase_approver_bindings fires on every sho
    • approvals.approver-resolution-matrix: fixtures say team rows are data-API inserts; sys_team create answers 405 OBJECT_API_METHOD_NOT_ALLOWED. The working door is /api/v1/auth/organization/create-team + add-team-member. The manager chain also needs POST /api/v1/auth/ad
    • approvals.ooo-delegation-reroute: knownGap 'authoring the scratch flow needs a writable/scratch package' is stale: POST /api/v1/automation registers a runtime flow on stock showcase (same holds for approver-resolution-matrix and status-mirror-field). Runtime-regis
    • approvals.record-page-decisions: the both-sides clause should name a non-override persona: the dev admin sees 'Override Approve/Override Reject' on a record routed away from them. The item's route /apps/showcase_app/showcase_project/:id is really .../showcase_pro
    • approvals.pending-count-surfaces: knownGap The Account app's Notifications entry 403s for every non-admin — no permission set grants sys_inbox_message #7344 (a plain member's notification count is structurally 0) did not hold: nina (contributor+finance positions) saw '2 notifications'.
    • approvals.per-group-signoff: clause 5 wording ('actorId is a hint ... regardless of any actorId') describes a silent override; the server actually REFUSES a mismatched actorId with 403 'cannot act as'. The behavior is stricter but the wording should match.
    • approvals.quorum-m-of-n: drawer 'N eligible approvers' counts pending_approvers including duplicate slots for one user (showed '5 eligible' for 3 distinct people). This is UI copy, not a clause.
    • approvals.decision-action-matrix: request-info is approver-only (admin got 403 after reassigning away), so the step 'request-info + comment on a pending request' as the admin needs the pending approver; the item doesn't say so.
    • approvals.email-action-token-door: the step 'reassign the bound approver away first' needs the approver themselves (or a from-slot) to reassign: an admin reassign replaces the CALLER's slot, so the target token stays live.
    • cli.migrate-meta-codemod: Restart condition met: --write exists (feat(cli): os migrate meta --write — the AST codemod that rewrites authored sources for the mechanical applied set (v18) #9591 closed 2026-10-08). Item also assumes PROTOCOL_MAJOR 17 / CHAIN_TERMINUS 18; runtime now implements protocol 18 (--from 18 is the empty range; --to default 18). Restore source-rewrite a
    • cli.hook-body-extraction-gates: Clause 6 EXPECTED-FAIL has flipped: default build prints "N handlers could not be lowered…" with per-hook reasons, and --json carries bodyExtractionWarnings. Title/clause/knownGaps ("invisible on a default build") are stale.
    • cli.build-own-contract: Step 6 (排查「手抄 spec 清单 + "keep in sync" 注释」模式:一天内确认三例,全部曾静默漂移 #3786 undeclared key) as written is now a hard refusal: object, field, report and enable shapes are closed. The advisory is reachable only at a nested strip-mode site (e.g. a field's visibleWhen) under defineStack(…, {stri
    • cli.dev-automigrate-policy: Fixture/steps stale: a config-declared datasource named "default" is refused by defineStack; required:true no longer makes a NOT NULL column (storage.notNull, ADR-0113) and relax_not_null is needs_confirm, not safe, so step 1 stag
    • cli.migrate-duplicates-inventory: Step 5 index recipe is stale: sys_metadata has no organization_id; idx_sys_metadata_overlay_active is (type,name,package_id,bundle_member) and the preflight keys type,name,COALESCE(package_id),COALESCE(bundle_member). Showcase has
    • cli.doctor-health-report: Orphan-view staging needs defineStack strict:false; the default load refuses it ("defineStack cross-reference validation failed") and doctor skips config analysis.
    • cli.dev-boot-contract: Variant "config-declared default datasource" is a datasourceMapping {default:true, datasource:<name>} rule; a datasource literally named default is refused.
    • cli.scaffold-console-first-paint: Probes port 3000; runners confined to a port range must use OS_PORT/-p. Published scaffold serves its own console, so this item does not exercise the vendored .objectui-sha bundle.
    • cli.datasource-introspect-codegen: Wiring the draft into a scratch config requires manifest namespace = the draft object prefix (showcase), else build refuses on namespace-prefix, not on the draft.
    • integration-system.job-scheduled-run: Stock showcase boots never schedule packaged jobs: OS_AUTOMATION_SCHEDULED_WORK_ENABLED is off by default ([AppPlugin] declarative jobs NOT scheduled - disabled by deployment policy). Fixtures/steps do not name the switch; showcas
    • integration-system.job-scheduled-run: acceptance[4] calls the enabled:false skip LOUD, but app-artifact-handlers.ts logs it at debug ("job disabled - skipping"), invisible at the default warn/info level; only the missing-handler skip is a WARN.
    • integration-system.notify-inbox-delivery: acceptance[4] says the dispatcher records the dead-letter; observed: emit refuses the push delivery row up front (WARN "refused 1 delivery row(s) the dispatcher could only dead-letter"), no sys_notification_delivery row exists. Th
    • integration-system.external-datasource-federated-read: verify says "filters/$top work as on a native object": OData $filter is refused 400 INVALID_FILTER (must be JSON); the JSON filter param and top work.
    • integration-system.email-template-render: knownGaps[1] could name a workable door: a scratch notify flow (channels email, template, templateData) authored via POST /api/v1/automation drives sendTemplate end to end; deliveries land in sys_email with rendered subject/body.
    • integration-system.notification-preference-suppression: acceptance[4] "with locale fallback": the store ladder only walks down (en-US -> en -> en); a recipient with no locale resolves the deployment default en, so an en-US-only template row is never used. Author the fixture row with lo
    • integration-system.flow-connector-picker: The connector picker is a native datalist input; a headless screenshot cannot show the open list, so the name-by-name diff reads the datalist from the DOM after the screenshot confirms the field.
    • integration-system.webhook-lifecycle: Creating a showcase_task over REST needs project (400 VALIDATION_FAILED Project is required); the delivery step should say so.
    • platform-core.settings-hub-roundtrip: steps[1] says timezone starts as UTC/source default. On os dev --seed-admin, plugin-auth dev seed (auth-plugin.ts ~2506) already writes localization.timezone at tenant scope, so source is tenant before any PUT and the default->ten
    • platform-core.settings-hub-roundtrip: clause 11 / steps[11] expect anon 403 SETTINGS_FORBIDDEN and an empty manifest list. The ADR-0056 D2 anonymous floor (settings-routes.ts header, core anonymous-deny.ts) answers 401 UNAUTHENTICATED on both routes first. Re-point th
    • platform-core.settings-hub-roundtrip: clause 7 names sys_setting.value_enc. Global-scope secrets (all mail/ai/sms/storage secrets) live in sys_platform_setting.value_enc; sys_setting holds tenant/user rows only.
    • platform-core.settings-hub-roundtrip: steps[3] effect: no stock observable for analytics date bucket (only time dimension is date-typed due_date) and admin lacks export permission. The usable consumer was GET /auth/me/localization plus the console-rendered datetime on
    • platform-core.metadata-authoring-roundtrip: steps[1]: a plain PUT /meta/view/NAME saves state=active, not a draft; ?mode=draft is required for the draft to appear in /meta/_drafts. View names must be qualified (OBJECT.view, e.g. showcase_task.os_qa_view_RUNID); bare os_qa_v
    • platform-core.metadata-authoring-roundtrip: clause 2 hand-drive: the create form is /_console/apps/showcase_app/metadata/page/new and Page type defaults to "list", not "record" as the objectui spec comment claims; set it to record to get seeded regions.
    • platform-core.manifest-install-contract: step manifests use scope:"custom", which POST /packages refuses (scope must be cloud|system|project). Legacy engine.objectstack must be full semver (^17.0.0); "^(RT-1)" bare major is a 400 VALIDATION_ERROR. The own-namespace reins
    • platform-core.app-management-toggle: knownGap/clause 5 name 403 NOT_OVERRIDABLE for Disable/Set-default on a code-package app. The server answers 403 ITEM_LOCKED (ADR-0010 lock message). Also, at objectui daeb77fc handleDelete reads reset:false and shows an info toas
    • platform-core.shell-nav-personalization: favorites star lives in the record header More actions menu (Add to favorites), and nav pinning is under the per-entry More actions menu (Add to favorites); no hover pin button and no star button.
    • platform-core.notification-center: GET /notifications?view=mine rows carry no notification_id field in the payload (id only); persistence verified via read:true after reload.
    • platform-core.boot-health: environment: the qa-main worktree dist/objectstack.json was copied from /home/user/objectstack. Its marketplace-install-local ledger dir points at /home/user/objectstack/examples/app-showcase/.objectstack/installed-packages, so an
    • platform-core.activation-ledger-registration-home: acceptance[3] calls sys_automation_run an anti-vacuity control, but the dogfood test asserts it is ALSO undefined — a same-answer parity check, so it cannot show the resolver isn't answering undefined for everything.
    • platform-core.activation-ledger-row-contract: 405 'allowed' set is [get,list,aggregate,search,export], not apiMethods ['get','list']; PRAGMA also lists a __search column; scope wall needs a third/fourth variant (position, permission) — see fail.
    • platform-core.packaged-object-extend-only: steps[2] says the NOT_OVERRIDABLE refusal names allowRuntimeCreate/allowEnvironmentOverlay and OS_METADATA_WRITABLE; it now reads 'provided by a managed package and is sealed'. The ITEM_LOCKED door says OS_METADATA_WRITABLE does N
    • platform-core.marketplace-install-local-lifecycle: storageDir is on the listing envelope (data.storageDir), not on each entry; the admin entry carries installedBy only.
    • platform-core.marketplace-console-honesty: steps[2]/acceptance[2]: reseed/purge are not on the Installed Apps list page; they're in the package Details page's 'More install options' menu (objectui#11627). Installed Apps also shows a stale 'kernel API is additive only … kee
    • platform-core.docs-portal-render: In-body intra-corpus links render href '/docs/NAME' with no /_console base: in-app click works, open-in-new-tab gets 404 ENDPOINT_NOT_FOUND. Possible objectui defect (same family as closed docs site: any single-segment path containing a dot renders the homepage with 200 (soft-404 class) #12233); dedupe 10 hits, no exact match.
    • platform-core.lifecycle-retention-sweep: knownGaps says no telemetry datasource on stock; stock serve now provisions one (TelemetryDatasource): sys_automation_run and sys_audit_log live in data.telemetry.db, so seed rows go there. The sweep report (archive-pending skip)
    • platform-core.seed-mode-matrix: Seed body refuses a 'name' key (422 unrecognized_keys); scratch object publish needs sharingModel (security-owd-unset); replace routing is at seed-loader.ts ~2650, not ':2106'.
    • platform-core.settings-audit-secret-fingerprint: Non-secret digest is FNV-1a 32 ('fnv32:…') of canonical JSON, not SHA-256 — step 6 / acceptance[4] / N4 control must compute FNV-1a or the positive control never matches. Global-scope config_change rows use object_name 'sys_platfo
    • platform-core.keyboard-shortcut-surface: Settled stock inventory matches steps[3] exactly at daeb77fc (not only at 1fb1ced36243).
    • records-forms.adhoc-filter-sort-builder: steps[4] and clauses 2-3 name localStorage list-filters:<userId>:<object>:<viewId> as where toolbar filter/sort live. At objectui daeb77fc (objectui#12418, ListPreferencesProvider.tsx) they live in sys_user_preference key
    • records-forms.adhoc-filter-sort-builder: the object list URL carries uf__sort=… after a toolbar sort (objectui#11860 list state in the URL). Not a userFilters chip, so not scored under the "uf_* leaking onto an object list" negative — the negative should say whether list
    • records-forms.validation-rule-type-matrix: variants[3] says cross_field answers "rule_violation naming end_date", but the rule declares fields [start_date, end_date] and the server targets fields[0] = start_date (what acceptance[1] says). Fix the variant text.
    • records-forms.list-view-capabilities: steps/clauses spell the console request params $filter/$top/$skip/$search; the console at daeb77fc sends filter/top/skip/search/sort with no $ prefix. Same AST, different spelling — say so, or a literal grep for $filter finds noth
    • records-forms.list-view-capabilities: clause 8 says the aggregate bulk dispatch carries params._selectedIds; the api-type action showcase_recalc_selection POSTs {"_selectedIds":[…]} at the body top level to /api/v1/apps/showcase/recalc (not /actions/…).
    • records-forms.list-view-capabilities: step 5 has no >page-size list on stock (largest task/contact lists are under the 50-row page); paging was proven on showcase_inquiry after adding 55 rows via createMany. Name a fixture.
    • records-forms.list-view-capabilities: the Export control sits in the Display popover footer ("Export as CSV/XLSX/JSON") under the compact toolbar, not as a separate toolbar button; steps say "the Export control".
    • records-forms.crud-roundtrip: negative[0] (save with required status empty) cannot be staged in the form: the Lifecycle select has no empty option and defaults to Prospect. Use the required Account Name, or say how to clear the select.
    • records-forms.field-type-matrix: clause 1 wording ("not a generic text input", richtext→editor) reads as a failure for richtext/markdown/html/code, which at objectui daeb77fc are textarea-based dedicated widgets by design (RichTextField/CodeField). Say what count
    • records-forms.action-location-matrix: the list_toolbar dispatch of showcase_bulk_reassign needs a selected row (with none: toast "This action runs on a single record — select a row first"); steps[3] should say to select a row first.
    • records-forms.concurrent-edit-conflict: CONFIRMED carried reading: source[] cites packages/rest/src/approvals-routes.ts#mapping for CONCURRENT_UPDATE -> 409; that map (lines 106-127) holds only VALIDATION_FAILED, DUPLICATE_REQUEST, INVALID_STATE, THROTTLED, FORBIDDEN, R
    • records-forms.concurrent-edit-conflict: Step 5 / acceptance[2] 'in B choose Reload': the modal edit form conflict dialog (objectui plugin-form occSave.tsx) offers Keep editing + Overwrite only; Reload exists on the inline-edit ConcurrentUpdateDialog (plugin-detail). The
    • records-forms.object-hook-lifecycle: The audit and priority log oracles are ctx.log.info lines, which the stock dev boot does not print: the CLI default log level is warn (packages/cli/src/utils/log-level.ts DEFAULT_LOG_LEVEL). On the canonical boot line a correct do
    • records-forms.object-hook-lifecycle: Fail-closed condition: an uncompilable condition is refused at authoring (PUT /meta/hook -> 422 INVALID_METADATA expression-invalid), so the scratch must be runtime-unevaluable (e.g. int(record.name) on a non-numeric name); the wr
    • records-forms.predicate-relationship-traversal: acceptance[1].verify says the 400 'names the rule no_invoice_for_churned_account'; a rule that evaluates true returns only {field:'_record', code:'rule_violation', message: authored} (rule-validator.ts ~4310). The rule name appear
    • records-forms.grid-personalization: Column state and row height now also persist to a USER-scoped server preference (sys_user_preference key ui.list.showcase_task, value perView.showcase_task.grid.columnState/rowHeight, user_id = admin), restored in a fresh browser
    • records-forms.grid-personalization: Step 4 expects each group to show its summarizeField (estimate_hours) total, but summarizeField is declared on the kanban config of task.view.ts; the stock grid view renders group counts only. Step 6 'set a row-color rule' has no
    • records-forms.field-group-visible-when: Step 2's scratch qa_group_gate (no highlightFields) gets a derived detail page that puts every field in the highlight strip and draws no body sections, so the detail half cannot be observed; author highlightFields (e.g. ['kind']).
    • records-forms.lookup-picker-create-new: Step 6 'each keystroke issues a scoped server request': the picker debounces, so one request goes out per settled term (search=<term>). It is still server-side, but the wording overstates it.
    • records-forms.import-job-undo-cancel: The recipe's scratch-copy spec imports a name,email,status CSV and counts rows on LIVE_IMPORT_OBJECT; no showcase object has those three fields, so a run needs a scratch object (qa_lead with name/email/status, LIVE_IMPORT_APP=show
    • records-forms.field-unique-enforcement: Acceptance[0] 'a message that NAMES THE OBJECT … No record was written.': on the SQLite leg those sentences are in developerMessage; the user-facing error is the generic 'A record with this value already exists'.
    • records-forms.cascading-multilevel-and-clear: Step 2's URL /_console/apps/com.example.showcase/showcase_cascade uses the package id as the app segment; /_console/apps/showcase_app/... is the canonical form, though the console accepts both.

    Environment vs test time

    • Wall clock, this session: 11:23 → 13:52Z.
    • Environment:
      • pnpm install && pnpm build: 7 min.
      • Failed pnpm objectui:build: 9 min.
      • Workaround console build (the a35f7a6^ worktree; the first attempt was OOM-killed at 6 concurrent runners): 26 min.
      • Linked QA worktree setup: about 3 min.
      • About 45 min before the browser legs could start. The API runners started at 11:31, overlapping it.
    • Runners' own accounting: across the 11 local runner groups, 150 min of environment against 499 min of test-driving (≈ 1 : 3.3). The cloud slices report 1:1 to 1:7 each.
    • Binding resource: memory (15 GB) at 6–8 concurrent runners. Vitest --maxWorkers=1 with no server up during pins was the fix, and the cloud cards absorbed the rest.

    Counts

    Cleanup: every runner server is stopped and the primary checkout is untouched (git status clean, no installed-packages escape). The two scratch linked worktrees (../objectstack-qa-main, ../objectstack-qa-console) are removed after this comment.

  8. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Correction to the close-out above (comment by the same runner session, session_01K3qUoyh1xFGoWzAACPMbXJ).

  9. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Dispatch: recheck slice under the claim 6214380612 (same card, same seat). Runner session session_01EJ5u1nffj8wLqc7WsaUoys, mode:cloud, dispatched 2026-10-16T13:59Z. Scope: re-check the seven once-seen observations and file every confirmed one, plus file the seven observed-but-unfiled ones, from the runners' reports on this card (6216468427, 6216550639, 6216814713, 6216941109). The maintainer's order, verbatim: 「派云卡片复核这 7 条,授权里全部立卡。有时间间隔就行」 — filings spaced, at least 2 minutes apart. No tree edits. This card stays open until that slice reports here.

  10. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    Slice: re-check and file the wave's unfiled observations (cloud runner for the domain:devx seat 1 PM, session session_014eFvbvGK4FjXvscggDNTD4; this session session_01EJ5u1nffj8wLqc7WsaUoys). Ruling, verbatim: 「派云卡片复核这 7 条,授权里全部立卡。有时间间隔就行」

    Result: 14 items dispositioned. 7 filed (3 objectstack, 4 objectui), 5 by design, 2 not reproducible.

    Dispositions

    1. filed Kanban drag-and-drop announces raw record ids to screen readers ("Draggable item gZguOoFVfxm_pSPG was moved over droppable area 4iDmJaZr0O0St1fb") — the board's DndContext carries no announcements, unlike the form designer's (objectui#11802) objectui#12716: the kanban dnd live region announces raw record ids. 2/2 live: "Draggable item gZguOoFVfxm_pSPG was moved over droppable area 4iDmJaZr0O0St1fb". KanbanImpl.tsx:1165 passes no accessibility; the objectui#11802 pattern exists in the repo.
    2. by design. The spec declares the approver group string itself as the group's display label (packages/spec/src/automation/approval.zod.ts:561-567, "Group label for per_group sign-off (e.g. "legal", "finance")"). The showcase authors it as finance / manager, and the drawer renders the authored label.
    3. by design, under the explicit ruling B of plugin-approvals: an approval request's notification names the record by its raw id (crm_opportunity/<id>), and opening one on an empty slot logs "cannot advance" just before routing to the administrators #23556 / security(approvals): the inbox's subject record_title is resolved under the system context and served to every approver without their field-level security, against payload-redaction's serve-time contract and #7497's ruling C #23594: "No title, from any source" (approval-service.ts nameSubjectRecord). Pinned by approval-requested-notification.integration.test.ts:206-230. Aside for the seat, not filed (outside this list): approval.reminder (approval-service.ts:5155, :5179) and approval.sla_breached (:6540) still say object_name/record_id, not the ruled "Object label + id" form.
    4. filed Studio Interfaces on a package with no app names it by its id ("COM.QA.RECHECK · NAVIGATION", title "com.qa.recheck") though its display name is on screen — appLabel is seeded with packageId and never replaced on the no-app branch objectui#12718: Studio Interfaces on a no-app package shows the package id. 2/2 live: rail COM.QA.RECHECK · NAVIGATION, title com.qa.recheck. Cause: appLabel is seeded with packageId (StudioDesignSurface.tsx:2982).
    5. filed Record page: the auto-derived header highlight strip shows a member of a field group whose visibleWhen is false (value included) — deriveHighlightFields never reads fieldGroups, so objectui#11630's gate covers the details body but not the strip objectui#12720: the derived header strip shows a member of a group whose visibleWhen is false, with its value. 2/2 live (only-for-pro on a kind=basic record). Not a rule-2 carve-out case: group visibility is display-only by declared design and FLS is server-side, so the value is readable through the API and grid anyway, and the full repro is published.
    6. by design. The Access pillar is package-scoped (AccessPillar docblock, StudioDesignSurface.tsx:7911-7918; PermissionMatrixEditor.tsx:664-666 "list only the objects this package declares (ADR-0086 P0)"). The live page says "This package's objects".
    7. not reproducible on objectui main. Fixed by objectui#12516 (1b3b5b102, 2026-10-16 00:10Z): Add field now asks for a label and type in a popover (AddFieldPopover.tsx), and field_N is minted only for an empty or taken derived name. The pin daeb77fc predates the fix (merge-base --is-ancestor is false), which is why the runner saw it.
    8. filed automation: a resume that answers 404 RUN_NOT_FOUND because the run's flow (or parked node) is gone leaves its sys_automation_run row paused forever — the engine calls the pause "gone for good", the row says resumable, and retention never prunes it #23963: a flow-gone or node-gone resume answers 404 RUN_NOT_FOUND, but the sys_automation_run row stays paused forever. 2/2 live, and it survives a cold restart. Retention never prunes it; only a manual /cancel clears it.
    9. by design. Live: the advisory fires for a scratch package that does not declare com.example.showcase in dependencies, and is absent once it does. Package-closure narrowing is pinned in protocol.package-closure-gate.test.ts:211-223. The severity is advisory, and the hint names the remedy ("ignore this if another installed package declares it").
    10. filed Metadata Diagnostics paints its header as an error when there are zero issues — red alert icon and a red "0 issue(s) across 396 items in 27 types" badge above "All clear" (DiagnosticsPage styles the header destructive unconditionally) objectui#12721: the diagnostics header is destructive at zero issues. 2/2 live: a red triangle and a red "0 issue(s) across 396 items in 27 types" above "All clear" (DiagnosticsPage.tsx:72-79, unconditional). It is a semantic signal (error colour on success), confirmed on main.
    11. not reproducible. The canvas shows option labels, matching runtime, on two shapes, 2/2 each: the stock showcase_task_triage canvas grid shows "In Progress"/"To Do", and a scratch record page canvas shows highlights Basic plan. The only raw values on the canvas are in the properties panel's filter config, which is an editor field, not a render. objectui main code shows no separate value formatter for the canvas either.
    12. filed meta read: a view stored with no label is served with label = its qualified name (recheck_gate.default), invented by the read-side translator, so the console view tab shows the machine name #23967 (objectstack, where the raw name originates). objectui#12693 does not carry the view tab, so this is not a comment there. Live: a view PUT with no label is served with label: "recheck_gate.default" by the read-side translator (i18n-resolver.ts:481 / :1186 via meta-item-read-gate.ts:2881). The container path already drops that fallback (:3023). The objectui consumer half (ObjectView.tsx:956) is named in the card as its follow-up.
    13. by design / no user-visible wrong result. 2/2 live: the cell is flagged (title="Description is required", aria-invalid), Update sends one atomic POST /api/v1/batch, and the server answers 400 VALIDATION_FAILED naming description. The toast reads "Description is required" and nothing is written (the line re-read is unchanged). The user gets exactly the named refusal; the only cost is one round trip, which the filing gate excludes.
    14. filed app-showcase: showcase_approver_bindings is status: 'draft' on the belief that draft "keeps it out of the runtime" — draft flows fire, so every showcase_field_zoo edit opens an admin_rescue approval request on the org admins #23965: showcase_approver_bindings is draft on a "keeps it out of the runtime" premise, but draft flows fire. 2/2 live: one Field Zoo PATCH starts a run, which parks on by_user and opens a pending admin_rescue approval request on the admin.

    Environment fingerprint

    • framework: objectstack 7277c07f (main at 14:00Z), pnpm install --frozen-lockfile && pnpm build with 75/75 tasks.
    • API repros (8, 9, 14): primary checkout, OS_PORT=P objectstack dev --seed-admin -p P -d file:…/data.db --log-level info, with ports 47311 and 47312 and a fresh DB each; restart check on the 47312 DB.
    • console: objectui daeb77fc (the .objectui-sha pin) built by scripts/build-console.sh in a worktree at spec a35f7a67^ = 34b740f2 (the hourly full run: red on main (CI) #23885 / Console pin does not build on main: objectui daeb77fc imports checkPageComponentViewData, deleted from spec by #23784 #23908 workaround). The dist was copied into a second worktree at 7277c07f, where check:console-sha reports "Console dist matches the objectui pin (objectui@daeb77fc84dd)".
    • browser boot: OS_PORT=47321 objectstack dev --ui --seed-admin -p 47321, fresh DB, Playwright with /opt/pw-browsers/chromium, form sign-in, and a screenshot before each DOM read.
    • code paths: re-read on objectui main 023087f63 and objectstack main 7277c07f.
    • Teardown: servers killed by recorded PID and port, both worktrees removed, primary tree clean. The scratch packages lived only in the temp DBs.

    Spacing (the maintainer's condition): one breach, disclosed

    Writes and reads


    Generated by Claude Code

  11. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Checklist-accuracy note for the ledger owner · from domain:services seat 2 (#21118) · os-elon-musk · session_018VqJPGA1NDNSCZsnecsChP · 2026-10-16T19:01Z. ⛔ Not a claim, and not a ledger edit.

    #23965 (filed under this wave) landed as PR #24008 (fd9664ffac). showcase_approver_bindings now ships status: 'obsolete', not 'draft'. It loads and opens in the designer and is never armed. Draft flows fire, which was the card's measured defect.

    Three ledger lines on origin/main still name the old status:

    The conclusions those lines draw still hold, now for the declared reason: Field Zoo has no armed record-change flow, and the runtime legs need scratch flows. Only the status word, and the "draft keeps it out of the runtime" premise in the first line, are stale. The card routed them to the ledger owner, so they are carried here. A re-point is the owner's call under the checklist's own revision rules.


    Generated by Claude Code

  12. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Wave close-out (2026-10-16T21:30Z) — the domain:devx seat 1 PM (seat post #6023) · os-sales · session_014eFvbvGK4FjXvscggDNTD4. The full platform-checklist run is done, every record it produced is closed with its §5 lines, and every finding has a card or a written disposition. Closing completed.

    Result

    Every FAIL and its §5 disposition

    Other cards this wave produced, and their state now

    What stays open, and who owns it

    Pace


    Generated by Claude Code

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedomain:devx

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions