* docs(#3883): correct section 8.3 against the tree
I wrote this section in Phase 0 stating rules I had not executed against the
tree. Measured at 832dcbb75, three statements are wrong.
The slug count is 11 across 5 files, not 13; two of the thirteen were an
unrelated tokenizer regex. The divergence is real and reproduced.
resolveRuntime reads no install marker at all and has no cache; PR #3382,
cited as prior art for that rung, is closed unmerged.
The Codex sandbox is still a hand-maintained subset map with a silent
read-only fallback, and validate agents checks file presence only -- both
halves of that claim are false.
The shortFormToId rule is accurate. The guard roster names no casualty for
this rule.
Section 8.3 is therefore a work list, not a conformance check.
Refs #3883
* test(#3883): failing-first rows for slug re-implementation divergence
Refs #3883
* feat(#3883): route every slug call site through its canonical owner
Migrated commands.cts:209, init.cts:176/1935/1957/3109, phase-id.cts:229/380, phase-locator.cts:269, workstream-name-policy.cts:75 to generateSlugInternal (core-utils.cts:107).
Declared different: gsd2-import.cts:97 (no truncation), active-workstream-store.cts:97 (fixed ASCII env-key domain, already matches).
Fixed a latent circular-require bug: core-utils.cts top-level destructured comparePhaseNum/scopeToPhase from phase-id.cjs; switched both sides of the new circular require to lazy function-body requires.
Refs #3883
* fix(#3883): restore per-site truncation contracts broken by the slug consolidation
Refs #3883
* fix(#3883): close review findings — changeset, miscounts, loose rows, cyclic destructure
Refs #3883
* docs(#3883): correct the same slug miscount in the Context table
Section 8.3's rule text was corrected to 11 copies across 7 files; the Context
table above it still carried the original 13 across 5. Same wrong claim, second
location, both mine.
Refs #3883
* chore(#3883): backfill changeset PR number
Refs #3883
* test(#3883): keep the core-utils mutation shard inside its time budget
PR #3896's Stryker (core-utils) shard was cancelled at the 15-minute
shard cap. Stryker's command-runner bills one `node --test <file>`
invocation as a single unit costing whatever the file's slowest run
costs, re-run once per mutant (documented in
tests/state-contract.test.cjs's header, #2790 precedent). A3/A5 drove
every CLI-reachable slug site through runGsdTools (a real child-process
spawn per call, ~85-170ms each across ~70 calls), accounting for ~7.1s
of the file's ~7.9s wall time.
commands.cts:cmdGenerateSlug and init.cts:cmdInitExecutePhase/
cmdInitPhaseOp/cmdInitProgress are plain functions reachable in-process
from the built gsd-core/bin/lib/*.cjs, so this calls them directly
instead of spawning gsd-tools, capturing their fd-1 JSON output with the
bug #1008 fs.writeSync-mock pattern already used in tests/io.test.cjs
and tests/init.test.cjs. A hermetic-env helper reproduces the isolation
runGsdTools's { HOME: tmpDir } + testEnvBase() gave the child process.
File wall time drops from ~7.97s to ~1.1s (246/246 passing, same
coverage), well inside the 15-minute cap even at hundreds of mutants.
Refs #3883
---------
Co-authored-by: sim <sim@local>
This commit is contained in:
31
src/init.cts
31
src/init.cts
@@ -174,9 +174,12 @@ function guardedGetRoadmapPhase(
|
||||
// directory exists yet) identically at every synthetic-fallback call site
|
||||
// below — factored out once so the slugification formula itself cannot drift.
|
||||
function slugifyPhaseName(phaseName: string | null): string | null {
|
||||
return phaseName
|
||||
? phaseName.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '')
|
||||
: null;
|
||||
// #3883 (ADR-3473 §8.3): delegate to the canonical slug formula
|
||||
// (generateSlugInternal, core-utils.cts) rather than re-implementing it.
|
||||
// `maxLen: null` preserves this site's pre-migration untruncated contract —
|
||||
// the 60-char default would collapse two distinct >60-char phase names onto
|
||||
// the same reported phase_slug.
|
||||
return phaseName ? coreUtils.generateSlugInternal(phaseName, null) : null;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1931,9 +1934,11 @@ function cmdInitPhaseOp(cwd: string, phase: string, raw: boolean): void {
|
||||
directory: null,
|
||||
phase_number: roadmapPhase['phase_number'],
|
||||
phase_name: phaseName,
|
||||
phase_slug: phaseName
|
||||
? phaseName.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '')
|
||||
: null,
|
||||
// #3883 (ADR-3473 §8.3): delegate to the canonical slug formula
|
||||
// (generateSlugInternal, core-utils.cts) rather than re-implementing
|
||||
// it. `maxLen: null` preserves this site's pre-migration untruncated
|
||||
// contract.
|
||||
phase_slug: phaseName ? coreUtils.generateSlugInternal(phaseName, null) : null,
|
||||
plans: [],
|
||||
summaries: [],
|
||||
incomplete_plans: [],
|
||||
@@ -1953,9 +1958,11 @@ function cmdInitPhaseOp(cwd: string, phase: string, raw: boolean): void {
|
||||
directory: null,
|
||||
phase_number: roadmapPhase['phase_number'],
|
||||
phase_name: phaseName,
|
||||
phase_slug: phaseName
|
||||
? phaseName.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '')
|
||||
: null,
|
||||
// #3883 (ADR-3473 §8.3): delegate to the canonical slug formula
|
||||
// (generateSlugInternal, core-utils.cts) rather than re-implementing
|
||||
// it. `maxLen: null` preserves this site's pre-migration untruncated
|
||||
// contract.
|
||||
phase_slug: phaseName ? coreUtils.generateSlugInternal(phaseName, null) : null,
|
||||
plans: [],
|
||||
summaries: [],
|
||||
incomplete_plans: [],
|
||||
@@ -3111,7 +3118,11 @@ function cmdInitProgress(cwd: string, raw: boolean, options: Record<string, unkn
|
||||
const status = 'not_started';
|
||||
const phaseInfo: Record<string, unknown> = {
|
||||
number: num,
|
||||
name: name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, ''),
|
||||
// #3883 (ADR-3473 §8.3): delegate to the canonical slug formula
|
||||
// (generateSlugInternal, core-utils.cts) rather than re-implementing
|
||||
// it. `maxLen: null` preserves this site's pre-migration untruncated
|
||||
// contract.
|
||||
name: coreUtils.generateSlugInternal(name, null) ?? '',
|
||||
directory: null,
|
||||
status,
|
||||
plan_count: 0,
|
||||
|
||||
Reference in New Issue
Block a user