chrono_forge 0.10.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +34 -1
- data/README.md +188 -105
- data/Rakefile +4 -0
- data/cliff.toml +62 -0
- data/docs/design/per-child-commit-overhead.md +213 -0
- data/docs/fanout-scale-test.md +247 -0
- data/docs/superpowers/plans/2026-06-30-poller-rekick-and-eta-cadence.md +205 -0
- data/docs/superpowers/plans/2026-06-30-poller-rekick-and-eta-cadence.md.tasks.json +33 -0
- data/docs/superpowers/plans/2026-07-01-workflow-definition-dag.md +1373 -0
- data/docs/superpowers/plans/2026-07-01-workflow-definition-dag.md.tasks.json +68 -0
- data/docs/superpowers/specs/2026-07-01-workflow-definition-dag-design.md +203 -0
- data/lib/chrono_forge/branch_merge_job.rb +158 -21
- data/lib/chrono_forge/branch_probe.rb +44 -0
- data/lib/chrono_forge/configuration.rb +25 -0
- data/lib/chrono_forge/definition.rb +37 -0
- data/lib/chrono_forge/definition_analyzer.rb +501 -0
- data/lib/chrono_forge/executor/context.rb +23 -0
- data/lib/chrono_forge/executor/lock_strategy.rb +10 -3
- data/lib/chrono_forge/executor/methods/continue_if.rb +15 -6
- data/lib/chrono_forge/executor/methods/durably_execute.rb +15 -7
- data/lib/chrono_forge/executor/methods/durably_repeat.rb +30 -14
- data/lib/chrono_forge/executor/methods/merge_branches.rb +5 -4
- data/lib/chrono_forge/executor/methods/workflow_states.rb +35 -47
- data/lib/chrono_forge/executor.rb +34 -9
- data/lib/chrono_forge/version.rb +1 -1
- data/lib/chrono_forge.rb +8 -0
- data/lib/tasks/release.rake +212 -0
- metadata +28 -2
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"planPath": "docs/superpowers/plans/2026-06-30-poller-rekick-and-eta-cadence.md",
|
|
3
|
+
"tasks": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"subject": "Task 1: Debounced drain-aware rekick + observability (Fix 1)",
|
|
7
|
+
"status": "completed",
|
|
8
|
+
"description": "**Goal:** Rekick a never-started child only when its branch is NOT draining (pending didn't drop since prior poll), at most once per REKICK_AFTER (touch debounce), and record rekick activity on branch-log metadata. Lands the shared foundation: load logs once, uncapped pending, superseded?(logs).\n\nDrain signal = pending-delta (NO query, NO started_at index). First poll (no prev_pending) doesn't gate; per-child staleness filter spares fresh children.\n\n**Files:**\n- Modify: lib/chrono_forge/branch_merge_job.rb\n- Test: test/branch_merge_job_test.rb\n\n```json:metadata\n{\"files\": [\"lib/chrono_forge/branch_merge_job.rb\", \"test/branch_merge_job_test.rb\"], \"verifyCommand\": \"bundle exec ruby -I test test/branch_merge_job_test.rb\", \"acceptanceCriteria\": [\"draining (pending dropped) suppresses rekick\", \"quiet branch still rekicks dropped child\", \"touch debounces re-rekick within REKICK_AFTER\", \"metadata records rekick stats\", \"all pre-existing tests pass\"], \"requiresUserVerification\": false}\n```"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"id": 2,
|
|
12
|
+
"subject": "Task 2: ETA + exponential-backoff poll cadence (Fix 2)",
|
|
13
|
+
"status": "completed",
|
|
14
|
+
"blockedBy": [1],
|
|
15
|
+
"description": "**Goal:** Drive reschedule delay from estimated time-to-drain (measured from prior poll's UNCAPPED pending), clamped [min,max]. When nothing completed this interval, use motion: :running holds floor (no regression), :dispatched backs off exponentially, :none -> max. Persist rate + eta_seconds per branch for the dashboard.\n\n**Files:**\n- Modify: lib/chrono_forge/branch_merge_job.rb (remove FACTOR+CAP, add ETA_FRACTION=0.5; motion from BranchProbe.running?/dispatched?; prev_pending/elapsed/prev_delay from metadata w/ size guard; new reschedule_delay(pending, rate, motion, prev_delay, min, max); record_poll! interval + rate + eta_seconds)\n- Modify: lib/chrono_forge/branch_probe.rb (add running?/dispatched?)\n- Modify: lib/chrono_forge/executor/methods/merge_branches.rb (stale FACTOR comment)\n- Test: test/branch_merge_job_test.rb\n\n```json:metadata\n{\"files\": [\"lib/chrono_forge/branch_merge_job.rb\", \"lib/chrono_forge/branch_probe.rb\", \"lib/chrono_forge/executor/methods/merge_branches.rb\", \"test/branch_merge_job_test.rb\"], \"verifyCommand\": \"bundle exec ruby -I test test/branch_merge_job_test.rb\", \"acceptanceCriteria\": [\"ETA scales with measured drain rate\", \"clamps to min and max\", \"running child holds floor (no regression)\", \"dispatched straggler backs off exponentially\", \"max when nothing progresses\", \"second poll records+uses throughput\", \"pre-existing cadence tests pass\"], \"requiresUserVerification\": false}\n```"
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"id": 3,
|
|
19
|
+
"subject": "Task 3: Update the scale-test doc",
|
|
20
|
+
"status": "completed",
|
|
21
|
+
"blockedBy": [2],
|
|
22
|
+
"description": "**Goal:** Replace the 'needs a caveat' framing in docs/fanout-scale-test.md with a 'Poller behavior' note (pending-delta drain-aware rekick + touch debounce; ETA cadence with corrected 500k profile; no new indexes).\n\n**Files:**\n- Modify: docs/fanout-scale-test.md\n\n```json:metadata\n{\"files\": [\"docs/fanout-scale-test.md\"], \"verifyCommand\": \"\", \"acceptanceCriteria\": [\"doc reflects debounced drain-aware rekick and ETA cadence\"], \"requiresUserVerification\": false}\n```"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"id": 4,
|
|
26
|
+
"subject": "Task 4: Dashboard — live throughput / ETA for in-flight merges",
|
|
27
|
+
"status": "completed",
|
|
28
|
+
"blockedBy": [2],
|
|
29
|
+
"description": "**Goal:** Surface the rate (throughput) + eta_seconds persisted by the poller (Task 2) on the merges list of a parent workflow's detail page. Separate package (chrono_forge-dashboard).\n\n**Files (chrono_forge-dashboard/):**\n- Modify: app/presenters/chrono_forge/dashboard/branches_presenter.rb (Merge struct + builder: add :rate, :eta_seconds; throughput? helper)\n- Modify: app/views/chrono_forge/dashboard/workflows/_branches.html.erb (render throughput/ETA)\n- Test: test/presenters_test.rb\n\n```json:metadata\n{\"files\": [\"chrono_forge-dashboard/app/presenters/chrono_forge/dashboard/branches_presenter.rb\", \"chrono_forge-dashboard/app/views/chrono_forge/dashboard/workflows/_branches.html.erb\", \"chrono_forge-dashboard/test/presenters_test.rb\"], \"verifyCommand\": \"cd chrono_forge-dashboard && bundle exec rake test TEST=test/presenters_test.rb\", \"acceptanceCriteria\": [\"merging branch shows throughput + ETA from poll metadata\", \"zero/absent rate renders nothing\"], \"requiresUserVerification\": false}\n```"
|
|
30
|
+
}
|
|
31
|
+
],
|
|
32
|
+
"lastUpdated": "2026-06-30"
|
|
33
|
+
}
|