From 968cb7d28f067c08081aae72f9485641e8856445 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 10 Nov 2026 19:51:19 +0000 Subject: [PATCH 1/2] chore(state): archive STATE.a2ml and rewire everything that required it Completes state-v1-decision option B (ruled 2026-11-10). The thin journal (docs/status/JOURNAL.adoc) and the repo deed now carry what STATE v1 carried, so STATE.a2ml is renamed to .machine_readable/archive/state-v1.a2ml with a tombstone. All 8 sections are kept verbatim, so no milestone row or blocker is lost. Gates that failed without the file now require its successor, one for one: - openssf-compliance.yml: requires docs/status/JOURNAL.adoc, and the placeholder-token scan covers it - the Must invariant six-directory-present, validate-template.sh, and the e2e template test Each was checked both ways: it passes with the journal and fails loudly without it. Readers of STATE content moved to the new homes: - arrival-pack: lifecycle and maturity come from the deed (status, maturity); the derivable completion figure is dropped; provenance hashes the deed. CLAUDE.md is regenerated with the real generator (nickel 1.18) and verify.sh passes. The estate-common STATE row and read order now name the journal, a deliberate divergence from the draft estate block. - coaptation extractor: status and maturity from the deed, phase from the journal. completion-percentage, open-warnings, open-failures and last-result have no source any more and are emitted EMPTY, so they register as ABSENT and never as a recorded zero. - Justfile and contractiles/Justfile: info, state-touch, state-phase. - the k9 methodology guard, AI-tool rules, 0.1-AI-MANIFEST, the descriptiles README and 0-AI-MANIFEST invariant (it said 7 core files MUST exist), the PR template, AI-CONVENTIONS, both deed headers, and the ROADMAP headers. Baseline comparison on unmodified main, same commands both sides: - validate-template.sh output is byte-identical; the e2e test stops at the same pre-existing step; the A2ML validator reports the same file counts. - systemet's CLAUDE.md drift gate was already red on main (STATE changed after CLAUDE.md was generated, and it claimed "phase design; 15% complete"); the regeneration clears that. - the coaptation receipt gate is red on main in both repos (the committed receipt is stale: repo = "rsr-template-repo"). It is NOT regenerated here: standards says never to regenerate an A2ML file. Left alone on purpose: the canon-derived hook comments in AGENTIC/PLAYBOOK, the "never create STATE.a2ml" rules, the template example scripts, the historical ADR, and the generic RSR/CRG guidance in docs/. They name STATE as a family, not as a path anything reads. Co-Authored-By: Claude Sonnet 5.5 Claude-Session: https://claude.ai/code/session_01J1XmMC49T8sZ3uUuvrgB7y --- .github/pull_request_template.md | 2 +- .github/workflows/openssf-compliance.yml | 10 ++--- .machine_readable/0.1-AI-MANIFEST.a2ml | 2 +- .machine_readable/ai/.clinerules | 2 +- .machine_readable/ai/.windsurfrules | 2 +- .machine_readable/ai/AI.a2ml | 4 +- .machine_readable/ai/README.adoc | 2 +- .../STATE.a2ml => archive/state-v1.a2ml} | 10 +++++ .../arrival-pack/arrival-pack.ncl | 8 ++-- .../arrival-pack/claude-md.k9.ncl | 2 +- .machine_readable/arrival-pack/extract.sh | 27 ++++++++---- .machine_readable/coaptation/coapt.k9.ncl | 3 +- .machine_readable/coaptation/coapt.ncl | 2 +- .machine_readable/coaptation/extract-facts.sh | 44 ++++++++++++++----- .machine_readable/coaptation/witness-map.ncl | 6 +-- .machine_readable/contractiles/Justfile | 15 ++++--- .../contractiles/must/Mustfile.a2ml | 4 +- .../descriptiles/0-AI-MANIFEST.a2ml | 3 +- .machine_readable/descriptiles/README.adoc | 2 +- .../self-validating/methodology-guard.k9.ncl | 4 +- CLAUDE.md | 10 ++--- CONTRIBUTING.adoc | 11 ++--- Justfile | 15 ++++--- docs/practice/AI-CONVENTIONS.adoc | 4 +- docs/status/JOURNAL.adoc | 15 ++----- docs/status/ROADMAP.adoc | 12 ++--- scripts/check-proofs.sh | 4 +- scripts/validate-template.sh | 4 +- systemet_chora.deed | 15 ++++--- tests/e2e/template_instantiation_test.sh | 2 +- 30 files changed, 143 insertions(+), 103 deletions(-) rename .machine_readable/{descriptiles/STATE.a2ml => archive/state-v1.a2ml} (86%) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 65789e9..6fe4951 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -29,7 +29,7 @@ Copyright (c) Jonathan D.A. Jewell ### As Applicable -- [ ] `.machine_readable/descriptiles/STATE.a2ml` updated (if project state changed) +- [ ] `docs/status/JOURNAL.adoc` updated (if the phase, blockers or next action changed) - [ ] `.machine_readable/descriptiles/ECOSYSTEM.a2ml` updated (if integrations changed) - [ ] `.machine_readable/descriptiles/META.a2ml` updated (if architectural decisions changed) - [ ] Documentation updated for user-facing changes diff --git a/.github/workflows/openssf-compliance.yml b/.github/workflows/openssf-compliance.yml index 0984898..70af68a 100644 --- a/.github/workflows/openssf-compliance.yml +++ b/.github/workflows/openssf-compliance.yml @@ -66,18 +66,18 @@ jobs: exit 1 fi echo "README: OK" - - name: Check .machine_readable directory and STATE.a2ml + - name: Check .machine_readable directory and the thin journal run: | if [ ! -d ".machine_readable" ]; then echo "::error::.machine_readable/ directory is required" exit 1 fi - if [ ! -f ".machine_readable/descriptiles/STATE.a2ml" ]; then - echo "::error::.machine_readable/descriptiles/STATE.a2ml is required" + if [ ! -f "docs/status/JOURNAL.adoc" ]; then + echo "::error::docs/status/JOURNAL.adoc is required (the STATE v2 thin journal)" exit 1 fi - echo ".machine_readable/descriptiles/STATE.a2ml: OK" + echo "docs/status/JOURNAL.adoc: OK" - name: Check CHANGELOG exists run: | if [ ! -f "CHANGELOG.md" ] && [ ! -f "CHANGELOG.adoc" ] && [ ! -f "CHANGES.md" ]; then @@ -93,7 +93,7 @@ jobs: # Collect all required files that exist for f in SECURITY.md SECURITY.adoc .github/SECURITY.md LICENSE LICENSE.txt \ CONTRIBUTING.md CONTRIBUTING.adoc README.md README.adoc \ - .machine_readable/descriptiles/STATE.a2ml .machine_readable/descriptiles/META.a2ml \ + docs/status/JOURNAL.adoc .machine_readable/descriptiles/META.a2ml \ .machine_readable/descriptiles/ECOSYSTEM.a2ml CHANGELOG.md CHANGELOG.adoc; do [ -f "$f" ] && REQUIRED_FILES="$REQUIRED_FILES $f" done diff --git a/.machine_readable/0.1-AI-MANIFEST.a2ml b/.machine_readable/0.1-AI-MANIFEST.a2ml index a28ee37..38ecf0c 100644 --- a/.machine_readable/0.1-AI-MANIFEST.a2ml +++ b/.machine_readable/0.1-AI-MANIFEST.a2ml @@ -12,7 +12,7 @@ description: | automation scripts. canonical_locations: - state: "descriptiles/STATE.a2ml" + state: "../docs/status/JOURNAL.adoc" meta: "descriptiles/META.a2ml" ecosystem: "descriptiles/ECOSYSTEM.a2ml" agentic: "descriptiles/AGENTIC.a2ml" diff --git a/.machine_readable/ai/.clinerules b/.machine_readable/ai/.clinerules index 32565bc..cca25bf 100644 --- a/.machine_readable/ai/.clinerules +++ b/.machine_readable/ai/.clinerules @@ -2,7 +2,7 @@ # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # Authoritative source: docs/AI-CONVENTIONS.md -# STARTUP: Read 0-AI-MANIFEST.a2ml first, then .machine_readable/descriptiles/STATE.a2ml. +# STARTUP: Read 0-AI-MANIFEST.a2ml first, then docs/status/JOURNAL.adoc. # LICENSE # All original code: MPL-2.0. diff --git a/.machine_readable/ai/.windsurfrules b/.machine_readable/ai/.windsurfrules index 32565bc..cca25bf 100644 --- a/.machine_readable/ai/.windsurfrules +++ b/.machine_readable/ai/.windsurfrules @@ -2,7 +2,7 @@ # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # Authoritative source: docs/AI-CONVENTIONS.md -# STARTUP: Read 0-AI-MANIFEST.a2ml first, then .machine_readable/descriptiles/STATE.a2ml. +# STARTUP: Read 0-AI-MANIFEST.a2ml first, then docs/status/JOURNAL.adoc. # LICENSE # All original code: MPL-2.0. diff --git a/.machine_readable/ai/AI.a2ml b/.machine_readable/ai/AI.a2ml index ed3cd3c..3a3ba8e 100644 --- a/.machine_readable/ai/AI.a2ml +++ b/.machine_readable/ai/AI.a2ml @@ -7,9 +7,9 @@ - Prefer to keep generated files out of source control, and regenerate them with the documented commands before committing. ## Workflow -1. Inspect `.machine_readable/descriptiles/STATE.a2ml` for blockers and next actions. +1. Inspect `docs/status/JOURNAL.adoc` for the phase, blockers and next action. 2. Respect any constraints listed inside `.machine_readable/descriptiles/AGENTIC.a2ml` when tooling changes are requested. -3. After finishing edits, update STATE with your outcomes and commit with a concise, imperative message. +3. After finishing edits, update the thin journal (docs/status/JOURNAL.adoc) with your outcomes and commit with a concise, imperative message. ## Delivery Promises - Mention in summaries whether STATE, `.machine_readable/contractiles/`, or `.machine_readable/bot_directives/` changed. diff --git a/.machine_readable/ai/README.adoc b/.machine_readable/ai/README.adoc index a5dec59..4e08d29 100644 --- a/.machine_readable/ai/README.adoc +++ b/.machine_readable/ai/README.adoc @@ -20,5 +20,5 @@ Recommended machine read order: * `.machine_readable/policies/MAINTENANCE-AXES.a2ml` * `.machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml` * `.machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml` -* `.machine_readable/descriptiles/STATE.a2ml` +* `docs/status/JOURNAL.adoc` * `.machine_readable/descriptiles/META.a2ml` diff --git a/.machine_readable/descriptiles/STATE.a2ml b/.machine_readable/archive/state-v1.a2ml similarity index 86% rename from .machine_readable/descriptiles/STATE.a2ml rename to .machine_readable/archive/state-v1.a2ml index 8298e8b..11c9d16 100644 --- a/.machine_readable/descriptiles/STATE.a2ml +++ b/.machine_readable/archive/state-v1.a2ml @@ -1,6 +1,16 @@ # SPDX-License-Identifier: MPL-2.0 # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # +# TOMBSTONE — STATE v1, archived 2026-11-10 (renamed from +# .machine_readable/descriptiles/STATE.a2ml). +# Retired by the owner's ruling on state-v1-decision.adoc, option B (2026-11-10). +# Do not edit this file, and do not read it for current status. The live homes: +# lifecycle and maturity systemet_chora.deed, the (status) and (maturity) clauses +# phase, blockers, next docs/status/JOURNAL.adoc +# milestones docs/status/ROADMAP.adoc +# Dropped as derivable: completion-percentage and [maintenance-status]. +# Everything below is kept verbatim, so no milestone row or blocker is lost. +# # STATE.a2ml — Project state checkpoint for systemet (Equality Theory). [metadata] diff --git a/.machine_readable/arrival-pack/arrival-pack.ncl b/.machine_readable/arrival-pack/arrival-pack.ncl index 4a85a8e..a1ad713 100644 --- a/.machine_readable/arrival-pack/arrival-pack.ncl +++ b/.machine_readable/arrival-pack/arrival-pack.ncl @@ -22,7 +22,7 @@ let data = import "claude-md-data.json" in let manifesto_pin = "DRAFT-unratified" in let provenance = - "CLADE@%{data.h_clade} ECOSYSTEM@%{data.h_eco} AGENTIC@%{data.h_agentic} STATE@%{data.h_state} ANCHOR@%{data.h_anchor}" + "CLADE@%{data.h_clade} ECOSYSTEM@%{data.h_eco} AGENTIC@%{data.h_agentic} DEED@%{data.h_deed} ANCHOR@%{data.h_anchor}" in m%" @@ -48,7 +48,7 @@ If you are unsure what something is, **read the canon; do not guess** (guessing 13. **Equivalence as identity** — the estate's intellectual through-line. ## The machine-readable substrate (read in this order on arrival) -**CLADE** → **ANCHOR** → **AGENTIC** → **ECOSYSTEM** → **STATE** +**CLADE** → **ANCHOR** → **AGENTIC** → **ECOSYSTEM** → **JOURNAL** The descriptive family (working name *descriptiles*) describes what-is; the **contractiles** are the normative set-point. @@ -61,7 +61,7 @@ The descriptive family (working name *descriptiles*) describes what-is; the **co | `ECOSYSTEM.a2ml` | *Where it sits* — estate + external relations, and `what-this-is-not`. | | `NEUROSYM.a2ml` | *Meaning* of operations — proof obligations. | | `PLAYBOOK.a2ml` | *How* permitted actions run. | -| `STATE.a2ml` | *Where things are now* — progress, blockers, next-actions. | +| `docs/status/JOURNAL.adoc` | *Where things are now* — phase, blockers, next action (the STATE v2 thin journal). | | contractiles | Normative doctrine: **Intend** (north-star) · **Must** (invariants) · **Trust** (security) · **Adjust** (accessibility / inclusive design) — the integral core that holds strong; plus **Dust** (exnovation drift) · **Bust** (failure / breakage, not drift). | | k9 | *Validation*. Kennel (data) / Yard (pure eval) / Hunt (guarded exec). | @@ -82,7 +82,7 @@ Deny: **Nix, TypeScript, Python, Go, AGPL**. JS runtimes in preference order **B - **Where it sits** — pipeline position **%{data.pipeline_pos}**; chain `%{data.chain}`; coordination = `%{data.coordination}`. - **Constraints here** (AGENTIC) — fail-closed; evidence-per-step; no-silent-skip; rerun-after-fix; release-claim-requires-hard-pass. Never: banned langs (above), secrets, state files in repo root, AGPL. Details: `.machine_readable/bot_directives/{methodology,coverage,debt}.a2ml`. - **Golden path** (ANCHOR) — `%{data.golden_smoke}` → %{data.golden_crit}. -- **State** — phase %{data.phase}; maturity %{data.maturity}; %{data.completion}% complete; status %{data.status}. +- **State** — lifecycle %{data.lifecycle}; maturity %{data.maturity}. Phase, blockers and next action: `docs/status/JOURNAL.adoc`. "% diff --git a/.machine_readable/arrival-pack/claude-md.k9.ncl b/.machine_readable/arrival-pack/claude-md.k9.ncl index d3fbb1c..87bf351 100644 --- a/.machine_readable/arrival-pack/claude-md.k9.ncl +++ b/.machine_readable/arrival-pack/claude-md.k9.ncl @@ -37,7 +37,7 @@ K9! ".machine_readable/descriptiles/CLADE.a2ml", ".machine_readable/descriptiles/ECOSYSTEM.a2ml", ".machine_readable/descriptiles/AGENTIC.a2ml", - ".machine_readable/descriptiles/STATE.a2ml", + "systemet_chora.deed", # lifecycle + maturity (state-v1-decision option B) ".machine_readable/descriptiles/anchors/ANCHOR.a2ml", ], estate_common = "hyperpolymath/manifesto@", # DRAFT-unratified today diff --git a/.machine_readable/arrival-pack/extract.sh b/.machine_readable/arrival-pack/extract.sh index c0adf70..36d9a26 100755 --- a/.machine_readable/arrival-pack/extract.sh +++ b/.machine_readable/arrival-pack/extract.sh @@ -5,8 +5,10 @@ # extract.sh — the thin a2ml *reader* for the arrival-pack compiler. # # Projects the scalar/array fields the CLAUDE.md arrival pack needs out of this -# repo's descriptive a2ml (the "descriptiles" family: CLADE/ECOSYSTEM/AGENTIC/STATE + -# anchors/ANCHOR) into a single deterministic JSON document on stdout. +# repo's descriptive a2ml (the "descriptiles" family: CLADE/ECOSYSTEM/AGENTIC + +# anchors/ANCHOR), and out of the repo deed (the lifecycle and maturity that STATE +# v1 used to carry; state-v1-decision option B), into a single deterministic JSON +# document on stdout. # # This is a READER only — it authors nothing. The a2ml files remain the single # source of truth; arrival-pack.ncl renders this JSON into the CLAUDE.md region. @@ -17,10 +19,9 @@ DIR6A2="${1:-.machine_readable/descriptiles}" CLADE="$DIR6A2/CLADE.a2ml" ECO="$DIR6A2/ECOSYSTEM.a2ml" AGENTIC="$DIR6A2/AGENTIC.a2ml" -STATE="$DIR6A2/STATE.a2ml" ANCHOR="$DIR6A2/anchors/ANCHOR.a2ml" -for f in "$CLADE" "$ECO" "$AGENTIC" "$STATE" "$ANCHOR"; do +for f in "$CLADE" "$ECO" "$AGENTIC" "$ANCHOR"; do [ -f "$f" ] || { echo "extract.sh: missing required a2ml: $f" >&2; exit 2; } done @@ -34,6 +35,16 @@ scalar() { printf '%s' "$v" } +# The repo deed, _chora.deed at the repo root (two levels above the +# descriptiles directory), carries the lifecycle (status) and maturity clauses. +DEED="$DIR6A2/../../$(scalar 'canonical-name' "$CLADE")_chora.deed" +[ -f "$DEED" ] || { echo "extract.sh: missing required deed: $DEED" >&2; exit 2; } + +# deed_sym CLAUSE KEYWORD -> the symbol after `(CLAUSE ... :KEYWORD ` on the clause's opening line +deed_sym() { + grep -oP "^\s*\($1\s+:$2\s+\K[A-Za-z0-9_-]+" "$DEED" | head -1 || true +} + # arr KEY FILE SEP -> join all quoted strings in the `KEY = [ ... ]` block # (inline `k = ["a","b"]` or multiline). SEP is a literal multi-char string. arr() { @@ -75,15 +86,13 @@ jq -n \ --arg pipeline_pos "$(scalar 'position' "$ECO")" \ --arg chain "$(scalar 'chain' "$ECO")" \ --arg coordination "$(scalar 'coordination' "$ECO")" \ - --arg phase "$(scalar 'phase' "$STATE")" \ - --arg maturity "$(scalar 'maturity' "$STATE")" \ - --arg completion "$(scalar 'completion-percentage' "$STATE")" \ - --arg status "$(scalar 'status' "$STATE")" \ + --arg lifecycle "$(deed_sym status phase)" \ + --arg maturity "$(deed_sym maturity level)" \ --arg golden_smoke "$golden_smoke" \ --arg golden_crit "$golden_crit" \ --arg h_clade "$(sh "$CLADE")" \ --arg h_eco "$(sh "$ECO")" \ --arg h_agentic "$(sh "$AGENTIC")" \ - --arg h_state "$(sh "$STATE")" \ + --arg h_deed "$(sh "$DEED")" \ --arg h_anchor "$(sh "$ANCHOR")" \ '$ARGS.named' diff --git a/.machine_readable/coaptation/coapt.k9.ncl b/.machine_readable/coaptation/coapt.k9.ncl index 2c065bf..6737c5d 100644 --- a/.machine_readable/coaptation/coapt.k9.ncl +++ b/.machine_readable/coaptation/coapt.k9.ncl @@ -44,7 +44,8 @@ K9! ], descriptiles = [ ".machine_readable/descriptiles/CLADE.a2ml", - ".machine_readable/descriptiles/STATE.a2ml", + "systemet_chora.deed", # lifecycle + maturity + "docs/status/JOURNAL.adoc", # phase ".machine_readable/descriptiles/ECOSYSTEM.a2ml", ".machine_readable/descriptiles/AGENTIC.a2ml", ".machine_readable/descriptiles/anchors/ANCHOR.a2ml", diff --git a/.machine_readable/coaptation/coapt.ncl b/.machine_readable/coaptation/coapt.ncl index daf7468..5d4db7d 100644 --- a/.machine_readable/coaptation/coapt.ncl +++ b/.machine_readable/coaptation/coapt.ncl @@ -111,7 +111,7 @@ let clause_lines = std.string.join "\n" (std.array.map (fun e => e.id ++ " = " + let cp = clauses_doc.provenance in let fp = facts_doc.provenance in let contractile_prov = "intend@%{cp.intend} must@%{cp.must} trust@%{cp.trust} adjust@%{cp.adjust} dust@%{cp.dust} bust@%{cp.bust}" in -let descriptile_prov = "clade@%{fp.clade} state@%{fp.state} ecosystem@%{fp.ecosystem} agentic@%{fp.agentic} anchor@%{fp.anchor}" in +let descriptile_prov = "clade@%{fp.clade} deed@%{fp.deed} ecosystem@%{fp.ecosystem} agentic@%{fp.agentic} anchor@%{fp.anchor}" in let s = std.to_string in m%" diff --git a/.machine_readable/coaptation/extract-facts.sh b/.machine_readable/coaptation/extract-facts.sh index ac47fbc..3a077e2 100755 --- a/.machine_readable/coaptation/extract-facts.sh +++ b/.machine_readable/coaptation/extract-facts.sh @@ -18,12 +18,11 @@ set -euo pipefail DIR6A2="${1:-.machine_readable/descriptiles}" CLADE="$DIR6A2/CLADE.a2ml" -STATE="$DIR6A2/STATE.a2ml" ECO="$DIR6A2/ECOSYSTEM.a2ml" AGENTIC="$DIR6A2/AGENTIC.a2ml" ANCHOR="$DIR6A2/anchors/ANCHOR.a2ml" -for f in "$CLADE" "$STATE" "$ECO" "$AGENTIC" "$ANCHOR"; do +for f in "$CLADE" "$ECO" "$AGENTIC" "$ANCHOR"; do [ -f "$f" ] || { echo "extract-facts.sh: missing required a2ml: $f" >&2; exit 2; } done @@ -37,6 +36,24 @@ scalar() { printf '%s' "$v" } +# STATE v1 is archived (state-v1-decision, option B). Its live successors: the repo deed +# carries the lifecycle (status) and maturity clauses; the thin journal carries the phase. +DEED="$DIR6A2/../../$(scalar 'canonical-name' "$CLADE")_chora.deed" +JOURNAL="$DIR6A2/../../docs/status/JOURNAL.adoc" +for f in "$DEED" "$JOURNAL"; do + [ -f "$f" ] || { echo "extract-facts.sh: missing required file: $f" >&2; exit 2; } +done + +# deed_sym CLAUSE KEYWORD -> the symbol after `(CLAUSE ... :KEYWORD ` on the clause's opening line +deed_sym() { + grep -oP "^\s*\($1\s+:$2\s+\K[A-Za-z0-9_-]+" "$DEED" | head -1 || true +} + +# journal_phase -> the first word of the journal's `phase::` value (the phase label) +journal_phase() { + awk '/^phase::$/{getline; split($0,a,/[ .:]/); print a[1]; exit}' "$JOURNAL" +} + # arr KEY FILE SEP -> join all quoted strings in the `KEY = [ ... ]` block arr() { local key="$1" file="$2" sep="${3:-, }" out="" i @@ -68,14 +85,17 @@ rows="$( emit 'clade.primary' "$(scalar 'primary' "$CLADE")" emit 'clade.born' "$(scalar 'born' "$CLADE")" emit 'clade.forge-github' "$(scalar 'github' "$CLADE")" - # --- STATE: where things are now --- - emit 'state.status' "$(scalar 'status' "$STATE")" - emit 'state.phase' "$(scalar 'phase' "$STATE")" - emit 'state.maturity' "$(scalar 'maturity' "$STATE")" - emit 'state.completion-percentage' "$(scalar 'completion-percentage' "$STATE")" - emit 'state.open-warnings' "$(scalar 'open-warnings' "$STATE")" - emit 'state.open-failures' "$(scalar 'open-failures' "$STATE")" - emit 'state.last-result' "$(scalar 'last-result' "$STATE")" + # --- STATE: where things are now (deed + journal; STATE v1 is archived) --- + emit 'state.status' "$(deed_sym status phase)" + emit 'state.phase' "$(journal_phase)" + emit 'state.maturity' "$(deed_sym maturity level)" + # No source exists for these since STATE v1 was archived: completion is derivable, + # and the other three mirrored a maintenance report that never ran. They are emitted + # EMPTY so they register as ABSENT (present:false), never as a recorded zero. + emit 'state.completion-percentage' "" + emit 'state.open-warnings' "" + emit 'state.open-failures' "" + emit 'state.last-result' "" # --- ECOSYSTEM: where it sits + IS-NOT boundary --- emit 'ecosystem.type' "$(scalar 'type' "$ECO")" emit 'ecosystem.position' "$(scalar 'position' "$ECO")" @@ -99,7 +119,7 @@ rows="$( printf '%s\n' "$rows" | jq -R -s \ --arg clade "$(sh "$CLADE")" \ - --arg state "$(sh "$STATE")" \ + --arg deed "$(sh "$DEED")" \ --arg ecosystem "$(sh "$ECO")" \ --arg agentic "$(sh "$AGENTIC")" \ --arg anchor "$(sh "$ANCHOR")" \ @@ -115,7 +135,7 @@ printf '%s\n' "$rows" | jq -R -s \ }) ), provenance: { - clade: $clade, state: $state, ecosystem: $ecosystem, + clade: $clade, deed: $deed, ecosystem: $ecosystem, agentic: $agentic, anchor: $anchor } } diff --git a/.machine_readable/coaptation/witness-map.ncl b/.machine_readable/coaptation/witness-map.ncl index f23dfc6..4e872f8 100644 --- a/.machine_readable/coaptation/witness-map.ncl +++ b/.machine_readable/coaptation/witness-map.ncl @@ -34,7 +34,7 @@ { fact = "state.phase", op = 'present }, { fact = "ecosystem.type", op = 'present }, ], - note = "STATE.a2ml + ECOSYSTEM.a2ml were read from .machine_readable/descriptiles/", + note = "the thin journal (docs/status/JOURNAL.adoc) + ECOSYSTEM.a2ml were read", }, "must.anchors-directory" = { kind = "descriptile", @@ -73,12 +73,12 @@ "bust.template-substitution-failure" = { kind = "descriptile", witnesses = [ { fact = "state.open-failures", op = 'nonzero } ], - note = "alarm iff STATE records open failures; else latent (declared, not active)", + note = "alarm iff a maintenance record shows open failures; none is recorded since STATE v1 was archived, so latent", }, "bust.sync-drift-between-repos" = { kind = "descriptile", witnesses = [ { fact = "state.open-failures", op = 'nonzero } ], - note = "alarm iff STATE records open failures; else latent", + note = "alarm iff a maintenance record shows open failures; none is recorded since STATE v1 was archived, so latent", }, "bust.contractile-parse-error" = { kind = "descriptile", diff --git a/.machine_readable/contractiles/Justfile b/.machine_readable/contractiles/Justfile index 968fa73..f7b08eb 100644 --- a/.machine_readable/contractiles/Justfile +++ b/.machine_readable/contractiles/Justfile @@ -52,7 +52,7 @@ info: @echo "Version: {{version}}" @echo "RSR Tier: {{tier}}" @echo "Recipes: $(just --summary | wc -w)" - @[ -f ".machine_readable/descriptiles/STATE.a2ml" ] && grep -oP 'phase\s*=\s*"\K[^"]+' .machine_readable/descriptiles/STATE.a2ml | head -1 | xargs -I{} echo "Phase: {}" || true + @[ -f "docs/status/JOURNAL.adoc" ] && awk '/^phase::$/{getline; split($0,a,/[ .:]/); print "Phase: " a[1]; exit}' docs/status/JOURNAL.adoc || true # Run Invariant Path overlay tools for this repository invariant-path *ARGS: @@ -413,16 +413,17 @@ import? "build/just/validate.just" # STATE MANAGEMENT # ═══════════════════════════════════════════════════════════════════════════════ -# Update STATE.a2ml timestamp +# Update the thin journal's date (the STATE v2 `updated` field) state-touch: - @if [ -f ".machine_readable/descriptiles/STATE.a2ml" ]; then \ - sed -i 's/last-updated = "[^"]*"/last-updated = "'"$(date +%Y-%m-%d)"'"/' .machine_readable/descriptiles/STATE.a2ml && \ - echo "STATE.a2ml timestamp updated"; \ + @if [ -f "docs/status/JOURNAL.adoc" ]; then \ + d="$(date +%Y-%m-%d)"; \ + sed -i -e "s/^:updated: .*/:updated: $d/" -e '/^updated::$/{n;s/.*/'"$d"'/}' docs/status/JOURNAL.adoc && \ + echo "JOURNAL.adoc date updated"; \ fi -# Show current phase from STATE.a2ml +# Show the current phase label from the thin journal state-phase: - @grep -oP 'phase\s*=\s*"\K[^"]+' .machine_readable/descriptiles/STATE.a2ml 2>/dev/null | head -1 || echo "unknown" + @awk '/^phase::$/{getline; split($0,a,/[ .:]/); print a[1]; exit}' docs/status/JOURNAL.adoc 2>/dev/null || echo "unknown" # ═══════════════════════════════════════════════════════════════════════════════ # GUIX & NIX diff --git a/.machine_readable/contractiles/must/Mustfile.a2ml b/.machine_readable/contractiles/must/Mustfile.a2ml index d269daf..a5996ba 100644 --- a/.machine_readable/contractiles/must/Mustfile.a2ml +++ b/.machine_readable/contractiles/must/Mustfile.a2ml @@ -62,8 +62,8 @@ hooks fail if any check fails. - severity: critical ### six-directory-present -- description: descriptiles directory exists with required files -- run: test -d .machine_readable/descriptiles && test -f .machine_readable/descriptiles/META.a2ml && test -f .machine_readable/descriptiles/ECOSYSTEM.a2ml && test -f .machine_readable/descriptiles/STATE.a2ml && test -f .machine_readable/descriptiles/PLAYBOOK.a2ml && test -f .machine_readable/descriptiles/AGENTIC.a2ml && test -f .machine_readable/descriptiles/NEUROSYM.a2ml +- description: descriptiles directory exists with required files, and the thin journal exists +- run: test -d .machine_readable/descriptiles && test -f .machine_readable/descriptiles/META.a2ml && test -f .machine_readable/descriptiles/ECOSYSTEM.a2ml && test -f docs/status/JOURNAL.adoc && test -f .machine_readable/descriptiles/PLAYBOOK.a2ml && test -f .machine_readable/descriptiles/AGENTIC.a2ml && test -f .machine_readable/descriptiles/NEUROSYM.a2ml - severity: critical ### anchors-directory diff --git a/.machine_readable/descriptiles/0-AI-MANIFEST.a2ml b/.machine_readable/descriptiles/0-AI-MANIFEST.a2ml index b7738d1..bbae667 100644 --- a/.machine_readable/descriptiles/0-AI-MANIFEST.a2ml +++ b/.machine_readable/descriptiles/0-AI-MANIFEST.a2ml @@ -6,14 +6,13 @@ This manifest declares the AI-assistant context for the descriptiles machine-rea ## Canonical Locations -The 7 core A2ML files MUST exist in this directory: +The 6 core A2ML files MUST exist in this directory (STATE.a2ml was archived on 2026-11-10 to ../archive/state-v1.a2ml; its live successor is docs/status/JOURNAL.adoc): 1. AGENTIC.a2ml 2. CLADE.a2ml 3. ECOSYSTEM.a2ml 4. META.a2ml 5. NEUROSYM.a2ml 6. PLAYBOOK.a2ml -7. STATE.a2ml ## Invariants diff --git a/.machine_readable/descriptiles/README.adoc b/.machine_readable/descriptiles/README.adoc index 97414db..06c7d14 100644 --- a/.machine_readable/descriptiles/README.adoc +++ b/.machine_readable/descriptiles/README.adoc @@ -11,7 +11,7 @@ This directory contains the 6 core A2ML machine-readable metadata files for this - `META.a2ml` - Architecture decisions (ADRs), development practices, design rationale - `NEUROSYM.a2ml` - Symbolic semantics, composition algebra - `PLAYBOOK.a2ml` - Executable plans, operational runbooks -- `STATE.a2ml` - Project state, phase, milestones, session history +- `STATE.a2ml` - archived 2026-11-10 to ../archive/state-v1.a2ml; the live successor is docs/status/JOURNAL.adoc ## Standards Compliance diff --git a/.machine_readable/self-validating/methodology-guard.k9.ncl b/.machine_readable/self-validating/methodology-guard.k9.ncl index b82bcdf..851f991 100644 --- a/.machine_readable/self-validating/methodology-guard.k9.ncl +++ b/.machine_readable/self-validating/methodology-guard.k9.ncl @@ -54,9 +54,9 @@ let methodology_guard = { }, state_not_template = { - description = "STATE.a2ml must not contain template placeholders", + description = "The thin journal must not contain template placeholders", severity = "warning", - file = ".machine_readable/descriptiles/STATE.a2ml", + file = "docs/status/JOURNAL.adoc", # NOTE: the PROJECT token below is written as a Nickel concat # ("{{" ++ "PROJECT}}") ON PURPOSE. `just init` runs a sed substitution for # the brace-PROJECT-brace token over EVERY text file, which would otherwise diff --git a/CLAUDE.md b/CLAUDE.md index 65ca617..f84e84c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -6,7 +6,7 @@ SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell - + # You are in the hyperpolymath estate — orient before acting @@ -28,7 +28,7 @@ If you are unsure what something is, **read the canon; do not guess** (guessing 13. **Equivalence as identity** — the estate's intellectual through-line. ## The machine-readable substrate (read in this order on arrival) -**CLADE** → **ANCHOR** → **AGENTIC** → **ECOSYSTEM** → **STATE** +**CLADE** → **ANCHOR** → **AGENTIC** → **ECOSYSTEM** → **JOURNAL** The descriptive family (working name *descriptiles*) describes what-is; the **contractiles** are the normative set-point. @@ -41,7 +41,7 @@ The descriptive family (working name *descriptiles*) describes what-is; the **co | `ECOSYSTEM.a2ml` | *Where it sits* — estate + external relations, and `what-this-is-not`. | | `NEUROSYM.a2ml` | *Meaning* of operations — proof obligations. | | `PLAYBOOK.a2ml` | *How* permitted actions run. | -| `STATE.a2ml` | *Where things are now* — progress, blockers, next-actions. | +| `docs/status/JOURNAL.adoc` | *Where things are now* — phase, blockers, next action (the STATE v2 thin journal). | | contractiles | Normative doctrine: **Intend** (north-star) · **Must** (invariants) · **Trust** (security) · **Adjust** (accessibility / inclusive design) — the integral core that holds strong; plus **Dust** (exnovation drift) · **Bust** (failure / breakage, not drift). | | k9 | *Validation*. Kennel (data) / Yard (pure eval) / Hunt (guarded exec). | @@ -62,6 +62,6 @@ Deny: **Nix, TypeScript, Python, Go, AGPL**. JS runtimes in preference order **B - **Where it sits** — pipeline position **theory**; chain `systemet (theory) → anytype (kernel) → AffineScript (profile)`; coordination = `standards`. - **Constraints here** (AGENTIC) — fail-closed; evidence-per-step; no-silent-skip; rerun-after-fix; release-claim-requires-hard-pass. Never: banned langs (above), secrets, state files in repo root, AGPL. Details: `.machine_readable/bot_directives/{methodology,coverage,debt}.a2ml`. - **Golden path** (ANCHOR) — `just test && just quality` → Core tests pass; Quality gates pass; No unresolved critical security findings. -- **State** — phase design; maturity experimental; 15% complete; status active. +- **State** — lifecycle active; maturity experimental. Phase, blockers and next action: `docs/status/JOURNAL.adoc`. - + diff --git a/CONTRIBUTING.adoc b/CONTRIBUTING.adoc index 1705a36..47a97f3 100644 --- a/CONTRIBUTING.adoc +++ b/CONTRIBUTING.adoc @@ -41,11 +41,12 @@ just doctor # environment diagnostics === Machine-readable artefacts -This repo carries `+.machine_readable/+` A2ML files (`+STATE.a2ml+`, -`+META.a2ml+`, `+ECOSYSTEM.a2ml+`, `+AGENTIC.a2ml+`, `+NEUROSYM.a2ml+`, -`+PLAYBOOK.a2ml+`). If your change alters project state, architecture, -or operational steps, update the corresponding file in the same PR — CI -validates them. +This repo carries `+.machine_readable/+` A2ML files (`+META.a2ml+`, +`+ECOSYSTEM.a2ml+`, `+AGENTIC.a2ml+`, `+NEUROSYM.a2ml+`, `+PLAYBOOK.a2ml+`). +If your change alters architecture or operational steps, update the +corresponding file in the same PR — CI validates them. The project phase, +blockers and next action live in `+docs/status/JOURNAL.adoc+`; update it in +the same PR when they change. === Language policy diff --git a/Justfile b/Justfile index ce1cb88..6df1cc4 100644 --- a/Justfile +++ b/Justfile @@ -48,7 +48,7 @@ info: @echo "Version: {{version}}" @echo "RSR Tier: {{tier}}" @echo "Recipes: $(just --summary | wc -w)" - @[ -f ".machine_readable/descriptiles/STATE.a2ml" ] && grep -oP 'phase\s*=\s*"\K[^"]+' .machine_readable/descriptiles/STATE.a2ml | head -1 | xargs -I{} echo "Phase: {}" || true + @[ -f "docs/status/JOURNAL.adoc" ] && awk '/^phase::$/{getline; split($0,a,/[ .:]/); print "Phase: " a[1]; exit}' docs/status/JOURNAL.adoc || true # Run Invariant Path overlay tools for this repository invariant-path *ARGS: @@ -386,16 +386,17 @@ sbom: # STATE MANAGEMENT # ═══════════════════════════════════════════════════════════════════════════════ -# Update STATE.a2ml timestamp +# Update the thin journal's date (the STATE v2 `updated` field) state-touch: - @if [ -f ".machine_readable/descriptiles/STATE.a2ml" ]; then \ - sed -i 's/last-updated = "[^"]*"/last-updated = "'"$(date +%Y-%m-%d)"'"/' .machine_readable/descriptiles/STATE.a2ml && \ - echo "STATE.a2ml timestamp updated"; \ + @if [ -f "docs/status/JOURNAL.adoc" ]; then \ + d="$(date +%Y-%m-%d)"; \ + sed -i -e "s/^:updated: .*/:updated: $d/" -e '/^updated::$/{n;s/.*/'"$d"'/}' docs/status/JOURNAL.adoc && \ + echo "JOURNAL.adoc date updated"; \ fi -# Show current phase from STATE.a2ml +# Show the current phase label from the thin journal state-phase: - @grep -oP 'phase\s*=\s*"\K[^"]+' .machine_readable/descriptiles/STATE.a2ml 2>/dev/null | head -1 || echo "unknown" + @awk '/^phase::$/{getline; split($0,a,/[ .:]/); print a[1]; exit}' docs/status/JOURNAL.adoc 2>/dev/null || echo "unknown" # ═══════════════════════════════════════════════════════════════════════════════ # HYBRID AUTOMATION diff --git a/docs/practice/AI-CONVENTIONS.adoc b/docs/practice/AI-CONVENTIONS.adoc index d606550..1f3bb81 100644 --- a/docs/practice/AI-CONVENTIONS.adoc +++ b/docs/practice/AI-CONVENTIONS.adoc @@ -12,7 +12,7 @@ Per-tool config files (.cursorrules, .clinerules, etc.) reference this document. ## Session Startup 1. Read `0-AI-MANIFEST.a2ml` FIRST (mandatory gatekeeper). -2. Read `docs/status/JOURNAL.adoc` for the current phase, blockers and next action. It governs over the journal sections of `.machine_readable/descriptiles/STATE.a2ml`, which stays only until its consumers are rewired. +2. Read `docs/status/JOURNAL.adoc` for the current phase, blockers and next action. STATE v1 is archived at `.machine_readable/archive/state-v1.a2ml`; do not read it for current status. 3. Read `.machine_readable/descriptiles/anchors/ANCHOR.a2ml` for canonical authority boundaries. 4. Read `.machine_readable/policies/MAINTENANCE-AXES.a2ml` for maintenance/audit sequencing. 5. Read `.machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml` for baseline controls. @@ -81,7 +81,7 @@ Use `just` (Justfile) for all build, test, lint, and format tasks. - `0-AI-MANIFEST.a2ml` -- universal AI entry point - `.machine_readable/descriptiles/AGENTIC.a2ml` -- agent permissions and constraints - `docs/status/JOURNAL.adoc` -- thin session journal: phase, blockers, last and next action -- `.machine_readable/descriptiles/STATE.a2ml` -- legacy project state (kept until its consumers are rewired) +- `.machine_readable/archive/state-v1.a2ml` -- archived STATE v1 (tombstoned; not current) - `.machine_readable/descriptiles/anchors/ANCHOR.a2ml` -- canonical authority and policy boundary - `.machine_readable/policies/MAINTENANCE-AXES.a2ml` -- canonical axis sequencing and audit requirements - `.machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml` -- baseline maintenance checklist policy diff --git a/docs/status/JOURNAL.adoc b/docs/status/JOURNAL.adoc index a9e5f02..272d84f 100644 --- a/docs/status/JOURNAL.adoc +++ b/docs/status/JOURNAL.adoc @@ -8,10 +8,10 @@ derived. This is the STATE v2 thin journal (`1-formats/templates/STATE.a2ml.v2.spec.adoc` in `standards`: phase, blockers, last action, next action), written as AsciiDoc because A2ML is retired. -Where this file and the journal sections of -`.machine_readable/descriptiles/STATE.a2ml` disagree, **this file governs** -(`state-v1-decision`, option B, ruled 2026-11-10). `STATE.a2ml` stays only -until the checks and scripts that still require it are rewired. +STATE v1 is archived at `.machine_readable/archive/state-v1.a2ml` (2026-11-10, +`state-v1-decision`, option B), and nothing in it is current. This file replaces +its journal sections. The lifecycle and maturity it carried are in the repo deed, +`systemet_chora.deed`. Kept elsewhere, on purpose: milestones in `ROADMAP.adoc`, history in the git log, evidence and the completion census in `PROOF-STATUS.adoc`, task lists in @@ -63,13 +63,6 @@ updated:: is unadopted and needs its own ADR. | owner (a further ADR) | 2026-07-27 (ADR-0002) - -| `state-archive-rewire` -| `STATE.a2ml` cannot be archived yet. `openssf-compliance.yml`, the Must - invariant, `scripts/validate-template.sh`, the e2e template test and the - arrival-pack generator still require it. -| rewiring those consumers (several are derived from the estate canon) -| 2026-11-10 |=== == Provenance diff --git a/docs/status/ROADMAP.adoc b/docs/status/ROADMAP.adoc index c6f3547..99c57b9 100644 --- a/docs/status/ROADMAP.adoc +++ b/docs/status/ROADMAP.adoc @@ -2,16 +2,18 @@ // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) = systemet Roadmap -Milestones mirror the `route-to-mvp` phases in -`.machine_readable/descriptiles/STATE.a2ml` (the single source for phase percentages) -and the obligation ledger `docs/theory/OBLIGATIONS.adoc` (ET-1..ET-15). +This file is the home of the milestones (`state-v1-decision`, option B). The +`route-to-mvp` rows of the archived STATE v1 are kept verbatim, with their phase +percentages, in `.machine_readable/archive/state-v1.a2ml`. The obligation ledger +is `docs/theory/OBLIGATIONS.adoc` (ET-1..ET-15); the current phase, blockers and +next action are in `JOURNAL.adoc`. == Current status Theory specified in `docs/theory/` (L3 sketched, pending ADR); mechanization of the tractable core (MECH-1, MECH-2) staged; TEA erasure (ET-14) OPEN. -Honest completion figure lives in STATE.a2ml, evidence in -`docs/status/PROOF-STATUS.adoc`. +There is no single completion figure (it was derivable and was dropped with +STATE v1); the evidence is in `docs/status/PROOF-STATUS.adoc`. == Milestones diff --git a/scripts/check-proofs.sh b/scripts/check-proofs.sh index 1afe4a3..31a8539 100755 --- a/scripts/check-proofs.sh +++ b/scripts/check-proofs.sh @@ -38,7 +38,7 @@ # source-root : directory the prover is invoked from, chosen so the module's # declared name matches its path (getting this wrong is hole #2). # gated : MUST compile. A failure fails this script and CI. -# quarantine : known-broken, tracked in STATE.a2ml. Must CONTINUE to fail; +# quarantine : known-broken, tracked in docs/status/PROOF-STATUS.adoc. Must CONTINUE to fail; # if one starts compiling the script fails and tells you to # promote it, so the list cannot rot into a permanent excuse. # @@ -146,7 +146,7 @@ while IFS='|' read -r root rel status note; do echo "PASS" else echo "PASS -- UNEXPECTED (quarantined module now compiles)" - echo " Promote '$rel' to 'gated' in $MANIFEST_FILE and update STATE.a2ml." + echo " Promote '$rel' to 'gated' in $MANIFEST_FILE and update docs/status/PROOF-STATUS.adoc." unexpected_pass=$((unexpected_pass + 1)) fi else diff --git a/scripts/validate-template.sh b/scripts/validate-template.sh index 1162036..a497724 100755 --- a/scripts/validate-template.sh +++ b/scripts/validate-template.sh @@ -127,7 +127,7 @@ echo "" log_info "Phase 2: Machine-readable metadata (.machine_readable/)" echo "" -check_file_exists ".machine_readable/descriptiles/STATE.a2ml" "Project state" +check_file_exists "docs/status/JOURNAL.adoc" "Project journal" check_file_exists ".machine_readable/descriptiles/META.a2ml" "Architecture decisions" check_file_exists ".machine_readable/descriptiles/ECOSYSTEM.a2ml" "Ecosystem position" check_file_exists ".machine_readable/descriptiles/anchors/ANCHOR.a2ml" "Semantic boundary anchor" @@ -219,7 +219,7 @@ if [ "$(basename "$REPO_ROOT")" = "rsr-template-repo" ]; then log_pass "Skipping placeholder check for template repo" else # Check that key files don't have unresolved placeholders - for file in "$REPO_ROOT/README.adoc" "$REPO_ROOT/Justfile" "$REPO_ROOT/.machine_readable/descriptiles/STATE.a2ml"; do + for file in "$REPO_ROOT/README.adoc" "$REPO_ROOT/Justfile" "$REPO_ROOT/docs/status/JOURNAL.adoc"; do if [ -f "$file" ]; then if has_placeholder "$file"; then log_warning "File contains unresolved placeholders: $(basename "$file")" diff --git a/systemet_chora.deed b/systemet_chora.deed index d3c74fb..f5d7bff 100644 --- a/systemet_chora.deed +++ b/systemet_chora.deed @@ -1,8 +1,9 @@ ;; SPDX-License-Identifier: MPL-2.0 ;; SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) ;; -;; DRAFT (Slice-2 prep) — not yet wired; the .machine_readable/descriptiles/ a2ml files -;; stay live and authoritative until the estate wave + kyX (D313) land. Clauses +;; DRAFT — read only for (status) and (maturity), by the arrival-pack generator and the +;; coaptation extractor; every other clause is inert. The .machine_readable/descriptiles/ a2ml +;; files stay live and authoritative until the estate wave + kyX (D313) land. Clauses ;; are translated field-for-field from those descriptiles under the RULED mapping ;; specs in standards 1-formats/deed/mappings/ (the only authority a family ;; translation may cite): @@ -19,6 +20,8 @@ ;; the free-text [position] phase "implementation" go to the thin ;; journal, docs/status/JOURNAL.adoc; [maintenance-status] and ;; completion-percentage are derivable and dropped. +;; STATE.a2ml is ARCHIVED (2026-11-10, tombstoned, content verbatim): +;; .machine_readable/archive/state-v1.a2ml. ;; 0-AI-MANIFEST.a2ml (root) -> (manifest)(agent)(policy)(work) ;; per ai-manifest-decision.adoc, OPTION A [RULED 2026-11-10, owner] ;; Agent seen-set: open, flag-any-unknown (the spec's default; the @@ -27,10 +30,10 @@ ;; NOT translated here, pending a ruling (kept live in descriptiles/): ;; META.a2ml + ECOSYSTEM.a2ml — family 2, meta-ecosystem-to-repo-deed.adoc ;; (PROPOSAL, not yet owner-ruled) -;; The STATE.a2ml and 0-AI-MANIFEST.a2ml SOURCES stay live: gates still require -;; them (openssf-compliance, the Must invariant, validate-template.sh, the -;; arrival-pack generator). They are archived with a tombstone only once those -;; consumers are rewired, so this deed adds no double-tracked state of its own. +;; The gates (openssf-compliance, the Must invariant, validate-template.sh, the e2e +;; test), the arrival-pack generator and the coaptation extractor now read this deed +;; (status, maturity) and docs/status/JOURNAL.adoc (phase). The 0-AI-MANIFEST.a2ml +;; SOURCE stays live: its consumers are not rewired (family 7 is generator-first). (repo-deed :schema-version "1.0.0" :canonical-name "systemet" diff --git a/tests/e2e/template_instantiation_test.sh b/tests/e2e/template_instantiation_test.sh index 8d11346..a92aaaa 100755 --- a/tests/e2e/template_instantiation_test.sh +++ b/tests/e2e/template_instantiation_test.sh @@ -236,7 +236,7 @@ done log_step "Verifying machine-readable metadata" METADATA_FILES=( - ".machine_readable/descriptiles/STATE.a2ml" + "docs/status/JOURNAL.adoc" ".machine_readable/descriptiles/META.a2ml" ) From b6f5a2e4aeb7e41ee454adc697b0b12a47dfe7a7 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 10 Nov 2026 19:52:58 +0000 Subject: [PATCH 2/2] fix(extract): address the SonarCloud shell findings in the new deed reader SonarCloud flagged 6 MAJOR code smells on the lines this PR added, in extract.sh and extract-facts.sh: a single-bracket test where [[ is safer (S7688), and positional parameters used directly in deed_sym (S7679). Use [[ -f ... ]] in the two new existence checks, and name the clause and keyword parameters in deed_sym. Pre-existing lines in the same files are left as they were; the scanner only reports new code, and rewriting them would widen the PR. No behaviour change: the extractors emit the same lifecycle, maturity and fact presence, verify.sh still passes, and a missing deed still aborts with exit 2. Co-Authored-By: Claude Sonnet 5.5 Claude-Session: https://claude.ai/code/session_01J1XmMC49T8sZ3uUuvrgB7y --- .machine_readable/arrival-pack/extract.sh | 5 +++-- .machine_readable/coaptation/extract-facts.sh | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/.machine_readable/arrival-pack/extract.sh b/.machine_readable/arrival-pack/extract.sh index 36d9a26..bfdca14 100755 --- a/.machine_readable/arrival-pack/extract.sh +++ b/.machine_readable/arrival-pack/extract.sh @@ -38,11 +38,12 @@ scalar() { # The repo deed, _chora.deed at the repo root (two levels above the # descriptiles directory), carries the lifecycle (status) and maturity clauses. DEED="$DIR6A2/../../$(scalar 'canonical-name' "$CLADE")_chora.deed" -[ -f "$DEED" ] || { echo "extract.sh: missing required deed: $DEED" >&2; exit 2; } +[[ -f "$DEED" ]] || { echo "extract.sh: missing required deed: $DEED" >&2; exit 2; } # deed_sym CLAUSE KEYWORD -> the symbol after `(CLAUSE ... :KEYWORD ` on the clause's opening line deed_sym() { - grep -oP "^\s*\($1\s+:$2\s+\K[A-Za-z0-9_-]+" "$DEED" | head -1 || true + local clause="$1" keyword="$2" + grep -oP "^\s*\($clause\s+:$keyword\s+\K[A-Za-z0-9_-]+" "$DEED" | head -1 || true } # arr KEY FILE SEP -> join all quoted strings in the `KEY = [ ... ]` block diff --git a/.machine_readable/coaptation/extract-facts.sh b/.machine_readable/coaptation/extract-facts.sh index 3a077e2..b20a24f 100755 --- a/.machine_readable/coaptation/extract-facts.sh +++ b/.machine_readable/coaptation/extract-facts.sh @@ -41,12 +41,13 @@ scalar() { DEED="$DIR6A2/../../$(scalar 'canonical-name' "$CLADE")_chora.deed" JOURNAL="$DIR6A2/../../docs/status/JOURNAL.adoc" for f in "$DEED" "$JOURNAL"; do - [ -f "$f" ] || { echo "extract-facts.sh: missing required file: $f" >&2; exit 2; } + [[ -f "$f" ]] || { echo "extract-facts.sh: missing required file: $f" >&2; exit 2; } done # deed_sym CLAUSE KEYWORD -> the symbol after `(CLAUSE ... :KEYWORD ` on the clause's opening line deed_sym() { - grep -oP "^\s*\($1\s+:$2\s+\K[A-Za-z0-9_-]+" "$DEED" | head -1 || true + local clause="$1" keyword="$2" + grep -oP "^\s*\($clause\s+:$keyword\s+\K[A-Za-z0-9_-]+" "$DEED" | head -1 || true } # journal_phase -> the first word of the journal's `phase::` value (the phase label)