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
40 commits
  • graphlemon: auto-commit uncommitted changes for 4377f28d-6610-4891-a1de-58745b01f55d
    761681ae
    graphlemon authored
    2026-08-03 13:12:09 +0800  
    Browse Code »
  • graphlemon: benchmark artifact for task 8ea58a57-b53b-4649-a081-de29ac60347d
    93b76bdc
    graphlemon authored
    2026-08-03 13:07:27 +0800  
    Browse Code »
  • graphlemon: sdd artifact for task 8ea58a57-b53b-4649-a081-de29ac60347d
    e7dd5a35
    graphlemon authored
    2026-08-03 13:07:27 +0800  
    Browse Code »
  • graphlemon: prd artifact for task 8ea58a57-b53b-4649-a081-de29ac60347d
    00fb28e5
    graphlemon authored
    2026-08-03 13:07:27 +0800  
    Browse Code »
  • graphlemon: brd artifact for task 8ea58a57-b53b-4649-a081-de29ac60347d
    5faa2197
    graphlemon authored
    2026-08-03 13:07:27 +0800  
    Browse Code »
  • graphlemon: auto-commit uncommitted changes for e30e6617-203e-4941-b85f-131e4ae9… ...
    39213ab2
    …be04-main-checkout-drift
    graphlemon authored
    2026-08-03 13:01:26 +0800  
    Browse Code »
  • U-013 follow-up: drop the exclude pathspec, it was itself a hard error ...
    ebfcc437
    Attempt 10 crashed immediately in the fix committed last: git add -A --
    . ':!.graphlemon-worktrees' throws "paths are ignored by one of your
    .gitignore files" (exit 1, not just advisory text -- confirmed even with
    advice.addIgnoredFile=false suppressed) the moment that path is ALSO
    gitignored, which it now always is. Reproduced locally.
    
    Plain `git add -A` (no explicit pathspec) already skips gitignored paths
    correctly on its own -- the explicit exclude was redundant now that
    .gitignore covers it, and actively conflicting. Simplified
    ensure_worktree_committed() back down. Also added the same .gitignore
    entry to test_work_node_run.py's _init_git_repo() fixture so real-worktree
    tests match production config instead of coincidentally not hitting this.
    
    562 tests green (441 src + 121 supervisor).
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    bboonnee authored
    2026-08-03 12:59:06 +0800  
    Browse Code »
  • U-013 fix: auto-commit main-checkout drift too, not just the worktree's own ...
    b6423cff
    Attempts 8 and 9 both hit "local changes would be overwritten by merge"
    again, despite the earlier _check_prd_consistency worktree-isolation fix.
    Root cause is deeper: git worktrees deliberately SHARE project identity
    with their main checkout (same .git, just another checkout) -- a real
    `claude -p` call's memory:project write doesn't reliably respect the cwd it
    was invoked with, and can land directly on the main checkout regardless of
    which specific call triggered it. Worktree-wrapping one call (as done for
    _check_prd_consistency) only moves around which call happens to trigger
    this; it doesn't fix the underlying issue.
    
    ensure_worktree_committed() now also runs against repo_path itself (not
    just the worktree) right before every merge_worktree() call, in both
    work_node_run.run_work_node() and e2e_pipeline._check_prd_consistency().
    Same already-tested mechanism, now applied generically regardless of which
    real call caused the drift or why.
    
    Fixing this surfaced a second real bug in the fix itself: running `git add
    -A` against repo_path while a node's own .graphlemon-worktrees/<id>/
    checkout is still present on disk picks it up as a gitlink-like entry,
    which then shows as "deleted" the instant remove_worktree() runs right
    after. Fixed by excluding .graphlemon-worktrees/ from both the dirty-check
    and the add via pathspec (not relying on the caller repo's own .gitignore),
    plus added it to graphlemon's own .gitignore for correctness generally.
    
    New regression test: test_drift_on_main_checkout_is_auto_committed_before_merge
    reproduces a run_fn writing directly to repo_path instead of its worktree,
    and confirms a second node's own merge isn't affected by it.
    
    562 tests green (441 src + 121 supervisor).
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    bboonnee authored
    2026-08-03 12:50:34 +0800  
    Browse Code »
  • graphlemon: merge e37929c2-d191-4e22-b669-3d4f7f87f150 (retried after cleanup)
    8d980dec
    bboonnee authored
    2026-08-03 12:49:25 +0800  
    Browse Code »
  • graphlemon: real agent-memory updates from self-hosting run 8
    17a466ba
    bboonnee authored
    2026-08-03 12:48:01 +0800  
    Browse Code »
  • graphlemon: auto-commit uncommitted worktree changes for e37929c2-d191-4e22-b669-3d4f7f87f150
    1f58c5bc
    graphlemon authored
    2026-08-03 12:42:07 +0800  
    Browse Code »
  • U-041 fix: rollback path A now removes the candidate's worktree checkout ...
    4b293a8e
    The 7th real self-hosting attempt was the first to actually reach a real
    health check against a real candidate process -- it correctly failed and
    triggered rollback_path_a for real: candidate terminated, git revert landed
    cleanly. But the candidate's `git worktree add --detach` checkout
    (candidate_instance_dir, tracked since U-037 specifically to know where
    this lives) was never removed -- left permanently on disk and still
    registered in `git worktree list`. A confirmed-bad candidate is never
    needed again after path A, unlike a successful cutover's candidate (which
    correctly becomes previous_instance_dir, kept until the monitoring window
    closes) -- these are different lifecycles that shouldn't share the same
    "leave it" behavior.
    
    rollback_path_a gains an optional candidate_instance_dir parameter
    (default None, existing tests unaffected) and removes the worktree before
    git revert when provided. self_hosting_e2e.py now threads through the
    value stage_deployment() already returns. New regression test uses a real
    `git worktree add --detach` checkout and confirms both the directory and
    its git worktree registration are gone after rollback.
    
    Also cleaned up 3 orphaned processes left by earlier test_deploy_rollback.py
    runs (backing temp dirs already gone) and the real leftover candidate
    worktree from this run.
    
    561 tests green (440 src + 121 supervisor).
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    bboonnee authored
    2026-08-03 01:01:50 +0800  
    Browse Code »
  • graphlemon: real agent-memory updates from self-hosting run 7 (validator)
    f220d91d
    bboonnee authored
    2026-08-03 01:01:40 +0800  
    Browse Code »
  • Revert "graphlemon: test_report artifact for task 4fda1803-3ee0-40c8-8209-b0baef56d54b" ...
    b5308c13
    This reverts commit d77320f8d5b0600c99dcb6969e868f6d348ce9fb.
    bboonnee authored
    2026-08-03 00:56:54 +0800  
    Browse Code »
  • graphlemon: test_report artifact for task 4fda1803-3ee0-40c8-8209-b0baef56d54b
    d77320f8
    graphlemon authored
    2026-08-03 00:54:59 +0800  
    Browse Code »
  • graphlemon: code_diff artifact for task 4fda1803-3ee0-40c8-8209-b0baef56d54b
    0ad6e42a
    graphlemon authored
    2026-08-03 00:54:59 +0800  
    Browse Code »
  • graphlemon: merge b24c881d-ecea-4caa-ab32-39beca07f9c4
    52663300
    graphlemon authored
    2026-08-03 00:54:59 +0800  
    Browse Code »
  • graphlemon: auto-commit uncommitted worktree changes for b24c881d-ecea-4caa-ab32-39beca07f9c4
    5bb25db3
    graphlemon authored
    2026-08-03 00:54:59 +0800  
    Browse Code »
  • graphlemon: benchmark artifact for task 4fda1803-3ee0-40c8-8209-b0baef56d54b
    c8c1548c
    graphlemon authored
    2026-08-03 00:53:35 +0800  
    Browse Code »
  • graphlemon: sdd artifact for task 4fda1803-3ee0-40c8-8209-b0baef56d54b
    a6cf3689
    graphlemon authored
    2026-08-03 00:53:35 +0800  
    Browse Code »
  • graphlemon: prd artifact for task 4fda1803-3ee0-40c8-8209-b0baef56d54b
    222c956c
    graphlemon authored
    2026-08-03 00:53:35 +0800  
    Browse Code »
  • graphlemon: brd artifact for task 4fda1803-3ee0-40c8-8209-b0baef56d54b
    a003b4c5
    graphlemon authored
    2026-08-03 00:53:35 +0800  
    Browse Code »
  • graphlemon: merge 64673231-c2e5-4160-9840-426fae66fe8d
    207153dd
    graphlemon authored
    2026-08-03 00:48:26 +0800  
    Browse Code »
  • 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 »