Skip to content

release text (18.0.0-next.0): "Existing junction rows are converted into definitions by the ADR-0131 upgrade ceremony" is false under a wall, where the ceremony converts no binding and its rewrite gate refuses until the operator declares the position #23555

Closed

Description

@objectstack-fleet

Filing gate ①, class (b), under the release-text exception: operator-facing text that is false has shipped in a published release's CHANGELOG. It was read from source at origin/main 0b9391b827, not measured at a door; the exception does not require that.

Filed by domain:cli seat 2 (#22648) · sunhaolin · session session_01Q9PZ5Pzqcus4woVvTZwWNU, from #23542's readings (os-dev-report 6180893363, out-of-scope finding 1). ⛔ Not a claim. Lane and grade are triage's.

What is false

.changeset/pre/15204-s1-position-permission-sets.md:52 shipped as the 18.0.0-next.0 entries in packages/core/CHANGELOG.md:236, packages/spec/CHANGELOG.md:1565 and packages/plugins/plugin-security/CHANGELOG.md:486:

Existing junction rows are converted into definitions by the ADR-0131 upgrade ceremony (os migrate), which applies convertPositionBindingRows.

That is true under single. Under a wall (group, isolated) it is not:

  • runAuthoredConversion returns done before it reads a single binding (packages/cli/src/utils/organization-ownership-apply.ts:791-:800).
  • The rewrite gate (verifyReferences, :2041-:2057) then refuses every binding whose position the catalog does not declare with those sets.
  • That holds until the operator declares the position, in code or through the metadata door as the platform administrator.

The bullet above it (:51) covers only organization-authored positions.

Reader who acts

Triage grades and routes it. Per AGENTS.md, the route for a released entry is a dedicated docs-only PR that amends the released CHANGELOG entries, ⛔ never a rider on a code PR. The ceremony's own walled remedy is #23542, built separately.

Seam: release-text: CHANGELOG 18.0.0-next.0 "Existing junction rows are converted" → runtime: runAuthoredConversion's walled arm (organization-ownership-apply.ts:791-800) | consumer: operators of walled deployments reading the 18.0 notes.

Acceptance (a proposal; triage's call)

The released entries say what holds in each posture:

  • Under single, the ceremony converts the rows.
  • Under a wall, it converts none. The rewrite gate refuses a binding until the position is declared, with its permissionSets naming the bound sets, in the deployment's code or through the metadata door as the platform administrator.

Dedupe

MCP search_issues on objectstack-ai/objectstack, closed included: CHANGELOG 18.0.0-next.0 existing junction rows converted by ceremony false under wall walled bindings not converted release note. It returned 4 hits:

Dedupe words: junction rows converted ceremony walled release note; 15204-s1 changeset walled bindings not converted; CHANGELOG 18.0.0-next.0 existing junction rows.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade · documentation · priority:p2 + target:v18 · domain:cli · pm:queue · land after #23542 · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-14T23:51Z

    Read fresh. The 18.0.0-next.0 CHANGELOG entries in core, spec and plugin-security say the upgrade ceremony converts existing junction rows into definitions. That holds under single only. Under a wall:

    • runAuthoredConversion returns before it reads a binding;
    • the rewrite gate refuses each binding whose position is undeclared.

    This is read from source, under the release-text exception.

  2. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 13 (#23555: the 18.0.0-next.0 entries that say the ADR-0131 ceremony converts existing junction rows say it per posture: converted under single; under a wall, no binding is converted and the rewrite gate refuses until the operator declares the position with those sets) · 2026-10-15T04:24Z
    Session: session_01Q9PZ5Pzqcus4woVvTZwWNU
    Account: sunhaolin (the seat's linked user as GET /user answers it; the card's assignee from this act)
    Branch: claude/issue-23555-walled-junction-release-text
    Worktree: objectstack-issue-23555
    Domain: domain:cli
    Seat: domain:cli#2 (seat post #22648)
    Scope: batch 3, by the maintainer's 「并发恢复3」 (about 04:22Z). #23562 is in flight; this card and #23573 fill the two free slots.
    Order, read at this act:


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 23555,
    "status": "done",
    "branch": "claude/issue-23555-walled-junction-release-text",
    "pr": "#23611",
    "session": "session_01Q9PZ5Pzqcus4woVvTZwWNU (the dispatching seat's session; this executor ran as its subagent)",
    "premise_still_valid": true,
    "summary": "The premise holds at origin/main 8d05456. Under a wall, runAuthoredConversion returns done at its non-single arm before it reads a binding. verifyReferences, which the rewrite step runs, then refuses each converted binding, and the run stops at that step. The walled remedy is PR #23576's walledBindingRemedy (0f52f32). Draft PR #23611 (head 9d05217, assignee sunhaolin) amends the one false bullet of the 18.0.0-next.0 entry in place, in its six copies. Those are five CHANGELOGs (core, spec, platform-objects, plugin-security, plugin-auth) and .changeset/pre/15204-s1-position-permission-sets.md:52. The bullet now says: converted under single only, by authored-conversion. Under a wall no binding is converted, and the rewrite step refuses until the operator acts. For an undeclared position, the operator declares it with the sets through one door only, the deployment's code or the metadata door. For a declared position the door can edit, the operator adds the missing sets there. A packaged definition is sealed (ADR-0131 D6), and conflicting is unchanged. The six bullet bodies are byte-identical after the list marker (one md5, ac515d49cc24). Diff: 6 files, +6/-6. No other line, no code, no new changeset and no content/docs/releases/ edit. The skip-changeset label was NOT applied (see deviations and open_questions), so Check Changeset is expected to go red, by design. Worktree and its node_modules removed after the PR opened.",
    "tests": "No package test is owed: the diff is Markdown only and no tested behaviour changed, so there is no ablation. Identity proof: the bullet body after the list marker in all six files hashes to one md5, ac515d49cc24 (6 of 6). Edit proof: the replace script asserted exactly one old occurrence per file before writing, then read back old=0/new=1 in each of the six. Control-byte self-scan over the six files: grep -naP exit 1 (none). pnpm check:nul-bytes exit 0: 'check-nul-bytes: OK (scanned 11529 text file(s) ... no raw ASCII control bytes)'. Sentence census: 'Existing junction rows' had 6 hits on origin/main (the six above) and 0 under content/. The control word sys_position_permission_set has hits in 6 files under content/.",
    "gates": "Local subset at 9d05217. node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 68 commands, each run with its exit captured before any pipe. --ran exit 0: '68 derived famil(ies) accounted for — 63 run, 5 NOT-MEASURED (5 DERIVED from a recorded exit 3)'. Exit 0 for 62 commands, including: check-adr-0087-registration.mjs --base origin/main ('this PR adds no declared-breaking changeset'); check-changeset-no-major.mjs --base origin/main ('This diff introduces no major bump'); check:release-notes; check:release-page-status; check-release-section-coverage.mjs (plain and --strict); check:doc-authoring; check:issue-citations; check:nul-bytes. Exit 1 for 1 command, check-empty-changeset.mjs --base origin/main: '.changeset/pre/15204-s1-position-permission-sets.md present on the merge base and CHANGED by this PR'. That is the expected DELIBERATE CORRECTION red, and the PR body asks for written confirmation. Exit 3 for 5 commands (PREREQUISITE NOT MET, no built dist), NOT MEASURED: check:dts-closure, check:dual-build-cjs-loads, check:i18n, check:lean-entry-closure, check:sourcemap-no-sources-content. This is a declared narrowing: the diff builds no package, and Lint & Repo Gates runs these on a fresh build. Also run because their roster sits beside a changed path, all exit 0: check-changeset-fixed.mjs, check:authz-resolver, check:error-code-casing, check:filter-alias-parity. PR #23611 check-runs, read once at report time (38 total): success: Auto Label, Check Documentation Links, Check PR Size, Dogfood Regression Gate, Flag docs affected by code changes, Governed Surface Queue Guard, Lint · PM dispatch-gates, Lint · scoped (query-options erasure, slot lookup & corpus, tooling self-tests), No other open PR may claim the same issue, No other open PR may claim the same single-writer path, Part-of PR must not also close its card, Spec property liveness, The card this PR closes must claim this branch, filter. skipped: Build Docs, Console Pin Gate, Dogfood shards, Dogfood Verify CLI, Packed-tarball smoke, Temporal Conformance. in_progress: Build Core, Check Changeset (expected to go red: route 0), Lint · CI release & engine gates, Lint · ESLint, Lint · docs & code guards, Lint · repo & tooling gates, Test Core 1-6, Type Check (consumer gates, debt ledger, source gates, workspace). Labels on the PR, all set by bots: documentation, size/s, tooling.",
    "mcp_calls": "0",
    "api_writes": "5 REST writes. Two repository_dispatch POSTs to /repos/objectstack-ai/objectstack/dispatches (the pr_create stroke and this report's stroke). The relay executed three as objectstack-fleet[bot]: POST /repos/objectstack-ai/objectstack/pulls (draft), POST /repos//issues/23611/assignees (sunhaolin), and POST /repos//issues/23555/comments (this report). label-write: 0. Plus 2 git pushes, which are not REST.",
    "open_questions": [
    {
    "question": "The dispatch's ruling ('takes the skip-changeset label; put it on with label-write') conflicts with the role file and Check Changeset's route 0. The role file says: 'PR 改到已有的 .changeset/.md:⛔ 永不打 skip-changeset,门禁红着是对的,确认走 PR 文字'. Route 0 cites maintainer ruling D, recorded on #18375: the label is never applied to a PR that edits an existing changeset. This PR edits .changeset/pre/15204-s1-position-permission-sets.md, which is still pending: release.yml says the GA version pass on pre exit consumes .changeset/pre/.md again. I followed the role file, which wins on conflict, and wrote zero labels. Does the seat confirm?",
    "options": [
    "A: keep it. No skip-changeset. Check Changeset and its empty-changeset scan stay red; neither is a required context. The correction is confirmed in writing on PR #23611, which names the note and what changed under it.",
    "B: apply skip-changeset as the dispatch said. That contradicts ruling D and the role file. It would falsely declare that the PR releases nothing while it rewrites a pending GA note, and it would exempt the job that names this class."
    ],
    "recommendation": "A, because route 0 is decided by the diff, not by judgement. A also leaves the decision in front of a person, which is what the red is for. The dispatch template line 'docs-only, so skip-changeset' may want a carve-out for a PR that edits a .changeset/pre/ note."
    }
    ],
    "out_of_scope_findings": [
    "noted, not filed (no class: a tool verdict's wording) · check-adr-0087-registration.mjs's pass line counted this PR's inherited declared-breaking changeset among 'non-breaking changeset(s) seen'. scan() pushes an M/R row that was already breaking at the branch point onto skipped, and the pass line prints skipped.length under that label. The verdict is right; the count's label is not · carrier: 承接者:无 · its home is PR #23611's Acceptance notes. The body is written once, so the seat may append it there · dedupe words: adr-0087 non-breaking changesets seen inherited breaking skipped count"
    ],
    "deviations": [
    "skip-changeset NOT applied, against the dispatch's ruling (see open_questions[0]). The role file wins on conflict, so there were zero label writes; no classifier refusal occurred.",
    "Inside the amended bullet, the command spelling also moves: os migrate becomes os migrate organization-ownership --apply, the command whose steps (authored-conversion, rewrite) the bullet now names. The PR body names this.",
    "5 derived gates are NOT MEASURED (exit 3, no built dist). This is a declared narrowing; CI builds and runs them.",
    "The harness attribution reminder asked for a model-named Co-Authored-By trailer and a different PR footer. AGENTS.md and the role file require the model-free trailer pair and the session-URL footer, and the pre-push hook enforces the trailer rule, so those were used.",
    "PM hypothesis (b): no gate compares a CHANGELOG with .changeset/pre/. No script under scripts/ reads both for text. Identity was held by hand (md5). Hypotheses (a) and (c) were confirmed as stated: six copies, none under content/docs/ (content/docs/releases/ included), and the neighbouring bullets are true and unchanged."
    ],
    "files_changed": [
    ".changeset/pre/15204-s1-position-permission-sets.md",
    "packages/core/CHANGELOG.md",
    "packages/platform-objects/CHANGELOG.md",
    "packages/plugins/plugin-auth/CHANGELOG.md",
    "packages/plugins/plugin-security/CHANGELOG.md",
    "packages/spec/CHANGELOG.md"
    ]
    }

  4. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #23611 comment 6185694378 · 2026-10-15T06:08Z


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed: PR #23611 → 361c9464ca · 2026-10-15T06:40Z

    domain:cli seat 2 (#22648) · sunhaolin · session session_01Q9PZ5Pzqcus4woVvTZwWNU · holder of claim 6184383656, released by this landing. Review: the seat record 6185694378 on the PR (pointer 6185703820 on this card), which is also the written confirmation of the correction.

    Reading Value
    PR merged: true, merged_at 2026-10-15T06:38Z, through the merge queue (added_to_merge_queue 2026-10-15T06:11Z), with Check Changeset's route-0 red confirmed in the seat record
    Queue branch gh-readonly-queue/main/pr-23611-* absent (git ls-remote, 0 refs)
    origin/main 361c9464ca is an ancestor; one parent (93f3526e62); 6 files, +6 / −6, as reviewed at 9d05217ea2
    Closing keywords in the landed commit Fixes #23555 only
    Lane reconciliation 13 open domain:cli cards (read at this stamp), #23555 no longer among them

    State change: #23555 closed completed by the merge; pm:dispatched removed in this act. The 18.0.0-next.0 bullet now states, per posture, what the ADR-0131 ceremony does with existing junction rows, in all six copies.


    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

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions