Skip to content

cli: os build does not run the __c extension-field judge that os validate runs (#28564 follow-up) #28727

Closed

Description

@objectstack-fleet

domain:server#1 · os-project-manager · session_01R1q2xdtYgU6FKrZ7LgjPCC

Filing gate: ① an open question from the #28564 dev (os-dev-report 6560057796, open_questions[0]), answered by server seat 1 as option A: a follow-up card. Filed by domain:server seat 1. ⛔ Not a claim.

Reach: os build emits dist/objectstack.json for a package whose object or objectExtensions field breaks the __c reservation (ADR-0146 D10), while os validate refuses the same source once #28564 (PR #28724) lands. That is the same build/validate gap #28643 (PR #28681) closed for the override-declaration judge, which emptied VALIDATE_ONLY_GATES.

Wanted

  1. packages/cli/src/commands/compile.ts calls the one __c judge metadata-protocol + cli + install-local: __c extension fields only in a .custom package — refused at save/publish/restore, os validate, both install doors and duplicate #28564 exports (findExtensionFieldSuffixRefusals through @objectstack/metadata-protocol), at the same early position fix(cli): os build runs the override write gate os validate runs #28681 used, ahead of every artifact write, with the same refusal text and a non-zero exit.
  2. Move the judge's row in packages/cli/test/validate-build-gate-parity.test.ts from VALIDATE_ONLY_GATES to the shared set.
  3. Tests: os build refuses case (a) and case (b) with nothing written; a .custom extension field region__c builds. One ablation.

Declarations expected: Clause-②: no (narrowing) (a narrowing on a spelling with a measured count of 0), so a contract review at CONTRACT_REVIEW_TIER is owed.

Blocked-by: #28564 (PR #28724).

Dedupe: searched os build __c, extension field suffix build; only #28564 and #28643.

Links back: #28564, PR #28724, #28643, PR #28681, ADR-0146 D10


Generated by Claude Code

Activity

  1. added
    bugSomething isn't working
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    domain:serverDomain lane — seat card indexed by label:pm:seat
    and removed on Nov 1, 2026
  2. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#1 · os-project-manager · session_01R1q2xdtYgU6FKrZ7LgjPCC

    Claim: PM loop round 1 · card thread · 2026-11-01T16:37Z
    Session: session_01R1q2xdtYgU6FKrZ7LgjPCC (the seat); the card thread is session_01FEkQ5oPz5wWFMzWjTGyVUb
    Account: os-project-manager (the seat's linked user; the card's assignee)
    Branch: claude/project-thread-0fsk8u (the card thread's harness-pinned branch; it names no issue, so this claim is the identity record)
    Worktree: the card thread's own container checkout
    Domain: domain:server
    Seat: domain:server#1
    Ruling-ref: 「定级你可以自己决定」 (Leehom, 2026-11-01T12:11Z); seat 1 filed the card as p3 from #28564's open question, answered as option A.
    File surface: packages/cli/src/commands/compile.ts (one call to the existing findExtensionFieldSuffixRefusals walk, beside #28681's override gate), packages/cli/test/validate-build-gate-parity.test.ts (the row leaves VALIDATE_ONLY_GATES), their tests, and a @objectstack/cli changeset. ⛔ No packages/spec/**, ⛔ no packages/metadata-protocol/**.
    Container & model: S, mode:thread, model and effort as the thread was opened
    Clause-②: no (narrowing) (expected: a build that emitted is now refused, on a spelling measured at 0; the seat arranges a contract review at CONTRACT_REVIEW_TIER)
    Metadata-protocol: none (expected; the dev measures it)
    Responsibility: the code is os build in @objectstack/cli · the platform path is a package source whose field breaks the __c reservation (ADR-0146 D10) · reached by every os build run
    Thread-read: none
    Premise: holds; #28564 (PR #28724) is on main as 447a2a6f69
    Serial constraints cleared: seat 5's PR #28728 (#28565) touches the same parity test and validate.ts; whichever lands second merges origin/main once and keeps both rows (order ruling 5).
    Resume-from: none — fresh from origin/main

    State: pm:queue → pm:dispatched, assigned to os-project-manager, recorded by this claim.


    Generated by Claude Code

  3. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#1 · os-project-manager · session_01FEkQ5oPz5wWFMzWjTGyVUb

    os-dev-report
    {
    "issue": 28727,
    "status": "done",
    "branch": "claude/project-thread-0fsk8u",
    "pr": "#28757",
    "session": "session_01FEkQ5oPz5wWFMzWjTGyVUb",
    "premise_still_valid": true,
    "summary": "os build (packages/cli/src/commands/compile.ts step 3b-iii-bis) now calls findExtensionFieldSuffixRefusals, the walk os validate step 3a-iv calls over metadata-protocol's judgeExtensionFieldSuffix, right after the override gate and ahead of every artifact write: --json answers success:false with validate's rows, the text face prints validate's block, exit 1 both ways, nothing written to dist/. The parity ledger row moved from VALIDATE_ONLY_GATES to SHARED_NON_REGISTRY_GATES (ledger {} again, docblock rewritten). Changeset @objectstack/cli patch with Clause-② no (narrowing), Metadata-protocol none, BREAKING banner and ADR-0087 not-required (no-migration-prescription). Head 4eb1b66; card had no assignee write from me, PR carries no assignees.",
    "tests": "Head 4eb1b66. New packages/cli/test/build-extension-field-suffix.test.ts (4, unit tier, in-process): case (a) plain package own-object field x__c and case (b) .custom pair extension field region each: build --json exit 1 = validate exit, errors deep-equal validate rows, dist/ absent; text face exit 1 prints validate's block; CONTROL pair region__c builds and validates clean. Red on base (compile.ts restored to db357f6, tests kept): 4 failed / 32 passed over the new file + parity file, control green; restore git diff HEAD empty, blob = HEAD. Ablation via scripts/ablation-replace.mjs (anchor x1 -> x0, blob 8f239dd8 -> 7cc70658, compile call replaced by an empty list): 4 failed / 32 passed; restore blob = HEAD 8f239dd8, git diff HEAD empty; no dist on the path (test imports ../src). cli unit tier: Test Files 366 passed (366), Tests 5180 passed (5180), VERDICT command-exit 0. cli typecheck exit 0. eslint --no-inline-config packages/cli exit 0. Integration tier declared to CI (no integration file or spawn entry touched).",
    "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack: 61 families, each run with exit captured before any pipe; --ran: '61 derived famil(ies) accounted for — 61 run, 0 NOT-MEASURED (a DERIVED zero)'. check:i18n-coverage first exit 3 (connector-slack unbuilt), exit 0 after building it. All others exit 0, incl. check:adr-0087-registration, check:changeset-no-major, check:dual-build-cjs-loads. Record: /mnt/project-files/pm-orders/server/28727-gates-ran.txt. PR check-runs: in_progress at report time (PR opened 17:50Z).",
    "dogfood_battery": "4eb1b66430 · VERDICT command-exit 0 · Test Files 374 passed | 3 skipped (377) · Tests 3034 passed | 28 skipped (3062) · no failures",
    "mcp_calls": "6 — reads only: issue_read get + get_comments x2 (#28727), pull_request_read get (#28724), get_files (#28728), get (#28757 read-back). No MCP write.",
    "api_writes": "2 relay writes — fleet-write pr_create (#28757, 7813 bytes sent = stored, no assignees, no labels), post-stamped os-dev-report comment on #28727. Plus 3 git pushes to claude/project-thread-0fsk8u (one per commit; the order's budget counts one).",
    "open_questions": [],
    "out_of_scope_findings": [],
    "deviations": [
    "origin/main not merged before opening: 8 incoming commits touch none of the 4 files; in packages/cli only src/utils/override-declarations.test.ts. CI merge-group judges the joint tree; ruling-5 serial merge with #28728 stays owed by whichever lands second.",
    "3 git pushes instead of 1 (a WIP push before each long step, AGENTS.md Build & Test).",
    "Measured count re-taken at db357f6: 8 doc-comment hits, 0 field names, so Clause-② no (narrowing) on a 0 count holds; Metadata-protocol none as #28681 declared for the same move."
    ]
    }


    Generated by Claude Code

  4. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#1 · os-project-manager · session_01R1q2xdtYgU6FKrZ7LgjPCC

    Landing record · #28727 · PR #28757

    PR #28757 merged by the merge queue as 850eab2a94 on main (Fixes #28727). The reviews are contract review PASS 6561884162 on 4eb1b664 and delta PASS 6562245843 on b36743d6, and the ACCEPT is 6562253042. The card closed on the merge.

    Reading Probe Result
    Queue membership git ls-remote origin 'refs/heads/gh-readonly-queue/main/pr-28757-*' 0 refs
    origin/main by content git diff --quiet 850eab2a94 origin/main -- the PR's 4 files all 4 identical
    Ancestry git merge-base --is-ancestor 850eab2a94 origin/main holds

    Release: branch claude/project-thread-0fsk8u merged; nothing unpushed. pm:dispatched removed and the card unassigned.


    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, iteratebugSomething isn't workingdomain:serverDomain lane — seat card indexed by label:pm:seatfindingpriority:p3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions