Commit ecd06689064bf8f34c045a9a199bdbd352523ded
1 parent
68055d13
graphlemon: auto-commit uncommitted changes for 77def7e3-7be4-4dee-8657-3a65bd9d…
…6f22-main-checkout-drift
Showing
1 changed file
with
53 additions
and
17 deletions
CLAUDE.md
| ... | ... | @@ -8,10 +8,10 @@ Read this first, then follow the pointers below — do not start writing code be |
| 8 | 8 | ## What this is |
| 9 | 9 | |
| 10 | 10 | **graphlemon** is a Level 5 autonomous "lights-out software factory": a two-layer Organizer Agent |
| 11 | -architecture (Org Graph = fixed Planner→Coder→Validator; Work Graph = dynamic per-task execution | |
| 12 | -graph) that drives real software development end-to-end, backed entirely by Claude Code ACP | |
| 13 | -(`claude -p` non-interactive calls) — there is no Hermes CLI execution backend in this project | |
| 14 | -(decision, 2026-07-29, see `docs/sdd/05-实施约束与依赖.md` §5.3). | |
| 11 | +architecture (Org Graph = fixed Planner→Planner-Reviewer→Coder→Validator; Work Graph = dynamic | |
| 12 | +per-task execution graph) that drives real software development end-to-end, backed entirely by | |
| 13 | +Claude Code ACP (`claude -p` non-interactive calls) — there is no Hermes CLI execution backend in | |
| 14 | +this project (decision, 2026-07-29, see `docs/sdd/05-实施约束与依赖.md` §5.3). | |
| 15 | 15 | |
| 16 | 16 | The authoritative spec is `docs/sdd/` (00-06 + `docs/sdd/sdd-mvcp-contract.json`), generated via |
| 17 | 17 | the MVCP (Model/View/Controller/Process) methodology from `docs/graphlemon_architecture.md`. |
| ... | ... | @@ -28,10 +28,11 @@ Unit from U-001 through U-043 has a matching commit, plus many `U-0XX fix:`/`U-0 |
| 28 | 28 | commits for bugs found during real (not mocked) runs, plus a long tail of `graphlemon: <artifact |
| 29 | 29 | type> for task <uuid>` / `graphlemon: auto-commit uncommitted changes for <id>` / `graphlemon: |
| 30 | 30 | merge <id>` commits — those are graphlemon **actually self-hosting**: running its own |
| 31 | -Planner→Coder→Validator loop against its own repo (`target_folder_path` == this checkout, | |
| 32 | -`src/paths.is_self_target()`), with the Deploy Supervisor (`supervisor/`) staging, health-checking, | |
| 33 | -and cutting over its own code changes. PH5 (self-modification / auto-rollback) is real and running, | |
| 34 | -not future work — see "Two things named Supervisor" below and `supervisor/self_hosting_e2e.py`. | |
| 31 | +Planner→Planner-Reviewer→Coder→Validator loop against its own repo (`target_folder_path` == this | |
| 32 | +checkout, `src/paths.is_self_target()`), with the Deploy Supervisor (`supervisor/`) staging, | |
| 33 | +health-checking, and cutting over its own code changes. PH5 (self-modification / auto-rollback) is | |
| 34 | +real and running, not future work — see "Two things named Supervisor" below and | |
| 35 | +`supervisor/self_hosting_e2e.py`. | |
| 35 | 36 | |
| 36 | 37 | When a `development-plan.md` line and the actual code disagree about what's done, trust the code |
| 37 | 38 | and `git log`, and — if it matters to the task at hand — flag the doc as stale rather than |
| ... | ... | @@ -41,6 +42,17 @@ during self-hosting runs and how they were fixed (e.g. worktree commits being si |
| 41 | 42 | `memory: project` writes landing on the wrong checkout) — read them before touching |
| 42 | 43 | `supervisor/isolation/`, `src/work_node_run.py`, or anything worktree-related. |
| 43 | 44 | |
| 45 | +Work beyond the original 43 Units is tracked the same `docs/todo/` → `docs/done/` way, not in | |
| 46 | +`development-plan.md`: the `planner_reviewer` Org node (a read-only gate that judges whether | |
| 47 | +Planner's BRD/PRD/SDD output is real structured content before Coder is allowed to start — | |
| 48 | +`roles/planner_reviewer/role.json`, wired into the loop from `src/e2e_pipeline.py` and | |
| 49 | +`src/task_execution.py`, task states `reviewing_planner_output`/`planning_brd_prd_sdd`) shipped as | |
| 50 | +"Org Graph unification Phase 1" (commit `ea19c7d`); its design doc is still sitting in | |
| 51 | +`docs/todo/org-graph-unification-phase1-review-gate-design.md` even though the code is live — | |
| 52 | +another instance of code-vs-doc drift, not a sign the feature is unimplemented. Phase 2 (universal | |
| 53 | +self-planning + merged graph + dynamic loop_back, `docs/todo/org-graph-unification-phase2-*`) is | |
| 54 | +SDD-written but check `git log`/the actual Phase 2 code before assuming it's running. | |
| 55 | + | |
| 44 | 56 | ## Where to start |
| 45 | 57 | |
| 46 | 58 | 1. Read `docs/development-plan.md` for the Phase → Sub-phase → Unit breakdown and the *design* |
| ... | ... | @@ -91,6 +103,11 @@ No build step, no lint config, no package manager — pure stdlib Python, nothin |
| 91 | 103 | |
| 92 | 104 | # local console (U-007/U-008): backend serves the API, frontend is static no-build HTML/JS |
| 93 | 105 | python3 -m src.backend_server --port 8000 # default --port 0 means OS-assigned (fine for tests, not for browsing) |
| 106 | + | |
| 107 | +# frontend/app.js has no framework and no automated-test precedent per the SDD (manual browser | |
| 108 | +# verification is the norm), but a few DOM-rendering functions do have plain-Node smoke tests | |
| 109 | +# (vm.Context sandboxing, no npm deps) — run individually, there's no aggregate runner: | |
| 110 | +node frontend/test_graph_console_smoke.js | |
| 94 | 111 | ``` |
| 95 | 112 | |
| 96 | 113 | ## Hard constraints (do not relitigate these — they're settled decisions) |
| ... | ... | @@ -170,16 +187,34 @@ directly; anything worth reusing has already been copied and adapted into this r |
| 170 | 187 | - `docs/wireframes/` — static no-build HTML prototypes for the PH3 console views (`v_*.html`), |
| 171 | 188 | referenced per-page from `docs/sdd/02-V-界面与交互.md` §2.1-2.13; DOM/class names map 1:1 to |
| 172 | 189 | that doc's field lists. |
| 190 | +- `roles/<role_id>/role.json` — the Role Package abstraction (H, 2026-08-06, | |
| 191 | + `docs/done/role-package-abstraction-design.md`): the declarative manifest for each Org node | |
| 192 | + (`skills:`/`model:`/`permissions.tools`/etc., including the `skills:` frontmatter list for | |
| 193 | + that role's `.claude/agents/*.md`). This **replaced** the old hardcoded | |
| 194 | + `src/agent_profile.py::FRONTMATTER`/`_DESCRIPTIONS`/`_MIGRATED_FROM_PROFILE` Python dicts — | |
| 195 | + edit `roles/<role_id>/role.json`, not `agent_profile.py`, to change a role's declared | |
| 196 | + skills/model/tools. `ORG_NODES` is no longer a fixed 3-tuple; `src/agent_profile.py` discovers | |
| 197 | + it by scanning `roles/` for directories containing a `role.json`, so adding a new Org role is | |
| 198 | + one new JSON file, no `schema.py`/`agent_profile.py` edit. `role.json` is JSON (not YAML, | |
| 199 | + despite Skill files using YAML frontmatter) because, unlike Skill frontmatter, this file is | |
| 200 | + parsed by graphlemon's own Python code, not just by Claude Code. `identity.soul_md_path`/ | |
| 201 | + `agents_md_path` in each `role.json` still point at the unmoved `agents/<org_node>/SOUL.md`/ | |
| 202 | + `AGENTS.md` files below — `role.json` is a reference manifest, not a content copy. | |
| 173 | 203 | - `skills/` — the Skill library (architecture doc §7.3): one directory per skill |
| 174 | 204 | (`skills/<name>/SKILL.md` + optional `references/`), migrated/adapted from the Hermes profiles |
| 175 | - (§9's role mapping) and referenced by name from each Org Agent's `.claude/agents/*.md` | |
| 176 | - `skills:` frontmatter list (`src/agent_profile.py::FRONTMATTER`, the canonical source of that | |
| 177 | - list — edit it there, not by hand-editing the deployed `.claude/agents/*.md`). | |
| 178 | -- `.claude/workflows/` — auto-generated, not hand-authored: real Dynamic Workflow scripts written | |
| 179 | - by `src/work_graph_execute.py::write_workflow_script()`/`src/work_graph_orchestrate.py` (one | |
| 180 | - script per Work Node execution) and by `e2e_pipeline.py`'s PRD-consistency check. Version- | |
| 181 | - controlled because it's inside the target repo (self-target case: this repo), but treat the | |
| 182 | - contents as execution artifacts, not source you maintain by hand. | |
| 205 | + (§9's role mapping) and referenced by name from each Org role's `roles/<role_id>/role.json` | |
| 206 | + `skills:` list, which is compiled into the deployed `.claude/agents/*.md` `skills:` frontmatter. | |
| 207 | +- `.claude/workflows/` — **historical mechanism, 2026-08 onward**: used to hold auto-generated | |
| 208 | + Dynamic Workflow scripts written by `src/work_graph_execute.py::write_workflow_script()`, one | |
| 209 | + per Work Node execution (`work_graph_orchestrate.py`) plus `e2e_pipeline.py`'s PRD-consistency | |
| 210 | + check. As of the work-graph-node-execution-deblackbox migration (2026-08, | |
| 211 | + `docs/todo/work-graph-node-execution-deblackbox-requirements.md`), production code no longer | |
| 212 | + writes new files here — every call site that used to render a one-off `.js` script purely to | |
| 213 | + get "agent identity + schema-shaped output" now uses `org_node_trigger. | |
| 214 | + trigger_org_node_structured()` (a flat `claude --agent` call + ```json-fence extraction, the | |
| 215 | + same mechanism `work_graph_plan.py::plan_work_graph()` had already validated in production). | |
| 216 | + Files already generated by real self-hosting runs before this migration are kept (execution | |
| 217 | + artifacts, not source you maintain by hand) — this directory just stops growing. | |
| 183 | 218 | - `src/` — graphlemon's own backend: `schema.py` (17-table SQLite schema — the original 01-M 15 |
| 184 | 219 | entities plus PH5's `deployment`/`deploy_health_signal`), `backend_server.py` (stdlib |
| 185 | 220 | `http.server` HTTP API + WebSocket-ish log/event streaming, no third-party deps), the Org Graph |
| ... | ... | @@ -198,7 +233,8 @@ directly; anything worth reusing has already been copied and adapted into this r |
| 198 | 233 | `isolated_workspace.py`, `change_manifest.py`, `selective_apply.py`, `workspace_security.py`, |
| 199 | 234 | adapted from graphloop). `supervisor/self_hosting_e2e.py` is the acceptance-scenario glue that |
| 200 | 235 | wires Graph Engine scheduling + Deploy Supervisor into one real self-targeted run. |
| 201 | -- `agents/{coder,planner,validator}/SOUL.md` — original Hermes-profile identity docs, migrated | |
| 236 | +- `agents/{coder,planner,planner_reviewer,validator}/SOUL.md` — original Hermes-profile identity | |
| 237 | + docs (`planner_reviewer` added 2026-08, see Org Graph unification note below), migrated | |
| 202 | 238 | 2026-07-31 (A-2 assumption, "部分成立" — Coder's needed real rewriting to drop a hardcoded |
| 203 | 239 | Feishu API token and a `--dangerously-skip-permissions` self-invocation; Planner/Validator were |
| 204 | 240 | near-verbatim). These are the source-of-truth prose; `.claude/agents/*.md` is the actual | ... | ... |