Skip to content

Commit 0628dba

Browse files
feat: wire ARG + FRG into language status dashboard (#57)
## Summary Extends the language status dashboard with ARG (Adoption Readiness Grades) + FRG (Foundations Readiness Grades) wiring, implementing the dashboard side of the framework being introduced in hyperpolymath/standards#226. - **TOOLING-STATUS.adoc** — adds a Language Grades Matrix section - **language-status-tracker.jl** — adds `LanguageGrades` struct + grade extraction Reads per-language `ARG-PROFILE.adoc` + `FRG-PROFILE.adoc` from each tracked language repo (where present) and surfaces the `X | F | E | D | C | B | A` grade across all four maturity axes (ARG / TRG / FRG / CRG) plus RSR. Companion per-language profile PRs: - affinescript: ARG-D + FRG-E - ephapax: ARG-E + FRG-D - my-lang: ARG-D-leaning-E + FRG-X ## Test plan - [ ] CI passes - [ ] `.adoc` renders cleanly - [ ] `language-status-tracker.jl` parses/runs cleanly - [ ] No SPDX-header lint complaints 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 7f9905d commit 0628dba

2 files changed

Lines changed: 136 additions & 0 deletions

File tree

TOOLING-STATUS.adoc

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,64 @@ This monorepo contains 12 programming languages + 2 meta-projects. All 12 langua
1111
are registered in the BoJ Server `lang-mcp` cartridge with session management, type-checking,
1212
and evaluation via zig adapter + Zig FFI.
1313

14+
== Language Grades Matrix
15+
16+
Per-language grades against the five hyperpolymath language-grade standards:
17+
18+
* *CRG* (Component Readiness Grades) — worst-of any released component
19+
* *TRG* (Toolchain Readiness Grades) — language toolchain (parser, type checker, codegen…)
20+
* *ARG* (Adoption Readiness Grades) — language as adoptable artefact
21+
* *FRG* (Foundations Readiness Grades) — mathematical foundations
22+
* *RSR* (Rhodium Standard Repositories) — repository hygiene compliance level
23+
24+
All graders use `X | F | E | D | C | B | A`. The grade source of truth lives in each
25+
language's repo at `spec/{ARG,FRG,TRG}-PROFILE.adoc`; the values below are mirrored
26+
here for at-a-glance comparison and are refreshed by `language-status-tracker.jl`.
27+
28+
Cross-axis invariants: ARG ≤ TRG always; ARG-A requires FRG ≥ B.
29+
30+
[cols="<2,^1,^1,^1,^1,^1,<3", options="header"]
31+
|===
32+
| Language | CRG | TRG | ARG | FRG | RSR | Notes
33+
34+
| **AffineScript**
35+
| TBD | TBD | D | E | FULL
36+
| ARG-D leaning; CLI gates programs. FRG-E pragmatic / X strict (no `formal/`).
37+
38+
| **Ephapax**
39+
| TBD | TBD | E | D | FULL
40+
| Strong FRG narrative (preservation stated, layered redesign committed). Adoption surface sparse.
41+
42+
| **My**
43+
| TBD | TBD | D-leaning-E | X | FULL
44+
| 11 crates, 4 dialects. PROOF-NEEDS.md honestly records template-ABI removal (FRG-X discipline).
45+
46+
| **Eclexia** | TBD | TBD | TBD | TBD | TBD | Profile not yet authored.
47+
| **Betlang** | TBD | TBD | TBD | TBD | TBD | Profile not yet authored.
48+
| **Phronesis** | TBD | TBD | TBD | TBD | TBD | Profile not yet authored.
49+
| **Wokelang** | TBD | TBD | TBD | TBD | TBD | Profile not yet authored.
50+
| **Anvomidav** | TBD | TBD | TBD | TBD | TBD | Profile not yet authored.
51+
| **Julia-the-viper** | TBD | TBD | TBD | TBD | TBD | Profile not yet authored.
52+
| **Oblibeny** | TBD | TBD | TBD | TBD | TBD | Profile not yet authored.
53+
| **Error-lang** | TBD | TBD | TBD | TBD | TBD | Profile not yet authored.
54+
| **Kitchenspeak** | TBD | TBD | TBD | TBD | TBD | Profile not yet authored.
55+
| **Tangle** | TBD | TBD | TBD | TBD | TBD | Profile not yet authored.
56+
| **Me-dialect** | TBD | TBD | TBD | TBD | TBD | Profile not yet authored.
57+
| **VCL-total (vcl-ut)** | TBD | TBD | TBD | TBD | TBD | Database/identity language; per ARG §1.1 tightening applies.
58+
| **KRL** | TBD | TBD | TBD | TBD | TBD | Database/resolution language; canonical READINESS.md template lives here.
59+
| **Quandledb** | TBD | TBD | TBD | TBD | TBD | Database language.
60+
| **TypeLL** | TBD | TBD | TBD | TBD | TBD | Type-theory foundation, feeds VCL-total levels.
61+
| **PanLL** | TBD | TBD | TBD | TBD | TBD | Type-theory foundation.
62+
|===
63+
64+
Standards specs:
65+
66+
* `standards/component-readiness-grades/`
67+
* `standards/toolchain-readiness-grades/`
68+
* `standards/adoption-readiness-grades/`
69+
* `standards/foundations-readiness-grades/`
70+
* `standards/rhodium-standard-repositories/`
71+
1472
== Language Tooling Matrix
1573

1674
[cols="<2,^1,^1,^1,^1,^1,^1,^1,^1,^1", options="header"]

language-status-tracker.jl

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,66 @@ function language_type(status)
101101
end
102102
end
103103

104+
# --- Grade extraction (ARG / FRG / TRG / CRG / RSR) -------------------------
105+
#
106+
# Each language's per-grade profile lives at `spec/{ARG,FRG,TRG}-PROFILE.adoc`
107+
# in the language's own repo. The "Current X Grade:" line is the source of
108+
# truth for the language's grade against that standard. We extract by regex
109+
# rather than parsing AsciiDoc, because the profile format is stable.
110+
111+
struct LanguageGrades
112+
arg::String
113+
trg::String
114+
frg::String
115+
crg::String
116+
rsr::String
117+
end
118+
119+
const GRADE_LINE_RE = Dict(
120+
:arg => r"Current ARG Grade\s*\|\s*\*?\*?([XFEDCBA][^*|]*)"i,
121+
:trg => r"Current TRG Grade\s*\|\s*\*?\*?([XFEDCBA][^*|]*)"i,
122+
:frg => r"Current FRG Grade\s*\|\s*\*?\*?([XFEDCBA][^*|]*)"i,
123+
:crg => r"Current CRG Grade\s*\|\s*\*?\*?([XFEDCBA][^*|]*)"i,
124+
:rsr => r"RSR Compliance\s*\|\s*([A-Z]+)"i,
125+
)
126+
127+
function extract_grade(path::String, kind::Symbol)
128+
isfile(path) || return "TBD"
129+
try
130+
text = read(path, String)
131+
m = match(GRADE_LINE_RE[kind], text)
132+
return m === nothing ? "TBD" : strip(m.captures[1])
133+
catch
134+
return "TBD"
135+
end
136+
end
137+
138+
function get_language_grades(name::String)
139+
path = joinpath(REPOS_DIR, name)
140+
isdir(path) || return LanguageGrades("", "", "", "", "")
141+
142+
arg_file = joinpath(path, "spec", "ARG-PROFILE.adoc")
143+
frg_file = joinpath(path, "spec", "FRG-PROFILE.adoc")
144+
trg_file = joinpath(path, "spec", "TRG-PROFILE.adoc")
145+
146+
arg = extract_grade(arg_file, :arg)
147+
trg = extract_grade(trg_file, :trg)
148+
frg = extract_grade(frg_file, :frg)
149+
# CRG and RSR may appear in any of the three profile files; first hit wins.
150+
crg = "TBD"
151+
rsr = "TBD"
152+
for f in (arg_file, frg_file, trg_file)
153+
if crg == "TBD"
154+
crg = extract_grade(f, :crg)
155+
end
156+
if rsr == "TBD"
157+
rsr = extract_grade(f, :rsr)
158+
end
159+
end
160+
161+
return LanguageGrades(arg, trg, frg, crg, rsr)
162+
end
163+
104164
function status_emoji(status)
105165
if !status.exists
106166
return ""
@@ -159,6 +219,24 @@ println()
159219
println("=" ^ 80)
160220
println()
161221

222+
# Grade matrix — sources from spec/{ARG,FRG,TRG}-PROFILE.adoc in each repo.
223+
# Cross-axis invariants: ARG ≤ TRG always; ARG-A requires FRG ≥ B.
224+
println("LANGUAGE GRADE MATRIX (CRG / TRG / ARG / FRG / RSR)")
225+
println("-" ^ 60)
226+
println("| Language | CRG | TRG | ARG | FRG | RSR |")
227+
println("|----------|-----|-----|-----|-----|-----|")
228+
for status in sort(statuses, by=s->s.name)
229+
status.exists || continue
230+
g = get_language_grades(status.name)
231+
println("| $(status.name) | $(g.crg) | $(g.trg) | $(g.arg) | $(g.frg) | $(g.rsr) |")
232+
end
233+
println()
234+
println("Grade source of truth: each language repo's `spec/{ARG,FRG,TRG}-PROFILE.adoc`.")
235+
println("Missing/unparsed entries surface as TBD; '—' means repo not on disk.")
236+
println()
237+
println("=" ^ 80)
238+
println()
239+
162240
# Production ready list
163241
println("🟢 PRODUCTION READY (40+ source files):")
164242
println("-" ^ 40)

0 commit comments

Comments
 (0)