| # AGENTS.md β rules for any agent (Codex) working in this repo |
|
|
| StoryCode explains a non-coder's project to them as a story. Read `HANDOFF.md` for |
| the task list and `~/.claude/plans/so-uh-this-is-modular-curry.md` for the why. |
|
|
| ## The one rule that defines this app |
| **Static analysis is the source of truth; the model only narrates it.** |
| `analyzer/` computes the real files, import edges, fan-in/out, roles, entry points, |
| and safe-to-edit verdicts. The language model (via `narrate.py` / `story.py`) writes |
| plain-English *about* those facts. Never let the model invent files, edges, or |
| safety verdicts, and never let model text override what `analyzer/` produced. The |
| Architecture Map (`diagram.py`) and Safe-to-Edit panel are built directly from the |
| ProjectModel β keep them that way. |
|
|
| ## Architecture (where things live) |
| - `ingest.py` β zip/file β clean `SourceFile`s; **redacts secrets** before anything |
| leaves it. All code text must pass through here first. |
| - `analyzer/` β the deterministic engine. `graph.py` owns edges, fan-in/out, roles, |
| and the safe-to-edit logic. Touch with care; it's covered by tests. |
| - `narrate.py` β map (per-file) + reduce (project), with caching and a model-free |
| fallback. `story.py` β the prompts. `llm.py` β the Modal/vLLM client. |
| - `app.py` + `ui/` β the Gradio UI. `modal_app.py` β the GPU backend. |
|
|
| ## Hard constraints β do not violate |
| 1. **No `torch` / `vllm` / `transformers` in `requirements.txt`.** The Space is a |
| CPU container; the GPU lives on Modal (`modal_app.py`). The only exception is the |
| ZeroGPU break-glass path, and only if you deliberately switch to it. |
| 2. **Model β€ 32B and it must be a MiniCPM** (OpenBMB prize). Default is |
| `openbmb/MiniCPM4.1-8B`. Don't swap in a non-OpenBMB model as the core brain. |
| 3. **Don't claim the Tiny Titan badge** (that needs all models β€4B; ours is ~8B). |
| 4. **Keep the custom UI** (`ui/styles.css`) β it's the Off-Brand badge and a user |
| requirement. Don't fall back to the default Gradio theme. |
| 5. **Secrets:** never display or send code without `ingest.redact_secrets` having |
| run. Don't weaken the secret patterns. |
| 6. **Tests stay green.** If you change `analyzer/`, update `tests/test_analyzer.py` |
| and keep `python tests/test_analyzer.py` at 10/10 (or higher). |
|
|
| ## Style conventions (match the existing code) |
| - `from __future__ import annotations`; PEP 604 unions (`str | None`); module |
| docstrings that explain *why*, not just *what*. |
| - Keep functions small and pure where you can; parsing/analysis code never calls |
| the network or the model. |
| - Prefer extending the curated map in `analyzer/deps.py` over adding a model call. |
|
|
| ## What to work on |
| Only the next unchecked item in `HANDOFF.md`. Don't start post-MVP features until |
| steps 1β6 there are deployed. One feature per commit; write Codex-attributed |
| commit messages (the OpenAI Codex prize depends on them). |
|
|