S57: spawn fix + bypass updates + Dockerfile auth (#134)
* fix(security): enable auth on code-server container Unauthenticated code-server exposed to all network interfaces. Changed --auth none to --auth password. Auto-generates random password on first run. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(seedgo): checker consolidation: testing→error_handling, test_coverage merged into test_quality v4.0 Co-Authored-By: @seedgo <seedgo@aipass> * S57: spawn .spawn/README.md fix, bypass updates, Dockerfile auth, README stats - Spawn: fixed .spawn/ skip in regenerate_registry_ops + meta_ops (was blocking .spawn/README.md push) - Bypass updates: cli, flow, trigger — testing→error_handling, test_coverage→test_quality refs - Dockerfile: auth enabled on code-server container - README: updated stats (130+ PRs, 56 sessions, 1600+ tests, 96% compliance) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Co-authored-by: @seedgo <seedgo@aipass>
This commit is contained in:
co-authored by
Claude Opus 4.6
@seedgo
parent
24b6391c90
commit
88bd97a687
@@ -96,3 +96,4 @@ src/aipass/memory/config/fragmented_memory_state.json
|
||||
|
||||
.vscode
|
||||
src/aipass/memory/config/memory_bank.config.json
|
||||
src/aipass/spawn/templates/builder/.spawn/.template_registry.json
|
||||
|
||||
+6
-2
@@ -8,12 +8,16 @@ RUN apt-get update && apt-get install -y \
|
||||
python3-pip \
|
||||
python3-venv \
|
||||
python3-full \
|
||||
alsa-utils \
|
||||
&& curl -fsSL https://deb.nodesource.com/setup_20.x | bash - \
|
||||
&& apt-get install -y nodejs \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Install Claude Code globally
|
||||
RUN npm install -g @anthropic-ai/claude-code
|
||||
# Install Claude Code (as coder so it's accessible at runtime)
|
||||
USER 1000
|
||||
RUN curl -fsSL https://claude.ai/install.sh | bash
|
||||
USER root
|
||||
ENV PATH="/home/coder/.local/bin:$PATH"
|
||||
|
||||
# Create venv owned by coder user (UID 1000)
|
||||
RUN python3 -m venv /opt/venv \
|
||||
|
||||
@@ -3,49 +3,11 @@
|
||||
|
||||
# AIPass
|
||||
|
||||
> **An AI operating system.** Persistent memory, multi-agent orchestration, and autonomous citizens — all in one filesystem.
|
||||
A multi-agent operating system where AI agents live as citizens in a shared filesystem. Persistent memory, inter-agent messaging, standards enforcement, and CLI routing — no cloud required.
|
||||
|
||||
AIPass is a framework where AI agents live as **citizens** in a shared system. Each citizen has its own directory, identity, memories, and mailbox. They communicate, delegate work, enforce standards, and build their own capabilities over time — without stepping on each other's toes.
|
||||
## Setup
|
||||
|
||||
The goal: `pip install aipass`, run `aipass init` in any directory, and get a fully operational AI agent ecosystem. No cloud services, no external dependencies, no vendor lock-in.
|
||||
|
||||
## What We're Building
|
||||
|
||||
An operating system for AI agents. Not a chatbot wrapper. Not a prompt chain. A persistent, multi-agent environment where:
|
||||
|
||||
- **15 citizens** work in the same filesystem without isolation (no git worktrees, no sandboxes)
|
||||
- **Dispatch locks** prevent conflicts — if an agent is working, incoming tasks queue instead of spawning duplicates
|
||||
- **Persistent memory** survives across sessions via `.trinity/` files (identity, session history, collaboration patterns)
|
||||
- **Standards enforcement** keeps the system consistent as it grows (seedgo runs 34 automated checks, system-wide avg 93% compliance)
|
||||
- **Diagnostic tooling** — 20 standalone scanners cover code quality, security, documentation, and compliance
|
||||
- **Inter-agent messaging** lets citizens email each other, dispatch tasks, and wake each other up
|
||||
- **Everything is tracked** — dev plans (DPLANs), execution plans (FPLANs), and seedgo audits make changes traceable even when 500+ files change in a single session
|
||||
- **Init anywhere** — `aipass init` turns any directory into a self-contained AI workspace with its own registry, identity, and memories. No repo required. A business project, a research folder, a side project — each gets its own isolated environment that works immediately
|
||||
|
||||
## Current State: Beta
|
||||
|
||||
**It works.** All 15 branches operational. 130+ PRs merged. 56 orchestration sessions. 1,600+ tests across the system. 173 drone commands discovered. System-wide compliance at 96% average across 34 automated standards checks.
|
||||
|
||||
**Recently completed:**
|
||||
|
||||
- **Spawn template overhaul** — regenerate-registry command built with 3-pass ID matching (hash→path→new). Template registry 26→41 files. System-wide push: 12/12 branches updated, 227 additions, 0 errors. READMEs added to all standard directories across 15 branches.
|
||||
- **Test quality standard** — expanded from 8 to 48 standard test items across 10 categories (JSON handler, CLI routing, conftest, error resilience, type contracts, exception contracts, data contracts, success/failure paths, init/provisioning, infrastructure mocking). Seedgo checker scans for function coverage, not just file existence.
|
||||
- **Persistent citizen branches** — each citizen uses `citizen/{name}` instead of throwaway `feat/` branches. Force-push-with-lease on subsequent PRs. Remote branches cleaned from 74 to 5 (main + 4 citizen).
|
||||
- **Git deny rules system-wide** — `.claude/settings.local.json` tracked across all 15 branches. Blocks raw git commit/push in favor of `drone @git pr`. Prevents the divergence, conflicts, and broken PRs that raw git caused.
|
||||
- **System-wide compliance sprint** — all 14 branches audited and dispatched for silent catch fixes. 13 branches completed autonomously (8 running in parallel). System average 88%→96%.
|
||||
- **Seedgo 34-standard audit pack** — 10 new checkers integrated from diagnostic tools. All auto-discovered via `*_check.py` pattern. Bypass system working with `.seedgo/bypass.json` per branch.
|
||||
|
||||
**What we're solving now:**
|
||||
|
||||
- **Test quality across branches** — 10-category checker built, needs validation across all branches
|
||||
- **Drone git workflow** — master key concept for system-wide PRs from devpulse. PR review gate for production readiness.
|
||||
- **Branch audits** — DPLANs open for api, drone, commons, backup, spawn, ai_mail. Remaining 7 branches need DPLANs.
|
||||
- **Cross-platform reliability** — Linux and Windows tested. macOS structurally supported. All paths use `pathlib`, secrets at `~/.secrets/aipass/`.
|
||||
- **Agent agnosticism** — currently focused on [Claude Code](https://docs.anthropic.com/en/docs/claude-code) (hooks for auto-diagnostics, prompt injection, session recovery). But AIPass is designed to not depend on any single provider. `agents.md` and `gemini.md` can bootstrap the system for Codex and Gemini — you lose hooks but keep the core.
|
||||
|
||||
## Getting Started
|
||||
|
||||
### Install
|
||||
### Quick (full setup)
|
||||
|
||||
```bash
|
||||
git clone https://github.com/AIOSAI/AIPass.git
|
||||
@@ -54,135 +16,131 @@ cd AIPass
|
||||
source .venv/bin/activate
|
||||
```
|
||||
|
||||
`setup.sh` creates the venv, installs the package, generates the branch registry (15 branches), bootstraps identity files for every branch, and installs hooks. Idempotent — safe to re-run.
|
||||
`setup.sh` creates a venv, installs the package, generates the branch registry (15 branches), bootstraps `.trinity/` identity files, copies an empty `.env` template to `~/.secrets/aipass/.env`, and installs Claude Code hooks. Idempotent — safe to re-run.
|
||||
|
||||
> **Why clone?** You can `pip install aipass`, but during beta we recommend cloning. Your agents can see the source, read other branches, and help you troubleshoot. Once the system stabilizes, `pip install` + `aipass init` will be the standard path.
|
||||
### Manual (dev)
|
||||
|
||||
Verify:
|
||||
```bash
|
||||
git clone https://github.com/AIOSAI/AIPass.git
|
||||
cd AIPass
|
||||
pip install -e ".[dev]" # Editable install + dev tools
|
||||
./setup.sh # Bootstrap registry, identities, hooks
|
||||
```
|
||||
|
||||
### Add your API keys
|
||||
|
||||
```bash
|
||||
nano ~/.secrets/aipass/.env
|
||||
```
|
||||
|
||||
### Verify
|
||||
|
||||
```bash
|
||||
drone systems # Should show 15 branches
|
||||
```
|
||||
|
||||
### Start With Devpulse
|
||||
### Docker
|
||||
|
||||
Devpulse is the orchestration hub — your first relationship in the system. Start here.
|
||||
```bash
|
||||
docker build -t aipass .
|
||||
docker run -d -p 8080:8080 aipass
|
||||
```
|
||||
|
||||
Opens a code-server IDE with Python, Node, and Claude Code pre-installed. Password is auto-generated — check `docker logs <container>` for the config path.
|
||||
|
||||
Inside the container:
|
||||
|
||||
```bash
|
||||
bash setup-workspace.sh # Clones repo and installs
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
Start with devpulse — the orchestration hub:
|
||||
|
||||
```bash
|
||||
cd src/aipass/devpulse
|
||||
claude --permission-mode bypassPermissions
|
||||
```
|
||||
|
||||
Then just talk to it. Ask what the system is, what's been built, what branches exist, how drone works, what it knows, what it doesn't. Devpulse will investigate, dispatch other branches, and bring information back to you.
|
||||
Talk to it. It dispatches to specialist branches and brings results back. You work with one agent, it coordinates the rest.
|
||||
|
||||
**The pattern:** You work with devpulse. Devpulse dispatches to specialists. Specialists do the work and report back. You never need to context-switch between 15 agents — devpulse is your single point of contact.
|
||||
### Core Commands
|
||||
|
||||
Once devpulse confirms the core systems are working (email, drone routing, flow plans), you can start exploring individual branches directly with `cd src/aipass/{branch} && claude --permission-mode bypassPermissions`.
|
||||
```bash
|
||||
drone @branch --help # Any branch's commands
|
||||
drone systems # List all branches
|
||||
drone @ai_mail dispatch @memory "subject" "body" # Send inter-agent mail
|
||||
drone @seedgo audit aipass # Run standards audit
|
||||
drone @flow create . "task name" dplan # Create a plan
|
||||
drone @git pr # Create PR via drone
|
||||
```
|
||||
|
||||
> **Why bypassPermissions?** AIPass agents dispatch work, wake other branches, run drone commands, read and write files — all autonomously. Standard permission mode would prompt you on every action. The system is designed for autonomous operation with governance built into the architecture (standards enforcement, ownership boundaries, dispatch locks), not into permission dialogs.
|
||||
Pattern: `drone @branch command [args]` — single-line, non-interactive.
|
||||
|
||||
> **Want a fast overview?** Every branch has its own `README.md` with architecture details, commands, integration points, and known issues. Have your agent read all 15 READMEs (`src/aipass/*/README.md`) and you'll have a solid understanding of the whole system in minutes. You can also run `drone @branch --help` on any branch to see its available commands and usage.
|
||||
### Branches
|
||||
|
||||
### What Each Branch Does
|
||||
|
||||
Every branch is a citizen — an expert in its domain with its own memories and identity.
|
||||
|
||||
| Branch | Role |
|
||||
|--------|------|
|
||||
| `devpulse` | **Start here.** Orchestration hub — coordinates everything, maintains 20 diagnostic tools |
|
||||
| `drone` | AI-friendly CLI — every command is a single-line, non-interactive call |
|
||||
| `seedgo` | Standards enforcement — 34-standard audit pack, system compliance |
|
||||
| `prax` | Logging and monitoring (the only logger in the system) |
|
||||
| `cli` | Terminal display, stderr routing, project commands |
|
||||
| `flow` | Workflow management — FPLANs (execution) and DPLANs (design) |
|
||||
| `ai_mail` | Inter-agent messaging, dispatch, wake |
|
||||
| `spawn` | Branch lifecycle — create, update, credential injection |
|
||||
| `trigger` | Event-driven automation, circuit breaker |
|
||||
| Branch | What it does |
|
||||
|--------|-------------|
|
||||
| `devpulse` | Orchestration hub — start here |
|
||||
| `drone` | CLI router — routes commands to branches |
|
||||
| `seedgo` | Standards enforcement — 34 automated checks |
|
||||
| `prax` | Logging and monitoring |
|
||||
| `cli` | Terminal display and formatting |
|
||||
| `flow` | Workflow management (FPLANs, DPLANs) |
|
||||
| `ai_mail` | Inter-agent messaging and dispatch |
|
||||
| `spawn` | Branch lifecycle and identity |
|
||||
| `trigger` | Event-driven automation |
|
||||
| `api` | LLM access via OpenRouter |
|
||||
| `backup` | Multi-mode backup (snapshot, versioned, Google Drive) |
|
||||
| `daemon` | Background scheduler, cron, notifications |
|
||||
| `backup` | Backup system (snapshot, versioned, Drive) |
|
||||
| `daemon` | Background scheduler |
|
||||
| `memory` | Vector memory bank (ChromaDB) |
|
||||
| `commons` | Social network — posts, rooms, artifacts |
|
||||
| `skills` | Capability framework — discoverable, executable skill units |
|
||||
| `commons` | Social space for branches |
|
||||
| `skills` | Capability framework |
|
||||
|
||||
## How It Works
|
||||
|
||||
### No Isolation, No Problem
|
||||
### Memory
|
||||
|
||||
Most multi-agent systems isolate agents in separate environments. AIPass doesn't. All 15 citizens work in the same filesystem, same git repo, same codebase. This is intentional.
|
||||
|
||||
Each citizen owns its directory (`src/aipass/{name}/`). It doesn't touch other branches' files. If it finds an issue in another branch, it sends an email. Dispatch locks prevent two instances of the same agent from running simultaneously — no toe-stepping, no race conditions.
|
||||
|
||||
This only works because of discipline: standards enforcement, persistent memory, and clear ownership boundaries.
|
||||
|
||||
### Tracking at Scale
|
||||
|
||||
When a session produces 500+ file changes across 10 branches, you need tracking. AIPass uses:
|
||||
|
||||
- **DPLANs** — design/planning documents. "Here's what we want to build and why."
|
||||
- **FPLANs** — execution plans. "Here are the exact steps, and here's the status of each."
|
||||
- **Seedgo audits** — automated compliance checks. Run before and after changes to measure drift.
|
||||
|
||||
Changes are never untracked. Every decision has a plan, every plan has a record.
|
||||
|
||||
### Persistent Memory
|
||||
|
||||
Every citizen has `.trinity/` files:
|
||||
Every branch has `.trinity/` files that persist across sessions:
|
||||
|
||||
```
|
||||
.trinity/passport.json # Identity — who am I, what's my role
|
||||
.trinity/local.json # Session history — what happened, what I learned
|
||||
.trinity/observations.json # Collaboration patterns — how we work together
|
||||
.trinity/passport.json # Identity — role, purpose, principles
|
||||
.trinity/local.json # Session history — tasks, learnings
|
||||
.trinity/observations.json # Collaboration patterns over time
|
||||
```
|
||||
|
||||
These grow over time. A citizen that's been through 20+ sessions knows things — patterns, gotchas, preferences, past decisions. When context compacts (conversation gets too long), memories survive because they're written to disk. When a new session starts, the citizen reads its memories and picks up where it left off.
|
||||
New session starts, branch reads its memories, picks up where it left off.
|
||||
|
||||
### Diagnostic Tooling
|
||||
|
||||
DevPulse maintains 20 standalone scanners in its `tools/` directory — purpose-built for AI consumption. Each scanner follows the same CLI pattern (`@branch`, `--all`, `--summary`) and targets a single concern:
|
||||
|
||||
- **Code quality** — silent catches, dead code, unused functions, deep nesting, raw prints, commented loggers
|
||||
- **Security** — hardcoded keys, partial key display, URL injection
|
||||
- **Documentation** — stale help text, README freshness, prompt quality, TODO tracking
|
||||
- **Consistency** — magic numbers, stale terminology, command verification, test coverage
|
||||
|
||||
Tools surface patterns. Patterns create conversations. Conversations improve the system. Run a scanner, get instant visibility into code quality across all 15 branches without reading a single file.
|
||||
|
||||
## Architecture
|
||||
### Structure
|
||||
|
||||
```
|
||||
src/aipass/<branch>/
|
||||
├── .trinity/ # Identity & memory
|
||||
├── .aipass/ # System prompt
|
||||
├── .aipass/ # Branch prompt
|
||||
├── .ai_mail.local/ # Mailbox
|
||||
├── apps/
|
||||
│ ├── <branch>.py # Entry point (drone routes here)
|
||||
│ ├── <branch>.py # Entry point
|
||||
│ ├── modules/ # Business logic
|
||||
│ └── handlers/ # Implementation
|
||||
└── README.md
|
||||
```
|
||||
|
||||
All branches follow this structure. Drone resolves `@name` to paths via `AIPASS_REGISTRY.json` — no hardcoded paths between modules.
|
||||
All branches follow this layout. `drone` resolves `@name` to paths via `AIPASS_REGISTRY.json`.
|
||||
|
||||
### Drone — A CLI Built for AI
|
||||
### No Isolation
|
||||
|
||||
Drone's argument structure is designed so AI agents can operate the entire system through single-line, non-interactive commands. No interactive menus, no prompts, no multi-step wizards. Everything — sending emails, running audits, creating plans, managing backups — is a one-liner:
|
||||
|
||||
```bash
|
||||
drone @ai_mail dispatch @memory "Bug Report" "Search fails without torch"
|
||||
drone @seedgo audit aipass @memory
|
||||
drone @flow create . "Fix search module" dplan
|
||||
```
|
||||
|
||||
Once you learn the pattern (`drone @branch command [args]`), you know how to use every branch. The commands are self-explanatory — guess `drone @memory search "credential model"` and you'd be right. `drone @branch --help` fills in the rest.
|
||||
|
||||
Humans use it too. Interactive modes exist where they make sense (backup prompts, monitoring dashboards), but the core design is: AI agents shouldn't need interactive CLIs to be productive. Drop a command, get a result.
|
||||
All 15 branches share the same filesystem and git repo. Each owns its directory and doesn't touch others. Dispatch locks prevent conflicts. Standards enforcement keeps things consistent.
|
||||
|
||||
## Requirements
|
||||
|
||||
- Python 3.10+
|
||||
- No external API keys required for core functionality
|
||||
- [Claude Code](https://docs.anthropic.com/en/docs/claude-code) recommended (hooks provide auto-diagnostics, prompt injection, session recovery)
|
||||
- API keys optional (needed for `api` branch — OpenRouter/OpenAI)
|
||||
- [Claude Code](https://docs.anthropic.com/en/docs/claude-code) recommended for hooks
|
||||
|
||||
## Status
|
||||
|
||||
Beta. 15 branches operational. 130+ PRs merged. 1,600+ tests. 96% avg compliance across 34 standards checks.
|
||||
|
||||
## License
|
||||
|
||||
|
||||
@@ -8,64 +8,64 @@
|
||||
{
|
||||
"file": "apps/handlers/init/bootstrap.py",
|
||||
"standard": "json_structure",
|
||||
"reason": "Pure Python bootstrap — no branch imports by design"
|
||||
"reason": "Pure Python bootstrap \u2014 no branch imports by design"
|
||||
},
|
||||
{
|
||||
"file": "apps/modules/display.py",
|
||||
"standard": "silent_catch",
|
||||
"reason": "Circular import — display.py cannot import prax (prax depends on cli). Silent catches are ImportError guard for optional trigger and __main__ error handler."
|
||||
"reason": "Circular import \u2014 display.py cannot import prax (prax depends on cli). Silent catches are ImportError guard for optional trigger and __main__ error handler."
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/json/json_handler.py",
|
||||
"standard": "silent_catch",
|
||||
"reason": "Dependency-free by design — json_handler cannot import prax (circular: json_handler → prax → cli.display → json_handler). Catch regenerates corrupted JSON silently."
|
||||
"reason": "Dependency-free by design \u2014 json_handler cannot import prax (circular: json_handler \u2192 prax \u2192 cli.display \u2192 json_handler). Catch regenerates corrupted JSON silently."
|
||||
},
|
||||
{
|
||||
"file": "apps/modules/display.py",
|
||||
"standard": "naming",
|
||||
"pattern": "__all__",
|
||||
"reason": "Python dunder convention — __all__ controls public API exports, not a constant to uppercase"
|
||||
"reason": "Python dunder convention \u2014 __all__ controls public API exports, not a constant to uppercase"
|
||||
},
|
||||
{
|
||||
"file": "apps/modules/init_project.py",
|
||||
"standard": "naming",
|
||||
"pattern": "__all__",
|
||||
"reason": "Python dunder convention — __all__ controls public API exports, not a constant to uppercase"
|
||||
"reason": "Python dunder convention \u2014 __all__ controls public API exports, not a constant to uppercase"
|
||||
},
|
||||
{
|
||||
"file": "drone_adapter.py",
|
||||
"standard": "unused_function",
|
||||
"reason": "get_help() and get_introspective() are external API — called by drone, not from within CLI branch"
|
||||
"reason": "get_help() and get_introspective() are external API \u2014 called by drone, not from within CLI branch"
|
||||
},
|
||||
{
|
||||
"file": "drone_adapter.py",
|
||||
"standard": "silent_catch",
|
||||
"reason": "Drone adapter cannot import prax (circular: drone_adapter → cli.main → prax → cli). Catches return graceful fallbacks."
|
||||
"reason": "Drone adapter cannot import prax (circular: drone_adapter \u2192 cli.main \u2192 prax \u2192 cli). Catches return graceful fallbacks."
|
||||
},
|
||||
{
|
||||
"file": "apps/modules/display.py",
|
||||
"standard": "testing",
|
||||
"reason": "Testing flags same silent catch as silent_catch standard — already bypassed (circular import prevents prax logger)"
|
||||
"standard": "error_handling",
|
||||
"reason": "Testing flags same silent catch as silent_catch standard \u2014 already bypassed (circular import prevents prax logger)"
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/json/json_handler.py",
|
||||
"standard": "testing",
|
||||
"reason": "Testing flags same silent catch as silent_catch standard — already bypassed (dependency-free by design)"
|
||||
"standard": "error_handling",
|
||||
"reason": "Testing flags same silent catch as silent_catch standard \u2014 already bypassed (dependency-free by design)"
|
||||
},
|
||||
{
|
||||
"file": "apps/modules/display.py",
|
||||
"standard": "imports",
|
||||
"reason": "Cannot import prax — circular import (prax depends on cli). Documented in code comment."
|
||||
"reason": "Cannot import prax \u2014 circular import (prax depends on cli). Documented in code comment."
|
||||
},
|
||||
{
|
||||
"file": "apps/modules/templates.py",
|
||||
"standard": "imports",
|
||||
"reason": "Cannot import prax — circular import (prax depends on cli). Documented in code comment."
|
||||
"reason": "Cannot import prax \u2014 circular import (prax depends on cli). Documented in code comment."
|
||||
},
|
||||
{
|
||||
"file": "system_logs",
|
||||
"standard": "log_structure",
|
||||
"reason": "Prax branch detection bug — CLI logs land as unknown_branch. Prax confirmed known limitation (2026-03-23), fix pending on prax side."
|
||||
"reason": "Prax branch detection bug \u2014 CLI logs land as unknown_branch. Prax confirmed known limitation (2026-03-23), fix pending on prax side."
|
||||
}
|
||||
],
|
||||
"notes": {
|
||||
|
||||
@@ -45,73 +45,73 @@
|
||||
"file": "apps/handlers/mbank/process.py",
|
||||
"standard": "handlers",
|
||||
"category": "architectural",
|
||||
"reason": "Cross-handler import of plan_type_loader.discover_plan_types — mbank needs plan type discovery to process closed plans across all registered types"
|
||||
"reason": "Cross-handler import of plan_type_loader.discover_plan_types \u2014 mbank needs plan type discovery to process closed plans across all registered types"
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/dashboard/push_central.py",
|
||||
"standard": "handlers",
|
||||
"category": "architectural",
|
||||
"reason": "Cross-handler import of aggregate_ops — push_central calls aggregate_central_impl after pushing data to central"
|
||||
"reason": "Cross-handler import of aggregate_ops \u2014 push_central calls aggregate_central_impl after pushing data to central"
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/dashboard/push_central.py",
|
||||
"standard": "imports",
|
||||
"category": "architectural",
|
||||
"reason": "Parent module import needed — push_central invokes aggregate_central for dashboard data"
|
||||
"reason": "Parent module import needed \u2014 push_central invokes aggregate_central for dashboard data"
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/registry/monitor_ops.py",
|
||||
"standard": "handlers",
|
||||
"category": "architectural",
|
||||
"reason": "Handler imports trigger module — monitor_ops fires trigger events for registry health changes"
|
||||
"reason": "Handler imports trigger module \u2014 monitor_ops fires trigger events for registry health changes"
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/plan/get_open_plans.py",
|
||||
"standard": "handlers",
|
||||
"category": "architectural",
|
||||
"reason": "Cross-handler import of load_registry — get_open_plans needs registry data to find open plans"
|
||||
"reason": "Cross-handler import of load_registry \u2014 get_open_plans needs registry data to find open plans"
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/plan/list_ops.py",
|
||||
"standard": "handlers",
|
||||
"category": "architectural",
|
||||
"reason": "Cross-handler import of plan_type_loader — list_ops needs plan type discovery to merge plans from all registries"
|
||||
"reason": "Cross-handler import of plan_type_loader \u2014 list_ops needs plan type discovery to merge plans from all registries"
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/plan/close_ops.py",
|
||||
"standard": "handlers",
|
||||
"category": "architectural",
|
||||
"reason": "Cross-handler imports of load_registry, plan_type_loader, display — close needs registry access, type resolution, and formatting"
|
||||
"reason": "Cross-handler imports of load_registry, plan_type_loader, display \u2014 close needs registry access, type resolution, and formatting"
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/plan/display.py",
|
||||
"standard": "handlers",
|
||||
"category": "architectural",
|
||||
"reason": "Cross-handler import of load_registry — display needs registry data for plan status formatting"
|
||||
"reason": "Cross-handler import of load_registry \u2014 display needs registry data for plan status formatting"
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/plan/create.py",
|
||||
"standard": "handlers",
|
||||
"category": "architectural",
|
||||
"reason": "Cross-handler import of load_registry — create needs registry to register new plans"
|
||||
"reason": "Cross-handler import of load_registry \u2014 create needs registry to register new plans"
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/plan/validate.py",
|
||||
"standard": "handlers",
|
||||
"category": "architectural",
|
||||
"reason": "Cross-handler import of load_registry — validate needs registry data to check plan existence"
|
||||
"reason": "Cross-handler import of load_registry \u2014 validate needs registry data to check plan existence"
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/mbank/restore_ops.py",
|
||||
"standard": "handlers",
|
||||
"category": "architectural",
|
||||
"reason": "Cross-handler imports of load_registry, plan_type_loader — restore needs registry and type resolution to recover archived plans"
|
||||
"reason": "Cross-handler imports of load_registry, plan_type_loader \u2014 restore needs registry and type resolution to recover archived plans"
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/registry/load_registry.py",
|
||||
"standard": "handlers",
|
||||
"category": "architectural",
|
||||
"reason": "Cross-handler import of plan_type_loader — registry loader needs type discovery for auto-healing orphaned entries"
|
||||
"reason": "Cross-handler import of plan_type_loader \u2014 registry loader needs type discovery for auto-healing orphaned entries"
|
||||
},
|
||||
{
|
||||
"file": "apps/modules/create_plan.py",
|
||||
@@ -195,91 +195,91 @@
|
||||
"file": "apps/handlers/template/registry_ops.py",
|
||||
"standard": "documentation",
|
||||
"category": "false_positive",
|
||||
"reason": "add_type has docstring — checker 5-line lookahead too small for multi-line signature (6 lines to closing paren)"
|
||||
"reason": "add_type has docstring \u2014 checker 5-line lookahead too small for multi-line signature (6 lines to closing paren)"
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/template/get_template.py",
|
||||
"standard": "documentation",
|
||||
"category": "false_positive",
|
||||
"reason": "get_template has docstring — checker 5-line lookahead too small for multi-line signature (9 lines to closing paren)"
|
||||
"reason": "get_template has docstring \u2014 checker 5-line lookahead too small for multi-line signature (9 lines to closing paren)"
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/plan/list_ops.py",
|
||||
"standard": "documentation",
|
||||
"category": "false_positive",
|
||||
"reason": "list_plans_impl has docstring — checker 5-line lookahead too small for multi-line signature (8 lines to closing paren)"
|
||||
"reason": "list_plans_impl has docstring \u2014 checker 5-line lookahead too small for multi-line signature (8 lines to closing paren)"
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/plan/create.py",
|
||||
"standard": "documentation",
|
||||
"category": "false_positive",
|
||||
"reason": "create_registry_entry has docstring — checker 5-line lookahead too small for multi-line signature (6 lines to closing paren)"
|
||||
"reason": "create_registry_entry has docstring \u2014 checker 5-line lookahead too small for multi-line signature (6 lines to closing paren)"
|
||||
},
|
||||
{
|
||||
"file": "apps/modules/create_plan.py",
|
||||
"standard": "documentation",
|
||||
"category": "false_positive",
|
||||
"reason": "create_plan has docstring — checker 5-line lookahead too small for multi-line signature"
|
||||
"reason": "create_plan has docstring \u2014 checker 5-line lookahead too small for multi-line signature"
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/plan/close_ops.py",
|
||||
"standard": "documentation",
|
||||
"category": "false_positive",
|
||||
"reason": "Functions have docstrings — checker 5-line lookahead too small for multi-line signatures"
|
||||
"reason": "Functions have docstrings \u2014 checker 5-line lookahead too small for multi-line signatures"
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/mbank/process.py",
|
||||
"standard": "documentation",
|
||||
"category": "false_positive",
|
||||
"reason": "Functions have docstrings — checker 5-line lookahead too small for multi-line signatures"
|
||||
"reason": "Functions have docstrings \u2014 checker 5-line lookahead too small for multi-line signatures"
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/mbank/restore_ops.py",
|
||||
"standard": "documentation",
|
||||
"category": "false_positive",
|
||||
"reason": "Functions have docstrings — checker 5-line lookahead too small for multi-line signatures"
|
||||
"reason": "Functions have docstrings \u2014 checker 5-line lookahead too small for multi-line signatures"
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/plan/display.py",
|
||||
"standard": "documentation",
|
||||
"category": "false_positive",
|
||||
"reason": "Functions have docstrings — checker 5-line lookahead too small for multi-line signatures"
|
||||
"reason": "Functions have docstrings \u2014 checker 5-line lookahead too small for multi-line signatures"
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/plan/aggregate_ops.py",
|
||||
"standard": "handlers",
|
||||
"category": "architectural",
|
||||
"reason": "Handler imports trigger module — aggregate_ops fires trigger events for plan aggregation changes"
|
||||
"reason": "Handler imports trigger module \u2014 aggregate_ops fires trigger events for plan aggregation changes"
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/plan/create_ops.py",
|
||||
"standard": "handlers",
|
||||
"category": "architectural",
|
||||
"reason": "Handler imports trigger module — create_ops fires trigger events when plans are created"
|
||||
"reason": "Handler imports trigger module \u2014 create_ops fires trigger events when plans are created"
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/plan/get_closed_plans.py",
|
||||
"standard": "handlers",
|
||||
"category": "architectural",
|
||||
"reason": "Cross-handler import of load_registry — get_closed_plans needs registry data to find closed plans"
|
||||
"reason": "Cross-handler import of load_registry \u2014 get_closed_plans needs registry data to find closed plans"
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/plan/command_parser.py",
|
||||
"standard": "handlers",
|
||||
"category": "architectural",
|
||||
"reason": "Cross-handler import of registry_ops.get_type_map — parser needs plan type mappings to validate commands"
|
||||
"reason": "Cross-handler import of registry_ops.get_type_map \u2014 parser needs plan type mappings to validate commands"
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/plan/restore_ops.py",
|
||||
"standard": "handlers",
|
||||
"category": "architectural",
|
||||
"reason": "Handler imports trigger module — restore_ops fires trigger events when plans are restored"
|
||||
"reason": "Handler imports trigger module \u2014 restore_ops fires trigger events when plans are restored"
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/summary/summary_ops.py",
|
||||
"standard": "handlers",
|
||||
"category": "architectural",
|
||||
"reason": "Cross-handler imports — summary_ops needs plan type loader and registry for summarization"
|
||||
"reason": "Cross-handler imports \u2014 summary_ops needs plan type loader and registry for summarization"
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/plan/calculate_relative_path.py",
|
||||
@@ -321,7 +321,7 @@
|
||||
"file": "apps/handlers/config/load_config.py",
|
||||
"standard": "handlers",
|
||||
"category": "architectural",
|
||||
"reason": "module_name parameter is intentional DI pattern — callers inject module name, auto-detection not needed"
|
||||
"reason": "module_name parameter is intentional DI pattern \u2014 callers inject module name, auto-detection not needed"
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/plan/resolve_location.py",
|
||||
@@ -333,79 +333,79 @@
|
||||
"file": "apps/modules/close_plan.py",
|
||||
"standard": "deep_nesting",
|
||||
"category": "deferred",
|
||||
"reason": "Deferred per devpulse dispatch — refactoring to reduce nesting planned for future sprint"
|
||||
"reason": "Deferred per devpulse dispatch \u2014 refactoring to reduce nesting planned for future sprint"
|
||||
},
|
||||
{
|
||||
"file": "apps/modules/create_plan.py",
|
||||
"standard": "deep_nesting",
|
||||
"category": "deferred",
|
||||
"reason": "Deferred per devpulse dispatch — refactoring to reduce nesting planned for future sprint"
|
||||
"reason": "Deferred per devpulse dispatch \u2014 refactoring to reduce nesting planned for future sprint"
|
||||
},
|
||||
{
|
||||
"file": "apps/modules/restore_plan.py",
|
||||
"standard": "deep_nesting",
|
||||
"category": "deferred",
|
||||
"reason": "Deferred per devpulse dispatch — refactoring to reduce nesting planned for future sprint"
|
||||
"reason": "Deferred per devpulse dispatch \u2014 refactoring to reduce nesting planned for future sprint"
|
||||
},
|
||||
{
|
||||
"file": "apps/modules/registry_monitor.py",
|
||||
"standard": "deep_nesting",
|
||||
"category": "deferred",
|
||||
"reason": "Deferred per devpulse dispatch — refactoring to reduce nesting planned for future sprint"
|
||||
"reason": "Deferred per devpulse dispatch \u2014 refactoring to reduce nesting planned for future sprint"
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/mbank/process.py",
|
||||
"standard": "deep_nesting",
|
||||
"category": "deferred",
|
||||
"reason": "Deferred per devpulse dispatch — 793-line file needs splitting, nesting follows from complex plan processing"
|
||||
"reason": "Deferred per devpulse dispatch \u2014 793-line file needs splitting, nesting follows from complex plan processing"
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/dashboard/push_branch_dashboard.py",
|
||||
"standard": "deep_nesting",
|
||||
"category": "deferred",
|
||||
"reason": "Deferred per devpulse dispatch — refactoring to reduce nesting planned for future sprint"
|
||||
"reason": "Deferred per devpulse dispatch \u2014 refactoring to reduce nesting planned for future sprint"
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/registry/monitor_ops.py",
|
||||
"standard": "deep_nesting",
|
||||
"category": "deferred",
|
||||
"reason": "Deferred per devpulse dispatch — refactoring to reduce nesting planned for future sprint"
|
||||
"reason": "Deferred per devpulse dispatch \u2014 refactoring to reduce nesting planned for future sprint"
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/plan/list_ops.py",
|
||||
"standard": "deep_nesting",
|
||||
"category": "deferred",
|
||||
"reason": "Deferred per devpulse dispatch — refactoring to reduce nesting planned for future sprint"
|
||||
"reason": "Deferred per devpulse dispatch \u2014 refactoring to reduce nesting planned for future sprint"
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/plan/display.py",
|
||||
"standard": "deep_nesting",
|
||||
"category": "deferred",
|
||||
"reason": "Deferred per devpulse dispatch — refactoring to reduce nesting planned for future sprint"
|
||||
"reason": "Deferred per devpulse dispatch \u2014 refactoring to reduce nesting planned for future sprint"
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/plan/create_ops.py",
|
||||
"standard": "deep_nesting",
|
||||
"category": "deferred",
|
||||
"reason": "Deferred per devpulse dispatch — refactoring to reduce nesting planned for future sprint"
|
||||
"reason": "Deferred per devpulse dispatch \u2014 refactoring to reduce nesting planned for future sprint"
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/plan/close_ops.py",
|
||||
"standard": "deep_nesting",
|
||||
"category": "deferred",
|
||||
"reason": "Deferred per devpulse dispatch — refactoring to reduce nesting planned for future sprint"
|
||||
"reason": "Deferred per devpulse dispatch \u2014 refactoring to reduce nesting planned for future sprint"
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/plan/restore_ops.py",
|
||||
"standard": "deep_nesting",
|
||||
"category": "deferred",
|
||||
"reason": "Deferred per devpulse dispatch — refactoring to reduce nesting planned for future sprint"
|
||||
"reason": "Deferred per devpulse dispatch \u2014 refactoring to reduce nesting planned for future sprint"
|
||||
},
|
||||
{
|
||||
"file": "*",
|
||||
"standard": "test_coverage",
|
||||
"standard": "test_quality",
|
||||
"category": "deferred",
|
||||
"reason": "Deferred per devpulse dispatch — test infrastructure not yet in place for flow branch"
|
||||
"reason": "Deferred per devpulse dispatch \u2014 test infrastructure not yet in place for flow branch"
|
||||
}
|
||||
],
|
||||
"notes": {
|
||||
|
||||
@@ -261,10 +261,15 @@ def generate_branch_meta(branch_dir: Path, template_registry: dict) -> dict:
|
||||
for item in sorted(scan_path.iterdir()):
|
||||
rel = str(item.relative_to(branch_dir))
|
||||
|
||||
# Skip .spawn internals and __pycache__
|
||||
if _BRANCH_META_DIR in Path(rel).parts or "__pycache__" in Path(rel).parts:
|
||||
# Skip __pycache__
|
||||
if "__pycache__" in Path(rel).parts:
|
||||
continue
|
||||
|
||||
# Skip .spawn tracking files (but allow README.md, .registry_ignore.json)
|
||||
if _BRANCH_META_DIR in Path(rel).parts and item.is_file():
|
||||
if item.name in (_BRANCH_META_FILE, _TEMPLATE_REGISTRY_FILE):
|
||||
continue
|
||||
|
||||
if item.is_dir():
|
||||
branch_dirs.append((item, rel))
|
||||
elif item.is_file():
|
||||
|
||||
@@ -28,7 +28,10 @@ _SPAWN_DIR = ".spawn"
|
||||
_TEMPLATE_REGISTRY_FILE = ".template_registry.json"
|
||||
|
||||
# Directories to skip entirely during scan
|
||||
_SKIP_DIRS = {"__pycache__", ".git", ".spawn"}
|
||||
_SKIP_DIRS = {"__pycache__", ".git"}
|
||||
|
||||
# Files to skip within .spawn/ (tracking files that shouldn't be in the registry)
|
||||
_SKIP_SPAWN_FILES = {".template_registry.json", ".branch_meta.json"}
|
||||
|
||||
# Placeholder patterns to detect in filenames
|
||||
_BRANCH_PLACEHOLDERS = ("{{BRANCH}}", "{{BRANCHNAME}}")
|
||||
@@ -182,6 +185,10 @@ def _scan_template_directory(
|
||||
if any(part in _SKIP_DIRS for part in rel.parts):
|
||||
continue
|
||||
|
||||
# Skip tracking files within .spawn/ (but allow README.md etc.)
|
||||
if ".spawn" in rel.parts and item.is_file() and item.name in _SKIP_SPAWN_FILES:
|
||||
continue
|
||||
|
||||
if item.is_dir():
|
||||
has_placeholder = any(p in item.name for p in _BRANCH_PLACEHOLDERS)
|
||||
raw_dirs.append({
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
"file": "apps/handlers/events/registry.py",
|
||||
"standard": "trigger",
|
||||
"pattern": "setup_handlers",
|
||||
"reason": "setup_handlers() is a wiring function that registers event handlers, not an event handler itself. It does not handle any event — it calls trigger.on() to wire handle_{event} callbacks."
|
||||
"reason": "setup_handlers() is a wiring function that registers event handlers, not an event handler itself. It does not handle any event \u2014 it calls trigger.on() to wire handle_{event} callbacks."
|
||||
},
|
||||
{
|
||||
"file": "apps/modules/core.py",
|
||||
@@ -24,55 +24,55 @@
|
||||
"file": "apps/handlers/events/error_detected.py",
|
||||
"standard": "silent_catch",
|
||||
"pattern": "_log_warning except",
|
||||
"reason": "Meta-logging helper: _log_warning() writes directly to file. Its own except block cannot log — you cannot log a failure to log."
|
||||
"reason": "Meta-logging helper: _log_warning() writes directly to file. Its own except block cannot log \u2014 you cannot log a failure to log."
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/events/error_logged.py",
|
||||
"standard": "silent_catch",
|
||||
"pattern": "_log_warning except",
|
||||
"reason": "Meta-logging helper: _log_warning() writes directly to file. Its own except block cannot log — you cannot log a failure to log."
|
||||
"reason": "Meta-logging helper: _log_warning() writes directly to file. Its own except block cannot log \u2014 you cannot log a failure to log."
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/events/bulletin_created.py",
|
||||
"standard": "silent_catch",
|
||||
"pattern": "_log_warning except",
|
||||
"reason": "Meta-logging helper: _log_warning() writes directly to file. Its own except block cannot log — you cannot log a failure to log."
|
||||
"reason": "Meta-logging helper: _log_warning() writes directly to file. Its own except block cannot log \u2014 you cannot log a failure to log."
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/events/startup.py",
|
||||
"standard": "silent_catch",
|
||||
"pattern": "_log_warning except",
|
||||
"reason": "Meta-logging helper: _log_warning() writes directly to file. Its own except block cannot log — you cannot log a failure to log."
|
||||
"reason": "Meta-logging helper: _log_warning() writes directly to file. Its own except block cannot log \u2014 you cannot log a failure to log."
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/events/memory_threshold_exceeded.py",
|
||||
"standard": "silent_catch",
|
||||
"pattern": "_log_warning except",
|
||||
"reason": "Meta-logging helper: _log_warning() writes directly to file. Its own except block cannot log — you cannot log a failure to log."
|
||||
"reason": "Meta-logging helper: _log_warning() writes directly to file. Its own except block cannot log \u2014 you cannot log a failure to log."
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/events/plan_file.py",
|
||||
"standard": "silent_catch",
|
||||
"pattern": "_log_error except",
|
||||
"reason": "Meta-logging helper: _log_error() writes directly to file. Its own except block cannot log — you cannot log a failure to log."
|
||||
"reason": "Meta-logging helper: _log_error() writes directly to file. Its own except block cannot log \u2014 you cannot log a failure to log."
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/json/json_handler.py",
|
||||
"standard": "silent_catch",
|
||||
"pattern": "_log_warning except",
|
||||
"reason": "Meta-logging helper: _log_warning() writes directly to file. Its own except block cannot log — you cannot log a failure to log."
|
||||
"reason": "Meta-logging helper: _log_warning() writes directly to file. Its own except block cannot log \u2014 you cannot log a failure to log."
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/events/registry.py",
|
||||
"standard": "silent_catch",
|
||||
"pattern": "_log_warning except",
|
||||
"reason": "Meta-logging helper: _log_warning() writes directly to file. Its own except block cannot log — you cannot log a failure to log."
|
||||
"reason": "Meta-logging helper: _log_warning() writes directly to file. Its own except block cannot log \u2014 you cannot log a failure to log."
|
||||
},
|
||||
{
|
||||
"file": "apps/config.py",
|
||||
"standard": "silent_catch",
|
||||
"pattern": "_log_warning except",
|
||||
"reason": "Meta-logging helper: _log_warning() writes directly to file. Its own except block cannot log — you cannot log a failure to log."
|
||||
"reason": "Meta-logging helper: _log_warning() writes directly to file. Its own except block cannot log \u2014 you cannot log a failure to log."
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/log_watcher.py",
|
||||
@@ -80,7 +80,7 @@
|
||||
"lines": [
|
||||
75
|
||||
],
|
||||
"reason": "log_watcher imports error_registry.report() for Medic v2 dedup. This is a deliberate handler-to-handler dependency — the registry IS the dedup backend."
|
||||
"reason": "log_watcher imports error_registry.report() for Medic v2 dedup. This is a deliberate handler-to-handler dependency \u2014 the registry IS the dedup backend."
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/error_reporter.py",
|
||||
@@ -89,7 +89,7 @@
|
||||
25,
|
||||
45
|
||||
],
|
||||
"reason": "error_reporter imports error_registry for tracking and ai_mail for email delivery. These are its core dependencies — it's the dispatch endpoint of the error pipeline."
|
||||
"reason": "error_reporter imports error_registry for tracking and ai_mail for email delivery. These are its core dependencies \u2014 it's the dispatch endpoint of the error pipeline."
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/watchers/log_watcher.py",
|
||||
@@ -97,7 +97,7 @@
|
||||
"lines": [
|
||||
242
|
||||
],
|
||||
"reason": "Watcher imports trigger module to fire events. Handler→module import needed because watcher operates as standalone watchdog callback."
|
||||
"reason": "Watcher imports trigger module to fire events. Handler\u2192module import needed because watcher operates as standalone watchdog callback."
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/events/error_detected.py",
|
||||
@@ -117,105 +117,105 @@
|
||||
},
|
||||
{
|
||||
"file": "apps/config.py",
|
||||
"standard": "testing",
|
||||
"standard": "error_handling",
|
||||
"lines": [
|
||||
31
|
||||
],
|
||||
"pattern": "except Exception: pass",
|
||||
"reason": "Meta-logging helper _log_warning() — cannot log a failure to log. Same pattern as silent_catch bypass."
|
||||
"reason": "Meta-logging helper _log_warning() \u2014 cannot log a failure to log. Same pattern as silent_catch bypass."
|
||||
},
|
||||
{
|
||||
"file": "apps/modules/core.py",
|
||||
"standard": "testing",
|
||||
"standard": "error_handling",
|
||||
"lines": [
|
||||
160
|
||||
],
|
||||
"pattern": "except Exception: pass",
|
||||
"reason": "Deferred event queue handler execution — logging would cause infinite recursion (logger fires events via trigger). Same as silent_catch bypass."
|
||||
"reason": "Deferred event queue handler execution \u2014 logging would cause infinite recursion (logger fires events via trigger). Same as silent_catch bypass."
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/json/json_handler.py",
|
||||
"standard": "testing",
|
||||
"standard": "error_handling",
|
||||
"lines": [
|
||||
24
|
||||
],
|
||||
"pattern": "except Exception: pass",
|
||||
"reason": "Meta-logging helper _log_warning() — cannot log a failure to log. Same pattern as silent_catch bypass."
|
||||
"reason": "Meta-logging helper _log_warning() \u2014 cannot log a failure to log. Same pattern as silent_catch bypass."
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/events/plan_file.py",
|
||||
"standard": "testing",
|
||||
"standard": "error_handling",
|
||||
"lines": [
|
||||
58
|
||||
],
|
||||
"pattern": "except Exception: pass",
|
||||
"reason": "Meta-logging helper _log_error() — cannot log a failure to log. Same pattern as silent_catch bypass."
|
||||
"reason": "Meta-logging helper _log_error() \u2014 cannot log a failure to log. Same pattern as silent_catch bypass."
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/events/memory_threshold_exceeded.py",
|
||||
"standard": "testing",
|
||||
"standard": "error_handling",
|
||||
"lines": [
|
||||
46
|
||||
],
|
||||
"pattern": "except Exception: pass",
|
||||
"reason": "Meta-logging helper _log_warning() — cannot log a failure to log. Same pattern as silent_catch bypass."
|
||||
"reason": "Meta-logging helper _log_warning() \u2014 cannot log a failure to log. Same pattern as silent_catch bypass."
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/events/error_logged.py",
|
||||
"standard": "testing",
|
||||
"standard": "error_handling",
|
||||
"lines": [
|
||||
48
|
||||
],
|
||||
"pattern": "except Exception: pass",
|
||||
"reason": "Meta-logging helper _log_warning() — cannot log a failure to log. Same pattern as silent_catch bypass."
|
||||
"reason": "Meta-logging helper _log_warning() \u2014 cannot log a failure to log. Same pattern as silent_catch bypass."
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/events/bulletin_created.py",
|
||||
"standard": "testing",
|
||||
"standard": "error_handling",
|
||||
"lines": [
|
||||
55
|
||||
],
|
||||
"pattern": "except Exception: pass",
|
||||
"reason": "Meta-logging helper _log_warning() — cannot log a failure to log. Same pattern as silent_catch bypass."
|
||||
"reason": "Meta-logging helper _log_warning() \u2014 cannot log a failure to log. Same pattern as silent_catch bypass."
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/events/error_detected.py",
|
||||
"standard": "testing",
|
||||
"standard": "error_handling",
|
||||
"lines": [
|
||||
54
|
||||
],
|
||||
"pattern": "except Exception: pass",
|
||||
"reason": "Meta-logging helper _log_warning() — cannot log a failure to log. Same pattern as silent_catch bypass."
|
||||
"reason": "Meta-logging helper _log_warning() \u2014 cannot log a failure to log. Same pattern as silent_catch bypass."
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/events/startup.py",
|
||||
"standard": "testing",
|
||||
"standard": "error_handling",
|
||||
"lines": [
|
||||
51
|
||||
],
|
||||
"pattern": "except Exception: pass",
|
||||
"reason": "Meta-logging helper _log_warning() — cannot log a failure to log. Same pattern as silent_catch bypass."
|
||||
"reason": "Meta-logging helper _log_warning() \u2014 cannot log a failure to log. Same pattern as silent_catch bypass."
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/events/registry.py",
|
||||
"standard": "testing",
|
||||
"standard": "error_handling",
|
||||
"lines": [
|
||||
28
|
||||
],
|
||||
"pattern": "except Exception: pass",
|
||||
"reason": "Meta-logging helper _log_warning() — cannot log a failure to log. Same pattern as silent_catch bypass."
|
||||
"reason": "Meta-logging helper _log_warning() \u2014 cannot log a failure to log. Same pattern as silent_catch bypass."
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/error_registry.py",
|
||||
"standard": "architecture",
|
||||
"pattern": "file_length",
|
||||
"reason": "Error registry at 870 lines — core dedup engine with fingerprinting, circuit breaker, backoff, and CLI. Splitting would break cohesion of the error tracking lifecycle."
|
||||
"reason": "Error registry at 870 lines \u2014 core dedup engine with fingerprinting, circuit breaker, backoff, and CLI. Splitting would break cohesion of the error tracking lifecycle."
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/log_watcher.py",
|
||||
"standard": "architecture",
|
||||
"pattern": "file_length",
|
||||
"reason": "Log watcher at 782 lines — watchdog event handler with position tracking, dedup, and medic integration. Splitting would break the file monitoring pipeline."
|
||||
"reason": "Log watcher at 782 lines \u2014 watchdog event handler with position tracking, dedup, and medic integration. Splitting would break the file monitoring pipeline."
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/error_reporter.py",
|
||||
@@ -243,7 +243,7 @@
|
||||
243
|
||||
],
|
||||
"pattern": "handler importing from parent module",
|
||||
"reason": "error_detected imports error_registry (line 76) and medic_state — core pipeline dependencies for dispatch gating. Already bypassed under handlers standard."
|
||||
"reason": "error_detected imports error_registry (line 76) and medic_state \u2014 core pipeline dependencies for dispatch gating. Already bypassed under handlers standard."
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/events/registry.py",
|
||||
@@ -273,7 +273,7 @@
|
||||
34
|
||||
],
|
||||
"pattern": "handler imports modules",
|
||||
"reason": "Registry wiring function imports trigger module to call trigger.on(). Must access the event bus to register handlers — this IS its purpose."
|
||||
"reason": "Registry wiring function imports trigger module to call trigger.on(). Must access the event bus to register handlers \u2014 this IS its purpose."
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/error_registry.py",
|
||||
@@ -315,13 +315,13 @@
|
||||
"file": "apps/config.py",
|
||||
"standard": "imports",
|
||||
"pattern": "prax logger import",
|
||||
"reason": "config.py cannot import prax logger — circular dependency. Uses _log_warning() file-based pattern instead. Comment on line 26 documents this."
|
||||
"reason": "config.py cannot import prax logger \u2014 circular dependency. Uses _log_warning() file-based pattern instead. Comment on line 26 documents this."
|
||||
},
|
||||
{
|
||||
"file": "apps/handlers/json/json_handler.py",
|
||||
"standard": "unused_function",
|
||||
"pattern": "validate_json_structure, get_json_path, increment_counter, update_data_metrics",
|
||||
"reason": "JSON handler framework utilities — part of the json_structure standard infrastructure. Available for future use by modules that need JSON validation and metrics."
|
||||
"reason": "JSON handler framework utilities \u2014 part of the json_structure standard infrastructure. Available for future use by modules that need JSON validation and metrics."
|
||||
}
|
||||
],
|
||||
"notes": {
|
||||
|
||||
Reference in New Issue
Block a user