[Lean Squad] feat(ci): Task 9 — FV docs validation workflow + updated REPORT.md - #7936

Merged
Amaury Levé (Evangelink) merged 3 commits into
mainfrom
lean-squad/task9-fv-docs-ci-2026-04-27-fcf8710c1c8b58c4
Apr 30, 2026
Merged

[Lean Squad] feat(ci): Task 9 — FV docs validation workflow + updated REPORT.md#7936
Amaury Levé (Evangelink) merged 3 commits into
mainfrom
lean-squad/task9-fv-docs-ci-2026-04-27-fcf8710c1c8b58c4

Conversation

@Evangelink

@EvangelinkAmaury Levé (Evangelink) commented Apr 29, 2026

Copy link
Copy Markdown
Member

Add .github/workflows/fv-docs-validation.yml: a CI workflow that validates
the structural integrity of formal-verification/ artifacts on every PR or
push that touches formal-verification/**.

Checks performed:

  • Required top-level FV docs present (RESEARCH.md, TARGETS.md,
    CORRESPONDENCE.md, CRITIQUE.md, REPORT.md)
  • Lean project files present (lakefile.toml, lean-toolchain, README.md)
  • lean-toolchain is non-empty and well-formed
  • 🔬 Lean Squad disclosure present in top-level docs
  • specs/ directory exists
  • Phase-2+ targets in TARGETS.md each have an informal spec in specs/
    (keyword-based matching handles CamelCase name decomposition)

Also update formal-verification/REPORT.md: add run history for the
2026-04-27 runs, expand target table with new targets, and document the
Lean toolchain blocker.

�� Lean Squad — automated formal verification agent
Run: https://github.com/microsoft/testfx/actions/runs/24986088168

Co-authored-by: Copilot 223556219+Copilot@users.noreply.github.com

Fixes#7861

Add .github/workflows/fv-docs-validation.yml: a CI workflow that validates
the structural integrity of formal-verification/ artifacts on every PR or
push that touches formal-verification/**.
Checks performed:
- Required top-level FV docs present (RESEARCH.md, TARGETS.md,
CORRESPONDENCE.md, CRITIQUE.md, REPORT.md)
- Lean project files present (lakefile.toml, lean-toolchain, README.md)
- lean-toolchain is non-empty and well-formed
- 🔬 Lean Squad disclosure present in top-level docs
- specs/ directory exists
- Phase-2+ targets in TARGETS.md each have an informal spec in specs/
(keyword-based matching handles CamelCase name decomposition)
Also update formal-verification/REPORT.md: add run history for the
2026-04-27 runs, expand target table with new targets, and document the
Lean toolchain blocker.
�� Lean Squad — automated formal verification agent
Run: https://github.com/microsoft/testfx/actions/runs/24986088168
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings April 29, 2026 16:27

CopilotAI 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 CI validation for the formal-verification/ artifact structure and updates FV reporting to reflect recent runs and current blockers, helping keep Lean Squad formal-verification documentation consistent over time.

Changes:

  • Introduce a GitHub Actions workflow that validates required FV docs, Lean project scaffolding, and basic TARGETS/specs consistency on PRs/pushes affecting formal-verification/**.
  • Update formal-verification/REPORT.md with refreshed status/summary and additional run history entries.
Show a summary per file
FileDescription
formal-verification/REPORT.mdUpdates FV status/summary text and adds 2026-04-27 run history entries.
.github/workflows/fv-docs-validation.ymlNew CI workflow to validate presence/shape of FV docs, Lean project files, and Phase-2+ informal spec alignment.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 3

Comment thread.github/workflows/fv-docs-validation.yml Outdated
Comment thread.github/workflows/fv-docs-validation.yml Outdated
Comment thread.github/workflows/fv-docs-validation.yml Outdated
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings April 30, 2026 07:19

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

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 3

Comment on lines +7 to 16
**Phase**: Early — Research expanded to 7 targets; informal specs extracted for `ArgumentArity` (merged) and `CommandLineParser.TryUnescape` (PR open). CI automation maturing. Lean toolchain blocked in CI runner; Task 3+ deferred.

## Summary

The Lean Squad has surveyed the `microsoft/testfx` codebase and identified **seven** high-quality FV targets. Two informal specifications have been extracted. The Lean toolchain cannot currently be installed in the runner environment due to network restrictions.
The Lean Squad has surveyed the `microsoft/testfx` codebase and identified **seven** high-quality FV targets in the command-line infrastructure and filter logic of Microsoft.Testing.Platform. All targets are pure or near-pure functions with clear algebraic properties, making them suitable for Lean 4 formal verification.

Key findings:
- **`ArgumentArity`**: informal spec extracted (14 properties, 4 groups). Constructor does not enforce `Min ≤ Max`; `CommandLineOption` enforces this on construction, acting as the real guard.
- **`ArgumentArity`**: informal spec extracted (14 properties, 4 groups). Constructor does not enforce `Min ≤ Max`; `CommandLineOption` enforces this on construction, acting as the real guard. Correspondence documented.
- **`CommandLineParser.TryUnescape`**: informal spec extracted (24 properties, 5 groups, 2 confirmed bugs for single-char quote inputs). PR open.
- **New targets identified**: `ResponseFileHelper.SplitCommandLine` (pure tokeniser) and `TreeNodeFilter.MatchFilterPattern` (Boolean algebra — ideal for structural induction proofs of De Morgan, double negation, idempotence).

CopilotAIApr 30, 2026

Copy link

Choose a reason for hiding this comment

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

The status/summary bullets appear out of date with the current FV artifacts: TARGETS.md lists several Phase-2 targets beyond just ArgumentArity and TryUnescape (e.g., ParseOptionAndSeparators, SplitCommandLine, TreeNodeFilter.MatchFilterPattern), and formal-verification/specs/ already contains additional *_informal.md files. Please update this section to reflect the actual set of extracted informal specs (or adjust phases elsewhere so the report is consistent).

Copilot uses AI. Check for mistakes.
Comment on lines +79 to +92
- name: Check FV 🔬 disclosure in top-level docs
run: |
FAILED=0
for doc in RESEARCH.md TARGETS.md CORRESPONDENCE.md CRITIQUE.md REPORT.md; do
if ! grep -q "🔬" "formal-verification/${doc}"; then
echo "::error file=formal-verification/${doc}::FV document missing 🔬 Lean Squad disclosure: ${doc}"
FAILED=1
else
echo "✅ formal-verification/${doc} has 🔬 disclosure"
fi
done
if [ "$FAILED" -ne 0 ]; then
exit 1
fi

CopilotAIApr 30, 2026

Copy link

Choose a reason for hiding this comment

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

This step fails the workflow if any required doc is missing the 🔬 disclosure marker, but the PR description/issue states the disclosure check should be warning-only (non-blocking). Consider emitting ::warning (and not exiting nonzero) so the workflow behavior matches the documented intent.

Copilot uses AI. Check for mistakes.
Comment on lines +62 to +71
TOOLCHAIN="$(tr -d '\r\n' < formal-verification/lean/lean-toolchain)"
if [ -z "$TOOLCHAIN" ]; then
echo "::error file=formal-verification/lean/lean-toolchain::lean-toolchain file is empty"
exit 1
fi

if [[ "$TOOLCHAIN" =~ [[:space:]] ]]; then
echo "::error file=formal-verification/lean/lean-toolchain::lean-toolchain must not contain whitespace"
exit 1
fi

CopilotAIApr 30, 2026

Copy link

Choose a reason for hiding this comment

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

The lean-toolchain validation strips all newlines (tr -d '\r\n'), so a malformed multi-line lean-toolchain file would be concatenated and could still pass the whitespace/regex checks. If the goal is to enforce a single well-formed toolchain spec, check that the file contains exactly one non-empty line (and fail if there are extra lines or trailing whitespace) before validating the pattern.

Copilot uses AI. Check for mistakes.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Summary

Workflow: Expert Code Reviewer
Date: 2026-04-30
Repository: microsoft/testfx

Key Findings

The two changed files are a new GitHub Actions workflow (.github/workflows/fv-docs-validation.yml) and a documentation update (formal-verification/REPORT.md). No production C# code is changed.

Correctness issues in the CI workflow — all in the final Python step:

  1. Missing spec check emits ::warning:: instead of ::error:: (Line 141) — This is already silently misfiring: TreeNodeFilter.MatchFilterPattern is a Phase-2 target in TARGETS.md but has no corresponding file in formal-verification/specs/. The workflow reports success. The purpose of this step — to gate PRs that forget to add informal specs — is completely unenforced. Change to ::error:: + sys.exit(1).

  2. Spec glob uses *.md instead of *_informal.md (Line 123) — The prior step counts *_informal.md files, but the validation step considers all .md files in specs/. Any incidental Markdown (README, notes) would satisfy a match, hiding a genuinely missing spec.

  3. Vacuous all() on empty keyword list (Line 132) — For any target whose name decomposes entirely into tokens shorter than 3 characters, all(kw in s for kw in []) returns True for every spec file, so the target appears validated regardless of actual coverage.

Positive Observations

  • The workflow correctly scopes permissions to contents: read.
  • The shell steps for checking file existence, lean-toolchain format, and 🔬 disclosure are solid and correctly use exit 1 to fail CI.
  • Hardcoded loop variables in shell steps eliminate any injection risk.

Recommendations

Fix the three Python-step correctness bugs before merging. The most critical is converting the missing-spec diagnostic from ::warning:: to a hard failure; the other two address false-positive scenarios.


Generated by Expert Code Reviewer

🧠 Reviewed by Expert Code Reviewer 🧠

Comment thread.github/workflows/fv-docs-validation.yml Outdated
parts = re.sub(r'([a-z])([A-Z])', r'\1_\2', name)
return [w.lower() for w in re.split(r'[._\s]+', parts) if len(w) >= 3]

all_specs = [os.path.basename(p) for p in glob.glob(os.path.join(specs_dir, "*.md"))]

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

[Correctness]glob.glob(... "*.md") collects all Markdown files in specs/, not just *_informal.md files. Any incidental .md file (e.g., a future README.md or NOTES.md placed in that directory) would be treated as a candidate spec, producing false-positive matches.

Impact: The step directly above counts only *_informal.md files; this step silently widens the net, creating an inconsistency that could hide a genuinely missing informal spec.

Suggestion: Narrow the glob to match the established naming convention:

all_specs= [os.path.basename(p) forpinglob.glob(os.path.join(specs_dir, "*_informal.md"))]

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.

Fixed in 39ac0ad — changed glob.glob(... "*.md") to glob.glob(... "*_informal.md") so the validation is consistent with the count step and won't match incidental markdown files.

Comment thread.github/workflows/fv-docs-validation.yml
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

- Narrow glob from *.md to *_informal.md to prevent false-positive matches
- Add empty-keywords guard to skip targets whose name has only short tokens
(avoids vacuous all() returning True on empty list)
- Change ::warning:: to ::error:: + sys.exit(1) so missing specs block CI
- Remove redundant keywords[0] guard (now handled by the empty-keywords check)
Agent-Logs-Url: https://github.com/microsoft/testfx/sessions/950eb316-fac6-464f-8197-0054dfa30e41
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>

CopilotAI commented Apr 30, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

All three correctness issues addressed in 39ac0ad:

  • *.md*_informal.md in the spec glob
  • Empty-keywords guard added before all() match
  • Missing spec diagnostic upgraded from ::warning:: to ::error:: + sys.exit(1)

@Evangelink
Amaury Levé (Evangelink) merged commit 485bb51 into mainApr 30, 2026
2 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the lean-squad/task9-fv-docs-ci-2026-04-27-fcf8710c1c8b58c4 branch April 30, 2026 09:29
Amaury Levé (Evangelink) added a commit that referenced this pull request May 12, 2026
… REPORT.md (#7936)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Sign up for freeto 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.

[Lean Squad] feat(ci): Task 9 — FV docs validation workflow + updated REPORT.md

3 participants

@Evangelink
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

[Lean Squad] feat(ci): Task 9 — FV docs validation workflow + updated REPORT.md - #7936

Merged
Amaury Levé (Evangelink) merged 3 commits into
mainfrom
lean-squad/task9-fv-docs-ci-2026-04-27-fcf8710c1c8b58c4
Apr 30, 2026
Merged

[Lean Squad] feat(ci): Task 9 — FV docs validation workflow + updated REPORT.md#7936
Amaury Levé (Evangelink) merged 3 commits into
mainfrom
lean-squad/task9-fv-docs-ci-2026-04-27-fcf8710c1c8b58c4

Conversation

@Evangelink

@EvangelinkAmaury Levé (Evangelink) commented Apr 29, 2026

Copy link
Copy Markdown
Member

Add .github/workflows/fv-docs-validation.yml: a CI workflow that validates
the structural integrity of formal-verification/ artifacts on every PR or
push that touches formal-verification/**.

Checks performed:

  • Required top-level FV docs present (RESEARCH.md, TARGETS.md,
    CORRESPONDENCE.md, CRITIQUE.md, REPORT.md)
  • Lean project files present (lakefile.toml, lean-toolchain, README.md)
  • lean-toolchain is non-empty and well-formed
  • 🔬 Lean Squad disclosure present in top-level docs
  • specs/ directory exists
  • Phase-2+ targets in TARGETS.md each have an informal spec in specs/
    (keyword-based matching handles CamelCase name decomposition)

Also update formal-verification/REPORT.md: add run history for the
2026-04-27 runs, expand target table with new targets, and document the
Lean toolchain blocker.

�� Lean Squad — automated formal verification agent
Run: https://github.com/microsoft/testfx/actions/runs/24986088168

Co-authored-by: Copilot 223556219+Copilot@users.noreply.github.com

Fixes#7861

Add .github/workflows/fv-docs-validation.yml: a CI workflow that validates
the structural integrity of formal-verification/ artifacts on every PR or
push that touches formal-verification/**.
Checks performed:
- Required top-level FV docs present (RESEARCH.md, TARGETS.md,
CORRESPONDENCE.md, CRITIQUE.md, REPORT.md)
- Lean project files present (lakefile.toml, lean-toolchain, README.md)
- lean-toolchain is non-empty and well-formed
- 🔬 Lean Squad disclosure present in top-level docs
- specs/ directory exists
- Phase-2+ targets in TARGETS.md each have an informal spec in specs/
(keyword-based matching handles CamelCase name decomposition)
Also update formal-verification/REPORT.md: add run history for the
2026-04-27 runs, expand target table with new targets, and document the
Lean toolchain blocker.
�� Lean Squad — automated formal verification agent
Run: https://github.com/microsoft/testfx/actions/runs/24986088168
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings April 29, 2026 16:27

CopilotAI 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 CI validation for the formal-verification/ artifact structure and updates FV reporting to reflect recent runs and current blockers, helping keep Lean Squad formal-verification documentation consistent over time.

Changes:

  • Introduce a GitHub Actions workflow that validates required FV docs, Lean project scaffolding, and basic TARGETS/specs consistency on PRs/pushes affecting formal-verification/**.
  • Update formal-verification/REPORT.md with refreshed status/summary and additional run history entries.
Show a summary per file
FileDescription
formal-verification/REPORT.mdUpdates FV status/summary text and adds 2026-04-27 run history entries.
.github/workflows/fv-docs-validation.ymlNew CI workflow to validate presence/shape of FV docs, Lean project files, and Phase-2+ informal spec alignment.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 3

Comment thread.github/workflows/fv-docs-validation.yml Outdated
Comment thread.github/workflows/fv-docs-validation.yml Outdated
Comment thread.github/workflows/fv-docs-validation.yml Outdated
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings April 30, 2026 07:19

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

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 3

Comment on lines +7 to 16
**Phase**: Early — Research expanded to 7 targets; informal specs extracted for `ArgumentArity` (merged) and `CommandLineParser.TryUnescape` (PR open). CI automation maturing. Lean toolchain blocked in CI runner; Task 3+ deferred.

## Summary

The Lean Squad has surveyed the `microsoft/testfx` codebase and identified **seven** high-quality FV targets. Two informal specifications have been extracted. The Lean toolchain cannot currently be installed in the runner environment due to network restrictions.
The Lean Squad has surveyed the `microsoft/testfx` codebase and identified **seven** high-quality FV targets in the command-line infrastructure and filter logic of Microsoft.Testing.Platform. All targets are pure or near-pure functions with clear algebraic properties, making them suitable for Lean 4 formal verification.

Key findings:
- **`ArgumentArity`**: informal spec extracted (14 properties, 4 groups). Constructor does not enforce `Min ≤ Max`; `CommandLineOption` enforces this on construction, acting as the real guard.
- **`ArgumentArity`**: informal spec extracted (14 properties, 4 groups). Constructor does not enforce `Min ≤ Max`; `CommandLineOption` enforces this on construction, acting as the real guard. Correspondence documented.
- **`CommandLineParser.TryUnescape`**: informal spec extracted (24 properties, 5 groups, 2 confirmed bugs for single-char quote inputs). PR open.
- **New targets identified**: `ResponseFileHelper.SplitCommandLine` (pure tokeniser) and `TreeNodeFilter.MatchFilterPattern` (Boolean algebra — ideal for structural induction proofs of De Morgan, double negation, idempotence).

CopilotAIApr 30, 2026

Copy link

Choose a reason for hiding this comment

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

The status/summary bullets appear out of date with the current FV artifacts: TARGETS.md lists several Phase-2 targets beyond just ArgumentArity and TryUnescape (e.g., ParseOptionAndSeparators, SplitCommandLine, TreeNodeFilter.MatchFilterPattern), and formal-verification/specs/ already contains additional *_informal.md files. Please update this section to reflect the actual set of extracted informal specs (or adjust phases elsewhere so the report is consistent).

Copilot uses AI. Check for mistakes.
Comment on lines +79 to +92
- name: Check FV 🔬 disclosure in top-level docs
run: |
FAILED=0
for doc in RESEARCH.md TARGETS.md CORRESPONDENCE.md CRITIQUE.md REPORT.md; do
if ! grep -q "🔬" "formal-verification/${doc}"; then
echo "::error file=formal-verification/${doc}::FV document missing 🔬 Lean Squad disclosure: ${doc}"
FAILED=1
else
echo "✅ formal-verification/${doc} has 🔬 disclosure"
fi
done
if [ "$FAILED" -ne 0 ]; then
exit 1
fi

CopilotAIApr 30, 2026

Copy link

Choose a reason for hiding this comment

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

This step fails the workflow if any required doc is missing the 🔬 disclosure marker, but the PR description/issue states the disclosure check should be warning-only (non-blocking). Consider emitting ::warning (and not exiting nonzero) so the workflow behavior matches the documented intent.

Copilot uses AI. Check for mistakes.
Comment on lines +62 to +71
TOOLCHAIN="$(tr -d '\r\n' < formal-verification/lean/lean-toolchain)"
if [ -z "$TOOLCHAIN" ]; then
echo "::error file=formal-verification/lean/lean-toolchain::lean-toolchain file is empty"
exit 1
fi

if [[ "$TOOLCHAIN" =~ [[:space:]] ]]; then
echo "::error file=formal-verification/lean/lean-toolchain::lean-toolchain must not contain whitespace"
exit 1
fi

CopilotAIApr 30, 2026

Copy link

Choose a reason for hiding this comment

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

The lean-toolchain validation strips all newlines (tr -d '\r\n'), so a malformed multi-line lean-toolchain file would be concatenated and could still pass the whitespace/regex checks. If the goal is to enforce a single well-formed toolchain spec, check that the file contains exactly one non-empty line (and fail if there are extra lines or trailing whitespace) before validating the pattern.

Copilot uses AI. Check for mistakes.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Summary

Workflow: Expert Code Reviewer
Date: 2026-04-30
Repository: microsoft/testfx

Key Findings

The two changed files are a new GitHub Actions workflow (.github/workflows/fv-docs-validation.yml) and a documentation update (formal-verification/REPORT.md). No production C# code is changed.

Correctness issues in the CI workflow — all in the final Python step:

  1. Missing spec check emits ::warning:: instead of ::error:: (Line 141) — This is already silently misfiring: TreeNodeFilter.MatchFilterPattern is a Phase-2 target in TARGETS.md but has no corresponding file in formal-verification/specs/. The workflow reports success. The purpose of this step — to gate PRs that forget to add informal specs — is completely unenforced. Change to ::error:: + sys.exit(1).

  2. Spec glob uses *.md instead of *_informal.md (Line 123) — The prior step counts *_informal.md files, but the validation step considers all .md files in specs/. Any incidental Markdown (README, notes) would satisfy a match, hiding a genuinely missing spec.

  3. Vacuous all() on empty keyword list (Line 132) — For any target whose name decomposes entirely into tokens shorter than 3 characters, all(kw in s for kw in []) returns True for every spec file, so the target appears validated regardless of actual coverage.

Positive Observations

  • The workflow correctly scopes permissions to contents: read.
  • The shell steps for checking file existence, lean-toolchain format, and 🔬 disclosure are solid and correctly use exit 1 to fail CI.
  • Hardcoded loop variables in shell steps eliminate any injection risk.

Recommendations

Fix the three Python-step correctness bugs before merging. The most critical is converting the missing-spec diagnostic from ::warning:: to a hard failure; the other two address false-positive scenarios.


Generated by Expert Code Reviewer

🧠 Reviewed by Expert Code Reviewer 🧠

Comment thread.github/workflows/fv-docs-validation.yml Outdated
parts = re.sub(r'([a-z])([A-Z])', r'\1_\2', name)
return [w.lower() for w in re.split(r'[._\s]+', parts) if len(w) >= 3]

all_specs = [os.path.basename(p) for p in glob.glob(os.path.join(specs_dir, "*.md"))]

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

[Correctness]glob.glob(... "*.md") collects all Markdown files in specs/, not just *_informal.md files. Any incidental .md file (e.g., a future README.md or NOTES.md placed in that directory) would be treated as a candidate spec, producing false-positive matches.

Impact: The step directly above counts only *_informal.md files; this step silently widens the net, creating an inconsistency that could hide a genuinely missing informal spec.

Suggestion: Narrow the glob to match the established naming convention:

all_specs= [os.path.basename(p) forpinglob.glob(os.path.join(specs_dir, "*_informal.md"))]

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.

Fixed in 39ac0ad — changed glob.glob(... "*.md") to glob.glob(... "*_informal.md") so the validation is consistent with the count step and won't match incidental markdown files.

Comment thread.github/workflows/fv-docs-validation.yml
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

- Narrow glob from *.md to *_informal.md to prevent false-positive matches
- Add empty-keywords guard to skip targets whose name has only short tokens
(avoids vacuous all() returning True on empty list)
- Change ::warning:: to ::error:: + sys.exit(1) so missing specs block CI
- Remove redundant keywords[0] guard (now handled by the empty-keywords check)
Agent-Logs-Url: https://github.com/microsoft/testfx/sessions/950eb316-fac6-464f-8197-0054dfa30e41
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>

CopilotAI commented Apr 30, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

All three correctness issues addressed in 39ac0ad:

  • *.md*_informal.md in the spec glob
  • Empty-keywords guard added before all() match
  • Missing spec diagnostic upgraded from ::warning:: to ::error:: + sys.exit(1)

@Evangelink
Amaury Levé (Evangelink) merged commit 485bb51 into mainApr 30, 2026
2 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the lean-squad/task9-fv-docs-ci-2026-04-27-fcf8710c1c8b58c4 branch April 30, 2026 09:29
Amaury Levé (Evangelink) added a commit that referenced this pull request May 12, 2026
… REPORT.md (#7936)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Sign up for freeto 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.

[Lean Squad] feat(ci): Task 9 — FV docs validation workflow + updated REPORT.md

3 participants

@Evangelink
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[Lean Squad] feat(ci): Task 9 — FV docs validation workflow + updated REPORT.md - #7936

Merged
Amaury Levé (Evangelink) merged 3 commits into
mainfrom
lean-squad/task9-fv-docs-ci-2026-04-27-fcf8710c1c8b58c4
Apr 30, 2026
Merged

[Lean Squad] feat(ci): Task 9 — FV docs validation workflow + updated REPORT.md#7936
Amaury Levé (Evangelink) merged 3 commits into
mainfrom
lean-squad/task9-fv-docs-ci-2026-04-27-fcf8710c1c8b58c4

Conversation

@Evangelink

@EvangelinkAmaury Levé (Evangelink) commented Apr 29, 2026

Copy link
Copy Markdown
Member

Add .github/workflows/fv-docs-validation.yml: a CI workflow that validates
the structural integrity of formal-verification/ artifacts on every PR or
push that touches formal-verification/**.

Checks performed:

  • Required top-level FV docs present (RESEARCH.md, TARGETS.md,
    CORRESPONDENCE.md, CRITIQUE.md, REPORT.md)
  • Lean project files present (lakefile.toml, lean-toolchain, README.md)
  • lean-toolchain is non-empty and well-formed
  • 🔬 Lean Squad disclosure present in top-level docs
  • specs/ directory exists
  • Phase-2+ targets in TARGETS.md each have an informal spec in specs/
    (keyword-based matching handles CamelCase name decomposition)

Also update formal-verification/REPORT.md: add run history for the
2026-04-27 runs, expand target table with new targets, and document the
Lean toolchain blocker.

�� Lean Squad — automated formal verification agent
Run: https://github.com/microsoft/testfx/actions/runs/24986088168

Co-authored-by: Copilot 223556219+Copilot@users.noreply.github.com

Fixes#7861

Add .github/workflows/fv-docs-validation.yml: a CI workflow that validates
the structural integrity of formal-verification/ artifacts on every PR or
push that touches formal-verification/**.
Checks performed:
- Required top-level FV docs present (RESEARCH.md, TARGETS.md,
CORRESPONDENCE.md, CRITIQUE.md, REPORT.md)
- Lean project files present (lakefile.toml, lean-toolchain, README.md)
- lean-toolchain is non-empty and well-formed
- 🔬 Lean Squad disclosure present in top-level docs
- specs/ directory exists
- Phase-2+ targets in TARGETS.md each have an informal spec in specs/
(keyword-based matching handles CamelCase name decomposition)
Also update formal-verification/REPORT.md: add run history for the
2026-04-27 runs, expand target table with new targets, and document the
Lean toolchain blocker.
�� Lean Squad — automated formal verification agent
Run: https://github.com/microsoft/testfx/actions/runs/24986088168
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings April 29, 2026 16:27

CopilotAI 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 CI validation for the formal-verification/ artifact structure and updates FV reporting to reflect recent runs and current blockers, helping keep Lean Squad formal-verification documentation consistent over time.

Changes:

  • Introduce a GitHub Actions workflow that validates required FV docs, Lean project scaffolding, and basic TARGETS/specs consistency on PRs/pushes affecting formal-verification/**.
  • Update formal-verification/REPORT.md with refreshed status/summary and additional run history entries.
Show a summary per file
FileDescription
formal-verification/REPORT.mdUpdates FV status/summary text and adds 2026-04-27 run history entries.
.github/workflows/fv-docs-validation.ymlNew CI workflow to validate presence/shape of FV docs, Lean project files, and Phase-2+ informal spec alignment.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 3

Comment thread.github/workflows/fv-docs-validation.yml Outdated
Comment thread.github/workflows/fv-docs-validation.yml Outdated
Comment thread.github/workflows/fv-docs-validation.yml Outdated
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings April 30, 2026 07:19

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

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 3

Comment on lines +7 to 16
**Phase**: Early — Research expanded to 7 targets; informal specs extracted for `ArgumentArity` (merged) and `CommandLineParser.TryUnescape` (PR open). CI automation maturing. Lean toolchain blocked in CI runner; Task 3+ deferred.

## Summary

The Lean Squad has surveyed the `microsoft/testfx` codebase and identified **seven** high-quality FV targets. Two informal specifications have been extracted. The Lean toolchain cannot currently be installed in the runner environment due to network restrictions.
The Lean Squad has surveyed the `microsoft/testfx` codebase and identified **seven** high-quality FV targets in the command-line infrastructure and filter logic of Microsoft.Testing.Platform. All targets are pure or near-pure functions with clear algebraic properties, making them suitable for Lean 4 formal verification.

Key findings:
- **`ArgumentArity`**: informal spec extracted (14 properties, 4 groups). Constructor does not enforce `Min ≤ Max`; `CommandLineOption` enforces this on construction, acting as the real guard.
- **`ArgumentArity`**: informal spec extracted (14 properties, 4 groups). Constructor does not enforce `Min ≤ Max`; `CommandLineOption` enforces this on construction, acting as the real guard. Correspondence documented.
- **`CommandLineParser.TryUnescape`**: informal spec extracted (24 properties, 5 groups, 2 confirmed bugs for single-char quote inputs). PR open.
- **New targets identified**: `ResponseFileHelper.SplitCommandLine` (pure tokeniser) and `TreeNodeFilter.MatchFilterPattern` (Boolean algebra — ideal for structural induction proofs of De Morgan, double negation, idempotence).

CopilotAIApr 30, 2026

Copy link

Choose a reason for hiding this comment

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

The status/summary bullets appear out of date with the current FV artifacts: TARGETS.md lists several Phase-2 targets beyond just ArgumentArity and TryUnescape (e.g., ParseOptionAndSeparators, SplitCommandLine, TreeNodeFilter.MatchFilterPattern), and formal-verification/specs/ already contains additional *_informal.md files. Please update this section to reflect the actual set of extracted informal specs (or adjust phases elsewhere so the report is consistent).

Copilot uses AI. Check for mistakes.
Comment on lines +79 to +92
- name: Check FV 🔬 disclosure in top-level docs
run: |
FAILED=0
for doc in RESEARCH.md TARGETS.md CORRESPONDENCE.md CRITIQUE.md REPORT.md; do
if ! grep -q "🔬" "formal-verification/${doc}"; then
echo "::error file=formal-verification/${doc}::FV document missing 🔬 Lean Squad disclosure: ${doc}"
FAILED=1
else
echo "✅ formal-verification/${doc} has 🔬 disclosure"
fi
done
if [ "$FAILED" -ne 0 ]; then
exit 1
fi

CopilotAIApr 30, 2026

Copy link

Choose a reason for hiding this comment

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

This step fails the workflow if any required doc is missing the 🔬 disclosure marker, but the PR description/issue states the disclosure check should be warning-only (non-blocking). Consider emitting ::warning (and not exiting nonzero) so the workflow behavior matches the documented intent.

Copilot uses AI. Check for mistakes.
Comment on lines +62 to +71
TOOLCHAIN="$(tr -d '\r\n' < formal-verification/lean/lean-toolchain)"
if [ -z "$TOOLCHAIN" ]; then
echo "::error file=formal-verification/lean/lean-toolchain::lean-toolchain file is empty"
exit 1
fi

if [[ "$TOOLCHAIN" =~ [[:space:]] ]]; then
echo "::error file=formal-verification/lean/lean-toolchain::lean-toolchain must not contain whitespace"
exit 1
fi

CopilotAIApr 30, 2026

Copy link

Choose a reason for hiding this comment

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

The lean-toolchain validation strips all newlines (tr -d '\r\n'), so a malformed multi-line lean-toolchain file would be concatenated and could still pass the whitespace/regex checks. If the goal is to enforce a single well-formed toolchain spec, check that the file contains exactly one non-empty line (and fail if there are extra lines or trailing whitespace) before validating the pattern.

Copilot uses AI. Check for mistakes.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Summary

Workflow: Expert Code Reviewer
Date: 2026-04-30
Repository: microsoft/testfx

Key Findings

The two changed files are a new GitHub Actions workflow (.github/workflows/fv-docs-validation.yml) and a documentation update (formal-verification/REPORT.md). No production C# code is changed.

Correctness issues in the CI workflow — all in the final Python step:

  1. Missing spec check emits ::warning:: instead of ::error:: (Line 141) — This is already silently misfiring: TreeNodeFilter.MatchFilterPattern is a Phase-2 target in TARGETS.md but has no corresponding file in formal-verification/specs/. The workflow reports success. The purpose of this step — to gate PRs that forget to add informal specs — is completely unenforced. Change to ::error:: + sys.exit(1).

  2. Spec glob uses *.md instead of *_informal.md (Line 123) — The prior step counts *_informal.md files, but the validation step considers all .md files in specs/. Any incidental Markdown (README, notes) would satisfy a match, hiding a genuinely missing spec.

  3. Vacuous all() on empty keyword list (Line 132) — For any target whose name decomposes entirely into tokens shorter than 3 characters, all(kw in s for kw in []) returns True for every spec file, so the target appears validated regardless of actual coverage.

Positive Observations

  • The workflow correctly scopes permissions to contents: read.
  • The shell steps for checking file existence, lean-toolchain format, and 🔬 disclosure are solid and correctly use exit 1 to fail CI.
  • Hardcoded loop variables in shell steps eliminate any injection risk.

Recommendations

Fix the three Python-step correctness bugs before merging. The most critical is converting the missing-spec diagnostic from ::warning:: to a hard failure; the other two address false-positive scenarios.


Generated by Expert Code Reviewer

🧠 Reviewed by Expert Code Reviewer 🧠

Comment thread.github/workflows/fv-docs-validation.yml Outdated
parts = re.sub(r'([a-z])([A-Z])', r'\1_\2', name)
return [w.lower() for w in re.split(r'[._\s]+', parts) if len(w) >= 3]

all_specs = [os.path.basename(p) for p in glob.glob(os.path.join(specs_dir, "*.md"))]

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

[Correctness]glob.glob(... "*.md") collects all Markdown files in specs/, not just *_informal.md files. Any incidental .md file (e.g., a future README.md or NOTES.md placed in that directory) would be treated as a candidate spec, producing false-positive matches.

Impact: The step directly above counts only *_informal.md files; this step silently widens the net, creating an inconsistency that could hide a genuinely missing informal spec.

Suggestion: Narrow the glob to match the established naming convention:

all_specs= [os.path.basename(p) forpinglob.glob(os.path.join(specs_dir, "*_informal.md"))]

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.

Fixed in 39ac0ad — changed glob.glob(... "*.md") to glob.glob(... "*_informal.md") so the validation is consistent with the count step and won't match incidental markdown files.

Comment thread.github/workflows/fv-docs-validation.yml
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

- Narrow glob from *.md to *_informal.md to prevent false-positive matches
- Add empty-keywords guard to skip targets whose name has only short tokens
(avoids vacuous all() returning True on empty list)
- Change ::warning:: to ::error:: + sys.exit(1) so missing specs block CI
- Remove redundant keywords[0] guard (now handled by the empty-keywords check)
Agent-Logs-Url: https://github.com/microsoft/testfx/sessions/950eb316-fac6-464f-8197-0054dfa30e41
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>

CopilotAI commented Apr 30, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

All three correctness issues addressed in 39ac0ad:

  • *.md*_informal.md in the spec glob
  • Empty-keywords guard added before all() match
  • Missing spec diagnostic upgraded from ::warning:: to ::error:: + sys.exit(1)

@Evangelink
Amaury Levé (Evangelink) merged commit 485bb51 into mainApr 30, 2026
2 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the lean-squad/task9-fv-docs-ci-2026-04-27-fcf8710c1c8b58c4 branch April 30, 2026 09:29
Amaury Levé (Evangelink) added a commit that referenced this pull request May 12, 2026
… REPORT.md (#7936)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Sign up for freeto 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.

[Lean Squad] feat(ci): Task 9 — FV docs validation workflow + updated REPORT.md

3 participants

@Evangelink
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[Lean Squad] feat(ci): Task 9 — FV docs validation workflow + updated REPORT.md - #7936

Merged
Amaury Levé (Evangelink) merged 3 commits into
mainfrom
lean-squad/task9-fv-docs-ci-2026-04-27-fcf8710c1c8b58c4
Apr 30, 2026
Merged

[Lean Squad] feat(ci): Task 9 — FV docs validation workflow + updated REPORT.md#7936
Amaury Levé (Evangelink) merged 3 commits into
mainfrom
lean-squad/task9-fv-docs-ci-2026-04-27-fcf8710c1c8b58c4

Conversation

@Evangelink

@EvangelinkAmaury Levé (Evangelink) commented Apr 29, 2026

Copy link
Copy Markdown
Member

Add .github/workflows/fv-docs-validation.yml: a CI workflow that validates
the structural integrity of formal-verification/ artifacts on every PR or
push that touches formal-verification/**.

Checks performed:

  • Required top-level FV docs present (RESEARCH.md, TARGETS.md,
    CORRESPONDENCE.md, CRITIQUE.md, REPORT.md)
  • Lean project files present (lakefile.toml, lean-toolchain, README.md)
  • lean-toolchain is non-empty and well-formed
  • 🔬 Lean Squad disclosure present in top-level docs
  • specs/ directory exists
  • Phase-2+ targets in TARGETS.md each have an informal spec in specs/
    (keyword-based matching handles CamelCase name decomposition)

Also update formal-verification/REPORT.md: add run history for the
2026-04-27 runs, expand target table with new targets, and document the
Lean toolchain blocker.

�� Lean Squad — automated formal verification agent
Run: https://github.com/microsoft/testfx/actions/runs/24986088168

Co-authored-by: Copilot 223556219+Copilot@users.noreply.github.com

Fixes#7861

Add .github/workflows/fv-docs-validation.yml: a CI workflow that validates
the structural integrity of formal-verification/ artifacts on every PR or
push that touches formal-verification/**.
Checks performed:
- Required top-level FV docs present (RESEARCH.md, TARGETS.md,
CORRESPONDENCE.md, CRITIQUE.md, REPORT.md)
- Lean project files present (lakefile.toml, lean-toolchain, README.md)
- lean-toolchain is non-empty and well-formed
- 🔬 Lean Squad disclosure present in top-level docs
- specs/ directory exists
- Phase-2+ targets in TARGETS.md each have an informal spec in specs/
(keyword-based matching handles CamelCase name decomposition)
Also update formal-verification/REPORT.md: add run history for the
2026-04-27 runs, expand target table with new targets, and document the
Lean toolchain blocker.
�� Lean Squad — automated formal verification agent
Run: https://github.com/microsoft/testfx/actions/runs/24986088168
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings April 29, 2026 16:27

CopilotAI 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 CI validation for the formal-verification/ artifact structure and updates FV reporting to reflect recent runs and current blockers, helping keep Lean Squad formal-verification documentation consistent over time.

Changes:

  • Introduce a GitHub Actions workflow that validates required FV docs, Lean project scaffolding, and basic TARGETS/specs consistency on PRs/pushes affecting formal-verification/**.
  • Update formal-verification/REPORT.md with refreshed status/summary and additional run history entries.
Show a summary per file
FileDescription
formal-verification/REPORT.mdUpdates FV status/summary text and adds 2026-04-27 run history entries.
.github/workflows/fv-docs-validation.ymlNew CI workflow to validate presence/shape of FV docs, Lean project files, and Phase-2+ informal spec alignment.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 3

Comment thread.github/workflows/fv-docs-validation.yml Outdated
Comment thread.github/workflows/fv-docs-validation.yml Outdated
Comment thread.github/workflows/fv-docs-validation.yml Outdated
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings April 30, 2026 07:19

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

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 3

Comment on lines +7 to 16
**Phase**: Early — Research expanded to 7 targets; informal specs extracted for `ArgumentArity` (merged) and `CommandLineParser.TryUnescape` (PR open). CI automation maturing. Lean toolchain blocked in CI runner; Task 3+ deferred.

## Summary

The Lean Squad has surveyed the `microsoft/testfx` codebase and identified **seven** high-quality FV targets. Two informal specifications have been extracted. The Lean toolchain cannot currently be installed in the runner environment due to network restrictions.
The Lean Squad has surveyed the `microsoft/testfx` codebase and identified **seven** high-quality FV targets in the command-line infrastructure and filter logic of Microsoft.Testing.Platform. All targets are pure or near-pure functions with clear algebraic properties, making them suitable for Lean 4 formal verification.

Key findings:
- **`ArgumentArity`**: informal spec extracted (14 properties, 4 groups). Constructor does not enforce `Min ≤ Max`; `CommandLineOption` enforces this on construction, acting as the real guard.
- **`ArgumentArity`**: informal spec extracted (14 properties, 4 groups). Constructor does not enforce `Min ≤ Max`; `CommandLineOption` enforces this on construction, acting as the real guard. Correspondence documented.
- **`CommandLineParser.TryUnescape`**: informal spec extracted (24 properties, 5 groups, 2 confirmed bugs for single-char quote inputs). PR open.
- **New targets identified**: `ResponseFileHelper.SplitCommandLine` (pure tokeniser) and `TreeNodeFilter.MatchFilterPattern` (Boolean algebra — ideal for structural induction proofs of De Morgan, double negation, idempotence).

CopilotAIApr 30, 2026

Copy link

Choose a reason for hiding this comment

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

The status/summary bullets appear out of date with the current FV artifacts: TARGETS.md lists several Phase-2 targets beyond just ArgumentArity and TryUnescape (e.g., ParseOptionAndSeparators, SplitCommandLine, TreeNodeFilter.MatchFilterPattern), and formal-verification/specs/ already contains additional *_informal.md files. Please update this section to reflect the actual set of extracted informal specs (or adjust phases elsewhere so the report is consistent).

Copilot uses AI. Check for mistakes.
Comment on lines +79 to +92
- name: Check FV 🔬 disclosure in top-level docs
run: |
FAILED=0
for doc in RESEARCH.md TARGETS.md CORRESPONDENCE.md CRITIQUE.md REPORT.md; do
if ! grep -q "🔬" "formal-verification/${doc}"; then
echo "::error file=formal-verification/${doc}::FV document missing 🔬 Lean Squad disclosure: ${doc}"
FAILED=1
else
echo "✅ formal-verification/${doc} has 🔬 disclosure"
fi
done
if [ "$FAILED" -ne 0 ]; then
exit 1
fi

CopilotAIApr 30, 2026

Copy link

Choose a reason for hiding this comment

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

This step fails the workflow if any required doc is missing the 🔬 disclosure marker, but the PR description/issue states the disclosure check should be warning-only (non-blocking). Consider emitting ::warning (and not exiting nonzero) so the workflow behavior matches the documented intent.

Copilot uses AI. Check for mistakes.
Comment on lines +62 to +71
TOOLCHAIN="$(tr -d '\r\n' < formal-verification/lean/lean-toolchain)"
if [ -z "$TOOLCHAIN" ]; then
echo "::error file=formal-verification/lean/lean-toolchain::lean-toolchain file is empty"
exit 1
fi

if [[ "$TOOLCHAIN" =~ [[:space:]] ]]; then
echo "::error file=formal-verification/lean/lean-toolchain::lean-toolchain must not contain whitespace"
exit 1
fi

CopilotAIApr 30, 2026

Copy link

Choose a reason for hiding this comment

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

The lean-toolchain validation strips all newlines (tr -d '\r\n'), so a malformed multi-line lean-toolchain file would be concatenated and could still pass the whitespace/regex checks. If the goal is to enforce a single well-formed toolchain spec, check that the file contains exactly one non-empty line (and fail if there are extra lines or trailing whitespace) before validating the pattern.

Copilot uses AI. Check for mistakes.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Summary

Workflow: Expert Code Reviewer
Date: 2026-04-30
Repository: microsoft/testfx

Key Findings

The two changed files are a new GitHub Actions workflow (.github/workflows/fv-docs-validation.yml) and a documentation update (formal-verification/REPORT.md). No production C# code is changed.

Correctness issues in the CI workflow — all in the final Python step:

  1. Missing spec check emits ::warning:: instead of ::error:: (Line 141) — This is already silently misfiring: TreeNodeFilter.MatchFilterPattern is a Phase-2 target in TARGETS.md but has no corresponding file in formal-verification/specs/. The workflow reports success. The purpose of this step — to gate PRs that forget to add informal specs — is completely unenforced. Change to ::error:: + sys.exit(1).

  2. Spec glob uses *.md instead of *_informal.md (Line 123) — The prior step counts *_informal.md files, but the validation step considers all .md files in specs/. Any incidental Markdown (README, notes) would satisfy a match, hiding a genuinely missing spec.

  3. Vacuous all() on empty keyword list (Line 132) — For any target whose name decomposes entirely into tokens shorter than 3 characters, all(kw in s for kw in []) returns True for every spec file, so the target appears validated regardless of actual coverage.

Positive Observations

  • The workflow correctly scopes permissions to contents: read.
  • The shell steps for checking file existence, lean-toolchain format, and 🔬 disclosure are solid and correctly use exit 1 to fail CI.
  • Hardcoded loop variables in shell steps eliminate any injection risk.

Recommendations

Fix the three Python-step correctness bugs before merging. The most critical is converting the missing-spec diagnostic from ::warning:: to a hard failure; the other two address false-positive scenarios.


Generated by Expert Code Reviewer

🧠 Reviewed by Expert Code Reviewer 🧠

Comment thread.github/workflows/fv-docs-validation.yml Outdated
parts = re.sub(r'([a-z])([A-Z])', r'\1_\2', name)
return [w.lower() for w in re.split(r'[._\s]+', parts) if len(w) >= 3]

all_specs = [os.path.basename(p) for p in glob.glob(os.path.join(specs_dir, "*.md"))]

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

[Correctness]glob.glob(... "*.md") collects all Markdown files in specs/, not just *_informal.md files. Any incidental .md file (e.g., a future README.md or NOTES.md placed in that directory) would be treated as a candidate spec, producing false-positive matches.

Impact: The step directly above counts only *_informal.md files; this step silently widens the net, creating an inconsistency that could hide a genuinely missing informal spec.

Suggestion: Narrow the glob to match the established naming convention:

all_specs= [os.path.basename(p) forpinglob.glob(os.path.join(specs_dir, "*_informal.md"))]

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.

Fixed in 39ac0ad — changed glob.glob(... "*.md") to glob.glob(... "*_informal.md") so the validation is consistent with the count step and won't match incidental markdown files.

Comment thread.github/workflows/fv-docs-validation.yml
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

- Narrow glob from *.md to *_informal.md to prevent false-positive matches
- Add empty-keywords guard to skip targets whose name has only short tokens
(avoids vacuous all() returning True on empty list)
- Change ::warning:: to ::error:: + sys.exit(1) so missing specs block CI
- Remove redundant keywords[0] guard (now handled by the empty-keywords check)
Agent-Logs-Url: https://github.com/microsoft/testfx/sessions/950eb316-fac6-464f-8197-0054dfa30e41
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>

CopilotAI commented Apr 30, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

All three correctness issues addressed in 39ac0ad:

  • *.md*_informal.md in the spec glob
  • Empty-keywords guard added before all() match
  • Missing spec diagnostic upgraded from ::warning:: to ::error:: + sys.exit(1)

@Evangelink
Amaury Levé (Evangelink) merged commit 485bb51 into mainApr 30, 2026
2 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the lean-squad/task9-fv-docs-ci-2026-04-27-fcf8710c1c8b58c4 branch April 30, 2026 09:29
Amaury Levé (Evangelink) added a commit that referenced this pull request May 12, 2026
… REPORT.md (#7936)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Sign up for freeto 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.

[Lean Squad] feat(ci): Task 9 — FV docs validation workflow + updated REPORT.md

3 participants

@Evangelink
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

[Lean Squad] feat(ci): Task 9 — FV docs validation workflow + updated REPORT.md - #7936

Merged
Amaury Levé (Evangelink) merged 3 commits into
mainfrom
lean-squad/task9-fv-docs-ci-2026-04-27-fcf8710c1c8b58c4
Apr 30, 2026
Merged

[Lean Squad] feat(ci): Task 9 — FV docs validation workflow + updated REPORT.md#7936
Amaury Levé (Evangelink) merged 3 commits into
mainfrom
lean-squad/task9-fv-docs-ci-2026-04-27-fcf8710c1c8b58c4

Conversation

@Evangelink

@EvangelinkAmaury Levé (Evangelink) commented Apr 29, 2026

Copy link
Copy Markdown
Member

Add .github/workflows/fv-docs-validation.yml: a CI workflow that validates
the structural integrity of formal-verification/ artifacts on every PR or
push that touches formal-verification/**.

Checks performed:

  • Required top-level FV docs present (RESEARCH.md, TARGETS.md,
    CORRESPONDENCE.md, CRITIQUE.md, REPORT.md)
  • Lean project files present (lakefile.toml, lean-toolchain, README.md)
  • lean-toolchain is non-empty and well-formed
  • 🔬 Lean Squad disclosure present in top-level docs
  • specs/ directory exists
  • Phase-2+ targets in TARGETS.md each have an informal spec in specs/
    (keyword-based matching handles CamelCase name decomposition)

Also update formal-verification/REPORT.md: add run history for the
2026-04-27 runs, expand target table with new targets, and document the
Lean toolchain blocker.

�� Lean Squad — automated formal verification agent
Run: https://github.com/microsoft/testfx/actions/runs/24986088168

Co-authored-by: Copilot 223556219+Copilot@users.noreply.github.com

Fixes#7861

Add .github/workflows/fv-docs-validation.yml: a CI workflow that validates
the structural integrity of formal-verification/ artifacts on every PR or
push that touches formal-verification/**.
Checks performed:
- Required top-level FV docs present (RESEARCH.md, TARGETS.md,
CORRESPONDENCE.md, CRITIQUE.md, REPORT.md)
- Lean project files present (lakefile.toml, lean-toolchain, README.md)
- lean-toolchain is non-empty and well-formed
- 🔬 Lean Squad disclosure present in top-level docs
- specs/ directory exists
- Phase-2+ targets in TARGETS.md each have an informal spec in specs/
(keyword-based matching handles CamelCase name decomposition)
Also update formal-verification/REPORT.md: add run history for the
2026-04-27 runs, expand target table with new targets, and document the
Lean toolchain blocker.
�� Lean Squad — automated formal verification agent
Run: https://github.com/microsoft/testfx/actions/runs/24986088168
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings April 29, 2026 16:27

CopilotAI 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 CI validation for the formal-verification/ artifact structure and updates FV reporting to reflect recent runs and current blockers, helping keep Lean Squad formal-verification documentation consistent over time.

Changes:

  • Introduce a GitHub Actions workflow that validates required FV docs, Lean project scaffolding, and basic TARGETS/specs consistency on PRs/pushes affecting formal-verification/**.
  • Update formal-verification/REPORT.md with refreshed status/summary and additional run history entries.
Show a summary per file
FileDescription
formal-verification/REPORT.mdUpdates FV status/summary text and adds 2026-04-27 run history entries.
.github/workflows/fv-docs-validation.ymlNew CI workflow to validate presence/shape of FV docs, Lean project files, and Phase-2+ informal spec alignment.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 3

Comment thread.github/workflows/fv-docs-validation.yml Outdated
Comment thread.github/workflows/fv-docs-validation.yml Outdated
Comment thread.github/workflows/fv-docs-validation.yml Outdated
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings April 30, 2026 07:19

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

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 3

Comment on lines +7 to 16
**Phase**: Early — Research expanded to 7 targets; informal specs extracted for `ArgumentArity` (merged) and `CommandLineParser.TryUnescape` (PR open). CI automation maturing. Lean toolchain blocked in CI runner; Task 3+ deferred.

## Summary

The Lean Squad has surveyed the `microsoft/testfx` codebase and identified **seven** high-quality FV targets. Two informal specifications have been extracted. The Lean toolchain cannot currently be installed in the runner environment due to network restrictions.
The Lean Squad has surveyed the `microsoft/testfx` codebase and identified **seven** high-quality FV targets in the command-line infrastructure and filter logic of Microsoft.Testing.Platform. All targets are pure or near-pure functions with clear algebraic properties, making them suitable for Lean 4 formal verification.

Key findings:
- **`ArgumentArity`**: informal spec extracted (14 properties, 4 groups). Constructor does not enforce `Min ≤ Max`; `CommandLineOption` enforces this on construction, acting as the real guard.
- **`ArgumentArity`**: informal spec extracted (14 properties, 4 groups). Constructor does not enforce `Min ≤ Max`; `CommandLineOption` enforces this on construction, acting as the real guard. Correspondence documented.
- **`CommandLineParser.TryUnescape`**: informal spec extracted (24 properties, 5 groups, 2 confirmed bugs for single-char quote inputs). PR open.
- **New targets identified**: `ResponseFileHelper.SplitCommandLine` (pure tokeniser) and `TreeNodeFilter.MatchFilterPattern` (Boolean algebra — ideal for structural induction proofs of De Morgan, double negation, idempotence).

CopilotAIApr 30, 2026

Copy link

Choose a reason for hiding this comment

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

The status/summary bullets appear out of date with the current FV artifacts: TARGETS.md lists several Phase-2 targets beyond just ArgumentArity and TryUnescape (e.g., ParseOptionAndSeparators, SplitCommandLine, TreeNodeFilter.MatchFilterPattern), and formal-verification/specs/ already contains additional *_informal.md files. Please update this section to reflect the actual set of extracted informal specs (or adjust phases elsewhere so the report is consistent).

Copilot uses AI. Check for mistakes.
Comment on lines +79 to +92
- name: Check FV 🔬 disclosure in top-level docs
run: |
FAILED=0
for doc in RESEARCH.md TARGETS.md CORRESPONDENCE.md CRITIQUE.md REPORT.md; do
if ! grep -q "🔬" "formal-verification/${doc}"; then
echo "::error file=formal-verification/${doc}::FV document missing 🔬 Lean Squad disclosure: ${doc}"
FAILED=1
else
echo "✅ formal-verification/${doc} has 🔬 disclosure"
fi
done
if [ "$FAILED" -ne 0 ]; then
exit 1
fi

CopilotAIApr 30, 2026

Copy link

Choose a reason for hiding this comment

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

This step fails the workflow if any required doc is missing the 🔬 disclosure marker, but the PR description/issue states the disclosure check should be warning-only (non-blocking). Consider emitting ::warning (and not exiting nonzero) so the workflow behavior matches the documented intent.

Copilot uses AI. Check for mistakes.
Comment on lines +62 to +71
TOOLCHAIN="$(tr -d '\r\n' < formal-verification/lean/lean-toolchain)"
if [ -z "$TOOLCHAIN" ]; then
echo "::error file=formal-verification/lean/lean-toolchain::lean-toolchain file is empty"
exit 1
fi

if [[ "$TOOLCHAIN" =~ [[:space:]] ]]; then
echo "::error file=formal-verification/lean/lean-toolchain::lean-toolchain must not contain whitespace"
exit 1
fi

CopilotAIApr 30, 2026

Copy link

Choose a reason for hiding this comment

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

The lean-toolchain validation strips all newlines (tr -d '\r\n'), so a malformed multi-line lean-toolchain file would be concatenated and could still pass the whitespace/regex checks. If the goal is to enforce a single well-formed toolchain spec, check that the file contains exactly one non-empty line (and fail if there are extra lines or trailing whitespace) before validating the pattern.

Copilot uses AI. Check for mistakes.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Summary

Workflow: Expert Code Reviewer
Date: 2026-04-30
Repository: microsoft/testfx

Key Findings

The two changed files are a new GitHub Actions workflow (.github/workflows/fv-docs-validation.yml) and a documentation update (formal-verification/REPORT.md). No production C# code is changed.

Correctness issues in the CI workflow — all in the final Python step:

  1. Missing spec check emits ::warning:: instead of ::error:: (Line 141) — This is already silently misfiring: TreeNodeFilter.MatchFilterPattern is a Phase-2 target in TARGETS.md but has no corresponding file in formal-verification/specs/. The workflow reports success. The purpose of this step — to gate PRs that forget to add informal specs — is completely unenforced. Change to ::error:: + sys.exit(1).

  2. Spec glob uses *.md instead of *_informal.md (Line 123) — The prior step counts *_informal.md files, but the validation step considers all .md files in specs/. Any incidental Markdown (README, notes) would satisfy a match, hiding a genuinely missing spec.

  3. Vacuous all() on empty keyword list (Line 132) — For any target whose name decomposes entirely into tokens shorter than 3 characters, all(kw in s for kw in []) returns True for every spec file, so the target appears validated regardless of actual coverage.

Positive Observations

  • The workflow correctly scopes permissions to contents: read.
  • The shell steps for checking file existence, lean-toolchain format, and 🔬 disclosure are solid and correctly use exit 1 to fail CI.
  • Hardcoded loop variables in shell steps eliminate any injection risk.

Recommendations

Fix the three Python-step correctness bugs before merging. The most critical is converting the missing-spec diagnostic from ::warning:: to a hard failure; the other two address false-positive scenarios.


Generated by Expert Code Reviewer

🧠 Reviewed by Expert Code Reviewer 🧠

Comment thread.github/workflows/fv-docs-validation.yml Outdated
parts = re.sub(r'([a-z])([A-Z])', r'\1_\2', name)
return [w.lower() for w in re.split(r'[._\s]+', parts) if len(w) >= 3]

all_specs = [os.path.basename(p) for p in glob.glob(os.path.join(specs_dir, "*.md"))]

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

[Correctness]glob.glob(... "*.md") collects all Markdown files in specs/, not just *_informal.md files. Any incidental .md file (e.g., a future README.md or NOTES.md placed in that directory) would be treated as a candidate spec, producing false-positive matches.

Impact: The step directly above counts only *_informal.md files; this step silently widens the net, creating an inconsistency that could hide a genuinely missing informal spec.

Suggestion: Narrow the glob to match the established naming convention:

all_specs= [os.path.basename(p) forpinglob.glob(os.path.join(specs_dir, "*_informal.md"))]

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.

Fixed in 39ac0ad — changed glob.glob(... "*.md") to glob.glob(... "*_informal.md") so the validation is consistent with the count step and won't match incidental markdown files.

Comment thread.github/workflows/fv-docs-validation.yml
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

- Narrow glob from *.md to *_informal.md to prevent false-positive matches
- Add empty-keywords guard to skip targets whose name has only short tokens
(avoids vacuous all() returning True on empty list)
- Change ::warning:: to ::error:: + sys.exit(1) so missing specs block CI
- Remove redundant keywords[0] guard (now handled by the empty-keywords check)
Agent-Logs-Url: https://github.com/microsoft/testfx/sessions/950eb316-fac6-464f-8197-0054dfa30e41
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>

CopilotAI commented Apr 30, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

All three correctness issues addressed in 39ac0ad:

  • *.md*_informal.md in the spec glob
  • Empty-keywords guard added before all() match
  • Missing spec diagnostic upgraded from ::warning:: to ::error:: + sys.exit(1)

@Evangelink
Amaury Levé (Evangelink) merged commit 485bb51 into mainApr 30, 2026
2 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the lean-squad/task9-fv-docs-ci-2026-04-27-fcf8710c1c8b58c4 branch April 30, 2026 09:29
Amaury Levé (Evangelink) added a commit that referenced this pull request May 12, 2026
… REPORT.md (#7936)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Sign up for freeto 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.

[Lean Squad] feat(ci): Task 9 — FV docs validation workflow + updated REPORT.md

3 participants

@Evangelink
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[Lean Squad] feat(ci): Task 9 — FV docs validation workflow + updated REPORT.md - #7936

Merged
Amaury Levé (Evangelink) merged 3 commits into
mainfrom
lean-squad/task9-fv-docs-ci-2026-04-27-fcf8710c1c8b58c4
Apr 30, 2026
Merged

[Lean Squad] feat(ci): Task 9 — FV docs validation workflow + updated REPORT.md#7936
Amaury Levé (Evangelink) merged 3 commits into
mainfrom
lean-squad/task9-fv-docs-ci-2026-04-27-fcf8710c1c8b58c4

Conversation

@Evangelink

@EvangelinkAmaury Levé (Evangelink) commented Apr 29, 2026

Copy link
Copy Markdown
Member

Add .github/workflows/fv-docs-validation.yml: a CI workflow that validates
the structural integrity of formal-verification/ artifacts on every PR or
push that touches formal-verification/**.

Checks performed:

  • Required top-level FV docs present (RESEARCH.md, TARGETS.md,
    CORRESPONDENCE.md, CRITIQUE.md, REPORT.md)
  • Lean project files present (lakefile.toml, lean-toolchain, README.md)
  • lean-toolchain is non-empty and well-formed
  • 🔬 Lean Squad disclosure present in top-level docs
  • specs/ directory exists
  • Phase-2+ targets in TARGETS.md each have an informal spec in specs/
    (keyword-based matching handles CamelCase name decomposition)

Also update formal-verification/REPORT.md: add run history for the
2026-04-27 runs, expand target table with new targets, and document the
Lean toolchain blocker.

�� Lean Squad — automated formal verification agent
Run: https://github.com/microsoft/testfx/actions/runs/24986088168

Co-authored-by: Copilot 223556219+Copilot@users.noreply.github.com

Fixes#7861

Add .github/workflows/fv-docs-validation.yml: a CI workflow that validates
the structural integrity of formal-verification/ artifacts on every PR or
push that touches formal-verification/**.
Checks performed:
- Required top-level FV docs present (RESEARCH.md, TARGETS.md,
CORRESPONDENCE.md, CRITIQUE.md, REPORT.md)
- Lean project files present (lakefile.toml, lean-toolchain, README.md)
- lean-toolchain is non-empty and well-formed
- 🔬 Lean Squad disclosure present in top-level docs
- specs/ directory exists
- Phase-2+ targets in TARGETS.md each have an informal spec in specs/
(keyword-based matching handles CamelCase name decomposition)
Also update formal-verification/REPORT.md: add run history for the
2026-04-27 runs, expand target table with new targets, and document the
Lean toolchain blocker.
�� Lean Squad — automated formal verification agent
Run: https://github.com/microsoft/testfx/actions/runs/24986088168
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings April 29, 2026 16:27

CopilotAI 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 CI validation for the formal-verification/ artifact structure and updates FV reporting to reflect recent runs and current blockers, helping keep Lean Squad formal-verification documentation consistent over time.

Changes:

  • Introduce a GitHub Actions workflow that validates required FV docs, Lean project scaffolding, and basic TARGETS/specs consistency on PRs/pushes affecting formal-verification/**.
  • Update formal-verification/REPORT.md with refreshed status/summary and additional run history entries.
Show a summary per file
FileDescription
formal-verification/REPORT.mdUpdates FV status/summary text and adds 2026-04-27 run history entries.
.github/workflows/fv-docs-validation.ymlNew CI workflow to validate presence/shape of FV docs, Lean project files, and Phase-2+ informal spec alignment.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 3

Comment thread.github/workflows/fv-docs-validation.yml Outdated
Comment thread.github/workflows/fv-docs-validation.yml Outdated
Comment thread.github/workflows/fv-docs-validation.yml Outdated
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings April 30, 2026 07:19

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

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 3

Comment on lines +7 to 16
**Phase**: Early — Research expanded to 7 targets; informal specs extracted for `ArgumentArity` (merged) and `CommandLineParser.TryUnescape` (PR open). CI automation maturing. Lean toolchain blocked in CI runner; Task 3+ deferred.

## Summary

The Lean Squad has surveyed the `microsoft/testfx` codebase and identified **seven** high-quality FV targets. Two informal specifications have been extracted. The Lean toolchain cannot currently be installed in the runner environment due to network restrictions.
The Lean Squad has surveyed the `microsoft/testfx` codebase and identified **seven** high-quality FV targets in the command-line infrastructure and filter logic of Microsoft.Testing.Platform. All targets are pure or near-pure functions with clear algebraic properties, making them suitable for Lean 4 formal verification.

Key findings:
- **`ArgumentArity`**: informal spec extracted (14 properties, 4 groups). Constructor does not enforce `Min ≤ Max`; `CommandLineOption` enforces this on construction, acting as the real guard.
- **`ArgumentArity`**: informal spec extracted (14 properties, 4 groups). Constructor does not enforce `Min ≤ Max`; `CommandLineOption` enforces this on construction, acting as the real guard. Correspondence documented.
- **`CommandLineParser.TryUnescape`**: informal spec extracted (24 properties, 5 groups, 2 confirmed bugs for single-char quote inputs). PR open.
- **New targets identified**: `ResponseFileHelper.SplitCommandLine` (pure tokeniser) and `TreeNodeFilter.MatchFilterPattern` (Boolean algebra — ideal for structural induction proofs of De Morgan, double negation, idempotence).

CopilotAIApr 30, 2026

Copy link

Choose a reason for hiding this comment

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

The status/summary bullets appear out of date with the current FV artifacts: TARGETS.md lists several Phase-2 targets beyond just ArgumentArity and TryUnescape (e.g., ParseOptionAndSeparators, SplitCommandLine, TreeNodeFilter.MatchFilterPattern), and formal-verification/specs/ already contains additional *_informal.md files. Please update this section to reflect the actual set of extracted informal specs (or adjust phases elsewhere so the report is consistent).

Copilot uses AI. Check for mistakes.
Comment on lines +79 to +92
- name: Check FV 🔬 disclosure in top-level docs
run: |
FAILED=0
for doc in RESEARCH.md TARGETS.md CORRESPONDENCE.md CRITIQUE.md REPORT.md; do
if ! grep -q "🔬" "formal-verification/${doc}"; then
echo "::error file=formal-verification/${doc}::FV document missing 🔬 Lean Squad disclosure: ${doc}"
FAILED=1
else
echo "✅ formal-verification/${doc} has 🔬 disclosure"
fi
done
if [ "$FAILED" -ne 0 ]; then
exit 1
fi

CopilotAIApr 30, 2026

Copy link

Choose a reason for hiding this comment

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

This step fails the workflow if any required doc is missing the 🔬 disclosure marker, but the PR description/issue states the disclosure check should be warning-only (non-blocking). Consider emitting ::warning (and not exiting nonzero) so the workflow behavior matches the documented intent.

Copilot uses AI. Check for mistakes.
Comment on lines +62 to +71
TOOLCHAIN="$(tr -d '\r\n' < formal-verification/lean/lean-toolchain)"
if [ -z "$TOOLCHAIN" ]; then
echo "::error file=formal-verification/lean/lean-toolchain::lean-toolchain file is empty"
exit 1
fi

if [[ "$TOOLCHAIN" =~ [[:space:]] ]]; then
echo "::error file=formal-verification/lean/lean-toolchain::lean-toolchain must not contain whitespace"
exit 1
fi

CopilotAIApr 30, 2026

Copy link

Choose a reason for hiding this comment

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

The lean-toolchain validation strips all newlines (tr -d '\r\n'), so a malformed multi-line lean-toolchain file would be concatenated and could still pass the whitespace/regex checks. If the goal is to enforce a single well-formed toolchain spec, check that the file contains exactly one non-empty line (and fail if there are extra lines or trailing whitespace) before validating the pattern.

Copilot uses AI. Check for mistakes.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Summary

Workflow: Expert Code Reviewer
Date: 2026-04-30
Repository: microsoft/testfx

Key Findings

The two changed files are a new GitHub Actions workflow (.github/workflows/fv-docs-validation.yml) and a documentation update (formal-verification/REPORT.md). No production C# code is changed.

Correctness issues in the CI workflow — all in the final Python step:

  1. Missing spec check emits ::warning:: instead of ::error:: (Line 141) — This is already silently misfiring: TreeNodeFilter.MatchFilterPattern is a Phase-2 target in TARGETS.md but has no corresponding file in formal-verification/specs/. The workflow reports success. The purpose of this step — to gate PRs that forget to add informal specs — is completely unenforced. Change to ::error:: + sys.exit(1).

  2. Spec glob uses *.md instead of *_informal.md (Line 123) — The prior step counts *_informal.md files, but the validation step considers all .md files in specs/. Any incidental Markdown (README, notes) would satisfy a match, hiding a genuinely missing spec.

  3. Vacuous all() on empty keyword list (Line 132) — For any target whose name decomposes entirely into tokens shorter than 3 characters, all(kw in s for kw in []) returns True for every spec file, so the target appears validated regardless of actual coverage.

Positive Observations

  • The workflow correctly scopes permissions to contents: read.
  • The shell steps for checking file existence, lean-toolchain format, and 🔬 disclosure are solid and correctly use exit 1 to fail CI.
  • Hardcoded loop variables in shell steps eliminate any injection risk.

Recommendations

Fix the three Python-step correctness bugs before merging. The most critical is converting the missing-spec diagnostic from ::warning:: to a hard failure; the other two address false-positive scenarios.


Generated by Expert Code Reviewer

🧠 Reviewed by Expert Code Reviewer 🧠

Comment thread.github/workflows/fv-docs-validation.yml Outdated
parts = re.sub(r'([a-z])([A-Z])', r'\1_\2', name)
return [w.lower() for w in re.split(r'[._\s]+', parts) if len(w) >= 3]

all_specs = [os.path.basename(p) for p in glob.glob(os.path.join(specs_dir, "*.md"))]

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

[Correctness]glob.glob(... "*.md") collects all Markdown files in specs/, not just *_informal.md files. Any incidental .md file (e.g., a future README.md or NOTES.md placed in that directory) would be treated as a candidate spec, producing false-positive matches.

Impact: The step directly above counts only *_informal.md files; this step silently widens the net, creating an inconsistency that could hide a genuinely missing informal spec.

Suggestion: Narrow the glob to match the established naming convention:

all_specs= [os.path.basename(p) forpinglob.glob(os.path.join(specs_dir, "*_informal.md"))]

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.

Fixed in 39ac0ad — changed glob.glob(... "*.md") to glob.glob(... "*_informal.md") so the validation is consistent with the count step and won't match incidental markdown files.

Comment thread.github/workflows/fv-docs-validation.yml
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

- Narrow glob from *.md to *_informal.md to prevent false-positive matches
- Add empty-keywords guard to skip targets whose name has only short tokens
(avoids vacuous all() returning True on empty list)
- Change ::warning:: to ::error:: + sys.exit(1) so missing specs block CI
- Remove redundant keywords[0] guard (now handled by the empty-keywords check)
Agent-Logs-Url: https://github.com/microsoft/testfx/sessions/950eb316-fac6-464f-8197-0054dfa30e41
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>

CopilotAI commented Apr 30, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

All three correctness issues addressed in 39ac0ad:

  • *.md*_informal.md in the spec glob
  • Empty-keywords guard added before all() match
  • Missing spec diagnostic upgraded from ::warning:: to ::error:: + sys.exit(1)

@Evangelink
Amaury Levé (Evangelink) merged commit 485bb51 into mainApr 30, 2026
2 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the lean-squad/task9-fv-docs-ci-2026-04-27-fcf8710c1c8b58c4 branch April 30, 2026 09:29
Amaury Levé (Evangelink) added a commit that referenced this pull request May 12, 2026
… REPORT.md (#7936)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Sign up for freeto 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.

[Lean Squad] feat(ci): Task 9 — FV docs validation workflow + updated REPORT.md

3 participants

@Evangelink
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[Lean Squad] feat(ci): Task 9 — FV docs validation workflow + updated REPORT.md - #7936

Merged
Amaury Levé (Evangelink) merged 3 commits into
mainfrom
lean-squad/task9-fv-docs-ci-2026-04-27-fcf8710c1c8b58c4
Apr 30, 2026
Merged

[Lean Squad] feat(ci): Task 9 — FV docs validation workflow + updated REPORT.md#7936
Amaury Levé (Evangelink) merged 3 commits into
mainfrom
lean-squad/task9-fv-docs-ci-2026-04-27-fcf8710c1c8b58c4

Conversation

@Evangelink

@EvangelinkAmaury Levé (Evangelink) commented Apr 29, 2026

Copy link
Copy Markdown
Member

Add .github/workflows/fv-docs-validation.yml: a CI workflow that validates
the structural integrity of formal-verification/ artifacts on every PR or
push that touches formal-verification/**.

Checks performed:

  • Required top-level FV docs present (RESEARCH.md, TARGETS.md,
    CORRESPONDENCE.md, CRITIQUE.md, REPORT.md)
  • Lean project files present (lakefile.toml, lean-toolchain, README.md)
  • lean-toolchain is non-empty and well-formed
  • 🔬 Lean Squad disclosure present in top-level docs
  • specs/ directory exists
  • Phase-2+ targets in TARGETS.md each have an informal spec in specs/
    (keyword-based matching handles CamelCase name decomposition)

Also update formal-verification/REPORT.md: add run history for the
2026-04-27 runs, expand target table with new targets, and document the
Lean toolchain blocker.

�� Lean Squad — automated formal verification agent
Run: https://github.com/microsoft/testfx/actions/runs/24986088168

Co-authored-by: Copilot 223556219+Copilot@users.noreply.github.com

Fixes#7861

Add .github/workflows/fv-docs-validation.yml: a CI workflow that validates
the structural integrity of formal-verification/ artifacts on every PR or
push that touches formal-verification/**.
Checks performed:
- Required top-level FV docs present (RESEARCH.md, TARGETS.md,
CORRESPONDENCE.md, CRITIQUE.md, REPORT.md)
- Lean project files present (lakefile.toml, lean-toolchain, README.md)
- lean-toolchain is non-empty and well-formed
- 🔬 Lean Squad disclosure present in top-level docs
- specs/ directory exists
- Phase-2+ targets in TARGETS.md each have an informal spec in specs/
(keyword-based matching handles CamelCase name decomposition)
Also update formal-verification/REPORT.md: add run history for the
2026-04-27 runs, expand target table with new targets, and document the
Lean toolchain blocker.
�� Lean Squad — automated formal verification agent
Run: https://github.com/microsoft/testfx/actions/runs/24986088168
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings April 29, 2026 16:27

CopilotAI 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 CI validation for the formal-verification/ artifact structure and updates FV reporting to reflect recent runs and current blockers, helping keep Lean Squad formal-verification documentation consistent over time.

Changes:

  • Introduce a GitHub Actions workflow that validates required FV docs, Lean project scaffolding, and basic TARGETS/specs consistency on PRs/pushes affecting formal-verification/**.
  • Update formal-verification/REPORT.md with refreshed status/summary and additional run history entries.
Show a summary per file
FileDescription
formal-verification/REPORT.mdUpdates FV status/summary text and adds 2026-04-27 run history entries.
.github/workflows/fv-docs-validation.ymlNew CI workflow to validate presence/shape of FV docs, Lean project files, and Phase-2+ informal spec alignment.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 3

Comment thread.github/workflows/fv-docs-validation.yml Outdated
Comment thread.github/workflows/fv-docs-validation.yml Outdated
Comment thread.github/workflows/fv-docs-validation.yml Outdated
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings April 30, 2026 07:19

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

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 3

Comment on lines +7 to 16
**Phase**: Early — Research expanded to 7 targets; informal specs extracted for `ArgumentArity` (merged) and `CommandLineParser.TryUnescape` (PR open). CI automation maturing. Lean toolchain blocked in CI runner; Task 3+ deferred.

## Summary

The Lean Squad has surveyed the `microsoft/testfx` codebase and identified **seven** high-quality FV targets. Two informal specifications have been extracted. The Lean toolchain cannot currently be installed in the runner environment due to network restrictions.
The Lean Squad has surveyed the `microsoft/testfx` codebase and identified **seven** high-quality FV targets in the command-line infrastructure and filter logic of Microsoft.Testing.Platform. All targets are pure or near-pure functions with clear algebraic properties, making them suitable for Lean 4 formal verification.

Key findings:
- **`ArgumentArity`**: informal spec extracted (14 properties, 4 groups). Constructor does not enforce `Min ≤ Max`; `CommandLineOption` enforces this on construction, acting as the real guard.
- **`ArgumentArity`**: informal spec extracted (14 properties, 4 groups). Constructor does not enforce `Min ≤ Max`; `CommandLineOption` enforces this on construction, acting as the real guard. Correspondence documented.
- **`CommandLineParser.TryUnescape`**: informal spec extracted (24 properties, 5 groups, 2 confirmed bugs for single-char quote inputs). PR open.
- **New targets identified**: `ResponseFileHelper.SplitCommandLine` (pure tokeniser) and `TreeNodeFilter.MatchFilterPattern` (Boolean algebra — ideal for structural induction proofs of De Morgan, double negation, idempotence).

CopilotAIApr 30, 2026

Copy link

Choose a reason for hiding this comment

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

The status/summary bullets appear out of date with the current FV artifacts: TARGETS.md lists several Phase-2 targets beyond just ArgumentArity and TryUnescape (e.g., ParseOptionAndSeparators, SplitCommandLine, TreeNodeFilter.MatchFilterPattern), and formal-verification/specs/ already contains additional *_informal.md files. Please update this section to reflect the actual set of extracted informal specs (or adjust phases elsewhere so the report is consistent).

Copilot uses AI. Check for mistakes.
Comment on lines +79 to +92
- name: Check FV 🔬 disclosure in top-level docs
run: |
FAILED=0
for doc in RESEARCH.md TARGETS.md CORRESPONDENCE.md CRITIQUE.md REPORT.md; do
if ! grep -q "🔬" "formal-verification/${doc}"; then
echo "::error file=formal-verification/${doc}::FV document missing 🔬 Lean Squad disclosure: ${doc}"
FAILED=1
else
echo "✅ formal-verification/${doc} has 🔬 disclosure"
fi
done
if [ "$FAILED" -ne 0 ]; then
exit 1
fi

CopilotAIApr 30, 2026

Copy link

Choose a reason for hiding this comment

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

This step fails the workflow if any required doc is missing the 🔬 disclosure marker, but the PR description/issue states the disclosure check should be warning-only (non-blocking). Consider emitting ::warning (and not exiting nonzero) so the workflow behavior matches the documented intent.

Copilot uses AI. Check for mistakes.
Comment on lines +62 to +71
TOOLCHAIN="$(tr -d '\r\n' < formal-verification/lean/lean-toolchain)"
if [ -z "$TOOLCHAIN" ]; then
echo "::error file=formal-verification/lean/lean-toolchain::lean-toolchain file is empty"
exit 1
fi

if [[ "$TOOLCHAIN" =~ [[:space:]] ]]; then
echo "::error file=formal-verification/lean/lean-toolchain::lean-toolchain must not contain whitespace"
exit 1
fi

CopilotAIApr 30, 2026

Copy link

Choose a reason for hiding this comment

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

The lean-toolchain validation strips all newlines (tr -d '\r\n'), so a malformed multi-line lean-toolchain file would be concatenated and could still pass the whitespace/regex checks. If the goal is to enforce a single well-formed toolchain spec, check that the file contains exactly one non-empty line (and fail if there are extra lines or trailing whitespace) before validating the pattern.

Copilot uses AI. Check for mistakes.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Summary

Workflow: Expert Code Reviewer
Date: 2026-04-30
Repository: microsoft/testfx

Key Findings

The two changed files are a new GitHub Actions workflow (.github/workflows/fv-docs-validation.yml) and a documentation update (formal-verification/REPORT.md). No production C# code is changed.

Correctness issues in the CI workflow — all in the final Python step:

  1. Missing spec check emits ::warning:: instead of ::error:: (Line 141) — This is already silently misfiring: TreeNodeFilter.MatchFilterPattern is a Phase-2 target in TARGETS.md but has no corresponding file in formal-verification/specs/. The workflow reports success. The purpose of this step — to gate PRs that forget to add informal specs — is completely unenforced. Change to ::error:: + sys.exit(1).

  2. Spec glob uses *.md instead of *_informal.md (Line 123) — The prior step counts *_informal.md files, but the validation step considers all .md files in specs/. Any incidental Markdown (README, notes) would satisfy a match, hiding a genuinely missing spec.

  3. Vacuous all() on empty keyword list (Line 132) — For any target whose name decomposes entirely into tokens shorter than 3 characters, all(kw in s for kw in []) returns True for every spec file, so the target appears validated regardless of actual coverage.

Positive Observations

  • The workflow correctly scopes permissions to contents: read.
  • The shell steps for checking file existence, lean-toolchain format, and 🔬 disclosure are solid and correctly use exit 1 to fail CI.
  • Hardcoded loop variables in shell steps eliminate any injection risk.

Recommendations

Fix the three Python-step correctness bugs before merging. The most critical is converting the missing-spec diagnostic from ::warning:: to a hard failure; the other two address false-positive scenarios.


Generated by Expert Code Reviewer

🧠 Reviewed by Expert Code Reviewer 🧠

Comment thread.github/workflows/fv-docs-validation.yml Outdated
parts = re.sub(r'([a-z])([A-Z])', r'\1_\2', name)
return [w.lower() for w in re.split(r'[._\s]+', parts) if len(w) >= 3]

all_specs = [os.path.basename(p) for p in glob.glob(os.path.join(specs_dir, "*.md"))]

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

[Correctness]glob.glob(... "*.md") collects all Markdown files in specs/, not just *_informal.md files. Any incidental .md file (e.g., a future README.md or NOTES.md placed in that directory) would be treated as a candidate spec, producing false-positive matches.

Impact: The step directly above counts only *_informal.md files; this step silently widens the net, creating an inconsistency that could hide a genuinely missing informal spec.

Suggestion: Narrow the glob to match the established naming convention:

all_specs= [os.path.basename(p) forpinglob.glob(os.path.join(specs_dir, "*_informal.md"))]

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.

Fixed in 39ac0ad — changed glob.glob(... "*.md") to glob.glob(... "*_informal.md") so the validation is consistent with the count step and won't match incidental markdown files.

Comment thread.github/workflows/fv-docs-validation.yml
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

- Narrow glob from *.md to *_informal.md to prevent false-positive matches
- Add empty-keywords guard to skip targets whose name has only short tokens
(avoids vacuous all() returning True on empty list)
- Change ::warning:: to ::error:: + sys.exit(1) so missing specs block CI
- Remove redundant keywords[0] guard (now handled by the empty-keywords check)
Agent-Logs-Url: https://github.com/microsoft/testfx/sessions/950eb316-fac6-464f-8197-0054dfa30e41
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>

CopilotAI commented Apr 30, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

All three correctness issues addressed in 39ac0ad:

  • *.md*_informal.md in the spec glob
  • Empty-keywords guard added before all() match
  • Missing spec diagnostic upgraded from ::warning:: to ::error:: + sys.exit(1)

@Evangelink
Amaury Levé (Evangelink) merged commit 485bb51 into mainApr 30, 2026
2 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the lean-squad/task9-fv-docs-ci-2026-04-27-fcf8710c1c8b58c4 branch April 30, 2026 09:29
Amaury Levé (Evangelink) added a commit that referenced this pull request May 12, 2026
… REPORT.md (#7936)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Sign up for freeto 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.

[Lean Squad] feat(ci): Task 9 — FV docs validation workflow + updated REPORT.md

3 participants

@Evangelink
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

[Lean Squad] feat(ci): Task 9 — FV docs validation workflow + updated REPORT.md - #7936

Merged
Amaury Levé (Evangelink) merged 3 commits into
mainfrom
lean-squad/task9-fv-docs-ci-2026-04-27-fcf8710c1c8b58c4
Apr 30, 2026
Merged

[Lean Squad] feat(ci): Task 9 — FV docs validation workflow + updated REPORT.md#7936
Amaury Levé (Evangelink) merged 3 commits into
mainfrom
lean-squad/task9-fv-docs-ci-2026-04-27-fcf8710c1c8b58c4

Conversation

@Evangelink

@EvangelinkAmaury Levé (Evangelink) commented Apr 29, 2026

Copy link
Copy Markdown
Member

Add .github/workflows/fv-docs-validation.yml: a CI workflow that validates
the structural integrity of formal-verification/ artifacts on every PR or
push that touches formal-verification/**.

Checks performed:

  • Required top-level FV docs present (RESEARCH.md, TARGETS.md,
    CORRESPONDENCE.md, CRITIQUE.md, REPORT.md)
  • Lean project files present (lakefile.toml, lean-toolchain, README.md)
  • lean-toolchain is non-empty and well-formed
  • 🔬 Lean Squad disclosure present in top-level docs
  • specs/ directory exists
  • Phase-2+ targets in TARGETS.md each have an informal spec in specs/
    (keyword-based matching handles CamelCase name decomposition)

Also update formal-verification/REPORT.md: add run history for the
2026-04-27 runs, expand target table with new targets, and document the
Lean toolchain blocker.

�� Lean Squad — automated formal verification agent
Run: https://github.com/microsoft/testfx/actions/runs/24986088168

Co-authored-by: Copilot 223556219+Copilot@users.noreply.github.com

Fixes#7861

Add .github/workflows/fv-docs-validation.yml: a CI workflow that validates
the structural integrity of formal-verification/ artifacts on every PR or
push that touches formal-verification/**.
Checks performed:
- Required top-level FV docs present (RESEARCH.md, TARGETS.md,
CORRESPONDENCE.md, CRITIQUE.md, REPORT.md)
- Lean project files present (lakefile.toml, lean-toolchain, README.md)
- lean-toolchain is non-empty and well-formed
- 🔬 Lean Squad disclosure present in top-level docs
- specs/ directory exists
- Phase-2+ targets in TARGETS.md each have an informal spec in specs/
(keyword-based matching handles CamelCase name decomposition)
Also update formal-verification/REPORT.md: add run history for the
2026-04-27 runs, expand target table with new targets, and document the
Lean toolchain blocker.
�� Lean Squad — automated formal verification agent
Run: https://github.com/microsoft/testfx/actions/runs/24986088168
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings April 29, 2026 16:27

CopilotAI 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 CI validation for the formal-verification/ artifact structure and updates FV reporting to reflect recent runs and current blockers, helping keep Lean Squad formal-verification documentation consistent over time.

Changes:

  • Introduce a GitHub Actions workflow that validates required FV docs, Lean project scaffolding, and basic TARGETS/specs consistency on PRs/pushes affecting formal-verification/**.
  • Update formal-verification/REPORT.md with refreshed status/summary and additional run history entries.
Show a summary per file
FileDescription
formal-verification/REPORT.mdUpdates FV status/summary text and adds 2026-04-27 run history entries.
.github/workflows/fv-docs-validation.ymlNew CI workflow to validate presence/shape of FV docs, Lean project files, and Phase-2+ informal spec alignment.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 3

Comment thread.github/workflows/fv-docs-validation.yml Outdated
Comment thread.github/workflows/fv-docs-validation.yml Outdated
Comment thread.github/workflows/fv-docs-validation.yml Outdated
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings April 30, 2026 07:19

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

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 3

Comment on lines +7 to 16
**Phase**: Early — Research expanded to 7 targets; informal specs extracted for `ArgumentArity` (merged) and `CommandLineParser.TryUnescape` (PR open). CI automation maturing. Lean toolchain blocked in CI runner; Task 3+ deferred.

## Summary

The Lean Squad has surveyed the `microsoft/testfx` codebase and identified **seven** high-quality FV targets. Two informal specifications have been extracted. The Lean toolchain cannot currently be installed in the runner environment due to network restrictions.
The Lean Squad has surveyed the `microsoft/testfx` codebase and identified **seven** high-quality FV targets in the command-line infrastructure and filter logic of Microsoft.Testing.Platform. All targets are pure or near-pure functions with clear algebraic properties, making them suitable for Lean 4 formal verification.

Key findings:
- **`ArgumentArity`**: informal spec extracted (14 properties, 4 groups). Constructor does not enforce `Min ≤ Max`; `CommandLineOption` enforces this on construction, acting as the real guard.
- **`ArgumentArity`**: informal spec extracted (14 properties, 4 groups). Constructor does not enforce `Min ≤ Max`; `CommandLineOption` enforces this on construction, acting as the real guard. Correspondence documented.
- **`CommandLineParser.TryUnescape`**: informal spec extracted (24 properties, 5 groups, 2 confirmed bugs for single-char quote inputs). PR open.
- **New targets identified**: `ResponseFileHelper.SplitCommandLine` (pure tokeniser) and `TreeNodeFilter.MatchFilterPattern` (Boolean algebra — ideal for structural induction proofs of De Morgan, double negation, idempotence).

CopilotAIApr 30, 2026

Copy link

Choose a reason for hiding this comment

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

The status/summary bullets appear out of date with the current FV artifacts: TARGETS.md lists several Phase-2 targets beyond just ArgumentArity and TryUnescape (e.g., ParseOptionAndSeparators, SplitCommandLine, TreeNodeFilter.MatchFilterPattern), and formal-verification/specs/ already contains additional *_informal.md files. Please update this section to reflect the actual set of extracted informal specs (or adjust phases elsewhere so the report is consistent).

Copilot uses AI. Check for mistakes.
Comment on lines +79 to +92
- name: Check FV 🔬 disclosure in top-level docs
run: |
FAILED=0
for doc in RESEARCH.md TARGETS.md CORRESPONDENCE.md CRITIQUE.md REPORT.md; do
if ! grep -q "🔬" "formal-verification/${doc}"; then
echo "::error file=formal-verification/${doc}::FV document missing 🔬 Lean Squad disclosure: ${doc}"
FAILED=1
else
echo "✅ formal-verification/${doc} has 🔬 disclosure"
fi
done
if [ "$FAILED" -ne 0 ]; then
exit 1
fi

CopilotAIApr 30, 2026

Copy link

Choose a reason for hiding this comment

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

This step fails the workflow if any required doc is missing the 🔬 disclosure marker, but the PR description/issue states the disclosure check should be warning-only (non-blocking). Consider emitting ::warning (and not exiting nonzero) so the workflow behavior matches the documented intent.

Copilot uses AI. Check for mistakes.
Comment on lines +62 to +71
TOOLCHAIN="$(tr -d '\r\n' < formal-verification/lean/lean-toolchain)"
if [ -z "$TOOLCHAIN" ]; then
echo "::error file=formal-verification/lean/lean-toolchain::lean-toolchain file is empty"
exit 1
fi

if [[ "$TOOLCHAIN" =~ [[:space:]] ]]; then
echo "::error file=formal-verification/lean/lean-toolchain::lean-toolchain must not contain whitespace"
exit 1
fi

CopilotAIApr 30, 2026

Copy link

Choose a reason for hiding this comment

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

The lean-toolchain validation strips all newlines (tr -d '\r\n'), so a malformed multi-line lean-toolchain file would be concatenated and could still pass the whitespace/regex checks. If the goal is to enforce a single well-formed toolchain spec, check that the file contains exactly one non-empty line (and fail if there are extra lines or trailing whitespace) before validating the pattern.

Copilot uses AI. Check for mistakes.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Summary

Workflow: Expert Code Reviewer
Date: 2026-04-30
Repository: microsoft/testfx

Key Findings

The two changed files are a new GitHub Actions workflow (.github/workflows/fv-docs-validation.yml) and a documentation update (formal-verification/REPORT.md). No production C# code is changed.

Correctness issues in the CI workflow — all in the final Python step:

  1. Missing spec check emits ::warning:: instead of ::error:: (Line 141) — This is already silently misfiring: TreeNodeFilter.MatchFilterPattern is a Phase-2 target in TARGETS.md but has no corresponding file in formal-verification/specs/. The workflow reports success. The purpose of this step — to gate PRs that forget to add informal specs — is completely unenforced. Change to ::error:: + sys.exit(1).

  2. Spec glob uses *.md instead of *_informal.md (Line 123) — The prior step counts *_informal.md files, but the validation step considers all .md files in specs/. Any incidental Markdown (README, notes) would satisfy a match, hiding a genuinely missing spec.

  3. Vacuous all() on empty keyword list (Line 132) — For any target whose name decomposes entirely into tokens shorter than 3 characters, all(kw in s for kw in []) returns True for every spec file, so the target appears validated regardless of actual coverage.

Positive Observations

  • The workflow correctly scopes permissions to contents: read.
  • The shell steps for checking file existence, lean-toolchain format, and 🔬 disclosure are solid and correctly use exit 1 to fail CI.
  • Hardcoded loop variables in shell steps eliminate any injection risk.

Recommendations

Fix the three Python-step correctness bugs before merging. The most critical is converting the missing-spec diagnostic from ::warning:: to a hard failure; the other two address false-positive scenarios.


Generated by Expert Code Reviewer

🧠 Reviewed by Expert Code Reviewer 🧠

Comment thread.github/workflows/fv-docs-validation.yml Outdated
parts = re.sub(r'([a-z])([A-Z])', r'\1_\2', name)
return [w.lower() for w in re.split(r'[._\s]+', parts) if len(w) >= 3]

all_specs = [os.path.basename(p) for p in glob.glob(os.path.join(specs_dir, "*.md"))]

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

[Correctness]glob.glob(... "*.md") collects all Markdown files in specs/, not just *_informal.md files. Any incidental .md file (e.g., a future README.md or NOTES.md placed in that directory) would be treated as a candidate spec, producing false-positive matches.

Impact: The step directly above counts only *_informal.md files; this step silently widens the net, creating an inconsistency that could hide a genuinely missing informal spec.

Suggestion: Narrow the glob to match the established naming convention:

all_specs= [os.path.basename(p) forpinglob.glob(os.path.join(specs_dir, "*_informal.md"))]

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.

Fixed in 39ac0ad — changed glob.glob(... "*.md") to glob.glob(... "*_informal.md") so the validation is consistent with the count step and won't match incidental markdown files.

Comment thread.github/workflows/fv-docs-validation.yml
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

- Narrow glob from *.md to *_informal.md to prevent false-positive matches
- Add empty-keywords guard to skip targets whose name has only short tokens
(avoids vacuous all() returning True on empty list)
- Change ::warning:: to ::error:: + sys.exit(1) so missing specs block CI
- Remove redundant keywords[0] guard (now handled by the empty-keywords check)
Agent-Logs-Url: https://github.com/microsoft/testfx/sessions/950eb316-fac6-464f-8197-0054dfa30e41
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>

CopilotAI commented Apr 30, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

All three correctness issues addressed in 39ac0ad:

  • *.md*_informal.md in the spec glob
  • Empty-keywords guard added before all() match
  • Missing spec diagnostic upgraded from ::warning:: to ::error:: + sys.exit(1)

@Evangelink
Amaury Levé (Evangelink) merged commit 485bb51 into mainApr 30, 2026
2 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the lean-squad/task9-fv-docs-ci-2026-04-27-fcf8710c1c8b58c4 branch April 30, 2026 09:29
Amaury Levé (Evangelink) added a commit that referenced this pull request May 12, 2026
… REPORT.md (#7936)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Sign up for freeto 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.

[Lean Squad] feat(ci): Task 9 — FV docs validation workflow + updated REPORT.md

3 participants

@Evangelink