Repository navigation
docs(requirements): freezing protects a statement that was true when written (#1933) - #1946
Merged
Merged
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
…written
The maintainer ruled the freeze question on 2026-09-16. The wording below is that
ruling as adopted rather than as typed — the PM put it to the maintainer, who adopted
it with 「其他同意」 ("agreed to the rest") — so it is quoted exactly and kept
untranslated, because the adopted words are the ruling.
> 写时为真的陈述冻结;写下时就已失效的路径按错误改正。这条写进 `docs/requirements/README`,以后不再逐卡吵。
`docs/requirements/README.md` gains one section that writes it down as a criterion
rather than a conclusion, so the next reader can decide a record nobody has argued
about yet. The criterion is two timestamps: the commit that wrote the sentence,
against the commit that moved, renamed or deleted the structure it cites. Earlier
means the sentence was true when written and is frozen; later means it named nothing
the day it was typed, which is a typo to correct.
The measurement is given in the cheap, shallow-safe form — a lookup in the authoring
commit's own tree rather than an ancestry walk — with the shallow-checkout trap that
makes `--diff-filter=A` read like a real answer called out beside it.
The "why" hangs on this file's own opening, which already defines these records as
"the human-or-customer input an AI agent reads before authoring metadata": a path
that resolved to nothing the day it was written has no fact underneath it, so
freezing it protects nothing and routes the next agent into a directory that does
not exist.
Both worked examples are already in this directory and come out opposite ways, which
is what makes the criterion testable rather than decorative: REQ-0001 is frozen (its
commits predate the ADR-0130 move, and the directory it names is in the tree at its
own commit), REQ-0002 was corrected in PR #1942 (its commit lands 29 minutes after
that move, and none of the three paths it cited are in the tree at that commit).
No requirement record changes, the template is untouched, and the section states that
it does not decide the document class that describes a superseded tree on purpose.
Claude-Session: https://claude.ai/code/session_01T3YsvpK1PvYf9n1YUhYP6W
Co-authored-by: Claude <noreply@anthropic.com>
os-elon-musk
force-pushed
the
claude/issue-1933-requirements-freeze-policy
branch
from
September 16, 2026 08:03
0dab9bd to
5fabd4a
Compare
os-elon-musk
marked this pull request as ready for review
September 16, 2026 08:09
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.
Part of #1933 — the policy half. The implementation half landed in PR #1942; what this card
still owed was the written-down criterion, so the question is not argued card by card again.
document class (
docs/architecture/**), which the PM's own comments keep with the maintainer;the merge queue would otherwise take the card out of the inbox that half is waiting in.
The ruling this writes down
The maintainer's ruling of 2026-09-16, as adopted rather than as typed. The PM put this
wording to the maintainer, who adopted it with 「其他同意」 — "agreed to the rest". It is quoted
exactly and kept untranslated, because the adopted words are the ruling:
What landed
One new section in
docs/requirements/README.md— What freezing protects (2026-09-16maintainer ruling) — placed directly under the File layout bullet that makes records
append-only, which is the bullet it qualifies, and above How AI agents consume this.
It is written as a criterion, not a conclusion, so a reader can decide a record nobody has
argued about yet. The criterion is two timestamps:
Around that, four things the criterion needs to be usable:
Raised:date, which isthe customer's and can be weeks earlier), then ask whether the cited path was in that
commit's own tree. A lookup in one commit's tree needs no ancestry walk and stays correct on
the shallow checkout CI hands you. The shallow trap is named beside it:
--diff-filter=Atherereports the graft root as the adding commit and reads exactly like a real answer.
instead of prefixing mechanically, keep the edit to the stale path, and where one file was
split in two with no same-named successor, name every successor the sentence depends on.
the README already defines these records as "the human-or-customer input an AI agent reads
before authoring metadata". A path that resolved to nothing on the day it was written has no
fact underneath it, so freezing it protects nothing and costs something real — the next agent
reads the record as the spec it starts from and is sent to a directory that does not exist.
The quotation was read out of the file with
sed -n '6,7p'and joined across its line wrap,⛔ not written from memory; lines 6–7 themselves are untouched.
testable rather than decorative.
The two examples, measured
The ADR-0130 package move is
36b27dd,2026-09-14T14:07:19Z.3b72afa,2026-08-27T08:47:48Z(its latest)9f13c77,2026-09-14T14:36:11ZBoth ancestry legs are positive, so no control leg for a negative is owed:
git merge-base --is-ancestor 3b72afa 36b27dd→ exit 0 andgit merge-base --is-ancestor 36b27dd 9f13c77→ exit 0, in a checkout that reports--is-shallow-repository= true. The tree lookups are the stronger legs and are immune to theshallow graft; the ABSENT/PRESENT pair above runs the same checker to both outcomes, so it is a
measurement and not a vacuously green loop.
Verification
pnpm verify— thepackage.jsonchain run whole, not narrowed(
validate && typecheck && lint && lint:i18n-gate && hygiene && hygiene:tokens && build && test),through the shared lock. The exit code was written to a file before any pipe touched the
output, then read back:
Those seconds are shared-box seconds — several agents run on this container — not idle-box
figures. Run on
0dab9bd, whose tree this head still carries byte-for-byte: the head waslater amended to
5fabd4afor the provenance correction noted below, which touches only theattribution sentences and leaves every measured byte of the section unchanged.
Two checks beyond the chain, because this file is prose the gates barely read:
src/DIRform thattest/docs-src-tree-paths.test.tsextracts — the new section states thepost-move shape as the brace placeholder
src/{package}/{type}/and never spells a removeddirectory as a literal. That matters here specifically: this file is not in
TREE_DOCStoday, and this very ruling is what unblocks deriving the other half of that roster, so the
section must not be the thing that goes red when it does.
grep -naPover both edited files and over this body: no hits.Changeset — empty frontmatter, and why
.changeset/requirements-freeze-is-about-true-when-written.mdships with deliberately emptyfrontmatter: the sanctioned "this PR releases nothing" declaration that
.github/workflows/changeset-check.ymldocuments, on par with theskip-changesetlabel, and thesame form PR #1942 and PR #1944 used for this directory.
The level is judged, not defaulted. Nothing under
src/orcontent/docs/moves, so the builtartifact and the published documentation site are byte-identical to
main; the diff is onemaintainer-documentation file plus the changeset. A patch bump would publish a HotCRM release
whose notes say nothing a HotCRM installer can act on. The declaration still satisfies both steps
of the gate — it counts as an added changeset, and
changeset statusparses it — so the label isnot needed and was not spent.
Provenance correction (post-review)
The first revision of this PR labelled the quoted ruling "verbatim and kept untranslated".
The maintainer did not type those words: the PM drafted them and the maintainer adopted them
with 「其他同意」 — "agreed to the rest". Content is unchanged to the byte; only the attribution
sentences were rewritten, in all four places that carried the claim — this body, the section in
docs/requirements/README.md, the changeset, and the commit message (amended in place underAGENTS.md §3 rather than stacked as a second commit; all five criteria checked, ⑤ pinned the
lease to
0dab9bd). This file is a long-lived policy document that will be cited as "what themaintainer said", and this very card was opened by a misquotation, so adopted-versus-typed is
worth the extra sentence.
Boundaries held
REQ-0001…REQ-0006andTEMPLATE.mdare untouched —git diff --statis 2 files, one of them the changeset.docs/architecture/**untouched, and the new section says in one line that it governs therecords in this directory and does not decide what a document describing a superseded tree
on purpose owes. That half stays with the maintainer.
scripts/,test/, the rootREADMEanddocs/STATUS.mduntouched — that is [decision] Track A has ~621 tokens of business-semantics headroom left and two rings to go — raising the ceiling needs a maintainer ruling quoted in the raising PR #1928's filesurface, running in parallel.
Acceptance notes
docs/requirements/**for removedsrc/paths —TREE_DOCSintest/docs-src-tree-paths.test.tsstill does not list this directory, which iswhy three dead paths survived a 246-site sweep. Successor named and live: the roster-derivation
work [finding] docs-src-tree-paths is green over a Mermaid diagram naming 13 removed directories (inlineSrcDirs needs a trailing slash), and its own failure message instructs the next agent to use five dead paths #1923's seat deliberately left hand-written pending exactly this ruling, which has now
landed. Not filed here because it is that thread's next step, not a new defect.
Left long on purpose — the Index table below already carries 297-character rows, and no guard
in this repo measures markdown line length. Successor: whoever next edits this file.
Generated by Claude Code