docs(release): the AEN gate cleared for a pre-release floor, not for stable (#802) - #838
Conversation
…stable (#802) release-contract.md's 'Currently outstanding' table said NO in its 'In a tag?' column for d639e777 (alp-sdk#1289) and 7d58ef32 (alp-sdk#1352), on the evidence that `git tag --contains d639e777` is empty. It is not. Both are contained in alp-sdk v0.16.0-rc1, so the cell's own re-check command contradicted it, and the section's instruction to revisit the table 'when that release exists' had fired and was never executed. Present on dev, not just frozen in the tag. Re-measured rather than taken from the issue: git tag --contains d639e777 -> v0.16.0-rc1 git tag --contains 7d58ef32 -> v0.16.0-rc1 git merge-base --is-ancestor d639e777 v0.15.0 -> exit 1 git merge-base --is-ancestor 7d58ef32 v0.15.0 -> exit 1 v0.16.0-rc1 Pre-release 2026-08-15T02:05:12Z v0.15.0 Latest 2026-08-07T13:36:18Z Both facts go in the table, because neither is the whole answer on its own. The gate's stated condition -- contained in a published alp-sdk tag -- is met. But v0.15.0 is still Latest and contains neither commit, so an AEN user on stable cannot run `tan generate --target zephyr-board`. The section now names that as the release engineer's call (cut on a pre-release floor, or wait for alp-sdk v0.16.0 final) and asks for the choice to be recorded in the release PR, rather than deciding it in a doc. It failed CLOSED before -- falsely blocking, never falsely permitting -- so nothing was mis-shipped on the strength of it. BEYOND THE ISSUE'S STATED SCOPE, deliberately. The issue says do not touch the follow-up block below the table, because the alp-sdk refusal string it quotes is still verbatim correct. That is true, but the block opens 'when that release exists, two strings stop being true and must be revisited IN THE SAME CHANGE' and then names the table's column as one of the two. The release exists and the column is now fixed, so leaving the sentence verbatim would leave a reader unable to tell which half remains. It now says the trigger fired, the table is done, and the refusal string is not -- keeping the quoted string, the alp-sdk#1354 tracking and the _aen_peripherals_dtsi reasoning untouched. One correction to the issue while there: the surviving string is at scripts/gen_zephyr_board.py:637, not :687. tests/gates 476 passed, 3 skipped -- includes test_release_docs_match_the_workflow.py, the gate that parses this document. No other suite is reachable from a markdown edit.
alpCaner
left a comment
There was a problem hiding this comment.
The table update is right, and so is the call it leaves the release engineer: YES, pre-release only states both halves, keeps the still-true merge-base --is-ancestor clause, and replaces a blanket "do not cut" with a decision plus a request to record it. Executing half the "when that release exists" trigger and saying which half remains is better than the issue asked for.
One thing to fix before this merges, because it is the same class of defect the PR exists to remove.
The new line citation is wrong, and the correction is inverted
The doc and changelog.d/802.fixed.md both cite scripts/gen_zephyr_board.py:637, and the fragment adds:
That string is upstream's to fix and is still tracked as alp-sdk#1354 (open). ... the issue's
:687is off by fifty.
:687 is correct. Measured just now on all three refs of alplabai/alp-sdk:
$ git show v0.16.0-rc1:scripts/gen_zephyr_board.py | sed -n '686,688p'
"commit. The AEN board emit needs a checkout that contains it "
"-- upgrade alp-sdk to a release that includes alp-sdk#1289. "
"(If you are AUTHORING this preset rather than consuming a "
$ git show origin/dev:scripts/gen_zephyr_board.py | grep -n "upgrade alp-sdk to a release"
687: "-- upgrade alp-sdk to a release that includes alp-sdk#1289. "
$ git show origin/main:scripts/gen_zephyr_board.py | grep -n "upgrade alp-sdk to a release"
687: "-- upgrade alp-sdk to a release that includes alp-sdk#1289. "
Tag, dev and main all answer 687. Nothing in the file moved that string between them.
Why it is worth a round-trip
docs/release-contract.md is the document a release engineer follows under time pressure, and this section's remaining open item is precisely "go read that string upstream and replace it with a real version floor". Sending them to :637 costs them the lookup the citation was supposed to save, and a wrong file:line in the doc that fixes a wrong file:line is the failure mode this whole area keeps hitting — the same one alp-sdk#1416's citation gate exists to catch, and which alp-sdk#1498 records as still unenforced for CHANGELOG.md.
Fix
Two sites:
docs/release-contract.md— thescripts/gen_zephyr_board.py:637reference becomes:687.changelog.d/802.fixed.md— same change, and drop the "the issue's:687is off by fifty" clause rather than reversing it; the fragment does not need to adjudicate the issue's line number at all.
Everything else here reads correctly to me.
… not :637 Review on #838 measured the citation this PR added and it is wrong, which is the same defect class the PR exists to remove. Re-measured independently against alplabai/alp-sdk on all three refs: git show v0.16.0-rc1:scripts/gen_zephyr_board.py | grep -n "upgrade alp-sdk to a release" 687: "-- upgrade alp-sdk to a release that includes alp-sdk#1289. " origin/dev -> 687 origin/main -> 687 Line 637 on the same refs is unrelated prose inside a module docstring about the App MRAM / NPU MRAM-model budget, so a release engineer sent to :637 pays the lookup the citation was supposed to save. Two sites: - docs/release-contract.md:376 -- :637 becomes :687. - changelog.d/802.fixed.md -- same change, and the "the issue's :687 is off by fifty" clause is dropped rather than reversed. The fragment does not need to adjudicate the issue's line number at all; alp-sdk#1354 already carries the correct one. Gates: python/tests/gates 470 passed, 9 skipped, rc=0. scripts/assemble_changelog.py --check rc=0 (802.fixed.md listed).
|
Fixed in 3885c27. Both sites now read Re-measured independently before changing anything, same three refs: Worth recording what Same subsystem, same file, wrong string — which is exactly why it read plausible on the way in. The refusal string is not mirrored into tan-cli ( Changes:
Gates on the pushed head: |
Closes #802.
What was false
docs/release-contract.md's "Currently outstanding" table said NO in its "In a tag?" column ford639e777(alp-sdk#1289) and7d58ef32(alp-sdk#1352), on the evidence thatgit tag --contains d639e777is empty. It is not empty. The cell's own re-check command — the one the section prescribes one line above the table — contradicted the cell.Re-measured, not taken from the issue
Every claim the issue makes reproduced. One did not: the surviving upstream string is at
scripts/gen_zephyr_board.py:637, not:687— the issue is off by fifty, and the doc now cites the verified line.The decision I did not make for you
Both facts are in the table now, because neither is the whole answer:
v0.15.0is stillLatestand contains neither commit, so an AEN user on stable still cannot runtan generate --target zephyr-board.Cutting now ships an AEN board emit whose floor is a pre-release. Waiting for alp-sdk
v0.16.0final removes the caveat outright. The section states that choice and asks for it to be recorded in the release PR, rather than a doc silently deciding it. That is why the heading is re-scoped ("Cleared for a PRE-RELEASE floor, not for the current stable") instead of deleted.Worth keeping in view: this failed closed — falsely blocking, never falsely permitting — so nothing was ever mis-shipped on its strength. The cost was engineer time and a possibly-delayed
v0.6.0.One thing beyond the issue's stated scope
The issue says do not touch the follow-up block below the table, because the alp-sdk refusal string it quotes is still verbatim correct. That reason is sound and the quote is untouched. But the block opens:
The release exists, and this PR fixes the column. Leaving that sentence verbatim would leave the doc saying "when X happens, do A and B" while X has happened and B is done — a reader could not tell which half remains. It now says the trigger fired, the table is done, and the refusal string is not, with the quoted string, the alp-sdk#1354 tracking (still open) and the
_aen_peripherals_dtsi()reasoning all preserved.Say the word and I will revert that paragraph to verbatim; I would rather flag the deviation than make it quietly.
Also: a changelog fragment, which the issue said was not needed
The issue argues none is required because
CHANGELOG.md:1105-1124already records thev0.15.0-measured limitation. That records the old state; what changed here is what the gate says to a release engineer (do-not-cut → cut-with-a-named-caveat), andchangelog.d/README.mdcarves out no exception for docs. Added aschangelog.d/802.fixed.md. Drop it if you disagree — it is one file.Test plan
tests/gates— 476 passed, 3 skipped, includingtest_release_docs_match_the_workflow.py, the gate that parses this document