Skip to content

Commit ae36ced

Browse files
committed
PR_26174_ALFA_008-alpha-stack-final-validation
1 parent 7ebadc4 commit ae36ced

8 files changed

Lines changed: 91 additions & 139 deletions
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
Branch Validation: PASS
2+
3+
PASS - Current branch: pr/26174-ALFA-008-alpha-stack-final-validation.
4+
PASS - Stack base: pr/26174-ALFA-007-game-journey-count-ui-polish.
5+
PASS - PR_008 contains final validation reports only.
6+
PASS - No merge to main performed.
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# ALFA Stack Final Report
2+
3+
## Branch
4+
5+
pr/26174-ALFA-008-alpha-stack-final-validation
6+
7+
## Stack Head Before PR_008 Reports
8+
9+
7ebadc46f25cec3ad52e3432f9c198d4ebab6516
10+
11+
## Covered PRs
12+
13+
- PR_26174_ALFA_001-idea-board-create-project-api-contract
14+
- PR_26174_ALFA_002-game-hub-project-intake-display
15+
- PR_26174_ALFA_003-game-hub-journey-bootstrap
16+
- PR_26174_ALFA_004-game-hub-progress-count-model
17+
- PR_26174_ALFA_005-idea-project-validation-polish
18+
- PR_26174_ALFA_006-game-hub-empty-and-error-states
19+
- PR_26174_ALFA_007-game-journey-count-ui-polish
20+
21+
## Targeted Validation
22+
23+
PASS - Idea Board: full targeted spec validated Ready-only project conversion, source idea project intake, Game Hub display, Journey bootstrap, guest redirect, and locked Project rows.
24+
PASS - Game Hub: focused empty and unavailable states validated creator-safe messages without internal details.
25+
PASS - Game Journey: progress dashboard lane validated count defaults, numeric inputs, bucket/target order, API persistence, and reload persistence.
26+
27+
## Stack Executable Changed Files
28+
29+
- toolbox/idea-board/index.js
30+
- tests/playwright/tools/IdeaBoardTableNotes.spec.mjs
31+
- src/dev-runtime/persistence/mock-db-store.js
32+
- src/dev-runtime/persistence/tool-repositories/game-journey-mock-repository.js
33+
- src/dev-runtime/server/local-api-router.mjs
34+
- toolbox/game-hub/game-hub.js
35+
- tests/playwright/tools/GameHubMockRepository.spec.mjs
36+
- toolbox/game-journey/game-journey.js
37+
- tests/playwright/tools/GameJourneyTool.spec.mjs
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
Manual Validation Notes: PASS
2+
3+
PASS - Idea Board Create Project remains Ready-only, API-backed, locked/read-only after conversion, and guest-safe.
4+
PASS - Game Hub displays Idea Board-created projects and source notes through Local API persistence.
5+
PASS - Game Journey bootstrap creates starter buckets and source idea items through the service contract.
6+
PASS - Game Journey count model remains numeric, ordered, and persisted through updateRecommendedTarget.
7+
PASS - Game Hub empty and unavailable states use creator-safe copy and no silent fallback.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
Requirement Checklist: PASS
2+
3+
PASS - Ran targeted validation for ALFA_001 through ALFA_007.
4+
PASS - Produced final stack report.
5+
PASS - Confirmed changed files.
6+
PASS - Confirmed Playwright lane.
7+
PASS - Confirmed manual validation notes.
8+
PASS - Created required reports and repo-structured ZIP under tmp/.
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
Validation Lane: PASS
2+
3+
PASS - npx playwright test tests/playwright/tools/IdeaBoardTableNotes.spec.mjs
4+
PASS - npx playwright test tests/playwright/tools/GameHubMockRepository.spec.mjs -g "Game Hub shows a creator-safe empty state|Game Hub shows a creator-safe unavailable state"
5+
PASS - npx playwright test tests/playwright/tools/GameJourneyTool.spec.mjs -g "Game Journey progress dashboard summarizes completion metrics"
6+
7+
Notes:
8+
- These targeted Playwright lanes cover the ALFA_001 through ALFA_007 stack.
9+
- Full workspace smoke was not run.
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# PR_26174_ALFA_008-alpha-stack-final-validation
2+
3+
## Purpose
4+
5+
Run final targeted validation for ALFA_001 through ALFA_007 and produce the final stack report.
6+
7+
## Summary
8+
9+
- Ran targeted validation lanes covering Idea Board project conversion, Game Hub intake/empty/error states, Game Journey bootstrap, and count UI polish.
10+
- Confirmed stack changed files and manual validation notes.
11+
- Created report-only PR_008 artifacts; no executable code changed in this PR.
12+
13+
## Validation
14+
15+
PASS - `npx playwright test tests/playwright/tools/IdeaBoardTableNotes.spec.mjs`
16+
PASS - `npx playwright test tests/playwright/tools/GameHubMockRepository.spec.mjs -g "Game Hub shows a creator-safe empty state|Game Hub shows a creator-safe unavailable state"`
17+
PASS - `npx playwright test tests/playwright/tools/GameJourneyTool.spec.mjs -g "Game Journey progress dashboard summarizes completion metrics"`
Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
toolbox/game-journey/game-journey.js
2-
tests/playwright/tools/GameJourneyTool.spec.mjs
31
docs_build/dev/reports/codex_review.diff
42
docs_build/dev/reports/codex_changed_files.txt
5-
docs_build/dev/reports/PR_26174_ALFA_007-game-journey-count-ui-polish.md
6-
docs_build/dev/reports/PR_26174_ALFA_007-game-journey-count-ui-polish-branch-validation.txt
7-
docs_build/dev/reports/PR_26174_ALFA_007-game-journey-count-ui-polish-requirement-checklist.txt
8-
docs_build/dev/reports/PR_26174_ALFA_007-game-journey-count-ui-polish-validation-lane.txt
9-
docs_build/dev/reports/PR_26174_ALFA_007-game-journey-count-ui-polish-manual-validation-notes.txt
3+
docs_build/dev/reports/PR_26174_ALFA_008-alpha-stack-final-validation.md
4+
docs_build/dev/reports/PR_26174_ALFA_008-alpha-stack-final-validation-final-stack-report.md
5+
docs_build/dev/reports/PR_26174_ALFA_008-alpha-stack-final-validation-branch-validation.txt
6+
docs_build/dev/reports/PR_26174_ALFA_008-alpha-stack-final-validation-requirement-checklist.txt
7+
docs_build/dev/reports/PR_26174_ALFA_008-alpha-stack-final-validation-validation-lane.txt
8+
docs_build/dev/reports/PR_26174_ALFA_008-alpha-stack-final-validation-manual-validation-notes.txt
Lines changed: 1 addition & 132 deletions
Original file line numberDiff line numberDiff line change
@@ -1,132 +1 @@
1-
diff --git a/tests/playwright/tools/GameJourneyTool.spec.mjs b/tests/playwright/tools/GameJourneyTool.spec.mjs
2-
index e9005f08b..586e7521f 100644
3-
--- a/tests/playwright/tools/GameJourneyTool.spec.mjs
4-
+++ b/tests/playwright/tools/GameJourneyTool.spec.mjs
5-
@@ -69,7 +69,6 @@ async function openRepoPage(page, pathName, options = {}) {
6-
page.on("requestfailed", (request) => {
7-
failedRequests.push(`FAILED ${request.url()}`);
8-
});
9-
-
10-
if (collectCoverage) {
11-
await workspaceV2CoverageReporter.start(page);
12-
}
13-
@@ -258,6 +257,7 @@ test("Game Journey progress dashboard summarizes completion metrics", async ({ p
14-
const failedRequests = [];
15-
const pageErrors = [];
16-
const consoleErrors = [];
17-
+ const recommendedTargetRequests = [];
18-
19-
page.on("pageerror", (error) => {
20-
pageErrors.push(error.message);
21-
@@ -275,6 +275,12 @@ test("Game Journey progress dashboard summarizes completion metrics", async ({ p
22-
page.on("requestfailed", (request) => {
23-
failedRequests.push(`FAILED ${request.url()}`);
24-
});
25-
+ page.on("request", (request) => {
26-
+ const requestUrl = request.url();
27-
+ if (requestUrl.includes("/api/toolbox/game-journey/repositories/") && requestUrl.includes("/methods/updateRecommendedTarget")) {
28-
+ recommendedTargetRequests.push(request.postDataJSON());
29-
+ }
30-
+ });
31-
32-
try {
33-
await workspaceV2CoverageReporter.start(page);
34-
@@ -332,12 +338,23 @@ test("Game Journey progress dashboard summarizes completion metrics", async ({ p
35-
"Next action: mark one finished section item complete so overall progress can rise above 0%.",
36-
]);
37-
await expect(page.locator("[data-journey-recommended-target]")).toHaveCount(5);
38-
+ const recommendedTargetOrder = await page.locator("[data-journey-recommended-target]").evaluateAll((rows) => (
39-
+ rows.map((row) => row.dataset.journeyRecommendedTarget)
40-
+ ));
41-
+ expect(recommendedTargetOrder).toEqual([
42-
+ "hero",
43-
+ "enemy",
44-
+ "boss",
45-
+ "background",
46-
+ "music",
47-
+ ]);
48-
+ await expect(page.locator("[data-journey-recommended-targets] th")).toHaveText(["Target", "Section", "Count"]);
49-
await expect(page.locator("[data-journey-recommended-target] td:first-child")).toHaveText([
50-
- "Hero",
51-
- "Enemy",
52-
- "Boss",
53-
- "Background",
54-
- "Music",
55-
+ "Hero [1]",
56-
+ "Enemy [4]",
57-
+ "Boss [1]",
58-
+ "Background [3]",
59-
+ "Music [5]",
60-
]);
61-
await expect(page.locator("[data-journey-recommended-target='hero'] td").nth(1)).toHaveText("Objects");
62-
await expect(page.locator("[data-journey-recommended-target='enemy'] td").nth(1)).toHaveText("Objects");
63-
@@ -349,11 +366,19 @@ test("Game Journey progress dashboard summarizes completion metrics", async ({ p
64-
await expect(page.locator("[data-journey-target-input='boss']")).toHaveValue("1");
65-
await expect(page.locator("[data-journey-target-input='background']")).toHaveValue("3");
66-
await expect(page.locator("[data-journey-target-input='music']")).toHaveValue("5");
67-
+ await expect(page.locator("[data-journey-recommended-target] input[type='checkbox']")).toHaveCount(0);
68-
+ await expect(page.locator("[data-journey-target-input='hero']")).toHaveAttribute("type", "number");
69-
+ await expect(page.locator("[data-journey-target-input='hero']")).toHaveAttribute("inputmode", "numeric");
70-
+ await expect(page.locator("[data-journey-target-input='hero']")).toHaveAttribute("aria-label", "Hero count");
71-
await page.locator("[data-journey-target-input='hero']").fill("2");
72-
await expect(page.locator("[data-journey-target-status]")).toHaveText("Saved Hero target at 2.");
73-
await expect(page.locator("[data-journey-target-input='hero']")).toHaveValue("2");
74-
+ await expect(page.locator("[data-journey-target-count-preview='hero']")).toHaveText(" [2]");
75-
+ expect(recommendedTargetRequests).toHaveLength(1);
76-
+ expect(recommendedTargetRequests[0].args).toEqual(["hero", 2]);
77-
await page.reload({ waitUntil: "networkidle" });
78-
await expect(page.locator("[data-journey-target-input='hero']")).toHaveValue("2");
79-
+ await expect(page.locator("[data-journey-target-count-preview='hero']")).toHaveText(" [2]");
80-
const repositoryData = await fetchApiData(server, "/api/toolbox/game-journey/repositories", {
81-
body: JSON.stringify({ options: {} }),
82-
method: "POST",
83-
diff --git a/toolbox/game-journey/game-journey.js b/toolbox/game-journey/game-journey.js
84-
index c2b2f876c..332274910 100644
85-
--- a/toolbox/game-journey/game-journey.js
86-
+++ b/toolbox/game-journey/game-journey.js
87-
@@ -1161,7 +1161,7 @@ function renderRecommendedTargets() {
88-
table.setAttribute("aria-label", "Game Journey recommended planning targets");
89-
const head = createElement("thead");
90-
const headRow = createElement("tr");
91-
- ["Target", "Section", "Suggested"].forEach((heading) => {
92-
+ ["Target", "Section", "Count"].forEach((heading) => {
93-
const cell = createElement("th", { text: heading });
94-
cell.scope = "col";
95-
headRow.append(cell);
96-
@@ -1169,16 +1169,22 @@ function renderRecommendedTargets() {
97-
head.append(headRow);
98-
const body = createElement("tbody");
99-
targets.forEach((target) => {
100-
+ const targetCount = recommendedTargetValues.get(target.key) ?? target.suggestedCount;
101-
const row = createElement("tr");
102-
row.dataset.journeyRecommendedTarget = target.key;
103-
- const labelCell = createElement("td", { text: target.label });
104-
+ const labelCell = createElement("td");
105-
+ const label = createElement("span", { text: target.label });
106-
+ const countPreview = createElement("span", { text: ` [${targetCount}]` });
107-
+ countPreview.dataset.journeyTargetCountPreview = target.key;
108-
+ labelCell.append(label, countPreview);
109-
const sectionCell = createElement("td", { text: target.sectionName });
110-
const input = document.createElement("input");
111-
input.type = "number";
112-
+ input.inputMode = "numeric";
113-
input.min = "0";
114-
input.step = "1";
115-
- input.value = String(recommendedTargetValues.get(target.key) ?? target.suggestedCount);
116-
- input.setAttribute("aria-label", `${target.label} suggested target`);
117-
+ input.value = String(targetCount);
118-
+ input.setAttribute("aria-label", `${target.label} count`);
119-
input.dataset.journeyTargetInput = target.key;
120-
const inputCell = createElement("td");
121-
inputCell.append(input);
122-
@@ -1773,6 +1779,10 @@ recommendedTargets?.addEventListener("input", (event) => {
123-
const savedValue = normalizeTargetCount(updated.suggestedCount);
124-
recommendedTargetValues.set(target.key, savedValue);
125-
input.value = String(savedValue);
126-
+ const preview = recommendedTargets.querySelector(`[data-journey-target-count-preview='${target.key}']`);
127-
+ if (preview) {
128-
+ preview.textContent = ` [${savedValue}]`;
129-
+ }
130-
if (recommendedTargetStatus) {
131-
recommendedTargetStatus.textContent = `Saved ${target.label} target at ${savedValue}.`;
132-
}
1+
No executable code changes in PR_26174_ALFA_008; final validation and reporting only.

0 commit comments

Comments
 (0)