Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,12 +32,12 @@ This rule applies to every PR Claude opens, including small fixes and follow-ups

## MCP Tools (Serena & Context7)

**Serena** - Prefer for Python/TypeScript code navigation and editing:
- `jet_brains_find_symbol` / `jet_brains_get_symbols_overview` - Find classes, functions, methods
- `jet_brains_find_referencing_symbols` - Find all usages of a symbol
- `replace_symbol_body` / `insert_after_symbol` - Edit entire functions/classes
- `replace_content` (regex) - Small inline edits
- `search_for_pattern` / `list_dir` / `find_file` - Non-code files, directory exploration
**Serena** - Prefer for Python/TypeScript code navigation and editing (canonical MCP-prefix is `mcp__serena__*`):
- `mcp__serena__jet_brains_find_symbol` / `mcp__serena__jet_brains_get_symbols_overview` - Find classes, functions, methods
- `mcp__serena__jet_brains_find_referencing_symbols` - Find all usages of a symbol
- `mcp__serena__replace_symbol_body` / `mcp__serena__insert_after_symbol` - Edit entire functions/classes
- `mcp__serena__replace_content` (regex) - Small inline edits
- `mcp__serena__search_for_pattern` / `mcp__serena__list_dir` / `mcp__serena__find_file` - Non-code files, directory exploration

**Context7** - Use for up-to-date library documentation:
- `resolve-library-id` -> `query-docs` - Get current API docs, code examples
Expand Down
163 changes: 163 additions & 0 deletions agentic/audits/2026-05-05-all.md

Large diffs are not rendered by default.

180 changes: 138 additions & 42 deletions agentic/audits/latest.md

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion agentic/commands/audit/agentic-auditor.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ You are the **agentic-auditor** on the audit team. Your scope is the **agent erg
- `agentic/commands/` and `.claude/commands/` (the symlink): command consistency, broken inter-command references, oversized commands that exceed sane budgets, ambiguous slash-command semantics, missing or duplicated commands, slash-command argument patterns that drift between commands
- `prompts/`: same drift checks the llm-pipeline-auditor does at the SDK layer, but at the *prompt-management* layer — versioning, ownership, where prompts are loaded from, whether inline prompts in code should have moved to files
- `.claude/`: settings sanity (`settings.json`, `settings.local.json`), permission/hook configuration, MCP server registration consistency
- `agentic/workflows/`, `agentic/audits/`, `agentic/scripts/`, `agentic/docs/`: directory hygiene, naming conventions, abandoned subdirectories, docs that contradict CLAUDE.md
- `agentic/workflows/`, `agentic/audits/`, `automation/scripts/`, `agentic/docs/`: directory hygiene, naming conventions, abandoned subdirectories, docs that contradict CLAUDE.md
- TAC-style sanity (only flag what's actually weak): conditional docs (`/docs`-style routing), model routing per task, self-validation loops, ADWs, context-window discipline (commands that load way more than they need)

**How to work:**
Expand Down
20 changes: 10 additions & 10 deletions agentic/workflows/modules/agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import time
import uuid
from enum import Enum
from typing import Any, Dict, List, Literal, Optional, Tuple, Type, TypeVar
from typing import Any, Dict, List, Literal, Tuple, Type, TypeVar

from dotenv import load_dotenv
from pydantic import BaseModel
Expand Down Expand Up @@ -52,16 +52,16 @@ class AgentPromptRequest(BaseModel):
cli: Literal["claude", "copilot", "gemini"] = "claude"
dangerously_skip_permissions: bool = False
output_file: str
working_dir: Optional[str] = None
timeout: Optional[int] = 1800 # seconds (default: 30 min)
working_dir: str | None = None
timeout: int | None = 1800 # seconds (default: 30 min)


class AgentPromptResponse(BaseModel):
"""Claude Code agent response."""

output: str
success: bool
session_id: Optional[str] = None
session_id: str | None = None
retry_code: RetryCode = RetryCode.NONE


Expand All @@ -74,7 +74,7 @@ class AgentTemplateRequest(BaseModel):
run_id: str
model: Literal["small", "medium", "large"] = "large"
cli: Literal["claude", "copilot", "gemini"] = "claude"
working_dir: Optional[str] = None
working_dir: str | None = None


class ClaudeCodeResultMessage(BaseModel):
Expand All @@ -98,7 +98,7 @@ class TestResult(BaseModel):
passed: bool
execution_command: str
test_purpose: str
error: Optional[str] = None
error: str | None = None


class ReviewIssue(BaseModel):
Expand Down Expand Up @@ -276,7 +276,7 @@ def build_cli_command(
prompt: str,
model: str,
dangerously_skip_permissions: bool,
mcp_config_path: Optional[str] = None,
mcp_config_path: str | None = None,
) -> List[str]:
"""Build CLI-specific command arguments.

Expand Down Expand Up @@ -383,7 +383,7 @@ def truncate_output(output: str, max_length: int = 500, suffix: str = "... (trun
return output[:truncate_at] + suffix


def check_cli_installed(cli: str = "claude") -> Optional[str]:
def check_cli_installed(cli: str = "claude") -> str | None:
"""Check if CLI tool is installed. Return error message if not.

Args:
Expand All @@ -402,7 +402,7 @@ def check_cli_installed(cli: str = "claude") -> Optional[str]:
return None


def parse_jsonl_output(output_file: str) -> Tuple[List[Dict[str, Any]], Optional[Dict[str, Any]]]:
def parse_jsonl_output(output_file: str) -> Tuple[List[Dict[str, Any]], Dict[str, Any] | None]:
"""Parse JSONL output file and return all messages and the result message.

Returns:
Expand Down Expand Up @@ -448,7 +448,7 @@ def convert_jsonl_to_json(jsonl_file: str) -> str:
return json_file


def save_last_entry_as_raw_result(json_file: str) -> Optional[str]:
def save_last_entry_as_raw_result(json_file: str) -> str | None:
"""Save the last entry from a JSON array file as cc_final_object.json.

Args:
Expand Down
20 changes: 10 additions & 10 deletions agentic/workflows/modules/state.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,46 +76,46 @@ def prompt(self) -> str:
return self.data.get("prompt", "")

@property
def task_type(self) -> Optional[str]:
def task_type(self) -> str | None:
return self.data.get("task_type")

@property
def plan_file(self) -> Optional[str]:
def plan_file(self) -> str | None:
return self.data.get("plan_file")

@property
def test_passed(self) -> Optional[bool]:
def test_passed(self) -> bool | None:
return self.data.get("test_passed")

@property
def test_failed_count(self) -> Optional[int]:
def test_failed_count(self) -> int | None:
return self.data.get("test_failed_count")

@property
def review_success(self) -> Optional[bool]:
def review_success(self) -> bool | None:
return self.data.get("review_success")

@property
def review_blocker_count(self) -> Optional[int]:
def review_blocker_count(self) -> int | None:
return self.data.get("review_blocker_count")

@property
def document_path(self) -> Optional[str]:
def document_path(self) -> str | None:
return self.data.get("document_path")

@property
def commit_message(self) -> Optional[str]:
def commit_message(self) -> str | None:
return self.data.get("commit_message")

@property
def pr_url(self) -> Optional[str]:
def pr_url(self) -> str | None:
return self.data.get("pr_url")

def _get_state_path(self, working_dir: str) -> str:
"""Get path to state file."""
return os.path.join(working_dir, "agentic", "runs", self.run_id, self.STATE_FILENAME)

def save(self, working_dir: str, phase: Optional[str] = None) -> str:
def save(self, working_dir: str, phase: str | None = None) -> str:
"""Save state to agentic/runs/{run_id}/state.json.

Returns:
Expand Down
8 changes: 4 additions & 4 deletions alembic/versions/393d66bd73d9_initial_schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

"""

from typing import Sequence, Union
from typing import Sequence

import sqlalchemy as sa
from sqlalchemy.dialects import postgresql
Expand All @@ -16,9 +16,9 @@

# revision identifiers, used by Alembic.
revision: str = "393d66bd73d9"
down_revision: Union[str, None] = None
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
down_revision: str | None = None
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None


def upgrade() -> None:
Expand Down
8 changes: 4 additions & 4 deletions alembic/versions/6345896e2e90_add_extended_review_fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

"""

from typing import Sequence, Union
from typing import Sequence

import sqlalchemy as sa
from sqlalchemy.dialects import postgresql
Expand All @@ -21,9 +21,9 @@

# revision identifiers, used by Alembic.
revision: str = "6345896e2e90"
down_revision: Union[str, None] = "d0c76553a5cc"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
down_revision: str | None = "d0c76553a5cc"
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None


def upgrade() -> None:
Expand Down
8 changes: 4 additions & 4 deletions alembic/versions/7ccd65103917_add_tags_gin_index.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,16 @@
Supports queries like: WHERE tags->'plot_type' ? 'scatter'
"""

from typing import Sequence, Union
from typing import Sequence

from alembic import op


# revision identifiers, used by Alembic.
revision: str = "7ccd65103917"
down_revision: Union[str, None] = "b26e9f4b532d"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
down_revision: str | None = "b26e9f4b532d"
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None


def upgrade() -> None:
Expand Down
8 changes: 4 additions & 4 deletions alembic/versions/a2f4b8c91d23_add_impl_tags.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

"""

from typing import Sequence, Union
from typing import Sequence

import sqlalchemy as sa
from sqlalchemy.dialects import postgresql
Expand All @@ -20,9 +20,9 @@

# revision identifiers, used by Alembic.
revision: str = "a2f4b8c91d23"
down_revision: Union[str, None] = "6345896e2e90"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
down_revision: str | None = "6345896e2e90"
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None


def upgrade() -> None:
Expand Down
8 changes: 4 additions & 4 deletions alembic/versions/b26e9f4b532d_add_description_to_libraries.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

"""

from typing import Sequence, Union
from typing import Sequence

import sqlalchemy as sa

Expand All @@ -15,9 +15,9 @@

# revision identifiers, used by Alembic.
revision: str = "b26e9f4b532d"
down_revision: Union[str, None] = "6a8ae95eaf56"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
down_revision: str | None = "6a8ae95eaf56"
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None


def upgrade() -> None:
Expand Down
8 changes: 4 additions & 4 deletions alembic/versions/b833d85c09ed_remove_preview_thumb_column.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

"""

from typing import Sequence, Union
from typing import Sequence

import sqlalchemy as sa

Expand All @@ -15,9 +15,9 @@

# revision identifiers, used by Alembic.
revision: str = "b833d85c09ed"
down_revision: Union[str, None] = "a2f4b8c91d23"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
down_revision: str | None = "a2f4b8c91d23"
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None


def upgrade() -> None:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

"""

from typing import Sequence, Union
from typing import Sequence

import sqlalchemy as sa
from sqlalchemy.dialects import postgresql
Expand All @@ -16,9 +16,9 @@

# revision identifiers, used by Alembic.
revision: str = "c36d82383e1d"
down_revision: Union[str, None] = "d1d415f44d31"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
down_revision: str | None = "d1d415f44d31"
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None


def upgrade() -> None:
Expand Down
8 changes: 4 additions & 4 deletions alembic/versions/d0c76553a5cc_add_performance_indexes.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,16 @@

"""

from typing import Sequence, Union
from typing import Sequence

from alembic import op


# revision identifiers, used by Alembic.
revision: str = "d0c76553a5cc"
down_revision: Union[str, None] = "c36d82383e1d"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
down_revision: str | None = "c36d82383e1d"
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None


def upgrade() -> None:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

"""

from typing import Sequence, Union
from typing import Sequence

import sqlalchemy as sa
from sqlalchemy.dialects import postgresql
Expand All @@ -16,9 +16,9 @@

# revision identifiers, used by Alembic.
revision: str = "d1d415f44d31"
down_revision: Union[str, None] = "7ccd65103917"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
down_revision: str | None = "7ccd65103917"
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None


def upgrade() -> None:
Expand Down
8 changes: 4 additions & 4 deletions alembic/versions/e1f3a2c4d5b6_add_language_to_libraries.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

"""

from typing import Sequence, Union
from typing import Sequence

import sqlalchemy as sa

Expand All @@ -15,9 +15,9 @@

# revision identifiers, used by Alembic.
revision: str = "e1f3a2c4d5b6"
down_revision: Union[str, None] = "b833d85c09ed"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
down_revision: str | None = "b833d85c09ed"
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None


def upgrade() -> None:
Expand Down
Loading
Loading