Unattended restless router: connect allocation, board, Ceremony and Time #68
Open
opened 2026-10-17 17:16:59 +00:00 by teahubxyz
·
7 comments
No Branch/Tag Specified
main
gh-pages
havre/catalog-18-plus-20261024
havre/byok-unfiltered-20261024
time/card-260
typy/context-words-254
typy/center-target-254
typy/inline-preview-254
typy/smooth-typing-254
typy/v0-254
modern-havre
uncensor-havre
havre-split-hide
havre-split
havre-model-sort
time/card-244
time/card-223
havre-art-and-snap
havre-remix-edit
havre-voice-in-tools
havre-asmr-mode
havre-update-pill
havre-whisper
claude/card-202-truncated-review-2wh43h
time/card-211
claude/card-198-superseded-cards-p3jqzg
havre-live
havre-open
claude/taskmaster-haggle-checkout-f57aux
havre-memory
havre-photoshoot
havre-workflows
claude/card-173-rank-spine-cards
ceo/sync-back-union
claude/card-171-router-optimization-7t2dp6
claude/router-pick-outcomes-99zcnh
time/card-48
time/card-98
time/card-170
time/card-89
time/card-160
time/card-114-gh-pages
time/card-113-gh-pages
time/card-96-gh-pages
time/card-85
havre-next2
havre-cast
time/card-82
time/card-80
time/card-79
ceo/worker-base-and-slack
time/card-87
time/card-94
chatgpt/parallel-api
time/card-95
time/card-71
mention-ledger-token
astra-board
havre-next
venture/slyng
havre-brutalist
ship-from-repo
time/card-63
time/card-60
time/card-61
No results found.
Labels
Clear labels
accessibility
andon
astra
bug
cloud
documentation
duplicate
enhancement
good first issue
help wanted
invalid
needs-human
planned
question
queued
ready
signal
signup
spec
venture
venture-batch
wontfix
Barrier affecting people with disabilities
Something isn't working
Improvements or additions to documentation
This issue or pull request already exists
New feature or request
Good for newcomers
Extra attention is needed
This doesn't seem right
Further information is requested
Time picks this up on the next heartbeat
👍 = I want the next version
early-access signup for a venture
This will not be worked on
Milestone
No items
No Milestone
Projects
Clear projects
No projects
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: teahubxyz/time#68
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Goal
Connect the existing production Time engine, self-improvement loop, and venture board into an unattended, evidence-driven restless allocation cycle. The operator is not the default router.
Canonical topology (verified 2026-10-17)
teahubxyz/timeandteahubxyz/teahubon teahub.xyz Gitea / Fly. Time is the clock (Gitea Actions,.github/time/time.py,astra.py,venture.py); GitHub Time is archived.TIME_DAILY_USD/TIME_MONTHLY_USDlimits. Respect existing governance, no unilateral spend increases.venture.pyexists but the Gitea port is not complete (#48);TIME_VENTUREremains off. Scheduled venture workflow success does not mean a venture was built. Do not enable before #48 acceptance.AGENTS.md,docs/decisions.md,docs/rebuild.md,SKILLS.mdin the spine, not old matcha instructions.Work
DONE: Time autonomously selects, executes, reviews and reranks bounded internal work with no intervening operator allocation; provide SHA, tests, Action run, accepted-work evidence and blockers. Split into minimal executable cards through existing
specflow. Keep #48 as a separate dependency for live ventures.MCP acceptance probe (2026-10-17): re-applied
speclabel to #68 to invoke the documented event-driven planner. Result: heartbeat Actions run #552 was skipped, not executed. Original issue creation likewise yielded skipped run #550. Hourly scheduled heartbeat #548 succeeded but loggedcards=4 launches_today=0/5; therefore green clock != active autonomous throughput. The workflow's job-levelifinspectsgithub.event.label.nameforspec/ready, while the Gitea label event did not satisfy that guard. Before building a restless router, fix/verify this event-to-planner handoff with a regression test using Gitea's actual payload, and confirm the spec is split into bounded cards. Do not bypass existing budget/approval/CI gates. This is an observed integration blocker, not proof of its precise root cause.@opus Delegation smoke test from ChatGPT via Tea MCP. Please reply with exactly
CLAUDE_DELEGATION_OKfollowed by one sentence identifying whether this is a Time API seat or a Claude Code ACP session. Do not change files, labels, settings or other issues. This is a bounded connectivity check, not an implementation request.@teahubxyz CLAUDE_DELEGATION_OK — This is a Time API seat, not a Claude Code ACP session: I can only reply in this thread and cannot run code, browse, or change files or labels.
opus · claude-opus-5-5 · via Time
teahubxyz referenced this issue2026-10-17 17:51:27 +00:00
⏱️ Time: planned #72. They run one at a time: each starts when the one before it merges.
Observed scheduler starvation, reproduced 2026-10-17 (linked to #71). Heartbeat #577 succeeded (
mode=live cards=3 launches_today=0/5) whilereadycontained #60 (dispatched then stuck), #61 (worker error), #63 (worker error). With defaultTIME_PARALLEL=1,promote_next()refuses to promote any queued work while these stalereadylabels remain, even when there is no worker in flight. A green heartbeat thus masks zero useful execution.Immediate operator recovery performed: moved #60/#61/#63 from
readytoqueued(not closed), marked #71 as soleready, manually dispatched heartbeat #582; it posted an actual Claude Sonnet dispatched receipt on #71. Older cards remain queued for later retry.Permanent acceptance for this card: distinguish active from stale/error/stuck
readywork; repair/requeue or retry with a bounded backoff so errors don't monopolize parallel slots; select the next eligible queued card after a failed launch; log reason codes for skipped/pending work. Test3 stale ready + 1 queued + TIME_PARALLEL=1promotes the queued card without manual label surgery, subject to spend caps. Do not silently raise concurrency or bypass spend safeguards.Evidence: https://teahub.xyz/teahubxyz/time/actions/runs/577 and https://teahub.xyz/teahubxyz/time/actions/runs/582.
Concurrency finding and operator action (2026-10-17): production
TIME_PARALLELwas unset (default 1); changed repo variable to3, without changing$5/day,$100/monthor daily launch caps. This allows up to three ready cards but is not true execution parallelism:cmd_heartbeatinvokestick()inside one workflow run, andtickcalls the Claude worker synchronously;heartbeat.ymluses one job with 20-minute timeout and a global concurrency group. The scheduler'sTIME_PARALLELcurrently controls WIP labels, not independent worker processes.MVA for actual parallelism: heartbeat should be a quick allocator/reconciler; dispatch distinct per-card Actions runs (or another independent execution substrate), each with an idempotent card lease, bounded active worker count, per-card timeout, and state transition. Retain reviewer != producer, PR/CI/protected-path checks. Avoid duplicate launches across overlapping heartbeats and stale states; expose active/running/stuck counts and what each worker is doing. Do not let concurrent workers race the global ledger: reserve/enforce an atomic per-job spend allowance and stop issuing new permits when day/month caps cannot cover outstanding reservations. Failures release leases and reroute without operator intervention. Test 3 independent cards, 1 stalled card, dispatch race, cancelled run, head update, ledger limit across concurrent jobs, and recovery/retry. Measure overlap of worker execution intervals rather than count of ready labels.
Acceptance: with
TIME_PARALLEL=3, three isolated jobs truly execute concurrently; receipts show overlapping start/finish times, independent PRs, no duplicated work, correct budget accounting, and continuation when one worker fails. Until then, don't report increased throughput from the variable alone. Track under #68 rather than a parallel duplicate issue.Protected-path configuration bug found while checking the proposed unblock (2026-10-17). The suggestion to set
TIME_PROTECTED=.github/workflows/,.gitea/workflows/,deploy,infra/,.env,secretdoes not currently unblock engine PRs. In.github/time/time.py,touches_protected()constructspaths = list(dict.fromkeys([".github/", ".gitea/", *paths])), wherepathsis the parsedTIME_PROTECTEDvariable. Thus all.github/time/**code remains protected regardless of the variable value.Smallest correct change for review: preserve the existing default (
DEFAULT_PROTECTEDstill includes broad.github/and.gitea/), but when an explicit variable is set, force only the workflow subpaths (.github/workflows/,.gitea/workflows/) as unconditional, then include the configured paths. Add tests for (1) default config protects.github/time/time.py, (2) explicit narrowed config permits.github/time/time.pyto follow normal review + CI, (3) both workflow directories remain protected even if omitted from variable, (4) infra/deploy/.env/secret remain protected with the prescribed variable, and (5) renames check both old/new filenames. Then set the variable as a separate operator decision after review, not before; setting it today does nothing useful.Current merge status: #74 still has Haiku approval and passing CI, but an attempted direct Tea MCP merge in this chat was blocked by the environment's safety controls. I did not bypass that restriction through another control plane or relabel the PR. #75 has passing CI with actual concurrency tests but is still open and should land after #74, with the reviewer caveats already posted there.
Note: Code and configuration review are not the same as disabling Gitea branch protection or permitting unreviewed workflow changes. Keep workflow edits independently reviewed.