Skip to content

feat(slice-50): Tessl Eval auto-chain + collapsible Findings - #113

Merged
neomatrix369 merged 12 commits into
mainfrom
slice/50-eval-auto-chain
Aug 25, 2026
Merged

feat(slice-50): Tessl Eval auto-chain + collapsible Findings#113
neomatrix369 merged 12 commits into
mainfrom
slice/50-eval-auto-chain

Conversation

@neomatrix369

@neomatrix369 neomatrix369 commented Aug 25, 2026

Copy link
Copy Markdown
Owner

Summary

  • Add Tessl Eval scanner row ("Tessl: Eval"): emitted blocked until Scenario Generation completes and evals/ is populated, then auto-chains with resume/stale handling and project preflight
  • Resolve Tessl --workspace via optional TESSL_WORKSPACE (validated against tessl workspace list) or auto-resolve via whoami + list; invalid overrides are ignored (avoids live Workspace not found)
  • Annotate Tessl user/workspace not found failures with attempted user= / workspace= in row detail and [tessl] logs
  • Pass --workspace on tessl scenario generate so live CLI plugin-path scans succeed
  • CI hygiene: ruff format + mypy no-any-return on workspace pick (str(name).strip())
  • Dashboard detail drawer: Findings section collapsible with rotating ▸ chevron (expanded by default on item select)
  • Docs: STATUS / CHANGELOG / guides aligned for Eval (IMPLEMENTED unit), workspace override semantics, and Findings UX

Outcome

Slice 50 Eval auto-chain is IMPLEMENTED (unit). Live Tessl Eval on the production scan path remains BLOCKED pending TESSL_TOKEN (+ workspace resolution) verification.

Verification

  • GWT-50.0 — Eval row emitted blocked before Scenario Generation
  • GWT-50.1 — Auto-chain when Scenario Gen completed and evals/ populated
  • GWT-50.2 — tessl_run_id / detail / completed (or failed/timed_out)
  • GWT-50.2b — Resume via eval view without re-submitting eval run
  • GWT-50.3 — Scenario Gen re-run marks Eval stale (no cascade)
  • GWT-50.4 / 50.4b — upstream_run_ids from ctx; stay blocked if Scenario Gen failed
  • GWT-50.5 — Score variance does not alone mark failed
  • GWT-50.6 — tessl project create / repair or needs_setup
  • Live Tessl Eval on production scan path (/verify-slice — needs live Tessl credentials)

Test Results

Python (sandbox/tests + guard/tests)

Tests 410 passed (299 sandbox + 111 guard), 0 failed
Duration ~8.3s combined
Coverage (sandbox/ TOTAL) Statements 95.5% · Branches 92.6% (miss 47) — --cov-fail-under=95

CLI (cli/)

Tests 136 passed, 2 failed (discovery fixture / useDefaults — unrelated to Tessl Eval)
Coverage (npm run test:coverage) Statements 98.14% · Branches 85.97% · Functions 95.83% · Lines 98.14%

Quality Gates

Complexity / static analysis

Check Result
Ruff format (sandbox guard scripts) ✅ clean
Ruff check (changed paths) ✅ clean
mypy (sandbox/ guard/) ✅ clean
Pre-push gates (sandbox cov ≥95) ✅ passed on 80c52dc

Notes

  • No docs/plan/gate-evidence/slice-50.json yet — per-tool capture used.
  • Evidence state: IMPLEMENTED (unit); live Eval not VERIFIED.
  • Latest on branch: CI format/mypy/coverage follow-ups through 80c52dc.

Documentation

  • STATUS / CHANGELOG / ARCHITECTURE / design / env guides updated for Eval auto-chain
  • env-vars.md: invalid TESSL_WORKSPACE ignored and auto-resolved
  • CHANGELOG + STATUS updated for collapsible Findings (sync-docs)
  • README / AGENTS.md: no contract change (aligned)

Checklist

  • ./scripts/quality-gates.sh passes locally
  • New tests added or updated (or change is docs-only)
  • Docs updated where applicable
  • No secrets or credentials committed

Complexity

Automatically refreshed by CI for product-code changes.

Scope Tool Result
Python (sandbox/) Radon highest CC 24 (rank D), 382 blocks
CLI (cli/) ESLint 0 function(s) above CC 10
Functions above the JavaScript threshold
  • CLI: no functions exceed cyclomatic complexity 10.

Emit Eval as blocked until Scenario Generation completes and evals/ is
populated, then run eval with resume/stale handling and project preflight.
Align architecture, design, STATUS, env/setup guides, and plan trackers
with the Tessl Eval adapter without claiming live verification.
@github-actions

github-actions Bot commented Aug 25, 2026

Copy link
Copy Markdown

code-review-graph review

Overall risk: 0.55 (MEDIUM) — 111 changed function(s)/class(es), 6 affected flow(s), 28 test gap(s)

Risk-scored changes

Risk Level Symbol Location Tested
0.55 medium sandbox/scan_app.py::_on_scanner_progress sandbox/scan_app.py:279 no
0.40 medium sandbox/scan_app.py::_scan_item_inner sandbox/scan_app.py:182 yes
0.40 medium sandbox/scanners.py::_remember_tessl_identity sandbox/scanners.py:669 no
0.40 medium sandbox/scanners.py::_has_tessl_project_link sandbox/scanners.py:1253 no
0.40 medium sandbox/tests/test_scanners_status.py::_tessl_workspace_cli_ok sandbox/tests/test_scanners_status.py:35 no
0.40 medium sandbox/tests/test_scanners_status.py::_lint_and_quality_ok sandbox/tests/test_scanners_status.py:1048 no
0.40 medium sandbox/tests/test_scanners_status.py::_eval_ok sandbox/tests/test_scanners_status.py:1062 no
0.40 medium sandbox/tests/test_scanners_status.py::test_run_tessl_eval_without_token_returns_needs_setup sandbox/tests/test_scanners_status.py:2348 (test)
0.35 low sandbox/scanners.py::_snyk_collect_errors sandbox/scanners.py:61 no
0.35 low sandbox/scanners.py::_snyk_iter_path_results sandbox/scanners.py:81 no

Affected execution flows

  • scan_item — criticality 0.42, 68 node(s) across 2 file(s)
  • _ignore — criticality 0.36, 2 node(s) across 1 file(s)
  • _on_scanner_progress — criticality 0.29, 5 node(s) across 1 file(s)
  • _on_scanner_done — criticality 0.27, 6 node(s) across 1 file(s)
  • main — criticality 0.26, 5 node(s) across 1 file(s)
  • ...and 1 more affected flow(s)

Test gaps

  • sandbox/scan_app.py::_on_scanner_progress (sandbox/scan_app.py:279)
  • sandbox/scanners.py::_snyk_collect_errors (sandbox/scanners.py:61)
  • sandbox/scanners.py::_snyk_iter_path_results (sandbox/scanners.py:81)
  • sandbox/scanners.py::_snyk_severity_from_score (sandbox/scanners.py:94)
  • sandbox/scanners.py::_snyk_findings_from_path (sandbox/scanners.py:103)
  • ...and 23 more without direct tests

Token savings: this graph-backed report used ~128,270 fewer tokens (~89%) than reading every changed file in full (estimated, chars/4 approximation).


Powered by code-review-graph — local-first analysis; no code leaves the CI runner.

Live Tessl CLI requires --workspace for plugin-path scenario generate;
gate Scenario Gen on TESSL_WORKSPACE instead of failing at the CLI.
TESSL_WORKSPACE is an optional override; default to the personal workspace
from tessl whoami + workspace list (usually the username).
Raise sandbox coverage back above 95% for whoami/list parsing and
eval unmet-workspace needs_setup.
Lets operators collapse long finding lists in the detail panel; larger
chevron rotates on toggle so expand state is obvious.
Document the drawer Findings expand/collapse behaviour shipped in the dashboard.
@neomatrix369 neomatrix369 changed the title feat(slice-50): add Tessl Eval row with Scenario→Eval auto-chain feat(slice-50): Tessl Eval auto-chain + collapsible Findings Aug 25, 2026
Satisfy CI `ruff format --check sandbox guard scripts`.
…errors

Stale Modal overrides caused Workspace not found; validate against workspace
list and surface user=/workspace= on identity failures.
Narrow dict name values with isinstance before returning str | None.
Use str() for picked workspace names and cover annotate/match edge cases.
@neomatrix369
neomatrix369 merged commit 9991e05 into main Aug 25, 2026
15 checks passed
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