Skip to content

docs: record issue #610 Phase 1 open-issue inventory & classification - #613

Merged
logbie merged 2 commits into
mainfrom
claude/issue-610-phase-1-inventory-h9yt8d
Jul 13, 2026
Merged

docs: record issue #610 Phase 1 open-issue inventory & classification#613
logbie merged 2 commits into
mainfrom
claude/issue-610-phase-1-inventory-h9yt8d

Conversation

@logbie

@logbie logbie commented Jul 13, 2026

Copy link
Copy Markdown
Collaborator

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.

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


Open in Devin Review

Summary by CodeRabbit

  • Documentation
    • Added an Issue #610 Phase 1 inventory documenting verified fixes, remaining tracked issues, severity classifications, and exit-gate status.
    • Added an evidence-based baseline scorecard covering correctness, security, reliability, testing, compatibility, operations, documentation, and maintenance.
    • Documented key gaps and priorities for reaching the target score.

claude added 2 commits July 13, 2026 04:14
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
Copilot AI review requested due to automatic review settings July 13, 2026 04:55
@coderabbitai

coderabbitai Bot commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

Adds two Phase 1 Issue #610 dev-diary documents: one inventories and verifies open issues, while the other records a weighted quality baseline, calculation, and prioritized gaps. Both document-only changes state that runtime and language behavior are unchanged.

Changes

Issue 610 Phase 1

Layer / File(s) Summary
Issue inventory and release-gate assessment
Dev diary/2026-07-13-issue-610-phase-1-inventory.md
Documents the triage method, verified-fixed issues, remaining classifications, severity legend, exit-gate status, and compatibility impact.
Weighted scorecard baseline
Dev diary/2026-07-13-issue-610-phase-1-scorecard-baseline.md
Records weighted area scores, the ~5.8/10 calculation, prioritized gaps toward 8.0, and monthly reassessment plans.

Estimated code review effort: 1 (Trivial) | ~5 minutes

Possibly related issues

  • #610 — The documents directly record the Phase 1 issue inventory, readiness status, and scorecard requested by the tracker.

Suggested reviewers: copilot

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main documentation change: Phase 1 issue #610 inventory and classification updates.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/issue-610-phase-1-inventory-h9yt8d

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Devin Review: No Issues Found

Devin Review analyzed this PR and found no bugs or issues to report.

Open in Devin Review

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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. |

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

📥 Commits

Reviewing files that changed from the base of the PR and between fc21f2f and 473ba98.

📒 Files selected for processing (2)
  • Dev diary/2026-07-13-issue-610-phase-1-inventory.md
  • Dev diary/2026-07-13-issue-610-phase-1-scorecard-baseline.md

Comment on lines +16 to +17
**Measured against:** WFL **26.7.36** (`fc21f2f`), Linux, `cargo build --release`
+ `cargo test --all`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 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
done

Repository: 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

Comment on lines +21 to +30
| 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). |

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 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.

Comment on lines +35 to +45
```
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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 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

@logbie
logbie merged commit 7fdc32d into main Jul 13, 2026
21 checks passed
@logbie
logbie deleted the claude/issue-610-phase-1-inventory-h9yt8d branch July 13, 2026 05:06
logbie pushed a commit that referenced this pull request Jul 13, 2026
…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
logbie added a commit that referenced this pull request Jul 13, 2026
* 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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants