Skip to content

QA run · surface:build (7/7) · 251a7dd4 · 2026-10-04 · 6 PASS / 0 PARTIAL / 1 FAIL / 0 BLOCKED / 0 NOT-RUN #21722

Closed

Description

@objectstack-fleet

17.7 pre-release verification, non-browser half: every runnable surface:build item against origin/main at the run's start. Sibling records for the same subject cover surface:api and surface:cli. Text only.

Environment fingerprint

  • Framework (subject): 251a7dd4, dedicated detached worktree, pnpm install --frozen-lockfile && pnpm build → exit 0. Gates and the CLI run from the subject tree; every authored fixture lived in scratch copies under /tmp/qa1770/L13 (node_modules symlinked), never inside a checkout. One boot (connector file refs) on lane ports 43301–43309.
  • Execution: lane L13 + verifier V5 (RUNNER rule 7), Claude Code session session_018zT8d8NpiQ1ExhuNd5TxY6, 2026-10-04 10:04–10:53Z (≈ 12 min environment, 37 min testing).

Scope

node scripts/checklist-select.mjs surface:build --json → 7 runnable items, none hidden.

item rev verdict evidence (build / gate / pin)
api-backend.formula-gates 2 PASS dist formula runtime: today(), ternary null, floor/ceil; date-arithmetic formula fails os build with rule expression-invalid and the fix
api-backend.enforce-or-remove-authoring-gates 2 FAIL A1 retired filter operators ($regex) are refused at runtime only, by design — assertion defect; A2–A4 pass
api-backend.retired-def-refusal 1 PASS 5 sampled retired defs + control: human exit 2 / --json exit 1, prescriptions where a carrier exists, runtime 400/422
api-backend.rest-route-generation-tombstones 1 PASS rest parse-not-cast 25/25; five tombstoned routes.* keys throw at construction and at plugin start, tsc flags them
cli.build-own-contract 4 PASS format.exit-code 4/4; exit codes 0/1/2 stable, --json payload shape, os compile identical
i18n.build-gates-hold 2 PASS bundles in sync (9 packages), self-tests red-and-distinct, drift in a /tmp farm → exit 1, missing CLI dist → exit 3
integration-system.connector-spec-path-no-escape 2 PASS absolute and escaping file refs abort boot; a missing file is fatal at boot, logged on reload with the old instance kept

Totals: 6 PASS / 0 PARTIAL / 1 FAIL / 0 BLOCKED / 0 NOT-RUN. No product defect.

Fail — disposition

api-backend.enforce-or-remove-authoring-gates A1 — assertion defect. Copy the showcase; set showcase_expense_report.rejected_count summaryOperations.filter to { status: { $regex: 'rej' } }; os build → exit 0 (twice), $regex kept in dist/objectstack.json. The clause demands parse/build rejection for the retired-filter-operator registry, but that registry is declared runtime-refused only: RETIRED_FILTER_OPERATORS "does not reject anything… the spec declares, the existing refusal sites enforce" (filter.zod.ts, 85d95e7d92, #5701 / #5752 — one day before the clause), and the semantic migration 17.filter-regex-options-retired records that a stored { $regex } "parses GREEN and always will". Runtime refusal holds: GET /api/v1/data/showcase_task?filter={"title":{"$regex":"a"}} → 400 INVALID_FILTER naming $icontains. The seed-time "roll-up summary recompute FAILED … STALE" alongside success: true that this fixture produces is declared behaviour too (seed-loader.ts, #4998). Verifier V5: CONFIRMED.

Close-out follows in a comment.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 4, 2026

    @objectstack-fleet
    ContributorAuthor

    Close-out

    Parked-on: #21735 · api-backend.enforce-or-remove-authoring-gates · acceptance[0]
    

    No product defect extracted.

    Candidate observations — not verified, not extracted

    • defineConnector() strips an undeclared key silently (the ConnectorSchema.parse strip runs before defineStack's lint); the same key on a raw connector literal warns.
    • A load-time ObjectSchema.create schema error prints the raw ZodError (49-value enum dump) with no object or file named.
    • The tsc tombstone text on RestServerConfig points at os validate, which does not read embedder REST config.

    Checklist-accuracy findings

    1. enforce-or-remove: step 4's "pure display annotation" strip-by-design key no longer exists after 未知键静默剥离仍是全仓默认:把 #3405 的 strict 收紧从一个 schema 推广到整个可授权面(ADR-0078 完整性闸门) #4001 — suggest the retired-default residue (allowRestore: false); step 2's ObjectSchema.create accepts $regex.
    2. cli.build-own-contract: step 6's undeclared-key example is now a hard error on fields; the 排查「手抄 spec 清单 + "keep in sync" 注释」模式:一天内确认三例,全部曾静默漂移 #3786 advisory is reachable only through a raw connector literal; step 3's formatZodErrors path is effectively unreachable (defineStack validates first).
    3. rest-route-generation-tombstones: the pin's §E drives batch.defaultAtomic, only §B drives a routes key through the plugin; 'plural' and a routes-level unknown-key control are unpinned.
    4. retired-def-refusal: most entries (Route 3) have no authorable door; the agent runtime door needs OS_METADATA_WRITABLE=agent to reach validation.
    5. formula-gates: the showcase example is record.f_date < today(), not due_date == today().
    6. i18n A3: the red verdict names the package and a count, not the bundle file.

    Generated by Claude Code

  2. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    ContributorAuthor

    Close-out verified: closed completed

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-06T16:01Z. The maintainer approved clearing the open qa-run records' close-out debt: 「同意,动手」. This was audited row by row (read-only) against checklist-test §5 before this write.


    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

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions