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
This commit is contained in:
parent
352ed5b30a
commit
4a56f20209
11 changed files with 697 additions and 58 deletions
27
examples/house-style/README.md
Normal file
27
examples/house-style/README.md
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
# practice/house-style
|
||||
|
||||
A `type: fragment` package: a reusable block meant to be **included** by other
|
||||
packages rather than used on its own.
|
||||
|
||||
`examples/pqrst-estimate` composes it:
|
||||
|
||||
```yaml
|
||||
dependencies:
|
||||
prompts:
|
||||
- id: practice/house-style
|
||||
version: ">= 0.1.0"
|
||||
requirement: required
|
||||
|
||||
inputs:
|
||||
- name: house_style
|
||||
required: false
|
||||
default:
|
||||
include: practice/house-style
|
||||
```
|
||||
|
||||
Inclusion is deterministic — the fragment's template is rendered and inlined as
|
||||
text, with no model involved — so the reference CLI performs it during
|
||||
`resolve`. See `CannedPromptFormat-v0.1.md` § 10.2.
|
||||
|
||||
Its `tone` parameter is inherited from the including package when that package
|
||||
declares one, and otherwise falls back to the default here.
|
||||
5
examples/house-style/prompt.md
Normal file
5
examples/house-style/prompt.md
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
Write in a {{ tone }} register.
|
||||
|
||||
- Lead with the evidence, then the conclusion.
|
||||
- State uncertainty plainly rather than hedging everything.
|
||||
- Omit filler, restatement, and praise.
|
||||
23
examples/house-style/prompt.yaml
Normal file
23
examples/house-style/prompt.yaml
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
format: canned-prompt/v0.1
|
||||
id: practice/house-style
|
||||
name: House Style
|
||||
version: 0.1.0
|
||||
summary: >
|
||||
Shared style block for review and estimate prompts: evidence first,
|
||||
no filler, state uncertainty plainly.
|
||||
type: fragment
|
||||
template: prompt.md
|
||||
parameters:
|
||||
tone:
|
||||
type: enum
|
||||
values: [neutral, blunt]
|
||||
default: neutral
|
||||
description: How direct the wording should be.
|
||||
output:
|
||||
format: markdown
|
||||
description: A style instruction block intended for inclusion, not standalone use.
|
||||
tags:
|
||||
- style
|
||||
- fragment
|
||||
provenance:
|
||||
author: canned-prompts seed
|
||||
|
|
@ -1,3 +1,5 @@
|
|||
{{ house_style }}
|
||||
|
||||
Review the coding session described below and produce a **PQRST Estimate** of
|
||||
where effort was spent.
|
||||
|
||||
|
|
|
|||
|
|
@ -1,14 +1,27 @@
|
|||
format: canned-prompt/v0.1
|
||||
id: practice/pqrst-estimate
|
||||
name: PQRST Estimate
|
||||
version: 0.1.0
|
||||
version: 0.2.0
|
||||
summary: 'Produce a post-session estimate of effort distributed across the PQRST categories
|
||||
for an agentic coding session.
|
||||
|
||||
'
|
||||
type: template
|
||||
template: prompt.md
|
||||
dependencies:
|
||||
prompts:
|
||||
- id: practice/house-style
|
||||
version: '>= 0.1.0'
|
||||
requirement: required
|
||||
inputs:
|
||||
- name: house_style
|
||||
type: content
|
||||
required: false
|
||||
description: 'Shared house-style block, composed from practice/house-style.
|
||||
|
||||
'
|
||||
default:
|
||||
include: practice/house-style
|
||||
- name: session_summary
|
||||
type: content
|
||||
required: true
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue