From 719e02ea902bfb2dbeddc04f12be3617be3427b5 Mon Sep 17 00:00:00 2001 From: sechmachine <97589681+sechmachine727@users.noreply.github.com> Date: Sat, 15 Aug 2026 14:32:26 +0700 Subject: [PATCH] test: strengthen fix branch workflow evidence --- .../unit/fix-branch-workflow-documentation.md | 63 ++++++++++++------- 1 file changed, 39 insertions(+), 24 deletions(-) diff --git a/docs/tests/unit/fix-branch-workflow-documentation.md b/docs/tests/unit/fix-branch-workflow-documentation.md index f1af5f5..8675fc8 100644 --- a/docs/tests/unit/fix-branch-workflow-documentation.md +++ b/docs/tests/unit/fix-branch-workflow-documentation.md @@ -3,8 +3,9 @@ - **Test type:** Unit (documentation contract) - **Requirement IDs:** `OPS-019`, `TST-009`, `TST-010` - **Scenario IDs:** `AC-TST-001` -- **Test class/method:** Shell documentation contract: `fixBranchWorkflowRule` +- **Test class/method:** `scripts/verify-fix-branch-workflow.cjs --self-test` - **Implementation commit:** `f013ad7707b36959ddca891fe0d52f81bba3ee80` +- **Review-fix commit:** `d617769499362e92d058684501af3c1ae6b145b0` ## Protected behavior @@ -15,17 +16,18 @@ the impossible `work//fix/` form while persistent ## Test method -Use fixed-string repository searches rather than an artificial Java test. The -RED proves the required branch name was absent from the four contributor guides. -The GREEN checks every tracked guide and the design/plan records, then the -local requirements/SRS generator checks the unchanged requirement and use-case -counts. +Use the tracked Node validator rather than an artificial Java test. It requires +the exact approved statement in each of the six guides, then self-tests that an +extra positive nested-branch recommendation is rejected. The original RED +proves the required branch name was absent from the four contributor guides; +the review-fix RED proves the executable regression was absent. ## Hand-derived expected result -The required fix-branch spelling appears in all six tracked documentation -artifacts. The four contributor guides and design record identify the nested -form only as forbidden. The existing SRS generator must still report 260 +The required fix-branch spelling appears exactly once in each of the six tracked +documentation artifacts, and the only nested-form reference is inside that +artifact's exact approved statement. A simulated positive nested-branch +recommendation must fail. The existing SRS generator must still report 260 requirements and 14 use cases. ## RED @@ -45,27 +47,37 @@ exit 1; no matching lines The failure was expected: the required realizable repair-branch rule was absent before this documentation change. -## GREEN +### Review-fix RED **Command** ```text -rg -n -F 'work/fix//' AGENTS.md README.md DEVELOPMENT.md TESTING.md docs/superpowers/specs/2026-08-15-access-navigation-icon-intern-picker-design.md docs/superpowers/plans/2026-08-15-access-navigation-icon-intern-picker.md && rg -n -F 'work//fix/' AGENTS.md README.md DEVELOPMENT.md TESTING.md docs/superpowers/specs/2026-08-15-access-navigation-icon-intern-picker-design.md docs/superpowers/plans/2026-08-15-access-navigation-icon-intern-picker.md +node scripts/verify-fix-branch-workflow.cjs --self-test ``` **Observed result** ```text -exit 0 -AGENTS.md:123 -README.md:131 -DEVELOPMENT.md:68 -TESTING.md:124 -docs/superpowers/specs/2026-08-15-access-navigation-icon-intern-picker-design.md:17 -docs/superpowers/plans/2026-08-15-access-navigation-icon-intern-picker.md:13 +exit 1 +Error: Cannot find module '.../scripts/verify-fix-branch-workflow.cjs' +``` -The nested form appears only in instructions that call it invalid, forbidden, -or a form not to use. +The executable regression required to reject a positive nested-branch +recommendation did not exist. + +## GREEN + +**Command** + +```text +node scripts/verify-fix-branch-workflow.cjs --self-test +``` + +**Observed result** + +```text +Fix-branch workflow documentation: 6 approved statements validated +Positive nested branch recommendation: rejected ``` ## Affected suite @@ -76,13 +88,14 @@ or a form not to use. node labtimesheet-docs-hub/ui-mockups/build-srs.cjs node -e 'const fs=require("node:fs"); const checks=[["authoritative","labtimesheet-docs-hub/requirements-specification.md",/^\| ([A-Z]{2,4}-\d{3}) \|/gm],["explained","labtimesheet-docs-hub/explained/requirements-specification.md",/^\| ([A-Z]{2,4}-\d{3}) \|/gm],["simple","labtimesheet-docs-hub/explained/requirements-specification-simple.md",/^- \*\*([A-Z]{2,4}-\d{3}):\*\*/gm],["generated SRS","labtimesheet-docs-hub/software-requirements-specification.md",/^\| ([A-Z]{2,4}-\d{3}) \|/gm]]; for (const [name,file,pattern] of checks) { const ids=[...fs.readFileSync(file,"utf8").matchAll(pattern)].map(match=>match[1]); if (ids.length !== 260 || new Set(ids).size !== 260) throw new Error(`${name}: ${ids.length} rows, ${new Set(ids).size} unique`); console.log(`${name}: ${ids.length} rows, ${new Set(ids).size} unique IDs`); } const srs=fs.readFileSync("labtimesheet-docs-hub/software-requirements-specification.md","utf8"); const useCases=(srs.match(/^### 5\.\d+ UC-\d{2} —/gm)||[]).length; if (useCases !== 14) throw new Error(`SRS use cases: ${useCases}`); console.log(`generated SRS: ${useCases} use cases`);' node -e 'const fs=require("node:fs"); const path=require("node:path"); let checked=0; const broken=[]; for (const file of process.argv.slice(1)) { const text=fs.readFileSync(file,"utf8"); for (const match of text.matchAll(/!?\[[^\]]*\]\(([^)]+)\)/g)) { const target=match[1].trim().replace(/^<|>$/g,"").split("#")[0].split("?")[0]; if (!target || /^[a-z][a-z0-9+.-]*:/i.test(target) || target.startsWith("//")) continue; checked += 1; if (!fs.existsSync(path.resolve(path.dirname(file), decodeURIComponent(target)))) broken.push(`${file}: ${target}`); } } if (broken.length) throw new Error(`Broken local Markdown links:\n${broken.join("\n")}`); console.log(`Local Markdown links: ${checked} resolved`);' AGENTS.md README.md DEVELOPMENT.md TESTING.md docs/superpowers/specs/2026-08-15-access-navigation-icon-intern-picker-design.md docs/superpowers/plans/2026-08-15-access-navigation-icon-intern-picker.md docs/tests/unit/fix-branch-workflow-documentation.md -git diff --check +git diff --check 8be1b754e188367b260981718a5d33fc2d4d8a3b d617769499362e92d058684501af3c1ae6b145b0 ``` The SRS regeneration and count assertion ran from the main root because the ignored requirements hub is local authority there. The link assertion and -`git diff --check` ran from this fix worktree; the SRS generator also rejects a -broken local SRS target before it writes the generated file. +the exact base-to-candidate `git diff --check` ran from this fix worktree; the +SRS generator also rejects a broken local SRS target before it writes the +generated file. ```text Wrote labtimesheet-docs-hub/software-requirements-specification.md @@ -92,8 +105,10 @@ explained: 260 rows, 260 unique IDs simple: 260 rows, 260 unique IDs generated SRS: 260 rows, 260 unique IDs generated SRS: 14 use cases +Fix-branch workflow documentation: 6 approved statements validated +Positive nested branch recommendation: rejected Local Markdown links: 7 resolved -git diff --check: exit 0 +git diff --check 8be1b754e188367b260981718a5d33fc2d4d8a3b d617769499362e92d058684501af3c1ae6b145b0: exit 0 ``` ## External-test boundaries