Skip to content

Commit ebd2f51

Browse files
author
DevBot
committed
fix(tools,docs,www): alpha.12 prepare gate repairs — evidence-aware in-flight anchor rule, active-target sync, round-6 roadmap theme, fresh README bump staging
1 parent 4df6df6 commit ebd2f51

5 files changed

Lines changed: 57 additions & 8 deletions

File tree

docs/current/VERSION_PLAN.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
> Current source package line: `v0.42.0-alpha.12`\
44
> Current npm registry line: `v0.42.0-alpha.12` (published 2026-08-01, dist-tag `alpha`)\
55
> Next alpha train: `v0.42.0-alpha.12` (round-6 audit remediation — in flight; next is TP-6)\
6-
> Active release target: `v0.42.0-alpha.11`\
6+
> Active release target: `v0.42.0-alpha.12`\
77
> Planning release target: `v0.42.0` (WC light fullstack / Application Loop)\
88
> Next release line: `v0.43.0` (Universal WC SSR)\
99
> Current maturity stage: stable (0.41.x line); 0.42.0 planned under ADR-0120

tools/autoflow/release.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,7 @@ export function createReleasePlan(
396396
'tools/project-constants.ts',
397397
'README.md',
398398
'README.zh.md',
399+
'examples/open-element-in-fresh/README.md',
399400
'docs/current/VERSION_PLAN.md',
400401
'docs/governance/PROJECT_WORKFLOW.md',
401402
'docs/roadmap/ROADMAP.md',

tools/check-version-anchors.test.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,13 +159,34 @@ Deno.test('in-flight claims: published line bound to in-flight wording fails (#8
159159
];
160160
for (const prose of cases) {
161161
const files = goodFiles();
162+
// Completed publish evidence makes the current line count as published.
163+
files[`docs/release/autoflow3/${PACKAGE_VERSION_TAG}.json`] = '{"status": "completed"}';
162164
files['docs/roadmap/ROADMAP.md'] += `\n${prose}\n`;
163165
const failures = findInflightVersionClaimFailures(readerFrom(files));
164166
assert(failures.length >= 1, `expected a failure for: ${prose}`);
165167
assert(failures.every((f) => f.startsWith('docs/roadmap/ROADMAP.md:')));
166168
}
167169
});
168170

171+
Deno.test('in-flight claims: superseded line bound to in-flight wording always fails', () => {
172+
const files = goodFiles();
173+
files['docs/roadmap/ROADMAP.md'] +=
174+
`\n${PREVIOUS_PACKAGE_VERSION} is the in-flight source line.\n`;
175+
const failures = findInflightVersionClaimFailures(readerFrom(files));
176+
assertEquals(failures.length, 1);
177+
});
178+
179+
Deno.test('in-flight claims: prepare window — current line without publish evidence is exempt', () => {
180+
// After the version bump but before CI publishes, the current line IS the
181+
// in-flight train; flagging it would block the release flow itself.
182+
const files = goodFiles();
183+
files['docs/current/VERSION_PLAN.md'] +=
184+
`\nNext alpha train: \`${PACKAGE_VERSION_TAG}\` (round-6 audit remediation — in flight; next is TP-6)`;
185+
files['docs/governance/PROJECT_WORKFLOW.md'] +=
186+
`\nnext train \`${PACKAGE_VERSION_TAG}\` (round-6 audit remediation)`;
187+
assertEquals(findInflightVersionClaimFailures(readerFrom(files)), []);
188+
});
189+
169190
Deno.test('in-flight claims: naming the NEXT train beside the published line is legal', () => {
170191
const files = goodFiles();
171192
// The healthy steady state: current line published, next version in flight.

tools/check-version-anchors.ts

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -231,17 +231,31 @@ export function findStaleAnchorFailures(read: (path: string) => string): string[
231231
}
232232

233233
/**
234-
* Half-update guard (#813): the published package line must not be described
234+
* Half-update guard (#813): a published package line must not be described
235235
* as in-flight or as the active/next train. The binding must be tight — the
236-
* current version as the subject or object of the in-flight/train phrase, or
236+
* version as the subject or object of the in-flight/train phrase, or
237237
* immediately trailed by a parenthetical carrying in-flight wording — so a
238238
* paragraph that marks the current line published while naming the NEXT
239239
* train stays legal. Runs over the governed docs (the versionAnchors paths).
240+
*
241+
* Which lines count as "published": a superseded line (PREVIOUS_PACKAGE_VERSION)
242+
* always does. The CURRENT line only counts once its release evidence records
243+
* a completed publish — before that (the release-prepare window, where the
244+
* bump has landed but CI has not published yet) the current line legitimately
245+
* IS the in-flight train, and flagging it would block the release flow itself.
240246
*/
241247
export function findInflightVersionClaimFailures(read: (path: string) => string): string[] {
242-
const version = escapeRegExp(PACKAGE_VERSION);
243-
const alpha = PACKAGE_VERSION.match(/-alpha\.(\d+)$/u)?.[1];
244-
const ver = alpha ? `(?:v?${version}|\\balpha\\.${alpha}\\b)` : `v?${version}`;
248+
const publishedVersions = [PREVIOUS_PACKAGE_VERSION];
249+
if (hasCompletedReleaseEvidence(read, PACKAGE_VERSION_TAG)) {
250+
publishedVersions.push(PACKAGE_VERSION);
251+
}
252+
const parts: string[] = [];
253+
for (const version of publishedVersions) {
254+
const alpha = version.match(/-alpha\.(\d+)$/u)?.[1];
255+
parts.push(`v?${escapeRegExp(version)}`);
256+
if (alpha) parts.push(`\\balpha\\.${alpha}\\b`);
257+
}
258+
const ver = `(?:${parts.join('|')})`;
245259
const bindings = [
246260
new RegExp(`${ver}[^.\\n]{0,30}?is the in[- ]flight`, 'i'),
247261
new RegExp(`in[- ]flight[^.\\n]{0,30}?line is ${ver}`, 'i'),
@@ -269,6 +283,19 @@ export function findInflightVersionClaimFailures(read: (path: string) => string)
269283
return failures;
270284
}
271285

286+
/**
287+
* Offline proxy for "this line is already on the registry": the autoflow3
288+
* evidence record for the tag exists and reached `completed`. A missing or
289+
* incomplete record means the version is still in the prepare window.
290+
*/
291+
function hasCompletedReleaseEvidence(read: (path: string) => string, tag: string): boolean {
292+
try {
293+
return read(`docs/release/autoflow3/${tag}.json`).includes('"status": "completed"');
294+
} catch {
295+
return false;
296+
}
297+
}
298+
272299
function main(): void {
273300
const texts = new Map<string, string>();
274301
const read = (path: string): string => {

www/app/routes/roadmap.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -333,9 +333,9 @@ type TimelineEntry = {
333333
const entries: TimelineEntry[] = [
334334
{
335335
version: 'v0.42.0-alpha.12',
336-
theme: 'round-5 audit remediation',
336+
theme: 'round-6 audit remediation',
337337
copy:
338-
'The fifth full-spectrum audit closes 56 issues (#753–#808): JSX ref callbacks are honored, Array/Object props JSON-sync across SSR and CSR, island config scanning goes fail-closed, head-injection URL validation strips tab/newline bypasses, desktop examples bind loopback, and the site-ui lab components actually render.',
338+
'The sixth full-spectrum audit closes 43 issues (#810–#852): a guard-vetoed post-action redirect no longer wipes page data, the CSRF same-origin floor gains real deny/allow e2e proof, malformed URLs are a defined 400, ISR and CSRF claims match shipped behavior, tautological gates are replaced with real ones, and 23 dead icons plus the dead token palette are gone.',
339339
state: 'stable',
340340
stamp: 'CURRENT',
341341
},

0 commit comments

Comments
 (0)