-
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathjustfile
More file actions
358 lines (295 loc) · 15.5 KB
/
Copy pathjustfile
File metadata and controls
358 lines (295 loc) · 15.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
# SPDX-License-Identifier: MPL-2.0
# Palimpsest principles apply as an overlay policy; legal baseline is MPL-2.0.
# SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell <j.d.a.jewell@open.ac.uk>
# justfile — hyperpolymath standard task runner for AffineScript
# Show available recipes
default:
@just --list
# ── Build ────────────────────────────────────────────────────────────────────
# Build the compiler.
# Masks the benign, intentionally-left LALR parser-generator notices
# (inherent ambiguities Menhir resolves correctly — the alcotest gate
# proves the parse is right; the count drifts, so it is not hardcoded
# here). NOT hidden: the build prints how many were
# masked, the proof they are inconsequential, and how to show them.
# Policy: docs/specs/SETTLED-DECISIONS.adoc "Parser-Conflict Disclosure".
build:
#!/usr/bin/env bash
if [ -n "${AFFINESCRIPT_SHOW_MENHIR_NOISE:-}" ]; then exec dune build; fi
pat='shift/reduce conflicts|reduce/reduce conflict|states have (shift|reduce)-reduce|do not know how to resolve a reduce/reduce'
out=$(dune build 2>&1); rc=$?
printf '%s\n' "$out" | grep -vE "$pat"
n=$(printf '%s\n' "$out" | grep -cE "$pat" || true)
if [ "${n:-0}" -gt 0 ]; then
echo ""
echo "ℹ ${n} benign LALR parser-generator notice(s) masked. The parser"
echo " parses correctly — full 'just test' gate (257) is green. These are"
echo " inherent, correctly-resolved, intentionally-left conflicts, not a"
echo " defect (see docs/specs/SETTLED-DECISIONS.adoc, \"Parser-Conflict"
echo " Disclosure Policy\"). Show them: 'just build-loud'."
fi
exit $rc
# Build the compiler showing ALL raw parser-generator output (nothing masked)
build-loud:
AFFINESCRIPT_SHOW_MENHIR_NOISE=1 dune build
# Clean build artifacts
clean:
dune clean
# Build with release optimisations
build-release:
dune build --release
# Build documentation
doc:
dune build @doc
# ── Test ─────────────────────────────────────────────────────────────────────
# Run all tests
test:
dune runtest
# Run conformance tests only
conformance:
dune runtest conformance
# Run face-transformer regression tests (snapshot diff + round-trip parse)
test-faces:
./tools/run_face_transformer_tests.sh
# Record any missing face-transformer snapshots (first-run / new face)
test-faces-record:
./tools/run_face_transformer_tests.sh --record-missing
# Update all face-transformer snapshots (intentional transformer change)
test-faces-update:
./tools/run_face_transformer_tests.sh --update
# ── Format / Lint ─────────────────────────────────────────────────────────────
# Run format check (lint)
lint:
@if command -v ocamlformat >/dev/null 2>&1; then \
dune fmt --preview; \
else \
echo "ocamlformat not installed; skipping format check"; \
fi
# Format code in place
fmt:
dune fmt
# Run all checks (lint + test + regression guards)
check: lint test guard
# Regression guards:
# - Issue #35 Phase 3: fails if extension.ts reappears under
# editors/vscode/src or any face's vscode extension dir.
# - Issue #176 (DOC-01..09): the unified doc-truthing guard — fails if the
# status-doc banners / matrix primacy / STATE.a2ml mirror keys re-drift,
# OR if a NEW backend-breadth / "production-ready" / stdlib-% over-claim
# appears beyond the frozen baseline.
guard:
./tools/check-no-extension-ts.sh
./tools/check-doc-truthing.sh
./tools/check-soundness-ledger.sh
./tools/check-capability-anchors.sh
# Re-baseline the doc-truthing over-claim ledger after a deliberate, legitimate
# change (e.g. a new dated roadmap milestone). Commit the .allow diff.
doc-truth-bless:
./tools/check-doc-truthing.sh --update
# ── Proofs ─────────────────────────────────────────────────────────────────────
# Re-check the mechanised proofs against their proof assistants and fail on any
# dangerous escape hatch (believe_me / assert_total / postulate / sorry / axiom).
# Unfinished Idris2 `?` holes are reported as a warning, not a failure.
# Check the Solo-core QTT metatheory (Idris2).
proof-check-idris2:
./tools/check-proofs.sh --idris2
# Check the tropical-session-types proof (Lean 4).
proof-check-lean:
./tools/check-proofs.sh --lean
# Check the echo-boundary certificates (Agda). Needs AFFINESCRIPT_ECHO_TYPES_DIR
# and AGDA_STDLIB; skips with a message if either is unset (the proofs import
# modules from the external echo-types repo + agda-stdlib).
proof-check-agda:
./tools/check-proofs.sh --agda
# Check every mechanised proof in the repo.
proof-check-all:
./tools/check-proofs.sh --all
# ── WASM validation ────────────────────────────────────────────────────────────
# Compile the positive corpus to core wasm and run `wasm-tools validate` on
# every module. Closes the test_e2e.ml:601 blind spot (codegen-did-not-raise
# != emitted-valid-wasm). Hard-fails on any silent-invalid emission.
wasm-validate:
./tools/wasm-validate-gate.sh
# Compile canonical kernels to every coprocessor/accelerator backend
# (WGSL/SPIR-V/CUDA/Metal/OpenCL/MLIR/ONNX/Faust/Verilog/LLVM) and check the
# emission — validating with naga / SPIR-V magic where a tool is on PATH.
coprocessor-validate:
./tools/coprocessor-gate.sh
# Verify the AffineScript -> LLVM IR -> AArch64 object native spine (ADR-0024,
# the native Android target). Skips if llc is absent.
android-validate:
./tools/android-aarch64-gate.sh
# Compile FILE to Android-targeted LLVM IR (aarch64-linux-android triple).
# Lower to an object with: llc -filetype=obj OUT -o OUT.o (NDK links the .so).
compile-android FILE OUT:
AFFINESCRIPT_LLVM_TRIPLE=aarch64-linux-android dune exec affinescript -- compile {{FILE}} -o {{OUT}}
# Prove the AffineScript <-> typed-wasm contract across repos: AffineScript
# emits the typedwasm.ownership carrier; the sibling typed-wasm Rust verifier
# (tw-verify) consumes it. Asserts both verifiers agree (clean -> 0, drop -> 1).
# Set TYPED_WASM_DIR if hyperpolymath/typed-wasm is not at ../../typed-wasm.
typed-wasm-validate:
./tools/typed-wasm-roundtrip-gate.sh
# Compile FILE to a native executable via the LLVM backend and run it on the
# host: AffineScript -> LLVM IR -> clang -> a.out -> run. (Verified: prints +
# exits 0. For riscv64, see `riscv-run-validate`.)
native-run FILE:
#!/usr/bin/env bash
set -euo pipefail
ll="$(mktemp --suffix=.ll)"; exe="$(mktemp)"
dune exec affinescript -- compile "{{FILE}}" -o "$ll"
clang "$ll" -o "$exe" 2>/dev/null
"$exe"
# Compile FILE to a riscv64 native object (rv64gc / lp64d hard-float ABI).
compile-riscv FILE OUT:
#!/usr/bin/env bash
set -euo pipefail
ll="$(mktemp --suffix=.ll)"
AFFINESCRIPT_LLVM_TRIPLE=riscv64-unknown-linux-gnu dune exec affinescript -- compile "{{FILE}}" -o "$ll"
llc -mtriple=riscv64-linux-gnu -mattr=+m,+a,+f,+d,+c -target-abi=lp64d -filetype=obj "$ll" -o "{{OUT}}"
echo "wrote {{OUT}}"
# AffineScript -> riscv64 -> link -> RUN under qemu. Skips without the
# cross-toolchain: sudo apt install gcc-riscv64-linux-gnu qemu-user
riscv-run-validate:
./tools/riscv-run-gate.sh
# Per-backend RUNTIME bench over real, correctness-checked workloads (LP tropical
# min-plus + NLP Newton): compile to wasm (validate) and native (run + assert the
# verdict token + time). The proven-style "assert the answer, not just ran".
workload-bench:
./tools/workload-bench.sh
# ── Compiler subcommands ──────────────────────────────────────────────────────
# Run the lexer on a file
lex FILE:
dune exec affinescript -- lex {{FILE}}
# Run the parser on a file
parse FILE:
dune exec affinescript -- parse {{FILE}}
# Type-check a file
check-file FILE:
dune exec affinescript -- check {{FILE}}
# Evaluate a file
eval FILE:
dune exec affinescript -- eval {{FILE}}
# Compile a file to Wasm
compile FILE OUT:
dune exec affinescript -- compile {{FILE}} -o {{OUT}}
# Generate the AffineTEA bridge Wasm module
tea-bridge OUT:
dune exec affinescript -- tea-bridge -o {{OUT}}
# Regenerate IDApTIK titlescreen.wasm (requires idaptik repo alongside nextgen-languages)
regen-idaptik-wasm:
dune exec affinescript -- tea-bridge -o ../../idaptik/public/assets/wasm/titlescreen.wasm
@echo "[AffineTEA] titlescreen.wasm regenerated"
# ── Tooling (manifest-driven dev deps) ────────────────────────────────────────
# Fetch + build the pinned tree-sitter-rescript grammar used by the
# `.res → .affine` migration assistant (#57 Phase 2). Output is written
# to `tools/vendor/tree-sitter-rescript/` (gitignored). Requires the
# `tree-sitter` CLI on PATH — install via `cargo install tree-sitter-cli`
# (Rust-native, repo-preferred) or `npm install -g tree-sitter-cli`.
install-grammar:
./editors/tree-sitter-rescript/scripts/install.sh
# ── Validation ────────────────────────────────────────────────────────────────
# Verify golden path end-to-end
golden-path:
@echo "=== Golden Path Verification ==="
@echo "1. Building..."
dune build
@echo "2. Running tests..."
dune runtest
@echo "3. Lexer smoke test..."
dune exec affinescript -- lex examples/hello.affine 2>/dev/null || dune exec affinescript -- lex examples/hello.affine 2>/dev/null || echo "(no example file — skip)"
@echo "4. Ownership smoke test..."
dune exec affinescript -- parse examples/ownership.affine 2>/dev/null || dune exec affinescript -- parse examples/ownership.affine 2>/dev/null || echo "(no ownership example — skip)"
@echo "=== Golden Path Complete ==="
# Run panic-attack security scan
panic:
panic-attack assail
# ── Benchmarks (visibility-only) ──────────────────────────────────────────────
# Per docs/standards/TESTING.adoc §"Bench standards":
# microbenchmarks are wired under the @bench alias. Results print
# to stdout — no merge-blocking gate today. Promotion to enforcement
# requires a calibrated baseline + ratchet policy.
# Run microbenchmarks (lex / parse / typecheck / codegen sweeps)
bench:
dune exec bench/bench_main.exe
# Archive the current bench output to bench-runs/<UTC-timestamp>.log
bench-record:
#!/usr/bin/env bash
set -euo pipefail
mkdir -p bench-runs
ts=$(date -u +"%Y%m%dT%H%M%SZ")
out="bench-runs/${ts}.log"
echo "Recording bench run to ${out}"
dune build @bench --force
dune runtest @bench --force 2>&1 | tee "${out}"
echo "Saved: ${out}"
# ── Coverage (visibility-only) ────────────────────────────────────────────────
# Per docs/standards/TESTING.adoc §"Coverage (visibility-only)":
# instrumentation via bisect_ppx. HTML report only — no enforced
# floor. CI uploads the directory as an artifact for inspection.
# Run the test suite with bisect_ppx instrumentation and emit HTML
coverage:
#!/usr/bin/env bash
set -euo pipefail
rm -rf _coverage bisect*.coverage
dune runtest --force --instrument-with bisect_ppx
bisect-ppx-report html -o _coverage --title="AffineScript coverage"
bisect-ppx-report summary
echo ""
echo "HTML report: _coverage/index.html"
# ── Blitz ─────────────────────────────────────────────────────────────────────
# Full 16-category test + benchmark + security sweep per hyperpolymath blitz standard.
# Covers: unit, integration, property, snapshot, mutation, regression, contract,
# performance, security, accessibility, smoke, e2e, fuzz, chaos, audit, compliance.
blitz: _blitz-header _blitz-build _blitz-test _blitz-bench _blitz-security _blitz-lint _blitz-docs _blitz-footer
_blitz-header:
@echo ""
@echo "╔══════════════════════════════════════════╗"
@echo "║ AFFINESCRIPT BLITZ RUN ║"
@echo "║ 16 categories · 14 aspects · Six Sigma ║"
@echo "╚══════════════════════════════════════════╝"
@echo ""
_blitz-build:
@echo "── [1/6] Build ─────────────────────────────"
dune build
@echo " ✓ dune build clean"
dune build --release
@echo " ✓ release build clean"
_blitz-test:
@echo "── [2/6] Tests (E2E suite) ──────────────────"
dune runtest
@echo " ✓ all tests passing"
_blitz-bench:
@echo "── [3/6] Benchmarks ─────────────────────────"
@echo " (visibility-only per docs/standards/TESTING.adoc)"
dune build @bench --force 2>/dev/null && dune runtest @bench --force 2>/dev/null || echo " (no bench stanza or build failed — skip)"
_blitz-security:
@echo "── [4/6] Security (panic-attack) ────────────"
panic-attack assail 2>&1 | tail -20 || echo " (panic-attack not installed — skip)"
_blitz-lint:
@echo "── [5/6] Lint + Format ──────────────────────"
@if command -v ocamlformat >/dev/null 2>&1; then \
dune fmt --preview 2>&1 || echo " (format diffs present — run: just fmt)"; \
else \
echo " (ocamlformat missing — lint fmt check skipped)"; \
fi
_blitz-docs:
@echo "── [6/6] Doc build ──────────────────────────"
dune build @doc 2>/dev/null || echo " (no @doc alias — skip)"
_blitz-footer:
@echo ""
@echo "╔══════════════════════════════════════════╗"
@echo "║ BLITZ COMPLETE ║"
@echo "╚══════════════════════════════════════════╝"
@echo ""
@echo "Review any failures above before merging."
# ── Release ──────────────────────────────────────────────────────────────────
# Prepare a release
release VERSION:
@echo "Releasing {{VERSION}}..."
just check
sed -i 's/(version [^)]*/(version {{VERSION}}/' dune-project
dune build --release
git add -A
git commit -m "Release v{{VERSION}}"
git tag -a "v{{VERSION}}" -m "Release v{{VERSION}}"
@echo "To push: git push && git push --tags"