Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions docs/NEXT_BACKLOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
47 changes: 47 additions & 0 deletions docs/PRODUCT_POSITIONING_EVIDENCE_2026-07-06.md
Original file line number Diff line number Diff line change
@@ -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.
Original file line number Diff line number Diff line change
Expand Up @@ -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. |
Expand Down Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
44 changes: 44 additions & 0 deletions scripts/quality-95-evidence.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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") &&
Expand Down Expand Up @@ -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
Expand Down
16 changes: 15 additions & 1 deletion src/cli/commands/quality-evidence.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -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",
Expand Down Expand Up @@ -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",
Expand Down
10 changes: 10 additions & 0 deletions src/packaging/plugin-files.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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",
);
Expand All @@ -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");
Expand All @@ -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");
Expand All @@ -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 |");
Expand Down Expand Up @@ -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");
Expand Down
21 changes: 14 additions & 7 deletions src/packaging/quality-evidence-script.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -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",
}),
Expand All @@ -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",
Expand All @@ -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",
Expand Down
24 changes: 24 additions & 0 deletions tasks/todo.md
Original file line number Diff line number Diff line change
@@ -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
Expand Down