diff --git a/docs/NEXT_BACKLOG.md b/docs/NEXT_BACKLOG.md index 21739afc..86d1a886 100644 --- a/docs/NEXT_BACKLOG.md +++ b/docs/NEXT_BACKLOG.md @@ -221,6 +221,13 @@ Decision: `dogfood:web-user-flow` browser evidence. `quality-evidence` records this as `manual_ui_patrol_artifact_evidence`, but `scheduled_ui_patrol` remains pending until a real cron `schedule` event exists. + `docs/UI_PATROL_SCHEDULE_READINESS_2026-07-06.md` records the current + scheduled patrol readiness: `ui-patrol.yml` has both manual and scheduled + triggers, the cron is `17 6 * * 1`, workflow_dispatch run `28717406758` + proves the 9-png artifact path, and `corepack pnpm evidence:ui-patrol` + refuses to treat manual evidence as cron completion. `quality-evidence` + records this as `scheduled_ui_patrol_preflight`, but it does not complete + `scheduled_ui_patrol`. `docs/CODEX_CLAUDE_LOCAL_INTEGRATION_EVIDENCE_2026-07-06.md` records current non-operator setup, hook, MCP, elicitation, no-dialog fallback, first-loop, and loop-memory evidence. `quality-evidence` records this as diff --git a/docs/UI_PATROL_SCHEDULE_READINESS_2026-07-06.md b/docs/UI_PATROL_SCHEDULE_READINESS_2026-07-06.md new file mode 100644 index 00000000..ef42e4c3 --- /dev/null +++ b/docs/UI_PATROL_SCHEDULE_READINESS_2026-07-06.md @@ -0,0 +1,22 @@ +# UI Patrol Schedule Readiness Evidence 2026-07-06 + +This ledger records the operational readiness evidence for the scheduled +`ui-patrol` workflow. It is not scheduled-run completion evidence. + +| Evidence | Status | Notes | +| --- | --- | --- | +| `.github/workflows/ui-patrol.yml` | PASS | The workflow has `workflow_dispatch` and `schedule` triggers. | +| Weekly cron | PASS | Configured as cron: `17 6 * * 1`. | +| Recent manual artifact | PASS | workflow_dispatch run `28717406758` uploaded `ui-patrol-screenshots` with 9 png files. | +| Repeatable checker | PASS | `corepack pnpm evidence:ui-patrol` distinguishes manual evidence from a real `schedule` event. | + +## Boundary + +This evidence proves the scheduled workflow is configured, manually runnable, +and guarded by a repeatable checker. It does not complete `scheduled_ui_patrol` +because the current workflow history has no successful `schedule` event with a +downloaded `ui-patrol-screenshots` artifact containing 9 png files. + +`quality-evidence` records this readiness ledger as +`scheduled_ui_patrol_preflight` and must keep `scheduled_ui_patrol` in remaining +evidence until the first real cron artifact is verified. diff --git a/docs/superpowers/plans/2026-07-05-promptlane-95-quality-plan.md b/docs/superpowers/plans/2026-07-05-promptlane-95-quality-plan.md index 98ef22f5..8dd55108 100644 --- a/docs/superpowers/plans/2026-07-05-promptlane-95-quality-plan.md +++ b/docs/superpowers/plans/2026-07-05-promptlane-95-quality-plan.md @@ -222,6 +222,12 @@ `corepack pnpm ui-patrol`, and `dogfood:web-user-flow`. `quality-evidence` records this as `manual_ui_patrol_artifact_evidence` while keeping `scheduled_ui_patrol` pending until a real cron `schedule` event exists. +- `docs/UI_PATROL_SCHEDULE_READINESS_2026-07-06.md` records scheduled patrol + readiness separately: `ui-patrol.yml` has both manual and scheduled triggers, + the cron is `17 6 * * 1`, the latest proven manual artifact path remains + workflow_dispatch run `28717406758`, and the repeatable evidence checker + refuses to treat that as cron completion. `quality-evidence` records this as + `scheduled_ui_patrol_preflight` while keeping `scheduled_ui_patrol` pending. - `docs/CODEX_CLAUDE_LOCAL_INTEGRATION_EVIDENCE_2026-07-06.md` records current non-operator Codex and Claude Code evidence: setup/doctor smoke, hook smoke, MCP coach-loop smoke, MCP elicitation smoke, no-dialog native fallback diff --git a/package.json b/package.json index 5e4fba6e..479d77d2 100644 --- a/package.json +++ b/package.json @@ -67,6 +67,7 @@ "docs/LOCAL_95_EVIDENCE_2026-07-06.md", "docs/PRODUCT_POSITIONING_EVIDENCE_2026-07-06.md", "docs/UI_PATROL_EVIDENCE_2026-07-06.md", + "docs/UI_PATROL_SCHEDULE_READINESS_2026-07-06.md", "docs/CODEX_CLAUDE_LOCAL_INTEGRATION_EVIDENCE_2026-07-06.md", "docs/RELEASE_CHECKLIST.md", "plugins", diff --git a/scripts/quality-95-evidence.mjs b/scripts/quality-95-evidence.mjs index 80c8df5b..ac54ba8d 100644 --- a/scripts/quality-95-evidence.mjs +++ b/scripts/quality-95-evidence.mjs @@ -172,6 +172,7 @@ function readCompletedEvidence() { let claudePlugin = ""; let claudeMarketplace = ""; let uiPatrolEvidence = ""; + let uiPatrolReadiness = ""; let codexClaudeEvidence = ""; try { plan = readFileSync(planPath, "utf8"); @@ -193,6 +194,10 @@ function readCompletedEvidence() { "docs/UI_PATROL_EVIDENCE_2026-07-06.md", "utf8", ); + uiPatrolReadiness = readFileSync( + "docs/UI_PATROL_SCHEDULE_READINESS_2026-07-06.md", + "utf8", + ); codexClaudeEvidence = readFileSync( "docs/CODEX_CLAUDE_LOCAL_INTEGRATION_EVIDENCE_2026-07-06.md", "utf8", @@ -201,6 +206,7 @@ function readCompletedEvidence() { return { product_positioning_metadata_alignment: false, manual_ui_patrol_artifact_evidence: false, + scheduled_ui_patrol_preflight: false, codex_claude_local_integration_evidence: false, web_user_flow_current_main_evidence: false, privacy_raw_free_regression_sweep: false, @@ -234,6 +240,11 @@ function readCompletedEvidence() { uiPatrolEvidence.includes("Local `corepack pnpm ui-patrol`") && uiPatrolEvidence.includes("pending_no_schedule_run") && uiPatrolEvidence.includes("manual_ui_patrol_artifact_evidence"), + scheduled_ui_patrol_preflight: + uiPatrolReadiness.includes("scheduled_ui_patrol_preflight") && + uiPatrolReadiness.includes("workflow_dispatch run `28717406758`") && + uiPatrolReadiness.includes("cron: `17 6 * * 1`") && + uiPatrolReadiness.includes("does not complete `scheduled_ui_patrol`"), codex_claude_local_integration_evidence: codexClaudeEvidence.includes("corepack pnpm smoke:agent-setup") && codexClaudeEvidence.includes("corepack pnpm smoke:hooks") && @@ -302,6 +313,12 @@ function axisEvidenceCoverage({ ) { satisfied.push("manual_ui_patrol_artifact_evidence"); } + if ( + axis.id === "web_ui_and_operational_evidence" && + completedEvidence.scheduled_ui_patrol_preflight + ) { + satisfied.push("scheduled_ui_patrol_preflight"); + } if ( axis.id === "local_first_privacy_boundary" && completedEvidence.privacy_raw_free_regression_sweep diff --git a/src/cli/commands/quality-evidence.test.ts b/src/cli/commands/quality-evidence.test.ts index d01fd3d9..4e3445f7 100644 --- a/src/cli/commands/quality-evidence.test.ts +++ b/src/cli/commands/quality-evidence.test.ts @@ -86,6 +86,7 @@ describe("quality-evidence CLI command", () => { satisfied_evidence: expect.arrayContaining([ "web_user_flow_current_main_evidence", "manual_ui_patrol_artifact_evidence", + "scheduled_ui_patrol_preflight", ]), remaining_evidence: expect.arrayContaining([ "scheduled_ui_patrol", @@ -168,7 +169,7 @@ describe("quality-evidence CLI command", () => { "web_ui_and_operational_evidence: blocked_external", ); expect(text).toContain( - "satisfied=web_user_flow_current_main_evidence,manual_ui_patrol_artifact_evidence", + "satisfied=web_user_flow_current_main_evidence,manual_ui_patrol_artifact_evidence,scheduled_ui_patrol_preflight", ); expect(text).toContain("remaining=scheduled_ui_patrol"); expect(text).toContain( diff --git a/src/packaging/plugin-files.test.ts b/src/packaging/plugin-files.test.ts index b226617b..171b75ae 100644 --- a/src/packaging/plugin-files.test.ts +++ b/src/packaging/plugin-files.test.ts @@ -903,6 +903,40 @@ describe("plugin packaging files", () => { expect(backlog).toContain("PR #420"); }); + it("ships scheduled ui-patrol preflight evidence without treating it as cron completion", () => { + const packageJson = JSON.parse( + readFileSync(join(process.cwd(), "package.json"), "utf8"), + ) as { files: string[] }; + const qualityScript = readFileSync( + join(process.cwd(), "scripts/quality-95-evidence.mjs"), + "utf8", + ); + const readiness = readFileSync( + join(process.cwd(), "docs/UI_PATROL_SCHEDULE_READINESS_2026-07-06.md"), + "utf8", + ); + const backlog = readFileSync( + join(process.cwd(), "docs/NEXT_BACKLOG.md"), + "utf8", + ); + + expect(packageJson.files).toContain( + "docs/UI_PATROL_SCHEDULE_READINESS_2026-07-06.md", + ); + expect(qualityScript).toContain("scheduled_ui_patrol_preflight"); + expect(qualityScript).toContain( + "UI_PATROL_SCHEDULE_READINESS_2026-07-06", + ); + expect(readiness).toContain("scheduled_ui_patrol_preflight"); + expect(readiness).toContain("workflow_dispatch run `28717406758`"); + expect(readiness).toContain("cron: `17 6 * * 1`"); + expect(readiness).toContain("does not complete `scheduled_ui_patrol`"); + expect(backlog).toContain("scheduled_ui_patrol_preflight"); + expect(backlog).toContain( + "docs/UI_PATROL_SCHEDULE_READINESS_2026-07-06.md", + ); + }); + it("ships a repeatable 9.5 quality evidence summary command", () => { const packageJson = readJson<{ files: string[]; diff --git a/src/packaging/quality-evidence-script.test.ts b/src/packaging/quality-evidence-script.test.ts index 67d94975..5b006920 100644 --- a/src/packaging/quality-evidence-script.test.ts +++ b/src/packaging/quality-evidence-script.test.ts @@ -187,6 +187,7 @@ describe("quality 9.5 evidence script", () => { satisfied_evidence: expect.arrayContaining([ "web_user_flow_current_main_evidence", "manual_ui_patrol_artifact_evidence", + "scheduled_ui_patrol_preflight", ]), remaining_evidence: expect.arrayContaining([ "scheduled_ui_patrol", diff --git a/tasks/todo.md b/tasks/todo.md index 7aa29b9a..e54ce8de 100644 --- a/tasks/todo.md +++ b/tasks/todo.md @@ -1,5 +1,27 @@ # 작업 계획 +## 2026-07-06 PromptLane UI Patrol Schedule Readiness Evidence + +- [x] CHECK: The GitHub `ui-patrol` workflow has no successful `schedule` event + yet, so `scheduled_ui_patrol` must stay pending. +- [x] RED: quality evidence CLI/script tests required + `web_ui_and_operational_evidence` to include + `scheduled_ui_patrol_preflight` while still keeping `scheduled_ui_patrol` and + `scorecard_level_below_9_5` as remaining evidence; packaging tests required + the readiness ledger to ship. +- [x] GREEN: `docs/UI_PATROL_SCHEDULE_READINESS_2026-07-06.md` records the + configured cron, latest manual artifact path, and checker boundary, and + `quality-evidence` exposes it as `scheduled_ui_patrol_preflight`. +- [x] EFFECT: agents can see schedule readiness without confusing it with + actual cron completion. + +### 판단 기준 + +- Do not mark scheduled `ui-patrol` complete without a real `schedule` event. +- Do not use workflow_dispatch evidence as a substitute for cron evidence. +- Keep readiness evidence visible so future work waits for the right external + event instead of rerunning unrelated local checks. + ## 2026-07-06 PromptLane Codex Claude Evidence Split - [x] CHECK: Codex/Claude integration still has an external native-dialog