Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
105 commits
Select commit Hold shift + click to select a range
c07b4e3
docs(brief): add M1.D milestone brief
guysenpai Sep 14, 2026
50f99ea
docs(brief): confirm specs read for M1.D
guysenpai Sep 14, 2026
de0b6cc
docs(brief): record the base arbitration and activate M1.D
guysenpai Sep 14, 2026
95c207e
chore(ci): drop the post-build cache save and resize the budgets
guysenpai Sep 14, 2026
6c35309
docs(brief): record the CI-trigger blocker at the S1 gate
guysenpai Sep 14, 2026
96b2adb
docs(brief): record design decision on pull-request timing
guysenpai Sep 14, 2026
63ff2e5
chore(ci): pin the cpu axis on the bench workflow
guysenpai Sep 14, 2026
43f6b89
docs(ci): re-pose the matrix-trigger problem and drop the french prose
guysenpai Sep 14, 2026
92df1ac
docs(brief): record the live eviction measurement
guysenpai Sep 14, 2026
4af33ea
chore(ci): measure what the cache archive is made of
guysenpai Sep 14, 2026
d92a15b
docs(brief): record the cache composition and a second scheduler dump
guysenpai Sep 14, 2026
ab61c42
chore(ci): stop the setup-zig layer from shadowing the build cache
guysenpai Sep 14, 2026
85a5af4
docs(brief): record what the two cache changes are measured to have done
guysenpai Sep 14, 2026
95e66ea
chore(ci): version the cache lineage and let this branch write
guysenpai Sep 14, 2026
e4dd966
fix(ci): key the branch escape hatch on head_ref, not ref_name
guysenpai Sep 14, 2026
2268427
docs(brief): measure L and R on the versioned lineage
guysenpai Sep 14, 2026
99780e7
chore(ci): cache the seven optimising cells only
guysenpai Sep 14, 2026
505a63d
docs(brief): measure the cut on one full run
guysenpai Sep 14, 2026
aa4d01b
docs(brief): identify the two red cells and bound the re-run
guysenpai Sep 14, 2026
dae8dd8
docs(brief): sort the ci.yml comment blocks into three heaps
guysenpai Sep 14, 2026
ff0a4c2
docs(ci): route the comment blocks to their owners
guysenpai Sep 14, 2026
d704327
docs(ci): remove the last identifiers and sort the nightly workflow
guysenpai Sep 15, 2026
425c591
docs(brief): measure S1's exit over two runs and list the entry states
guysenpai Sep 15, 2026
685575b
chore(ci): bound a cache lineage in time and split two colliding keys
guysenpai Sep 15, 2026
f267432
docs(brief): record G8 and the floor of a rotated lineage
guysenpai Sep 15, 2026
dde2629
docs(brief): record the two-run measurement of the rotated lineage
guysenpai Sep 15, 2026
62c2a5e
chore(ci): drop the copied cache key and isolate the timing upload
guysenpai Sep 15, 2026
5f11d9e
docs(brief): record G9 and RD-4
guysenpai Sep 15, 2026
0e0031f
docs(brief): record the G9 verdict and the workflow tally at close
guysenpai Sep 15, 2026
35e7e51
fix(ecs-bridge): key a component ref on its entity, not a chunk slot
guysenpai Sep 15, 2026
136aa32
docs(brief): record S2/G1 and the two inversions it turned over
guysenpai Sep 15, 2026
91eac1e
fix(ecs): release an archetype chunk when its entity count reaches zero
guysenpai Sep 15, 2026
9fbee9c
docs(brief): record S2/G2, the M1.D.0 formulation, and two rules
guysenpai Sep 15, 2026
6d4e3c9
fix(bindgen): check git answers before reading its exit as a diff
guysenpai Sep 15, 2026
46a2c84
fix(ecs): state the singleton-query exclusion once, in the matcher
guysenpai Sep 15, 2026
8d995ae
docs(brief): record S2/G3 and its two counter-factuals
guysenpai Sep 15, 2026
921adf0
fix(foundation): walk the reason as far as the refusal walks
guysenpai Sep 15, 2026
b5ce2be
docs(brief): record S2/G4 and the green-branch counter-factual
guysenpai Sep 15, 2026
83785c1
fix(forge): normalise a gameplay rotation write below the frozen surface
guysenpai Sep 15, 2026
379aa7a
feat(bench): publish the steady allocation count it already computed
guysenpai Sep 15, 2026
e1c0151
docs(brief): record S2/G5 and the M1.D.20 closure formulation
guysenpai Sep 15, 2026
4b4aff9
fix(ecs): confront a schema digest before reusing a component id
guysenpai Sep 15, 2026
1ec8cce
docs: remove the prior-state narrative from the S2 comment blocks
guysenpai Sep 15, 2026
4074147
fix(jobs): tell "not yet parked" from "never parks" in the park test
guysenpai Sep 15, 2026
66e401e
docs: bring S2's comments under the three-line rule
guysenpai Sep 15, 2026
95e7014
docs(ecs): keep the contract, drop the narrative in twelve core files
guysenpai Sep 17, 2026
6561623
docs(ecs): strip the narrative from four more Tier 0 files
guysenpai Sep 17, 2026
e0d5cce
docs(ecs): tighten the two query files and fix two broken blocks
guysenpai Sep 17, 2026
316612f
docs(ecs): repair three broken blocks in the scheduler, trim two files
guysenpai Sep 17, 2026
b5ca3bd
docs(ecs): reattach three doc blocks S2 detached, trim world.zig
guysenpai Sep 17, 2026
da58467
docs(etch): correct four false claims in the codegen's small files
guysenpai Sep 17, 2026
9e0c33a
docs(etch): fix five malformed code ranges, trim the bridge
guysenpai Sep 17, 2026
dc0a4ef
docs(etch): complete a truncated line, dedupe a twin warning
guysenpai Sep 17, 2026
248bc95
docs(etch): the four large files were already clean
guysenpai Sep 17, 2026
b2ed5a2
docs(core): two more truncations, and the scheduler's incident trail
guysenpai Sep 17, 2026
9beaf6d
docs(foundation): drop a rate series the milestone refused to record
guysenpai Sep 17, 2026
5312011
docs(forge): three truncations in one file, and six self-corrections
guysenpai Sep 17, 2026
4f0ebf6
docs(forge): turn eight warnings from past tense into instructions
guysenpai Sep 17, 2026
84d5687
docs(modules): render and asset_pipeline are clean
guysenpai Sep 17, 2026
a4a15ae
docs(src): close the tree — six last files, one past tense turned
guysenpai Sep 17, 2026
fd71a0c
docs(tooling): two directories that were already right
guysenpai Sep 17, 2026
cc4021c
docs(tests): a rule written four times, and three meta paragraphs
guysenpai Sep 17, 2026
454fd57
docs(tests): drop the milestone prefix from 74 file headers
guysenpai Sep 17, 2026
41f7f1b
docs(tests): the ecs directory read in full — 18 files, 517 lines
guysenpai Sep 17, 2026
99783ef
docs(tests): physics — two false claims, and the gate vocabulary
guysenpai Sep 17, 2026
033d853
docs(tests): etch — a header that narrated its own revisions
guysenpai Sep 17, 2026
cf4a1b4
docs(tests): core — one paragraph written four times, verbatim
guysenpai Sep 17, 2026
52917d1
docs(tests): etch_interp — two counts of 20 over 68 and 87 entries
guysenpai Sep 17, 2026
52e60f9
docs(tests): ipc and scene — a chapter announced as still to come
guysenpai Sep 17, 2026
2fa0dcb
docs(tests): the sixteen remaining directories, and a phantom count
guysenpai Sep 17, 2026
799bd57
docs: build.zig and the examples, the last files of the repository
guysenpai Sep 17, 2026
b18f5c1
docs: the three criteria in CLAUDE.md, and seven duplications
guysenpai Sep 17, 2026
4b6159d
docs(brief): close S2 — the verdict on M1.D.19 and M1.D.29, and RD-5
guysenpai Sep 18, 2026
bd07f3e
docs(brief): re-establish the six entries and deliver M1.D.5
guysenpai Sep 18, 2026
e48c786
test(etch): assert emission for 33 diagnostic codes nothing asserted
guysenpai Sep 18, 2026
977c06b
docs(brief): record S3/G2 — the perimeter and the mutation verdict
guysenpai Sep 18, 2026
64d4485
docs(tests): the EBNF corpus is curated, and extraction is refuted
guysenpai Sep 18, 2026
83560ea
docs(brief): record S3/G3 — M1.D.4 re-posed, its remedy refuted
guysenpai Sep 18, 2026
753cb75
docs: the trailing comma is the parser's fault, not the grammar's
guysenpai Sep 18, 2026
cf8dda0
docs(etch): the AST subset is not knowable from this tree
guysenpai Sep 18, 2026
c711261
docs(brief): record S3/G4 — what decides the AST partition
guysenpai Sep 18, 2026
4e9c772
test(etch): pin what a Zig error arrives as, since nothing observed it
guysenpai Sep 18, 2026
46ae448
docs(brief): record S3/G5 — M1.D.15 (a) measured and observed
guysenpai Sep 18, 2026
250737e
docs(brief): close S3 — five gates and two self-corrections
guysenpai Sep 18, 2026
3c993dc
docs(brief): the nine re-established, and a remedy missing its subject
guysenpai Sep 18, 2026
b246785
fix(lint): tell a rename from an edit, which the check conflated
guysenpai Sep 18, 2026
7b5b412
refactor(foundation): the two sub-roots take the name the rule gives
guysenpai Sep 18, 2026
4ba2e6f
docs(brief): record S4/G2 — the split, and a G1 consequence corrected
guysenpai Sep 18, 2026
78f45fb
fix(lint): one contract for paths, and a report no run could reach
guysenpai Sep 18, 2026
964203a
docs(brief): record S4/G3 — three premises measured false, two closed
guysenpai Sep 18, 2026
13e11ab
test(plugin-loader): the freeze now sees an addition, which it never did
guysenpai Sep 18, 2026
8fe8214
docs(bench): half of a committed report's premise is false at this head
guysenpai Sep 18, 2026
c7ed136
docs(brief): record S4/G4 — two small defects closed, two measured
guysenpai Sep 18, 2026
7bcdd1f
fix(platform): setAffinity has no caller, and the header said it did
guysenpai Sep 18, 2026
0a238e7
docs(brief): record S4/G5 — both bench premises false at their source
guysenpai Sep 18, 2026
b26556a
docs(brief): close S4 — nine entries, and the set they counted
guysenpai Sep 18, 2026
317ae11
fix: the six defects of the external NO-GO, and what they hid
guysenpai Sep 19, 2026
dfb885d
docs: close M1.D — seven internal refusals against same-day code
guysenpai Sep 19, 2026
00fbcc6
docs: the S4 close is b26556a, not S2's commit
guysenpai Sep 19, 2026
39bedd5
fix(etch): an unresolved type is not a type without storage
guysenpai Sep 20, 2026
72ba837
docs: close M1.D — an adjacent case is shown safe, not declared safe
guysenpai Sep 20, 2026
59525ba
fix(etch): the set a suspension retains, not the locals it names
guysenpai Sep 20, 2026
1c0e863
fix(etch): arm on what suspends the parent, not on the await keyword
guysenpai Sep 20, 2026
b71017e
docs: close M1.D — enumerate the set, do not reason about the instance
guysenpai Sep 21, 2026
a3f08f3
docs: the seventh unit error is in the closure title itself
guysenpai Sep 21, 2026
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
69 changes: 11 additions & 58 deletions .github/workflows/bench.yml
Original file line number Diff line number Diff line change
@@ -1,12 +1,5 @@
name: Bench

# Benchmark jobs, split out of the CI (test) workflow at M0.9 / E1 — debt
# tracked since M0.1 ("CI debt to investigate seriously in M0.2") and due at
# the M0.8 close. ci.yml now carries only test-category jobs; this workflow
# carries benchmarks. The full perf gates (S1 ≤ 62 µs etc.) are validated
# locally on the reference machine under the thermal-aware protocol, NOT in
# CI — this is the compile-and-run smoke that keeps the bench harness building
# and executing on every PR.

on:
push:
Expand Down Expand Up @@ -34,9 +27,8 @@ permissions:
contents: read

env:
# Single source of truth for the toolchain version — also keys the Zig
# build cache below (cf. ci.yml).
ZIG_VERSION: "0.16.0"
ZIG_CPU: "baseline"

jobs:
bench-ecs-smoke:
Expand All @@ -45,26 +37,6 @@ jobs:
matrix:
os: [ubuntu-24.04, windows-2025]
runs-on: ${{ matrix.os }}
# Raised 10 -> 20 at M1.B/G11, on measurement rather than on symmetry.
#
# `bench-ecs-smoke (windows-2025)` was ALREADY at the edge: the last run to
# pass took 9m37 against the 10-minute budget — 23 seconds of headroom — and
# the very next run on the following commit was cancelled at 11m28. That
# marginality is a standing open item, first closed by experiment at
# M1.1.11.1 (cancelled at 9m28, passed on rerun at 7m34 on the SAME commit),
# with the code exonerated there too.
#
# M1.B then made it worse, and MEASURED so rather than assumed: this step
# runs `zig build bench-ecs`, whose run step depends on the install step, so
# it compiles EVERY installed artifact — verified by deleting
# `zig-out/bin/` and observing `ecs-hybrid-crossover-bench` reappear
# alongside `ecs-benchmark`. The new crossover bench is therefore compiled by
# this job, and the growth is legitimate work rather than a regression.
#
# 20 is not a masking: `build-and-test (windows-2025, ReleaseSafe)` compiles
# the whole forge suite on the same runner class in 42m, so a hang is still
# caught here well before it costs an hour. A job that fails on budget every
# run is worse than an absent job — it teaches everyone not to read it.
timeout-minutes: 20
steps:
- uses: actions/checkout@v6
Expand All @@ -74,47 +46,28 @@ jobs:
- uses: weldengine/setup-zig@v0.1.0
with:
version: ${{ env.ZIG_VERSION }}
# use-cache: false — the action caches .zig-cache itself; this workflow owns it
use-cache: false

# M0.9 / E1 — Zig build cache keyed on (os, optimize mode, zig version,
# build.zig.zon hash). The bench builds in ReleaseSafe and shares the
# exact key scheme with ci.yml's ReleaseSafe cells, so the warm cache
# is reused repo-wide (GitHub caches are repository-scoped, not
# workflow-scoped). The Zig cache is content-hashed and self-
# invalidating, so a restored cache never produces a stale build.
- name: Restore Zig cache
uses: actions/cache@v5
with:
path: .zig-cache
key: zig-${{ matrix.os }}-ReleaseSafe-${{ env.ZIG_VERSION }}-${{ hashFiles('build.zig.zon') }}
key: zig-v2-${{ github.job }}-${{ matrix.os }}-ReleaseSafe-${{ env.ZIG_CPU }}-${{ env.ZIG_VERSION }}-${{ hashFiles('build.zig.zon') }}
restore-keys: |
zig-${{ matrix.os }}-ReleaseSafe-${{ env.ZIG_VERSION }}-
zig-v2-${{ github.job }}-${{ matrix.os }}-ReleaseSafe-${{ env.ZIG_CPU }}-${{ env.ZIG_VERSION }}-

# Compile-and-run sanity for the S1 ECS bench. The full bench gate
# (≤ 62 µs median ReleaseSafe on the M4 Pro reference) is checked
# locally on Guy's machine, not in CI — see briefs/S1-mini-ecs.md.
- name: zig build bench-ecs -- --smoke
run: zig build bench-ecs -Doptimize=ReleaseSafe -- --smoke
run: zig build bench-ecs -Doptimize=ReleaseSafe -Dcpu=${{ env.ZIG_CPU }} -- --smoke

# M1.B: the crossover bench RUNS here and its measurement is archived,
# which the milestone's acceptance criteria require and which this
# workflow could not do before — it carried no `upload-artifact` step at
# all, and the crossover bench was compiled by the step above without
# ever being executed.
#
# The FULL sweep, not `--smoke`: measured at 15 s in ReleaseSafe on the
# M4 Pro reference (against 1 s for the smoke), so even several times
# slower on a runner it is negligible against the 20-minute budget — and
# a one-cell-per-configuration sample archived as "the measurement" would
# be a thinner artifact for no saving worth having. The bench has NO pass
# threshold, permanently: `engine-ecs-internals.md` §2 refuses to engrave
# a crossover threshold and names this bench as what produces one, so its
# output is the deliverable and a red here would mean the bench crashed,
# never that a number moved.
# No pass threshold here, permanently: engine-ecs-internals.md §2 refuses to
# engrave a crossover threshold and names this bench as what produces one, so
# its output is the deliverable and a red means the bench crashed.
- name: zig build bench-ecs-hybrid (crossover sweep)
run: zig build bench-ecs-hybrid -Doptimize=ReleaseSafe
run: zig build bench-ecs-hybrid -Doptimize=ReleaseSafe -Dcpu=${{ env.ZIG_CPU }}

- name: Archive the crossover measurement
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v6
with:
name: ecs-hybrid-crossover-${{ matrix.os }}
path: bench/results/ecs_hybrid_crossover.md
Expand Down
Loading