CANP-WP-0002 T06: revision v0.2, and section 23 rewritten

Closes the workplan. The format becomes `canned-prompt/v0.2`, and packages
declaring v0.1 remain valid — everything added across T01-T05 is additive, so
a v0.1 package means exactly what it always meant. That is the MINOR case
section 17 itself describes.

The spec file loses its version suffix: CannedPromptFormat-v0.1.md becomes
CannedPromptFormat.md, with the revision stated inside. One stable path that
never breaks a link, and no rename per revision; the version belongs in the
`format` string where tools actually read it.

Section 23 is rewritten into three parts rather than the planned two.
"Settled since v0.1" tables the five resolved questions against where each
rule now lives. "Still deferred" carries the eight unpromoted items plus
pattern-matching render checks. "Decided against" holds template inheritance
alone, because calling it deferred would misdescribe it — reopening it means
overturning a decision and answering four recorded objections, not filling a
gap.

Section 23 also names the two habits the five decisions turned out to share,
so later revisions follow them rather than rediscover them: separate the
deterministic half from the rest, and a package never asserts what it cannot
back.

The eval-rubric and registry-manifest schemas keep their own v0.1. They are
new in this revision and sit on their own version lines.

Reference CLI: ACCEPTED_FORMATS; an unknown revision is rejected naming what is
accepted. Tests 78 -> 81.

Example packages declare v0.2 and are bumped 0.1.0 -> 0.1.1 and 0.2.0 -> 0.2.1
as section 17 PATCH — metadata corrections with behavior unchanged.

Also refreshes section 22's worked example, which had drifted: it showed
pqrst-estimate at 0.1.0 with no composition, contradicting the package
actually in the repo. It now mirrors the real package and doubles as a
composition illustration.

CANP-WP-0002 is finished. CANP-WP-0003 carries forward the one residual: the
default registry's basename-derived name reads as `registry:`.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bjefh8NUiEiahN4JLwoSKM

Assistant: claude-code
Assistant-Model: opus
Assistant-Process: 388925@bnt-lap001
Assistant-Session: 3507023f-e0fd-4a1e-9d90-a0d4217d1502
This commit is contained in:
tegwick 2026-09-06 14:22:45 +02:00
parent be675d33ad
commit 8376a00a88
10 changed files with 258 additions and 65 deletions

View file

@ -4,7 +4,7 @@ type: workplan
title: "Resolve CPF v0.1 open questions promoted for v0.2"
domain: agents
repo: canned-prompts
status: proposed
status: finished
owner: codex
topic_slug: practice
created: "2026-09-06"
@ -13,7 +13,7 @@ reviewed_at: "2026-09-06"
reviewed_by: "claude"
context_paths:
- "INTENT.md"
- "CannedPromptFormat-v0.1.md"
- "CannedPromptFormat.md"
- "reference/canned_prompts.py"
- "examples/pqrst-estimate/"
state_hub_workstream_id: "c87c8e27-8b11-5306-b687-86779ef3f1be"
@ -21,7 +21,7 @@ state_hub_workstream_id: "c87c8e27-8b11-5306-b687-86779ef3f1be"
# Resolve CPF v0.1 open questions promoted for v0.2
`CannedPromptFormat-v0.1.md` § 23 currently lists twelve items as "experience
`CannedPromptFormat.md` § 23 currently lists twelve items as "experience
should determine". A review of the seed on 2026-09-06 (spec + reference CLI +
`examples/pqrst-estimate`; 3/3 tests pass, full local lifecycle smokes clean)
plus an operator interview promoted five of them from "wait and see" to
@ -36,6 +36,11 @@ federated discovery, richer template syntax.
format may *declare* a requirement; it must not specify the resolver, runtime,
or execution engine that satisfies it.
**Outcome.** All seven tasks are done. The format is now revision v0.2
(`CannedPromptFormat.md`), the reference CLI covers eight verbs with 81 passing
tests, and § 23 records what was settled, what stays deferred, and what was
decided against. One residual is carried forward as `CANP-WP-0003`.
## Optional inputs need defaults
```task
@ -373,16 +378,48 @@ what it genuinely has. Illustrations live in the spec; examples stay honest.
```task
id: CANP-WP-0002-T06
status: todo
status: done
priority: medium
state_hub_task_id: "06032689-fc19-5fcd-a76e-5dbc87d02cd4"
```
After T01T05 land, replace § 23's flat twelve-item list with two sections:
questions **being decided for v0.2** (each with its scoped question and stated
leaning, referencing this workplan) and questions **still deferred** (the eight
unpromoted items listed at the top of this file). Bump the spec status line if
the format revision warrants it.
**Decisions (operator, 2026-09-06):**
- *Bump to `canned-prompt/v0.2`, accept both.* Everything added is additive, so
a v0.1 package means exactly what it always meant — the MINOR case § 17
itself describes. Tools accept both strings; new packages declare v0.2.
- *Drop the version from the spec filename.* `CannedPromptFormat-v0.1.md`
`CannedPromptFormat.md`, with the revision stated in the document. One stable
path that never breaks a link, and no rename per revision; the version lives
in the `format` string, where tools actually read it.
Delivered:
1. § 23 rewritten into three parts rather than the planned two. **Settled since
v0.1** tables the five resolved questions against where each rule now lives.
**Still deferred** carries the eight unpromoted items plus pattern-matching
render checks, deferred during T04. **Decided against** holds template
inheritance on its own, because "deferred" would misdescribe it: reopening
it means overturning a decision and answering four recorded objections, not
filling a gap.
2. § 23 also names the two habits the five decisions share, so later revisions
follow them rather than rediscover them: *separate the deterministic half
from the rest*, and *a package never asserts what it cannot back*.
3. Header now carries revision, status and a compatibility line; § 3.2 states
the acceptance rule and why v0.2 is MINOR; § 18 rule 3 checks for a
recognized revision rather than one literal string.
4. Stale "CPF v0.1" phrasings throughout replaced with unversioned wording. The
`canned-prompts/eval-rubric/v0.1` and `canned-prompt-registry/v0.1` schemas
deliberately keep their own v0.1 — they are new in this revision and on
their own version lines.
5. `reference/canned_prompts.py`: `ACCEPTED_FORMATS`; unknown revisions are
rejected with the accepted list. Tests 78 → 81.
6. Example packages declare v0.2, bumped 0.1.0 → 0.1.1 and 0.2.0 → 0.2.1 as
§ 17 PATCH — a metadata correction with intended behavior unchanged.
**Also fixed.** § 22's worked example had drifted: it showed `pqrst-estimate`
at 0.1.0 with no composition, contradicting the package actually in the repo.
It now mirrors the real package and doubles as a § 10.4 illustration.
## Reference implementation conformance fixes

View file

@ -0,0 +1,54 @@
---
id: CANP-WP-0003
type: workplan
title: "Default registry name reads as 'registry:'"
domain: agents
repo: canned-prompts
status: proposed
owner: codex
topic_slug: practice
created: "2026-09-06"
updated: "2026-09-06"
---
# Default registry name reads as `registry:`
Residual from `CANP-WP-0002` (`origin: residual`, `origin_ref: CANP-WP-0002`).
## Give the default registry a better name
```task
id: CANP-WP-0003-T01
status: todo
priority: low
```
`CANP-WP-0002-T02` made a registry's name come from its `registry.yaml`, and
otherwise from its directory basename (§ 20.1). The reference tool's default
registry lives at `~/.canned-prompts/registry`, so its basename-derived name is
`registry`, and every install from it reads:
```text
installed registry:practice/pqrst-estimate@0.1.0
```
That is honest — it is genuinely what the directory is called — but it reads
poorly, and `registry:` is a confusing qualifier for the one registry most
users will ever see.
Deliberately not fixed in `CANP-WP-0002`: special-casing the default path to
produce a prettier name would be exactly the kind of magic the § 20.1 rule was
written to avoid, and it was not worth an exception mid-task.
Options worth weighing:
1. Write a starter `registry.yaml` when the default registry is first created,
naming it something like `default` or `local-registry`. Uses the documented
mechanism rather than bypassing it; the cost is a tool writing a file into
a store the user may consider theirs.
2. Rename the default directory itself, so the basename is already good.
Changes an existing on-disk layout.
3. Accept it and document it. Zero code, and the escape hatch — add a
`registry.yaml` — already exists and is documented.
Option 3 is the current state. Pick deliberately rather than by default.