Skip to content

Commit 93af4f2

Browse files
hyperpolymathclaude
andcommitted
feat(rsr): complete RSR compliance — template residue cleared, full 6-verb contractile set
- Justfile: fix project/REPO vars (were still `rsr-template-repo`) - STATE.a2ml: replace template STATE with Nash-specific content (design phase, 15% complete, correct milestones and co-author attribution) - META.a2ml: populate languages=["idris2","zig"], add ADRs, co-author, license-rationale; bump last-updated - READINESS.md: create CRG v2.0 STRICT assessment (honest grade D: scaffolding solid, no game logic yet) - contractiles/_base.ncl: add shared Nickel base (AGPL) - contractiles/must/must.ncl: add missing NCL runner - contractiles/trust/trust.ncl: add missing NCL runner - contractiles/dust/dust.ncl: add missing NCL runner - contractiles/bust/bust.ncl: fix SPDX header (PMPL → AGPL) - contractiles/intend/: add missing intend verb (Intentfile.a2ml + intend.ncl) with Nash-specific commitments + horizon wishes - contractiles/adjust/: add missing adjust verb (Adjustfile.a2ml + adjust.ncl) with accessibility requirements for physical game + digital companion - contractiles/INDEX.a2ml: add verb registry (all 6 active verbs) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 7724f65 commit 93af4f2

14 files changed

Lines changed: 858 additions & 40 deletions

File tree

.machine_readable/6a2/META.a2ml

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,20 @@
66

77
[metadata]
88
version = "0.1.0"
9-
last-updated = "2026-04-04"
9+
last-updated = "2026-04-24"
1010

1111
[project-info]
1212
type = "game" # library | binary | monorepo | service | website
13-
languages = [] # e.g. ["rust", "zig", "idris2"]
13+
languages = ["idris2", "zig"] # ABI stubs in Idris2; FFI in Zig; game engine language TBD
1414
license = "AGPL-3.0-or-later"
1515
author = "Jonathan D.A. Jewell (hyperpolymath)"
16+
co-author = "son"
17+
license-rationale = "AGPL-3.0-or-later: co-developed project (Jonathan + son), per AGPL exception in hyperpolymath license policy"
1618

1719
[architecture-decisions]
1820
# ADR format: status = proposed | accepted | deprecated | superseded | rejected
19-
# - { id = "ADR-001", title = "Use Zig for FFI", status = "accepted", date = "2026-02-14" }
21+
- { id = "ADR-001", title = "Idris2 ABI + Zig FFI for interface layer", status = "accepted", date = "2026-04-04" }
22+
- { id = "ADR-002", title = "Game engine implementation language (Gleam/BEAM or Rust/SPARK)", status = "proposed", date = "2026-04-24" }
2023

2124
[development-practices]
2225
build-tool = "just"

.machine_readable/6a2/STATE.a2ml

Lines changed: 40 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,46 @@
11
# SPDX-License-Identifier: AGPL-3.0-or-later
22
# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) <j.d.a.jewell@open.ac.uk>
33
#
4-
# STATE.a2ml — Project state checkpoint (META-TEMPLATE)
5-
#
6-
# This is the STATE file for rsr-template-repo itself.
7-
# When consumed by a new project, replace {{PLACEHOLDER}} tokens
8-
# and customize sections below for the target project.
4+
# STATE.a2ml — Project state checkpoint
5+
# The Nash Equilibrium — 6X strategy game
96

107
[metadata]
11-
project = "rsr-template-repo"
12-
version = "0.2.0"
13-
last-updated = "2026-02-28"
8+
project = "the-nash-equilibrium"
9+
version = "0.1.0"
10+
last-updated = "2026-04-24"
1411
status = "active" # active | paused | archived
1512

1613
[project-context]
17-
name = "rsr-template-repo"
18-
purpose = "Canonical RSR-compliant repository template providing scaffolding for all hyperpolymath projects — including CI/CD, AI manifests, ABI/FFI standards, container ecosystem, and governance infrastructure."
19-
completion-percentage = 95
14+
name = "The Nash Equilibrium"
15+
purpose = "6X strategy board game co-developed by Jonathan D.A. Jewell and son. Extends the 4X genre (eXplore, eXpand, eXploit, eXterminate) with eXchange (game-theoretic negotiation/trade) and eXperiment (speculative research with asymmetric payoffs). All strategic interactions are modelled through Nash equilibrium mechanics. Licensed AGPL-3.0-or-later."
16+
completion-percentage = 15
2017

2118
[position]
22-
phase = "maintenance" # design | implementation | testing | maintenance | archived
23-
maturity = "production" # experimental | alpha | beta | production | lts
19+
phase = "design" # design | implementation | testing | maintenance | archived
20+
maturity = "experimental" # experimental | alpha | beta | production | lts
2421

2522
[route-to-mvp]
2623
milestones = [
27-
{ name = "Phase 0: Core scaffolding (justfile, CI/CD, .machine_readable)", completion = 100 },
28-
{ name = "Phase 1: ABI/FFI standard (Idris2/Zig templates)", completion = 100 },
29-
{ name = "Phase 1b: AI Gatekeeper Protocol (0-AI-MANIFEST.a2ml)", completion = 100 },
30-
{ name = "Phase 1c: TOPOLOGY.md standard and guide", completion = 100 },
31-
{ name = "Phase 1d: Maintenance gate (axes, checklist, approach)", completion = 100 },
32-
{ name = "Phase 1e: Trustfile / contractiles", completion = 100 },
33-
{ name = "Phase 2: Container ecosystem templates (stapeln)", completion = 100 },
34-
{ name = "Phase 3: Multi-forge sync hardening", completion = 0 },
35-
{ name = "Phase 4: Nix/Guix reproducible shells", completion = 50 },
24+
{ name = "Phase 0: RSR scaffolding (CI/CD, .machine_readable, contractiles)", completion = 90 },
25+
{ name = "Phase 0b: ABI/FFI interface stubs (Idris2 ABI + Zig FFI)", completion = 50 },
26+
{ name = "Phase 1: Game design documentation (6X pillars, core mechanics, player roles, board design)", completion = 60 },
27+
{ name = "Phase 1b: Playtesting protocol + event cards + economic systems", completion = 30 },
28+
{ name = "Phase 2: Nash equilibrium solver / payoff-matrix engine", completion = 0 },
29+
{ name = "Phase 3: Core game loop implementation", completion = 0 },
30+
{ name = "Phase 4: Family playtesting (v0 physical prototype)", completion = 0 },
31+
{ name = "Phase 5: Digital companion (optional, post-physical)", completion = 0 },
3632
]
3733

3834
[blockers-and-issues]
39-
# No active blockers
35+
# No external blockers — design phase, internal only.
4036

4137
[critical-next-actions]
4238
actions = [
43-
"Container templates complete — test with `just container-init`",
44-
"Validate container templates across wolfi-base and static Chainguard images",
45-
"Harden multi-forge sync for GitLab/Bitbucket mirroring edge cases",
46-
"Expand Nix/Guix development shell templates",
39+
"Complete playtesting-plan.adoc with concrete first-session checklist",
40+
"Finish event-cards.adoc catalogue (currently skeleton)",
41+
"Decide on implementation language for game engine (Gleam/BEAM or Rust/SPARK)",
42+
"Draft Nash equilibrium solver spec for payoff-matrix integration",
43+
"Run first family playtest of physical prototype (tabletop, paper rules)",
4744
]
4845

4946
[maintenance-status]
@@ -54,11 +51,20 @@ open-warnings = 0
5451
open-failures = 0
5552

5653
[ecosystem]
57-
part-of = ["RSR Framework", "stapeln ecosystem"]
58-
depends-on = ["stapeln", "selur-compose", "cerro-torre", "svalinn", "vordr", "k9-svc"]
54+
part-of = ["games-ecosystem", "hyperpolymath personal projects"]
55+
depends-on = ["RSR Framework", "stapeln"]
56+
co-authors = ["Jonathan D.A. Jewell", "son (AGPL co-author)"]
57+
license-rationale = "AGPL-3.0-or-later chosen because this is a co-developed project with son (hyperpolymath AGPL exception)"
58+
59+
[dogfooding-status]
60+
# Populated when C-grade dogfooding evidence window opens (4+ weeks, daily use).
61+
# Currently: Phase 0 (design) — no dogfood log yet.
62+
63+
[external-targets]
64+
# Populated at Grade B promotion. Six genuinely diverse external targets required.
65+
66+
[issues-fed-back]
67+
# Populated at Grade B promotion.
5968

60-
# ---------------------------------------------------------------------------
61-
# NOTE FOR CONSUMERS: When using this template to create a new repo, reset
62-
# the fields above to your project's values and replace all {{PLACEHOLDER}}
63-
# tokens. The milestones above describe the TEMPLATE's evolution, not yours.
64-
# ---------------------------------------------------------------------------
69+
[field-signal]
70+
# Populated at Grade A promotion.
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
# SPDX-License-Identifier: AGPL-3.0-or-later
2+
# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) <j.d.a.jewell@open.ac.uk>
3+
#
4+
# INDEX.a2ml — Contractile Registry
5+
# Machine-readable catalogue of all contractile verbs in this repo.
6+
# Consumers (CI scripts, contractile CLI, Hypatia) read this to discover
7+
# available verbs rather than hard-coding the list.
8+
9+
---
10+
id = "contractiles-registry"
11+
version = "1.0.0"
12+
last_updated = "2026-04-24"
13+
base_schema = ".machine_readable/contractiles/_base.ncl"
14+
15+
## Active Verbs
16+
17+
[[verbs]]
18+
name = "adjust"
19+
semantics = "accessibility compliance"
20+
file_pair = [
21+
"adjust/Adjustfile.a2ml",
22+
"adjust/adjust.ncl",
23+
]
24+
status = "active"
25+
authority = "advisory"
26+
gating = "advisory (continue-with-warnings)"
27+
28+
[[verbs]]
29+
name = "bust"
30+
semantics = "error handling + failure recovery"
31+
file_pair = [
32+
"bust/Bustfile.a2ml",
33+
"bust/bust.ncl",
34+
]
35+
status = "active"
36+
authority = "blocking"
37+
gating = "hard (exit-nonzero)"
38+
39+
[[verbs]]
40+
name = "dust"
41+
semantics = "exnovation / removal"
42+
file_pair = [
43+
"dust/Dustfile.a2ml",
44+
"dust/dust.ncl",
45+
]
46+
status = "active"
47+
authority = "advisory"
48+
gating = "advisory (continue-with-warnings)"
49+
50+
[[verbs]]
51+
name = "intend"
52+
semantics = "north-star (commitments + aspirations)"
53+
file_pair = [
54+
"intend/Intentfile.a2ml",
55+
"intend/intend.ncl",
56+
]
57+
status = "active"
58+
authority = "reporting"
59+
gating = "non-gating (continue)"
60+
61+
[[verbs]]
62+
name = "must"
63+
semantics = "invariant assertion — release-blocking"
64+
file_pair = [
65+
"must/Mustfile.a2ml",
66+
"must/must.ncl",
67+
]
68+
status = "active"
69+
authority = "blocking"
70+
gating = "hard (exit-nonzero)"
71+
72+
[[verbs]]
73+
name = "trust"
74+
semantics = "security + provenance + safe-hacking"
75+
file_pair = [
76+
"trust/Trustfile.a2ml",
77+
"trust/trust.ncl",
78+
]
79+
status = "active"
80+
authority = "blocking"
81+
gating = "hard (exit-nonzero)"
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
# SPDX-License-Identifier: AGPL-3.0-or-later
2+
# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) <j.d.a.jewell@open.ac.uk>
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+
pedigree_schema = {
44+
schema_version | String | default = "1.0.0",
45+
contractile_verb | String | default = "UNSET",
46+
semantics | String | default = "UNSET",
47+
security = {
48+
leash | [| 'Kennel, 'Yard, 'Hunt |] | default = 'Kennel,
49+
trust_level | String | default = "UNSET",
50+
allow_network | Bool | default = false,
51+
allow_filesystem_write | Bool | default = false,
52+
allow_subprocess | Bool | default = true,
53+
},
54+
metadata = {
55+
name | String | default = "UNSET",
56+
version | String | default = "1.0.0",
57+
description | String | default = "UNSET",
58+
paired_xfile | String | default = "UNSET",
59+
author | String | default = "Jonathan D.A. Jewell <j.d.a.jewell@open.ac.uk>",
60+
},
61+
},
62+
63+
# Documents the shared status values. Verb files reproduce their full enum verbatim.
64+
status_core_doc = "status_core values: declared | verified | failing — extended per verb",
65+
66+
probe_schema = {
67+
command | String,
68+
timeout_seconds | Number | default = 300,
69+
allowed_exit_codes | Array Number | default = [0],
70+
permission_class
71+
| [| 'read_only, 'filesystem_write, 'subprocess, 'network |]
72+
| default = 'read_only,
73+
},
74+
75+
run_defaults = {
76+
on_pass = "continue",
77+
on_any_fail = "exit-nonzero",
78+
report_format = "a2ml",
79+
emit_summary = true,
80+
},
81+
}
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
# SPDX-License-Identifier: AGPL-3.0-or-later
2+
# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) <j.d.a.jewell@open.ac.uk>
3+
#
4+
# Adjustfile.a2ml — accessibility contractile
5+
# Paired runner: adjust.ncl
6+
# Verb: adjust
7+
# Semantics: Accessibility requirements and compliance for The Nash Equilibrium.
8+
# Covers both the physical board-game materials and any digital
9+
# companion components.
10+
#
11+
# CLI:
12+
# contractile adjust check → list violations
13+
# contractile adjust fix → apply deterministic fixes where defined
14+
15+
@abstract:
16+
Accessibility requirements for The Nash Equilibrium — a 6X strategy board game.
17+
Accessibility is considered for: print-and-play physical materials, rulebook,
18+
and the planned digital companion app (Tauri 2.0+). Physical game comes first.
19+
@end
20+
21+
## Purpose
22+
23+
Ensure The Nash Equilibrium is playable by the broadest range of people,
24+
including those with colour-blindness, low vision, motor difficulties, or
25+
cognitive differences. Game theory is for everyone.
26+
27+
## Anti-Purpose
28+
29+
This file does NOT track game balance or difficulty — those belong in
30+
docs/game-design/playtesting-plan.adoc.
31+
32+
## Physical Game Materials
33+
34+
### colourblind-safe-palette
35+
- description: All game components use a colourblind-safe colour palette (Okabe-Ito or equivalent)
36+
- status: declared
37+
- probe: grep -r "colourblind\|color-blind\|Okabe" docs/game-design/board-design.adoc
38+
- compliance: WCAG 2.1 (colour contrast principle, adapted for print)
39+
- notes: Board design currently uses unnamed colours. Needs explicit palette decision.
40+
41+
### pattern-not-colour-only
42+
- description: Player/faction distinctions use pattern OR icon in addition to colour (never colour alone)
43+
- status: declared
44+
- probe: grep -q "pattern\|icon\|symbol" docs/game-design/board-design.adoc
45+
- compliance: WCAG 2.1 §1.4.1 (Use of Color)
46+
- notes: Addresses red-green colourblindness for player token differentiation.
47+
48+
### large-print-rulebook
49+
- description: Rulebook available in large-print format (minimum 14pt equivalent)
50+
- status: declared
51+
- probe: test -f docs/print/RULEBOOK-LARGE-PRINT.adoc || test -f docs/print/RULEBOOK-LARGE-PRINT.pdf
52+
- notes: Priority for players with low vision. Can be print-on-demand.
53+
54+
### tactile-component-differentiation
55+
- description: Player tokens have distinct tactile profiles (shape/texture) in addition to colour
56+
- status: declared
57+
- probe: grep -q "tactile\|texture\|shape" docs/game-design/board-design.adoc
58+
- notes: For players with low/no vision. Distinct shapes per player faction.
59+
60+
## Rulebook / Documentation
61+
62+
### plain-language-rules
63+
- description: Rulebook uses plain language (Flesch-Kincaid grade ≤ 10 for core rules)
64+
- status: declared
65+
- probe: echo "manual check required"
66+
- compliance: Plain English standard
67+
- notes: Game theory concepts explained accessibly; technical terms defined on first use.
68+
69+
### game-theory-glossary
70+
- description: Glossary of game theory terms included in rulebook (Nash equilibrium, dominant strategy, payoff matrix, etc.)
71+
- status: declared
72+
- probe: grep -q "glossary\|Glossary" docs/game-design/OVERVIEW.adoc
73+
- notes: Critical for players unfamiliar with game theory.
74+
75+
### alternative-formats
76+
- description: Core game materials available in both print (PDF) and screen-reader-compatible text format
77+
- status: declared
78+
- probe: test -f docs/print/RULEBOOK.pdf || test -f docs/print/RULEBOOK.adoc
79+
- notes: AsciiDoc source is screen-reader-friendly; PDF export is a bonus.
80+
81+
## Digital Companion (Future)
82+
83+
### keyboard-only-play
84+
- description: Digital companion fully operable via keyboard (no mouse required)
85+
- status: declared
86+
- compliance: WCAG 2.1 §2.1 (Keyboard Accessible)
87+
- notes: Relevant when Tauri 2.0+ companion is built. Track here now, implement then.
88+
89+
### screen-reader-compatible
90+
- description: Digital companion compatible with common screen readers (NVDA, VoiceOver)
91+
- status: declared
92+
- compliance: WCAG 2.1 §4.1.2 (Name, Role, Value)
93+
- notes: Depends on Tauri/ReScript UI layer.
94+
95+
### high-contrast-mode
96+
- description: Digital companion supports high-contrast mode (OS-level and in-app toggle)
97+
- status: declared
98+
- compliance: WCAG 2.1 §1.4.3 (Contrast Minimum)
99+
- notes: Implement via CSS/Tauri theme system.

0 commit comments

Comments
 (0)