Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
125 commits
Select commit Hold shift + click to select a range
20be26b
docs(brief): refute the M1.D.47 overlap on 44 and 45 (S5/G1)
guysenpai Sep 21, 2026
bfc2d4a
docs(brief): classify the 37 namedTypeToResolved sites (S5/G2)
guysenpai Sep 21, 2026
25b5ba9
feat(etch): close four Phase 1 debt entries (M1.D/S5/G3)
guysenpai Sep 21, 2026
40d45cb
feat(etch): refuse arena values at the async retention point (S5/G4)
guysenpai Sep 21, 2026
043a44e
fix(build): drop the second epsilon, narrow bindgen-verify (S5/G5)
guysenpai Sep 21, 2026
e9f2b97
docs(brief): measure M1.D.35 — the remedy moves nothing (S5/G6)
guysenpai Sep 21, 2026
0e253c8
feat(ecs): refill a partially-filled chunk (M1.D/S5/G7)
guysenpai Sep 21, 2026
f4a92da
chore(debt): close ten entries M1.D created (M1.D/S5)
guysenpai Sep 22, 2026
2cb8e5a
docs(brief): measure M1.D.43, ownership does not reserve (S6/G8)
guysenpai Sep 23, 2026
960601a
docs(comments): reduce S5's comments to their contracts (S6/G8)
guysenpai Sep 23, 2026
a3b3ea6
fix(ecs): the registry owns its default blocks (M1.D/S5/G8)
guysenpai Sep 23, 2026
9d2609c
docs(brief): record M1.D.43 delivered (M1.D/S5/G8)
guysenpai Sep 23, 2026
cfb5f8b
fix(ecs): one owner on both registration paths (M1.D/S5/G8 bis)
guysenpai Sep 23, 2026
5708fce
fix(scene): never trust a string slot a scene file carries (S5/G8 bis)
guysenpai Sep 23, 2026
e1ee328
docs(brief): record M1.D/S5/G8 bis and what it raises
guysenpai Sep 23, 2026
ba10b3c
fix(etch): read a type node's name only when it is named (S5/G8 ter)
guysenpai Sep 23, 2026
d6aced9
test(etch): witness the event-field read the resource read dominates
guysenpai Sep 23, 2026
5611bed
fix(etch): refuse an unresolvable fn or method return type (S5/G8 ter)
guysenpai Sep 23, 2026
bda4f4c
fix(etch): refuse an overflowing literal or fold; wrap only at run time
guysenpai Sep 23, 2026
2e29c78
test(etch): witness the compile refusal and the codegen constants
guysenpai Sep 23, 2026
31d78c9
fix(etch): check a resource collection default against its elements
guysenpai Sep 23, 2026
397b094
test(etch): one verdict per collection default refusal
guysenpai Sep 23, 2026
f877cfb
fix(ecs): refuse a resource as a requisite, on every path
guysenpai Sep 23, 2026
6a73304
fix(etch): parse an annotation argument as §1.5 writes it (S5/G8 ter)
guysenpai Sep 23, 2026
d1efad7
fix(assets): read an asset file as §21.4 and §3 write it (S5/G8 ter)
guysenpai Sep 23, 2026
fd82bfc
test(assets): witness the refusal of a non-finite glTF bound
guysenpai Sep 23, 2026
9497957
fix(build): forward target, cpu, mode and precision to nested builds
guysenpai Sep 23, 2026
4803755
fix(lint): extend the dead-test guard to examples/
guysenpai Sep 23, 2026
9a1472d
test(assets): witness the refusal of a non-finite glTF position
guysenpai Sep 23, 2026
22072a4
fix(render): run the PSNR gate on the capture the smoke job writes
guysenpai Sep 23, 2026
dbcc69d
test(render): run the environment-bound tests on the cell that has it
guysenpai Sep 23, 2026
92ff73b
fix(render): make shaders-check fail when glslc cannot answer
guysenpai Sep 23, 2026
cfc1d9a
fix(ci): give the vertical-slice validation checks a positive control
guysenpai Sep 23, 2026
086e49c
fix(bench): compile the etch bench's stub for the bench's own target
guysenpai Sep 23, 2026
8df520c
fix(bench): put the stub's target flags before each module
guysenpai Sep 23, 2026
c931b60
test(render): require the hot-reload recompile to produce SPIR-V
guysenpai Sep 23, 2026
3563577
docs(brief): record S5/G8 ter up to the M1.D.47 arbitration
guysenpai Sep 23, 2026
b3fd951
fix(ci): save the zig caches from main only, on per-commit keys
guysenpai Sep 23, 2026
5ad26b5
fix(etch): tag the headerless string copies apart from persistent ones
guysenpai Sep 23, 2026
74b44e2
fix(etch): fail loud when a sync for body shrinks the array it iterates
guysenpai Sep 23, 2026
062908d
fix(etch): count every persistent handle an interpreter holder keeps
guysenpai Sep 23, 2026
c0a1faf
docs(brief): record S5/G8 quater, the caches, the tag split and (A)
guysenpai Sep 23, 2026
958c24b
docs(brief): record the cold smoke and slice runs of G8 quater
guysenpai Sep 24, 2026
bb81929
docs(brief): record the M1.D.16 measurement before the tool
guysenpai Sep 24, 2026
754fdee
chore(ci): probe whether the changes token can read check runs
guysenpai Sep 24, 2026
a92f45a
fix(ci): skip a run whose code was already verified green
guysenpai Sep 24, 2026
fb7be4b
docs(brief): record the ci_verdict tool and its measured cost
guysenpai Sep 24, 2026
4628db0
docs(brief): record the first inherited verdict
guysenpai Sep 24, 2026
5299f1d
docs(brief): record the chained inheritance of 4628db0e
guysenpai Sep 24, 2026
8a48478
fix(ci): save the zig caches from pull requests too
guysenpai Sep 24, 2026
0242916
docs(ci): state what the exclusion guard does not see
guysenpai Sep 24, 2026
f30a703
docs(brief): record geste 2 over two runs, the cap does not hold
guysenpai Sep 24, 2026
c412ac6
fix(ci): save the zig caches on push only again
guysenpai Sep 24, 2026
db27530
docs(brief): state what saving on push only costs before the run
guysenpai Sep 24, 2026
6b2dd27
docs(brief): record the run saving on push only, cold as stated
guysenpai Sep 24, 2026
a002369
fix(ci): give the bench smoke 30 minutes, enough for a cold run
guysenpai Sep 24, 2026
ae9ee61
docs: record the bench budget, its declarants and a shared hang
guysenpai Sep 24, 2026
9917af7
docs(brief): record the bench budget run and three windows hangs
guysenpai Sep 24, 2026
e526c72
fix(ci): week, size guard and one cache layer at every site
guysenpai Sep 24, 2026
cb8265f
docs(brief): record the cache rules applied at every site
guysenpai Sep 24, 2026
719f1ce
docs(brief): record M1.D.19 measured, the executables and the tail
guysenpai Sep 24, 2026
0dd5e3d
docs(brief): record the cache rules verified on the run
guysenpai Sep 25, 2026
afc5a47
fix(ci): raise the test timeout to 180 s against the spawn race
guysenpai Sep 25, 2026
f93260f
docs(brief): state the 180 s experiment and its prediction
guysenpai Sep 25, 2026
2996161
docs(brief): confirm the windows spawn race by the 180 s experiment
guysenpai Sep 25, 2026
46f484e
docs: drop the Codeberg limit from C1.10 and trim repeated records
guysenpai Sep 25, 2026
718a48f
fix(etch): keep nested field runs contiguous, refuse struct event fields
guysenpai Sep 25, 2026
6ee051c
fix(etch): refuse entity.get of a name that is not a component
guysenpai Sep 25, 2026
e5cd091
fix(etch): compare runtime strings by bytes, read resource enums typed
guysenpai Sep 25, 2026
d672584
fix(etch): compare a string match arm by bytes in the codegen
guysenpai Sep 25, 2026
076bcc5
docs(brief): record decisions 2 and 4, return decision 3
guysenpai Sep 25, 2026
2da27b5
fix(etch): keep a let type annotation when rendering a statement
guysenpai Sep 25, 2026
7001212
fix(etch): let entity.get reach a selectively imported component
guysenpai Sep 25, 2026
d236af9
fix(scene): refuse a resource or a divergent layout as an entity column
guysenpai Sep 25, 2026
bf37458
feat(etch): type-check extension hooks and requires, at source and cook
guysenpai Sep 25, 2026
533bb8c
docs(brief): record decision 3's source end, return its load end
guysenpai Sep 25, 2026
ff45cda
fix(etch): let the interpreter own its arena and parse each hook once
guysenpai Sep 26, 2026
8ae99d4
fix(scene): serialize an extension's requires, format 2 to 3
guysenpai Sep 26, 2026
2d5217f
feat(scene): check extension hooks at load against the loaded program
guysenpai Sep 26, 2026
81c9b8c
docs(brief): record the load end of decision 3
guysenpai Sep 26, 2026
760c10b
fix(etch): compare a cloned arena's lists by field, not padding bytes
guysenpai Sep 27, 2026
90512a8
docs(brief): record the clone test's padding red and its fix
guysenpai Sep 27, 2026
ef673b5
refactor(etch): remove the annotation map no code reads or writes
guysenpai Sep 27, 2026
9a492c6
fix(etch): refuse to run an interpreter moved after it bound its world
guysenpai Sep 27, 2026
75b4f39
fix(etch): keep a deferred extension refusal from ending the tick
guysenpai Sep 27, 2026
0dfd5d0
fix(etch): resolve a cook's imports as etch check resolves them
guysenpai Sep 27, 2026
9410c18
fix(etch): take the cook's names from etch check's own resolution
guysenpai Sep 27, 2026
c1ac179
test(scene): pin the alias a hook's text keeps to the last import
guysenpai Sep 27, 2026
2f736b6
docs(brief): record the four points found during the milestone
guysenpai Sep 27, 2026
7ca9ea5
test(platform): drop the win32 stress test's wall-clock bound
guysenpai Sep 27, 2026
fbafdcd
docs(brief): record M1.D.29 closed and its class left for arbitration
guysenpai Sep 27, 2026
2a14671
fix(etch): unbind an interpreter from its world when freed or replaced
guysenpai Sep 27, 2026
f5de61b
test(etch): fail the seam witnesses on a missing seam, not a panic
guysenpai Sep 27, 2026
f6d5a2b
docs(brief): record arbitration 1, the interpreter freed while bound
guysenpai Sep 27, 2026
06dc4a9
chore(build): give every test run a deadline, the TSan rerun included
guysenpai Sep 27, 2026
7831e0d
test: drop hang detectors that the runner's deadline replaces
guysenpai Sep 27, 2026
8951625
test(ipc): kill a child process that outlives a wide bound
guysenpai Sep 27, 2026
96910b8
test(render): make the shader reload test watch its own probe
guysenpai Sep 27, 2026
b96cd3c
test: move duration gates out of correctness tests into benches
guysenpai Sep 27, 2026
027b9b5
test(bench): fail the etch reload bench when a reload runs nothing
guysenpai Sep 27, 2026
525c47f
docs(brief): record the time-bound class swept under the new §13
guysenpai Sep 27, 2026
6fb9e53
chore: bring the sweep's comments under the comment rule
guysenpai Sep 27, 2026
48a4d79
fix(platform): report a child a signal killed as killed, not as exit 0
guysenpai Sep 27, 2026
8e4d1f3
test: synchronise the loader and thread tests on events, not time
guysenpai Sep 27, 2026
f6f8d72
test: bound the scheduler watchdog under the runner's 180 s deadline
guysenpai Sep 27, 2026
296f18f
test(platform): keep one sleepPrecise test, on its lower bound only
guysenpai Sep 27, 2026
d8fa1d1
docs(brief): record the seven points of the sweep, ruled and applied
guysenpai Sep 27, 2026
b359c5e
fix(etch): keep one stale structural command from dropping the flush
guysenpai Sep 27, 2026
087ea3a
docs(brief): record point 2 and the windows floor read from CI
guysenpai Sep 27, 2026
447961b
fix(etch): refuse an annotation on a const, alias, import or impl
guysenpai Sep 27, 2026
f427e90
fix(etch): cook a base prefab column the source does not name
guysenpai Sep 27, 2026
ca3f1e4
fix(etch): carry the cook's name and alias refusals into etch check
guysenpai Sep 27, 2026
7b41e8f
feat(etch): report E0858 on a construct in the wrong typed extension
guysenpai Sep 27, 2026
8e7e52e
docs(brief): record points 3 to 6 of the arbitrations
guysenpai Sep 27, 2026
cd4b033
fix(etch): refuse in the project cook what E0858 refuses
guysenpai Sep 27, 2026
b23882e
test(etch): move the cross-file scene and prefab fixtures to typed files
guysenpai Sep 27, 2026
b94a3dc
feat(etch): report E1799 on hooks or requires without extends
guysenpai Sep 27, 2026
7e2f4ec
fix(etch): refuse to cook an extends prefab without exactly one entity
guysenpai Sep 27, 2026
b7bb550
fix(etch): resolve an imported component, resource or event everywhere
guysenpai Sep 27, 2026
8b24eed
fix(etch): keep an event emitted at a tick boundary for the next tick
guysenpai Sep 27, 2026
90bd63a
fix(scene): refuse an extension hook that no interpreter would run
guysenpai Sep 27, 2026
31b63bb
docs(brief): record arbitrations 3 and 4 and five points of decision 3
guysenpai Sep 27, 2026
ddebe3d
fix(etch): refuse a throw outside a try and a timer in a hook as E1798
guysenpai Sep 28, 2026
e9e9e8a
feat(etch): report E0840 on a layer or manifest file
guysenpai Sep 28, 2026
c86ff40
docs(brief): record points 1 and 2 of decision 3 and E0840
guysenpai Sep 28, 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
111 changes: 95 additions & 16 deletions .github/workflows/bench.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,8 @@ name: Bench
on:
push:
branches: [main]
paths-ignore:
- '**.md'
- 'briefs/**'
- 'docs/**'
- 'LICENSE'
- '.gitignore'
pull_request:
branches: [main]
paths-ignore:
- '**.md'
- 'briefs/**'
- 'docs/**'
- 'LICENSE'
- '.gitignore'

concurrency:
group: bench-${{ github.ref }}
Expand All @@ -29,15 +17,56 @@ permissions:
env:
ZIG_VERSION: "0.16.0"
ZIG_CPU: "baseline"
ZIG_CACHE_CAP: "10737418240"

jobs:
changes:
runs-on: ubuntu-24.04
timeout-minutes: 5
permissions:
contents: read
checks: read
outputs:
code: ${{ steps.detect.outputs.code }}
reason: ${{ steps.detect.outputs.reason }}
week: ${{ steps.week.outputs.week }}
steps:
- name: Compute the lineage window
id: week
shell: bash
run: echo "week=$(date -u +%G-%V)" >> "$GITHUB_OUTPUT"

- uses: actions/checkout@v6
with:
fetch-depth: 0

- uses: weldengine/setup-zig@v0.1.0
with:
version: ${{ env.ZIG_VERSION }}
use-cache: false

- name: Decide whether this tree needs a run
id: detect
shell: bash
env:
GITHUB_TOKEN: ${{ github.token }}
EVENT: ${{ github.event_name }}
BASE: ${{ github.event.pull_request.base.sha }}
HEAD: ${{ github.event.pull_request.head.sha }}
run: |
set -euo pipefail
zig run tools/ci_verdict/main.zig -- decide --event "$EVENT" --base "$BASE" --head "$HEAD" \
--tested HEAD --repo "${{ github.repository }}" --check bench-gate >> "$GITHUB_OUTPUT"

bench-ecs-smoke:
needs: changes
if: needs.changes.outputs.code == 'true'
strategy:
fail-fast: false
matrix:
os: [ubuntu-24.04, windows-2025]
runs-on: ${{ matrix.os }}
timeout-minutes: 20
timeout-minutes: 30
steps:
- uses: actions/checkout@v6

Expand All @@ -50,12 +79,12 @@ jobs:
use-cache: false

- name: Restore Zig cache
uses: actions/cache@v5
uses: actions/cache/restore@v5
with:
path: .zig-cache
key: zig-v2-${{ github.job }}-${{ matrix.os }}-ReleaseSafe-${{ env.ZIG_CPU }}-${{ env.ZIG_VERSION }}-${{ hashFiles('build.zig.zon') }}
key: zig-v2-${{ needs.changes.outputs.week }}-${{ github.job }}-${{ matrix.os }}-ReleaseSafe-${{ env.ZIG_CPU }}-${{ env.ZIG_VERSION }}-${{ hashFiles('build.zig.zon') }}-${{ github.sha }}
restore-keys: |
zig-v2-${{ github.job }}-${{ matrix.os }}-ReleaseSafe-${{ env.ZIG_CPU }}-${{ env.ZIG_VERSION }}-
zig-v2-${{ needs.changes.outputs.week }}-${{ github.job }}-${{ matrix.os }}-ReleaseSafe-${{ env.ZIG_CPU }}-${{ env.ZIG_VERSION }}-${{ hashFiles('build.zig.zon') }}-

- name: zig build bench-ecs -- --smoke
run: zig build bench-ecs -Doptimize=ReleaseSafe -Dcpu=${{ env.ZIG_CPU }} -- --smoke
Expand All @@ -66,10 +95,60 @@ jobs:
- name: zig build bench-ecs-hybrid (crossover sweep)
run: zig build bench-ecs-hybrid -Doptimize=ReleaseSafe -Dcpu=${{ env.ZIG_CPU }}

- name: Measure the Zig cache before the save
if: always()
id: cache-size
shell: bash
run: |
set -euo pipefail
limit="$ZIG_CACHE_CAP"
bytes=$(du -sk .zig-cache 2>/dev/null | cut -f1 || echo 0)
bytes=$((bytes * 1024))
echo "zig cache: $bytes bytes (cap $limit)"
if [ "$bytes" -gt "$limit" ]; then
echo "::warning::Zig cache is $bytes bytes, over the $limit cap — SKIPPING the save."
echo "save=false" >> "$GITHUB_OUTPUT"
else
echo "save=true" >> "$GITHUB_OUTPUT"
fi

- name: Save Zig cache
if: always() && github.event_name == 'push' && steps.cache-size.outputs.save == 'true'
uses: actions/cache/save@v5
with:
path: .zig-cache
key: zig-v2-${{ needs.changes.outputs.week }}-${{ github.job }}-${{ matrix.os }}-ReleaseSafe-${{ env.ZIG_CPU }}-${{ env.ZIG_VERSION }}-${{ hashFiles('build.zig.zon') }}-${{ github.sha }}

- name: Archive the crossover measurement
uses: actions/upload-artifact@v6
with:
name: ecs-hybrid-crossover-${{ matrix.os }}
path: bench/results/ecs_hybrid_crossover.md
if-no-files-found: error
retention-days: 90

# The verdict `changes` inherits: green when the bench ran green or was skipped
# because the same code already was.
bench-gate:
needs: [changes, bench-ecs-smoke]
if: always()
runs-on: ubuntu-24.04
timeout-minutes: 5
steps:
- name: Aggregate the bench results
shell: bash
env:
REASON: ${{ needs.changes.outputs.reason }}
run: |
set -euo pipefail
changes="${{ needs.changes.result }}"
bench="${{ needs.bench-ecs-smoke.result }}"
echo "changes=$changes bench-ecs-smoke=$bench"
echo "::notice::$REASON"
if [ "$changes" != "success" ]; then
echo "::error::changes job did not succeed ($changes)"; exit 1
fi
case "$bench" in
success|skipped) : ;;
*) echo "::error::bench-ecs-smoke is $bench"; exit 1 ;;
esac
Loading
Loading