Refactor prompt templates to inline includes and improve clarity - #1905
Conversation
Flattens the prompt include graph from 15 files to 8 by inlining partials that were used in only one place, plus deletes one orphan. Inlined into generic_ask.jinja2: - _general_instructions.jinja2 (1 caller) - _permission_errors.jinja2 (1 caller, 6 lines) - _runbooks_instructions.jinja2 (mutually exclusive with investigation_procedure) Inlined into base_user_prompt.jinja2: - _runbook_instructions.jinja2 (1 caller) - _current_date_time.jinja2 (1 caller, 2 lines) Inlined into investigation_procedure.jinja2: - _runbooks_instructions.jinja2 Inlined 3x into _fetch_logs.jinja2: - _default_log_prompt.jinja2 (only reused inside this one parent) Deleted as orphan (no callers anywhere): - _global_instructions.jinja2 Kept as separate files (entry points or substantial logical units): - generic_ask.jinja2, base_user_prompt.jinja2, conversation_history_compaction.jinja2, _ticket_additions.jinja2 - _ai_safety.jinja2 (partner-mandated, kept discoverable) - _toolsets_instructions.jinja2, _fetch_logs.jinja2, investigation_procedure.jinja2 (sizeable data-driven units) No semantic changes. Rendered output is byte-equivalent except for two stripped blank lines and one trailing space (all cosmetic). All 34 existing prompt tests pass unchanged. Signed-off-by: Claude <noreply@anthropic.com>
There was a problem hiding this comment.
Claude Code Review
This repository is configured for manual code reviews. Comment @claude review to trigger a review and subscribe this PR to future pushes, or @claude review once for a one-time review.
Tip: disable this comment in your organization's Code Review settings.
✅ Deploy Preview for holmes-docs ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
|
✅ Docker images ready for
Use these tags to pull the images for testing. 📋 Copy commandsgcloud auth configure-docker us-central1-docker.pkg.dev
docker pull us-central1-docker.pkg.dev/robusta-development/temporary-builds/holmes:b3884f7e
docker tag us-central1-docker.pkg.dev/robusta-development/temporary-builds/holmes:b3884f7e me-west1-docker.pkg.dev/robusta-development/development/holmes-dev:b3884f7e
docker push me-west1-docker.pkg.dev/robusta-development/development/holmes-dev:b3884f7e
docker pull us-central1-docker.pkg.dev/robusta-development/temporary-builds/holmes-operator:b3884f7e
docker tag us-central1-docker.pkg.dev/robusta-development/temporary-builds/holmes-operator:b3884f7e me-west1-docker.pkg.dev/robusta-development/development/holmes-operator-dev:b3884f7e
docker push me-west1-docker.pkg.dev/robusta-development/development/holmes-operator-dev:b3884f7ePatch Helm values in one line (choose the chart you use): HolmesGPT chart: helm upgrade --install holmesgpt ./helm/holmes \
--set registry=me-west1-docker.pkg.dev/robusta-development/development \
--set image=holmes-dev:b3884f7e \
--set operator.registry=me-west1-docker.pkg.dev/robusta-development/development \
--set operator.image=holmes-operator-dev:b3884f7eRobusta wrapper chart: helm upgrade --install robusta robusta/robusta \
--reuse-values \
--set holmes.registry=me-west1-docker.pkg.dev/robusta-development/development \
--set holmes.image=holmes-dev:b3884f7e \
--set holmes.operator.registry=me-west1-docker.pkg.dev/robusta-development/development \
--set holmes.operator.image=holmes-operator-dev:b3884f7e |
📂 Previous Runs📜 #5 · Run @ __783c682__ (#25106657786) — Apr 29, 11:45 UTC✅ Results of HolmesGPT evalsAutomatically triggered by commit 783c682 on branch Results of HolmesGPT evals
Benchmark Comparison DetailsBaseline: latest ci-benchmark experiment on master Status: Success - 74 test/model combinations loaded Benchmark experiment:
No benchmark data available for comparison. Benchmark has no cost, total tokens, cached tokens data. Will appear after the next weekly benchmark run. Comparison indicators:
📜 #4 · Run @ __dfa1cc7__ (#25101501320) — Apr 29, 09:42 UTC✅ Results of HolmesGPT evalsAutomatically triggered by commit dfa1cc7 on branch Results of HolmesGPT evals
Benchmark Comparison DetailsBaseline: latest ci-benchmark experiment on master Status: Success - 74 test/model combinations loaded Benchmark experiment:
No benchmark data available for comparison. Benchmark has no cost, total tokens, cached tokens data. Will appear after the next weekly benchmark run. Comparison indicators:
📜 #3 · Run @ __a823241__ (#24399088767) — Apr 14, 12:42 UTC✅ Results of HolmesGPT evalsAutomatically triggered by commit a823241 on branch Results of HolmesGPT evals
Benchmark Comparison DetailsBaseline: latest ci-benchmark experiment on master Status: Success - 48 test/model combinations loaded Benchmark experiment:
No benchmark data available for comparison. Benchmark has no cost, total tokens, cached tokens data. Will appear after the next weekly benchmark run. Comparison indicators:
📜 #2 · Run @ __401f3a1__ (#24338226979) — Apr 13, 10:26 UTC✅ Results of HolmesGPT evalsAutomatically triggered by commit 401f3a1 on branch Results of HolmesGPT evals
Benchmark Comparison DetailsBaseline: latest ci-benchmark experiment on master Status: Success - 48 test/model combinations loaded Benchmark experiment:
No benchmark data available for comparison. Benchmark has no cost, total tokens, cached tokens data. Will appear after the next weekly benchmark run. Comparison indicators:
📜 #1 · Run @ __2e725e6__ (#24337856152) — Apr 13, 10:18 UTC✅ Results of HolmesGPT evalsAutomatically triggered by commit 2e725e6 on branch Results of HolmesGPT evals
Benchmark Comparison DetailsBaseline: latest ci-benchmark experiment on master Status: Success - 48 test/model combinations loaded Benchmark experiment:
No benchmark data available for comparison. Benchmark has no cost, total tokens, cached tokens data. Will appear after the next weekly benchmark run. Comparison indicators:
✅ Results of HolmesGPT evalsAutomatically triggered by commit df33a7b on branch Results of HolmesGPT evals
Benchmark Comparison DetailsBaseline: latest ci-benchmark experiment on master Status: Success - 74 test/model combinations loaded Benchmark experiment:
No benchmark data available for comparison. Benchmark has no cost, total tokens, cached tokens data. Will appear after the next weekly benchmark run. Comparison indicators:
📖 Legend
🔄 Re-run evals manually
Option 1: Comment on this PR with Or with more options (one per line): Run evals on a different branch (e.g., master) for comparison:
Quick re-run: Use Option 2: Trigger via GitHub Actions UI → "Run workflow" Option 3: Add PR labels to include extra evals (applies to both automatic runs and
Examples: 🏷️ Valid tags
🤖 Valid models
Commands: CLI: |
WalkthroughThis PR refactors the prompt template system by consolidating instruction fragments into main templates with feature-flag-driven conditional logic, removing four standalone template files, and inlining their behavior into Changes
Estimated code review effort🎯 4 (Complex) | ⏱️ ~50 minutes Possibly related PRs
Suggested labels
Suggested reviewers
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. 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. Review rate limit: 5/8 reviews remaining, refill in 19 minutes and 34 seconds.Comment |
🔬 CLI Performance Benchmark🟢 Startup Time (no LLM)Measures
🟡 Full CLI with LLMMeasures
PR: |
There was a problem hiding this comment.
🧹 Nitpick comments (2)
holmes/plugins/prompts/generic_ask.jinja2 (2)
49-50: Minor redundancy in runbook guidance.These two lines about runbook fetching overlap with the dedicated runbook instructions at lines 20-28 (when
runbooks_enabled && !todowrite_enabled) or ininvestigation_procedure.jinja2(whentodowrite_enabled). The redundancy reinforces the guidance but could be consolidated for maintainability.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@holmes/plugins/prompts/generic_ask.jinja2` around lines 49 - 50, Duplicate runbook guidance in generic_ask.jinja2 (the two bullet lines about fetching runbooks) overlaps with the existing runbook block used when runbooks_enabled && !todowrite_enabled and with investigation_procedure.jinja2 when todowrite_enabled; remove these two lines and instead reference or include the existing runbook guidance (or call the same macro/partial) so the logic is centralized (look for the runbook block at lines ~20-28 and the investigation_procedure.jinja2 template to reuse).
100-115: Potentially redundant TodoWrite instructions.When
todowrite_enabledis true,investigation_procedure.jinja2is already included (line 18), which contains comprehensive TodoWrite task management rules (lines 4-8, 19-91 in that file). These additional instructions at lines 100-115 overlap significantly, particularly around:
- First tool call being TodoWrite
- Task status updates
- Breaking down problems into tasks
Consider removing this block since
investigation_procedure.jinja2already provides more detailed guidance on the same topics.♻️ Suggested consolidation
-{% if todowrite_enabled %} -# MANDATORY Task Management - -* You MUST use the TodoWrite tool for ANY investigation requiring multiple steps -* Your FIRST tool call MUST be TodoWrite to create your investigation plan -* Break down ALL complex problems into smaller, manageable tasks -* You MUST update task status (pending → in_progress → completed) as you work through your investigation -* The TodoWrite tool will show you a formatted task list - reference this throughout your investigation -* Mark tasks as 'in_progress' when you start them, 'completed' when finished -* Follow ALL tasks in your plan - don't skip any tasks -* Use task management to ensure you don't miss important investigation steps -* If you discover additional steps during investigation, add them to your task list using TodoWrite -* When calling TodoWrite, you may ALSO call other tools in parallel to speed things up for your users and make them happy! -* On the first TodoWrite call, mark at least one task as in_progress, and start working on it in parallel. -* When calling TodoWrite for the first time, mark the tasks you started working on with 'in_progress' status. -{% endif %}The TodoWrite guidance is already fully covered by
investigation_procedure.jinja2which is included whentodowrite_enabledis true.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@holmes/plugins/prompts/generic_ask.jinja2` around lines 100 - 115, The block in generic_ask.jinja2 guarded by todowrite_enabled duplicates rules already provided by the included investigation_procedure.jinja2; remove or disable the redundant TodoWrite stanza (the entire if-block content that lists the MANDATORY Task Management rules) so that only investigation_procedure.jinja2 supplies the TodoWrite guidance, ensuring todowrite_enabled remains the single toggle and avoiding duplicate/conflicting instructions; update references/comments if needed to point readers to investigation_procedure.jinja2 for the canonical rules.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In `@holmes/plugins/prompts/generic_ask.jinja2`:
- Around line 49-50: Duplicate runbook guidance in generic_ask.jinja2 (the two
bullet lines about fetching runbooks) overlaps with the existing runbook block
used when runbooks_enabled && !todowrite_enabled and with
investigation_procedure.jinja2 when todowrite_enabled; remove these two lines
and instead reference or include the existing runbook guidance (or call the same
macro/partial) so the logic is centralized (look for the runbook block at lines
~20-28 and the investigation_procedure.jinja2 template to reuse).
- Around line 100-115: The block in generic_ask.jinja2 guarded by
todowrite_enabled duplicates rules already provided by the included
investigation_procedure.jinja2; remove or disable the redundant TodoWrite stanza
(the entire if-block content that lists the MANDATORY Task Management rules) so
that only investigation_procedure.jinja2 supplies the TodoWrite guidance,
ensuring todowrite_enabled remains the single toggle and avoiding
duplicate/conflicting instructions; update references/comments if needed to
point readers to investigation_procedure.jinja2 for the canonical rules.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: c1a4ac7b-9af5-424c-bccd-a4a4b2cc2be8
📒 Files selected for processing (11)
holmes/plugins/prompts/_current_date_time.jinja2holmes/plugins/prompts/_default_log_prompt.jinja2holmes/plugins/prompts/_fetch_logs.jinja2holmes/plugins/prompts/_general_instructions.jinja2holmes/plugins/prompts/_global_instructions.jinja2holmes/plugins/prompts/_permission_errors.jinja2holmes/plugins/prompts/_runbook_instructions.jinja2holmes/plugins/prompts/_runbooks_instructions.jinja2holmes/plugins/prompts/base_user_prompt.jinja2holmes/plugins/prompts/generic_ask.jinja2holmes/plugins/prompts/investigation_procedure.jinja2
💤 Files with no reviewable changes (7)
- holmes/plugins/prompts/_global_instructions.jinja2
- holmes/plugins/prompts/_current_date_time.jinja2
- holmes/plugins/prompts/_runbook_instructions.jinja2
- holmes/plugins/prompts/_permission_errors.jinja2
- holmes/plugins/prompts/_default_log_prompt.jinja2
- holmes/plugins/prompts/_general_instructions.jinja2
- holmes/plugins/prompts/_runbooks_instructions.jinja2
|
@claude review |
There was a problem hiding this comment.
This is a large structural refactoring of core prompt templates — the evals pass 11/11 and both flagged issues are pre-existing, but the scope of changes to the prompt infrastructure warrants a human look to confirm no instructions were accidentally altered or dropped during inlining.
Extended reasoning...
Overview
This PR inlines 7 Jinja2 template partial files (, , , , , , ) into their parent templates (, , , ). The intent is to flatten the template hierarchy and make prompt logic more transparent. This is a purely structural refactor — no new conditional logic or instructions are introduced.
Security risks
None. These are LLM system prompt templates, not code paths that handle authentication, data access, or external input validation. The inlining adds no new attack surface.
Level of scrutiny
Medium-high. While each individual change is mechanical (copy-paste from included files), the aggregate scope is significant: the prompt templates are the primary behavioral contract for how HolmesGPT investigates issues. A reviewer needs to verify that nothing was accidentally omitted, reordered in a semantically meaningful way, or subtly modified. The 11/11 eval pass is encouraging but evals cover a fixed test set and may not catch every edge case in conditional rendering paths.
Other factors
Both bugs reported by the bug-hunting system are explicitly marked pre-existing — they existed identically in the deleted and are faithfully reproduced. The PR does not worsen the existing behavior. CodeRabbit estimated ~45 minutes of review effort (complexity score 4). The PR duplicates identical log-fetching instructions 3× in rather than using a shared include — this is intentional per the description but is a maintainability trade-off worth a human acknowledging.
…mment to runbook block Reverts the inlining of _default_log_prompt.jinja2 into _fetch_logs.jinja2 since the 3x duplication made things worse, not better. This file is genuinely reused across 3 elif branches (coralogix, k8s_base, opensearch). Adds a Jinja comment block to base_user_prompt.jinja2 explaining what the runbook selection sections/available pattern does — it dynamically builds a priority-ordered list from whichever of 3 context variables (runbook_catalog, custom_instructions, global_instructions) are non-empty. Before/after rendered prompt comparison: - System prompt: identical - CLI user prompt: 1 cosmetic blank line diff only - Server user prompt: 1 cosmetic blank line diff only All 34 prompt tests pass. Signed-off-by: Claude <noreply@anthropic.com>
….1:19415/git/HolmesGPT/holmesgpt into claude/simplify-jinja2-prompts-1A0Jz
There was a problem hiding this comment.
The inline bugs are pre-existing and evals pass 11/11, but this refactor touches core prompt engineering templates — worth a human pass to verify the inlining preserved all intended semantics, especially around the conditional logic.
Extended reasoning...
Overview
This PR deletes 6 Jinja2 template fragments and inlines their content directly into 3 primary templates: generic_ask.jinja2, base_user_prompt.jinja2, and investigation_procedure.jinja2. The scope is moderate-to-large for a refactor: all changes are in prompt engineering files that directly shape LLM behavior.
Security Risks
No security-sensitive code paths are touched. The templates are LLM prompt instructions only, with no auth, crypto, or permission logic.
Level of Scrutiny
Prompt templates are production-critical because they determine how the AI investigates issues. Even a purely mechanical inlining refactor can introduce subtle differences in whitespace, rendering order, or conditional guard semantics that would not be caught by 11/11 regression evals. Three issues were flagged by the bug hunter — all pre-existing, all faithfully reproduced by inlining — which suggests the PR is accurate but also that the refactor was a missed opportunity for cleanup. A human familiar with the prompt system should confirm the conditional logic (especially the todowrite_enabled and runbooks_enabled guard boundaries) is preserved correctly.
Other Factors
All CI evals pass (11/11, 0 regressions). The PR description is clear and the intent is well-documented. CodeRabbit rated it complexity 4/5 at approximately 45 minutes review time. The inline comments from the previous review run flag pre-existing semantic inconsistencies that remain unresolved.
Master renamed runbooks→skills across all prompts. Conflicts resolved by applying the skill rename to our inlined content: - generic_ask.jinja2: runbooks_enabled→skills_enabled, runbook→skill text - investigation_procedure.jinja2: inlined _skills_instructions content - base_user_prompt.jinja2: inlined _skill_instructions content - Deleted _skill_instructions.jinja2 and _skills_instructions.jinja2 (single-use, consistent with our inlining approach) - Deleted _general_instructions.jinja2 (keep our deletion) Signed-off-by: Claude <noreply@anthropic.com>
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@holmes/plugins/prompts/base_user_prompt.jinja2`:
- Around line 9-15: The template builds "sections" from skill_catalog,
custom_instructions, and global_instructions and then shows instructions that
may tell the agent to call fetch_skill even when no actual skills exist; update
the gating logic so fetch_skill-related guidance is only emitted when a real
skills collection is present (e.g., check the actual skills/skill_catalog length
or a "skills" variable) rather than merely the presence of
custom_instructions/global_instructions; locate the sections/available logic and
the later block that references fetch_skill (also the similar block at the later
34-41 range) and add a conditional that requires non-empty skills before
including any fetch_skill instruction text.
In `@holmes/plugins/prompts/generic_ask.jinja2`:
- Around line 49-50: The template emits unconditional bullets telling the model
to fetch skills; guard those lines with the skills toggle so they only appear
when skills are enabled. Update the generic_ask.jinja2 template to check the
boolean (e.g., skills_enabled) before rendering the two bullets ("if a skill url
is present..." and "if a skill in the catalog...") so the instructions are
omitted when skills are disabled; locate the bullets in generic_ask.jinja2 and
wrap them in the existing template conditional or add one around that block.
- Line 94: In the generic_ask.jinja2 template replace the grammatical slip "you
explain say" with a clear phrasing (e.g., "you explain" or "you say") so the
sentence reads smoothly—locate the sentence near the text fragment "That is
different than - for example - fetching a pod's logs and seeing that the pod
itself has permission errors." and update it to something like "in that case,
you explain that permission errors are the cause of the problem and give
details" to fix the wording.
🪄 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: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 3e4f5607-d72c-4539-8dcc-f70d73699bdd
📒 Files selected for processing (3)
holmes/plugins/prompts/base_user_prompt.jinja2holmes/plugins/prompts/generic_ask.jinja2holmes/plugins/prompts/investigation_procedure.jinja2
🚧 Files skipped from review as they are similar to previous changes (1)
- holmes/plugins/prompts/investigation_procedure.jinja2
| {%- for sec in available %} | ||
| ## {{ sec.title }} (priority #{{ loop.index }}) | ||
|
|
||
| {%- set content = (sec.content|string) -%} | ||
| {{ content.replace('\n', '\n ') }} | ||
|
|
||
| {%- endfor %} |
There was a problem hiding this comment.
🟣 🟣 This is a pre-existing issue: in base_user_prompt.jinja2 (lines 25-31), the per-section render loop uses {%- set content = (sec.content|string) -%} with whitespace-strip markers on both sides. The trailing -%} eats the newline that should separate the ## Heading (priority #N) line from the first content line, producing malformed markdown like ## Skill Catalog (priority #1)CATALOG: skill1 on a single line. Sections also run together because the next iteration's {%- for %} strips the separator. The bug was inlined verbatim from the deleted _skill_instructions.jinja2, but since this PR explicitly clarifies and physically rewrites these lines, it's the natural place to fix — drop the trailing - on the set tag (e.g., {%- set content = (sec.content|string) %}).
Extended reasoning...
What the bug is and how it manifests
In holmes/plugins/prompts/base_user_prompt.jinja2 lines 25-31, the per-section rendering loop is:
{%- for sec in available %}
## {{ sec.title }} (priority #{{ loop.index }})
{%- set content = (sec.content|string) -%}
{{ content.replace('\n', '\n ') }}
{%- endfor %}The {%- set content = (sec.content|string) -%} has whitespace-strip markers on both sides. The leading - strips the newline + blank line above (between the title and the set tag), and the trailing -%} strips the newline that should separate the assignment from the {{ content.replace(...) }} output. The result: the heading and the first content line are emitted on the same physical line.
Step-by-step proof
I rendered the template fragment using the project's actual Jinja2 setup (no trim_blocks/lstrip_blocks per holmes/plugins/prompts/__init__.py:37) with realistic inputs: skill_catalog='CATALOG: skill1\nCATALOG: skill2', custom_instructions='* Always check CPU\n* Always check memory', global_instructions='* Always check logs\n* Always check resource limits'. The output is exactly:
## Skill Catalog (priority #1)CATALOG: skill1
CATALOG: skill2
## Subject/Issue Skills (priority #2)* Always check CPU
* Always check memory
## Global Instructions (priority #3)* Always check logs
* Always check resource limits
Note (1) the heading is glued to the first content character (priority #1)CATALOG:, priority #2)* Always, priority #3)* Always) and (2) consecutive sections run together because the next iteration's {%- for %} strips the blank line.
Why existing code doesn't prevent it
There is no condition that protects the inter-line whitespace — both strip markers on {%- set ... -%} are unconditional, and the {%- for %} at the start of each iteration eats the blank line between sections.
Impact
base_user_prompt.jinja2 is rendered as the user prompt (holmes/core/prompt.py:169), so this affects production output whenever any of skill_catalog, custom_instructions, or global_instructions is non-empty (the default for many deployments). The structural intent — distinct ## headings followed by indented content — is broken: the first content character of every section ends up on the heading line. When the first content character is markdown syntax (* or a heading-like token), the corruption is even worse because it visually merges with the heading text. While LLMs are typically tolerant of malformed markdown, this is a visible defect in a prompt that explicitly instructs the LLM about source priority.
Pre-existing status
This exact pattern was in the deleted _skill_instructions.jinja2 (and earlier in _runbook_instructions.jinja2). PR #1905 inlined the template verbatim into base_user_prompt.jinja2 lines 25-31 without fixing the bug. So while the defect predates this PR, the PR physically modifies these exact lines as part of a clarity-focused refactor, making it the natural place to fix it.
How to fix
Drop the trailing strip on the set tag — change {%- set content = (sec.content|string) -%} to {%- set content = (sec.content|string) %}. That preserves the newline before the {{ content.replace(...) }} output, so the title and content end up on separate lines. Optionally also drop the leading - to keep the blank line above for readability.
Conflicts from PR #1905 (also refactored prompts). Resolved by keeping our simplified versions in both generic_ask.jinja2 and investigation_procedure.jinja2. Signed-off-by: Claude <noreply@anthropic.com>
Summary
This PR refactors the prompt template structure by inlining several included template files directly into their parent templates. This improves maintainability by reducing template fragmentation and making the prompt logic more transparent and easier to follow.
Key Changes
Inlined
_general_instructions.jinja2intogeneric_ask.jinja2: Moved all general investigation instructions, Kubernetes-specific guidance, task management rules, and tool usage guidelines directly into the main prompt template with improved conditional logic for runbooks vs TodoWrite workflows.Inlined
_default_log_prompt.jinja2into_fetch_logs.jinja2: Consolidated log fetching instructions for Coralogix, K8s base, and OpenSearch toolsets by replacing the include with the actual content.Inlined
_runbook_instructions.jinja2intoinvestigation_procedure.jinja2: Moved runbook usage instructions directly into the investigation procedure template.Refactored
base_user_prompt.jinja2: Replaced_runbook_instructions.jinja2include with inline runbook selection logic and replaced_current_date_time.jinja2include with direct date/time context injection.Removed template files: Deleted
_general_instructions.jinja2,_default_log_prompt.jinja2,_runbook_instructions.jinja2,_permission_errors.jinja2,_current_date_time.jinja2, and_global_instructions.jinja2as their content is now inlined.Improved permission error handling: Moved permission error instructions directly into
generic_ask.jinja2with clearer formatting and context.Implementation Details
todowrite_enabled,runbooks_enabled, etc.)generic_ask.jinja2andinvestigation_procedure.jinja2with consistent messaginghttps://claude.ai/code/session_01HVq6giayp3P65pUpjJMkLo
Summary by CodeRabbit
Release Notes