Collect, reuse and share prompts and prompt templates
Find a file
tegwick 4a56f20209 CANP-WP-0002 T03: composition by reference, two kinds
T01 had already delivered half of composition without naming it: a derived
default binds an input to a prompt dependency, which is transclusion — run
package B, use its output. What was missing was the deterministic half.

`include` inlines another package's rendered template as text. No model is
involved, so the reference CLI can actually perform it, and a shared preamble,
rubric or style block becomes a versioned package instead of copied text. This
is the concrete way to honor INTENT principle 9 without any runtime. `derive`
stays as it was. Both are input defaults, so composition reuses the resolution
machinery rather than adding a second one.

No template inheritance. Four of this repo's own documents argue against it:
INTENT principle 3 (hidden context defeats reuse), section 19's "make package
contents visible before execution", section 17's requirement that behavior
changes produce a new version, and the non-goal on range resolution.

Version selectors: an exact pin is the expected form, with `any`, `newest` and
`>= X.Y.Z` as explicit opt-ins so looseness is written rather than implied by
absence. Selectors are evaluated per dependency against what is available —
no solver, no cross-dependency constraint satisfaction — which is what keeps
them outside the range-resolution non-goal, and the spec says so.

Also defines `type` (template | fragment), which appeared once in the section 4
manifest surface and was specified nowhere.

Spec: 3.2 (type), 5.1 (inclusion resolution rule, renumbered), 6.1 (included
default), 10.1 and 10.2 (new), 18 (rules 14-16), 21.

Reference CLI: validate_version_selector, select_version,
prompt_dependencies replacing prompt_dependency_ids,
check_composition_reference, CatalogComposer with cycle detection, and
resolve_inputs gaining composer= and inherited=. Tests 21 -> 42.

Examples: house-style is a real fragment package; pqrst-estimate composes it
and is bumped 0.1.0 -> 0.2.0 per section 17.

Fixes an ordering bug found while testing: inputs resolved before parameters,
so an included package could not see the including package's parameters and
silently fell back to its own defaults — the fragment rendered tone=neutral
where the including package said blunt. Parameters now resolve first; the
report still lists inputs first.

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
2026-09-06 01:31:58 +02:00
examples CANP-WP-0002 T03: composition by reference, two kinds 2026-09-06 01:31:58 +02:00
reference CANP-WP-0002 T03: composition by reference, two kinds 2026-09-06 01:31:58 +02:00
workplans CANP-WP-0002 T03: composition by reference, two kinds 2026-09-06 01:31:58 +02:00
.custodian-brief.md chore(consistency): sync task status from DB [auto] 2026-09-06 00:47:38 +02:00
.gitignore Register with Custodian State Hub and seed format open-questions workplan 2026-09-06 00:45:28 +02:00
.repo-classification.yaml Add repo classification and record workplan review context 2026-09-06 00:47:23 +02:00
AGENTS.md Register with Custodian State Hub and seed format open-questions workplan 2026-09-06 00:45:28 +02:00
CannedPromptFormat-v0.1.md CANP-WP-0002 T03: composition by reference, two kinds 2026-09-06 01:31:58 +02:00
INTENT.md Register with Custodian State Hub and seed format open-questions workplan 2026-09-06 00:45:28 +02:00
README.md CANP-WP-0002 T03: composition by reference, two kinds 2026-09-06 01:31:58 +02:00
SCOPE.md Register with Custodian State Hub and seed format open-questions workplan 2026-09-06 00:45:28 +02:00
WORK-RECORDS.md chore(consistency): regenerate WORK-RECORDS.md 2026-09-06 01:15:49 +02:00

canned-prompts seed

Collect, reuse and share prompts and prompt templates.

This bundle contains a first project seed for canned-prompts:

Try the reference implementation

cd reference
python -m venv .venv
. .venv/bin/activate            # Windows: .venv\Scripts\activate
pip install -r requirements.txt

# add the included examples to your local catalog
python canned_prompts.py add ../examples/house-style
python canned_prompts.py add ../examples/pqrst-estimate

# find and inspect it
python canned_prompts.py search pqrst
python canned_prompts.py show practice/pqrst-estimate

# see how each input and parameter resolves, and where the value came from
python canned_prompts.py resolve practice/pqrst-estimate \
  --set session_summary="Implemented feature X, read unfamiliar code, added tests."

# render it
python canned_prompts.py render practice/pqrst-estimate \
  --set session_summary="Implemented feature X, read unfamiliar code, added tests."

# publish it to the local filesystem registry
python canned_prompts.py publish ../examples/pqrst-estimate

# remove the local catalog if you want to simulate another machine, then install
python canned_prompts.py install practice/pqrst-estimate --version 0.1.0

Packages added from a path are filed under the registry name local; packages installed from a registry are filed under that registry's name. search prints qualified references:

house:practice/pqrst-estimate@0.1.0  PQRST Estimate
local:practice/pqrst-estimate@0.1.0  PQRST Estimate

By default the reference tool uses:

~/.canned-prompts/catalog
~/.canned-prompts/registry

Override them with:

CANNED_PROMPTS_HOME=/some/path

or command-level --catalog / --registry options.

Resolution vs rendering

The format separates the two steps (CannedPromptFormat-v0.1.md § 5.1). Resolution decides a value for every input and parameter and may be non-deterministic; rendering substitutes those values and always is. An input may declare a default that is either a static value or a derived one — a prompt that a capable consumer may run to produce the value, declared without naming any resolver or model.

This reference tool never calls a model, so it resolves supplied values and static defaults only, and reports anything it cannot derive instead of rendering a prompt with a silent hole in it.

Composition

A package composes another by declaring it as a dependency and binding it to an input default. There are two kinds:

  • include — inline the other package's rendered template as text. Deterministic, needs no model, and the reference CLI performs it.
  • derive — use the other package's result, obtained by running it. Only a consumer able to run it can supply one.

examples/pqrst-estimate includes examples/house-style, so a shared style block is a versioned package rather than copied text:

dependencies:
  prompts:
    - id: practice/house-style
      version: ">= 0.1.0"
      requirement: required

inputs:
  - name: house_style
    required: false
    default:
      include: practice/house-style

A dependency pins an exact version by default; any, newest and a >= X.Y.Z lower bound are explicit opt-ins. These are per-dependency selectors, not version ranges — there is no solver, and constraint resolution across a dependency graph remains a non-goal.

There is no template inheritance. A package never extends another or overrides its parts; composition is by reference only, so a package's content stays readable without chasing ancestors.

Registries and identity

An id names a package within a registry (CannedPromptFormat-v0.1.md § 3.2). The same id obtained from two registries may be two different packages, so the catalog keeps them apart and a bare id that matches more than one is reported as ambiguous rather than guessed. Qualify it when you need to:

python canned_prompts.py render house:practice/pqrst-estimate --set ...

A registry may describe itself with an optional registry.yaml naming it and recording which namespaces are claimed and under what policy. Those claims are descriptive: a filesystem registry cannot authenticate a publisher, and signing and trust scoring are explicit non-goals. Ownership lives with the registry rather than in the package, so no package carries an unverifiable assertion of authority.

Deliberate limitations

This seed has no hosted registry, model execution, authentication, network access, dependency resolver, or social features. publish and install operate on a filesystem registry so that the package semantics can be tested before infrastructure is built around them.