diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index 5a702cd3..00000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,38 +0,0 @@ -name: test - -on: - push: - branches: [main] - pull_request: - branches: [main] - -permissions: - contents: read - -jobs: - test: - runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - node-version: [22, 24] - - steps: - - uses: actions/checkout@v7 - - - uses: pnpm/action-setup@v6 - - - uses: actions/setup-node@v6 - with: - node-version: ${{ matrix.node-version }} - cache: pnpm - - - run: pnpm install --frozen-lockfile - - - run: pnpm test - - - run: pnpm lint - - - run: pnpm build - - - run: pnpm pack:dry-run diff --git a/AGENTS.md b/AGENTS.md index f5ae9cdc..202f01b4 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -50,7 +50,7 @@ git diff --check corepack pnpm ui-patrol ``` -Node 지원 범위는 `package.json#engines.node`가 authoritative하다. dependency update가 더 좁은 Node engine을 요구하면 package engine, README, CI 정책을 함께 검토하기 전에는 머지하지 않는다. +Node 지원 범위는 `package.json#engines.node`가 authoritative하다. dependency update가 더 좁은 Node engine을 요구하면 package engine, README, local gate 정책을 함께 검토하기 전에는 머지하지 않는다. ## Privacy And Local-First Invariants @@ -92,5 +92,5 @@ Node 지원 범위는 `package.json#engines.node`가 authoritative하다. depend - `main`은 보호 브랜치다. 새 브랜치에서 작업하고 PR로 머지한다. - 커밋 메시지는 Conventional Commits를 따른다. - 커밋 단위는 너무 잘게 쪼개지지 않게 한다. 하나의 PR은 "검증 가능한 행동 변화", "문서/의사결정 단위", "dependency update" 중 하나로 묶는다. -- solo-maintainer 단계에서는 PR이 CI `test (22)`, `test (24)`를 통과하고 unresolved conversation이 없으면 머지할 수 있다. +- solo-maintainer 단계에서는 focused tests와 local gate가 통과하고 unresolved conversation이 없으면 머지할 수 있다. 일반 PR/main test CI는 사용하지 않는다. - 최종 보고에는 커밋 해시, 푸시 여부, 검증 결과, 남은 리스크를 짧게 포함한다. diff --git a/docs/AGENT-HARNESS.md b/docs/AGENT-HARNESS.md index 22ae5d75..2024d800 100644 --- a/docs/AGENT-HARNESS.md +++ b/docs/AGENT-HARNESS.md @@ -169,7 +169,7 @@ Use the narrowest relevant gate first, then broaden before PR. | Web user-flow dogfood | `corepack pnpm dogfood:web-user-flow` and `docs/DOGFOOD_WEB_USER_FLOW_2026-07-05.md` | | Plugin/packaging | `corepack pnpm pack:dry-run`, package contents tests | | Instruction docs | `git diff --check`, packaging docs tests if shipped | -| Dependency update | CI `test (22)`, CI `test (24)`, engine compatibility review | +| Dependency update | local test/lint/build/pack gate, engine compatibility review | Full gate before merge unless the change is docs-only and the risk is clearly bounded: diff --git a/docs/NEXT_BACKLOG.md b/docs/NEXT_BACKLOG.md index c25fdb82..b1080e2c 100644 --- a/docs/NEXT_BACKLOG.md +++ b/docs/NEXT_BACKLOG.md @@ -46,6 +46,17 @@ After the PromptLane product contract and first-screen metadata are aligned, the next implementation work should favor reliability and agent-loop continuity over more naming work. +Current integration policy: + +- General PR/main test CI is removed. Use the local gate as the authoritative + release and merge signal: focused tests, `corepack pnpm test`, + `corepack pnpm lint`, `corepack pnpm build`, `corepack pnpm pack:dry-run`, + and slice-specific smoke/dogfood commands. +- Keep `.github/workflows/ui-patrol.yml` because scheduled browser screenshot + evidence is an external operational blocker, not a general CI gate. +- Do not re-add generic `test.yml` without a dedicated product decision that + explains what local-first risk it closes beyond the local gate. + Current goal audit: - `docs/superpowers/specs/2026-07-05-promptlane-repositioning-design.md` maps @@ -145,6 +156,10 @@ Current goal audit: - `docs/RELEASE_STABILITY_EVIDENCE_2026-07-06.md` records current `corepack pnpm smoke:release` and `corepack pnpm pack:dry-run` evidence for the local-first release path. +- General PR/main test CI has been removed by maintainer decision. Release + stability is now judged by the local release gate and package evidence; the + scheduled `ui-patrol` workflow remains only for external operational + evidence. Decision: @@ -171,7 +186,7 @@ Decision: - The 9.5 quality plan now includes an Evidence Progress Ledger with PR #417, PR #419, PR #421, PR #425, PR #427, PR #429, PR #433, PR #447, PR #449, PR #450, PR #457, PR #458, PR #460, PR #464, workflow_dispatch run - `28717406758`, latest main CI run `28750611089`, + `28717406758`, local release gate, `docs/RELEASE_STABILITY_EVIDENCE_2026-07-06.md`, the missing `schedule` event, and Remaining 9.5 blockers. - `corepack pnpm evidence:quality` emits the machine-readable @@ -244,6 +259,11 @@ Decision: dogfood recommendations include preconditions, completion evidence, and guardrails so agents can unblock the remaining 9.5 work without confusing manual/readiness evidence with real external completion. +- The human `prompt-coach quality-evidence` summary now renders external + evidence status directly: scheduled patrol status, workflow, cron, + `next_expected_schedule_utc`, and native dialog approved-run requirement. + Agents no longer need to switch to JSON output just to decide when to re-check + the remaining external blockers. - PR #478 moved that quality evidence gate onto the installed product CLI. Main CI run `28753458359` passed Node 22 and Node 24 after merge, so `prompt-coach quality-evidence --require-complete` is now a current default-branch release diff --git a/docs/PROMPTLANE.md b/docs/PROMPTLANE.md index fe44e433..2049f480 100644 --- a/docs/PROMPTLANE.md +++ b/docs/PROMPTLANE.md @@ -219,7 +219,7 @@ TDD execution rule for each slice: - RED: add the narrowest failing test or packaging guard first. - GREEN: make the smallest product-aligned change. - VERIFY: run the focused test, then broaden to the repo gate. -- INTEGRATE: commit, push, PR, CI `test (22)` and `test (24)`, merge, and prune. +- INTEGRATE: commit, push, PR, local gate, review, merge, and prune. ## Autonomy Model diff --git a/docs/RELEASE_CHECKLIST.md b/docs/RELEASE_CHECKLIST.md index ef9708ef..5bcd37c6 100644 --- a/docs/RELEASE_CHECKLIST.md +++ b/docs/RELEASE_CHECKLIST.md @@ -123,11 +123,11 @@ Confirm `corepack pnpm pack:dry-run` excludes: - [ ] Benchmark v1 passes with `privacy_leak_count` equal to 0. - [ ] Browser E2E passes on desktop and mobile viewport checks. -## CI +## Local Release Gate -- [ ] Node 22 CI passes. -- [ ] Node 24 CI passes. -- [ ] `better-sqlite3` opens a database and supports WAL/FTS5 in CI. +- [ ] Node support matches `package.json#engines.node`. +- [ ] `corepack pnpm test`, `lint`, `build`, and `pack:dry-run` pass locally. +- [ ] `better-sqlite3` opens a database and supports WAL/FTS5 in local smoke. - [ ] Platform support notes are accurate for the release. ## Manual Smoke diff --git a/docs/RELEASE_STABILITY_EVIDENCE_2026-07-06.md b/docs/RELEASE_STABILITY_EVIDENCE_2026-07-06.md index e6151872..ff356b8c 100644 --- a/docs/RELEASE_STABILITY_EVIDENCE_2026-07-06.md +++ b/docs/RELEASE_STABILITY_EVIDENCE_2026-07-06.md @@ -12,14 +12,17 @@ separate blockers. | `corepack pnpm smoke:release` | PASS | Built the package, initialized an isolated data directory and HOME, previewed Claude Code and Codex hook installers without touching real user config, started the local server, ingested Claude Code and Codex prompt fixtures, verified CLI list/search/show/rebuild-index, executed transcript import, verified imported-only filtering, previewed and executed anonymized export, then verified SQLite, Markdown, FTS, and delete cleanup. | | `corepack pnpm pack:dry-run` | PASS | Built server and web assets, ran the package dry-run wrapper, and produced `prompt-coach-0.1.0-beta.0.tgz` with 344 files including this release evidence document. | -## CI +## Local Release Gate - PR #464 added this evidence document, package manifest coverage, and the release-stability packaging guard. -- main CI run `28750611089` passed `test (22)` and `test (24)` after PR #464 - merged. -- Both jobs ran `pnpm test`, `pnpm lint`, `pnpm build`, and - `pnpm pack:dry-run`. +- The current local release gate is local-first: focused tests, + `corepack pnpm test`, `corepack pnpm lint`, `corepack pnpm build`, + `corepack pnpm pack:dry-run`, `corepack pnpm smoke:release`, and package + manifest guards. +- General PR/main test CI is not a release requirement. The scheduled + `ui-patrol.yml` workflow remains separate operational evidence for browser + screenshots. ## Privacy Observations 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 9db64153..0024642f 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 @@ -6,7 +6,7 @@ **Architecture:** Treat 9.5 as a proof standard, not a slogan. Each score axis must have a measurable bar, current evidence, missing evidence, and one or more TDD slices that close the gap without changing the trust model. Keep `PromptLane` as product name and `prompt-coach` as runtime compatibility id until a dedicated migration proves otherwise. -**Tech Stack:** TypeScript, Node.js, Commander CLI, Fastify, SQLite, React/Vite, Vitest, Playwright, pnpm, GitHub Actions, Codex and Claude Code hooks/MCP/plugin surfaces. +**Tech Stack:** TypeScript, Node.js, Commander CLI, Fastify, SQLite, React/Vite, Vitest, Playwright, pnpm, Codex and Claude Code hooks/MCP/plugin surfaces. GitHub Actions is used only for scheduled `ui-patrol` operational evidence. --- @@ -20,7 +20,7 @@ | Setup, doctor, and MCP smoke | 9.5/10 | 9.5 bar: setup and doctor smoke proves capture readiness; MCP smoke proves score/improve/clarify/record loop; failure states produce raw-free recovery actions instead of generic errors. | smoke:agent-setup, smoke:mcp-coach-loop, storage_unavailable tests, package checks. | | Loop memory and continuation | 9.5/10 | 9.5 bar: collect, brief, outcome, memory candidate, memory approval, instruction patch proposal, and apply gate are proven through CLI and MCP with evidence-first rules and no automatic instruction writes. | Loop unit tests, storage evidence guards, dogfood:first-coach-loop, dogfood:loop-memory-approval, prompt-linked outcome evidence. | | Web UI and operational evidence | 8.6/10 | 9.5 bar: archive, detail, coach, saved draft reuse, settings, loops, exports, projects, and mobile layout have screenshots or browser assertions, plus scheduled `ui-patrol` artifact evidence. | corepack pnpm ui-patrol, workflow_dispatch run `28717406758`, scheduled `ui-patrol`, browser E2E, screenshot artifacts, in-app Browser audit. | -| Release stability | 9.5/10 | 9.5 bar: Node 22 and 24 CI, pack dry-run, release smoke, first coach loop dogfood, package contents, dependency audit, and release checklist all agree on shipped files and commands. | GitHub Actions, corepack pnpm pack:dry-run, smoke:release, dogfood:first-coach-loop, dogfood:loop-memory-approval, docs/RELEASE_CHECKLIST.md. | +| Release stability | 9.5/10 | 9.5 bar: local supported-node gate, pack dry-run, release smoke, first coach loop dogfood, package contents, dependency audit, and release checklist all agree on shipped files and commands. | Local release gate, corepack pnpm pack:dry-run, smoke:release, dogfood:first-coach-loop, dogfood:loop-memory-approval, docs/RELEASE_CHECKLIST.md. | ## Evidence Progress Ledger @@ -121,19 +121,21 @@ - `docs/RELEASE_STABILITY_EVIDENCE_2026-07-06.md` records current `corepack pnpm smoke:release` and `corepack pnpm pack:dry-run` evidence for the local-first release path. -- PR #464 closed the release-stability evidence log after local release smoke, - package dry-run, PR CI, latest main CI run `28750611089`, and branch pruning - proved the evidence document on the default branch. -- latest main CI run `28750611089` after PR #464 passed `test (22)` and - `test (24)` with `pnpm test`, `pnpm lint`, `pnpm build`, and - `pnpm pack:dry-run`. +- PR #464 added the release-stability evidence document and package manifest + guards. The local release gate now owns release stability evidence: focused tests, + `corepack pnpm test`, `corepack pnpm lint`, `corepack pnpm build`, + `corepack pnpm pack:dry-run`, `smoke:release`, and package manifest guards + prove the shipped files and commands. +- General test CI was removed by maintainer decision. Do not reintroduce + PR/main test workflows as a release-stability requirement without a dedicated + product decision; keep scheduled `ui-patrol` as the only GitHub Actions + workflow because it proves external operational evidence. - PR #478 exposed the same 9.5 quality evidence as an installed product CLI: `prompt-coach quality-evidence`, `prompt-coach quality-evidence --json`, and `prompt-coach quality-evidence --require-complete`. The command lists every current scorecard/direct evidence blocker, keeps output local and raw-free, - and exits nonzero while completion evidence remains pending. Main CI run - `28753458359` passed Node 22 and Node 24 after merge with `pnpm test`, - `pnpm lint`, `pnpm build`, and `pnpm pack:dry-run`. + and exits nonzero while completion evidence remains pending. Future changes + use the local gate instead of PR/main test CI. ## Remaining 9.5 blockers @@ -245,10 +247,13 @@ completion evidence, and guardrails for the remaining external blockers. This makes the next operator or scheduled-event pass executable without changing the rule that 9.5 remains pending until real external evidence exists. -- PR #478 proved that installed CLI path on the default branch; main CI run - `28753458359` passed Node 22 and Node 24 after merge, so future agents can use - the product CLI itself to decide whether 9.5 is still blocked before claiming - completion. +- The human `prompt-coach quality-evidence` output also renders external + evidence status, including scheduled patrol cron and next expected UTC check + time plus the native dialog approved-run requirement, so normal CLI use can + drive the remaining external work without requiring JSON parsing. +- PR #478 proved that installed CLI path on the default branch, so future + agents can use the product CLI itself to decide whether 9.5 is still blocked + before claiming completion. - Native OS ask UI dogfood remains operator-approved only; do not run `dogfood:mcp-native-dialog-approved` without explicit approval because it can open a native dialog. @@ -485,4 +490,4 @@ Expected: pass. ## Completion Rule -Do not call the long-running goal complete until every scorecard axis has current evidence at the 9.5 bar. Passing unit tests alone is not enough; dogfood evidence, CI evidence, package evidence, and privacy evidence must match the axis being claimed. +Do not call the long-running goal complete until every scorecard axis has current evidence at the 9.5 bar. Passing unit tests alone is not enough; dogfood evidence, local gate evidence, package evidence, and privacy evidence must match the axis being claimed. diff --git a/scripts/quality-95-evidence.mjs b/scripts/quality-95-evidence.mjs index fbf6e828..255cdd3e 100644 --- a/scripts/quality-95-evidence.mjs +++ b/scripts/quality-95-evidence.mjs @@ -5,6 +5,8 @@ import { readFileSync } from "node:fs"; const planPath = "docs/superpowers/plans/2026-07-05-promptlane-95-quality-plan.md"; const nativeDialogAuditPath = "docs/NATIVE_DIALOG_DOGFOOD_AUDIT_2026-07-05.md"; +const uiPatrolWorkflow = "ui-patrol.yml"; +const uiPatrolScheduleCron = "17 6 * * 1"; const args = parseArgs(process.argv.slice(2)); const uiPatrol = args.uiPatrolJson @@ -111,6 +113,8 @@ function runUiPatrolEvidence() { return { check: "scheduled_ui_patrol", status: "unknown_checker_failed", + workflow: uiPatrolWorkflow, + schedule_cron: uiPatrolScheduleCron, next_action: "Run corepack pnpm evidence:ui-patrol and inspect stderr.", }; } @@ -120,6 +124,8 @@ function runUiPatrolEvidence() { return { check: "scheduled_ui_patrol", status: "unknown_invalid_checker_output", + workflow: uiPatrolWorkflow, + schedule_cron: uiPatrolScheduleCron, next_action: "Fix scripts/ui-patrol-evidence.mjs JSON output.", }; } diff --git a/src/cli/commands/quality-evidence.test.ts b/src/cli/commands/quality-evidence.test.ts index 475631bf..f64f920e 100644 --- a/src/cli/commands/quality-evidence.test.ts +++ b/src/cli/commands/quality-evidence.test.ts @@ -210,6 +210,19 @@ describe("quality-evidence CLI command", () => { expect(text).toContain("remaining=native_dialog_approved_dogfood"); expect(text).toContain("Scorecard review candidates"); expect(text).toContain("- none"); + expect(text).toContain("External evidence status"); + expect(text).toContain( + "scheduled_ui_patrol:", + ); + expect(text).toContain( + "workflow=ui-patrol.yml cron=17 6 * * 1", + ); + if (text.includes("pending_no_schedule_run")) { + expect(text).toContain("next_expected_schedule_utc="); + } + expect(text).toContain( + "native_dialog_approved_dogfood: pending_operator_approval approved_run_required=yes", + ); expect(text).toContain("scheduled_ui_patrol"); expect(text).toContain("native_dialog_approved_dogfood"); expect(text).toContain("Recommended next slices"); diff --git a/src/cli/commands/quality-evidence.ts b/src/cli/commands/quality-evidence.ts index 6f81cb74..1796a611 100644 --- a/src/cli/commands/quality-evidence.ts +++ b/src/cli/commands/quality-evidence.ts @@ -35,6 +35,18 @@ type QualityEvidenceSummary = { guardrails?: string[]; expected_effect: string; }>; + evidence?: { + scheduled_ui_patrol?: { + status: string; + workflow?: string; + schedule_cron?: string; + next_expected_schedule_utc?: string; + }; + native_dialog_approved_dogfood?: { + status: string; + approved_run_required?: boolean; + }; + }; next_action: string; }; @@ -139,6 +151,7 @@ function formatSummary(summary: QualityEvidenceSummary): string { `- ${axis.id}: review=${axis.required_review} satisfied=${axis.satisfied_evidence.join(",") || "none"}`, ) : ["- none"]; + const externalEvidenceRows = formatExternalEvidenceRows(summary); return [ "PromptLane 9.5 quality evidence", @@ -155,6 +168,9 @@ function formatSummary(summary: QualityEvidenceSummary): string { "Scorecard review candidates", ...scorecardReviewRows, "", + "External evidence status", + ...externalEvidenceRows, + "", "Recommended next slices", ...recommendedRows, "", @@ -163,3 +179,27 @@ function formatSummary(summary: QualityEvidenceSummary): string { "Privacy: local-only, no external calls, no prompt bodies, no raw paths.", ].join("\n"); } + +function formatExternalEvidenceRows(summary: QualityEvidenceSummary): string[] { + const rows: string[] = []; + const scheduled = summary.evidence?.scheduled_ui_patrol; + if (scheduled) { + rows.push( + `- scheduled_ui_patrol: ${scheduled.status} workflow=${scheduled.workflow ?? "unknown"} cron=${scheduled.schedule_cron ?? "unknown"}`, + ); + if (scheduled.next_expected_schedule_utc) { + rows.push( + ` next_expected_schedule_utc=${scheduled.next_expected_schedule_utc}`, + ); + } + } + + const nativeDialog = summary.evidence?.native_dialog_approved_dogfood; + if (nativeDialog) { + rows.push( + `- native_dialog_approved_dogfood: ${nativeDialog.status} approved_run_required=${nativeDialog.approved_run_required ? "yes" : "no"}`, + ); + } + + return rows.length > 0 ? rows : ["- none"]; +} diff --git a/src/packaging/plugin-files.test.ts b/src/packaging/plugin-files.test.ts index be71f5e4..91365950 100644 --- a/src/packaging/plugin-files.test.ts +++ b/src/packaging/plugin-files.test.ts @@ -641,7 +641,7 @@ describe("plugin packaging files", () => { "RED: add the narrowest failing test or packaging guard first", "GREEN: make the smallest product-aligned change", "VERIFY: run the focused test, then broaden to the repo gate", - "INTEGRATE: commit, push, PR, CI `test (22)` and `test (24)`, merge, and prune", + "INTEGRATE: commit, push, PR, local gate, review, merge, and prune", ]) { expect(positioning).toContain(requiredText); } @@ -1046,7 +1046,7 @@ describe("plugin packaging files", () => { "docs/CODEX_CLAUDE_LOCAL_INTEGRATION_EVIDENCE_2026-07-06.md", ); expect(content).toContain("PR #478"); - expect(content).toContain("28753458359"); + expect(content).toContain("local gate"); expect(content).toContain("corepack pnpm evidence:quality"); expect(content).toContain("corepack pnpm --silent evidence:quality"); expect(content).toContain("node scripts/quality-95-evidence.mjs"); @@ -1281,14 +1281,10 @@ describe("plugin packaging files", () => { expect(todoSection).toContain("`corepack pnpm ui-patrol`"); }); - it("keeps CI setup actions on Node 24 compatible versions", () => { - const workflow = readFileSync( - join(process.cwd(), ".github/workflows/test.yml"), - "utf8", + it("keeps the general test CI workflow removed", () => { + expect(existsSync(join(process.cwd(), ".github/workflows/test.yml"))).toBe( + false, ); - - expect(workflow).toContain("pnpm/action-setup@v6"); - expect(workflow).not.toContain("pnpm/action-setup@v4"); }); it("keeps better-sqlite3 on the Node 24 release-stability line", () => { @@ -1348,7 +1344,7 @@ describe("plugin packaging files", () => { "PR #433", "PR #434", "PR #464", - "latest main CI run `28750611089`", + "local release gate", "docs/RELEASE_STABILITY_EVIDENCE_2026-07-06.md", "corepack pnpm smoke:release", ]) { @@ -1361,9 +1357,10 @@ describe("plugin packaging files", () => { "corepack pnpm smoke:release", "corepack pnpm pack:dry-run", "PR #464", - "main CI run `28750611089`", - "test (22)", - "test (24)", + "local release gate", + "corepack pnpm test", + "corepack pnpm lint", + "corepack pnpm build", "Raw prompt bodies, raw local paths, and token-like secrets were not emitted", ]) { expect(releaseEvidence).toContain(releaseEvidenceText); @@ -1438,7 +1435,7 @@ describe("plugin packaging files", () => { "docs/DOGFOOD_WEB_USER_FLOW_2026-07-05.md", "workflow_dispatch run `28717406758`", "PR #464", - "latest main CI run `28750611089`", + "local release gate", "docs/RELEASE_STABILITY_EVIDENCE_2026-07-06.md", "corepack pnpm smoke:release", "no `schedule` event", @@ -1456,7 +1453,7 @@ describe("plugin packaging files", () => { "`effectiveness` verdict", "effectiveness calibration", "PR #464", - "latest main CI run `28750611089`", + "local release gate", "docs/RELEASE_STABILITY_EVIDENCE_2026-07-06.md", ]) { expect(backlog).toContain(currentBacklogEvidence); diff --git a/tasks/todo.md b/tasks/todo.md index 86c58de8..fb6eca2c 100644 --- a/tasks/todo.md +++ b/tasks/todo.md @@ -1,5 +1,46 @@ # 작업 계획 +## 2026-07-06 PromptLane General CI Removal + +- [x] CHECK: PR/main test workflow가 남아 있어 PR #495에서 GitHub Actions + 환경의 `gh run list` 실패가 제품 변경과 무관한 CI 실패로 드러났다. +- [x] RED: packaging guard는 `.github/workflows/test.yml`이 없어야 한다고 + 요구하고, PromptLane 실행 계획 문구는 PR CI 대신 local gate를 요구한다. +- [x] GREEN: 일반 test CI workflow를 삭제하고, release/backlog/quality-plan + 문서를 local gate 기준으로 갱신했다. 예약된 `ui-patrol.yml`은 외부 운영 + 증거 수집 workflow라 유지한다. +- [x] EFFECT: 향후 merge/release 판단은 focused tests, `corepack pnpm test`, + `corepack pnpm lint`, `corepack pnpm build`, `corepack pnpm pack:dry-run`, + 필요한 smoke/dogfood 명령으로 판단한다. + +### 판단 기준 + +- Do not re-add generic PR/main `test.yml` without a dedicated product decision. +- Keep scheduled `ui-patrol.yml` because it proves external browser screenshot + evidence, not general CI correctness. +- Historical CI evidence may remain as history, but active gates must name the + local release gate. + +## 2026-07-06 PromptLane Quality Evidence External Status Text + +- [x] CHECK: `quality-evidence --json` exposed external evidence metadata, but + human `quality-evidence` text skipped schedule/native evidence status. +- [x] RED: CLI test required an `External evidence status` section with + scheduled patrol status, workflow, cron, next expected schedule time, and + native dialog approved-run requirement; the focused test failed while the + section was absent. +- [x] GREEN: the text formatter now renders external evidence status when the + JSON summary includes it. +- [x] EFFECT: operators and agents can use the default CLI summary to decide + when to re-check the remaining external blockers. + +### 판단 기준 + +- Do not remove or downgrade the external blockers through text rendering. +- Keep text output raw-free and free of local paths. +- Keep JSON output unchanged except for data already emitted by the evidence + script. + ## 2026-07-06 PromptLane UI Patrol Next Schedule Evidence - [x] CHECK: `ui-patrol.yml` still has no `schedule` event, and