Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/pull_request_template.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ Copyright (c) Jonathan D.A. Jewell <j.d.a.jewell@open.ac.uk>

### As Applicable

- [ ] `.machine_readable/6a2/STATE.a2ml` updated (if project state changed)
- [ ] `docs/status/JOURNAL.adoc` updated (if the phase, blockers or next action changed)
- [ ] `.machine_readable/6a2/ECOSYSTEM.a2ml` updated (if integrations changed)
- [ ] `.machine_readable/6a2/META.a2ml` updated (if architectural decisions changed)
- [ ] Documentation updated for user-facing changes
Expand Down
10 changes: 5 additions & 5 deletions .github/workflows/openssf-compliance.yml
Original file line number Diff line number Diff line change
Expand Up @@ -63,18 +63,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/6a2/STATE.a2ml" ]; then
echo "::error::.machine_readable/6a2/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/6a2/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
Expand All @@ -90,7 +90,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/6a2/STATE.a2ml .machine_readable/6a2/META.a2ml \
docs/status/JOURNAL.adoc .machine_readable/6a2/META.a2ml \
.machine_readable/6a2/ECOSYSTEM.a2ml CHANGELOG.md CHANGELOG.adoc; do
[ -f "$f" ] && REQUIRED_FILES="$REQUIRED_FILES $f"
done
Expand Down
2 changes: 1 addition & 1 deletion .machine_readable/0.1-AI-MANIFEST.a2ml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ description: |
automation scripts.

canonical_locations:
state: "6a2/STATE.a2ml"
state: "../docs/status/JOURNAL.adoc"
meta: "6a2/META.a2ml"
ecosystem: "6a2/ECOSYSTEM.a2ml"
agentic: "6a2/AGENTIC.a2ml"
Expand Down
3 changes: 1 addition & 2 deletions .machine_readable/6a2/0-AI-MANIFEST.a2ml
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,13 @@ This manifest declares the AI-assistant context for the 6a2 machine-readable met

## 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

Expand Down
2 changes: 1 addition & 1 deletion .machine_readable/6a2/README.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
2 changes: 1 addition & 1 deletion .machine_readable/ai/.clinerules
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) <j.d.a.jewell@open.ac.uk>
# Authoritative source: docs/AI-CONVENTIONS.md

# STARTUP: Read 0-AI-MANIFEST.a2ml first, then .machine_readable/6a2/STATE.a2ml.
# STARTUP: Read 0-AI-MANIFEST.a2ml first, then docs/status/JOURNAL.adoc.

# LICENSE
# All original code: MPL-2.0.
Expand Down
2 changes: 1 addition & 1 deletion .machine_readable/ai/.windsurfrules
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) <j.d.a.jewell@open.ac.uk>
# Authoritative source: docs/AI-CONVENTIONS.md

# STARTUP: Read 0-AI-MANIFEST.a2ml first, then .machine_readable/6a2/STATE.a2ml.
# STARTUP: Read 0-AI-MANIFEST.a2ml first, then docs/status/JOURNAL.adoc.

# LICENSE
# All original code: MPL-2.0.
Expand Down
4 changes: 2 additions & 2 deletions .machine_readable/ai/AI.a2ml
Original file line number Diff line number Diff line change
Expand Up @@ -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/6a2/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/6a2/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.
Expand Down
2 changes: 1 addition & 1 deletion .machine_readable/ai/README.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -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/6a2/STATE.a2ml`
* `docs/status/JOURNAL.adoc`
* `.machine_readable/6a2/META.a2ml`
Original file line number Diff line number Diff line change
@@ -1,6 +1,16 @@
# SPDX-License-Identifier: MPL-2.0
# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) <j.d.a.jewell@open.ac.uk>
#
# TOMBSTONE — STATE v1, archived 2026-11-10 (renamed from
# .machine_readable/6a2/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 anytype_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 anytype (the Equality Theory kernel).

[metadata]
Expand Down
8 changes: 4 additions & 4 deletions .machine_readable/arrival-pack/arrival-pack.ncl
Original file line number Diff line number Diff line change
Expand Up @@ -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%"
Expand All @@ -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.

Expand All @@ -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). |

Expand All @@ -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`.

<!-- ARRIVAL-PACK:END · provenance: %{provenance} · Manifesto@%{manifesto_pin} · regenerate: `just claude-md` (k9 drift-detects; do not hand-edit above) -->
"%
2 changes: 1 addition & 1 deletion .machine_readable/arrival-pack/claude-md.k9.ncl
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
".machine_readable/6a2/CLADE.a2ml",
".machine_readable/6a2/ECOSYSTEM.a2ml",
".machine_readable/6a2/AGENTIC.a2ml",
".machine_readable/6a2/STATE.a2ml",
"anytype_chora.deed", # lifecycle + maturity (state-v1-decision option B)
".machine_readable/6a2/anchors/ANCHOR.a2ml",
],
estate_common = "hyperpolymath/manifesto@<pinned-sha>", # DRAFT-unratified today
Expand Down
28 changes: 19 additions & 9 deletions .machine_readable/arrival-pack/extract.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -17,10 +19,9 @@ DIR6A2="${1:-.machine_readable/6a2}"
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

Expand All @@ -34,6 +35,17 @@ scalar() {
printf '%s' "$v"
}

# The repo deed, <canonical-name>_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() {
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
# (inline `k = ["a","b"]` or multiline). SEP is a literal multi-char string.
arr() {
Expand Down Expand Up @@ -75,15 +87,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'
3 changes: 2 additions & 1 deletion .machine_readable/coaptation/coapt.k9.ncl
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@
],
descriptiles = [
".machine_readable/6a2/CLADE.a2ml",
".machine_readable/6a2/STATE.a2ml",
"anytype_chora.deed", # lifecycle + maturity
"docs/status/JOURNAL.adoc", # phase
".machine_readable/6a2/ECOSYSTEM.a2ml",
".machine_readable/6a2/AGENTIC.a2ml",
".machine_readable/6a2/anchors/ANCHOR.a2ml",
Expand Down
2 changes: 1 addition & 1 deletion .machine_readable/coaptation/coapt.ncl
Original file line number Diff line number Diff line change
Expand Up @@ -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%"
Expand Down
45 changes: 33 additions & 12 deletions .machine_readable/coaptation/extract-facts.sh
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,11 @@ set -euo pipefail

DIR6A2="${1:-.machine_readable/6a2}"
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

Expand All @@ -37,6 +36,25 @@ 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() {
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)
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
Expand Down Expand Up @@ -68,14 +86,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")"
Expand All @@ -99,7 +120,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")" \
Expand All @@ -115,7 +136,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
}
}
Expand Down
6 changes: 3 additions & 3 deletions .machine_readable/coaptation/witness-map.ncl
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
{ fact = "state.phase", op = 'present },
{ fact = "ecosystem.type", op = 'present },
],
note = "STATE.a2ml + ECOSYSTEM.a2ml were read from .machine_readable/6a2/",
note = "the thin journal (docs/status/JOURNAL.adoc) + ECOSYSTEM.a2ml were read",
},
"must.anchors-directory" = {
kind = "descriptile",
Expand Down Expand Up @@ -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",
Expand Down
15 changes: 8 additions & 7 deletions .machine_readable/contractiles/Justfile
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ info:
@echo "Version: {{version}}"
@echo "RSR Tier: {{tier}}"
@echo "Recipes: $(just --summary | wc -w)"
@[ -f ".machine_readable/6a2/STATE.a2ml" ] && grep -oP 'phase\s*=\s*"\K[^"]+' .machine_readable/6a2/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:
Expand Down Expand Up @@ -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/6a2/STATE.a2ml" ]; then \
sed -i 's/last-updated = "[^"]*"/last-updated = "'"$(date +%Y-%m-%d)"'"/' .machine_readable/6a2/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/6a2/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 & GUIX
Expand Down
Loading
Loading