Skip to content

Commit f380b62

Browse files
hyperpolymathclaude
andcommitted
refactor(contractiles): deprecate lust verb, absorb wishes into Intentfile
The `lust` verb carried unwanted associations. Its [[wishes]] schema (horizon-grouped aspirations) was always a second expression of the north-star axis already owned by `intend`. Unified under one roof: - intend/Intentfile.a2ml now holds BOTH [[intents]] (committed next-actions with probes) AND [[wishes]] (near/mid/far horizon aspirations). - intend/intend.ncl schema extended with optional wishes array; run behaviour adds emit_grouped_by_horizon. - lust/ dir removed (Lustfile.a2ml + lust.ncl deleted). - Verb count 7 → 6 (plus the k9 exception, unchanged). Also reverts the 2026-04-17 Intentfile → Intendfile rename. The canonical file name is the noun form, Intentfile.a2ml (the one irregular case — all other verbs have identical verb and noun forms). The runner stays intend.ncl and references paired_xfile = "Intentfile.a2ml". Updated canonical docs (INDEX.a2ml, CONTRACTILE-SPEC.adoc, both contractiles README/CANONICAL-TEMPLATES), _base.ncl status-values comment, audit-contractiles.sh verb array. Template copies in a2ml/, k9-svc/, rhodium-standard-repositories/ etc. still reference lust/ and Intendfile.a2ml — those get cleaned up in a follow-up propagation wave. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 2e95c6e commit f380b62

12 files changed

Lines changed: 299 additions & 327 deletions

File tree

.machine_readable/contractiles/INDEX.a2ml

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
id = "contractiles-registry"
1313
version = "1.1.0"
1414
spec = "docs/CONTRACTILE-SPEC.adoc"
15-
last_updated = "2026-04-17"
15+
last_updated = "2026-04-18"
1616
base_schema = ".machine_readable/contractiles/_base.ncl"
1717
meta_schema_status = "pending — see CONTRACTILE-SPEC §validator-meta-schema"
1818

@@ -53,14 +53,14 @@ notes = "destructive mode gated behind --apply flag + explicit item approval"
5353

5454
[[verbs]]
5555
name = "intend"
56-
semantics = "north-star / aspirational"
56+
semantics = "north-star (commitments + aspirations)"
5757
file_pair = [
58-
"intend/Intendfile.a2ml",
58+
"intend/Intentfile.a2ml",
5959
"intend/intend.ncl",
6060
]
6161
status = "active"
6262
gating = "non-gating (continue)"
63-
notes = "reports progress toward committed next-actions; never blocks"
63+
notes = "reports progress toward committed next-actions AND lists horizon aspirations. Absorbed the deprecated `lust` verb 2026-04-18. Never blocks."
6464

6565
[[verbs]]
6666
name = "k9"
@@ -74,16 +74,11 @@ status = "exception"
7474
gating = "not applicable"
7575
notes = "k9 is service-automation meta-infrastructure, not a verb contractile. Three trust-tier templates (Kennel/Yard/Hunt). Does not have a Verbfile.a2ml. See CONTRACTILE-SPEC §k9-exception."
7676

77-
[[verbs]]
78-
name = "lust"
79-
semantics = "aspirational / wishlist / horizon"
80-
file_pair = [
81-
"lust/Lustfile.a2ml",
82-
"lust/lust.ncl",
83-
]
84-
status = "active"
85-
gating = "non-gating (continue)"
86-
notes = "horizon-grouped wishes; distinct from intend (commitment). Never blocks."
77+
# [[verbs]] lust REMOVED 2026-04-18 — name had unwanted associations;
78+
# the horizon/aspiration semantics were always meant to live inside `intend`
79+
# (the north-star verb). The [[wishes]] schema was absorbed into
80+
# intend/Intentfile.a2ml. Any `lust/` dir found in an estate repo is drift
81+
# and should be deleted.
8782

8883
[[verbs]]
8984
name = "must"

.machine_readable/contractiles/README.adoc

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,14 @@ Each verb directory holds exactly two files:
1414
* `<verb>.ncl` — the paired Nickel runner (pedigree + schema + run policy)
1515

1616
Anything else in a verb directory is human-only notes or archive; machines
17-
ignore it. Filenames use lowercase verb in the `.ncl` name and PascalCase
18-
verb in the A2ML (e.g. `intend.ncl` + `Intendfile.a2ml`).
17+
ignore it. Filenames use lowercase verb in the `.ncl` name and noun-form
18+
PascalCase in the A2ML (e.g. `intend.ncl` + `Intentfile.a2ml`,
19+
`must.ncl` + `Mustfile.a2ml`).
1920

2021
All verb runners import `_base.ncl` (shared pedigree + run-defaults + probe-schema).
2122
See `docs/CONTRACTILE-SPEC.adoc` for the normative specification.
2223

23-
== Verbs (7 + k9 exception)
24+
== Verbs (6 + k9 exception)
2425

2526
[cols="1,2,3", options="header"]
2627
|===
@@ -48,16 +49,17 @@ See `docs/CONTRACTILE-SPEC.adoc` for the normative specification.
4849
broken" rather than "this must stay healthy".
4950

5051
| `intend`
51-
| `intend/Intendfile.a2ml`
52-
| Declared next-action commitment — concrete tracked intents with probes
53-
for progress observation. Non-gating (report only).
54-
55-
| `lust`
56-
| `lust/Lustfile.a2ml`
57-
| Aspirations and wishes grouped by horizon (near/mid/far). Distinct from
58-
`intend` — `lust` is wish, `intend` is commitment. Non-gating.
52+
| `intend/Intentfile.a2ml`
53+
| North-star: committed next-actions ([[intents]] with probes) AND horizon
54+
aspirations ([[wishes]] grouped near/mid/far). Non-gating (report only).
55+
Absorbed the deprecated `lust` verb 2026-04-18.
5956
|===
6057

58+
NOTE: The `lust/` verb was deprecated 2026-04-18 (name had unwanted
59+
associations). Its [[wishes]] semantics live inside `intend/Intentfile.a2ml`
60+
as a second section alongside [[intents]]. Any `lust/` dir encountered in
61+
an estate repo is drift and should be removed.
62+
6163
== k9 — Service-Automation Layer (EXCEPTION to the one-verbfile rule)
6264

6365
IMPORTANT: `k9/` is **not a contractile verb** and does NOT follow the
@@ -121,20 +123,22 @@ When copying this set into a new repo:
121123
5. `Dustfile` — describe how this repo actually rolls back or retires
122124
behaviour while preserving the audit trail.
123125
6. `Bustfile` — declare real breakage / expiry / hard-stop conditions.
124-
7. `Intendfile` — list tracked next-actions with observable probes.
125-
8. `Lustfile` — list aspirations grouped by near/mid/far horizon.
126-
9. Pair any `k9/*.k9.ncl` with a specific contractile via `paired_xfile`.
126+
7. `Intentfile` — list tracked next-actions with observable probes
127+
([[intents]] section) AND horizon aspirations ([[wishes]] section).
128+
8. Pair any `k9/*.k9.ncl` with a specific contractile via `paired_xfile`.
127129

128-
== Intend vs LustKeep Them Distinct
130+
== Intentfile: Commitments vs AspirationsTwo Sections, One File
129131

130-
This is the most common confusion:
132+
Since 2026-04-18 both axes live inside `intend/Intentfile.a2ml`:
131133

132-
* `intend` is the **commitment axis**. Items here are tracked next-actions
133-
with probes. Status progresses declared → in_progress → done.
134-
* `lust` is the **aspiration axis**. Items here are wishes grouped by
135-
horizon. Status progresses declared → in_progress → achieved/abandoned.
134+
* `[[intents]]` is the **commitment axis**. Items here are tracked
135+
next-actions with probes. Status progresses
136+
declared → in_progress → done/deferred/retired.
137+
* `[[wishes]]` is the **aspiration axis**. Items here are horizon goals
138+
grouped near/mid/far. Status progresses
139+
declared → in_progress → achieved/abandoned.
136140

137-
If something is concrete enough to have a probe, it belongs in `intend`.
141+
If something is concrete enough to have a probe, it belongs in `[[intents]]`.
138142
If it is a horizon-level desire that might never be acted on, it belongs
139-
in `lust`. An item can graduate from `lust` to `intend` when a concrete
140-
plan materialises.
143+
in `[[wishes]]`. A wish can graduate to an intent when a concrete plan
144+
materialises.

.machine_readable/contractiles/_base.ncl

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,10 @@
8585
# adjust: + 'partial
8686
# bust: + 'drilled
8787
# dust: 'declared, 'proposed, 'approved, 'removed (non-standard)
88-
# intend: 'declared, 'in_progress, 'done, 'deferred, 'retired
89-
# lust: 'declared, 'in_progress, 'achieved, 'abandoned
88+
# intend: intents: 'declared, 'in_progress, 'done, 'deferred, 'retired
89+
# wishes: 'declared, 'in_progress, 'achieved, 'abandoned
90+
# (the wishes schema was absorbed from the deprecated `lust`
91+
# verb 2026-04-18; lust/ dir removed estate-wide)
9092
#
9193
# See: docs/CONTRACTILE-SPEC.adoc §Per-Verb Extension
9294
# -------------------------------------------------------------------------
@@ -128,7 +130,7 @@
128130
# Most verbs override on_any_fail:
129131
# "exit-nonzero" : hard gate (must, trust, bust, adjust-gating)
130132
# "continue-with-warnings": advisory (dust, adjust)
131-
# "continue" : never gate (intend, lust)
133+
# "continue" : never gate (intend — covers both intents and wishes)
132134
# -------------------------------------------------------------------------
133135
run_defaults = {
134136
on_pass = "continue",

.machine_readable/contractiles/intend/Intendfile.a2ml

Lines changed: 0 additions & 79 deletions
This file was deleted.
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
# SPDX-License-Identifier: PMPL-1.0-or-later
2+
# Intentfile (A2ML Canonical) — north-star contractile
3+
# Author: Jonathan D.A. Jewell <j.d.a.jewell@open.ac.uk>
4+
#
5+
# Paired runner: intend.ncl
6+
# Verb: intend
7+
# Semantics: North-star contractile. Declares BOTH concrete committed
8+
# next-actions AND horizon aspirations the project wishes to
9+
# become. Two sections share one file because they answer
10+
# the same question at different ranges:
11+
# [[intents]] — "we WILL do this; track progress"
12+
# status: declared → in_progress → done |
13+
# deferred | retired
14+
# [[wishes]] — "we WISH this were true; revisit later"
15+
# status: declared → in_progress → achieved |
16+
# abandoned
17+
# grouped by horizon: near / mid / far.
18+
# Non-gating — this is a report, not a gate. See the `must`
19+
# contractile for hard gates.
20+
#
21+
# History: The `lust/` sibling contractile was deprecated 2026-04-18;
22+
# its `[[wishes]]` semantics were absorbed here so the
23+
# project's aspirational horizon and its committed
24+
# next-actions live together in one north-star view.
25+
#
26+
# CLI:
27+
# contractile intend run → print status table (both sections)
28+
# contractile intend progress → diff declared-vs-observed for intents
29+
# contractile intend horizon → group wishes by near/mid/far
30+
#
31+
# ADOPTER INSTRUCTIONS: Replace the example intents and wishes below with
32+
# project-specific content. Each intent should have a probe command that
33+
# returns exit 0 when the intent is done. Wishes are report-only and never
34+
# run a probe. Omit either section if not applicable; don't delete the file.
35+
36+
@abstract:
37+
Seed Intentfile for the standards contractile template set. Demonstrates
38+
both sections: concrete intents with probes and horizon-grouped wishes.
39+
Adopters should replace these with real project commitments and aspirations.
40+
@end
41+
42+
## Purpose
43+
44+
The standards contractile template set commits to the intents declared
45+
below and points at the wishes on the horizon. The primary goal is to
46+
keep the contractile system complete, documented, and machine-verifiable
47+
so repos copying this template inherit a working operational framework.
48+
49+
## Anti-Purpose
50+
51+
This Intentfile is NOT:
52+
- A feature roadmap (that belongs in the project ROADMAP.adoc)
53+
- A hard gate (intend never blocks; see the `must` contractile for gates)
54+
55+
## If In Doubt
56+
57+
If you are unsure whether a change is in scope, ask. Sensitive areas:
58+
ABI definitions, license headers, CI workflows.
59+
60+
## Committed Next-Actions
61+
62+
[[intents]]
63+
id = "contractile-spec-written"
64+
description = "CONTRACTILE-SPEC.adoc normative spec exists and is up-to-date"
65+
probe = "test -f docs/CONTRACTILE-SPEC.adoc"
66+
status = "done"
67+
notes = "Spec written and committed 2026-04-17"
68+
69+
[[intents]]
70+
id = "base-ncl-extracted"
71+
description = "_base.ncl shared contractile base extracted and all 6 active verb runners import it"
72+
probe = "grep -l 'import.*_base.ncl' .machine_readable/contractiles/must/must.ncl .machine_readable/contractiles/trust/trust.ncl .machine_readable/contractiles/bust/bust.ncl .machine_readable/contractiles/adjust/adjust.ncl .machine_readable/contractiles/dust/dust.ncl .machine_readable/contractiles/intend/intend.ncl | wc -l | xargs test 6 -eq"
73+
status = "done"
74+
notes = "Base extracted and all runners refactored 2026-04-17; lust/ deprecated 2026-04-18, count reduced 7→6."
75+
76+
[[intents]]
77+
id = "index-registry-present"
78+
description = "INDEX.a2ml registry listing all active verbs exists in the contractiles directory"
79+
probe = "test -f .machine_readable/contractiles/INDEX.a2ml"
80+
status = "done"
81+
notes = "Registry created 2026-04-17"
82+
83+
[[intents]]
84+
id = "lust-dir-retired"
85+
description = "Deprecated lust/ dir removed; wishes semantics absorbed into Intentfile"
86+
probe = "! test -d .machine_readable/contractiles/lust"
87+
status = "done"
88+
notes = "Retired 2026-04-18 per user direction — name had negative associations; north-star meaning always belonged here."
89+
90+
[[intents]]
91+
id = "probe-schema-migration"
92+
description = "All verb runner files migrate probe fields from String to structured probe_schema"
93+
probe = "! grep -r 'probe | String' .machine_readable/contractiles/ --include='*.ncl'"
94+
status = "declared"
95+
notes = "DEFERRED — breaking change requiring CLI support. Legacy String probes kept with TODO comments. See CONTRACTILE-SPEC.adoc Migration Notes."
96+
target_date = "2026-Q3"
97+
98+
## Horizon Aspirations (wishes)
99+
100+
# Wishes are non-probeable project horizons. They exist to make the
101+
# aspiration axis visible without polluting the commitment queue.
102+
103+
[[wishes]]
104+
id = "example-near-wish"
105+
description = "Describe one aspirational feature/property the project intends toward in the near term"
106+
horizon = "near"
107+
why = "Why this would matter; the value of it being true"
108+
status = "declared"
109+
notes = "Optional human notes; leave empty or delete"
110+
111+
[[wishes]]
112+
id = "example-mid-wish"
113+
description = "Aspirational item on the one-to-two release horizon"
114+
horizon = "mid"
115+
why = "The impact of reaching it"
116+
status = "declared"
117+
118+
[[wishes]]
119+
id = "example-far-wish"
120+
description = "Multi-year horizon state"
121+
horizon = "far"
122+
why = "Why we still bother pointing at it"
123+
status = "declared"

0 commit comments

Comments
 (0)