docs(formulas): drop the M9.1 / M9.2 phase language from the docs page and the pending changesets - #17851
Merged
claude[bot] merged 1 commit intoSep 12, 2026
Conversation
…e and the pending changesets The M9.1 / M9.2 expression phases — including the promise that `ast` becomes required in build output — were asserted across the tree and defined in no ADR. Decision batch #123 item 1 ruled option B: the phase assertions are removed and `ast` stays an accepted optional persisted form with no promise of becoming required. This is the docs half: the published page and the two unconsumed changesets now state the contract in the present tense — `source` is the canonical persisted form, `ast` is an optional opaque structured value. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MCLBsUgfykL74aU716rzVK
This was referenced Sep 12, 2026
claude
Bot
deleted the
claude/issue-17323-drop-m9-phase-language-docs-half
branch
September 12, 2026 13:17
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The M9.1 / M9.2 expression phases — including the promise that
astbecomes required in build output — were asserted across the tree and defined in no ADR. Decision batch #123 item 1 (director seat, 2026-09-12) ruled option B, maintainer verbatim 「同意」: the phase assertions are removed, andaststays an accepted optional persisted form with no promise of becoming required. This PR is the docs half of that ruling — the published docs page and the two still-unconsumed changesets now state the contract in the present tense:sourceis the canonical persisted form,astis an optional opaque structured value. Per the ruling's item 4 (「Files underpackages/specandpackages/formulaare the spec seat's: thedomain:skillstaker edits docs and coordinates the spec half as a sibling PR by that seat, ⛔ not a cross-lane rider」), nothing underpackages/is touched here; the spec half is a sibling PR by that seat, tracked as #17849. No ADR is written — B means there is no phase to define.Part of #17323
Acceptance notes
Premises, re-taken at this branch's base
758ac409git grep -l 'M9\.[12]' origin/mainreturns exactly seven files —.changeset/blank-node-condition-refused-at-registration.md(1 hit),.changeset/flow-edge-condition-evaluated-slot.md(3 hits),content/docs/data-modeling/formulas.mdx(1 hit),packages/formula/src/cel-engine.ts,packages/formula/src/normalize.ts,packages/spec/CHANGELOG.md,packages/spec/src/shared/expression.zod.ts. The last four are the spec seat's and are untouched here; after this PR the repo-wide count is those four and nothing else..changeset/at this base.changeset-release/main, bot-authored) lists both of them asremoved— it is the consuming side. So this correction has to land before that PR does; once a release consumes these files, the ruling's item 3 routes the same correction to aCHANGELOG.mderratum instead, which rides the spec half.formulas.mdx:27 (deleted in M9), :111 (M9.9b) and :583 (M9.5) are other milestone references and are byte-identical — they do not appear in the diff, andgit grep -c 'M9' -- content/docs/data-modeling/formulas.mdxstill reports 3 (now at :27 / :112 / :584, shifted by the one line this PR adds).The sentences, before → after
A ·
content/docs/data-modeling/formulas.mdx:86-87B1 ·
.changeset/flow-edge-condition-evaluated-slot.md:30 — inside the blockquote that reproduces the refusal sentence:B2 ·
.changeset/flow-edge-condition-evaluated-slot.md:44-48 — the phase-2 promise itself:B3 ·
.changeset/flow-edge-condition-evaluated-slot.md:73C ·
.changeset/blank-node-condition-refused-at-registration.md:33 — the eighth site, which neither the card nor the ruling named. What it said: the same verbatim blockquote of the refusal sentence that B1 carries, with the identical(the canonical persisted form of phase M9.1)parenthetical; it is the only M9 reference in that file, and it gets the identical treatment:Nothing else in the three files is touched: 3 files, 9 insertions, 8 deletions, and the changeset frontmatter (package and bump level) of both changesets is unchanged.
D · Verification
git grep -l 'M9\.[12]' -- content .changesetgit grep -c 'M9' -- content/docs/data-modeling/formulas.mdx3(the :27 / :112 / :584 milestones)git grep -c 'M9\.[12]'git grep -c 'M91zzz' -- content .changesetgrep -naPfor raw control bytes over the three filesCoordination with the spec half, #17849
The blockquote edited in B1 and C is a verbatim quote of an exported constant —
EVALUATED_EXPRESSION_SOURCE_REQUIREDinpackages/spec/src/shared/expression.zod.ts, which still carriesof phase M9.1onmain. This PR drops exactly that phase clause and keeps(the canonical persisted form), because "sourceis the canonical persisted form" is the present-tense contract the ruling's item 1 names. For the quote to stay a quote, the spec half must land that same wording in the constant. Flagged rather than worked around:packages/specis not this lane's, per item 4.Changeset:
skip-changeset, measuredTwo existing changesets are edited and none is added, so the changeset count this PR adds is 0 and the label is the applicable rule (
AGENTS.mdPost-Task Checklist step 3: the label is for a diff that publishes nothing from any released package). Measured rather than assumed:files[]shipscontent/**or.changeset/**— 0 matching entries across every non-private workspace manifest;carries no promise of becoming required,is an optional opaque structured value) appear in 0 published paths;canonical persisted formdoes hit a published path (packages/spec/CHANGELOG.md,packages/spec/src/shared/expression.zod.ts), so the measurement is not vacuous.The publication this correction affects is already declared by the two changesets it edits (
@objectstack/specminor,@objectstack/service-automationminor); a third changeset would declare a release of its own for a prose correction that rides theirs. TheCHANGELOG.mderratum for the already-published M9.2 text is the ruling's item 2 and belongs to the spec half.Gates
Derived in this worktree with
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack(no paths — the tool took the change set from git itself at9e12d4a62vs merge base758ac4097): 51 commands. Every one was run; reconciliation with--ranreports 51 derived, 51 run, 0 NOT-MEASURED, 0 UNRUN, all exit 0.Four of them first exited
3/1as PREREQUISITE NOT MET — nothing measured, unbuilt workspace packages, not findings:check:doc-formula-expressionsandcheck:doc-security-posture(@objectstack/formula,@objectstack/lintunbuilt),check:docs-transcript-drift(same), andcheck:skill-examples(packages/client-react/distheld no.d.ts). Afterpnpm exec turbo run build --filter='@objectstack/lint...' --filter='@objectstack/formula' --filter='@objectstack/client-react...' --concurrency=2, all four are exit 0. Verdict lines, as each gate printed them:node scripts/check-changeset-fixed.mjswas run as well and is exit 0 — the derivation flags its roster as living under.changeset, one of this PR's paths, so its silence is evidence in neither direction until run. It reads.changeset/config.jsonand the workspace manifests, neither of which this PR touches.Repo-wide scans (
pnpm lintand the rest) are CI's, as are the two path-scheduled CI jobs and the 11 declared-wide families the derivation names as unplaceable locally.Noted, not filed
scripts/check-adr-0087-registration.mjs's pass line labels every skipped changeset "non-breaking" (${result.skipped.length} non-breaking changeset(s) seen), so the two changesets here — both declared breaking at base and skipped as inherited stock by the specifiedM breaking at head, already breaking at baserow — are reported as non-breaking. The verdict is correct and the row is a pinned self-test case; only the summary wording under-describes. A pass-line wording nit, not a defect class, not a contract violation and not an authoring trap, so no card. Taker: none — no queued PR touches that script.Generated by Claude Code