Skip to content

fix: Jinja template crash on phases_completed=None, submodule updates#113

Open
ElNiak wants to merge 56 commits intoproductionfrom
refactor/ivy-lsp-cleanup
Open

fix: Jinja template crash on phases_completed=None, submodule updates#113
ElNiak wants to merge 56 commits intoproductionfrom
refactor/ivy-lsp-cleanup

Conversation

@ElNiak
Copy link
Owner

@ElNiak ElNiak commented Mar 17, 2026

Summary

  • C1 fix: Guard phases_completed=None in experiment_report.md.jinja (lines 57, 66) — .values() was called on None when services lack phase data, causing TypeError and silent fallback to basic markdown renderer
  • Updates panther_ivy submodule with:
    • 6 rfc9000 requirements section-key alignment fixes
    • ivy-lsp gitignore for temp dir leakage
    • panther-ivy-plugin LSP env config in marketplace.json, version bump, hook scoping
    • classify_endpoint_type segment-based matching fix
    • .ivyworkspace v2 with scope_detection: auto

Test plan

  • Verify Jinja template renders correctly with phases_completed=None (returns "N/A")
  • Verify Jinja template renders correctly with valid dict (returns "2/3" format)
  • Run pytest tests/unit/ -n auto -m unit — expect 1084+ passed, no new regressions
  • Confirm classify_endpoint_type("quic_client_test_0rtt_mim_replay", "server") returns "client"

Summary by Sourcery

Handle missing phase data safely in experiment reports, adjust Jinja environment for Markdown output, and update Ivy-related documentation and comments for clarity.

Bug Fixes:

  • Prevent crashes in experiment report Jinja template when service phase data is missing or None by rendering a fallback value instead.

Enhancements:

  • Include a phases summary column in the basic Markdown experiment report output, showing completed vs total phases or N/A when unavailable.
  • Disable Jinja autoescaping for Markdown experiment templates to avoid corrupting rendered variable content.
  • Clarify observer, experiment manager, status collector, and metrics observer behavior via improved comments and docstrings around state tracking, event emission, and timing semantics.

Documentation:

  • Add a detailed Ivy tooling ecosystem evaluation document under docs/superpowers/specs to capture current capabilities and gaps.

ElNiak added 23 commits March 12, 2026 22:45
Updates panther_ivy to feat/mcp-tool-fixes-and-requirements which includes:
- Fixed 6 issues in ivy-tools MCP server (ISS-001/002/003/005/006/008)
- All 19 MCP tools verified working via live calls
- Added RFC 9000 requirements manifest (101 requirements)
- Auto-detect local ivy-lsp source for development
Update panther_ivy submodule with the new Pattern Library featuring:
- 13 reusable .ivy template files for 7 formal patterns
- Pattern detection engine with cross-reference validation
- 2 new MCP tools (ivy_pattern_analysis, ivy_pattern_scaffold)
- /nct-add-pattern command and pattern-library skill
- Enhanced coverage gaps, smart suggestions, and LSP diagnostics
Picks up ivy-lsp changes: semantic edge wiring (COVERS, HAS_PARAM,
RETURNS_TYPE, INCLUDES), smart suggestions fix, per-action state var
filtering, and three new MCP tools (ivy_generate_manifest,
ivy_scaffold_check, ivy_quality_gate).
Requirements YAML cleanup, ivy-lsp bug fixes, plugin hook hardening.
Batch 1 (P0): Fix broken wiring
- Fix api/ broken relative imports (api/_shared.py)
- Wire all 25 MCP tools into Claude Code plugin
- Update ivy-tooling-guide skill with complete tool mapping

Batch 2 (P1): Quality debt
- Modularize mcp_server.py (2225 → 728 lines + tools/ package)
- Deduplicate shell script workspace detection (workspace-common.sh)
- Fix PantherIvyVersion docstring (class is used, not dead code)
…lignment)

Python tester: remove shadowed adapt_environment_paths, consolidate 3 protocol
name methods to 1, merge duplicate output patterns, remove dead build_tests().
Plugin: fix README inventory counts, CSO-optimize all 15 skill descriptions,
add Red Flags/Integration/Common Mistakes sections to process skills,
normalize skill name casing to kebab-case.
Update panther_ivy submodule with MCP tool consolidation (25→15),
plugin surface reduction (agents 9→4, skills 14→6, commands 6→5),
counterexample parser, per-isolate caching, and coverage diff mode.

Add strategic evaluation document comparing Ivy tooling to state of
the art across 5 dimensions (code intelligence, verification,
traceability, AI-assisted specification, protocol analysis).
ivy-lsp: fix verify cache race, diagnostic layer errors, model init retry,
compile path bug, pattern mode validation, logging, quality gate OSError,
coverage diff truncation, off-by-one in pattern library, stale tool names
in tests. Add counterexample parser, verification cache, and traceability
tool tests.

panther-ivy-plugin: fix shell injection in hooks, JSON parsing in hooks,
brace counting with comment stripping, stale MCP tool names in agents/
skills/commands/READMEs, component counts and version.
Updates submodule pointers for panther-ivy-plugin and ivy-lsp with fixes
for all 18 issues from the plugin evaluation report:

Plugin docs: tool name alignment, skill/agent listing, plugin.json fields,
version bump to 0.5.0, Stop hook for session summary.

Server: cross-reference fuzzy matching, symbol disambiguation with protocol
scoping, coverage tag normalization, hover SemanticModel fallback,
test_file filtering, output size limits, workDoneProgress capability guard,
individual tool aliases for backward compatibility.
…iew fixes)

Evaluation doc:
- TLA+: "Shipping (SANY-based)" not "In development"
- ProVerif: "Partial" not "Full" LSP
- Tamarin: note web prover provides exploration

Submodule (panther_ivy):
- Fix classify_endpoint_type vs _extract_test_directory_from_name divergence
- Fix docstrings, add edge case tests, clean unused imports
- Fix pattern catalog detection markers
LSP: 17→19 features (add implementation, call_hierarchy to Appendix B).
Patterns: 6→7 types (add include-chain).
Code metrics: analysis_pipeline 874→896 lines, 37→~17 methods;
model.py 252→295 lines; requirement_graph 400+→718 lines.
Note backward-compatibility aliases in Appendix A.
- Fix _extract_test_directory divergence from classify_endpoint_type
- Re-export classify_endpoint_type in api/_shared.py
- Remove 4 duplicate entries from rfc9000_requirements.yaml
…tale comments)

- Revert autoescape=True to False in Jinja env (Markdown, not HTML)
- Switch hardcoded 1/2/3 numbering to bullet points in failure analysis
- Add missing Phases column to fallback markdown reporter
- Restore delegation-pattern "why" context on emit comments
- Fix stale StateManager reference and wrong progress bar comment
- Remove redundant inline comment in metrics_observer
- Document test_name retention and timing-includes-init behavior
- Add file references for backward-compat alias count in eval doc
- Fix pre-existing D212 docstring style warnings in experiment_reporter
The experiment_report.md.jinja template called .values() on
phases_completed without checking for None, causing TypeError
when services lack phase data (the common default case). This
made the Jinja template path silently fall back to basic markdown.

Also updates panther_ivy submodule with:
- rfc9000 requirements section-key alignment (6 mismatches)
- ivy-lsp submodule (gitignore for temp dir leakage)
- panther-ivy-plugin submodule (LSP env config in marketplace.json,
  version bump, hook matcher scoping)
…on doc

- Tool count: 15→17 (adds ivy_verification_dashboard, ivy_generate_manifest)
- Layer list: corrected to match tools/patterns.py canonical 14-layer template
- Line references: updated mcp_server.py, requirement_graph.py, pattern_library.py,
  compiler_adapter.py line numbers; removed bogus visualization.py:602
- Added [RESOLVED] annotations for skills/agents created in this PR
Copilot AI review requested due to automatic review settings March 17, 2026 15:28
@sourcery-ai
Copy link
Contributor

sourcery-ai bot commented Mar 17, 2026

Reviewer's Guide

Fixes crashes in the Jinja experiment report when phases_completed is None, aligns the basic markdown report with the Jinja output, clarifies observer/manager/reporting comments, disables Jinja autoescaping for markdown templates, and updates the panther_ivy tester submodule plus adds Ivy tooling evaluation documentation.

Sequence diagram for experiment report generation with Jinja and fallback

sequenceDiagram
    actor User
    participant ExperimentManager
    participant ExperimentReporter
    participant JinjaEnv
    participant Filesystem as OutputFile

    User->>ExperimentManager: run_experiment()
    ExperimentManager->>ExperimentReporter: generate_reports()
    alt jinja_env_available
        ExperimentReporter->>JinjaEnv: render(experiment_report_template, summary_with_services)
        alt phases_completed_is_dict
            JinjaEnv-->>ExperimentReporter: rendered_markdown with "done/total" phases
        else phases_completed_is_none_or_empty
            JinjaEnv-->>ExperimentReporter: rendered_markdown with "N/A" phases
        end
        ExperimentReporter->>Filesystem: write(markdown_report)
        Filesystem-->>ExperimentReporter: success
        ExperimentReporter-->>ExperimentManager: {experiment_report: True}
    else jinja_env_not_available
        ExperimentReporter->>ExperimentReporter: _generate_basic_markdown_report(summary)
        alt phases_completed_is_dict
            ExperimentReporter->>ExperimentReporter: compute done = sum(values)
            ExperimentReporter->>ExperimentReporter: phases = "done/total"
        else phases_completed_is_none_or_empty
            ExperimentReporter->>ExperimentReporter: phases = "N/A"
        end
        ExperimentReporter->>Filesystem: write(basic_markdown_report)
        Filesystem-->>ExperimentReporter: success
        ExperimentReporter-->>ExperimentManager: {experiment_report: True}
    end
    ExperimentManager-->>User: experiment completed, report available
Loading

Updated class diagram for ExperimentReporter and ServiceHealthSummary

classDiagram
    class ExperimentReporter {
        -Path experiment_dir
        -Optional~str~ experiment_name
        -Optional~Environment~ jinja_env
        -Logger logger
        +ExperimentReporter(experiment_dir, experiment_name)
        +generate_reports() Dict~str, bool~
        -_generate_basic_markdown_report(summary) bool
        +generate_quick_summary() Optional~str~
    }

    class ServiceHealthSummary {
        +str service_name
        +str status
        +bool compilation_succeeded
        +Optional~Dict~str, bool~~ phases_completed
        +Optional~str~ error_summary
        +float output_completeness
        +Optional~str~ test_name
        +to_dict() Dict~str, Any~
    }

    ExperimentReporter --> ServiceHealthSummary : uses in reports
Loading

File-Level Changes

Change Details Files
Prevent experiment report generation from crashing when phases_completed is missing or None and align basic markdown and Jinja outputs for phase reporting.
  • In the basic markdown report, add a Phases column and compute a done/total string when phases_completed is truthy, otherwise render N/A.
  • In the experiment_report.md.jinja template, wrap uses of svc.phases_completed in a conditional so that when it is falsy (including None) the Phases column renders N/A instead of calling .values() on None.
  • Ensure both IUT and tester services tables use the same Phases formatting logic (x/y or N/A).
panther/core/reporting/experiment_reporter.py
panther/core/reporting/templates/experiment_report.md.jinja
Adjust Jinja environment configuration and tweak markdown formatting in the experiment report template.
  • Disable Jinja autoescape for experiment markdown templates because they produce Markdown rather than HTML and autoescaping would corrupt <, >, and &.
  • Inline short docstrings for ExperimentReporter methods to a one-line form for consistency.
  • Change numbered failure-analysis list items in the Jinja template to bullet lists and fix indentation of nested bullets for clearer markdown rendering.
panther/core/reporting/experiment_reporter.py
panther/core/reporting/templates/experiment_report.md.jinja
Clarify behavior and intent of experiment observer, experiment manager events, status collector fields, timing extraction, and metrics observer interest implementation.
  • Expand ExperimentObserver class comments to state that unhandled event types are logged at DEBUG and never error, and clarify that legacy per-environment/service state dictionaries were removed to avoid duplicating orchestration logic while keeping only minimal experiment-level state.
  • Clarify that the ExperimentObserver’s step progress tracking dict is lazily initialized to guard against repeated init calls.
  • Clarify in ExperimentManager that it, not TestCase.run, is responsible for emitting test failed and completed events.
  • Document that ServiceHealthSummary.test_name is retained solely for JSON serialization even though no template renders it.
  • Clarify that test timing extraction intentionally includes initialization overhead by using the timestamp from the first log entry.
  • Remove an unnecessary comment in MetricsObserver.is_interested that merely restated the method behavior.
panther/core/observer/impl/experiment_observer.py
panther/core/experiment_manager.py
panther/core/reporting/status_collector.py
panther/core/reporting/status_collector.py
panther/core/observer/impl/metrics_observer.py
Update Ivy tester submodule and add internal documentation on Ivy tooling ecosystem evaluation.
  • Advance the panther_ivy tester submodule pointer to a version that includes RFC9000 requirement section-key alignment fixes, LSP .gitignore updates, marketplace configuration changes, endpoint classification fix, workspace v2 scope_detection:auto, and new skills/tools mentioned in the PR description.
  • Add a long-form markdown document describing the Ivy tooling ecosystem evaluation, SOTA comparison, strengths, over-engineering analysis, gaps, and priority actions.
panther/plugins/services/testers/panther_ivy
docs/superpowers/specs/2026-03-13-ivy-tooling-evaluation.md

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@github-actions
Copy link

PR Validation Passed

Your changes look good! The quick validation checks have passed:

  • ✅ Code formatting (Black)
  • ✅ Import sorting (isort)
  • ✅ Linting (flake8)
  • ✅ Basic tests

The full CI pipeline will run when this PR is merged or when targeting the main branches.

Copy link
Contributor

@sourcery-ai sourcery-ai bot left a comment

Choose a reason for hiding this comment

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

Hey - I've found 1 issue, and left some high level feedback:

  • In both the Python fallback renderer and the Jinja template, if svc.phases_completed will treat an empty dict as falsy and show "N/A"; if an empty phases dict is a valid state, you may want to distinguish None from {} so that 0/N can be rendered instead of N/A.
  • The phases formatting logic (done/total vs N/A) is now duplicated between _generate_basic_markdown_report and the Jinja template; consider centralizing this into a helper or precomputed field on ServiceHealthSummary to keep behavior consistent.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- In both the Python fallback renderer and the Jinja template, `if svc.phases_completed` will treat an empty dict as falsy and show `"N/A"`; if an empty phases dict is a valid state, you may want to distinguish `None` from `{}` so that 0/N can be rendered instead of `N/A`.
- The phases formatting logic (`done/total` vs `N/A`) is now duplicated between `_generate_basic_markdown_report` and the Jinja template; consider centralizing this into a helper or precomputed field on `ServiceHealthSummary` to keep behavior consistent.

## Individual Comments

### Comment 1
<location path="panther/core/reporting/experiment_reporter.py" line_range="147-149" />
<code_context>
                 trim_blocks=True,
                 lstrip_blocks=True,
-                autoescape=True,
+                # Templates produce Markdown, not HTML — autoescape would
+                # corrupt <, >, & in variable content.
+                autoescape=False,
             )
         else:
</code_context>
<issue_to_address>
**🚨 issue (security):** Disabling Jinja autoescaping for Markdown may open up injection risks for untrusted content.

This fixes `<`, `>` and `&` corruption, but also renders any user-controlled values (e.g. `error_summary`, test names, log paths) completely unescaped. If these Markdown reports are ever rendered as or converted to HTML, that becomes an injection vector. Instead, consider `select_autoescape(['html', 'xml'])` so `.md` stays unescaped, or restrict which fields may contain raw markup and escape the rest explicitly.
</issue_to_address>

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

Comment on lines +147 to +149
# Templates produce Markdown, not HTML — autoescape would
# corrupt <, >, & in variable content.
autoescape=False,
Copy link
Contributor

Choose a reason for hiding this comment

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

🚨 issue (security): Disabling Jinja autoescaping for Markdown may open up injection risks for untrusted content.

This fixes <, > and & corruption, but also renders any user-controlled values (e.g. error_summary, test names, log paths) completely unescaped. If these Markdown reports are ever rendered as or converted to HTML, that becomes an injection vector. Instead, consider select_autoescape(['html', 'xml']) so .md stays unescaped, or restrict which fields may contain raw markup and escape the rest explicitly.

Copy link
Contributor

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

Fixes experiment report generation when a service has phases_completed=None, and updates the panther_ivy submodule to a newer revision with multiple tooling and matching fixes.

Changes:

  • Guard phases_completed access in the Jinja experiment report template to avoid crashing on None.
  • Expand the basic (non-Jinja) Markdown report to include a “Phases” column with N/A fallback.
  • Bump panther_ivy submodule pointer to a newer commit.

Reviewed changes

Copilot reviewed 8 out of 8 changed files in this pull request and generated 7 comments.

Show a summary per file
File Description
panther/plugins/services/testers/panther_ivy Updates the panther_ivy git submodule commit reference.
panther/core/reporting/templates/experiment_report.md.jinja Adds a None guard for phases_completed and adjusts the “failed experiment” Markdown list formatting.
panther/core/reporting/status_collector.py Comment clarifications around serialization and test timing extraction.
panther/core/reporting/experiment_reporter.py Disables Jinja autoescaping; adds “Phases” to the basic Markdown report output and computes phase progress.
panther/core/observer/impl/metrics_observer.py Removes a redundant comment.
panther/core/observer/impl/experiment_observer.py Doc/comment clarifications about observer behavior and progress tracking.
panther/core/experiment_manager.py Comment clarifications about responsibility for emitting lifecycle events.
docs/superpowers/specs/2026-03-13-ivy-tooling-evaluation.md Adds a new tooling evaluation spec document.

You can also share your feedback on Copilot code review. Take the survey.

|---------|--------|-------------|--------|-----------|--------|
{% for svc in iut_services %}
| {{ svc.service_name }} | {{ svc.status }} | {{ 'OK' if svc.compilation_succeeded else 'FAIL' }} | {{ svc.phases_completed.values()|select|list|length }}/{{ svc.phases_completed|length }} | {{ svc.exit_code if svc.exit_code is not none else 'N/A' }} | {{ svc.error_summary or 'None' }} |
| {{ svc.service_name }} | {{ svc.status }} | {{ 'OK' if svc.compilation_succeeded else 'FAIL' }} | {{ (svc.phases_completed.values()|select|list|length ~ '/' ~ svc.phases_completed|length) if svc.phases_completed else 'N/A' }} | {{ svc.exit_code if svc.exit_code is not none else 'N/A' }} | {{ svc.error_summary or 'None' }} |
|---------|--------|-------------|--------|-----------|--------|
{% for svc in tester_services %}
| {{ svc.service_name }} | {{ svc.status }} | {{ 'OK' if svc.compilation_succeeded else 'FAIL' }} | {{ svc.phases_completed.values()|select|list|length }}/{{ svc.phases_completed|length }} | {{ svc.exit_code if svc.exit_code is not none else 'N/A' }} | {{ svc.error_summary or 'None' }} |
| {{ svc.service_name }} | {{ svc.status }} | {{ 'OK' if svc.compilation_succeeded else 'FAIL' }} | {{ (svc.phases_completed.values()|select|list|length ~ '/' ~ svc.phases_completed|length) if svc.phases_completed else 'N/A' }} | {{ svc.exit_code if svc.exit_code is not none else 'N/A' }} | {{ svc.error_summary or 'None' }} |
Comment on lines +147 to +149
# Templates produce Markdown, not HTML — autoescape would
# corrupt <, >, & in variable content.
autoescape=False,
Comment on lines +331 to +337
if svc.phases_completed:
done = sum(
1 for v in svc.phases_completed.values() if v
)
phases = f"{done}/{len(svc.phases_completed)}"
else:
phases = "N/A"
Comment on lines +137 to +139
- **Fast-fail was triggered**: {{ summary.fast_fail.reason }}
{%- if summary.fast_fail.error_category %}
- Error category: {{ summary.fast_fail.error_category }}
- Error category: {{ summary.fast_fail.error_category }}
Comment on lines +145 to +147
- **Failed tests to investigate**:
{%- for test in failed_tests %}
- {{ test.name }}: Check `./{{ test.logs_path }}/test.log`
- {{ test.name }}: Check `./{{ test.logs_path }}/test.log`
Comment on lines +151 to 154
- **Next steps**:
- Review the main experiment log: `./experiment.log`
- Check individual test logs for detailed error information
- Verify configuration parameters in `experiment_config.yaml`
@github-actions
Copy link

PR Validation Passed

Your changes look good! The quick validation checks have passed:

  • ✅ Code formatting (Black)
  • ✅ Import sorting (isort)
  • ✅ Linting (flake8)
  • ✅ Basic tests

The full CI pipeline will run when this PR is merged or when targeting the main branches.

@github-actions
Copy link

PR Validation Passed

Your changes look good! The quick validation checks have passed:

  • ✅ Code formatting (Black)
  • ✅ Import sorting (isort)
  • ✅ Linting (flake8)
  • ✅ Basic tests

The full CI pipeline will run when this PR is merged or when targeting the main branches.

@github-actions
Copy link

PR Validation Passed

Your changes look good! The quick validation checks have passed:

  • ✅ Code formatting (Black)
  • ✅ Import sorting (isort)
  • ✅ Linting (flake8)
  • ✅ Basic tests

The full CI pipeline will run when this PR is merged or when targeting the main branches.

ElNiak added 3 commits March 19, 2026 11:24
Analyzes 7 problem categories found in conversation + debug logs:
- SIGTERM crash from PID cleanup race condition
- JSONDecodeError killing stdio LSP
- 7-minute first-call latency (lazy model build)
- 40% cross-validation disagreement between MCP and LSP
- "server is running" busy state errors

Three-phase fix plan: crash prevention, resilience, correctness.
Address 11 review findings (3 blocking, 3 medium, 5 low):
- Fix 1c: correct pygls patch target (pygls_patches.py, not data_received)
- Fix 2d: include freshness_key parameter in write_model_cache call
- Fix 2a: note FastMCP lifecycle constraints for pre-warming
- Fix 1a: clarify $PPID mechanism, CLAUDE_SESSION_ID doesn't exist
- Fix 1b: add asyncio signal handler guidance for MCP mode
- Fix 3b: clarify workspaceSymbol is query-based, not cursor-based
- Fix 3c: note ivy_query was removed, fix targets semantic model
- Phase 3: explicitly note sub-investigation requirement
- Phasing table: clarify 2b is docs-only
- ivy-lsp: tool consolidation, MCP HTTP sidecar, stdio↔HTTP bridge
- panther-ivy-plugin: consolidate plugins, mcp-bridge mode, skill updates
@github-actions
Copy link

PR Validation Passed

Your changes look good! The quick validation checks have passed:

  • ✅ Code formatting (Black)
  • ✅ Import sorting (isort)
  • ✅ Linting (flake8)
  • ✅ Basic tests

The full CI pipeline will run when this PR is merged or when targeting the main branches.

ElNiak added 2 commits March 19, 2026 12:34
Adds a PreToolUse hook that warns Claude not to call the LSP tool
directly on .ivy files, redirecting to MCP tools and Read/Grep/Glob.
@github-actions
Copy link

PR Validation Passed

Your changes look good! The quick validation checks have passed:

  • ✅ Code formatting (Black)
  • ✅ Import sorting (isort)
  • ✅ Linting (flake8)
  • ✅ Basic tests

The full CI pipeline will run when this PR is merged or when targeting the main branches.

@github-actions
Copy link

PR Validation Passed

Your changes look good! The quick validation checks have passed:

  • ✅ Code formatting (Black)
  • ✅ Import sorting (isort)
  • ✅ Linting (flake8)
  • ✅ Basic tests

The full CI pipeline will run when this PR is merged or when targeting the main branches.

@github-actions
Copy link

PR Validation Passed

Your changes look good! The quick validation checks have passed:

  • ✅ Code formatting (Black)
  • ✅ Import sorting (isort)
  • ✅ Linting (flake8)
  • ✅ Basic tests

The full CI pipeline will run when this PR is merged or when targeting the main branches.

@github-actions
Copy link

PR Validation Passed

Your changes look good! The quick validation checks have passed:

  • ✅ Code formatting (Black)
  • ✅ Import sorting (isort)
  • ✅ Linting (flake8)
  • ✅ Basic tests

The full CI pipeline will run when this PR is merged or when targeting the main branches.

@github-actions
Copy link

PR Validation Passed

Your changes look good! The quick validation checks have passed:

  • ✅ Code formatting (Black)
  • ✅ Import sorting (isort)
  • ✅ Linting (flake8)
  • ✅ Basic tests

The full CI pipeline will run when this PR is merged or when targeting the main branches.

ElNiak added 2 commits March 20, 2026 10:25
Design for three-layer architecture:
- Offline index builder (ivy-lsp index CLI)
- Unified WorkspaceContext replacing 3 detection paths
- Session overlay with multiple concurrent test scope views

Key decisions: protocols are self-contained (APT has forked
QUIC copies), per-protocol .ivy-index/ with full parser output,
Tier 1 (AST) by default, backward-compatible migration path.
@github-actions
Copy link

PR Validation Passed

Your changes look good! The quick validation checks have passed:

  • ✅ Code formatting (Black)
  • ✅ Import sorting (isort)
  • ✅ Linting (flake8)
  • ✅ Basic tests

The full CI pipeline will run when this PR is merged or when targeting the main branches.

@github-actions
Copy link

PR Validation Passed

Your changes look good! The quick validation checks have passed:

  • ✅ Code formatting (Black)
  • ✅ Import sorting (isort)
  • ✅ Linting (flake8)
  • ✅ Basic tests

The full CI pipeline will run when this PR is merged or when targeting the main branches.

ElNiak added 2 commits March 20, 2026 17:12
Design for migrating all 18 ivy-lsp MCP tools to Serena as the
single MCP gateway, backed by a shared ivy_tools library extracted
from ivy-lsp. Phased approach (0-5) with explicit exit criteria.

Key decisions:
- ivy_tools is the foundational library (no ivy_lsp dependency)
- Three-layer sharing: code, disk cache (.ivy-index), live LSP
- 20 Serena tools total (18 new + 2 existing LSP wrappers)
- ivy-lsp MCP sidecar removed after migration complete
@github-actions
Copy link

PR Validation Passed

Your changes look good! The quick validation checks have passed:

  • ✅ Code formatting (Black)
  • ✅ Import sorting (isort)
  • ✅ Linting (flake8)
  • ✅ Basic tests

The full CI pipeline will run when this PR is merged or when targeting the main branches.

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