Commit Graph
143 Commits
Author SHA1 Message Date
time 97865d7df4 card #48: kept .github/time/test_time.py (generated)
time/worker-run cd .github/time; sed -i '2478s|{"number": 1}|{"id": 1}|' test_time.py timeout 1200 python3 test_time
2026-10-19 18:10:15 +00:00
time 31db461c61 card #48: kept .github/time/test_time.py (generated)
time/worker-run cd .github/time; python3 - <<'E' p="test_time.py"; s=open(p).read() s=s.replace('self.milestones[m]
2026-10-19 18:08:55 +00:00
time ef704405b5 card #48: kept .github/time/test_time.py (generated)
time/worker-run cd .github/time; sed -i '2347s|got\["c"\]\["url"\].startswith("https://yolopreneur.lol")|got["c"]["u
2026-10-19 18:08:42 +00:00
time 1330baaf95 card #48: kept .github/time/test_time.py (generated)
time/worker-run cd .github/time; sed -i '2277s|kinds\["PAGES_ORIGIN"\]\["text"\] == "https://yolopreneur.lol"|kinds[
2026-10-19 18:08:22 +00:00
time e65cb6c809 card #48: kept .github/time/test_time.py (generated)
time/worker-run cd .github/time; sed -i 's/"TIME_VENTURE_BOARD": "qwen,kimi,grok"/"TIME_VENTURE_BOARD": "grok,kimi,q
2026-10-19 18:08:11 +00:00
time d003b1f262 card #48: kept .github/time/test_time.py (generated)
time/worker-run cd .github/time; sed -i 's/"TIME_VENTURE_PITCH": "grok,kimi,qwen", "TIME_VENTURE_BOARD": "grok,kimi,
2026-10-19 18:07:58 +00:00
time 58d1a5df30 card #48: kept .github/time/test_time.py (generated)
time/worker-run cd .github/time; python3 - <<'E' p="test_time.py"; s=open(p).read() s=s.replace('"TIME_VENTURE_FIXES
2026-10-19 17:12:45 +00:00
time d0e620e2ed card #48: kept .github/time/test_time.py (generated)
time/worker-run cd .github/time; python3 - <<'EOF' p="test_time.py"; s=open(p).read() a="real_think.http = flaky_htt
2026-10-19 17:12:21 +00:00
time 4986baff15 card #48: kept .github/time/test_time.py (generated)
time/worker-run cd .github/time; sed -i -e 's#, utype="User", assoc="NONE")#)#' -e 's#, utype="User", assoc="OWNER")
2026-10-19 17:12:11 +00:00
time 9889cbfdc8 card #48: kept .github/time/test_time.py (generated)
time/worker-run cd .github/time; sed -i 's#^ "TIME_VENTURE_CHAIR"# "TIME_VENTURE_FIXES": "2"
2026-10-19 17:11:59 +00:00
time a0cb23fb52 card #48: kept .github/time/test_time.py (generated)
time/worker-run cd .github/time; sed -i 's#"TIME_VENTURE_CHAIR": "kimi", "TIME_VENTURE_JUDGE": "kimi"#"TIME_VENTURE_
2026-10-19 17:11:48 +00:00
time c6ea3464af card #48: kept .github/time/test_time.py (generated)
time/worker-run cd .github/time; sed -i '/import traceback; traceback.print_exc()/d' venture.py sed -i -e 's#https:/
2026-10-19 17:11:20 +00:00
time d41bc5ba9c card #48: kept .github/time/test_time.py (generated)
time/worker-run cat > /tmp/p4.py <<'EOF' p = ".github/time/test_time.py" s = open(p).read() s = s.replace('print(W.t
2026-10-19 17:10:39 +00:00
time 1da32b140f card #48: kept .github/time/test_time.py (generated)
time/worker-run cat > /tmp/p3.py <<'EOF' p = ".github/time/test_time.py" s = open(p).read() a = ''' for k in ("TI
2026-10-19 17:10:08 +00:00
time 861ba3fcb8 card #48: kept .github/time/test_time.py (generated)
time/worker-run cat > /tmp/p2.py <<'EOF' p = ".github/time/test_time.py" s = open(p).read() a = "def vtick(env=None)
2026-10-19 17:09:54 +00:00
teahubxyzandClaude Opus 5.5 1a2ae6bc7e The cloud lane: cloud sessions build cards on the cloud-session credit (#197)
ci / test (push) Successful in 45s
sync / sync (push) Successful in 5s
The cloud lane: cloud sessions build cards on the cloud-session credit (#197)

Astra labels the best M cards `cloud` (up to 3 in the lane); the launcher on hb-5 starts a claude --cloud session per card on the GitHub copy; sync brings the branch home as a PR that closes the card and moves it cloud -> ready; the heartbeat adopts and the council lands it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017K4vyY3yUD3GsvoZaAtKkD
2026-10-19 16:46:15 +00:00
time 89070f46a4 Scaffold the Havre MCP server (walking skeleton) (#195)
time/worker-run cd havre && npm ci >/dev/null 2>&1; cd node_modules/@modelcontextprotocol/sdk && sed -n 20,60p dist/
ci / test (push) Successful in 42s
sync / sync (push) Successful in 5s
Co-authored-by: Time <time@users.noreply.teahub.xyz>
2026-10-19 16:14:10 +00:00
teahubxyzandClaude Opus 5.5 7e7d2d569d Budget: the monthly cap counts out-of-pocket money; credit is limited by its pool (#193)
ci / test (push) Successful in 37s
sync / sync (push) Successful in 5s
time/worker-run sed -n 845,885p .github/time/test_time.py; tail -5 .github/time/test_time.py
Budget: the monthly cap counts out-of-pocket money; credit is limited by its pool (#193)

credit_covered(): what an expiring pool's prepaid credit paid this month, within its balance and before it lapses, is left out of the month TIME_MONTHLY_USD caps.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017K4vyY3yUD3GsvoZaAtKkD
2026-10-19 16:03:08 +00:00
time 7156f0023c Time updates a PR branch that fell behind its base; a conflict goes to the worker as a revision (#190)
ci / test (push) Successful in 37s
sync / sync (push) Successful in 5s
Co-authored-by: Time <time@users.noreply.teahub.xyz>
2026-10-19 15:11:37 +00:00
teahubxyzandClaude Opus 5.5 bc1da90c33 Router: a card that waits is never picked; Astra gets TIME_WORKER (#185)
ci / test (push) Successful in 37s
sync / sync (push) Successful in 4s
Router: a card that waits is never picked; Astra gets TIME_WORKER (#185)

An open Depends on #N, or the seat's blocked note, keeps a card out of the picks and after the movable cards in the promotion order. astra.yml passes TIME_WORKER and TIME_PACE.

Closes #184.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017K4vyY3yUD3GsvoZaAtKkD
2026-10-19 13:55:03 +00:00
teahubxyzandClaude Opus 5.5 32943339e1 promote_next counts only moving cards: one waiting on a person holds no ready slot (#183)
sync / sync (push) Canceled after 0s
ci / test (push) Successful in 36s
promote_next counts only moving cards: one waiting on a person holds no ready slot (#183)

Closes #135.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017K4vyY3yUD3GsvoZaAtKkD
2026-10-19 13:47:55 +00:00
teahubxyzandClaude Opus 5.5 d235afb7f3 Housekeeping: a null page is an empty one (#182)
ci / test (push) Successful in 37s
sync / sync (push) Successful in 4s
Housekeeping: a null page is an empty one (#182)

Gitea answers an issue nobody reacted to with null; the signal step failed on it today.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017K4vyY3yUD3GsvoZaAtKkD
2026-10-19 13:47:24 +00:00
teahubxyzandClaude Opus 5.5 805e20d695 Router: money left is the worker pool's allowance; no repeat cards (#181)
ci / test (push) Successful in 37s
sync / sync (push) Successful in 4s
Router: money left is the worker pool's allowance; no repeat cards (#181)

money_left(): the allowance left in the pool that takes TIME_WORKER's route, else the daily cap's remainder, capped by the month's. The seat sees cards closed in the last 14 days; a new card repeating an open or lately closed one is not written.

Closes #175.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017K4vyY3yUD3GsvoZaAtKkD
2026-10-19 13:44:30 +00:00
teahubxyzandClaude Opus 5.5 745231844f sync: secret names Gitea accepts (SYNC_GITHUB_KEY, SYNC_GITHUB_TOKEN) (#179)
ci / test (push) Successful in 36s
sync / sync (push) Successful in 4s
sync: secret names Gitea accepts (SYNC_GITHUB_KEY, SYNC_GITHUB_TOKEN) (#179)

Gitea refuses secret names starting GITHUB_ or GITEA_, so the GitHub copy's deploy key is in SYNC_GITHUB_KEY.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017K4vyY3yUD3GsvoZaAtKkD
2026-10-19 04:03:20 +00:00
teahubxyzandClaude Opus 5.5 e34994bbc6 Sync: the GitHub copy over SSH with a deploy key (host keys pinned) (#178)
ci / test (push) Successful in 35s
sync / sync (push) Successful in 2s
Sync: the GitHub copy over SSH with a deploy key, host keys pinned (#178)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017K4vyY3yUD3GsvoZaAtKkD
2026-10-19 03:33:59 +00:00
teahubxyzandClaude Opus 5.5 ab3c5f5200 Sync: a repo's copies on other forges follow its home (GitHub first, for cloud sessions) (#177)
ci / test (push) Successful in 36s
sync / sync (push) Successful in 3s
Sync: a repo's copies on other forges follow its home (#177)

sync.py + time/sync.json + the sync workflow. One home per repo, one writer per branch: main goes out to every copy
fast-forward only (a diverged copy is a needs-human issue, never overwritten, unless forced once); a copy's claude/*
branches come home as PRs for the council. First copy: github.com/teahubxyz/time, skipped until GITHUB_MIRROR_TOKEN.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017K4vyY3yUD3GsvoZaAtKkD
2026-10-19 03:18:50 +00:00
teahubxyzandClaude Opus 5.5 ec043b2985 Adaptive budget: pace spend to each capacity pool (re-cut of #167 onto main) (#174)
ci / test (push) Successful in 36s
Adaptive budget: pace spend to each capacity pool (#174, re-cut of #167)

The worker's #82 change (sonnet via Time): budget_check(route) paces each call to its capacity pool in
time/pools.json (expiring credit spread over the days left, refilling windows, or TIME_DAILY_USD without a pool);
the monthly cap stays hard. pools.json is read through the API once per run, since every workflow checks out only
.github/time. Ships empty: nothing changes until it is filled in. Closes #82.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017K4vyY3yUD3GsvoZaAtKkD
2026-10-19 01:10:09 +00:00
teahubxyzandClaude Opus 5.5 b8d52252f4 Router v1: the factory ranks its own next work (dry to start) (#169)
ci / test (push) Successful in 34s
Router v1: the factory ranks its own next work, dry to start (#169)

Astra's seat judges every candidate (kind, value, size); router.py ranks them with the owner's weights per kind
(time/router.json), a restless boost and card age. dry posts the table; live queues from the top within the day's
money and the heartbeat promotes queued cards in ranked order. Astra reads the last 14 days of its log. Closes #168.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017K4vyY3yUD3GsvoZaAtKkD
2026-10-19 01:00:17 +00:00
teahubxyz 3d1865ecb9 Signups count by the venture's name, not only its slug (#159)
ci / test (push) Successful in 35s
Co-authored-by: teahubxyz <boring+teahub@agentmail.to>
2026-10-19 00:10:37 +00:00
teahubxyzandClaude Opus 5.5 97e3e1f35f venture: the lead (opus) researches and picks the day's venture alone; fable is out (#164)
ci / test (push) Successful in 35s
venture: the lead (opus) researches and picks the day's venture alone; fable is out (#164)

One seat, TIME_VENTURE_LEAD (opus), runs the day's venture: a research round over the top trending repos (with the
start of their READMEs) and the studio's track record, TIME_VENTURE_FIELD candidates with a verdict each, one pick;
no pitches, no vote. It writes the launch plan alone and judges the build, and hands the launch drafts to its helper
(TIME_VENTURE_HELPER, sonnet). The chair and judge default to opus. Batches keep the board; TIME_VENTURE_LEAD=board
brings it back for the daily venture. Closes #165.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017K4vyY3yUD3GsvoZaAtKkD
2026-10-18 22:11:50 +00:00
teahubxyzandClaude Opus 5.5 c268e75234 venture: one venture a day, built for quality (#162)
ci / test (push) Successful in 34s
venture: one venture a day, built for quality (#162)

The day's card starts only once every other venture card is launched or held; the board picks one from a field of
TIME_VENTURE_FIELD (6) pitches; opus builds; the judge scores the product 1-10 and a page under TIME_VENTURE_BAR (8)
gets polish rounds (never the last of TIME_VENTURE_FIXES=3), then launches with its score. An open batch card with
no Time beats no longer starts a batch while batches are off. Closes #163.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017K4vyY3yUD3GsvoZaAtKkD
2026-10-18 22:04:49 +00:00
teahubxyzandClaude Opus 5.5 e6f04f614a venture.yml: install Chromium for the browser pass (#157)
ci / test (push) Successful in 35s
venture.yml: install Chromium for the browser pass (#157)

The first Claude ventures launched without the browser pass (no Chrome on the runner): no headless checks, no
contact sheet for the portfolio. One step installs Chromium in the job image; venture.py's chrome() finds it.
Merged on the owner's word, CI green (run 1014).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017K4vyY3yUD3GsvoZaAtKkD
2026-10-18 19:46:19 +00:00
teahubxyz f329066a51 Worker: a cut-off tool call is an error the worker reads, not a crash (#155)
ci / test (push) Successful in 35s
Co-authored-by: teahubxyz <boring+teahub@agentmail.to>
2026-10-18 17:52:36 +00:00
teahubxyzandClaude Opus 5.5 8fe83ac05a venture.yml: every 6 hours, Claude seats (#141)
ci / test (push) Successful in 35s
venture.yml: every 6 hours, Claude seats (#141)

Owner's call: the venture loop runs every 6 hours instead of every 20 minutes, on the Claude seats.
The builder is vars.TIME_VENTURE_WORKER || claude:sonnet, decoupled from the heartbeat's worker.
Merged on the owner's word after the council approved the engine half (#140).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017K4vyY3yUD3GsvoZaAtKkD
2026-10-18 17:25:59 +00:00
teahubxyz ebedc7a5bc Venture loop on Teahub with Claude seats (#140)
ci / test (push) Successful in 35s
Co-authored-by: teahubxyz <boring+teahub@agentmail.to>
2026-10-18 17:24:35 +00:00
teahubxyz 8ab719e2f2 Ponytail on prod: seat workers carry its rules (#145)
ci / test (push) Successful in 36s
Co-authored-by: teahubxyz <boring+teahub@agentmail.to>
2026-10-18 17:24:33 +00:00
teahubxyz 385b1a48d0 A label filter is checked on every row: housekeeping listed all 59 open issues as parked (#138)
ci / test (push) Successful in 35s
Co-authored-by: teahubxyz <boring+teahub@agentmail.to>
2026-10-18 16:22:20 +00:00
teahubxyzandClaude Opus 5.5 0543771a02 Workflows batch: heartbeat knobs, housekeeping.yml, its test in CI (#127)
ci / test (push) Successful in 35s
Workflows batch: heartbeat knobs, housekeeping.yml, its test in CI (#127)

heartbeat.yml passes TIME_CAP_SLACK, TIME_ANTHROPIC_API (the caching kill switch), TIME_REVIEW_TIEBREAK and TIME_REVIEW_QUORUM; housekeeping.yml runs the daily sweep at 13:17 UTC; ci.yml runs test_housekeeping.py. Owner-approved merge.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017K4vyY3yUD3GsvoZaAtKkD
2026-10-18 16:10:58 +00:00
time 4c91878f93 Time retries its own parked cards (error / stuck) (#132)
time/worker-run cd .github/time; sed -n 1120,1190p time.py; grep -n "andon" venture.py | head; grep -n "TIME_MODE" t
ci / test (push) Successful in 35s
Co-authored-by: Time <time@users.noreply.teahub.xyz>
2026-10-18 07:17:32 +00:00
teahubxyzandClaude Fable 5.1 bed8743c94 checks(): a status from one of Time's own workflows is not a check (#124)
ci / test (push) Successful in 35s
checks(): a status from one of Time's own workflows is not a check (#124)

A seat's review wakes heartbeat.yml during a heartbeat; the concurrency group cancels the run and Gitea records it as a failure on the PR head. Those statuses neither block nor earn a merge; CI decides. Owner-approved merge.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017K4vyY3yUD3GsvoZaAtKkD
2026-10-18 05:08:14 +00:00
time b61b185201 Council verdict: TIME_REVIEW takes several seats, votes count per seat, TIME_REVIEW_TIEBREAK on a tie (#122)
ci / test (push) Successful in 34s
Co-authored-by: Time <time@users.noreply.teahub.xyz>
2026-10-18 04:59:25 +00:00
teahubxyz 86b1207c4d Worker: build where the card says (Base: <branch>), finish what it starts (the cap gates launches), oldest card first (#121)
ci / test (push) Successful in 34s
Co-authored-by: teahubxyz <boring+teahub@agentmail.to>
2026-10-18 04:59:23 +00:00
teahubxyz bcdc71383e Claude calls go to Anthropic's own Messages API with prompt caching; the ledger prices cached tokens (#120)
ci / test (push) Successful in 34s
Co-authored-by: teahubxyz <boring+teahub@agentmail.to>
2026-10-18 04:59:20 +00:00
time 7a471e39ca Cards adopt an open PR that already closes them (review and land it instead of dispatching a worker) (#110)
time/worker-run cat > /tmp/edit.py <<'PYEOF' import re, json p = ".github/time/time.py" s = open(p).read() def sub(
ci / test (push) Successful in 35s
Co-authored-by: Time <time@users.noreply.teahub.xyz>
2026-10-18 04:39:49 +00:00
time 1747f07521 Seats review as themselves: TIME_SEAT_<SEAT> token makes the verdict a real Gitea review (#116)
ci / test (push) Successful in 35s
Co-authored-by: Time <time@users.noreply.teahub.xyz>
2026-10-18 04:27:14 +00:00
time f4058061e0 Daily housekeeping: prune merged branches, close spent signals and empty milestones, list the stale (#115)
ci / test (push) Successful in 34s
Co-authored-by: Time <time@users.noreply.teahub.xyz>
2026-10-18 04:27:12 +00:00
teahubxyzandClaude Fable 5.1 4f8eda2483 labs/aicharts: fast mode (Clef first, LLM checks) as demo default (#42)
ci / test (push) Successful in 34s
time/worker-run curl -sS -m 15 https://docs.whop.com/.well-known/skills/index.json | head -c 1500; echo; curl -sS -m
labs/aicharts: fast mode (Clef first, LLM checks) as demo default (#42)

Opened 2026-10-14 by a Claude Code session under the owner's login, which is why it read as the operator's PR for three days. Lab-only and reversible: Clef-flash draws first, the LLM checks in parallel, the chart is redrawn only on disagreement; API callers keep the LLM default. The lab's tests pass on the branch (run 652, "aicharts: all good"); its deploy step cannot run from prod, which holds no Cloudflare secrets, so nothing is deployed by this merge.

Squash-merged by the CEO session on the owner's explicit instruction.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017K4vyY3yUD3GsvoZaAtKkD
2026-10-18 00:12:54 +00:00
teahubxyzandClaude Fable 5.1 b539fff1b2 heartbeat: per-seat tokens for haiku, sonnet, opus and fable
ci / test (push) Successful in 35s
One Gitea user per seat (model line); the reviewer's verdict becomes a real review by that seat's own user once #76 lands. TIME_SEAT_CLAUDE stays until then as the umbrella.

On the owner's explicit instruction (CEO session).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017K4vyY3yUD3GsvoZaAtKkD
2026-10-17 22:54:56 +00:00
teahubxyzandClaude Fable 5.1 5c8254cc50 TIME_PROTECTED governs every protected path except the workflow directories (#81)
ci / test (push) Successful in 34s
TIME_PROTECTED governs every protected path except the workflow directories (#81)

touches_protected() hard-coded all of .github/ and .gitea/ on top of TIME_PROTECTED, so the engine under .github/time/ could never land without a human. Only the workflow directories stay hard-coded; DEFAULT_PROTECTED is unchanged. With this repo's TIME_PROTECTED narrowed, card PRs under .github/time/ with a trusted Approve and green checks merge via the time bot.

CI green on 3b757fa. Squash-merged by the CEO session on the owner's explicit instruction.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017K4vyY3yUD3GsvoZaAtKkD
2026-10-17 20:20:12 +00:00
teahubxyzandClaude Fable 5.1 b53016007a heartbeat: 55-minute job, and the claude seat's token for reviews
ci / test (push) Successful in 34s
The job timeout moves from 20 to 55 minutes: workers can overlap inside one run (#75), and at 20 every in-flight worker died together. TIME_SEAT_CLAUDE reaches the heartbeat so the reviewer can post as the `claude` user once #76 lands; until then it is unused.

Both on the owner's explicit instruction (CEO session).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017K4vyY3yUD3GsvoZaAtKkD
2026-10-17 20:16:32 +00:00