Repository navigation
Description
domain:devx#1 · os-warren · session_01JQwxbZx1yZXiTrFXKbSdFZ
Part of #27377 (wave 4, Tier 1 live legs, card W4-L1)
Selector release-18.3.0-w4-l1: the live legs of the 40 Tier 1 items in access-security, ai, api-backend, approvals, attachments-storage, automation and cli whose pins record #28929 (W4-C2a, same subject) left a clause partial, skipped or blocked. Release-candidate rerun (SKILL §5 trigger 1), approved by the maintainer on 2026-11-02 07:06Z. Every item has a verdict: 37 PASS / 2 PARTIAL / 1 FAIL / 0 BLOCKED / 0 NOT-RUN. No item is planned.
Coverage mode: this card drove the live legs, not the pins. Its targets were the 137 clauses #28929 scored below pass (88 partial, 43 skipped, 6 blocked). Each was judged live on a booted stack (HTTP, CLI or browser, as the clause asks). The 63 clauses #28929 scored pass keep that verdict and were not re-run. Item verdict = the #28929 verdicts plus the live verdicts here (RUNNER.md "Verdicts"). Of the 137 targets: 125 pass, 6 fail, 6 blocked, 0 skipped.
Environment fingerprint
- Subject: framework
7fa9873f38f7a0158e3ce17338dcc0f446b113e3(detached, never followed main or the Version PR chore: version packages #26517).ui/is in the same tree; the console was built from it. - Build:
pnpm install --frozen-lockfile(37 s),pnpm exec turbo run build --concurrency=2: 118/118 tasks, 0 cached, 17m21s;pnpm console:build: 72/72 (71 cached),packages/console/distready.check-dev-prereqs: 106 package artifacts present. - Node 22, pnpm 10.31.0, Playwright chromium from
/opt/pw-browsers. 4 CPUs, ~15 GB. This container holds one address, 192.0.2.2 (TEST-NET-1). - Boots: every boot ran from a scratch copy of
examples/app-showcase(tar copy,node_modulessymlinked) so no install, upload or datasource file escaped into the shared tree, with its own port (41611–41674) and file DB:
OS_PORT=P OS_STORAGE_LOCAL_ROOT=… OS_HOME=… setsid node packages/cli/bin/run.js dev --ui --seed-admin --no-compile --no-watch -p P -d file:…/data.db.
Variants: a walledgroupboot (OS_TENANCY_POSTURE=group, OS_PLATFORM_OWNER_EMAIL=admin@objectos.ai, OS_AUTH_MEMBERSHIP_POLICY=invite-only; /auth/config read tenancyPosture "group"); scheduled work on (OS_AUTOMATION_SCHEDULED_WORK_ENABLED=1) beside a default boot; SIGTERM then cold boot over the same DB for the restart legs; OS_MCP_SERVER_ENABLED=false; four MCP OAuth host boots (unheld 10.0.0.5, held 192.0.2.2 with and without OS_ALLOW_INSECURE_OAUTH_HTTP, https via--cert/--key); a wall-clock offset shim for the SLA leg;NODE_ENV=production os servefor the automigrate warning; a local verdaccio 6.11.1 carrying the subject's 74 packed@objectstack/*packages for the scaffold's pre-release leg. - Browser legs: the boot's own
/_console, form sign-in (cookie + bearer), at most three Chromium sessions at once card-wide. - Seed:
--seed-admin(admin@objectos.ai), the showcase demo personas, and members minted by admin create-user + change-password; runtime fixtures in scratch packages are named in their rows. - Times: 2026-11-02 07:13Z (checkout) to 07:59Z (last verdict).
- Execution: the card session built the tree and dispatched seven runner subagents (effort high, one area group each, own ports and DBs); it checked each runner's evidence against its rows before writing this record.
Scope: selector and the revision each verdict is valid for
- access-security (5): fls-mask-and-strip r8, grant-table-write-contract r8, me-permissions-aggregation-parity r4, record-access-explain r4, share-link-landing-page r6
- ai (5): mcp-coded-refusals-and-runtime-exposure r4, mcp-http-surface r8, mcp-oauth-private-host-transport r6, mcp-validate-expression r6, skill-instructions-mcp-prompts r4
- api-backend (2): action-activation-door-contract r7, bulk-write-contract r6
- approvals (4): act-door-and-admin-rescue-slate r5, email-action-token-door r10, request-page-reply-and-reader-visibility r5, status-mirror-field r6
- attachments-storage (9): attach-requires-parent-edit r9, download-authz-both-sides r10, inline-grid-receipt-cells r5, orphan-tombstone-reap r4, presigned-upload-roundtrip r3, read-inherits-parent-rls r9, sys-file-status-pipeline r5, upload-limits-scope-and-ownership r4, upload-session-abort r8
- automation (10): durable-suspend-restart r4, flow-authoring-refusals-v18 r5, flow-registration-verdict-on-read r2, flow-run-semantics-v18 r3, inbound-hook-timestamped-signature r2, paused-run-trigger-record-masked r5, scheduled-work-opt-in r2, screen-flow-roundtrip r7, setup-packaged-automation-board r10, trigger-type-matrix r10
- cli (5): dev-automigrate-policy r8, migrate-meta-write-stored-and-all r3, scaffold-first-run r7, validate-v18-authoring-verdicts r2, verify-derived-proof-families r3
Reproduction rules
1. automation.setup-packaged-automation-board · A0, A1, A2, A3, A5, A6 · FAIL (stale spec)
The item still describes the Setup › Packaged automation page whose flows half #28785 retired (merged 2026-11-01; ADR-0146 D11 retires the page's flows half, D4 moves the flow switch to the Studio Automations pillar and clone to Studio's New similar).
- Boot the stock showcase; sign in as admin.
GET /api/v1/meta/app?id=setup.- Expected (A0): group_apps holds
{id: nav_packaged_automation, type: component, componentRef: automation:packaged}. - Actual: it holds
{id: nav_packaged_actions, componentRef: automation:packaged-actions, label: Packaged Actions};nav_packaged_automationoccurs 0 times.
- Expected (A0): group_apps holds
- Open the Setup sidebar in the console. It shows "Packaged Actions" and no "Packaged Automation"; the link lands on
/_console/apps/com.objectstack.setup/component/automation/packaged-actions(heading "Packaged actions"), which lists nopackaged-flow-*rows, no flow switch and no flow Clone (A1, A2, A3's flow half, A5's toggle cells, A6). - Type
/_console/apps/com.objectstack.setup/component/automation/packaged: it redirects to/_console/studio/com.example.showcase/metadata/flow?package=com.example.showcase.
- The replacement surfaces, measured live: Studio
auto-ledger-switchtoggles a flow and the state persists across a reload and in the activation row (what A2 asks); Studioauto-new-similar-*opens the dialog A6 asks for, validates name and label, and shows the 400 sentence inrole=alert; the Studio rail andGET /api/v1/automation/_statusboth list 32 flows (A1); the Packaged actions page carries the actions half with no clone (A3); a 409 on the switch shows verbatim in Studio's refusal strip, which has norole=alert(A5). A4 and A7 pass live. - Reproduced twice: two browser runs of the Setup nav and page and two of the Studio replacement, each on a fresh form sign-in, plus two API reads of the nav. Self-check: testid/role targeting, screenshot before DOM reads, member cells in their own context with get-session confirming the identity, console built from this tree (the redirect matches
ui/at the subject). - Disposition: stale spec. The re-point is already carried by QA checklist: rewrite the Setup-designer items to the Studio door and add the .custom customization journey, with one live e2e through Studio #28579 (open, ADR-0146 rollout N-29), whose list names this item; no new card.
Derived item verdicts
- PASS (37): every item not listed below.
- PARTIAL (2):
- api-backend.action-activation-door-contract: A4
blocked(fixture, knownGaps[3]). The metadata-plane 503 arm fires only whenresolveRouteActionDeclarationcatches a throw from the metadata plane, and no stock request reaches it; the 404 and zero-ledger-row halves of A4 held live. - approvals.email-action-token-door: A0, A1, A3, A4, A5
blocked(fixture, knownGaps[0]). Re-confirmed at the subject:issueActionTokenshas no production caller, so no approver email or notification mints an action token. The live at-rest reminder read and the dead-link page held.
- api-backend.action-activation-door-contract: A4
- FAIL (1): automation.setup-packaged-automation-board (stale spec, rule 1 above).
Delta against the pins record (#28929, same subject)
- PARTIAL→PASS: 37. PARTIAL→PARTIAL: 2 (the two above). PARTIAL→FAIL: 1 (setup-packaged-automation-board: QA run · release-18.3.0-w4-c2a (63/63) · 7fa9873f · 2026-11-02 · 21 PASS / 40 PARTIAL / 2 FAIL / 0 BLOCKED / 0 NOT-RUN #28929 recorded five clauses
blocked(dependency, #28785); driven live, the retired surface is measured and the clauses fail as stale spec).
Delta against wave 3 (#27409, at c4c515a)
- PASS→PASS: 29 · PARTIAL→PASS: 9 · PARTIAL→PARTIAL: 2 · PARTIAL→FAIL: 1 · PASS→FAIL: 0 · PASS→PARTIAL: 0.
- PARTIAL→PASS (9): ai.mcp-oauth-private-host-transport (r6 stages A0 with an unheld literal), approvals.status-mirror-field (SLA cascade driven with a clock shim), approvals.request-page-reply-and-reader-visibility (reader grant and the reader flag staged live in a scratch package), attachments-storage.read-inherits-parent-rls (bounded probe reached with a >2000-row federated object), attachments-storage.sys-file-status-pipeline, attachments-storage.orphan-tombstone-reap and attachments-storage.upload-session-abort (failure legs staged live: behind-hook insert, EISDIR byte path, immutable parts dir, removed part file), automation.paused-run-trigger-record-masked (runtime object with an
internal: truefield and a member persona). - PARTIAL→PARTIAL (2): api-backend.action-activation-door-contract and approvals.email-action-token-door, same gaps as wave 3.
- PARTIAL→FAIL (1): automation.setup-packaged-automation-board. Wave 3 judged the page before feat(setup): retire Packaged automation's flows half; Packaged actions is its own Setup entry #28785 retired it; this is the retirement, not a regression.
Off-clause probes (RUNNER rule 8)
About 40 agent-minutes in all, after the clauses had verdicts, on the same boots and personas (admin, demo personas, minted members, auditor, anonymous; walled org admin and members).
- access-security (~6 min): security/explain with unknown/empty ids and cross-user callers; FLS filter/orderby/fields on masked keys; /me trio with empty
userId=, trailing slash, garbage bearer; walled grant-table writes naming another org, unknown or empty user and set ids; share-link tokens (empty, whitespace, suffixed, upper-cased), ineligible records, unknown audiences, another member's links. Finding: a share link'sredactFieldsaccepts a field the object does not have (extracted). - ai (~5 min): MCP tools with missing, unknown, empty and wrong-typed arguments as admin, auditor, anonymous and a bogus key; prompts/get; /mcp/skill variants. Finding: a malformed
paramsanswers JSON-RPC -32603 "Internal error" carrying a raw Zod issue array instead of -32602 (extracted). - api-backend + approvals (~6 min): createMany/updateMany/deleteMany boundary payloads, owner spoofing, /batch unknown ops; the act page with dead token shapes; reply door; activation door shapes. Finding:
deleteMany {"ids":[""]}refuses with the sentence "requires 'ids' to be an array" and an emptyfields[](extracted). - attachments-storage (~5 min): unknown/empty ids on every storage door, presign size/name edges, oversize PUT then complete, acl flips by non-owners, admin completing a member's upload. No finding.
- automation API (~4 min): run reads and resume by readers outside the scope, unknown and mismatched run/flow names, runs
limitboundary, hook door bodies and clock skew. No finding. - automation browser/CLI (~9 min): screen and resume doors with unknown runs, extra keys, blank values, terminal runs, cross-flow names, member and anonymous; PUT /meta/flow name mismatch, bad names, empty body. Findings: a text field stores an object or array as its JSON text (extracted); Studio's refusal strip has no
role=alert, so a refused flow switch is not announced (extracted). - cli (~5 min): invalid autoMigrate values, empty verify families, invalid scaffold names, a non-empty current directory,
migrate meta --storedover an absent database. Findings: a current-directory scaffold overwrites the user's existing files (extracted);os migrate meta --stored --jsonover an absent database answersclean: true(added to cli: os migrate meta --json answers an empty (--from 18) or inverted (--from 19) range like a clean replay; the "replayed nothing" warning exists only on the human path #28947, same class, different door). - No security finding.
Time: environment prep vs testing
- Environment prep: checkout + install + full build + console build 07:13Z–07:33Z (about 20 min wall), plus about 35 agent-minutes of per-runner scratch copies, boots, personas and fixtures (incl. ~6 min verdaccio pre-release registry).
- Testing: seven runners 07:33Z–07:59Z (26 min wall), about 75 agent-minutes of clause driving plus about 40 of probes.
- Ratio about 1 to 2. Wall clock to the last verdict about 46 min.
Per-clause verdicts
One row per TARGET clause (the clauses #28929 left below pass), with the layer and one line of text evidence. The tables are in the two comments below. The #28929 pass rows are not repeated.
Checklist-accuracy findings, fixture gaps and pin-promotion candidates from this run are parked on #27377 (anchor comment), not extracted.
Activity
objectstack-fleet commentedon Nov 2, 2026
domain:devx#1 · os-warren · session_01JQwxbZx1yZXiTrFXKbSdFZ
Per-clause verdicts (1/2): access-security, ai, api-backend, approvals. Live legs only; the #28929
passrows keep their verdict and are not repeated.access-security
ai
idspelling → -32602 namingid→recordIdgit grep OS_ALLOW_INSECURE_OAUTH_HTTPfinds it only in ai.json, plugin-auth CHANGELOG.md and two test filesrecord.estimate_hours."; 'record.estimate_hourz * 1' → ok:false, error unknown-field "did you meanestimate_hours?" (params.suggestion); 'record.title * 2' → ok:true, warning type-mismatchstring * int, errors []api-backend
approvals
Generated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
domain:devx#1 · os-warren · session_01JQwxbZx1yZXiTrFXKbSdFZ
Per-clause verdicts (2/2): attachments-storage, automation, cli. Live legs only; the #28929
passrows keep their verdict and are not repeated.attachments-storage
automation
config.secret…"} while item.status reads active; same after the cold bootmanage_metadatacapability." (exact). Stale spec{record.owner}and text token{record.name}-> expression-invalid at flows[32].nodes[1].config.fields.owner / .config.title (names CEL envelope /(double-brace record.name template)); record.x in autolaunched no-entrance flow and user.id -> expression-invalid at .config.recipients (names current_user.id);$xscreen field, outputVariable:42, notify bogusKey, dangling edge (edges.2.target), repeated edge (edges.2), job retryPolicy.maxRetry (did-you-mean maxRetries), try_catch retry.maxRetry, anonymous armed-rateLimit endpoint -> runAs:'system' flow (apis.3.authRequired, ADR-0138 D2b) -> STACK_SCHEMA_INVALID with the contract sentence at the located path. os build corroborates (bogusKey exit 2, record.x exit 1 "Author-time rules failed … expression-invalid", control exit 0). N0 holds: no arm validated cleancli
pnpm pack, scripts ignored) on local verdaccio 6.11.1 :41671 with no uplink for@objectstack/*/ create-objectstack (GET /create-objectstack404 before publish); repo bincreate-objectstack.js qa-first-run -t blank --skip-skillsexit 0, pnpm install ran, no "Dependency installation failed", node_modules/@objectstack/cli 18.2.0; lockfile integrity of all 60@objectstack/*entries == local tarball sha512 (60/60);npm run validate0,npm run build0;npx os start --artifact ./dist/objectstack.json --port 41672health 200{"status":"ok","version":"18.2.0"}on try 7 of 30,/api/v1/ready200{"status":"ready","state":"running"}os start --artifactof the scaffold booted healthy, server.log has no protocol refusal line ("✓ Server is ready", Mode production); scaffold pins 18.2.0 == candidate tarballs, so no RC-window skew appliesqa-skills): "Installing AI skills … from @objectstack/skills@18.2.0", "Found 11 skills in node_modules"; .claude/skills SKILL.md dirs (sort -u) == node_modules/@objectstack/skills/dist/skills SKILL.md dirs, 11 = 11, SET-EQUAL, 0 symlinks, no .agents left, no dogfood-verification. GitHub-path probe on a freshskills-probescaffold:npx -y skills add ‹checkout›/skills --all --copy(skills 1.7.4) exit 0, installed 11 == curated skills/ 11, SET-EQUAL; repo-root--list"Found 11 skills", dogfood-verification hits 0. N0 heldos dev, scratch app, config-declared sqliteqa_main+datasourceMapping [{default:true, datasource:'qa_main'}], autoMigrate 'safe'): three drifts staged (nn_field storage.notNull dropped = needs_confirm;doomedremoved = destructive; legacyqaam_item_uq_field_uniqueplanted on the stopped file = safe). Safe boot 1 log: exactly one[schema-drift] auto-reconciled replace_unique_index on qaam_item.uq_field, nn_field and doomed still warned; qaam_item dump 6793ff21f5b775e7 → 1017b7100dcac006 (legacy index gone, tenant-scoped index kept). Safe boot 2: no auto-reconciled line, dump unchanged (converged)[schema-drift]warnings (line sets diff-identical across boots), 0 auto-reconciled lines; full-schema dump 33d4895c3ad4976b and qaam_item dump 6793ff21f5b775e7 byte-identical before boot 1 and after boot 3 (legacy index still present). N1 heldNODE_ENV=production os serve objectstack.config.ts, OS_AUTH_SECRET + 64-hex OS_SECRET_KEY, legacy index re-planted, autoMigrate 'safe' declared): log carries verbatim[schema-drift] autoMigrate='safe' is ignored under NODE_ENV=production — schema is never auto-altered in production. Run 'os migrate' deliberately., the three drift warnings, 0 auto-reconciled; "✓ Server is ready", Mode production; dump before == after (legacy index kept)doomedand needs_confirmnn_fieldwarned on safe boot 1 and again on safe boot 2, never applied (dump still carriesdoomed textandnn_field text not null). schemaMode gate, both sides on one side datasourceqa_side(autoMigrate 'safe', legacyqaam_side_code_uniqueplanted): schemaMode 'external' boot → no drift line for qaam_side, side.db dump unchanged (legacy index kept); same config with schemaMode 'managed' →[schema-drift] auto-reconciled replace_unique_index on qaam_side.code, index gone. N0 heldos migrate meta --from 17: "427 manual change(s) require your judgment" + one line "21 more manual change(s) not listed: their surfaces are absent from this stack (run with --all to list them).";--all: "21 manual change(s) whose surfaces are absent from this stack (listed by --all)" with 21 "absent: nothing is declared under…" lines (0 in the default run); --json todos 448, absentTodos 21{id:'{record.id}'}and CEL control{dialect:'cel',source:'record.id'};os migrate meta --stored --json: scanned 2, canonical 1, skipped 1, row qa_meta_refused todos[0] conversionIdflow-value-slot-template-dialect-refusedpathflows[0].nodes[1].config.filter.id; text mode printsTODO flow-value-slot-template-dialect-refused: "{record.id}" left as stored at flows[0].nodes[1].config.filter.id …and "☐ TODO: 1 site(s) in 1 row(s) are left as stored"; DB sha unchanged (preview)created_atx→ validate exit 1 "defineSeed('showcase_task'): unknown field(s) … records[0]:created_atx… Did you mean 'created_at'?", build exit 2;record["typo"]→ rule expression-invalid at objects[16].validations[1].condition "unknown fieldtypoonshowcase_project", build exit 1; datasource twice → STACK_CROSS_REFERENCE_INVALID "declared twice … stack.datasources[0] and stack.datasources[1]", build 2; cbp master_detail required:false → ObjectSchema.create('showcase_invoice_line') fieldinvoicecontradiction, build 2; object-grid defaultFilters → component-props-invalid at pages[19].regions[1].components[2].properties.defaultFilters, build 1; email {apiKey:'x'} → STACK_SCHEMA_INVALID "email: Unrecognized key(s) …apiKey" prescribing OS_EMAIL_API_KEY, build 2. Every arm: no "Validation passed", no dist/objectstack.jsoncreated_at(stock),record.name == "record.typo"literal in the same rule, cbp master_detail required (stock),email: { provider: 'log' }: each validate --json exit 0 valid:true, text "Validation passed", build exit 0 with artifactos verify --X --jsoneach exit 0, top-level hardFailures 0, family key present: referenceShapes (24 fields, 8 proven, 0 holes, 16 inconclusive), deleteBehaviors (9 proven, 0 contradicted), uniqueScopes (1 proven), parentWriteReach (2 objects proven, 180 held), dashboardWindows (17 widgets proven, 273 probes held) — summary.hardFailures 0 in all fiveGenerated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
domain:devx#1 · os-warren · session_01JQwxbZx1yZXiTrFXKbSdFZ
Close-out for this record (SKILL §5).
One item failed,
automation.setup-packaged-automation-board, on six clauses that pin the Setup › Packaged automation page #28785 retired: a stale spec whose re-point #28579 already carries (run evidence posted there). Six product defects observed beside the clauses are extracted; each passed the pm-dispatch filing gate (class ①). A seventh,os migrate meta --stored --jsonattesting clean over an absent database, is the same family as the open #28947 and was added there as a comment. The two PARTIAL items' blocked clauses and the checklist-accuracy lines are parked on the wave anchor.Observations below the filing gate stay in this record only: the bounded-probe warning's remedy "scope by parent_object" does not end the truncation when one parent object alone holds more than 2000 rows (log advice only); an admin may attach a file to a record of a read-only federated object (the join row is in the primary DB); stock showcase notify flows end
failedon a task with no assignee (the notify contract working on optional data); MCPget_recordwith an empty id says "Record not found" (wording only).No security finding.
Generated by Claude Code