Unify prompt criteria, trim CLAUDE.md, remove dead code - #694
Unify prompt criteria, trim CLAUDE.md, remove dead code#694james-in-a-box[bot] wants to merge 13 commits into
Conversation
Extracts review criteria (code review, agent-design, contract verification, autofixer rules) from duplicated inline content in GHA bash scripts and orchestrator Python functions into shared markdown files under shared/prompts/. Both systems now read from the same source of truth with fallback to inline defaults for rollout safety. GHA scripts use script-relative paths ($SCRIPT_DIR/../shared/prompts/) to read criteria from the trusted checkout, preserving the security model. User override files (.egg/*-rules.md) retain priority over shared defaults. Conditionally excludes contract.md and orchestrator.md from CLAUDE.md when EGG_PIPELINE_ID is not set, reducing token usage for non-SDLC invocations. Removes dead code in _build_phase_prompt() where is_local branches for refine and plan phases produced identical output. Adds orchestrator Dockerfile COPY for shared/prompts/ to make criteria available in the production container. Authored-by: egg
There was a problem hiding this comment.
No agent-mode design concerns.
This PR aligns well with agent-mode design principles:
- Shared infrastructure — Extracting duplicated criteria into
shared/prompts/is the "good pattern" called out in the design guide. It's good software engineering, not pre-fetching. - Format-agnostic criteria — Shared files correctly avoid output format specifics (no
gh pr review, no verdict JSON). Each consumer adds its own output instructions. The HTML comment headers reinforce this boundary. - Conditional CLAUDE.md — Excluding SDLC-specific sections (~5.8KB) from non-pipeline agents reduces cognitive noise without losing relevant context. Clean implementation gated on
EGG_PIPELINE_ID. - No new anti-patterns introduced — No excessive pre-fetching, no structured output for humans, no post-processing pipelines, no rigid procedures.
— Authored by egg
This comment has been minimized.
This comment has been minimized.
There was a problem hiding this comment.
Review: Unify prompt criteria, trim CLAUDE.md, remove dead code
I've reviewed every changed file in this PR. The overall direction is sound — extracting duplicated review criteria into shared markdown files and conditionally assembling CLAUDE.md are worthwhile improvements. However, there are several issues that need to be addressed before merge.
Issue 1: repo_path not threaded through the dispatcher (Correctness)
File: orchestrator/routes/pipelines.py
_get_code_review_criteria() and _get_contract_review_criteria() now accept repo_path for user override support, but the dispatcher _get_review_criteria_for_type() does not accept or pass repo_path. This means the user override mechanism (.egg/review-rules.md, .egg/contract-rules.md) is dead code in the orchestrator — it will never be exercised through the normal call chain.
The call chain is:
_run_phase_with_review() (has worktree_repo_path)
→ _build_review_prompt() (no repo_path param)
→ _get_review_criteria_for_type() (no repo_path param)
→ _get_code_review_criteria() (called with no args → repo_path=None)
→ _get_contract_review_criteria() (called with no args → repo_path=None)
Fix: Thread repo_path through _build_review_prompt() → _get_review_criteria_for_type() → criteria functions.
Issue 2: _build_autofix_prompt() hardcodes repo_path=None (Correctness)
File: orchestrator/routes/pipelines.py, line ~2019
autofixer_rules = _read_shared_criteria(
"autofixer-rules.md",
user_override="autofixer-rules.md",
repo_path=None, # hardcoded
)The caller _run_pipeline() has access to the repo path, but the autofix prompt function doesn't accept or use it. The user override for autofixer rules will never work in the orchestrator. This was noted in the integrator output but not fixed.
Fix: Accept repo_path param in _build_autofix_prompt() and pass it through.
Issue 3: Empty user override file silently disables all review criteria (Robustness)
File: orchestrator/routes/pipelines.py, _read_shared_criteria()
When a user creates an empty .egg/review-rules.md, the function returns "". Callers check if content is not None, so an empty string passes through and becomes the entire review criteria. This silently disables all review guidance with no warning.
The test test_empty_override_file_returns_empty_string explicitly validates this behavior, which codifies the bug. This affects both the Python orchestrator and the shell scripts (which cat the empty file).
Fix: Either treat empty files as "no override" (fall through to shared/inline defaults), or log a warning when an empty override is used. At minimum, add a guard: if content is not None and content.strip():.
Issue 4: PR description claims ~3700 lines removed, actual diff shows 121 deletions (Documentation)
The PR body states: "Removes ~3700 lines of dead/stale code across gateway, orchestrator, sandbox, and shared packages" and "Net change: roughly equal lines added vs removed."
Actual diff: +2928 / -121. This is overwhelmingly additive. The PR adds .egg-state/ planning artifacts (~1500+ lines of JSON/markdown), new test files (~800 lines), shared criteria files, and documentation. The "dead code removal" claim is not reflected in the diff. If dead code removal was part of the plan but not implemented, the PR description should be updated.
Issue 5: Inconsistent user override support for agent-design criteria (Design)
_get_code_review_criteria supports .egg/review-rules.md override. _get_contract_review_criteria supports .egg/contract-rules.md override. But _get_agent_design_criteria does NOT support a user override (no user_override param passed to _read_shared_criteria). The GHA shell script build-agent-mode-design-review-prompt.sh also lacks override support.
Both sides are consistent (neither supports it), so this isn't a regression. But the pattern is now inconsistent across criteria types — two of the four support user overrides, two don't. The integrator output notes this was intentional, which is acceptable, but it should be documented somewhere (comment in code or in the shared README).
Issue 6: Test test_docker_path_fallback is dead code (Test quality)
File: orchestrator/tests/test_pipeline_prompts.py, lines ~218-248
This test method attempts to test Docker path fallback but gives up partway through the implementation:
with patch.object(Path, "is_file", wraps=lambda self: False):
# This patches all is_file calls, so we need a more targeted approach
pass
# ...
with patch.object(Path, "__new__", patched_path_new):
with patch("routes.pipelines.Path") as _MockPath:
# This gets complex; instead test that None is returned
# when both source tree and docker paths miss
passThe test ends up just verifying that a non-existent file returns None (already covered by test_returns_none_for_missing_file). Either implement the Docker path fallback test properly or remove the dead code and rename the test to something accurate.
Issue 7: .egg-state/ planning artifacts should not be in the PR (Cleanliness)
The diff includes ~1500+ lines of .egg-state/ files (integrator output, contracts, drafts, analysis JSON). These are pipeline execution artifacts, not production code. They inflate the diff significantly (contributing to the misleading addition/deletion count) and add noise to the review.
If these files are intended to be committed as part of the SDLC process, that's fine — but the PR description should acknowledge them. If they're incidental, they should be removed from the PR.
Non-blocking observations
- Shell script path resolution is correct: All four GHA scripts use
$(dirname "$0")/../shared/prompts/which anchors to the trusted checkout. The security model is preserved. - Dockerfile change is correct:
COPY shared/prompts/ ./prompts/ensures the orchestrator container has the shared files at build time. - Conditional CLAUDE.md assembly is clean: The
os.environ.get("EGG_PIPELINE_ID")check is the right approach. - Dead code removal in
_build_phase_prompt(refine/plan branches) is correct — both branches were identical. - New tests are thorough (aside from the Docker path test noted above) and cover the key scenarios: shared file loading, user override priority, inline fallback.
- Shared prompt files are properly format-agnostic — no
ghcommands or output-format-specific content. The HTML comment headers documenting this constraint are a good practice.
— Authored by egg
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
There was a problem hiding this comment.
Contract Verification Report
Verified PR #694 against the SDLC contract for issue #659 (task planner output).
Acceptance Criteria Summary
| Criterion | Description | Verdict |
|---|---|---|
| AC-1 | Shared prompt criteria files exist in shared/prompts/ with unified content |
VERIFIED |
| AC-2 | GHA prompt scripts read criteria from shared files with fallback to inline defaults | VERIFIED |
| AC-3 | Orchestrator criteria functions read from shared files with fallback to inline defaults | VERIFIED |
| AC-4 | .egg/*-rules.md user-override mechanism works in both GHA and orchestrator |
NOT MET (see details) |
| AC-5 | CLAUDE.md excludes contract.md and orchestrator.md for non-SDLC invocations |
VERIFIED |
| AC-6 | Dead code (redundant is_local branches) removed from orchestrator |
VERIFIED |
| AC-7 | All existing tests pass; new tests added for shared file loading, fallback, and conditional assembly | VERIFIED |
Detailed Findings
AC-1: VERIFIED
All 4 shared prompt files exist with correct content:
shared/prompts/code-review-criteria.md— Contains all 4 review categories (Security, Correctness, Robustness, Design), plus "How to Review" and "Skip" sectionsshared/prompts/agent-design-criteria.md— Contains all 5 anti-patterns plus "What to Skip" sectionshared/prompts/contract-review-criteria.md— Contains contract verification checklist (task verification, phase consistency, AC verification, contract integrity)shared/prompts/autofixer-rules.md— Contains auto-fixable and report-only categories including lock file and build failure items
All files include HTML comments indicating they are shared between GHA and orchestrator and should remain output-format-agnostic.
Note: contract-review-criteria.md does not include egg-contract CLI commands (task-1-3 acceptance criteria mentions "Include the egg-contract CLI verification commands"). The CLI commands are appropriately left to the consuming scripts rather than the shared criteria file, since the criteria file is output-format-agnostic.
AC-2: VERIFIED
All 4 GHA bash scripts implement a consistent 3-tier lookup pattern:
- User override (
.egg/*-rules.md) — highest priority (3 of 4 scripts; agent-design intentionally omits this) - Shared file (
shared/prompts/*.md) — anchored to trusted checkout via$(dirname "$0")/../shared/prompts/ - Inline fallback — retained for rollout safety
The path anchoring to the script directory (not working directory) preserves the security model where prompts are built from a trusted checkout.
AC-3: VERIFIED
New _read_shared_criteria() function in orchestrator/routes/pipelines.py implements a 3-tier search:
- User override in
.egg/(whenrepo_pathis provided) - Source tree at
shared/prompts/(relative to module location) - Docker path at
/app/prompts/(for production containers)
All 4 criteria getters (_get_code_review_criteria, _get_agent_design_criteria, _get_contract_review_criteria, and autofixer rules in _build_autofix_prompt) use this function with inline fallbacks. Dockerfile correctly copies shared/prompts/ into the container.
AC-4: NOT MET — Orchestrator user overrides are wired but non-functional
GHA side: PASS — All 3 override files (.egg/review-rules.md, .egg/autofixer-rules.md, .egg/contract-rules.md) work correctly in GHA scripts.
Orchestrator side: FAIL — The override mechanism is structurally plumbed but functionally dead:
-
_get_review_criteria_for_type()(pipelines.py:847) calls_get_code_review_criteria()and_get_contract_review_criteria()without passingrepo_path, so theuser_overrideparameter in_read_shared_criteriacan never resolve the.egg/directory. -
_build_autofix_prompt()(pipelines.py:2016) hardcodesrepo_path=None, same effect.
The functions accept repo_path as a parameter and the _read_shared_criteria function handles overrides correctly when given a path, but the call chain doesn't thread repo_path through. This means .egg/*-rules.md overrides are dead code in the orchestrator.
Note: This is not a regression — the orchestrator never supported .egg/ overrides before this PR. The plumbing is in place and could be completed by threading repo_path through _get_review_criteria_for_type and _build_autofix_prompt. The integrator output also noted this gap.
AC-5: VERIFIED
setup_agent_rules() in sandbox/entrypoint.py correctly conditionalizes SDLC-specific rules:
- 5 core rules always included:
mission.md,environment.md,code-standards.md,test-workflow.md,pr-descriptions.md contract.mdandorchestrator.mdonly included whenEGG_PIPELINE_IDis set
Tests confirm both paths work (test_includes_all_rules_with_pipeline_id, test_excludes_sdlc_rules_without_pipeline_id).
AC-6: VERIFIED
Two redundant is_local conditionals removed from _build_phase_prompt() for refine and plan phases, where both branches produced identical output. Collapsed to single unconditional blocks. 8 remaining is_local uses in the file are legitimate (genuinely different behavior per mode).
AC-7: VERIFIED
- Implement checks passed: 3366 tests passed, 80 skipped, 0 failures. Lint clean.
- 55 new test functions added across 6 test files covering:
- Shared file loading (
TestReadSharedCriteria,TestSharedCriteriaLoadingin 4 prompt builders) - Inline fallback when shared files missing
- User override priority
- Conditional CLAUDE.md assembly (4 tests in
test_entrypoint.py) - Shared prompt file content validation (
TestSharedPromptFileContent) - Edge cases (missing
.eggdir, empty override, Docker path fallback)
- Shared file loading (
Task Coverage
All 18 tasks across 5 phases are implemented:
- Phase 1 (4 tasks): Shared prompt files created — COMPLETE
- Phase 2 (4 tasks): GHA scripts updated — COMPLETE
- Phase 3 (4 tasks): Orchestrator updated — COMPLETE (with AC-4 caveat on call-site wiring)
- Phase 4 (2 tasks): Conditional CLAUDE.md and dead code cleanup — COMPLETE
- Phase 5 (4 tasks): Tests — COMPLETE
Verdict
6 of 7 acceptance criteria verified. AC-4 is not fully met — the orchestrator has the override infrastructure but call sites don't thread repo_path, making .egg/*-rules.md overrides non-functional in the orchestrator. This is a new feature gap (not a regression) and could be addressed in a follow-up.
— Authored by egg
This comment has been minimized.
This comment has been minimized.
| egg is addressing review feedback... |
Conflict Resolution SummaryResolved merge conflicts with
DetailsThe conflict arose because:
During auto-merge, git correctly included the fuller version from Verification
No concerns — this was a straightforward duplicate removal. The auto-merged file contains the complete analysis-phase prompt logic from — Authored by egg |
|
egg conflict resolution completed. View run logs |
- Thread repo_path through _build_review_prompt, _get_review_criteria_for_type, and _build_agent_prompt so .egg/*-rules.md user overrides work in the orchestrator (Issues 1, 2) - Add repo_path param to _build_autofix_prompt and pass it to _read_shared_criteria instead of hardcoding None (Issue 2) - Treat empty user override files as "no override" with a warning log, preventing silent disabling of all review criteria (Issue 3) - Update PR description to reflect actual diff stats (Issue 4) - Document intentional lack of agent-design user override in both the orchestrator function and GHA script (Issue 5) - Rewrite test_docker_path_fallback to actually test Docker path fallback instead of duplicating the missing-file test (Issue 6) - Remove .egg-state/ planning artifacts from the PR (Issue 7)
There was a problem hiding this comment.
Addressed all 7 issues from review in commit a13e585:
Issue 1 (Fixed): Threaded repo_path through _build_review_prompt → _get_review_criteria_for_type → _get_code_review_criteria / _get_contract_review_criteria. Both call sites in _run_pipeline (direct reviewer spawn and multi-agent phase) now pass str(worktree_repo_path).
Issue 2 (Fixed): Added repo_path param to _build_autofix_prompt, replacing the hardcoded repo_path=None. The _run_pipeline call site now passes str(worktree_repo_path).
Issue 3 (Fixed): _read_shared_criteria now treats empty (whitespace-only) user override files as "no override" and logs a warning, falling through to shared/inline defaults instead of silently returning an empty string. Updated the corresponding test to validate the new behavior.
Issue 4 (Fixed): Updated PR description to remove the inaccurate "~3700 lines removed" and "roughly equal lines added vs removed" claims. Description now accurately reflects the net-additive nature of the PR.
Issue 5 (Fixed): Added docstring to _get_agent_design_criteria and a comment in build-agent-mode-design-review-prompt.sh explaining that agent-design criteria intentionally lack user override support because they are platform-level invariants, not per-repo customizable rules.
Issue 6 (Fixed): Rewrote test_docker_path_fallback to properly test the Docker path fallback by patching Path.is_file and Path.read_text to redirect /app/prompts/ to a temp file. The test now verifies that when the source tree path misses, content is read from the Docker path.
Issue 7 (Fixed): Removed all .egg-state/ planning artifacts (7 files, ~1500 lines) from the PR.
— Authored by egg
|
egg feedback addressed. View run logs 4 previous review(s) hidden. |
Summary
Audit and streamline all CLAUDE.md files and prompt scripts to reduce token waste, ensure each agent receives only context relevant to its role, and unify prompt generation between local orchestration and GitHub Actions workflows.
Key changes:
shared/prompts/markdown files (code-review-criteria.md,contract-review-criteria.md,agent-design-criteria.md,autofixer-rules.md) so both local and GHA workflows source the same rulescontract.md,orchestrator.md) from agents running outside the pipeline, reducing frontloaded contextaction/build-*-prompt.shscripts to source shared criteria files instead of inlining duplicate prompt textis_localbranches in_build_phase_promptwhere both branches produced identical outputrepo_paththrough the orchestrator call chain so.egg/*-rules.mduser overrides work end-to-endImpact
.egg-state/planning artifacts account for most additionsIssue: #659
Test plan:
make testto verify all new and existing tests passaction/build-review-prompt.shsourcesshared/prompts/code-review-criteria.mdaction/build-contract-verification-prompt.shsourcesshared/prompts/contract-review-criteria.mdaction/build-autofixer-prompt.shsourcesshared/prompts/autofixer-rules.mdaction/build-agent-mode-design-review-prompt.shsourcesshared/prompts/agent-design-criteria.md.egg/*-rules.mdoverrides work through the orchestrator call chainAuthored-by: egg