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
  • Rewrite CLAUDE.md to reflect current repo state, not PH0-era scaffolding ...
    a5f1618e
    The original CLAUDE.md described a pre-scaffolding repo with no commits and
    open questions about A-2/critical path -- stale since PH0. Updates it to
    point at git log as the actual status record, document the two independent
    unittest discover roots (src/ and supervisor/), the real backend_server.py
    CLI, the .graphlemon-worktrees/ isolation mechanism and its three real
    incident notes, and a full repo layout reflecting what's actually there.
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    bboonnee authored
    2026-08-03 14:23:52 +0800  
    Browse Code »
  • U-042: expose monitor_window_hours/monitor_min_task_count as testing knobs ...
    5098fbe4
    Attempt 13b was the first real run to get all the way through a real
    cutover -- task lifecycle, classification, staging, health check (fixed
    last commit), and a genuine blue-green cutover all succeeded for real. It
    correctly landed in 'monitor' and then correctly couldn't finish: the real
    production exit condition (deploy_monitor.MONITORING_WINDOW_HOURS=24h OR
    MONITORING_MIN_TASK_COUNT=10 real tasks in the monitored project, NOT the
    disposable per-cycle canary project) isn't practical to wait out in an
    interactive session. This isn't a bug -- those are sensible real defaults
    -- it's a testability gap: run_self_hosting_closed_loop already exposes
    monitor_timeout_cycles as an override knob for exactly this kind of
    situation, but never threaded the two constants that actually gate
    "monitoring_window_clean" through to run_monitor_cycle.
    
    Added monitor_window_hours/monitor_min_task_count params, defaulting to
    deploy_monitor's real constants (production behavior unchanged), threaded
    through to the actual run_monitor_cycle call. New assertion locks in that
    overrides actually reach it.
    
    Also documents the full run of 9 real bugs found and fixed across 13
    attempts in development-plan.md's U-042 note.
    
    564 tests green (441 src + 123 supervisor).
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    bboonnee authored
    2026-08-03 13:55:56 +0800  
    Browse Code »
  • graphlemon: test_report artifact for task 13601943-2489-42f0-a68d-10b2c56312f2
    efcf600c
    graphlemon authored
    2026-08-03 13:49:32 +0800  
    Browse Code »
  • graphlemon: code_diff artifact for task 13601943-2489-42f0-a68d-10b2c56312f2
    cc68d0fa
    graphlemon authored
    2026-08-03 13:49:32 +0800  
    Browse Code »
  • graphlemon: merge 55f7adaa-40f2-40cd-bde4-3ee67d46840c
    49fdbff1
    graphlemon authored
    2026-08-03 13:49:32 +0800  
    Browse Code »
  • graphlemon: auto-commit uncommitted changes for 55f7adaa-40f2-40cd-bde4-3ee67d46840c
    e9aeecdc
    graphlemon authored
    2026-08-03 13:49:32 +0800  
    Browse Code »
  • graphlemon: benchmark artifact for task 13601943-2489-42f0-a68d-10b2c56312f2
    5abfea66
    graphlemon authored
    2026-08-03 13:47:05 +0800  
    Browse Code »
  • graphlemon: sdd artifact for task 13601943-2489-42f0-a68d-10b2c56312f2
    e5bf7c33
    graphlemon authored
    2026-08-03 13:47:05 +0800  
    Browse Code »
  • graphlemon: prd artifact for task 13601943-2489-42f0-a68d-10b2c56312f2
    09ba0db1
    graphlemon authored
    2026-08-03 13:47:05 +0800  
    Browse Code »
  • graphlemon: brd artifact for task 13601943-2489-42f0-a68d-10b2c56312f2
    eb6ecd24
    graphlemon authored
    2026-08-03 13:47:05 +0800  
    Browse Code »
  • graphlemon: auto-commit uncommitted changes for 7dd4ce06-846e-4712-8e34-809c1289… ...
    d4537c6e
    …3203-main-checkout-drift
    graphlemon authored
    2026-08-03 13:37:39 +0800  
    Browse Code »
  • graphlemon: merge 06c1263c-711b-4cb4-8f4b-5fd29c242750 (retried after cleanup)
    4b42a1e9
    bboonnee authored
    2026-08-03 13:33:24 +0800  
    Browse Code »
  • graphlemon: auto-commit uncommitted changes for 06c1263c-711b-4cb4-8f4b-5fd29c24… ...
    b0799411
    …2750-main-checkout-drift
    graphlemon authored
    2026-08-03 13:32:35 +0800  
    Browse Code »
  • graphlemon: auto-commit uncommitted changes for 06c1263c-711b-4cb4-8f4b-5fd29c242750
    f786c2da
    graphlemon authored
    2026-08-03 13:32:35 +0800  
    Browse Code »
  • U-038 fix: http_health polls for startup readiness instead of one-shot ...
    d53156cd
    Attempts 7 and 11 both failed at exactly the same spot: process_alive read
    'ok' within milliseconds of Popen, then http_health hit ECONNREFUSED in the
    same second and gave up. Real cause: process_alive only confirms the
    process EXISTS, not that backend_server.py has finished importing modules
    and actually bound its listen socket -- a real, non-zero startup gap. The
    old check_http_health did one urlopen(timeout=X) call; that timeout only
    bounds how long to wait for a response once connected, not how long to
    wait for the port to start accepting connections at all -- ECONNREFUSED
    fires essentially instantly when nothing's listening yet, regardless of
    timeout.
    
    This touches an explicit 03-C design statement ("不重试——重试属于给坏版本
    第二次机会"), so confirmed with the user before changing it rather than
    just reinterpreting the policy unilaterally. Resolution: tolerating normal
    startup latency within ONE health-check pass isn't "retrying a failed
    check" -- check_process_alive already does exactly this (polls up to 30s
    for the pid to exist). http_health now does the same, polling within its
    own timeout for connection-refused-class errors specifically. A genuine
    non-2xx HTTP response is still a definitive answer from a live server and
    still fails immediately, no polling -- that boundary is unchanged.
    
    Two new real regression tests: a real server that starts listening 0.3s
    late is correctly waited for and passes; a real 500 response still fails
    immediately without being mistaken for "not up yet".
    
    564 tests green (441 src + 123 supervisor).
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    bboonnee authored
    2026-08-03 13:28:29 +0800  
    Browse Code »
  • graphlemon: real agent-memory updates from self-hosting run 11 (validator)
    2ffa71fa
    bboonnee authored
    2026-08-03 13:27:29 +0800  
    Browse Code »
  • Revert "graphlemon: test_report artifact for task 8ea58a57-b53b-4649-a081-de29ac60347d" ...
    e3cce77c
    This reverts commit b14c41371f803541c1f01debb0658ea13e816e0d.
    bboonnee authored
    2026-08-03 13:16:56 +0800  
    Browse Code »
  • graphlemon: test_report artifact for task 8ea58a57-b53b-4649-a081-de29ac60347d
    b14c4137
    graphlemon authored
    2026-08-03 13:12:09 +0800  
    Browse Code »
  • graphlemon: code_diff artifact for task 8ea58a57-b53b-4649-a081-de29ac60347d
    a22220a2
    graphlemon authored
    2026-08-03 13:12:09 +0800  
    Browse Code »
  • graphlemon: merge 4377f28d-6610-4891-a1de-58745b01f55d
    69567be4
    graphlemon authored
    2026-08-03 13:12:09 +0800  
    Browse Code »
  • 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 »