Skip to content

Commit e763d82

Browse files
Foundational layer: A2ML v1.1 (profiles + base vocab + citations + hashing) and K9-SVC 1.0 hardening (#358)
## Foundational layer: A2ML + K9-SVC The substrate between attestation (A2ML) and validation (K9). A2ML and K9-SVC are **independent foundations that name no consumer**; CodeCite/ProofTrace stay as standalone consumers in their own repos. **All 13 tasks landed.** ### Owner decision captured - **K9 Hunt leash** requires **all five** preconditions, **always** (signature + policy + sandbox + dry-run + capability grant) — no configurable subset. ### A2ML (`a2ml/`) 1. ✅ **Lineage cleanup** — prior specs frozen under `archive/` (v0 draft, v1.0.0) with NOT-NORMATIVE banners; `SPEC.adoc` is the single normative spec (**v1.1.0**); `VERSIONS.adoc` is the lineage SSOT; README reconciled "Draft v0.6.0" → "Stable v1.1.0". Licence prose untouched (flag-only). 2. ✅ **Profile mechanism** — `@profile`/`@profile-def`, offline deterministic resolution, SSOT + hash-pinned registry (SPEC §8/§11). 3. ✅ **Base record vocabulary** `@record` — the anti-desync primitive (SPEC §7). 4. ✅ **Citation primitives** — inert without a citation profile (SPEC §10). 5. ✅ **Canonical hash form** (sha256); signing reserved & inert (SPEC §9). 6. ✅ **Idris2 core** — `BaseVocab.idr` + `Profiles.idr`, decidable checks, `%default total`. ### 6a2 (`.machine_readable/`) 7. ✅ Seven profile definitions `a2ml/state … a2ml/anchor` + verifiable `REGISTRY.a2ml`. 8. ✅ `@profile` on all seven 6a2 files; hypatia rule **HYP-S006 profile-drift-detector** (FLAG-ONLY). ### K9-SVC (`k9-svc/`) — finishes alpha → **1.0.0 STABLE** 9. ✅ **Capability model** (`capabilities.ncl`): closed core enum + reserved `x-` namespace; default-deny. 10. ✅ **Leash modes normative** (`leash.ncl`): Kennel/Yard/Hunt; `authorize_hunt` = all five, always. 11. ✅ **Pedigree restructure** (`pedigree.ncl`): 7 sections incl. new `recovery_recipe` + `docs_rationale`. 12. ✅ **Receipt schema** (`receipt/`): canonical `a2ml/k9-receipt` profile + lossless JSON projection + worked example. 13. ✅ **Soft A2ML cross-ref** (`docs_rationale.a2ml_ref`); must/just/nickel vs must/trust/dust/intend kept distinct. ### CI notes (for reviewers) - **governance / Trusted-base** failure was mine (a `partial`); fixed by making `sectionTitlesOf` total — eliminated the escape hatch (verified locally, gate exits 0). - **Idris2 a2ml/AVOW** failures were **pre-existing shared infra** in `echidna-verify.yml` (deprecated `actions/cache` pin + an interactive idris2-pack bootstrap that hit EOF + wrong PATH). Both fail identically on AVOW (which this PR never touches). Fixed: bumped the cache pin to a SHA already trusted in-repo, fed the pack prompt its default, corrected PATH. This also wires the new v1.1 a2ml core into the type-check. - **Hypatia security scan** (222 findings) are all `workflow_audit` items (`unpinned_action`, `missing_timeout_minutes`) on workflow files this PR does not modify — pre-existing/estate-wide, not introduced here. ### Note on SPDX New files match their directory's existing SPDX convention (`AGPL-3.0-or-later`). Pre-existing licence drift in `a2ml/` prose (README/spec say `PMPL-1.0-or-later` while headers say `AGPL-3.0-or-later`) is **flagged, not touched**, per the manual-only licence policy. 🤖 Draft. https://claude.ai/code/session_01XZhw6Fq27eoeyEB4LR3a2c --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent aa665ac commit e763d82

38 files changed

Lines changed: 2894 additions & 233 deletions

.github/workflows/echidna-verify.yml

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ jobs:
9393
submodules: recursive
9494

9595
- name: Cache pack
96-
uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2
96+
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v4
9797
with:
9898
path: |
9999
~/.pack
@@ -116,17 +116,31 @@ jobs:
116116
git clone --depth 1 https://github.com/stefan-hoeck/idris2-pack.git "$HOME/idris2-pack"
117117
cd "$HOME/idris2-pack"
118118
# Use the bootstrap script in non-interactive mode
119-
bash install.bash </dev/null || echo "::warning::pack install had warnings"
119+
# pack's install.bash prompts for the scheme binary; feeding newlines
120+
# makes the prompt take its detected default (chezscheme) instead of
121+
# hitting EOF (which aborts the bootstrap and leaves pack uninstalled).
122+
yes '' | bash install.bash || echo "::warning::pack install had warnings"
123+
# pack installs its launcher into ~/.local/bin (newer layout) and/or
124+
# ~/.pack/bin (older); add both so `pack` resolves on PATH.
125+
echo "$HOME/.local/bin" >> "$GITHUB_PATH"
120126
echo "$HOME/.pack/bin" >> "$GITHUB_PATH"
121-
export PATH="$HOME/.pack/bin:$PATH"
122-
pack install-api idris2
127+
export PATH="$HOME/.local/bin:$HOME/.pack/bin:$PATH"
128+
# `install-api` is not a pack subcommand; `install-app idris2`
129+
# installs the idris2 executable into the pack bin dir so the
130+
# subsequent `idris2 --check` resolves. The base library (Prelude,
131+
# base, contrib) ships with idris2, so no .ipkg is needed for a
132+
# standalone --check.
133+
pack install-app idris2
123134
idris2 --version
124135
125-
- name: Type-check A2ML.Proofs
136+
- name: Type-check A2ML core (Proofs + v1.1 profiles/base-vocab)
126137
run: |
127138
export PATH="$HOME/.pack/bin:$PATH"
128139
cd a2ml
129140
idris2 --check src/A2ML/Proofs.idr 2>&1 | tee ../idris2-a2ml.log
141+
# v1.1 additive core: checking Profiles.idr transitively type-checks
142+
# BaseVocab.idr and TypedCore.idr (its imports).
143+
idris2 --check src/A2ML/Profiles.idr 2>&1 | tee -a ../idris2-a2ml.log
130144
131145
- name: Upload log
132146
if: always()
@@ -147,7 +161,7 @@ jobs:
147161
submodules: recursive
148162

149163
- name: Cache pack
150-
uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2
164+
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v4
151165
with:
152166
path: |
153167
~/.pack
@@ -167,10 +181,21 @@ jobs:
167181
sudo apt-get install -y build-essential libgmp-dev chezscheme
168182
git clone --depth 1 https://github.com/stefan-hoeck/idris2-pack.git "$HOME/idris2-pack"
169183
cd "$HOME/idris2-pack"
170-
bash install.bash </dev/null || echo "::warning::pack install had warnings"
184+
# pack's install.bash prompts for the scheme binary; feeding newlines
185+
# makes the prompt take its detected default (chezscheme) instead of
186+
# hitting EOF (which aborts the bootstrap and leaves pack uninstalled).
187+
yes '' | bash install.bash || echo "::warning::pack install had warnings"
188+
# pack installs its launcher into ~/.local/bin (newer layout) and/or
189+
# ~/.pack/bin (older); add both so `pack` resolves on PATH.
190+
echo "$HOME/.local/bin" >> "$GITHUB_PATH"
171191
echo "$HOME/.pack/bin" >> "$GITHUB_PATH"
172-
export PATH="$HOME/.pack/bin:$PATH"
173-
pack install-api idris2
192+
export PATH="$HOME/.local/bin:$HOME/.pack/bin:$PATH"
193+
# `install-api` is not a pack subcommand; `install-app idris2`
194+
# installs the idris2 executable into the pack bin dir so the
195+
# subsequent `idris2 --check` resolves. The base library (Prelude,
196+
# base, contrib) ships with idris2, so no .ipkg is needed for a
197+
# standalone --check.
198+
pack install-app idris2
174199
idris2 --version
175200
176201
- name: Type-check AVOW proofs

.machine_readable/6a2/AGENTIC.a2ml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22
# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) <j.d.a.jewell@open.ac.uk>
33
#
44
# AGENTIC.a2ml — AI agent constraints and capabilities
5+
#
6+
# A2ML profile declaration (SPEC.adoc Section 8.1): validates this record
7+
# through the profile mechanism. Definition: a2ml/profiles/a2ml-agentic/.
8+
@profile(id=a2ml/agentic)
9+
510
[metadata]
611
version = "0.1.0"
712
last-updated = "2026-04-11"

.machine_readable/6a2/ECOSYSTEM.a2ml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22
# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) <j.d.a.jewell@open.ac.uk>
33
#
44
# ECOSYSTEM.a2ml — Standards ecosystem position
5+
#
6+
# A2ML profile declaration (SPEC.adoc Section 8.1): validates this record
7+
# through the profile mechanism. Definition: a2ml/profiles/a2ml-ecosystem/.
8+
@profile(id=a2ml/ecosystem)
9+
510
[metadata]
611
version = "1.0.0"
712
last-updated = "2026-04-11"

.machine_readable/6a2/META.a2ml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22
# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) <j.d.a.jewell@open.ac.uk>
33
#
44
# META.a2ml — Standards meta-level information
5+
#
6+
# A2ML profile declaration (SPEC.adoc Section 8.1): validates this record
7+
# through the profile mechanism. Definition: a2ml/profiles/a2ml-meta/.
8+
@profile(id=a2ml/meta)
9+
510
[metadata]
611
version = "1.0.0"
712
last-updated = "2026-05-15"

.machine_readable/6a2/NEUROSYM.a2ml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22
# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) <j.d.a.jewell@open.ac.uk>
33
#
44
# NEUROSYM.a2ml — Neurosymbolic integration metadata
5+
#
6+
# A2ML profile declaration (SPEC.adoc Section 8.1): validates this record
7+
# through the profile mechanism. Definition: a2ml/profiles/a2ml-neurosym/.
8+
@profile(id=a2ml/neurosym)
9+
510
[metadata]
611
version = "0.1.0"
712
last-updated = "2026-04-11"

.machine_readable/6a2/PLAYBOOK.a2ml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22
# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) <j.d.a.jewell@open.ac.uk>
33
#
44
# PLAYBOOK.a2ml — Operational playbook
5+
#
6+
# A2ML profile declaration (SPEC.adoc Section 8.1): validates this record
7+
# through the profile mechanism. Definition: a2ml/profiles/a2ml-playbook/.
8+
@profile(id=a2ml/playbook)
9+
510
[metadata]
611
version = "0.1.0"
712
last-updated = "2026-04-11"

.machine_readable/6a2/STATE.a2ml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22
# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) <j.d.a.jewell@open.ac.uk>
33
#
44
# STATE.a2ml — Standards project state
5+
#
6+
# A2ML profile declaration (SPEC.adoc Section 8.1): validates this record
7+
# through the profile mechanism. Definition: a2ml/profiles/a2ml-state/.
8+
@profile(id=a2ml/state)
9+
510
[metadata]
611
project = "standards"
712
version = "0.2.0"

.machine_readable/REGISTRY.a2ml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ name = "A2ML — Attested Markup Language"
3232
stream = "foundation"
3333
home = "a2ml/"
3434
canonical_doc = "a2ml/README.adoc"
35-
source_hash = "sha256:b34ffe4d51c1715c4f2e51183d7a510865dc03e962fbeae121e3868fd88a718a"
35+
source_hash = "sha256:ffda43ed07bed095c7623d3c6a1d38c8f17a6b9e4eebaebe3bfde5aff62bcfb0"
3636
route = "the typed/verified machine-readable document format"
3737

3838
[[spec]]
@@ -41,7 +41,7 @@ name = "K9 Self-Validating Components"
4141
stream = "foundation"
4242
home = "k9-svc/"
4343
canonical_doc = "k9-svc/README.adoc"
44-
source_hash = "sha256:eae3b6a0f4e2da1afcfddfecf7a5c173d6c0ac090923c63fe9c14806b5a3b11b"
44+
source_hash = "sha256:6a9c2065fc29abdaaeef08c3e551f21c7408afd3c9a7cee4ed3e73460db443ab"
4545
route = "self-validating components with embedded contracts + deploy logic"
4646

4747
[[spec]]
@@ -266,7 +266,7 @@ name = "Standards Hypatia Rules"
266266
stream = "integration"
267267
home = "hypatia-rules/"
268268
canonical_doc = "hypatia-rules/README.adoc"
269-
source_hash = "sha256:707852684795e8474bc764473c36bc4d56fa139014ab3abbc0f550319637138c"
269+
source_hash = "sha256:a63e95c5e43ced2ee13c58014175da156c71ab731f01449e3a61b3e2f33bbe52"
270270
route = "the dogfooding rules that scan THIS repo (incl. drift detection)"
271271

272272
[[spec]]

.machine_readable/anchors/ANCHOR.a2ml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# ⚓ ANCHOR: standards
22
# This is the canonical authority for the standards repository.
3+
#
4+
# A2ML profile declaration (SPEC.adoc Section 8.1): validates this record
5+
# through the profile mechanism. Definition: a2ml/profiles/a2ml-anchor/.
6+
@profile(id=a2ml/anchor)
37

48
id: "org.hyperpolymath.standards"
59
version: "1.0.0"

a2ml/README.adoc

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,9 @@ A2ML is a typed, attested markup format. It verifies structure and references.
5050

5151
== Documents
5252

53-
* link:SPEC.adoc[Spec: Surface Grammar + Typed Core]
53+
* link:SPEC.adoc[Spec (current normative, v1.1.0): Surface Grammar + Typed Core + Profiles]
54+
* link:VERSIONS.adoc[Specification Lineage (versions + era)]
55+
* link:archive/[Archived (frozen) prior specs]
5456
* link:docs/QUICKSTART.adoc[Module 0 Quickstart + FAQ]
5557
* link:docs/MODULES.adoc[Syntax Modules (Opt-in)]
5658
* link:docs/GRAMMAR.adoc[Grammar Appendix]
@@ -101,6 +103,8 @@ A2ML is a typed, attested markup format. It verifies structure and references.
101103
* link:RELEASE-NOTES-v0.1.0.adoc[v0.1.0 Release Notes]
102104
* link:RELEASE-NOTES-v0.5.0.adoc[v0.5.0 Release Notes]
103105
* link:RELEASE-NOTES-v0.6.0.adoc[v0.6.0 Release Notes]
106+
* link:RELEASE-NOTES-v1.0.0.adoc[v1.0.0 Release Notes]
107+
* link:RELEASE-NOTES-v1.1.0.adoc[v1.1.0 Release Notes]
104108

105109
== Announcement
106110

@@ -110,9 +114,13 @@ A2ML is a typed, attested markup format. It verifies structure and references.
110114

111115
== Status
112116

113-
* Draft specification, v0.6.0
114-
* Prototype parser + CLI + demo page available
115-
* Typed core stubs + core tests passing (prototype)
117+
* *Stable specification, v1.1.0* (era v1). See link:VERSIONS.adoc[VERSIONS.adoc]
118+
for the lineage; prior drafts (v0) and the frozen v1.0.0 release are under
119+
link:archive/[archive/].
120+
* v1.1.0 is additive over v1.0.0: profile mechanism, base record vocabulary,
121+
citation primitives, and canonical hashing — all inert under the base modes.
122+
* Prototype parser + CLI + demo page available.
123+
* Typed core + core tests passing (prototype).
116124

117125
== License
118126

0 commit comments

Comments
 (0)