CI punch list + fuzzer OOM fix + documentation reconciliation - #60
Conversation
The pinned SHA was commented '# v3.28.1' but actually resolves to tag v4.37.1 upstream (verified via git ls-remote). Keep the working SHA, label it honestly. Also fix guix.scm licence: pmpl-1.0-or-later is not a Guix licence symbol and contradicts the MPL-2.0 normalisation (#45). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The scorecard reusable requests contents:read at workflow level; the caller's explicit job-level permissions block zeroed it out, so Actions rejected the file at parse time (startup_failure, zero jobs — invisible to gh pr checks). Same class as the Secret Scanner fix in #51. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
….104 Clears Cargo Audit red: RUSTSEC-2026-0204 (crossbeam-epoch invalid pointer deref in fmt::Pointer) and warning RUSTSEC-2026-0190 (anyhow unsound downcast_mut). cargo check --workspace passes locally. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The repo's documentation had drifted from what the code is. Every defect here came from copy-in rather than decay. Machine-facing: - 0-AI-MANIFEST.a2ml pointed agents at README.adoc, which has not existed since PR #47 converted it to Markdown — the agent entry point was dead. Rewritten to v1.1 with a correct primary pointer, explicit read-order, and the Guix-only invariant. - .machine_readable/6a2/STATE.a2ml advanced 2026-06-13 -> 2026-07-29: July milestones, open issues #43/#35/#20, plus new [repo-facts] and [ci-status] blocks recording measured counts and per-workflow state. Human-facing: - ARCHITECTURE.md was a generic template stub describing src/ tests/ config/ and README.adoc — a layout this repo does not have. Replaced with the real pipeline, directory table, resource economy (including Echo/Landauer), metadata contract, and an honest known-gaps list. - QUICK_STATUS.md and TOOLCHAIN_STATUS.md: refreshed headers plus a currency note that the 2026-02 tables predate Echo and undercount the workspace (53 members, not 25 crates). - .claude/CLAUDE.md: read-this-first block with current CI state, the moved checkout path, and the gh-pr-checks trap; corrected packaging policy, which still listed Nix as a fallback despite the Guix-only ruling of 2026-05-18. - README.md: licence badge alt-text said PMPL-1.0 while the badge image said MPL-2.0; added an Architecture quick link. Verified: cargo check --workspace passes; counts measured by inspection. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
ClusterFuzzLite reported a reproducible out-of-memory in fuzz_main (artifact oom-abc6a1849ffcc4d85f6f3524b146f4f1bc471edc). It is not really an OOM: the recursive-descent parser descends the native stack, so deeply nested input aborts the process with 'fatal runtime error: stack overflow', which libFuzzer reports as an OOM. About 1000 nested parens — roughly 2 KB — was enough, far inside the target's 100 KB cap, so the fuzzer found it easily. Adds MAX_RECURSION_DEPTH with a with_recursion_guard() helper that restores depth on every exit path, applied at the four recursive entry points: parse_expr_prec, parse_type, parse_block, and parse_block_inner. Exceeding it now yields a RecursionLimitExceeded parse error. The limit is 64, not a rounder larger number, because it must hold on the smallest stack the parser runs on. Rust spawns threads with 2 MiB by default and both the LSP and the test harness parse off the main thread; at roughly 8 KiB of debug-build stack per level, 256 still overflowed a 2 MiB thread while passing on the main thread's 8 MiB. 64 leaves about a 4x margin. Verified: - paren, type and brace nesting at depths 1k and 50k all survive on a 2 MiB thread; before the fix all three aborted at 1k. - all 108 .ecl files in the repo parse with zero depth-limit rejections, so the limit rejects no legitimate program. - cargo test -p eclexia-parser: 7/7 pass, including a new regression test covering expression nesting, type nesting, and the shallow case. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Note Automatic reviews are paused because your trial's included automatic processing has been used for this period. Upgrade now, or comment "Gitar review" to run a review anytime. Code Review
|
| Compact |
|
Was this helpful? React with 👍 / 👎 | Gitar
Signed-off-by: Jonathan D.A. Jewell <6759885+hyperpolymath@users.noreply.github.com>
Work from the 2026-07-29 session. Full narrative:
dev-notes/eclexia-sitrep-2026-07-27.md.1. Parser recursion limit — fixes the ClusterFuzzLite red
ClusterFuzzLite has been red on a reproducible finding (artifact
oom-abc6a184…). It is not really an OOM: the recursive-descent parser descends the native stack, so deeply nested input aborts the process withfatal runtime error: stack overflow, which libFuzzer reports as an OOM. About 1000 nested parens — roughly 2 KB — was enough, far inside the target's 100 KB cap.Adds
MAX_RECURSION_DEPTH+with_recursion_guard()at the four recursive entry points (parse_expr_prec,parse_type,parse_block,parse_block_inner), returning aRecursionLimitExceedederror instead of dying.The limit is 64 because it must hold on the smallest stack the parser runs on: Rust spawns threads with 2 MiB by default and both the LSP and the test harness parse off the main thread. At ~8 KiB of debug stack per level, 256 still overflowed a 2 MiB thread while passing on the main thread's 8 MiB — a discrepancy worth knowing about.
Verified: paren/type/brace nesting at 1k and 50k all survive on a 2 MiB thread (all three aborted at 1k before); all 108
.eclfiles in the repo parse with zero depth-limit rejections;cargo test -p eclexia-parser7/7 including a new regression test.2. Scorecards
startup_failureThe reusable declares
contents: readat workflow level; our caller's job-levelpermissions:block replaced rather than extended it, so Actions rejected the file at parse time. Parse rejection produces no check run at all, which is whygh pr checksshowed nothing — usegh run list --json conclusion. Same root cause as #51.3. Cargo Audit
RUSTSEC-2026-0204 (
crossbeam-epoch0.9.18 → 0.9.20) and warning-only RUSTSEC-2026-0190 (anyhow1.0.101 → 1.0.104).4. CodeQL pin label
SHA
7188fc36was commented# v3.28.1;git ls-remoteresolves it to tag v4.37.1. The SHA works, so this was green and invisible. SHA kept, comment corrected. Supersedes local commit3a140ae, which relabelled it to the equally-wrong# v3— do not push that commit.5. Documentation, human and machine
Every defect here was copy-in, not decay:
0-AI-MANIFEST.a2mlpointed agents atREADME.adoc, gone since docs(readme): convert README.adoc -> Markdown (renders on Glama/profile/community-health) #47 converted it to Markdown — the agent entry point was dead. Now v1.1 with a correct pointer and explicit read-order.ARCHITECTURE.mdwas a generic template stub describingsrc/ tests/ config/, a layout this repo does not have. Replaced with the real pipeline, directory table, resource economy (incl. Echo/Landauer), and an honest gaps list.STATE.a2mladvanced June → July, with new[repo-facts]and[ci-status]blocks.QUICK_STATUS.md,TOOLCHAIN_STATUS.md,.claude/CLAUDE.md: currency notes rather than fake rewrites — the 2026-02 tables are accurate as descriptions but predate Echo and undercount the workspace (53 members, not 25 crates)..claude/CLAUDE.mdalso still listed Nix as a packaging fallback despite the Guix-only ruling of 2026-05-18.README.md: licence badge alt-text saidPMPL-1.0while its own image said MPL-2.0.🤖 Generated with Claude Code