docs: record issue #610 Phase 1 open-issue inventory & classification - #613
Conversation
Complete the first Phase 1 task of the production-readiness tracker (#610): inventory all open issues and classify them (critical/high/medium/low/ post-production-readiness). Every "fixed" verdict was verified by running the issue's own minimal reproduction against a fresh release build (WFL 26.7.36, fc21f2f, Linux), not inferred from commit messages. - Closed 10 verified-fixed issues: #557, #566, #567, #569, #571, #580, #582, #583, #588, #590 (each with a repro-backed closing comment). - Classified the 6 remaining open issues: #592/#578 (High), #555/#573 (Medium), #600 (post-production-readiness), #612 (Low). - Checked off the Phase 1 inventory item on #610 and posted the summary. Docs/tracker hygiene only; no code, runtime, or language behavior changed. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JiMz3Ws32vEacvEYVG9B4i
Complete the second Phase 1 task of the production-readiness tracker (#610): record initial scorecard values with links to evidence. Baseline weighted score ~5.8/10 (target >= 8.0), measured against WFL 26.7.36 (fc21f2f) with cargo build --release + cargo test --all (1477 passed / 0 failed / 16 ignored, 94 suites). Per-area scores are evidence-backed: Correctness 6.0, Security 5.5, Reliability 5.0, Testing 6.5, Compatibility 6.0, Operations 5.0, Documentation 5.0, Maintenance 7.0. The score-history table and the scorecard checkbox on #610 were updated, and a detailed rationale comment was posted on the issue. Docs/tracker hygiene only; no code, runtime, or language behavior changed. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JiMz3Ws32vEacvEYVG9B4i
📝 WalkthroughWalkthroughAdds two Phase 1 Issue ChangesIssue 610 Phase 1
Estimated code review effort: 1 (Trivial) | ~5 minutes Possibly related issues
Suggested reviewers: 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Pull request overview
Adds Phase 1 production-readiness tracking documentation for issue #610 by recording (1) an open-issue inventory with severity classification and (2) an initial weighted scorecard baseline for WFL 26.7.36.
Changes:
- Added a Dev Diary entry that inventories open issues, closes verified-fixed ones, and classifies remaining issues by severity.
- Added a Dev Diary entry that establishes the initial #610 scorecard baseline with evidence references and weighted math.
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.
| File | Description |
|---|---|
| Dev diary/2026-07-13-issue-610-phase-1-scorecard-baseline.md | Records the initial weighted production-readiness scorecard baseline and rationale/evidence. |
| Dev diary/2026-07-13-issue-610-phase-1-inventory.md | Records Phase 1 open-issue inventory, verified-fixed closures, and severity classification for remaining issues. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| |---|---|---|---| | ||
| | #592 | Zero-arg include-exposed action by bare name is fatal | **High** | Fatal (`exit 3`, `Variable 'greet' is not defined`) on valid natural multi-file API; the third call form #580/#581's fix did not cover. Repro still fails on 26.7.36. | | ||
| | #578 | Remaining #571 rough edges (glob, pattern-VM, text→number, inference) | **High** | Confirmed functional bugs (wrong result/crash, not doc drift). Verified `list files … with pattern "*.txt"` still returns `0` on 26.7.36. | | ||
| | #555 | Aspirational skipped tests + broken keyword_reference docs examples | **Medium** | Core websockets landed (#593), but session/CSRF/cookie middleware, direct-index syntax, and 10 docs examples remain; 3 `CI-SKIP` TestPrograms still present. Docs-examples-in-CI is a mandatory release gate. Feature parts are effectively post-production. | |
| | Correctness | 25% | 6.0 | 1.50 | `cargo test --all`: **1477 passed / 0 failed / 16 ignored** (94 suites). Open-issue inventory: **0 open critical**, **2 open high** correctness defects (#592, #578); 10 correctness defects fixed and repro-verified this cycle (#557/#566/#567/#569/#571/#580/#582/#583/#588/#590). Runtime is correct even where former static diagnostics were wrong (those false positives are now fixed). Held below 8 by the two open high defects and the absence of a formal parser/analyzer/type-checker/runtime **consistency suite** (a mandatory gate). | | ||
| | Security | 20% | 5.5 | 1.10 | Shared **ExecutionBudget complete and integrated** (`src/exec/budget.rs`, PR #609) across lexer/parser/analyzer/pattern-VM/web/module loading. Recent hardening: subprocess policy (#608), Phase 0 concurrency (#607), password KDFs (#594), auth/session crypto + RNG lint (#595). `SECURITY.md`: private reporting + 48h SLA. **Gaps:** Dependabot reports **5 dependency alerts (1 high, 1 moderate, 3 low)** on the default branch; adversarial limit tests, supply-chain audit policy, and the security re-audit are all Phase 3. | | ||
| | Reliability | 15% | 5.0 | 0.75 | ExecutionBudget provides ceilings for wall-clock, ops, recursion, import depth, pattern transitions/states, source size, HTTP body, and WebSocket capacity — so uncontrolled hangs/exhaustion are mitigated **by design**. CI asserts `panic=abort` is rejected (unwinding preserved). **Gaps:** no fuzzing exists; no adversarial/boundary tests per limit; panic/crash/hang classification not started (all Phase 3). Fail-safe behavior is engineered but not yet *demonstrated* under adversarial load. | | ||
| | Testing | 15% | 6.5 | 0.975 | **1477 unit/integration tests pass.** `.github/workflows/ci.yml`: cross-platform integration matrix (**ubuntu + windows**), live **PostgreSQL + MariaDB** DB tests, and WFL-program runs on both OSes; `nightly.yml` runs a **Windows installer smoke test**. 71 `tests/*.rs`, ~129 top-level TestPrograms. **Gaps:** no sustained fuzzing; docs examples not executed in CI; **32 `CI-SKIP` programs** without a per-skip justification record. | |
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@Dev` diary/2026-07-13-issue-610-phase-1-scorecard-baseline.md:
- Around line 35-45: Specify the fenced-block language for the weighted-math
block in the scorecard by adding an appropriate non-code language identifier,
such as text, to the opening fence while preserving its contents.
- Around line 21-30: Update the scorecard evidence cells in the table around the
Correctness, Security, Reliability, Testing, Compatibility, Operations,
Documentation, and Maintenance rows to link every cited workflow, file, issue,
PR, and test artifact. Use repository-relative links for files/workflows and the
appropriate issue or pull-request URLs for identifiers, ensuring each claim
remains independently verifiable without changing the scores or rationale.
- Around line 16-17: Update the “Measured against” baseline entry in the
scorecard document to include results for the required cargo fmt check and cargo
clippy command, alongside the existing build and test results. Preserve the
existing version, commit, platform, and command formatting.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 35fe7477-8b8a-4b53-89ee-c2c0cfb73d15
📒 Files selected for processing (2)
Dev diary/2026-07-13-issue-610-phase-1-inventory.mdDev diary/2026-07-13-issue-610-phase-1-scorecard-baseline.md
| **Measured against:** WFL **26.7.36** (`fc21f2f`), Linux, `cargo build --release` | ||
| + `cargo test --all`. |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
printf '\n== Relevant files ==\n'
git ls-files | rg '^(GOVERNANCE\.md|CODE_OF_CONDUCT\.md|AI_POLICY\.md|CONTRIBUTING\.md|SECURITY\.md|Dev diary/2026-07-13-issue-610-phase-1-scorecard-baseline\.md)$' || true
printf '\n== Target file excerpt ==\n'
cat -n 'Dev diary/2026-07-13-issue-610-phase-1-scorecard-baseline.md' | sed -n '1,120p'
printf '\n== Governance doc hits ==\n'
for f in GOVERNANCE.md CODE_OF_CONDUCT.md AI_POLICY.md CONTRIBUTING.md SECURITY.md; do
if [ -f "$f" ]; then
echo "--- $f ---"
rg -n "cargo fmt|clippy|test|quality gate|format|warnings denied|Conventional Commits|Dev Diary|maintainer|release|merge|security|zeroization|secret" "$f" || true
fi
doneRepository: WebFirstLanguage/wfl
Length of output: 14570
Add the missing fmt/clippy results to the baseline. Dev diary/2026-07-13-issue-610-phase-1-scorecard-baseline.md:16-17 currently records only cargo build --release and cargo test --all; the repo’s required gates also include cargo fmt --all -- --check and cargo clippy --all-targets --all-features -- -D warnings.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@Dev` diary/2026-07-13-issue-610-phase-1-scorecard-baseline.md around lines 16
- 17, Update the “Measured against” baseline entry in the scorecard document to
include results for the required cargo fmt check and cargo clippy command,
alongside the existing build and test results. Preserve the existing version,
commit, platform, and command formatting.
Source: Coding guidelines
| | Area | Weight | Score | Weighted | Evidence & rationale | | ||
| |---|---:|---:|---:|---| | ||
| | Correctness | 25% | 6.0 | 1.50 | `cargo test --all`: **1477 passed / 0 failed / 16 ignored** (94 suites). Open-issue inventory: **0 open critical**, **2 open high** correctness defects (#592, #578); 10 correctness defects fixed and repro-verified this cycle (#557/#566/#567/#569/#571/#580/#582/#583/#588/#590). Runtime is correct even where former static diagnostics were wrong (those false positives are now fixed). Held below 8 by the two open high defects and the absence of a formal parser/analyzer/type-checker/runtime **consistency suite** (a mandatory gate). | | ||
| | Security | 20% | 5.5 | 1.10 | Shared **ExecutionBudget complete and integrated** (`src/exec/budget.rs`, PR #609) across lexer/parser/analyzer/pattern-VM/web/module loading. Recent hardening: subprocess policy (#608), Phase 0 concurrency (#607), password KDFs (#594), auth/session crypto + RNG lint (#595). `SECURITY.md`: private reporting + 48h SLA. **Gaps:** Dependabot reports **5 dependency alerts (1 high, 1 moderate, 3 low)** on the default branch; adversarial limit tests, supply-chain audit policy, and the security re-audit are all Phase 3. | | ||
| | Reliability | 15% | 5.0 | 0.75 | ExecutionBudget provides ceilings for wall-clock, ops, recursion, import depth, pattern transitions/states, source size, HTTP body, and WebSocket capacity — so uncontrolled hangs/exhaustion are mitigated **by design**. CI asserts `panic=abort` is rejected (unwinding preserved). **Gaps:** no fuzzing exists; no adversarial/boundary tests per limit; panic/crash/hang classification not started (all Phase 3). Fail-safe behavior is engineered but not yet *demonstrated* under adversarial load. | | ||
| | Testing | 15% | 6.5 | 0.975 | **1477 unit/integration tests pass.** `.github/workflows/ci.yml`: cross-platform integration matrix (**ubuntu + windows**), live **PostgreSQL + MariaDB** DB tests, and WFL-program runs on both OSes; `nightly.yml` runs a **Windows installer smoke test**. 71 `tests/*.rs`, ~129 top-level TestPrograms. **Gaps:** no sustained fuzzing; docs examples not executed in CI; **32 `CI-SKIP` programs** without a per-skip justification record. | | ||
| | Compatibility | 10% | 6.0 | 0.60 | `GOVERNANCE.md` §3.1 "Backward compatibility is sacred" + §3.2 No-Unlearning invariant + §2.2 decision authority ("must satisfy backward-compatibility rules") — a **breaking-change policy exists**. Supported behavior is documented and exercised by TestPrograms. **Gaps:** no test suite tagged specifically as a compatibility guard; the supported-language specification is a Phase 4 deliverable; aspirational-syntax marking is still in progress (#571/#578). | | ||
| | Operations | 5% | 5.0 | 0.25 | `nightly.yml` builds a versioned **MSI via `cargo-wix`**, uploads artifacts, and **smoke-tests the installer**; `versioning.yml` automates version bumps; `Docs/02-getting-started/installation.md` documents install. **Gaps:** no **checksums** published for artifacts (artifacts "verifiable" gate unmet); no upgrade/rollback/known-limitations docs (Phase 4). | | ||
| | Documentation | 5% | 5.0 | 0.25 | Extensive `Docs/` (6 sections + reference/guides); validation tooling exists (`scripts/validate_docs_examples.py`, `scripts/test_docs_code_blocks.py`, `TestPrograms/docs_examples/_meta/manifest.json`). **Gap (mandatory gate):** docs examples are **not executed in any CI workflow** — the harness is local-only. "Supported examples execute in CI" is currently unmet. | | ||
| | Maintenance | 5% | 7.0 | 0.35 | Full governance suite at repo root: `GOVERNANCE.md` (roles, ownership, decision authority, release lifecycle §3.7), `SECURITY.md` (reporting + supported versions + SLA), `CONTRIBUTING.md`, `CODE_OF_CONDUCT.md`, `AI_POLICY.md`. **Gap:** **supported platforms / support boundaries are not explicitly documented** (separate open Phase 1 task). | |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Link the cited evidence.
The Phase 1 task asks for scorecard values “with links to evidence,” but the evidence column currently contains bare paths and issue/PR identifiers. Add links to the relevant workflows, files, issues, PRs, and test artifacts so each score can be independently verified.
🧰 Tools
🪛 LanguageTool
[uncategorized] ~26-~26: The official name of this software platform is spelled with a capital “H”.
Context: ...| 1477 unit/integration tests pass. .github/workflows/ci.yml: cross-platform integ...
(GITHUB)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@Dev` diary/2026-07-13-issue-610-phase-1-scorecard-baseline.md around lines 21
- 30, Update the scorecard evidence cells in the table around the Correctness,
Security, Reliability, Testing, Compatibility, Operations, Documentation, and
Maintenance rows to link every cited workflow, file, issue, PR, and test
artifact. Use repository-relative links for files/workflows and the appropriate
issue or pull-request URLs for identifiers, ensuring each claim remains
independently verifiable without changing the scores or rationale.
| ``` | ||
| Correctness 6.0 × 0.25 = 1.500 | ||
| Security 5.5 × 0.20 = 1.100 | ||
| Reliability 5.0 × 0.15 = 0.750 | ||
| Testing 6.5 × 0.15 = 0.975 | ||
| Compatibility 6.0 × 0.10 = 0.600 | ||
| Operations 5.0 × 0.05 = 0.250 | ||
| Documentation 5.0 × 0.05 = 0.250 | ||
| Maintenance 7.0 × 0.05 = 0.350 | ||
| ------ | ||
| Weighted total = 5.775 ≈ 5.8 / 10 |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Specify the fenced-block language.
Markdownlint reports MD040 for the weighted-math fence. Use a language such as text for this non-code block.
🧰 Tools
🪛 markdownlint-cli2 (0.22.1)
[warning] 35-35: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@Dev` diary/2026-07-13-issue-610-phase-1-scorecard-baseline.md around lines 35
- 45, Specify the fenced-block language for the weighted-math block in the
scorecard by adding an appropriate non-code language identifier, such as text,
to the opening fence while preserving its contents.
Source: Linters/SAST tools
…base fixups Re-applies the `time::format_description::parse` → `parse_borrowed::<2>` deprecation fix (dropped during the rebase onto main) and addresses the maintainer's request-changes review on #614: Correctness / tests (tests/phase1_correctness_regression_test.rs): - #592 now parameterized across top-level AND action-body (both verified fatal), so a half-fix can't turn it green. - #578: added a verified `format_date` friendly-pattern reproducer; tightened the pattern (exit-status) and Number+Text (non-zero-exit) assertions so they can't false-pass; harness gains a 30s watchdog + drained pipes so a looping regression can't consume the job timeout. - #571 now tests both `divided by` and the `/` symbol as division. - Honestly reframed #578 as an umbrella issue (representative, not exhaustive); noted its nested-`for each` crash did not reproduce and `ends with` is fixed. - Corrected bookkeeping: execution_budget_test has 32 tests (not 33); coverage map header clarified (16 tracked issues + the #610 tracker). Fuzz: - fuzz_module_loading broadened to the real static loading path: checked lex → parse → include/load-module detection → analyze → type-check, with honest scope (no async/FS resolution). - fuzz_pattern now fuzzes pattern/haystack pairs (ReDoS needs both sides). - Committed the standalone fuzz/Cargo.lock; fixed README seed/`-timeout` commands; added a `fuzz-check` CI job so API drift can't silently break the excluded fuzz crate. Docs honesty: - supported-platforms.md: added a per-platform PR-CI coverage table; corrected that the full test suite is Linux-only, the installer test is nightly/ post-merge, MSRV 1.88 is declared-not-tested, docs-in-CI is unmet, and PR CI publishes no artifacts. - SECURITY.md: footer → 26.7.37; corrected "no cryptographic functions" and the `max_nesting_depth`-as-recursion-defense claims; noted ExecutionBudget. - containment diary: replaced the mislabeled "CI-measured on fc21f2f" baseline with a real local `cargo test --all` methodology (DB suites skip when env absent); corrected the run_web_tests coverage claim (no workflow invokes it). Rebased onto current main; kept #613's canonical inventory/scorecard diaries. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016egRFdqLHCiAttAGQMoFZw
* test: Phase 1 baseline & containment for #610 Executes the remaining Phase 1 (baseline & containment) tasks of the production-readiness tracker (#610). Production-readiness area: Reliability, Testing, Correctness, Maintenance Tracked issue/risk: #610 Phase 1; defects #569 #571 #592 #578 Gate improved: regression corpus; fuzz targets; supported-platform docs - Regression suite (tests/phase1_correctness_regression_test.rs): the single auditable index of every inventoried correctness defect. Passing guards for fixed defects (#569 action-return-type inference; #571 precedence/division/ modulo/between) and #[ignore]d reproducers for the open ones (#592 bare zero-arg included action; five confirmed #578 bugs) that flip green when Phase 2 fixes land. Also documents that #578's `ends with` misparse no longer reproduces on 26.7.36. - Fuzz targets (fuzz/): standalone cargo-fuzz workspace with fuzz_lexer, fuzz_parser, fuzz_pattern, and fuzz_module_loading, tracked seeds, and a README. Kept out of the stable root build via its own [workspace] and root `exclude = ["fuzz"]`. Type-checks cleanly against the API on stable; the sustained run + corpus retention is Phase 3. - Supported platforms (Docs/reference/supported-platforms.md): three-tier model grounded in the CI matrix (Tier 1 Linux/Windows x86_64; Tier 2 macOS/musl; 32-bit unsupported), toolchain (stable, MSRV 1.88, edition 2024), runtime requirements, and support boundaries. Linked from Docs/README.md and SECURITY.md; refreshed the stale SECURITY.md version-support row to 26.7.x. - Baseline metrics + ExecutionBudget verification + issue inventory/scorecard evidence recorded in three Dev diary entries. Evidence: new regression tests (2 pass, 6 ignored repros verified failing under --ignored); `cargo check --manifest-path fuzz/Cargo.toml` green; `cargo metadata` validates the workspace. Regression protection: every known correctness defect now has an end-to-end test (passing guard if fixed, ignored reproducer if open). Compatibility impact: none (tests, docs, and an excluded fuzz workspace only). Resource impact: none on the shipped runtime. Remaining work: Phase 2 fixes flip the ignored tests green; sustained fuzz run, docs-in-CI, coverage instrumentation, and the consistency suite are tracked. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016egRFdqLHCiAttAGQMoFZw * fix: address PR #614 review — honesty corrections, wider coverage, rebase fixups Re-applies the `time::format_description::parse` → `parse_borrowed::<2>` deprecation fix (dropped during the rebase onto main) and addresses the maintainer's request-changes review on #614: Correctness / tests (tests/phase1_correctness_regression_test.rs): - #592 now parameterized across top-level AND action-body (both verified fatal), so a half-fix can't turn it green. - #578: added a verified `format_date` friendly-pattern reproducer; tightened the pattern (exit-status) and Number+Text (non-zero-exit) assertions so they can't false-pass; harness gains a 30s watchdog + drained pipes so a looping regression can't consume the job timeout. - #571 now tests both `divided by` and the `/` symbol as division. - Honestly reframed #578 as an umbrella issue (representative, not exhaustive); noted its nested-`for each` crash did not reproduce and `ends with` is fixed. - Corrected bookkeeping: execution_budget_test has 32 tests (not 33); coverage map header clarified (16 tracked issues + the #610 tracker). Fuzz: - fuzz_module_loading broadened to the real static loading path: checked lex → parse → include/load-module detection → analyze → type-check, with honest scope (no async/FS resolution). - fuzz_pattern now fuzzes pattern/haystack pairs (ReDoS needs both sides). - Committed the standalone fuzz/Cargo.lock; fixed README seed/`-timeout` commands; added a `fuzz-check` CI job so API drift can't silently break the excluded fuzz crate. Docs honesty: - supported-platforms.md: added a per-platform PR-CI coverage table; corrected that the full test suite is Linux-only, the installer test is nightly/ post-merge, MSRV 1.88 is declared-not-tested, docs-in-CI is unmet, and PR CI publishes no artifacts. - SECURITY.md: footer → 26.7.37; corrected "no cryptographic functions" and the `max_nesting_depth`-as-recursion-defense claims; noted ExecutionBudget. - containment diary: replaced the mislabeled "CI-measured on fc21f2f" baseline with a real local `cargo test --all` methodology (DB suites skip when env absent); corrected the run_web_tests coverage claim (no workflow invokes it). Rebased onto current main; kept #613's canonical inventory/scorecard diaries. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016egRFdqLHCiAttAGQMoFZw * chore: apply PR #614 automated-review nits (Copilot + CodeRabbit) - supported-platforms.md: rename the "integration-test scripts" lane to "Rust integration tests (cargo test --test '*')" — CI runs Rust integration tests, not external scripts (Copilot). - ci.yml fuzz-check: add `needs: fmt` (consistency with every other job) and `persist-credentials: false` on checkout (zizmor artipacked; the job only runs `cargo check` and needs no write creds) (Copilot + CodeRabbit). - fuzz/Cargo.toml: edition 2021 → 2024 to match the workspace and surface edition-specific breakages in the fuzz crate (Copilot). Verified it still type-checks under 2024. - fuzz/README.md: add a `text` language tag to the layout fenced block (markdownlint MD040) (CodeRabbit). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016egRFdqLHCiAttAGQMoFZw * fix: address PR #614 round-2 blockers (honesty, fuzz scope, CI workspace) Blocker 1 — resolve the "every vs representative" correctness-gate contradiction: - Reword the completion claim to per-issue coverage with an explicit, representative (not exhaustive) #578 sample; scope the "reproduces every open defect" line to defects encoded in this file. - Add a CLI-level end-to-end #590 guard (complements the in-process test the review noted), and a `with`-form-concat #578 reproducer (still reproduces). - Correct #573 to FIXED: binary read/write + MIME shipped in #574 with byte round-trip tests; the issue's own latest verification recommends closing. - Re-verified with the release binary: #578's `add`-to-List<Any> test-mode drop and `double of 5 minus 1` inference items no longer reproduce (fixed), so they are not encoded — documented as such. Blocker 2 — fuzz_module_loading did not fuzz module loading: - Rename it to `fuzz_frontend` (it fuzzes the static frontend: checked lex → parse → analyze → type-check). Mark the module-loading fuzz surface as an explicitly OPEN Phase 1 item (safe async loader harness is non-trivial — executing fuzzer WFL would also spawn subprocesses/network/web/file writes). Diary/exit-gate now say three-of-four surfaces covered, not four. Blocker 3 — CI could not provide the "authoritative full-suite aggregate": - ci.yml "Run Tests" now runs `cargo test --workspace` (was root-package-only, which skipped wflpkg's 204 tests). Record the observed scope-labeled head-SHA numbers (root 1206/0/24 across 76 suites, wfl-lsp 69, wflpkg 204) and note the authoritative combined aggregate now comes from the --workspace CI run. Verified: suite 3 passed / 9 ignored; all 9 ignored reproduce under --ignored; fmt + clippy -D warnings clean; fuzz crate type-checks after the rename. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016egRFdqLHCiAttAGQMoFZw * chore: apply PR #614 Copilot review nits (test markers, docs) - #590 CLI guard: assert the exact labeled marker `VAL=0` (was `contains('0')`, which could match unrelated output) — program now prints `display "VAL=" with …`. - #592 action-body reproducer: invoke run_it with an explicit `call` (was a bare `display run_it`) so the test stays focused on included-action name resolution and doesn't depend on top-level bare-call semantics. Still reproduces (exit 3). - fuzz/README: add a naming note that the frontend target was renamed from `fuzz_module_loading` → `fuzz_frontend` (for readers cross-referencing older PR text). Declined (incorrect): Copilot flagged `cargo test --test '*'` in the platform doc as invalid — it is a valid cargo glob and the exact command `ci.yml` runs (line 165), so the doc accurately mirrors CI; left unchanged. Verified: suite 3 passed / 9 ignored; all 9 ignored reproduce; fmt + clippy clean. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016egRFdqLHCiAttAGQMoFZw * chore: apply PR #614 Copilot nits — doc link + drop redundant LSP test step - supported-platforms.md: make the macOS row's `installation.md` reference a proper relative link (`../02-getting-started/installation.md`). - ci.yml: remove the now-redundant `Run LSP Tests` step — `cargo test --workspace` (added earlier in this PR) already runs wfl-lsp's tests, so the separate `cargo test -p wfl-lsp` only duplicated them. Kept the explicit `Build LSP` step as a focused Send/Sync build gate. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016egRFdqLHCiAttAGQMoFZw * chore: apply PR #614 Copilot nits (fuzz perf, exact clippy cmd, robust count) - fuzz_frontend: drop the redundant `Analyzer::analyze` call — `check_types` already runs the analyzer internally (analyzer_already_run == false), so the separate call double-analyzed each input and halved fuzz throughput. One `check_types` call still exercises both analysis and type checking. - containment diary: record the exact CI clippy gate `cargo clippy --all-targets -- -D warnings` (dropped the stray `--all-features` that CI does not pass). - #578 repeat test: count lines equal to `hi` instead of substring `matches("hi")`, so a diagnostic containing "this"/"which" can't inflate it. Verified: fuzz crate type-checks; suite 3 passed / 9 ignored; the repeat reproducer still fails under --ignored with the robust count; fmt + clippy clean. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016egRFdqLHCiAttAGQMoFZw * docs: correct wfl_exe() comment re test profile (PR #614 Copilot nit) CI's test job runs `cargo test --workspace` (debug), not `--release`, so the prior comment claiming the integration suite runs under `--release` was misleading about which profile `CARGO_BIN_EXE_wfl` points to. Reword to state it matches the test's own compile profile (debug by default / under --workspace; release only under `cargo test --release`). (The #571 slash-division coverage the codex bot flagged is already present — `store c as 10 / 4` with a `C=2.5` assertion — added in an earlier commit.) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016egRFdqLHCiAttAGQMoFZw * chore: enforce committed fuzz lockfile with --locked; clarify fuzz run cwd PR #614 Copilot nits: - ci.yml fuzz-check + fuzz/README type-check: use `cargo check --locked --manifest-path fuzz/Cargo.toml` so dependency-resolution drift fails the job instead of silently regenerating the committed fuzz/Cargo.lock. Verified `--locked` passes against the current lockfile. - fuzz/README: state that the fuzz commands are run from the repository root (`cargo fuzz` locates `fuzz/` automatically; the seeding commands use repo-root-relative `fuzz/…` paths), resolving the "which manifest?" ambiguity. Note: the codex bot's "#571 slash division" thread keeps re-surfacing because its line moved, but the `/` case is already covered (`store c as 10 / 4` → `C=2.5`). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016egRFdqLHCiAttAGQMoFZw * docs: align Phase 1 record with honest partial state + measured CI baseline (#614) Round-3 maintainer blocker — reconcile the audit trail: - Containment §4: replace the derived/pending estimate with the MEASURED full-workspace run — CI run 29240959575 (`cargo test --workspace`): 1480 passed / 0 failed / 25 ignored across 95 result suites, with the workflow link. - Containment §2 + test-suite header: state plainly that "convert every known correctness defect" is PARTIAL (only #578's reproducible confirmed bugs are encoded; exhaustive #578 classification is open) — not a redefinition of "every defect" as "every issue". - Exit-gate: baseline now measured (not pending); the --workspace-aggregate follow-up is closed; module-loading fuzz + exhaustive #578 remain the open Phase 1 items. - Inventory diary: correct the #573 row — it was recorded open in error; #574 shipped binary serving + MIME before the inventory, so it is effectively fixed (5 tracked issues genuinely remain open, not 6). PR description and #610 checkbox reconciliation handled separately via the API. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016egRFdqLHCiAttAGQMoFZw * docs: make Phase 1 open-item count + #578 phase-ownership consistent (#614) Round-4 maintainer blocker — the sources disagreed on what's left in Phase 1. Reconciled to a single answer across tracker/PR/diary/test-header: - THREE open Phase 1 items (matching the three unchecked #610 boxes): (1) module-loading fuzz target; (2) exhaustive per-item #578 classification; (3) line-coverage baseline (not instrumented). The containment exit-gate now lists all three and no longer moves coverage to the Phase 2/3 hand-offs. - #578 phase ownership made consistent: classification / regression coverage of #578 is **Phase 1** work (part of "convert every known correctness defect"); *fixing* #578 is Phase 2. Fixed the test header line that called classification "Phase 2 scoping work". - §4 line-coverage row reframed as the open Phase 1 baseline-coverage item. PR description updated separately to say three items; #610 already shows three unchecked Phase 1 boxes. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016egRFdqLHCiAttAGQMoFZw * docs: reconcile inventory open-count with the #573 correction (#614) The summary total still read "6 tracked" while the #573 reclassification note + table say 5. Update line 28 to "~~6~~ 5 tracked" so the inventory is internally consistent (CodeRabbit nit). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016egRFdqLHCiAttAGQMoFZw * docs: clarify run_files output ordering (PR #614 Copilot nit) The helper concatenates stdout then stderr (`format!("{stdout}{stderr}")`); the doc comment said "merged stdout+stderr", which reads as time-interleaved. Clarify that both streams are captured in full but not interleaved by time. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016egRFdqLHCiAttAGQMoFZw * test: harden #578 exit-code assertions against timeout false-pass (PR #614) `code != Some(0)` also accepts a timeout kill (`code == None`), so a future interpreter hang would let these acceptance tests pass green. Require an explicit non-zero exit via `matches!(code, Some(c) if c != 0)` in the Number+Text and `with`-form #578 reproducers, so exit 0 AND a hang/timeout both fail (Copilot). Verified: suite 3 passed / 9 ignored; both hardened reproducers still fail under --ignored; fmt + clippy clean. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016egRFdqLHCiAttAGQMoFZw * fix: close #578 timeout false-pass + reconcile inventory arithmetic (PR #614) Two maintainer blockers on PR #614: - tests/phase1_correctness_regression_test.rs: the `with`-form #578 reproducer's success branch (`out.contains("42")`) ignored the exit code, so "prints 42 then hangs" (code == None) still went green. Pin the success branch to `code == Some(0)` and match an exact output line (`line.trim() == "42"`) so a timeout kill or a stray `42` in diagnostics can no longer pass. The failure branch already required a concrete non-zero exit. - Dev diary inventory: the totals could not reconcile (10 closed + 5 remaining + #610 = 16, not 17) and conflated two senses of "open". Replace the summary with an explicit reconciliation table: 10 verified-fixed-and-closed + 1 verified-fixed-but-open-pending-closure (#573) + 5 genuinely-unresolved = 16 tracked, + #610 = 17. "Open on GitHub" (6) vs "genuinely unresolved" (5) are now distinguished. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016egRFdqLHCiAttAGQMoFZw * test: drain harness output as bytes + from_utf8_lossy (PR #614) `run_files` drained child stdout/stderr with `read_to_string`, which returns an error and stops capturing if the program emits any non-UTF-8 byte — silently truncating the very output these regression assertions check. Drain as raw bytes via `read_to_end` and decode with `String::from_utf8_lossy` so non-UTF-8 becomes U+FFFD instead of dropping capture, matching the other integration tests' behavior. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016egRFdqLHCiAttAGQMoFZw * test: narrow #592 guard to the fatal diagnostic form (PR #614) The #592 reproducer asserted `!out.contains("is not defined")`, which would also false-fail on a benign non-fatal note (e.g. "This action is not defined in this file …") once the fix lands. Match only the fatal `Variable 'greet' is not defined` form the issue actually emits, so the guard flags the real defect and nothing else. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016egRFdqLHCiAttAGQMoFZw * docs: reclassify #600 as an open High security/release risk (PR #614) #600 was classified "post-production, not a release-gate blocker", but its native-TLS refactor is the vehicle for clearing open high-severity Dependabot alert #49 (rustls-webpki DoS via panic). The vulnerable chain is still live in Cargo.lock (warp 0.3.7 -> tokio-rustls 0.25.0 -> rustls 0.22.4 -> rustls-webpki 0.102.8) and warp pins it, so no in-line bump exists. That contradicts the mandatory no-open-high-severity-security release gate. Reclassify #600 as High (security) across all in-repo evidence and make the exit reads honest: - inventory diary: #600 row, severity legend (High now covers an open high-severity security advisory), and Phase 1 exit-gate read (the release gate stays open; this PR classifies, does not fix). - regression-index header (tests/...): #600 row. - containment diary exit-gate read: #600 added as a third open High. This PR classifies the risk; it does not implement the TLS rewrite. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016egRFdqLHCiAttAGQMoFZw * ci: gate bump-version on fuzz-check; test: policy-agnostic #578 reject (PR #614) - ci.yml: add `fuzz-check` to `bump-version.needs`. It was the only compile gate for the excluded fuzz workspace, but the write-capable bump-version job (documented "only after ALL checks pass") omitted it, so a push to main could tag a version while fuzz-check was red — and the bump commit carries [skip ci], so no corrective rerun follows. (Maintainer blocker.) - phase1 regression test: the #578 Number+Text reproducer required a non-zero exit to count as "rejected", but WFL type errors are non-fatal (a "Type checking warnings:" diagnostic, exit 0) — only ExecutionBudget breaches are fatal (src/main.rs). That baked in an exit-code policy the runtime doesn't use for type errors, so the reproducer could never flip green on a natural fix. Accept a non-zero exit OR an explicit type-checker diagnostic on a completed run; a timeout (code == None) still fails both branches. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016egRFdqLHCiAttAGQMoFZw * test: make the #610 regression harness hermetic against global config (PR #614) `run_files` spawned the wfl binary inheriting the ambient environment, so the child could read a machine-global `/etc/wfl/wfl.cfg` (or the legacy `/etc/wfl/.wflcfg` fallback) and silently change timeouts/limits/behavior, making the suite non-hermetic and flaky outside CI. Pin `WFL_GLOBAL_CONFIG_PATH` to an empty `NamedTempFile` for the child. The file must exist and be empty: per src/config.rs the loader falls back to the legacy `/etc/wfl/.wflcfg` when the configured path is missing, so a nonexistent path would not isolate it. The temp file lives outside the working dir (directory-listing reproducers can't see it) and stays in scope until after the child exits. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016egRFdqLHCiAttAGQMoFZw * ci: keep fuzz/Cargo.lock in sync during the auto version bump (PR #614) `fuzz/` is a separate workspace that path-depends on root `wfl`, so `fuzz/Cargo.lock` pins the root version too. `scripts/bump_version.py`'s `update_cargo_lock()` only refreshed the root lock and never staged `fuzz/Cargo.lock`, so every post-merge `--update-all` bump left the fuzz lock stale at the old version. Because the bump commit carries `[skip ci]`, the breakage surfaced only on the *next* PR, whose `cargo check --locked --manifest-path fuzz/Cargo.toml` (`fuzz-check`) would fail. Adding `fuzz-check` to `bump-version.needs` gates the pre-bump state but not the mutation the bump itself makes. Add `update_fuzz_cargo_lock()`: after the root lock is updated it runs `cargo update -p wfl --manifest-path fuzz/Cargo.toml`, verifies the fuzz lock now records the new version, runs the same `cargo check --locked` gate to prove the mutation is consistent before anything is committed/tagged, and stages `fuzz/Cargo.lock`. It's called from the `--update-all` path, so retry bumps (which re-run the whole script) are covered. Verified locally: the sync command re-pins a deliberately stale fuzz lock back to the root version. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016egRFdqLHCiAttAGQMoFZw * docs: correct #600 — vulnerable dep present but not reachable (PR #614) A source-level reachability re-review shows the earlier "#600 = High (security)" reclassification overreached: it treated the *presence* of `rustls-webpki` (Dependabot alert #49 / GHSA-82j2-j2ch-gfr8) in the dependency graph as WFL exploitability. The advisory's panic requires opt-in `RevocationOptions` AND attacker-controlled CRL bytes; default rustls configs are unaffected. WFL's only TLS setup is `warp::serve(routes).tls().cert_path().key_path()` (src/interpreter/mod.rs:6441) with client auth off and NO CRL / `RevocationOptions` anywhere (verified by grep), so the vulnerable path is not reachable. Re-disposition across the audit evidence: alert #49 = "vulnerable code not used"; #600 is the separate SNI / multi-cert enhancement (post-production), NOT a reachable High WFL defect, and its TLS rewrite is not established as required remediation. The literal no-open-high-severity-security policy gate may stay administratively open until #49 is formally triaged. Updated the inventory #600 row + severity legend (High now requires a *reachable* advisory, not mere presence) + exit-gate read, the containment exit-gate read, and the regression-index header row. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016egRFdqLHCiAttAGQMoFZw * test: separate stdout/stderr with a newline in the #610 harness (PR #614) `run_files` joined the captured stdout and stderr with no delimiter, so a `contains(...)` / exact-line assertion could false-match a substring that straddled the boundary (end of stdout + start of stderr). Insert a newline separator between the two captures. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016egRFdqLHCiAttAGQMoFZw * refactor: share the wfl-lock version regex in bump_version.py (PR #614) Extract `_extract_wfl_lock_version(lock_path)` and use it from both `update_cargo_lock` (root) and `update_fuzz_cargo_lock` (fuzz workspace), removing the duplicated `[[package]] name = "wfl"` parse so the two copies can't drift if the Cargo.lock format ever changes. Behaviour is unchanged: same regex, same "not found" hard-fail. (CodeRabbit nit.) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016egRFdqLHCiAttAGQMoFZw --------- Co-authored-by: Claude <noreply@anthropic.com>
Complete the first Phase 1 task of the production-readiness tracker (#610):
inventory all open issues and classify them (critical/high/medium/low/
post-production-readiness).
Every "fixed" verdict was verified by running the issue's own minimal
reproduction against a fresh release build (WFL 26.7.36, fc21f2f, Linux),
not inferred from commit messages.
ends with/starts withoperators are swallowed as multi-word identifiers at statement level #566, Typechecker: Any/Unknown values from list indexing and untyped parameters rejected by strict ERROR rules (false positives) #567, Type checker infers every user-defined action's return type asNothing, causing spurious "Expected Text but found Nothing" at call sites #569, Docs audit: natural-language constructs that read like valid WFL but don't work (precedence,/,finally,between, error binding) #571, #548 fix is incomplete:<action> of <args>to an include-exposed action is still context-dependently fatal (works inmain loop/tests, fatal at top level & in action bodies) #580,Function parameter is overridden by a same-named global variable #582, String value "[]" is coerced to an empty list #583, Type checker:
store x as <action call>raises ERROR "Could not infer type for variable" whenever the callee's return type is Unknown #588, Type checker: self-recursive action's result is typedNothinginside its own body (false "Cannot index into Nothing") #590 (each with a repro-backed closing comment).Variable '<name>' is not defined) — the call form #580's fix didn't cover #592/Follow-up to #571: remaining language/stdlib rough edges (inference, repeat N times, text→number, pattern-VM, filesystem glob, and more) #578 (High), Follow-up: implement features behind 4 skipped aspirational tests + fix 10 broken keyword_reference docs examples #555/Web server cannot serve binary content (fonts, images) — response body and file reads are text-only #573(Medium), Native TLS web server: support SNI / multiple certificates on a single :443 listener #600 (post-production-readiness), [Low priority] Make all PR #609 resource-budget policies overrideable through .wflcfg #612 (Low).
Docs/tracker hygiene only; no code, runtime, or language behavior changed.
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
Claude-Session: https://claude.ai/code/session_01JiMz3Ws32vEacvEYVG9B4i
Summary by CodeRabbit
#610Phase 1 inventory documenting verified fixes, remaining tracked issues, severity classifications, and exit-gate status.