diff --git a/docs/NEXT_BACKLOG.md b/docs/NEXT_BACKLOG.md index fa326ad4..c9370550 100644 --- a/docs/NEXT_BACKLOG.md +++ b/docs/NEXT_BACKLOG.md @@ -208,6 +208,14 @@ Decision: and continuation, and release stability are 9.5/10 in the scorecard. Product planning, Codex/Claude operator dogfood, web operations, scheduled `ui-patrol`, and native-dialog approved dogfood remain pending. + Product planning is now also 9.5/10 after + `docs/PRODUCT_POSITIONING_EVIDENCE_2026-07-06.md` recorded current GitHub + repository metadata, README/package/plugin metadata, the PromptLane product + contract, Loopdeck legacy decision, backlog, and goal-audit alignment. + `quality-evidence` records this as + `product_positioning_metadata_alignment`. + Codex/Claude operator dogfood, web operations, scheduled `ui-patrol`, and + native-dialog approved dogfood remain pending. - 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/PRODUCT_POSITIONING_EVIDENCE_2026-07-06.md b/docs/PRODUCT_POSITIONING_EVIDENCE_2026-07-06.md new file mode 100644 index 00000000..ddfdba4b --- /dev/null +++ b/docs/PRODUCT_POSITIONING_EVIDENCE_2026-07-06.md @@ -0,0 +1,47 @@ +# PromptLane Product Positioning Evidence 2026-07-06 + +This document records current evidence for the PromptLane product planning and +positioning 9.5 quality bar. + +## Metadata Evidence + +| Surface | Evidence | +| --- | --- | +| GitHub repository | `wlsdks/promptlane` description is `PromptLane local-first prompt improvement workspace for Codex, Claude Code, and long-running coding-agent work.` | +| GitHub topics | Includes `promptlane`, `prompt-improvement`, `meta-prompting`, `local-first`, `codex`, `claude-code`, `loop-engineering`, `mcp`, and `worktrees`. | +| npm package metadata | `package.json#description` uses PromptLane positioning while package name remains `prompt-coach` for compatibility. | +| Codex plugin metadata | `plugins/prompt-coach/.codex-plugin/plugin.json` uses `displayName: PromptLane` and PromptLane-first descriptions. | +| Claude plugin metadata | `.claude-plugin/plugin.json` and `.claude-plugin/marketplace.json` use PromptLane-first descriptions. | + +## Product Contract Evidence + +- `docs/PROMPTLANE.md` states the active product name, positioning, runtime + compatibility IDs, feature portfolio keep/improve/build/defer/reject + decisions, privacy boundaries, risk model, MVP slices, and autonomy model. +- `docs/superpowers/specs/2026-07-05-promptlane-repositioning-design.md` + records why `Loopdeck` and `Prompt Coach` were rejected as primary product + names and why PromptLane is the active service name. +- `docs/LOOPDECK.md` and `docs/LOOPDECK-LEGACY-SURFACES.md` keep Loopdeck as + historical terminology and compatibility-only surface. +- `docs/LOOPDECK_GOAL_AUDIT_2026-07-05.md` records product name, + positioning, feature portfolio, data model, privacy boundary, harness docs, + technical risk handling, and TDD implementation slices as satisfied for the + current compatibility window. +- `docs/NEXT_BACKLOG.md` keeps the operational queue aligned with PromptLane as + prompt improvement first and loop-aware continuation second. + +## Interpretation + +The product planning and positioning axis is ready for 9.5/10 because the +current first-screen README, package metadata, Codex plugin metadata, Claude +plugin metadata, GitHub repository metadata, product contract, backlog, and +goal audit all point to the same product shape: + +- PromptLane is the product name. +- `prompt-coach` remains the compatibility runtime ID. +- Prompt improvement is the first value. +- Loop/worktree/session features are loop-aware continuation for better next + prompts, not a separate loop-engineering product. +- Loopdeck is historical or compatibility-only terminology. +- Hidden provider calls, transcript scraping, automatic resubmission, and + automatic merge behavior remain rejected. 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 0430d981..ef7f1391 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 @@ -14,7 +14,7 @@ | Axis | Current level after latest evidence | 9.5 bar | Evidence that must exist | | --- | --- | --- | --- | -| Product planning and positioning | 9.2/10 | 9.5 bar: every active first-screen surface, plugin surface, README path, and backlog slice says PromptLane is prompt improvement first, loop-aware continuation second, with no product-facing Loopdeck drift. | Packaging guard, README/plugin metadata, repo metadata, docs/PROMPTLANE.md, docs/NEXT_BACKLOG.md, goal audit, expected-impact evidence. | +| Product planning and positioning | 9.5/10 | 9.5 bar: every active first-screen surface, plugin surface, README path, and backlog slice says PromptLane is prompt improvement first, loop-aware continuation second, with no product-facing Loopdeck drift. | Packaging guard, README/plugin metadata, repo metadata, docs/PROMPTLANE.md, docs/NEXT_BACKLOG.md, goal audit, expected-impact evidence. | | Local-first privacy boundary | 9.5/10 | 9.5 bar: every hook, MCP, CLI, server, web, export, loop, and dogfood path proves no prompt body, raw path, provider credential, transcript body, compact summary, or external provider call leaks outside the allowed storage layer. | Focused privacy tests, raw-free fixtures, dogfood:first-coach-loop, dogfood:loop-memory-approval, smoke:mcp-coach-loop, browser E2E, release smoke. | | Codex and Claude Code integration | 9.0/10 | 9.5 bar: setup, doctor, hook capture, MCP registration, plugin install guidance, slash commands, statusline, and recovery copy are all verified for both tools in isolated smoke and at least one real operator dogfood pass. | smoke:agent-setup, smoke:hooks, dogfood:first-coach-loop, docs/DOGFOOD_CODEX_CLAUDE_2026-07-05.md, AGENT-HARNESS. | | 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. | @@ -208,6 +208,14 @@ continuation, and release stability. This removes those scorecard-axis blockers while leaving product planning, Codex/Claude operator dogfood, web operations, scheduled `ui-patrol`, and native-dialog approved dogfood pending. +- `docs/PRODUCT_POSITIONING_EVIDENCE_2026-07-06.md` records current GitHub + repository metadata, README/package/plugin metadata, product contract, + backlog, goal audit, and Loopdeck legacy decision evidence. Product planning + and positioning is now 9.5/10 because those surfaces consistently present + PromptLane as prompt improvement first and loop-aware continuation second + while keeping `prompt-coach` as the compatibility runtime ID. + `quality-evidence` records this as + `product_positioning_metadata_alignment`. - 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 diff --git a/package.json b/package.json index 3c5d942b..72175386 100644 --- a/package.json +++ b/package.json @@ -65,6 +65,7 @@ "docs/PRE_PUBLISH_PRIVACY_AUDIT.md", "docs/RELEASE_STABILITY_EVIDENCE_2026-07-06.md", "docs/LOCAL_95_EVIDENCE_2026-07-06.md", + "docs/PRODUCT_POSITIONING_EVIDENCE_2026-07-06.md", "docs/RELEASE_CHECKLIST.md", "plugins", "integrations", diff --git a/scripts/quality-95-evidence.mjs b/scripts/quality-95-evidence.mjs index 7321c8bf..efdc1871 100644 --- a/scripts/quality-95-evidence.mjs +++ b/scripts/quality-95-evidence.mjs @@ -164,11 +164,32 @@ function readScorecardAxes() { function readCompletedEvidence() { let plan = ""; let localEvidence = ""; + let productEvidence = ""; + let promptlane = ""; + let readme = ""; + let packageJson = ""; + let codexPlugin = ""; + let claudePlugin = ""; + let claudeMarketplace = ""; try { plan = readFileSync(planPath, "utf8"); localEvidence = readFileSync("docs/LOCAL_95_EVIDENCE_2026-07-06.md", "utf8"); + productEvidence = readFileSync( + "docs/PRODUCT_POSITIONING_EVIDENCE_2026-07-06.md", + "utf8", + ); + promptlane = readFileSync("docs/PROMPTLANE.md", "utf8"); + readme = readFileSync("README.md", "utf8"); + packageJson = readFileSync("package.json", "utf8"); + codexPlugin = readFileSync( + "plugins/prompt-coach/.codex-plugin/plugin.json", + "utf8", + ); + claudePlugin = readFileSync(".claude-plugin/plugin.json", "utf8"); + claudeMarketplace = readFileSync(".claude-plugin/marketplace.json", "utf8"); } catch { return { + product_positioning_metadata_alignment: false, web_user_flow_current_main_evidence: false, privacy_raw_free_regression_sweep: false, codex_claude_setup_smoke_refresh: false, @@ -177,6 +198,23 @@ function readCompletedEvidence() { } return { + product_positioning_metadata_alignment: + productEvidence.includes("wlsdks/promptlane") && + productEvidence.includes("Prompt improvement is the first value") && + productEvidence.includes("Loopdeck is historical or compatibility-only") && + productEvidence.includes("GitHub repository metadata") && + promptlane.includes("Product name: PromptLane.") && + promptlane.includes("PromptLane starts with prompt improvement") && + promptlane.includes("Loop features are loop-aware continuation") && + readme.includes("Local-first prompt improvement workspace") && + readme.includes("loop-aware continuation") && + packageJson.includes( + "PromptLane local-first prompt improvement workspace for Codex, Claude Code, and long-running coding-agent work.", + ) && + codexPlugin.includes('"displayName": "PromptLane"') && + codexPlugin.includes("loop-aware continuation") && + claudePlugin.includes("PromptLane is a local-first prompt improvement workspace") && + claudeMarketplace.includes("PromptLane is a local-first prompt improvement workspace"), web_user_flow_current_main_evidence: plan.includes("web_user_flow_current_main_evidence") && plan.includes("corepack pnpm dogfood:web-user-flow") && @@ -217,6 +255,12 @@ function axisEvidenceCoverage({ const satisfied = []; const remaining = []; + if ( + axis.id === "product_planning_and_positioning" && + completedEvidence.product_positioning_metadata_alignment + ) { + satisfied.push("product_positioning_metadata_alignment"); + } if ( axis.id === "web_ui_and_operational_evidence" && completedEvidence.web_user_flow_current_main_evidence diff --git a/src/cli/commands/quality-evidence.test.ts b/src/cli/commands/quality-evidence.test.ts index 81d79961..9c84f0cd 100644 --- a/src/cli/commands/quality-evidence.test.ts +++ b/src/cli/commands/quality-evidence.test.ts @@ -38,6 +38,11 @@ describe("quality-evidence CLI command", () => { expect(parsed.scorecard_axes).toHaveLength(7); expect(parsed.scorecard_axes).toEqual( expect.arrayContaining([ + expect.objectContaining({ + id: "product_planning_and_positioning", + current_level: "9.5/10", + status: "meets_target", + }), expect.objectContaining({ id: "local_first_privacy_boundary", current_level: "9.5/10", @@ -62,6 +67,14 @@ describe("quality-evidence CLI command", () => { ); expect(parsed.axis_evidence_coverage).toEqual( expect.arrayContaining([ + expect.objectContaining({ + id: "product_planning_and_positioning", + status: "complete", + satisfied_evidence: expect.arrayContaining([ + "product_positioning_metadata_alignment", + ]), + remaining_evidence: [], + }), expect.objectContaining({ id: "local_first_privacy_boundary", status: "complete", @@ -141,8 +154,9 @@ describe("quality-evidence CLI command", () => { expect(text).toContain("PromptLane 9.5 quality evidence"); expect(text).toContain("Status: pending"); expect(text).toContain("Scorecard axes: 7"); - expect(text).toContain("Blockers: 5"); + expect(text).toContain("Blockers: 4"); expect(text).toContain("Axis evidence coverage"); + expect(text).toContain("product_planning_and_positioning: complete"); expect(text).toContain("local_first_privacy_boundary: complete"); expect(text).toContain( "web_ui_and_operational_evidence: blocked_external", diff --git a/src/packaging/plugin-files.test.ts b/src/packaging/plugin-files.test.ts index 049b53c2..889e3bb1 100644 --- a/src/packaging/plugin-files.test.ts +++ b/src/packaging/plugin-files.test.ts @@ -942,6 +942,9 @@ describe("plugin packaging files", () => { expect(packageJson.files).toContain( "docs/LOCAL_95_EVIDENCE_2026-07-06.md", ); + expect(packageJson.files).toContain( + "docs/PRODUCT_POSITIONING_EVIDENCE_2026-07-06.md", + ); expect(packageJson.scripts["evidence:quality"]).toBe( "node scripts/quality-95-evidence.mjs", ); @@ -962,6 +965,9 @@ describe("plugin packaging files", () => { } for (const content of [backlog, plan]) { expect(content).toContain("docs/LOCAL_95_EVIDENCE_2026-07-06.md"); + expect(content).toContain( + "docs/PRODUCT_POSITIONING_EVIDENCE_2026-07-06.md", + ); expect(content).toContain("PR #478"); expect(content).toContain("28753458359"); expect(content).toContain("corepack pnpm evidence:quality"); @@ -973,6 +979,7 @@ describe("plugin packaging files", () => { expect(content).toContain("scorecard_level_below_9_5"); expect(content).toContain("recommended_next_slices"); expect(content).toContain("blocked_by_external_event"); + expect(content).toContain("product_positioning_metadata_alignment"); expect(content).toContain("local-first privacy boundary"); expect(content).toContain("setup/doctor/MCP smoke"); expect(content).toContain("loop memory"); @@ -991,6 +998,7 @@ describe("plugin packaging files", () => { expect(content).toContain("native_dialog_approved_dogfood"); expect(content).toContain("scheduled_ui_patrol"); } + expect(plan).toContain("| Product planning and positioning | 9.5/10 |"); expect(plan).toContain("| Local-first privacy boundary | 9.5/10 |"); expect(plan).toContain("| Setup, doctor, and MCP smoke | 9.5/10 |"); expect(plan).toContain("| Loop memory and continuation | 9.5/10 |"); @@ -1030,6 +1038,8 @@ describe("plugin packaging files", () => { expect(evidenceScript).toContain("blocked_external"); expect(evidenceScript).toContain("recommendedNextSlices"); expect(evidenceScript).toContain("readCompletedEvidence"); + expect(evidenceScript).toContain("product_positioning_metadata_alignment"); + expect(evidenceScript).toContain("PRODUCT_POSITIONING_EVIDENCE_2026-07-06"); expect(evidenceScript).toContain("web_user_flow_current_main_evidence"); expect(evidenceScript).toContain("browser e2e passed"); expect(evidenceScript).toContain("privacy_raw_free_regression_sweep"); diff --git a/src/packaging/quality-evidence-script.test.ts b/src/packaging/quality-evidence-script.test.ts index 817e924d..a048a2ac 100644 --- a/src/packaging/quality-evidence-script.test.ts +++ b/src/packaging/quality-evidence-script.test.ts @@ -87,9 +87,9 @@ describe("quality 9.5 evidence script", () => { expect.arrayContaining([ expect.objectContaining({ id: "product_planning_and_positioning", - current_level: "9.2/10", + current_level: "9.5/10", target_level: "9.5/10", - status: "below_target", + status: "meets_target", }), expect.objectContaining({ id: "local_first_privacy_boundary", @@ -122,9 +122,12 @@ describe("quality 9.5 evidence script", () => { }), ]), ); - expect(parsed.blockers).toHaveLength(5); + expect(parsed.blockers).toHaveLength(4); expect(parsed.blockers).not.toEqual( expect.arrayContaining([ + expect.objectContaining({ + id: "scorecard_axis:product_planning_and_positioning", + }), expect.objectContaining({ id: "scorecard_axis:local_first_privacy_boundary", }), @@ -141,10 +144,6 @@ describe("quality 9.5 evidence script", () => { ); expect(parsed.blockers).toEqual( expect.arrayContaining([ - expect.objectContaining({ - id: "scorecard_axis:product_planning_and_positioning", - status: "below_target", - }), expect.objectContaining({ id: "scorecard_axis:codex_and_claude_code_integration", status: "below_target", @@ -165,6 +164,14 @@ describe("quality 9.5 evidence script", () => { ); expect(parsed.axis_evidence_coverage).toEqual( expect.arrayContaining([ + expect.objectContaining({ + id: "product_planning_and_positioning", + status: "complete", + satisfied_evidence: expect.arrayContaining([ + "product_positioning_metadata_alignment", + ]), + remaining_evidence: [], + }), expect.objectContaining({ id: "local_first_privacy_boundary", status: "complete", diff --git a/tasks/todo.md b/tasks/todo.md index 49b899fd..91e51020 100644 --- a/tasks/todo.md +++ b/tasks/todo.md @@ -1,5 +1,29 @@ # 작업 계획 +## 2026-07-06 PromptLane Product Positioning Evidence + +- [x] CHECK: GitHub repository metadata, README copy, package metadata, Codex + plugin metadata, Claude plugin metadata, product contract, backlog, and goal + audit all point to PromptLane as prompt improvement first and loop-aware + continuation second. +- [x] RED: quality evidence CLI/script tests required + `product_planning_and_positioning` to report `9.5/10`, `meets_target`, and + `product_positioning_metadata_alignment`; tests failed while the axis still + reported `9.2/10`. +- [x] GREEN: `docs/PRODUCT_POSITIONING_EVIDENCE_2026-07-06.md` records the + product-positioning evidence and `quality-evidence` now treats the axis as + complete when that ledger and metadata stay aligned. +- [x] EFFECT: `quality-evidence` removes the product-planning blocker while + keeping Codex/Claude operator dogfood, web operations, scheduled `ui-patrol`, + and native-dialog approved dogfood pending. + +### 판단 기준 + +- Do not rename `prompt-coach` runtime IDs during the compatibility window. +- Do not re-promote Loopdeck as product-facing identity. +- Do not claim full 9.5 completion while external integration and operational + blockers remain pending. + ## 2026-07-06 PromptLane Local Scorecard Axis Promotion - [x] CHECK: `scorecard_review_candidates` identified four axes whose local