Skip to content

feat: context file assessor improvements (ADR A.1, A.9, A.4)#477

Merged
jwm4 merged 4 commits into
mainfrom
feat/459-context-file-assessor-improvements
May 28, 2026
Merged

feat: context file assessor improvements (ADR A.1, A.9, A.4)#477
jwm4 merged 4 commits into
mainfrom
feat/459-context-file-assessor-improvements

Conversation

@jwm4
Copy link
Copy Markdown
Contributor

@jwm4 jwm4 commented May 28, 2026

Summary

  • CLAUDEmdAssessor: add context file length validation for all repos (two-phase scoring: 70 presence + 30 length, thresholds at 150/300 lines)
  • CLAUDEmdAssessor: detect agent access documentation as substantiating evidence (headings or platform+tool keyword co-occurrence)
  • PatternReferencesAssessor: tier skill scoring (1-2 SKILL.md files: 30 pts partial credit, 3+: 60 pts full credit) and warn when context file >150 lines with no skills
  • Rename CLAUDEmdAssessor to AgentInstructionsAssessor (class, display name, and attribute ID: claude_md_file -> agent_instructions) since the assessor now covers both CLAUDE.md and AGENTS.md equally

Implements Proposals A.1, A.9, and A.4 from the accepted ADR. Second of six implementation PRs for the ADR (first was #464).

Self-score change: 80.0 -> 74.5 Silver (unchanged from #464's rebalancing; length validation has no impact since this repo's CLAUDE.md is 136 lines).

Breaking change: attribute ID renamed from claude_md_file to agent_instructions. Any custom weight configs referencing the old ID will need updating.

Related issues

  1. Remove redundant assessors, realign tiers, rebalance weights (Remove redundant assessors, realign tiers, rebalance weights (ADR C.1-4, E.1-2) #458) - merged in refactor: remove redundant assessors, realign tiers, rebalance weights #464
  2. This PR - Context file assessor improvements (Context file assessor improvements (ADR A.1, A.9, A.4) #459)
  3. Test assessor enhancements (Test assessor enhancements (ADR A.2, A.3) #460)
  4. Enforcement and intent assessor improvements (Enforcement and intent assessor improvements (ADR A.5, A.8) #461)
  5. Code quality assessor enhancements (Code quality assessor enhancements (ADR A.6, A.7) #462)
  6. New assessors for architectural boundaries and threat models (New assessors for architectural boundaries and threat models (ADR B.1, B.2) #463)

Test plan

  • black . && isort . && ruff check . passes
  • pytest tests/unit/ passes (1089 passed, 17 skipped)
  • agentready assess . runs successfully (74.5/100 Silver)
  • 14 new tests for length validation, agent access evidence, skill tiering, and context file correlation
  • All existing tests pass with updated score expectations
  • grep -rn confirms zero stale references to CLAUDEmdAssessor or claude_md_file in source, tests, and configs

Closes #459

Posted by Bill Murdock with assistance from Claude Code.

Summary by CodeRabbit

  • New Features

    • Two-phase assessment for agent instruction files with length-based scoring tiers and non-blocking agent-access evidence.
    • Tiered scoring for pattern references awarding partial/full credit based on number of skill files.
    • Added comprehensive AGENTS handbook with usage, CLI, and contribution guidance.
  • Documentation

    • Renamed attribute examples to "agent_instructions" across docs, config samples, and README; updated scoring/guidance and slides.
  • Tests

    • Expanded unit/integration tests for scoring tiers, length rules, symlink/@ references, evidence detection, and CLI/config handling.

Add context file length validation, agent access documentation detection,
and skill depth tiering to improve how AgentReady evaluates context file
quality per the accepted ADR alignment with wg-agentic-sdlc best practices.

CLAUDEmdAssessor: two-phase scoring (70 presence + 30 length) with
thresholds at 150/300 lines, agent access section as substantiating
evidence. PatternReferencesAssessor: tiered skill scoring (1-2: 30pts,
3+: 60pts) with context file length correlation warning.

Closes #459

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 28, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 3cd33cb7-b754-4165-a10e-5f6713713c7c

📥 Commits

Reviewing files that changed from the base of the PR and between 4cced45 and 7e0ba3e.

📒 Files selected for processing (5)
  • docs/api-reference.md
  • docs/attributes.md
  • src/agentready/assessors/patterns.py
  • src/agentready/cli/align.py
  • tests/unit/test_cli_align.py
💤 Files with no reviewable changes (1)
  • src/agentready/assessors/patterns.py

📝 Walkthrough

Walkthrough

Implements ADR A.1/A.9/A.4: renames CLAUDEmdAssessor → AgentInstructionsAssessor, refactors assess() into presence + length-tier scoring, adds non-blocking agent-access evidence, tiers PatternReferencesAssessor skill credit (1–2 partial, 3+ full), and updates docs, tests, weights, fixers, and CLI wiring.

Changes

ADR A.1, A.9, A.4: Context file assessor improvements

Layer / File(s) Summary
Specification and documentation updates
CLAUDE.md, AGENTS.md, docs/attributes.md, docs/api-reference.md, docs/developer-guide.md, docs/user-guide.md, .agentready-config.example.yaml, README.md, scripts/generate_slides.py, experiments/configs/*
Replace claude_md_fileagent_instructions, add AGENTS.md handbook, document two-phase presence+length scoring and skill-tiering, and update example configs/snippets.
AgentInstructionsAssessor: Implementation
src/agentready/assessors/documentation.py
Rename assessor and refactor assess() into Phase 1 presence resolution (CLAUDE.md/.claude/AGENTS.md, symlinks/@ refs, >=50 bytes) and Phase 2 length-tier scoring (<=150 full, <=300 partial, >300 none); add _check_agent_access() to append non-blocking evidence and update remediation text.
PatternReferencesAssessor: Skill Depth Tiering
src/agentready/assessors/patterns.py
Tier SKILL.md scoring: 3+ SKILL.md → full (60 pts), 1–2 → partial (30 pts); when no skills exist, warn if CLAUDE.md/AGENTS.md >150 lines recommending extraction to .claude/skills/.
Tests: unit/integration/e2e
tests/unit/test_assessors_documentation.py, tests/unit/test_assessors_patterns.py, tests/integration/*, tests/e2e/*, tests/unit/cli/*, tests/unit/test_fixers.py, tests/unit/test_batch_assessment.py
Rename tests/fixtures to AgentInstructionsAssessor, add length-tier and agent-access evidence tests, add skill-depth tiering tests and context-length warnings, and update CLI/config tests to use agent_instructions.
Wiring: assessor exports, weights, fixers, review formatter, CLI align
src/agentready/assessors/__init__.py, src/agentready/data/default-weights.yaml, src/agentready/fixers/documentation.py, src/agentready/github/review_formatter.py, src/agentready/cli/align.py, docstrings in base/fixers/models/services`
Replace claude_md_file references with agent_instructions across factory exports, default weights, fixer matching, review formatter, CLI tips, and docstring examples.

Sequence Diagram: assess flow

sequenceDiagram
  participant CLI as CLI/Caller
  participant Assessor as AgentInstructionsAssessor
  participant Resolver as DocumentationResolver
  participant AccessChk as _check_agent_access
  CLI->>Assessor: assess(repository)
  Assessor->>Resolver: resolve CLAUDE.md/.claude/AGENTS.md (follow symlinks/@ refs)
  Resolver-->>Assessor: content or missing
  Assessor->>Assessor: Phase1 presence gate (>=50 bytes)
  Assessor->>Assessor: Phase2 length-tier scoring (<=150/<=300/>300)
  Assessor->>AccessChk: detect agent access evidence
  AccessChk-->>Assessor: evidence (non-blocking)
  Assessor-->>CLI: Finding(score,evidence)
Loading

Possibly related PRs

Suggested labels

released

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed Title follows Conventional Commits format with type 'feat' and includes scope 'context file assessor improvements' plus linked ADR references.
Linked Issues check ✅ Passed All three ADR proposals (A.1, A.9, A.4) from issue #459 are fully implemented: length validation with tiered scoring, agent access detection as evidence, and skill depth tiering with context correlation.
Out of Scope Changes check ✅ Passed All changes align directly with ADR A.1, A.9, A.4 objectives. Class rename, scoring logic, evidence detection, and test updates are all in-scope documentation and assessor improvements.
Docstring Coverage ✅ Passed Docstring coverage is 94.87% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/459-context-file-assessor-improvements
✨ Simplify code
  • Create PR with simplified code
  • Commit simplified code in branch feat/459-context-file-assessor-improvements

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 and usage tips.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 28, 2026

📈 Test Coverage Report

Branch Coverage
This PR 73.1%
Main 72.9%
Diff ✅ +0.2%

Coverage calculated from unit tests only

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/agentready/assessors/documentation.py`:
- Around line 78-83: When resolving and opening symlinked files (e.g.,
claude_md_path -> resolved_path), restrict reads to inside the repository root:
after computing resolved_path = claude_md_path.resolve(strict=True), verify the
target is under repository.path (use repository.path.resolve() and either
Path.is_relative_to(resolved_path) or compare pathlib.Path(commonpath(...)) )
and skip or raise if it is outside; apply the same guard around the other
file-open block that reads the alternate path (the block at lines 91-97) so
neither symlink target nor resolved files outside repository.path are read.

In `@src/agentready/assessors/patterns.py`:
- Around line 106-122: The loop that checks CLAUDE.md and AGENTS.md stops after
the first existing file because of the unconditional break; update the logic in
the block that handles the no-skills length check (variables: has_skills,
ctx_name, ctx_path, ctx_lines, evidence) to remove the break so both files are
evaluated (so a short CLAUDE.md does not suppress a long AGENTS.md); ensure you
still catch OSError/UnicodeDecodeError as before and only skip that file on
exception, allowing the loop to continue to the next ctx_name.
🪄 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: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 0e869854-bb8c-4e33-9d76-e7e82766f27b

📥 Commits

Reviewing files that changed from the base of the PR and between 6a55a4c and 3b52e79.

📒 Files selected for processing (6)
  • CLAUDE.md
  • docs/attributes.md
  • src/agentready/assessors/documentation.py
  • src/agentready/assessors/patterns.py
  • tests/unit/test_assessors_documentation.py
  • tests/unit/test_assessors_patterns.py

Comment thread src/agentready/assessors/documentation.py
Comment thread src/agentready/assessors/patterns.py
The assessor now covers both CLAUDE.md and AGENTS.md equally, so the
CLAUDE-specific name was misleading. Rename the class, display name,
and attribute ID across all source, tests, configs, and docs.

- Class: CLAUDEmdAssessor -> AgentInstructionsAssessor
- Display name: "CLAUDE.md Configuration Files" -> "Agent Instruction Files"
- Attribute ID: claude_md_file -> agent_instructions

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
src/agentready/cli/align.py (1)

149-156: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Gate the Claude CLI tip to missing-file failures only.

Line 152 now shows the Claude CLI / ANTHROPIC_API_KEY tip for any agent_instructions failure. With the new length-based scoring, this attribute can fail even when instruction files exist, so this message can point users to the wrong remediation.

Suggested fix
-        if "agent_instructions" in failing_ids:
+        has_instruction_file = any(
+            (repo_path / rel_path).exists()
+            for rel_path in ("CLAUDE.md", "AGENTS.md", ".claude/CLAUDE.md")
+        )
+        if "agent_instructions" in failing_ids and not has_instruction_file:
             click.echo(
                 "\n💡 Tip: Install the Claude CLI and set ANTHROPIC_API_KEY to "
                 "enable automatic CLAUDE.md generation."
             )
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/agentready/cli/align.py` around lines 149 - 156, The tip is currently
shown whenever "agent_instructions" is in failing_ids; change this so you only
show the Claude CLI / ANTHROPIC_API_KEY tip when the agent_instructions failure
is due to a missing instruction file. Replace the simple membership check with a
targeted check over assessment.findings (e.g. find any f where f.attribute.id ==
"agent_instructions" and f.status == "fail" and the failure indicates a missing
file — check f.message, f.reason or f.metadata for keywords like "missing" /
"not found" or a missing_files entry); only call click.echo(...) when that
missing-file condition is true. Ensure you still reference the same symbols:
failing_ids, assessment.findings, and the click.echo block for the tip.
docs/api-reference.md (1)

111-117: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Update the example description to match current assessor behavior.

The example now uses agent_instructions, but the description still says “CLAUDE.md file at repository root,” which no longer reflects AGENTS.md and .claude/CLAUDE.md support.

Suggested doc tweak
-    description="CLAUDE.md file at repository root",
+    description="Agent instruction file (CLAUDE.md, AGENTS.md, or .claude/CLAUDE.md)",
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/api-reference.md` around lines 111 - 117, The entry with
id="agent_instructions" has an outdated description mentioning only “CLAUDE.md
file at repository root”; update the description to reflect current assessor
behavior by listing supported instruction files (e.g., AGENTS.md and
.claude/CLAUDE.md as well as CLAUDE.md) and adjust the rationale or description
text in the same block (id="agent_instructions", name="Agent Instruction Files")
so it accurately documents all supported locations and filenames.
♻️ Duplicate comments (1)
src/agentready/assessors/documentation.py (1)

77-83: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Block out-of-repo symlink targets before any file read.

CLAUDE.md / referenced files are opened after resolution without enforcing repository boundaries. A crafted symlink can make the assessor read host files outside repository.path, affecting score/evidence and expanding filesystem read scope.

Suggested hardening pattern
-            with open(resolved_path, "r", encoding="utf-8") as f:
+            repo_root = repository.path.resolve()
+            if not resolved_path.is_relative_to(repo_root):
+                raise FileNotFoundError("Resolved path outside repository")
+            with open(resolved_path, "r", encoding="utf-8") as f:
                 file_content = f.read()
-    def _read_referenced_file(self, file_path: Path) -> tuple[str | None, int]:
+    def _read_referenced_file(
+        self, file_path: Path, repository_root: Path
+    ) -> tuple[str | None, int]:
         """Read a referenced file and return its content and size.
 
         Returns (content, size) tuple, or (None, 0) if file doesn't exist or can't be read.
         """
         try:
-            with open(file_path, "r", encoding="utf-8") as f:
-                content = f.read()
+            resolved = file_path.resolve(strict=True)
+            if not resolved.is_relative_to(repository_root.resolve()):
+                return None, 0
+            with open(resolved, "r", encoding="utf-8") as f:
+                content = f.read()
             return content, len(content)
         except (FileNotFoundError, OSError, UnicodeDecodeError):
             return None, 0

Also applies to: 242-252

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/agentready/assessors/documentation.py` around lines 77 - 83, The code
opens claude_md_path after resolving symlinks without ensuring the resolved
target lives inside the repository; change the flow in the block that uses
claude_md_path (and the similar block at the other occurrence) to first detect
symlinks via claude_md_path.is_symlink(), then resolve the target
(claude_md_path.resolve(strict=True)) and immediately validate that
resolved_path is inside repository.path (use
resolved_path.is_relative_to(repository.path) or compare
resolved_path.resolve().parents against repository.path.resolve()); if the
resolved target is outside the repo, log/ignore/raise and do not open the file.
Ensure the same check is applied before any open(...) call in both locations.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@docs/api-reference.md`:
- Around line 111-117: The entry with id="agent_instructions" has an outdated
description mentioning only “CLAUDE.md file at repository root”; update the
description to reflect current assessor behavior by listing supported
instruction files (e.g., AGENTS.md and .claude/CLAUDE.md as well as CLAUDE.md)
and adjust the rationale or description text in the same block
(id="agent_instructions", name="Agent Instruction Files") so it accurately
documents all supported locations and filenames.

In `@src/agentready/cli/align.py`:
- Around line 149-156: The tip is currently shown whenever "agent_instructions"
is in failing_ids; change this so you only show the Claude CLI /
ANTHROPIC_API_KEY tip when the agent_instructions failure is due to a missing
instruction file. Replace the simple membership check with a targeted check over
assessment.findings (e.g. find any f where f.attribute.id ==
"agent_instructions" and f.status == "fail" and the failure indicates a missing
file — check f.message, f.reason or f.metadata for keywords like "missing" /
"not found" or a missing_files entry); only call click.echo(...) when that
missing-file condition is true. Ensure you still reference the same symbols:
failing_ids, assessment.findings, and the click.echo block for the tip.

---

Duplicate comments:
In `@src/agentready/assessors/documentation.py`:
- Around line 77-83: The code opens claude_md_path after resolving symlinks
without ensuring the resolved target lives inside the repository; change the
flow in the block that uses claude_md_path (and the similar block at the other
occurrence) to first detect symlinks via claude_md_path.is_symlink(), then
resolve the target (claude_md_path.resolve(strict=True)) and immediately
validate that resolved_path is inside repository.path (use
resolved_path.is_relative_to(repository.path) or compare
resolved_path.resolve().parents against repository.path.resolve()); if the
resolved target is outside the repo, log/ignore/raise and do not open the file.
Ensure the same check is applied before any open(...) call in both locations.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 5276dfa4-1be0-4196-a2f1-48f9d87dbce9

📥 Commits

Reviewing files that changed from the base of the PR and between 3b52e79 and 4cced45.

📒 Files selected for processing (30)
  • .agentready-config.example.yaml
  • AGENTS.md
  • CLAUDE.md
  • README.md
  • docs/api-reference.md
  • docs/attributes.md
  • docs/developer-guide.md
  • docs/user-guide.md
  • experiments/configs/claude-md.yaml
  • experiments/configs/tier1.yaml
  • scripts/generate_slides.py
  • src/agentready/assessors/__init__.py
  • src/agentready/assessors/base.py
  • src/agentready/assessors/documentation.py
  • src/agentready/cli/align.py
  • src/agentready/data/.agentready-config.example.yaml
  • src/agentready/data/default-weights.yaml
  • src/agentready/fixers/base.py
  • src/agentready/fixers/documentation.py
  • src/agentready/github/review_formatter.py
  • src/agentready/models/attribute.py
  • src/agentready/models/eval_harness.py
  • src/agentready/services/llm_cache.py
  • tests/e2e/test_critical_paths.py
  • tests/integration/test_scan_workflow.py
  • tests/unit/cli/test_main.py
  • tests/unit/test_assessors_documentation.py
  • tests/unit/test_batch_assessment.py
  • tests/unit/test_cli_align.py
  • tests/unit/test_fixers.py

Copy link
Copy Markdown
Contributor Author

@jwm4 jwm4 left a comment

Choose a reason for hiding this comment

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

Review from Bill Murdock (with assistance from Claude Code)

Code Review

The core logic is correct and well-tested. A few things to address:

Should fix before merge:

  1. Drop AGENTS.md from this PR. It's a near-copy of CLAUDE.md (only differences: stale self-score "80.0/100 Gold" vs the correct "74.5/100 Silver", and a minor line reference). Adding AGENTS.md for cross-tool compatibility is a good idea, but it's outside the scope of the assessor logic changes and should be its own PR where it can get a proper review pass.

  2. docs/attributes.md heading (line 53): Section heading still reads "### 1. CLAUDE.md Configuration File" but the ID and display name were renamed to agent_instructions / "Agent Instruction Files".

Optional (quick fixes):

  1. Unconditional break in patterns.py length check (line 122): The context-file-length correlation loop breaks after the first existing file. A short CLAUDE.md suppresses checking a potentially long AGENTS.md. CodeRabbit flagged this too. Removing the break is a one-line fix.

Fine as follow-ups:

  1. Symlink traversal outside repo boundary (pre-existing, low risk)
  2. base_score variable naming could be clearer (nit)

Real-repo validation

Ran the PR branch's assessor against four repositories to validate scoring behavior:

Repo agent_instructions Score Key evidence
wasp-lang/open-saas FAIL 0 No CLAUDE.md or AGENTS.md
cloudflare/chanfana PASS 100 AGENTS.md only, 137 lines (full length credit)
atopile/atopile PASS 100 CLAUDE.md 76 lines + AGENTS.md symlink + 21 skills
ambient-code/agentready PASS 100 CLAUDE.md 136 lines + AGENTS.md, 74.5 overall (Silver)

Observations:

  • Rename from claude_md_file to agent_instructions works cleanly across all repos
  • Length validation correctly awards full credit for files <=150 lines (unit tests cover the 151-300 and >300 tiers)
  • AGENTS.md-only path scores correctly (chanfana: 100, no CLAUDE.md present)
  • Skill tiering works: atopile's 21 SKILL.md files earn full 60-point credit in pattern_references (score 80 = 60 skills + 20 examples)
  • No false positives on agent access detection
  • Self-score confirmed at 74.5 Silver, matching PR description

- Drop AGENTS.md from PR (should be its own PR)
- Fix docs/attributes.md heading to match renamed attribute
- Remove unconditional break in patterns.py length correlation loop
  so both CLAUDE.md and AGENTS.md are checked
- Gate align CLI tip to missing-file failures only (not length failures)
- Fix docs/api-reference.md example description for renamed attribute

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Copy link
Copy Markdown
Contributor Author

@jwm4 jwm4 left a comment

Choose a reason for hiding this comment

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

Thanks for the quick turnaround. Three of the four fixes look good:

  • docs/attributes.md heading: fixed
  • patterns.py break removed: fixed
  • align.py tip gated to missing-file only: nice bonus, good catch
  • docs/api-reference.md description updated: good catch

One issue: AGENTS.md is still in the diff. The commit message says "Drop AGENTS.md from PR" but the file is still present on the branch (4895 bytes, doesn't exist on main). Looks like the git rm didn't happen.

Review from Bill Murdock with assistance from Claude Code.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 28, 2026

Actionable comments posted: 0

@jwm4 jwm4 merged commit 162afee into main May 28, 2026
6 checks passed
@github-actions
Copy link
Copy Markdown
Contributor

🎉 This PR is included in version 2.43.0 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Context file assessor improvements (ADR A.1, A.9, A.4)

1 participant