Logo white

宜博 / lemongraph

Sign in
  • Sign in
  • Project
  • Files
  • Commits
  • Network
  • Graphs
  • Milestones
  • Issues 0
  • Merge Requests 0
  • Labels
  • Wiki
  • Commits 341
  • Compare
  • Branches 1
  • Tags 0
  • lemongraph
03 Aug, 2026
25 commits
  • graphlemon: auto-commit uncommitted worktree changes for 64673231-c2e5-4160-9840-426fae66fe8d
    70f05579
    graphlemon authored
    2026-08-03 00:48:26 +0800  
    Browse Code »
  • U-011 fix: deterministically enforce the canonical BRD->PRD->SDD->Benchmark chain ...
    0d602ed4
    The 6th real self-hosting attempt (first to reach the full 4-node doc-writing
    graph after the previous five bugs) hit a genuinely new failure: this real
    graph_manifest had no edges at all, not just wrong field names -- worse than
    the case _normalize_graph_manifest already handled. With zero dependency
    info to normalize from, topological_order() scheduled 'benchmark' before
    'sdd' (alphabetically first among zero-in-degree nodes), and build_prompt()
    crashed with KeyError: 'sdd_content' trying to format a template needing
    sdd's not-yet-produced output.
    
    _PROMPT_TEMPLATE always asks for exactly the same fixed 4-node linear chain
    -- that's a constant architectural fact, not something that should be
    re-inferred from the LLM's output every call. _normalize_graph_manifest now
    deterministically enforces brd->prd->sdd->benchmark whenever all four
    canonical artifact_types are present, regardless of what depends_on/edges
    the LLM did or didn't provide. Same "机制用代码" principle as
    ensure_worktree_committed and the earlier normalize logic.
    
    Three new regression tests: zero dependency info still gets the chain
    enforced, node_id != artifact_type still resolves to the real node_id (not
    a guessed string), and a partial set (missing one of the four types) is
    correctly left alone rather than guessed at.
    
    560 tests green (440 src + 120 supervisor).
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    bboonnee authored
    2026-08-03 00:45:00 +0800  
    Browse Code »
  • graphlemon: test_report artifact for task 0175484a-8498-48f6-a82b-f229fc015d28
    2aa68435
    graphlemon authored
    2026-08-03 00:38:51 +0800  
    Browse Code »
  • graphlemon: code_diff artifact for task 0175484a-8498-48f6-a82b-f229fc015d28
    6e9b7a3a
    graphlemon authored
    2026-08-03 00:38:51 +0800  
    Browse Code »
  • graphlemon: merge 9d0b0265-5b00-4fd2-b748-f5d0cd5faf77
    2f2db22d
    graphlemon authored
    2026-08-03 00:38:51 +0800  
    Browse Code »
  • graphlemon: auto-commit uncommitted worktree changes for 9d0b0265-5b00-4fd2-b748-f5d0cd5faf77
    81fefe76
    graphlemon authored
    2026-08-03 00:38:51 +0800  
    Browse Code »
  • graphlemon: benchmark artifact for task 0175484a-8498-48f6-a82b-f229fc015d28
    d1e40a2a
    graphlemon authored
    2026-08-03 00:37:03 +0800  
    Browse Code »
  • graphlemon: sdd artifact for task 0175484a-8498-48f6-a82b-f229fc015d28
    48d55945
    graphlemon authored
    2026-08-03 00:37:03 +0800  
    Browse Code »
  • graphlemon: prd artifact for task 0175484a-8498-48f6-a82b-f229fc015d28
    f9af13aa
    graphlemon authored
    2026-08-03 00:37:03 +0800  
    Browse Code »
  • graphlemon: brd artifact for task 0175484a-8498-48f6-a82b-f229fc015d28
    7447be7f
    graphlemon authored
    2026-08-03 00:37:03 +0800  
    Browse Code »
  • U-031 fix: worktree-isolate the PRD consistency check for self-target ...
    0b32b95a
    The 4th real self-hosting attempt (first to reach the actual doc-writing
    Work Graph after the previous three bugs) hit a real git merge failure:
    "local changes would be overwritten by merge", exit code 2.
    
    Root cause: _check_prd_consistency() calls execute_work_graph() directly
    against target_folder_path, completely bypassing work_node_run.run_work_node's
    worktree isolation. It uses agentType='planner' with memory:project, which
    writes a real update to .claude/agent-memory/planner/MEMORY.md in whatever
    cwd it runs with. Every prior real run of this check only ever targeted a
    throwaway clone, so this never mattered -- until self-targeting, where cwd
    IS the main checkout: the memory write landed as an uncommitted local
    change on master, which then blocked the SDD node's own (correctly
    isolated) worktree merge right after it.
    
    Fix: apply 05 §5.8's same unconditional self-target worktree rule here,
    reusing work_node_run's existing create_worktree/ensure_worktree_committed/
    merge_worktree/remove_worktree rather than inventing a new mechanism.
    Non-self-target calls are unaffected (verified by both regression tests).
    
    Also cleaned up the real, now-recovered state from the failed 4th attempt:
    merged a real SDD-node worktree branch that got stranded uncommitted
    (conflict was just two near-identical memory file wordings, resolved by
    hand), and removed three orphaned worktrees left by earlier test runs.
    
    557 tests green (437 src + 120 supervisor).
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    bboonnee authored
    2026-08-03 00:27:40 +0800  
    Browse Code »
  • graphlemon: merge 044315ed-c80e-4866-a582-92efda9e9315 (retried after cleanup)
    c425ab85
    bboonnee authored
    2026-08-03 00:23:47 +0800  
    Browse Code »
  • graphlemon: real agent-memory updates from self-hosting investigation runs
    6eb24998
    bboonnee authored
    2026-08-03 00:23:06 +0800  
    Browse Code »
  • graphlemon: auto-commit uncommitted worktree changes for 044315ed-c80e-4866-a582-92efda9e9315
    edd48331
    graphlemon authored
    2026-08-03 00:19:55 +0800  
    Browse Code »
  • U-037 fix: bootstrap a fresh db when prod_db_path doesn't exist yet ...
    2b9b9a90
    The third real self-hosting attempt (first to actually reach stage_deployment
    itself, past the earlier bootstrap/commit bugs) hit an uncaught
    FileNotFoundError: _copy_prod_db() assumed prod_db_path always exists and
    shutil.copy2()'d it unconditionally. graphlemon has never actually run as a
    persistent service, so ~/.graphlemon/graphlemon.db never existed.
    stage_deployment() already handles this exact class of "no prior state"
    bootstrap case for previous_commit_hash/previous_instance_dir -- prod_db_path
    never got the same treatment, and every existing test seeds a prod db in
    setUp so this was never exercised.
    
    Fix: when prod_db_path doesn't exist, create a fresh schema'd db instead of
    copying -- semantically correct, since a genuinely-first deployment has no
    production data to inherit. New regression test (BootstrapProdDbTest) covers
    it. 555 tests green (435 src + 120 supervisor).
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    bboonnee authored
    2026-08-03 00:16:10 +0800  
    Browse Code »
  • graphlemon: test_report artifact for task 16f1d360-5117-40bf-98e6-0821058a61b8
    438607d6
    graphlemon authored
    2026-08-03 00:11:29 +0800  
    Browse Code »
  • graphlemon: code_diff artifact for task 16f1d360-5117-40bf-98e6-0821058a61b8
    045aa97a
    graphlemon authored
    2026-08-03 00:11:29 +0800  
    Browse Code »
  • graphlemon: merge e512b26e-556f-42c7-98db-6969c5c810a2
    9b244fcd
    graphlemon authored
    2026-08-03 00:11:29 +0800  
    Browse Code »
  • graphlemon: auto-commit uncommitted worktree changes for e512b26e-556f-42c7-98db-6969c5c810a2
    ea3561a6
    graphlemon authored
    2026-08-03 00:11:29 +0800  
    Browse Code »
  • graphlemon: benchmark artifact for task 16f1d360-5117-40bf-98e6-0821058a61b8
    1555dfc0
    graphlemon authored
    2026-08-03 00:10:26 +0800  
    Browse Code »
  • graphlemon: sdd artifact for task 16f1d360-5117-40bf-98e6-0821058a61b8
    f0272b71
    graphlemon authored
    2026-08-03 00:10:26 +0800  
    Browse Code »
  • graphlemon: prd artifact for task 16f1d360-5117-40bf-98e6-0821058a61b8
    6ab6700b
    graphlemon authored
    2026-08-03 00:10:25 +0800  
    Browse Code »
  • graphlemon: brd artifact for task 16f1d360-5117-40bf-98e6-0821058a61b8
    2d3baada
    graphlemon authored
    2026-08-03 00:10:25 +0800  
    Browse Code »
  • U-013 fix: auto-commit uncommitted worktree changes before merge ...
    8af3d4e4
    A real self-hosting run (U-042, first real exercise of needs_worktree=True
    since U-035 forces it unconditionally for self-target) exposed a real bug
    RealGitWorktreeIsolationTest never caught: its own run_fn always committed
    its edits, but a real Coder isn't instructed anywhere to git commit its own
    changes. The Coder genuinely edited src/org_loop_route.py and verified it
    in its own test_report -- but never committed, so merge_worktree()'s `git
    merge` was a true no-op ("Already up to date"), and remove_worktree() then
    silently discarded the dirty worktree along with the real work. code_diff
    came out empty; the change never reached the branch at all.
    
    Adds ensure_worktree_committed(): checks `git status --porcelain` in the
    worktree before merging and auto-commits any dirty state found. A no-op
    when the worktree is legitimately clean (e.g. a pure investigation task).
    Same "判断用 Agent,机制用代码" principle already used elsewhere in this
    codebase -- don't rely on persona prompt-engineering for a mechanical
    correctness guarantee that the system itself should hold.
    
    Two new regression tests: one reproducing the exact "edited but never
    committed" scenario, one confirming a legitimately-clean worktree still
    merges fine. 554 tests green (435 src + 119 supervisor).
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    bboonnee authored
    2026-08-03 00:02:31 +0800  
    Browse Code »
  • Bootstrap graphlemon's own .claude/agents/ and gitignore workflow scratch files ...
    afb478d5
    U-004 migrated the Hermes personas into agents/{planner,coder,validator}/SOUL.md
    (the canonical source) but nothing had ever actually deployed the compiled
    .claude/agents/*.md into graphlemon's own repo -- every real test throughout
    PH1-PH4 ran against throwaway target-project clones that got this step via
    project_scaffold, never against graphlemon self-targeting itself. The real
    U-042 self-hosting attempt surfaced this immediately: `claude --agent planner`
    failed outright with "--agent 'planner' not found". Deployed via
    agent_profile.deploy_agent_definitions() and committed -- self-target worktree
    isolation only sees committed content, so this has to be tracked, not just
    written to disk, for any future self-target task to find its own persona.
    
    Also commits the real agent-memory files a genuine self-target run generated
    (architecture doc §8 decision 1: memory must be git-traceable) and gitignores
    .claude/workflows/ (one-shot, uniquely-named dynamic-workflow scripts written
    per Work Node call -- pure runtime clutter, never reused, not source content).
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    bboonnee authored
    2026-08-03 00:02:17 +0800  
    Browse Code »

02 Aug, 2026
15 commits
  • graphlemon: test_report artifact for task 8c580bee-de0c-4109-984b-b1464333e940
    54f0d1eb
    graphlemon authored
    2026-08-02 23:55:13 +0800  
    Browse Code »
  • graphlemon: code_diff artifact for task 8c580bee-de0c-4109-984b-b1464333e940
    d582890b
    graphlemon authored
    2026-08-02 23:55:13 +0800  
    Browse Code »
  • graphlemon: benchmark artifact for task 8c580bee-de0c-4109-984b-b1464333e940
    32354822
    graphlemon authored
    2026-08-02 23:53:32 +0800  
    Browse Code »
  • graphlemon: sdd artifact for task 8c580bee-de0c-4109-984b-b1464333e940
    fb242db4
    graphlemon authored
    2026-08-02 23:53:32 +0800  
    Browse Code »
  • graphlemon: prd artifact for task 8c580bee-de0c-4109-984b-b1464333e940
    aadf2f63
    graphlemon authored
    2026-08-02 23:53:32 +0800  
    Browse Code »
  • graphlemon: brd artifact for task 8c580bee-de0c-4109-984b-b1464333e940
    b896023f
    graphlemon authored
    2026-08-02 23:53:32 +0800  
    Browse Code »
  • graphlemon: test_report artifact for task 14fd9ab6-e2c8-4233-8381-002419de85bb
    6ce56d0f
    graphlemon authored
    2026-08-02 23:22:30 +0800  
    Browse Code »
  • graphlemon: code_diff artifact for task 14fd9ab6-e2c8-4233-8381-002419de85bb
    da6ad94b
    graphlemon authored
    2026-08-02 23:22:30 +0800  
    Browse Code »
  • graphlemon: benchmark artifact for task 14fd9ab6-e2c8-4233-8381-002419de85bb
    d7c95490
    graphlemon authored
    2026-08-02 23:20:40 +0800  
    Browse Code »
  • graphlemon: sdd artifact for task 14fd9ab6-e2c8-4233-8381-002419de85bb
    3a9fdf24
    graphlemon authored
    2026-08-02 23:20:40 +0800  
    Browse Code »
  • graphlemon: prd artifact for task 14fd9ab6-e2c8-4233-8381-002419de85bb
    436a05d6
    graphlemon authored
    2026-08-02 23:20:40 +0800  
    Browse Code »
  • graphlemon: brd artifact for task 14fd9ab6-e2c8-4233-8381-002419de85bb
    31b2c541
    graphlemon authored
    2026-08-02 23:20:40 +0800  
    Browse Code »
  • U-043: console deployment status view (v_deployment_status) ...
    59e96d3e
    Adds src/deployment_query.py (list_deployments/get_current_deployment/
    get_deployment -- no project_id filter needed, deployment has no project_id
    column since there's exactly one graphlemon self-target) + three new
    backend_server.py routes (GET /api/deployments, /current, /:id, the last
    with recent deploy_health_signal history) + a new v_deployment_status page
    in frontend/app.js polling every 5s (deployment.status changes don't go
    through c_ws_subscribe -- Deploy Supervisor writes deployment/
    deploy_health_signal directly, no execution_event of its own).
    
    No 02-V spec exists for this view (PH5 was added after 02-V was written) --
    DOM/class conventions follow the existing pages' own patterns. Verified
    against a real running server via urllib (browser extension unavailable
    this session), plus 9 deployment_query unit tests and 5 real HTTP route
    tests.
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    bboonnee authored
    2026-08-02 15:44:09 +0800  
    Browse Code »
  • U-042: self-hosting closed-loop acceptance (orchestration + gated real test) ...
    05292668
    Adds supervisor/self_hosting_e2e.py: run_self_hosting_closed_loop() chains
    every PH5 module built this session (U-034~U-041) with the Graph Engine's
    own scheduler (U-032) into one real, callable path matching self-development-
    feasibility.md's 9-step scenario -- self-target Goal -> Planner/Coder/
    Validator -> core_engine classification -> stage -> health check -> cutover
    (or rollback path A if health check fails) -> monitor until either
    monitoring_window_clean (finalized) or anomaly_detected (rollback path B).
    Both real outcome paths are branches of the same call, not two separate
    scripted scenarios. Explicitly documented as this acceptance scenario's own
    orchestration glue, not a claim about Deploy Supervisor's eventual
    production poll loop (U-036's discovery-loop hook is still unfilled;
    building that is future work).
    
    Mocked wiring tests (6, run in normal regression) stub each already
    independently-tested module boundary and only verify the branching logic.
    
    The real, literal acceptance test is built and ready (RealSelfHostingClosedLoopTest,
    reproduces the document's own "loop_round > 3 should be >= 3" example) but
    gated behind RUN_REAL_SELF_HOSTING_E2E=1 -- deliberately a separate,
    distinctly-named env var from this project's usual RUN_REAL_AGENT_E2E, since
    this is the highest-blast-radius action in the project (can replace the
    running graphlemon process and git-revert commits on this real repo).
    Per this Unit's own explicit build instruction, not executed as part of
    implementing it -- doing so requires checking with the user first.
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    bboonnee authored
    2026-08-02 12:09:28 +0800  
    Browse Code »
  • U-041: c_deploy_supervisor_rollback (paths A/B + the rollback-fails fallback) ...
    4f4b1853
    Adds supervisor/deploy_rollback.py: rollback_path_a (pre-cutover, health
    check failed -- terminate candidate, delete its one-time DB copy, git
    revert, record a bug_record(core_engine) audit trail) and rollback_path_b
    (post-cutover, anomaly detected -- stop the bad Live, revive
    previous_instance_dir, re-run the same three health-check signals directly
    against it, git revert only once re-verification passes).
    
    Design choices follow established conventions rather than inventing new
    ones: no unified rollback() entry point (deployment has no PID columns,
    same reason deploy_stage/deploy_cutover already require callers to pass
    pids explicitly); ROLLBACK_FAILED is the raised error name while the
    persisted deployment.status is 'blocked_pending_human' (same pattern
    CheckoutFailedError/CutoverFailedError already use). git revert conflicts
    fold into the same rollback-itself-failed fallback both paths share, per
    design doc §10 open question 3's own recommendation, with `git revert
    --abort` run afterward so a failed attempt doesn't leave the repo mid-conflict.
    
    This is PH5's highest-rework-risk Unit per development-plan.md's own flag,
    so its own "rollback itself fails" fallback is tested for real, not assumed:
    a genuinely broken previous_instance_dir (a real empty directory with no
    Python package in it) that really fails to bind its port, and a genuinely
    conflicting git history (a later commit touching the same line the
    self-modification changed) that really fails `git revert` -- both correctly
    land on blocked_pending_human without retrying forever or silently
    succeeding, and the conflict case leaves the repo clean afterward.
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    bboonnee authored
    2026-08-02 12:02:26 +0800  
    Browse Code »