Skip to content

Commit b68fb08

Browse files
hyperpolymathclaude
andcommitted
feat(contractiles): complete 6-verb structure with runners + base + index
vcl-ut had 4 contractile verbs (bust/dust/must/trust) but only bust had a working .ncl runner. Worse: bust.ncl imports `../_base.ncl` which didn't exist — so the existing bust runner was broken. Port from rsr-template-repo: - _base.ncl — pedigree_schema, run_defaults, probe_schema - INDEX.a2ml — verb directory + invariants - adjust/{Adjustfile.a2ml,adjust.ncl} NEW verb (was missing) - intend/{Intentfile.a2ml,intend.ncl} NEW verb (was missing; lust deprecated, absorbed here) - dust/dust.ncl paired with existing Dustfile.a2ml - must/must.ncl paired with existing Mustfile.a2ml - trust/trust.ncl paired with existing Trustfile.a2ml Per memory rule (K9 lives in svc/, not contractiles/ — ADR-001 2026-04-18), deliberately did NOT copy the template's *.k9.ncl + *.manifest.a2ml files. Verb directory = ONE Verbfile.a2ml + ONE verb.ncl runner. The verb-specific contracts are template defaults — vcl-ut should customise the contents over time to match its actual semantics (particularly Adjustfile + Intentfile, which carry the project's adaptation strategy and north-star intent respectively). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent e8147bb commit b68fb08

9 files changed

Lines changed: 969 additions & 0 deletions

File tree

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
# SPDX-License-Identifier: PMPL-1.0-or-later
2+
# INDEX.a2ml — Contractile Registry
3+
# Author: Jonathan D.A. Jewell <j.d.a.jewell@open.ac.uk>
4+
#
5+
# Machine-readable catalogue of all contractile verbs in this template set.
6+
# Consumers (CI scripts, the contractile CLI, Hypatia rules) SHOULD read this
7+
# file to discover available verbs rather than hard-coding the list.
8+
#
9+
# See: docs/CONTRACTILE-SPEC.adoc §Registry
10+
11+
---
12+
id = "contractiles-registry"
13+
version = "2.0.0" # 2.0.0 (2026-04-18): all 6 verbs on trident shape; verb set complete.
14+
spec = "docs/CONTRACTILE-SPEC.adoc"
15+
last_updated = "2026-04-18"
16+
base_schema = ".machine_readable/contractiles/_base.ncl"
17+
meta_schema_status = "pending — see CONTRACTILE-SPEC §validator-meta-schema"
18+
19+
## Verbs
20+
21+
[[verbs]]
22+
name = "adjust"
23+
semantics = "drift tolerances + corrective actions"
24+
trident = [
25+
"adjust/Adjustfile.a2ml",
26+
"adjust/adjust.ncl",
27+
"adjust/adjust.k9.ncl",
28+
]
29+
manifest = "adjust/adjust.manifest.a2ml"
30+
status = "active"
31+
tier = "Yard"
32+
authority = "advisory"
33+
gating = "advisory (continue-with-warnings)"
34+
cardinality = "one per repo"
35+
notes = "Fifth trident instance (2026-04-18). First (Yard, advisory) authority pattern. Specialises in cumulative-drift catchment — tolerance bands + trend tracking across sessions. auto_fix_when_available applies deterministic patches; advisory otherwise."
36+
37+
[[verbs]]
38+
name = "bust"
39+
semantics = "hard-stop / expiry / must-not-run declarations"
40+
trident = [
41+
"bust/Bustfile.a2ml",
42+
"bust/bust.ncl",
43+
"bust/bust.k9.ncl",
44+
]
45+
manifest = "bust/bust.manifest.a2ml"
46+
status = "active"
47+
tier = "Hunt-read-only"
48+
authority = "blocking"
49+
gating = "hard (exit-nonzero)"
50+
cardinality = "one per repo"
51+
notes = "Fourth trident instance (2026-04-18). Completes the blocking-authority triple (must + trust + bust). Specialises in deprecated-path-reintroduction catchment. Injects failures via declared probes and verifies recovery paths."
52+
53+
[[verbs]]
54+
name = "dust"
55+
semantics = "rollback / recovery / deprecation / audit-trail preservation"
56+
trident = [
57+
"dust/Dustfile.a2ml",
58+
"dust/dust.ncl",
59+
"dust/dust.k9.ncl",
60+
]
61+
manifest = "dust/dust.manifest.a2ml"
62+
status = "active"
63+
tier = "Yard"
64+
authority = "advisory"
65+
gating = "advisory (continue-with-warnings)"
66+
cardinality = "one per repo"
67+
notes = "Sixth and FINAL trident instance (2026-04-18) — completes the full verb set. Specialises in audit-trail preservation + rollback-path verification. Destructive actions gated behind --apply flag + per-item approval; dry-run default."
68+
69+
[[verbs]]
70+
name = "intend"
71+
semantics = "north-star (commitments + aspirations)"
72+
trident = [
73+
"intend/Intentfile.a2ml",
74+
"intend/intend.ncl",
75+
"intend/intend.k9.ncl",
76+
]
77+
manifest = "intend/intend.manifest.a2ml"
78+
status = "active"
79+
tier = "Hunt"
80+
authority = "reporting"
81+
gating = "non-gating (continue)"
82+
cardinality = "one per repo"
83+
notes = "First trident instance in the estate (2026-04-18). Reports progress toward committed next-actions AND lists horizon aspirations. Absorbed the deprecated `lust` verb 2026-04-18. Never blocks. Remaining 5 verbs still on file_pair shape until tridents are built."
84+
85+
[[verbs]]
86+
name = "k9"
87+
semantics = "trust-tier templates (EXCEPTION to one-verbfile rule)"
88+
file_pair = [
89+
"k9/template-hunt.k9.ncl",
90+
"k9/template-kennel.k9.ncl",
91+
"k9/template-yard.k9.ncl",
92+
]
93+
status = "exception"
94+
gating = "not applicable"
95+
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."
96+
97+
# [[verbs]] lust REMOVED 2026-04-18 — name had unwanted associations;
98+
# the horizon/aspiration semantics were always meant to live inside `intend`
99+
# (the north-star verb). The [[wishes]] schema was absorbed into
100+
# intend/Intentfile.a2ml. Any `lust/` dir found in an estate repo is drift
101+
# and should be deleted.
102+
103+
[[verbs]]
104+
name = "must"
105+
semantics = "invariant assertion — release-blocking"
106+
trident = [
107+
"must/Mustfile.a2ml",
108+
"must/must.ncl",
109+
"must/must.k9.ncl",
110+
]
111+
manifest = "must/must.manifest.a2ml"
112+
status = "active"
113+
tier = "Hunt-read-only"
114+
authority = "blocking"
115+
gating = "hard (exit-nonzero)"
116+
cardinality = "one per repo"
117+
notes = "Third trident instance (2026-04-18). Completes the blocking-authority pair with trust: must = concrete + persistent invariants; trust = concrete + ephemeral transactions. Specialises in subtle invariant-erosion (tracking per-session trend; flagging silent regression). Single failure blocks merge. Simplest and most commonly populated verb."
118+
119+
[[verbs]]
120+
name = "trust"
121+
semantics = "security + provenance + safe-hacking"
122+
trident = [
123+
"trust/Trustfile.a2ml",
124+
"trust/trust.ncl",
125+
"trust/trust.k9.ncl",
126+
]
127+
manifest = "trust/trust.manifest.a2ml"
128+
status = "active"
129+
tier = "Hunt"
130+
authority = "blocking"
131+
gating = "hard (exit-nonzero)"
132+
cardinality = "one per repo"
133+
notes = "Second trident instance (2026-04-18). First (Hunt, blocking) verb — hard gate. Primary defense against threat-model misclassification (B1) and 'turn off the firewall' capability-collapse (C2). Inherits on_open negotiation+accountability+translation from intend.k9.ncl v2.0.0; adds threat_model_foregrounding + block_session_close_on_critical_drift."
Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
# SPDX-License-Identifier: PMPL-1.0-or-later
2+
# (MPL-2.0 is automatic legal fallback until PMPL is formally recognised)
3+
#
4+
# _base.ncl — Shared contractile base
5+
#
6+
# Provides four named schema fragments imported by every verb runner:
7+
#
8+
# pedigree_schema — canonical pedigree block shape
9+
# status_core_doc — documentation of the shared status trio (String list)
10+
# probe_schema — target structured probe form (spec only; verb files
11+
# still use probe | String with TODO comments)
12+
# run_defaults — default runner behaviour
13+
#
14+
# Usage in a verb runner:
15+
#
16+
# let base = import "../_base.ncl" in
17+
# {
18+
# pedigree = base.pedigree_schema & {
19+
# contractile_verb = "must",
20+
# semantics = "invariant",
21+
# security = {
22+
# leash = 'Kennel,
23+
# trust_level = "read-only verification",
24+
# allow_network = false,
25+
# allow_filesystem_write = false,
26+
# allow_subprocess = true,
27+
# },
28+
# metadata = {
29+
# name = "must-runner",
30+
# version = "1.0.0",
31+
# description = "...",
32+
# paired_xfile = "Mustfile.a2ml",
33+
# author = "Jonathan D.A. Jewell <j.d.a.jewell@open.ac.uk>",
34+
# },
35+
# },
36+
# schema = { ... },
37+
# run = base.run_defaults & { on_any_fail = "exit-nonzero" },
38+
# }
39+
#
40+
# See: docs/CONTRACTILE-SPEC.adoc §Shared Base
41+
42+
{
43+
# -------------------------------------------------------------------------
44+
# pedigree_schema
45+
#
46+
# The canonical shape of the `pedigree` block required in every verb runner.
47+
# Verb runners merge this with their verb-specific values using Nickel's `&`
48+
# (right-priority merge). Override contractile_verb, semantics, security.*,
49+
# and metadata.* in each verb.
50+
# -------------------------------------------------------------------------
51+
pedigree_schema = {
52+
schema_version | String | default = "1.0.0",
53+
contractile_verb | String | default = "UNSET", # MUST override in verb
54+
semantics | String | default = "UNSET", # MUST override in verb
55+
security = {
56+
leash | [| 'Kennel, 'Yard, 'Hunt |] | default = 'Kennel,
57+
trust_level | String | default = "UNSET", # MUST override in verb
58+
allow_network | Bool | default = false,
59+
allow_filesystem_write | Bool | default = false,
60+
allow_subprocess | Bool | default = true,
61+
# verb-specific additional security fields go in the verb's merge override:
62+
# e.g. authorised_probes_only (trust), injection_scope (bust),
63+
# destructive_mode_requires_flag (dust)
64+
},
65+
metadata = {
66+
name | String | default = "UNSET", # MUST override in verb
67+
version | String | default = "1.0.0",
68+
description | String | default = "UNSET", # MUST override in verb
69+
paired_xfile | String | default = "UNSET", # MUST override in verb
70+
author | String | default = "Jonathan D.A. Jewell <j.d.a.jewell@open.ac.uk>",
71+
},
72+
},
73+
74+
# -------------------------------------------------------------------------
75+
# status_core_doc
76+
#
77+
# Documents the minimum shared status values present in every verb's status
78+
# enum: declared, verified, failing.
79+
#
80+
# Nickel does not support structural enum extension, so verb files reproduce
81+
# their full enum verbatim in `schema`. This field serves as documentation
82+
# and for tooling that introspects the base.
83+
#
84+
# Verbs that extend status_core (i.e. all except must + trust):
85+
# adjust: + 'partial
86+
# bust: + 'drilled
87+
# dust: 'declared, 'proposed, 'approved, 'removed (non-standard)
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)
92+
#
93+
# See: docs/CONTRACTILE-SPEC.adoc §Per-Verb Extension
94+
# -------------------------------------------------------------------------
95+
status_core_doc = "status_core values: declared | verified | failing — extended per verb",
96+
97+
# -------------------------------------------------------------------------
98+
# probe_schema
99+
#
100+
# The TARGET structured probe form. See: docs/CONTRACTILE-SPEC.adoc §Probe
101+
#
102+
# IMPORTANT: This is a spec-only definition. Existing verb runner files still
103+
# use `probe | String` with a `# TODO: migrate to probe_schema` comment.
104+
# This is a breaking change; migration happens when the CLI supports both
105+
# forms.
106+
#
107+
# Adopters writing new xfiles should prefer the structured form:
108+
# probe = {
109+
# command = "test -f my-file",
110+
# timeout_seconds = 60,
111+
# allowed_exit_codes = [0],
112+
# permission_class = 'read_only,
113+
# }
114+
# -------------------------------------------------------------------------
115+
probe_schema = {
116+
command | String,
117+
timeout_seconds | Number | default = 300,
118+
allowed_exit_codes | Array Number | default = [0],
119+
permission_class
120+
| [| 'read_only, 'filesystem_write, 'subprocess, 'network |]
121+
| default = 'read_only,
122+
},
123+
124+
# -------------------------------------------------------------------------
125+
# run_defaults
126+
#
127+
# Default runner behaviour. Verb runners merge this with verb-specific
128+
# overrides using Nickel's `&` (right-priority merge).
129+
#
130+
# Most verbs override on_any_fail:
131+
# "exit-nonzero" : hard gate (must, trust, bust, adjust-gating)
132+
# "continue-with-warnings": advisory (dust, adjust)
133+
# "continue" : never gate (intend — covers both intents and wishes)
134+
# -------------------------------------------------------------------------
135+
run_defaults = {
136+
on_pass = "continue",
137+
on_any_fail = "exit-nonzero",
138+
report_format = "a2ml",
139+
emit_summary = true,
140+
},
141+
}

0 commit comments

Comments
 (0)