Skip to content

WIP: Harness resilience — relaxed phase-2 gate, enriched resume diagnostics, timestamped summaries#46

Draft
pruiz wants to merge 7 commits into
masterfrom
harness-resilience-summary-gating
Draft

WIP: Harness resilience — relaxed phase-2 gate, enriched resume diagnostics, timestamped summaries#46
pruiz wants to merge 7 commits into
masterfrom
harness-resilience-summary-gating

Conversation

@pruiz
Copy link
Copy Markdown
Owner

@pruiz pruiz commented Jun 5, 2026

What

Implements the plan in .project/harness-resilience-summary-gating-plan.md to make the run-summary gate actionable for weak models.

Why

make phase-2 with a weak model failed (exit 2) despite producing PENDING findings, because the harness only knew the run was incomplete — it could not tell the model which artifacts were missing. The auto-resume prompt was generic, so a model that thought it was done could not self-diagnose.

Changes

Completion gate (tools/phases/completion.py)

  • check_phase_graceful_completion now returns (bool, list[str]); the list carries human-readable missing-artifact messages consumed by the resume prompt builder.
  • Phase 2 gate relaxes from pending_fresh AND summary_fresh to summary_fresh alone. A legitimate "0 new findings" outcome no longer fails. Phase 3 (counter-analysis) provides the second-line review.
  • build_phase_resume_prompt takes optional failure_details and renders a "Missing required artifacts:" block when given, otherwise keeps the existing generic reassess wording.

Phase prompts (7 files under prompts/)

  • All run-summary paths now use runs/phase-X[-FINDING]-summary-YYYY-MM-DD-HHMMSS.md to prevent overwrites on rerun. Globs in completion.py already use wildcards.

Agent files (5 files under .opencode/agents/)

  • Removed the "run summary ... when practical" hedge. Phase prompts are now the single source of truth for required durable artifacts. A delegating note replaces each removed line.

Runtime callers (tools/codecome/harness.py, tools/codecome/phase_1.py)

  • Unpack the new tuple, preserve the short-circuit on check_phase_graceful_completion, and pass phase_failures (or None) to the resume prompt builder.

Tests (5 test files)

  • Updated graceful-completion assertions to assert on the tuple and on the diagnostic fragments (runs/phase-2-summary, itemdb/evidence/<id>/, itemdb/reports, itemdb/notes/sandbox-plan.md, etc.) so regressions in the human-readable messages are caught.
  • Updated callers that monkeypatch check_phase_graceful_completion to return a tuple.

Verification

  • make tests: 676 passed.
  • Frontmatter check: 16/16 finding files validated.
  • Phase artifact check: all implemented phases pass.

Non-goals

  • Chat mode gating — chat mode has no harness gating.
  • Phase 1 multi-subphase gating — subphase-specific artifact sets preserved; only failure reporting is enriched.
  • Models that hallucinate findings — a model-quality issue, not a harness issue.

WIP checklist for review

  • Confirm the phase-2 gate relaxation matches intent (no new findings = pass).
  • Confirm the failure-detail strings are informative enough for a weak model to act on.
  • Confirm timestamped summary paths are acceptable across all phases.
  • Confirm agent files no longer need a hedge for chat mode.

Summary by CodeRabbit

Release Notes

  • New Features

    • Run summary files now use timestamped filenames to prevent accidental overwrites across multiple phases.
    • Resume prompts now provide specific details about missing artifacts to guide completion efforts.
  • Bug Fixes

    • Improved phase completion logic to be more forgiving when work is interrupted mid-turn.
    • Enhanced diagnostic messaging when resuming interrupted runs.
  • Documentation

    • Updated agent guidance documentation for consistency in artifact requirements and completion criteria.

pruiz added 2 commits June 5, 2026 23:37
…, timestamped summaries

Make the run-summary gate actionable for weak models.

Completion gate
- check_phase_graceful_completion now returns (bool, list[str]); the
  list carries human-readable missing-artifact messages consumed by the
  resume prompt builder.
- Phase 2 gate relaxes from (pending_fresh AND summary_fresh) to
  summary_fresh alone. A legitimate '0 new findings' outcome no longer
  fails. Phase 3 (counter-analysis) provides the second-line review.
- build_phase_resume_prompt takes optional failure_details and renders
  a 'Missing required artifacts:' block when given, otherwise keeps
  the existing generic reassess wording.

Phase prompts
- All run-summary paths now use runs/phase-X[-FINDING]-summary-YYYY-MM-DD-HHMMSS.md
  to prevent overwrites on rerun. Globs in completion.py already use
  wildcards, so the new format is matched by the gate.

Agent files
- Removed the 'run summary ... when practical' hedge from all five
  agent files (auditor, reviewer, validator, exploiter, recon).
  Phase prompts are now the single source of truth for required
  durable artifacts. A delegating note replaces each removed line.

Runtime callers
- harness.py and phase_1.py unpack the new tuple, preserve the
  short-circuit on check_phase_graceful_completion, and pass
  phase_failures (or None) to the resume prompt builder.

Tests
- Updated graceful-completion assertions to assert on the tuple and
  to assert on the diagnostic fragments (runs/phase-2-summary,
  itemdb/evidence/<id>/, itemdb/reports, itemdb/notes/sandbox-plan.md,
  etc.) so regressions in the human-readable messages are caught.
- Updated callers that monkeypatch check_phase_graceful_completion to
  return a tuple.

All 676 tests pass; frontmatter and phase-artifact checks pass.
Records the design rationale and verification checklist for the
harness resilience changes implemented in 7cd8843. Kept on the
feature branch for PR review; the master commit itself ships only
the code changes.
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Jun 5, 2026

Important

Review skipped

Draft detected.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: e61e7638-c217-4813-a6c6-dfeb40eaf746

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch harness-resilience-summary-gating

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

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Jun 5, 2026

Coverage Report

Metric Value
Line Coverage 76.5%
Lines Covered 0 / 0

Download detailed HTML coverage reports per OS/Python from the workflow artifacts.

Generated by pytest-cov on 2026-06-06T10:44:06.797Z

Copy link
Copy Markdown
Owner Author

@pruiz pruiz left a comment

Choose a reason for hiding this comment

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

Review comments added inline. Main theme: align the new “phase prompt is the source of truth for required artifacts” rule with what the completion gates and resume checklists actually enforce.

Comment thread tools/phases/completion.py
Comment thread tools/phases/completion.py
Comment thread tools/phases/completion.py
Comment thread tools/phases/completion.py
Comment thread tools/phases/completion.py
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR improves phase-mode harness resilience by (1) enriching completion-gate diagnostics to make auto-resume actionable, (2) relaxing the Phase 2 completion gate to allow “0 new findings” runs to pass as long as a run summary is produced, and (3) standardizing run-summary filenames across prompts to be timestamped to avoid overwrites.

Changes:

  • check_phase_graceful_completion now returns (ok, failure_details) and Phase 2 gating is relaxed to require only a fresh run summary.
  • Resume prompts can include an explicit “Missing required artifacts” block populated from gate diagnostics.
  • Phase prompts now instruct timestamped run-summary filenames; agent docs remove “when practical” hedges and delegate artifact requirements to phase prompts; tests updated for the tuple return.

Reviewed changes

Copilot reviewed 21 out of 21 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
tools/phases/completion.py Returns (bool, list[str]) from completion gate; relaxes Phase 2 gate; adds failure-detail-driven resume prompt output; updates Phase 2 checklist.
tools/codecome/harness.py Unpacks the new completion-gate tuple and forwards failure details into resume prompts.
tools/codecome/phase_1.py Unpacks the new completion-gate tuple and forwards failure details into resume prompts for subphases.
tests/test_render_settings_propagation.py Updates monkeypatches for the new tuple return shape.
tests/test_phases_completion.py Updates assertions to validate (ok, failures) and adds coverage for Phase 2 relaxed gate + diagnostics + resume prompt rendering.
tests/test_phase_graceful_completion_subphases.py Updates subphase tests for tuple return and validates failure detail presence.
tests/test_phase_1_mid_turn_forgiveness.py Updates mocks to return (ok, failures) tuples.
tests/test_phase_1_codeql_plan_repair.py Updates mocks to return (ok, failures) tuples.
prompts/phase-1a-profile.md Switches run-summary path guidance to timestamped filename.
prompts/phase-1b-recon.md Switches run-summary path guidance to timestamped filename; removes hardcoded summary path mentions.
prompts/phase-1c-sandbox.md Switches run-summary path guidance to timestamped filename; removes hardcoded summary path mentions in prose.
prompts/phase-2-audit.md Switches run-summary path guidance to timestamped filename.
prompts/phase-4-validate.md Switches run-summary path guidance to timestamped filename and updates example.
prompts/phase-5-exploit.md Switches run-summary path guidance to timestamped filename and updates example.
prompts/phase-6-report.md Switches run-summary path guidance to timestamped filename.
.opencode/agents/auditor.md Removes run-summary “when practical” guidance; adds delegation note pointing to phase prompt requirements.
.opencode/agents/reviewer.md Removes run-summary references; adds delegation note pointing to phase prompt requirements.
.opencode/agents/recon.md Removes run-summary references; adds delegation note pointing to phase prompt requirements.
.opencode/agents/exploiter.md Removes run-summary references; adds delegation note pointing to phase prompt requirements.
.opencode/agents/validator.md Removes run-summary references; adds delegation note pointing to phase prompt requirements.
.project/harness-resilience-summary-gating-plan.md Adds the design/implementation plan document for the change set.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread tools/codecome/phase_1.py
Comment thread tools/phases/completion.py
Comment thread tools/phases/completion.py
@greptile-apps
Copy link
Copy Markdown

greptile-apps Bot commented Jun 5, 2026

Greptile Summary

This PR makes the phase harness more resilient for weak models: it relaxes the phase-2 completion gate (run summary alone is now sufficient, allowing a legitimate "0 new findings" outcome to pass), enriches the resume prompt with exact missing-artifact messages, and adds timestamps to all phase summary filenames to prevent overwrites on reruns.

  • check_phase_graceful_completion now returns (bool, list[str]), and both harness.py and phase_1.py are updated to unpack the tuple; agent files and phase prompts are aligned so the phase prompt is the single source of truth for required artifacts.
  • A missing initialization of phase_failures / phase_ok before the retry loop in _run_subphase (phase_1.py) can cause an UnboundLocalError when a permission-error coincides with a mid-turn cutoff — the same defensive initialization present in harness.py was not carried over.

Confidence Score: 3/5

Safe to merge once the phase_1.py initialization gap is fixed; without it, a permission-error + mid-turn cutoff in any phase-1 subphase crashes the harness with an UnboundLocalError instead of gracefully retrying.

The port of the new tuple-return pattern to _run_subphase in phase_1.py omits the two defensive variable initializations (phase_failures = [], phase_ok = False) that harness.py correctly adds before its retry loop. When a model stops mid-turn while a permission error is active, the assignment inside the last_permission_error is None guard is skipped, but the retry predicate still evaluates phase_failures and raises UnboundLocalError. All other changes are well-structured and test coverage for the new diagnostics is solid.

tools/codecome/phase_1.py — missing variable initialization before the retry loop.

Important Files Changed

Filename Overview
tools/codecome/phase_1.py Missing initialization of phase_failures and phase_ok before the retry loop — phase_failures can be unbound when a permission-error + mid-turn path fires, triggering an UnboundLocalError in the resume prompt builder.
tools/phases/completion.py Core change: check_phase_graceful_completion returns tuple[bool, list[str]]; phase-2 gate relaxed to summary_fresh only; build_phase_resume_prompt gains failure_details. Implementation is clean.
tools/codecome/harness.py Correctly unpacks the new tuple, initializes phase_failures: list[str] = [] and phase_ok: bool = False before the retry loop, and passes phase_failures to build_phase_resume_prompt.
tests/test_phases_completion.py Thorough new tests cover phase-2 relaxed gate, per-phase failure details, checklist content, and both resume-prompt wording variants.
tests/test_phase_graceful_completion_subphases.py Updated to unpack the new tuple return and assert on diagnostic message content; adds tests for sandbox artifact paths in phase-1c.

Sequence Diagram

sequenceDiagram
    participant H as harness / phase_1
    participant C as completion.py
    participant R as resume prompt

    H->>H: run attempt → finish_reason
    alt mid-turn AND no permission error
        H->>C: check_phase_graceful_completion(phase, finding, t0)
        C-->>H: (ok, failures)
        alt ok is True
            H->>H: graceful_forgiveness → returncode 0
        else ok is False
            H->>H: "returncode = 2"
            H->>R: "build_phase_resume_prompt(failure_details=failures)"
            R-->>H: Missing required artifacts block
        end
    else terminal-ok
        H->>C: check_phase_graceful_completion(phase, finding, t0)
        C-->>H: (ok, failures)
        alt not ok
            H->>H: "returncode = 2"
            H->>R: "build_phase_resume_prompt(failure_details=failures)"
            R-->>H: Missing required artifacts block
        end
    else permission error present
        H->>H: "returncode = 2 (no artifact check)"
        Note over H: phase_1.py only: phase_failures unbound here
    end
Loading

Comments Outside Diff (1)

  1. tools/codecome/phase_1.py, line 626-645 (link)

    P1 phase_failures / phase_ok unbound in the permission-error + mid-turn path

    phase_ok and phase_failures have no initialization before the while True loop in _run_subphase (unlike harness.py, which declares them at lines 137–138). When last_finish_reason in _FINISH_MID_TURN AND last_permission_error is not None, the inner condition (last_permission_error is None) is False and the assignment on line 631 is never reached. The else: returncode = 2 branch fires, and the retry predicate at line 757 (returncode == 2 and last_finish_reason in _FINISH_MID_TURN) is True — so the loop immediately reaches failure_details=phase_failures if phase_failures else None at line 770, raising UnboundLocalError.

    Add these two initializations immediately after the existing counter declarations (around line 553, before subphase_start_time = time.time()), matching harness.py:

    phase_failures: list[str] = []
    phase_ok: bool = False  # defensive default; assigned in graceful-completion check before use

Reviews (1): Last reviewed commit: "docs: include harness-resilience plan in..." | Re-trigger Greptile

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
tools/codecome/phase_1.py (1)

626-643: ⚠️ Potential issue | 🔴 Critical | ⚡ Quick win

Initialize phase_failures before the mid-turn resume path.

If a subphase stops mid-turn with a permission error, Lines 627-645 skip the graceful-completion call, so phase_failures is never assigned. The auto-resume block still reads it at Line 770, which will raise UnboundLocalError instead of sending the resume prompt.

Suggested fix
     step_finish_count = 0
     transcript_path: Path = Path()
     finish_warning: str | None = None
     subphase_start_time = time.time()
 
@@
     while True:
         attempt_number += 1
+        phase_failures: list[str] = []
         _reset_subagent_state()
         finish_warning = None

Also applies to: 768-770

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tools/codecome/phase_1.py` around lines 626 - 643, The variable
phase_failures can be unbound when the mid-turn resume path skips calling
check_phase_graceful_completion; to fix, initialize phase_failures to a safe
default (e.g., an empty list or None) before the block that checks
finish_warning so it is always defined for the later auto-resume logic that
reads phase_failures; update the code around the finish_warning handling
(reference symbols: phase_failures, finish_warning, last_permission_error,
check_phase_graceful_completion) to set phase_failures = [] (or None) before the
conditional or explicitly assign it in the permission-error branch so the later
auto-resume code can safely use it.
🧹 Nitpick comments (1)
.project/harness-resilience-summary-gating-plan.md (1)

18-18: ⚡ Quick win

Add language identifiers to fenced code blocks to satisfy markdownlint.

These unlabeled fences trigger MD040. Add explicit languages (text, python, bash) so docs lint stays clean.

Also applies to: 112-112, 119-119, 146-146, 150-150, 155-155, 164-164, 178-178, 184-184, 199-199, 205-205, 220-220, 226-226, 241-241, 256-256, 276-276, 296-296

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.project/harness-resilience-summary-gating-plan.md at line 18, Update all
unlabeled fenced code blocks (``` ) in the document by adding explicit language
identifiers (e.g., ```text, ```bash, ```python) so they satisfy markdownlint
MD040; locate every triple-backtick fence in the file (including the instances
noted around lines 112, 119, 146, 150, 155, 164, 178, 184, 199, 205, 220, 226,
241, 256, 276, 296) and replace the opening fence with the appropriate language
token based on the block content.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@tools/codecome/harness.py`:
- Around line 137-138: phase_failures is being initialized once and then reused
across retry attempts, leaking previous-attempt diagnostics into subsequent
resumes; to fix, reinitialize phase_failures = [] at the start of each retry
attempt (i.e., inside the retry loop, before any calls to
check_phase_graceful_completion() or before logic that sets/reads phase_ok) so
each attempt starts with a fresh failures list; apply the same change to the
other places where phase_failures is declared/used to ensure no stale failures
are carried between attempts.

In `@tools/phases/completion.py`:
- Around line 204-226: The code currently returns immediately after appending
the "required phase-1 notes are not all present" failure, which prevents later
checks (sandbox_state_recorded and summary_fresh) from running and leaves
failures incomplete; update the control flow in the function that builds the
failures list (the block that computes fresh_required via _path_is_fresh over
required_artifacts and appends the NOTES_ROOT/... message using
_PHASE1_REQUIRED_ARTIFACT_NAMES) to remove the early return and let execution
continue to evaluate sandbox_state_recorded and summary_fresh so all missing
items are appended to failures, then return once at the end (so
build_phase_resume_prompt receives a complete failure_details list).

---

Outside diff comments:
In `@tools/codecome/phase_1.py`:
- Around line 626-643: The variable phase_failures can be unbound when the
mid-turn resume path skips calling check_phase_graceful_completion; to fix,
initialize phase_failures to a safe default (e.g., an empty list or None) before
the block that checks finish_warning so it is always defined for the later
auto-resume logic that reads phase_failures; update the code around the
finish_warning handling (reference symbols: phase_failures, finish_warning,
last_permission_error, check_phase_graceful_completion) to set phase_failures =
[] (or None) before the conditional or explicitly assign it in the
permission-error branch so the later auto-resume code can safely use it.

---

Nitpick comments:
In @.project/harness-resilience-summary-gating-plan.md:
- Line 18: Update all unlabeled fenced code blocks (``` ) in the document by
adding explicit language identifiers (e.g., ```text, ```bash, ```python) so they
satisfy markdownlint MD040; locate every triple-backtick fence in the file
(including the instances noted around lines 112, 119, 146, 150, 155, 164, 178,
184, 199, 205, 220, 226, 241, 256, 276, 296) and replace the opening fence with
the appropriate language token based on the block content.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: ec9cf21c-483b-4578-9a23-6af534c4bfeb

📥 Commits

Reviewing files that changed from the base of the PR and between f140f4b and 77584e5.

📒 Files selected for processing (21)
  • .opencode/agents/auditor.md
  • .opencode/agents/exploiter.md
  • .opencode/agents/recon.md
  • .opencode/agents/reviewer.md
  • .opencode/agents/validator.md
  • .project/harness-resilience-summary-gating-plan.md
  • prompts/phase-1a-profile.md
  • prompts/phase-1b-recon.md
  • prompts/phase-1c-sandbox.md
  • prompts/phase-2-audit.md
  • prompts/phase-4-validate.md
  • prompts/phase-5-exploit.md
  • prompts/phase-6-report.md
  • tests/test_phase_1_codeql_plan_repair.py
  • tests/test_phase_1_mid_turn_forgiveness.py
  • tests/test_phase_graceful_completion_subphases.py
  • tests/test_phases_completion.py
  • tests/test_render_settings_propagation.py
  • tools/codecome/harness.py
  • tools/codecome/phase_1.py
  • tools/phases/completion.py

Comment thread tools/codecome/harness.py
Comment thread tools/phases/completion.py
pruiz added 3 commits June 6, 2026 00:28
…, 5, 6; align phase 2 glob; honor resume reason

Address PR #46 review feedback (owner + Copilot):

- Subphase gates (1a, 1b, 1c) now also check for a fresh
  runs/phase-X-summary*.md via the new _append_run_summary_check helper
  in tools/phases/completion.py.
- Phase 4 and 5 gates now also check for a fresh
  runs/phase-{4|5}-<finding>-summary*.md.
- Phase 6 gate now also checks for a fresh runs/phase-6-summary*.md.
- Phase 3 resume checklist now includes a run-summary line in
  phase_checklist_lines, matching the already-enforced gate check.
- Phase 2 diagnostic message and glob now use the same pattern
  (no mandatory hyphen after 'summary'): both are
  runs/phase-2-summary*.md.
- build_phase_resume_prompt opening line is no longer a universal
  'Your previous run completed'. A new _resume_opener_for_reason helper
  classifies the recorded reason (infrastructure_error, mid-turn
  cutoffs, finish failures, graceful_forgiveness, terminal-OK with
  missing artifacts, or unknown) and renders a context-specific
  opener.
- tools/codecome/phase_1.py defensively initializes phase_failures
  and phase_ok at the top of _run_subphase, mirroring the pattern
  already established in tools/codecome/harness.py. This eliminates
  the UnboundLocalError risk on the path that builds the resume
  prompt when the run was set to returncode=2 without ever entering
  the graceful-completion branch.

Tests:
- 15 new tests across 5 new classes in
  tests/test_phases_completion.py:
  * TestPhase2GlobStringMatchesDiagnostic
  * TestResumePromptOpenerDistinguishesReasons
  * TestSubphaseGatesRequireRunSummary
  * TestPhase45And6GatesRequireRunSummary
  * TestPhase3ChecklistMentionsRunSummary
- Existing test_resume_prompt_with_failure_details_lists_missing_artifacts
  updated to use the unhyphenated glob fragment.
- tests/test_phase_graceful_completion_subphases.py: positive tests
  now create a fresh runs/phase-1{a,b,c}-summary.md; negative tests
  assert the new summary failure fragment.

make tests: 676 -> 691 pass; pre-existing threat-model.md
check-phase-artifacts warning is unrelated (verified with stash).
Append section 8 to .project/harness-resilience-summary-gating-plan.md
documenting the owner-review-driven expansion:

- Subphase 1a/1b/1c, phase 4, phase 5, and phase 6 gates now also
  check for a fresh run summary.
- Phase 3 resume checklist now includes a run-summary line.
- Phase 2 diagnostic and glob are now consistent (no mandatory
  hyphen).
- build_phase_resume_prompt opener is now context-specific via
  _resume_opener_for_reason.
- tools/codecome/phase_1.py has defensive init of phase_failures
  and phase_ok.

The original plan explicitly deferred subphase summary gating as a
non-goal and did not gate phases 4/5/6 on summary either; the
follow-up section records that the review pushed back and that
this commit resolves the gap.
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 23 out of 23 changed files in this pull request and generated 4 comments.

Comment thread tools/phases/completion.py Outdated
Comment thread tools/phases/completion.py Outdated
Comment thread tools/phases/completion.py Outdated
Comment thread tools/phases/completion.py Outdated
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants