Skip to content

fix(deleted-symbols): replace predicate with base_tip - HEAD, drop merge-base, rewrite tests for merge-result model - #2226

Merged
jaylfc merged 2 commits into
devfrom
exec/tsk-ct2c3z
Aug 2, 2026
Merged

fix(deleted-symbols): replace predicate with base_tip - HEAD, drop merge-base, rewrite tests for merge-result model#2226
jaylfc merged 2 commits into
devfrom
exec/tsk-ct2c3z

Conversation

@jaylfc

@jaylfc jaylfc commented Aug 2, 2026

Copy link
Copy Markdown
Owner

Autonomous build of board card tsk-ct2c3z.

  • compute signal = symbols(base_tip) - symbols(HEAD); remove _merge_base
    and mb_symbols entirely
  • keep the merge-ref checkout and Removes-Intentionally waiver
  • rewrite integration tests to model the merge result (merge PR into
    base, run there) instead of checking out the PR head
  • invert test_no_signal_when_dev_unchanged_since_merge_base to expect
    violations when base code is lost in the merge result
  • add probe-3 test: PR deletes a long-merged test file, gate must FAIL
  • fix _find_adding_commit to search base history via git log -S instead
    of the removed mb..base range
  • add permissions contents:read on the job and move github.base_ref into
    env in the workflow

Files:
.github/workflows/deleted-symbols-gate.yml | 41 +++
scripts/check_deleted_symbols.py | 236 +++++++++++++++
tests/test_check_deleted_symbols.py | 442 +++++++++++++++++++++++++++++
3 files changed, 719 insertions(+)

…rge-base, rewrite tests for merge-result model

- compute signal = symbols(base_tip) - symbols(HEAD); remove _merge_base
  and mb_symbols entirely
- keep the merge-ref checkout and Removes-Intentionally waiver
- rewrite integration tests to model the merge result (merge PR into
  base, run there) instead of checking out the PR head
- invert test_no_signal_when_dev_unchanged_since_merge_base to expect
  violations when base code is lost in the merge result
- add probe-3 test: PR deletes a long-merged test file, gate must FAIL
- fix _find_adding_commit to search base history via git log -S instead
  of the removed mb..base range
- add permissions contents:read on the job and move github.base_ref into
  env in the workflow
@coderabbitai

coderabbitai Bot commented Aug 2, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@jaylfc, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 14 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 5793b7ce-53d4-4171-83e4-743390c55f7a

📥 Commits

Reviewing files that changed from the base of the PR and between 8de1e92 and 2dd115e.

📒 Files selected for processing (3)
  • .github/workflows/deleted-symbols-gate.yml
  • scripts/check_deleted_symbols.py
  • tests/test_check_deleted_symbols.py

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@gitar-bot

gitar-bot Bot commented Aug 2, 2026

Copy link
Copy Markdown

Gitar is working

Gitar

@qodo-code-review

Copy link
Copy Markdown

PR Summary by Qodo

Fix deleted-symbols gate to compare base tip vs merge result

🐞 Bug fix 🧪 Tests ⚙️ Configuration changes 🕐 40+ Minutes

Grey Divider

AI Description

• Detect silently deleted Python symbols by diffing base tip symbols vs merge result HEAD
• Add a GitHub Actions gate with an auditable Removes-Intentionally waiver mechanism
• Rewrite tests to model real merge results and cover key regression/probe scenarios
Diagram

graph TD
  A["GitHub PR event"] --> B["Deleted symbols job"] --> C["Checkout (merge ref)"] --> D["Fetch base ref"] --> E["Run check_deleted_symbols.py"] --> F[("Git repo objects")]
  E --> G{{"Signal found?"}} --> H["Fail with symbols + adding commits"]
  G --> I["Pass (clean)"]
  subgraph Legend
    direction LR
    _proc["Process/Step"] ~~~ _dec{{"Decision"}} ~~~ _db[("Repo data")]
  end
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Diff only changed Python files instead of archiving whole refs
  • ➕ Faster on large repos (avoids scanning every .py file at both refs)
  • ➕ Less memory overhead than loading two full tar archives
  • ➖ Harder to get right with renames/moves and deletions without missing symbols
  • ➖ More edge cases around file lists in merge refs vs base refs
2. Use git merge-tree / merge simulation to compute merge result
  • ➕ Does not depend on GitHub’s merge-ref checkout semantics
  • ➕ Could compare an explicit computed merge result against base tip
  • ➖ More complex and easier to diverge from GitHub’s actual merge behavior
  • ➖ Requires careful handling of strategies and config matching CI
3. Track introduced symbols via a persistent index (baseline artifact)
  • ➕ Avoids git history searches (git log -S) during the check
  • ➕ Can support richer metadata and faster lookup
  • ➖ Adds statefulness/artifact management and needs updates on main/dev
  • ➖ More maintenance burden than a pure-git approach

Recommendation: The PR’s approach (base tip symbols minus merge-result HEAD symbols) is the most faithful model for the silent-deletion risk it’s targeting, and the waiver trailer keeps intentional removals auditable. The main tradeoff is performance (full archive scans), but it is simple and robust; consider optimizing to changed files only if runtime becomes an issue.

Files changed (3) +719 / -0

Bug fix (1) +236 / -0
check_deleted_symbols.pyImplement deleted-symbols guard comparing base ref vs HEAD +236/-0

Implement deleted-symbols guard comparing base ref vs HEAD

• Adds a standalone script that archives both the base ref and HEAD, extracts Python def/class names via AST, and flags symbols present on base but missing on HEAD. Reports violations with the base-branch commit that introduced each symbol (git log -S) and supports waivers via a Removes-Intentionally PR trailer or CLI argument.

scripts/check_deleted_symbols.py

Tests (1) +442 / -0
test_check_deleted_symbols.pyAdd unit + integration tests using merge-result repository model +442/-0

Add unit + integration tests using merge-result repository model

• Adds unit tests for symbol extraction, waiver parsing, and signal calculation. Builds synthetic git repos to validate behavior on real merges (merge PR branch into base, then run the check against the pre-merge base tip), including probe coverage for deleting long-merged test files and partial waivers.

tests/test_check_deleted_symbols.py

Other (1) +41 / -0
deleted-symbols-gate.ymlAdd PR workflow gate to detect silently deleted Python symbols +41/-0

Add PR workflow gate to detect silently deleted Python symbols

• Introduces a pull_request workflow for master/dev that checks out full history, fetches the base branch ref, and runs the deleted-symbols guard script. Adds minimal permissions (contents:read) and passes the PR body for waiver parsing.

.github/workflows/deleted-symbols-gate.yml

@jaylfc

jaylfc commented Aug 2, 2026

Copy link
Copy Markdown
Owner Author

Lead verification, per the gate rule: I ran this script from the branch in a constructed scratch repo, all three directions, at the merge-result ref CI checks out.
RED: PR deletes a long-merged test file -> DELETED-SYMBOLS FAIL naming tests/test_lib.py:test_a and test_b, exit 1. This is the exact shape the previous predicate was mathematically blind to.
GREEN: unrelated one-file PR on a moving base -> clean, exit 0 (no stale-branch false positive).
WAIVER: same deletion with Removes-Intentionally lines in PR_BODY -> exit 0.
One cosmetic nit for a later pass, not blocking: the failure message says symbols 'landed on dev after your branch was cut', which is no longer what the predicate measures - they can predate the cut. Merging on green CI + bot adjudication.

@qodo-code-review

qodo-code-review Bot commented Aug 2, 2026

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (1) 📘 Rule violations (0) 📜 Skill insights (0)

Context used
✅ Compliance rules (platform): 35 rules

Grey Divider


Action required

1. Test commits on main ✓ Resolved 🐞 Bug ≡ Correctness
Description
In test_deletes_own_newly_added_code_passes(), the commits that are meant to be on 'pr-branch' are
made on whatever branch is currently checked out (main), so the merge of pr-branch becomes a no-op
and the test doesn’t validate the intended PR-branch add/remove scenario.
Code

tests/test_check_deleted_symbols.py[R199-214]

+        _branch(repo, "pr-branch")
+        # On PR branch: add function_x then remove it.
+        _commit_file(
+            repo, "tinyagentos/foo.py",
+            "def function_a():\n    pass\n\ndef function_x():\n    pass\n",
+            "feat: add function_x",
+        )
+        _commit_file(
+            repo, "tinyagentos/foo.py",
+            "def function_a():\n    pass\n",
+            "refactor: remove function_x",
+        )
+        # Merge PR into main.
+        _checkout(repo, "main")
+        _git(repo, "merge", "pr-branch", "--no-edit")
+
Relevance

●●● Strong

Clear test bug: commits happen on wrong branch, invalidating scenario; similar test-hardening
suggestions were accepted.

PR-#449
PR-#234

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The test claims to commit on the PR branch but never checks it out; in contrast, other tests do,
proving this is an inconsistency that changes the merge behavior to a no-op.

tests/test_check_deleted_symbols.py[188-214]
tests/test_check_deleted_symbols.py[155-177]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
`test_deletes_own_newly_added_code_passes` creates `pr-branch` but never checks it out before committing the “add then remove” changes. Those commits land on `main`, leaving `pr-branch` unchanged at `base_tip`, and `git merge pr-branch` becomes “Already up to date”, so the test doesn’t exercise the merge-result model it claims to.

### Issue Context
Other integration tests in the same file explicitly `_checkout(repo, "pr-branch")` before writing PR commits.

### Fix Focus Areas
- tests/test_check_deleted_symbols.py[199-214]

### Suggested fix
- Insert `_checkout(repo, "pr-branch")` immediately after `_branch(repo, "pr-branch")` in `test_deletes_own_newly_added_code_passes`.
- (Optional hardening) Assert the merge actually changes `HEAD` (e.g., capture pre-merge HEAD sha and ensure it differs after merge) so a future branch/merge mistake fails loudly.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended

2. Hardcoded 'dev' failure text ✓ Resolved 🐞 Bug ⚙ Maintainability
Description
The guard prints a failure message claiming deleted symbols “landed on dev after your branch was
cut” even when the workflow runs for master PRs and even though the script does not compute a
merge-base/branch-cut point, which misleads PR authors about what was detected.
Code

scripts/check_deleted_symbols.py[R223-226]

+        print(
+            f"DELETED-SYMBOLS FAIL: this PR deletes {len(violations)} symbol(s) that "
+            f"landed on dev after your branch was cut:"
+        )
Relevance

●●● Strong

Misleading hardcoded branch text; teams usually accept clearer, accurate failure messages in guard
scripts.

PR-#398

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The workflow is configured for both master and dev, but the script’s failure message hardcodes dev
and describes merge-base semantics the implementation doesn’t perform.

scripts/check_deleted_symbols.py[10-15]
scripts/check_deleted_symbols.py[222-226]
.github/workflows/deleted-symbols-gate.yml[15-18]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
The failure output hardcodes “dev” and implies merge-base/branch-cut semantics, but the workflow triggers on both `master` and `dev`, and the implementation compares `symbols(base_ref)` vs `symbols(HEAD)` without computing a merge base. This makes the user-facing explanation incorrect.

### Issue Context
The workflow passes `--base "origin/$BASE_REF"` where `BASE_REF` is the PR’s actual base branch name.

### Fix Focus Areas
- scripts/check_deleted_symbols.py[10-15]
- scripts/check_deleted_symbols.py[223-226]
- .github/workflows/deleted-symbols-gate.yml[15-18]

### Suggested fix
- Update the failure message to reference `base_ref` (or a friendlier normalized base branch name) instead of hardcoding “dev”.
- Remove/adjust “after your branch was cut” language unless you reintroduce merge-base computation.
- Consider aligning the top-of-file docstring/commentary to the actual algorithm (base tip vs merge result).

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


3. Per-symbol git log spawning 🐞 Bug ➹ Performance
Description
For every missing symbol, check_deleted_symbols() runs a separate git log -S search (and sometimes a
second fallback search), which can scale poorly when the merge result drops many symbols (e.g.,
large refactors or file deletions).
Code

scripts/check_deleted_symbols.py[R185-193]

+    violations: list[Violation] = []
+    waived_in_signal: set[str] = set()
+    for symbol, kind in signal.items():
+        if symbol in waived_set:
+            waived_in_signal.add(symbol)
+            continue
+        file_path, name = symbol.rsplit(":", 1)
+        added_by = _find_adding_commit(file_path, name, kind, base_ref, repo_root)
+        violations.append(Violation(symbol=symbol, added_by=added_by))
Relevance

●● Moderate

Potential scalability issue, but batching git log is a larger behavioral change; no matching
accepted/rejected precedent found.

PR-#1551
PR-#1531

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The guard loops over every signal symbol and calls a helper that runs git log -S, with a second git
log -S call as a fallback when the first search yields no matches.

scripts/check_deleted_symbols.py[185-193]
scripts/check_deleted_symbols.py[116-133]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
`check_deleted_symbols()` shells out to git once per violation to find the introducing commit. `_find_adding_commit()` itself can run up to two `git log -S` calls (fallback path), so a large number of violations can result in many git processes.

### Issue Context
This runs in CI on PRs; the number of missing symbols can spike during broad refactors or when a whole Python file is deleted.

### Fix Focus Areas
- scripts/check_deleted_symbols.py[185-193]
- scripts/check_deleted_symbols.py[106-133]

### Suggested fix
- Add memoization in `_find_adding_commit` or around it (e.g., cache by `(base_ref, file_path, kind, leaf)`), so repeated lookups don’t respawn git.
- Add `--max-count=1` to the `git log` calls since only the first line is used.
- Optionally, when `len(violations)` exceeds a threshold, skip commit attribution or attribute only the first N symbols and clearly state the truncation in output (to keep runtime bounded).

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Informational

4. Nondeterministic violation ordering ✓ Resolved 🐞 Bug ◔ Observability
Description
Signal computation uses set difference and then iterates the resulting dict, so the order of
reported violations can vary across runs, making CI output noisy and harder to diff.
Code

scripts/check_deleted_symbols.py[R157-160]

+    base_keys = set(base_symbols.keys())
+    head_keys = set(head_symbols.keys())
+    signal_keys = base_keys - head_keys
+    return {k: base_symbols[k] for k in signal_keys}
Relevance

●● Moderate

CI output stability seems desirable, but no close precedent found for ordering/sorting violations in
scripts.

PR-#398

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The code constructs the signal from a set difference (unstable ordering) and then iterates it to
build/print violations.

scripts/check_deleted_symbols.py[157-160]
scripts/check_deleted_symbols.py[185-193]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
`find_signal_symbols()` builds `signal_keys` as a set difference and then returns a dict from that set iteration. Since set iteration order can vary across processes, the printed violation list order can change run-to-run.

### Issue Context
This doesn’t change pass/fail, but it makes logs/annotations unstable.

### Fix Focus Areas
- scripts/check_deleted_symbols.py[157-160]
- scripts/check_deleted_symbols.py[185-193]

### Suggested fix
- Build the signal dict deterministically, e.g. iterate over `sorted(signal_keys)`.
- Alternatively, collect violations then `violations.sort(key=lambda v: v.symbol)` before printing.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

To customize comments, go to the Qodo configuration screen, or learn more in the docs.

Qodo Logo

Comment thread tests/test_check_deleted_symbols.py
Comment thread scripts/check_deleted_symbols.py
Comment on lines +185 to +193
violations: list[Violation] = []
waived_in_signal: set[str] = set()
for symbol, kind in signal.items():
if symbol in waived_set:
waived_in_signal.add(symbol)
continue
file_path, name = symbol.rsplit(":", 1)
added_by = _find_adding_commit(file_path, name, kind, base_ref, repo_root)
violations.append(Violation(symbol=symbol, added_by=added_by))

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Remediation recommended

3. Per-symbol git log spawning 🐞 Bug ➹ Performance

For every missing symbol, check_deleted_symbols() runs a separate git log -S search (and sometimes a
second fallback search), which can scale poorly when the merge result drops many symbols (e.g.,
large refactors or file deletions).
Agent Prompt
### Issue description
`check_deleted_symbols()` shells out to git once per violation to find the introducing commit. `_find_adding_commit()` itself can run up to two `git log -S` calls (fallback path), so a large number of violations can result in many git processes.

### Issue Context
This runs in CI on PRs; the number of missing symbols can spike during broad refactors or when a whole Python file is deleted.

### Fix Focus Areas
- scripts/check_deleted_symbols.py[185-193]
- scripts/check_deleted_symbols.py[106-133]

### Suggested fix
- Add memoization in `_find_adding_commit` or around it (e.g., cache by `(base_ref, file_path, kind, leaf)`), so repeated lookups don’t respawn git.
- Add `--max-count=1` to the `git log` calls since only the first line is used.
- Optionally, when `len(violations)` exceeds a threshold, skip commit attribution or attribute only the first N symbols and clearly state the truncation in output (to keep runtime bounded).

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment thread scripts/check_deleted_symbols.py
@jaylfc

jaylfc commented Aug 2, 2026

Copy link
Copy Markdown
Owner Author

nemotron-ultra-kilo review

VERDICT: BLOCKING - Fundamental algorithmic flaw causes false positives; missing merge-base comparison defeats the tool's stated purpose.

  • scripts/check_deleted_symbols.py:10-17: Algorithm compares only target-head vs HEAD (two-point), but the stated goal requires three-point comparison (target-head vs HEAD vs merge-base). Current logic flags ANY symbol missing from PR that exists on target, including symbols that existed at merge-base and were deliberately deleted by the PR. This defeats the "silently delete code added after branch cut" purpose.

  • scripts/check_deleted_symbols.py:113-141: _find_adding_commit searches only base_ref history with git log -S on leaf name + paren. Misses symbols added via merge commits, matches false positives in comments/strings, and fallback search without paren is overly broad.

  • scripts/check_deleted_symbols.py:53-57: _run_git lacks timeout; subprocess.run(check=True) can hang indefinitely on git failures or large repos.

  • .github/workflows/deleted-symbols-gate.yml:23,27: Uses actions/checkout@v7 and actions/setup-python@v7 — these versions may not exist (current stable are v4/v5 as of 2026).

  • tests/test_check_deleted_symbols.py:292-313: Test test_no_signal_when_dev_unchanged_since_merge_base expects a violation when PR deletes code existing at merge-base with no dev changes — this asserts the buggy two-point behavior as correct.

  • tests/test_check_deleted_symbols.py:315-341: Test test_probe3_pr_deletes_long_merged_test_file_fails similarly expects failure for deleting a file that existed at merge-base ("long merged"), confirming the algorithm flags intentional deletions as violations.

  • tests/test_check_deleted_symbols.py: Missing tests for: renamed/moved symbols, symbols added in merge commits, empty/syntax-error files, concurrent modifications on same symbol, and waiver parsing edge cases (trailer case sensitivity, whitespace).
    VERDICT: BLOCKING - Fundamental algorithmic flaw causes false positives; missing merge-base comparison defeats the tool's stated purpose.

  • scripts/check_deleted_symbols.py:10-17: Algorithm compares only target-head vs HEAD (two-point), but the stated goal requires three-point comparison (target-head vs HEAD vs merge-base). Current logic flags ANY symbol missing from PR that exists on target, including symbols that existed at merge-base and were deliberately deleted by the PR. This defeats the "silently delete code added after branch cut" purpose.

  • scripts/check_deleted_symbols.py:113-141: _find_adding_commit searches only base_ref history with git log -S on leaf name + paren. Misses symbols added via merge commits, matches false positives in comments/strings, and fallback search without paren is overly broad.

  • scripts/check_deleted_symbols.py:53-57: _run_git lacks timeout; subprocess.run(check=True) can hang indefinitely on git failures or large repos.

  • .github/workflows/deleted-symbols-gate.yml:23,27: Uses actions/checkout@v7 and actions/setup-python@v7 — these versions may not exist (current stable are v4/v5 as of 2026).

  • tests/test_check_deleted_symbols.py:292-313: Test test_no_signal_when_dev_unchanged_since_merge_base expects a violation when PR deletes code existing at merge-base with no dev changes — this asserts the buggy two-point behavior as correct.

  • tests/test_check_deleted_symbols.py:315-341: Test test_probe3_pr_deletes_long_merged_test_file_fails similarly expects failure for deleting a file that existed at merge-base ("long merged"), confirming the algorithm flags intentional deletions as violations.

  • tests/test_check_deleted_symbols.py: Missing tests for: renamed/moved symbols, symbols added in merge commits, empty/syntax-error files, concurrent modifications on same symbol, and waiver parsing edge cases (trailer case sensitivity, whitespace).

Automated first-pass review by the nemotron-ultra-kilo lane. The lead still reviews before merge.

@jaylfc

jaylfc commented Aug 2, 2026

Copy link
Copy Markdown
Owner Author

nemotron-ultra-orB review

VERDICT: Strong implementation with good test coverage; one correctness concern and minor style nits.

  • scripts/check_deleted_symbols.py:100: _extract_symbols uses ast.iter_child_nodes which only visits immediate children. The recursive visit call handles nested defs/classes in function bodies, but misses symbols inside if/try/with blocks or other compound statements since those don't create new scope nodes in the AST. Nested functions inside blocks are visited (they're in body), but this is fragile. Consider using ast.walk or a proper NodeVisitor subclass.

  • scripts/check_deleted_symbols.py:132: _get_symbols_at_ref uses git archive + tarfile which loads entire repo into memory. For large repos this could OOM. Consider git ls-tree -r --name-only <ref> -- '*.py' + git show <ref>:<path> streaming per file.

  • scripts/check_deleted_symbols.py:154: _find_adding_commit searches for kind leaf(. This fails for async functions (searched as def leaf( but actual is async def leaf() and class definitions without parentheses (fallback handles this). The async case will return "unknown" incorrectly.

  • tests/test_check_deleted_symbols.py: Missing test for async function deletion (covers the bug above). No test for symbols inside nested scopes (if/try/with blocks).

  • .github/workflows/deleted-symbols-gate.yml:28: actions/checkout@v7 doesn't exist yet (latest is v4). Will fail at runtime.

  • Style: scripts/check_deleted_symbols.py:54 REPO_ROOT uses Path(__file__).resolve().parent.parent - brittle if script moves. Consider git rev-parse --show-toplevel.

No blocking issues beyond the async function detection bug and the checkout version.

Automated first-pass review by the nemotron-ultra-orB lane. The lead still reviews before merge.

@jaylfc

jaylfc commented Aug 2, 2026

Copy link
Copy Markdown
Owner Author

nemotron-super review

VERDICT: Pass
No blocking issues found.

Automated first-pass review by the nemotron-super lane. The lead still reviews before merge.

…scenario, base-branch wording, deterministic violation order
@jaylfc

jaylfc commented Aug 2, 2026

Copy link
Copy Markdown
Owner Author

Qodo adjudication + folds pushed: (1) REAL - test_deletes_own_newly_added_code_passes committed its PR-branch work on main (_branch creates without checkout; every sibling test has the _checkout call, this one missed it) - fixed, the test now models its scenario and still passes for the right reason. (2) REAL-minor - failure text said symbols landed on dev after the branch cut, which is not what the predicate measures - reworded to base-branch-vs-merge-result. (3) Performance note on per-symbol git log -S - real but deletions are rare; noted, not folded. (4) REAL-trivial - violation order now sorted for stable CI output. 23/23 tests green locally. Kilo check is the rate-limited fake-red (no review content) - this push retriggers it; merging on a real kilo result + green CI.

@qodo-code-review

Copy link
Copy Markdown

Qodo adjudication + folds pushed: (1) REAL - test_deletes_own_newly_added_code_passes committed its PR-branch work on main (_branch creates without checkout; every sibling test has the _checkout call, this one missed it) - fixed, the test now models its scenario and still passes for the right reason. (2) REAL-minor - failure text said symbols landed on dev after the branch cut, which is not what the predicate measures - reworded to base-branch-vs-merge-result. (3) Performance note on per-symbol git log -S - real but deletions are rare; noted, not folded. (4) REAL-trivial - violation order now sorted for stable CI output. 23/23 tests green locally. Kilo check is the rate-limited fake-red (no review content) - this push retriggers it; merging on a real kilo result + green CI.

Thanks for the update. The changes address finding 1, finding 2, and finding 4; finding 3 remains a documented performance consideration. The reported 23/23 green tests are consistent with the revised diff.

@jaylfc
jaylfc merged commit f9f82d7 into dev Aug 2, 2026
18 of 19 checks passed
@jaylfc
jaylfc deleted the exec/tsk-ct2c3z branch August 2, 2026 08:10
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.

1 participant