Commit Graph
120 Commits
Author SHA1 Message Date
teahubxyzandClaude Opus 5.5 68d0df6232 ship: build a venture from its own repo on Teahub and land it like seed
ci / test (pull_request) Successful in 35s
seed lands a bundle built somewhere else, which meant building Havre on the Mac and carrying the bundle over.
ship.yml clones the venture's source repo (private is fine: the time bot's token clones it, for that step only),
runs its tools/build.sh on the runner (installing Chromium for the screenshots when the runner has no Chrome), and
ship.py lands the bundle the build left with seed's own checks and commit. Nothing is built or carried outside the
factory. test_ship.py runs in ci.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012sekpYMwTXuMdza1isMQA1
2026-10-16 03:47:20 +00:00
time aaeb9417ca ledger: 40 calls, $2.27 2026-10-16 00:11:40 +00:00
teahubxyzandClaude Opus 5.5 721212ba7e seed: land a venture built elsewhere on yolopreneur.lol (#64)
ci / test (push) Successful in 35s
time/worker-run git fetch origin gh-pages 2>&1|tail -1; git show FETCH_HEAD:ventures/dollhouse/app.js | sed -n 140,3
seed: land a venture built elsewhere on yolopreneur.lol (#64)

Actions -> seed -> Run workflow with a slug, the URL(s) of a .tgz whose top folder is the slug, and its sha256
(plus a name and a one-liner for a new venture). seed.py checks the bundle, copies it over ventures/<slug>/ on
gh-pages in one commit, adds or refreshes the venture's line in ventures/ventures.json, and the workflow asks
Teahub pages to pull. Nothing in the bundle runs. test_seed.py runs in CI. Merged at the owner's request.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K9wtGiGEeq1H5DA3T88PRe
2026-10-15 23:56:46 +00:00
time 08bba21dfa ledger: 69 calls, $4.96 2026-10-15 21:25:52 +00:00
time 7d76ab4338 ledger: 1 calls, $0.11
time/worker-run grep -n "^# Create app\|^# Create App\|^# Update App\|^# Update app" /tmp/full.txt; sed -n 22107,221
2026-10-15 13:13:32 +00:00
time b02e73c0e6 ledger: 1 calls, $0.00 2026-10-14 22:08:12 +00:00
time d30be0208d ledger: 20 calls, $2.26 2026-10-14 21:46:53 +00:00
time 1da01fcd68 Review: show the reviewer the PR check statuses (#56)
ci / test (push) Successful in 35s
time/worker-run cat > /tmp/patch.py <<'PYEOF' p = ".github/time/time.py" s = open(p).read() def sub(old, new): g
venture / tick (push) Successful in 3s
Closes #52

Merged by the steward (Claude, for the operator). Review answered on the PR.

Co-authored-by: Time <time@users.noreply.teahub.xyz>
Co-committed-by: Time <time@users.noreply.teahub.xyz>
2026-10-14 21:39:13 +00:00
time 0caaad4a1a ledger: 1 calls, $0.00 2026-10-14 21:23:12 +00:00
time 495494b0e7 ledger: 1 calls, $0.05 2026-10-14 21:22:16 +00:00
time 56b74116e7 ledger: 10 calls, $0.22 2026-10-14 21:18:52 +00:00
teahubxyzandClaude Opus 5.5 97b7667970 astra: queue picks instead of labelling them ready, so they run one at a time behind the existing queue
ci / test (push) Successful in 35s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017fTCFiw6ohysUDcWoPsTys
2026-10-14 21:18:36 +00:00
time 195c65cb55 Tests: test_time.py clears the job TIME_* environment before importing time.py (#54)
ci / test (push) Successful in 35s
time/worker-run cd .github/time; python3 - <<'EOF' s=open('time.py').read() s=s.replace('''def review(card: dict, pr
Closes #51

Merged by Claude for the operator (the delegated merger for engine PRs). Reviewer objection answered on the PR: CI was green; the reviewer cannot see checks yet (#52).

Co-authored-by: Time <time@users.noreply.teahub.xyz>
Co-committed-by: Time <time@users.noreply.teahub.xyz>
2026-10-14 21:15:49 +00:00
time f19429bccb ledger: 1 calls, $0.00 2026-10-14 21:08:05 +00:00
time 7e9ae24beb ledger: 4 calls, $0.20 2026-10-14 21:03:54 +00:00
teahubxyzandClaude Opus 5.5 c2055e85eb time: every write but comments and statuses goes out as the time bot
ci / test (push) Successful in 34s
time/worker-run python3 - <<'EOF' p=".github/time/test_time.py" s=open(p).read() old='import concurrent.futures as c
Gitea 1.24 also refuses the Actions identity label edits (removing a label is a 500), which crashed
promote_next and stalled the queue. gh() now uses TIME_TOKEN for every write except comments (Time's
beats are gitea-actions' comments) and commit statuses; the time user never counts as trusted and
mention replies ignore it; astra.yml gets TIME_TOKEN.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017fTCFiw6ohysUDcWoPsTys
2026-10-14 14:02:51 -07:00
teahubxyz b13ddff34f Merge pull request 'Ledger README: explain time/ledger/<YYYY-MM>.jsonl' (#50) from time/card-49 into main
venture / tick (push) Successful in 3s
Reviewed-on: #50
2026-10-14 20:53:04 +00:00
teahubxyzandClaude Opus 5.5 f718a14295 ledger README: the cap is checked before every model call; say exactly who opens the andon
ci / test (pull_request) Successful in 35s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017fTCFiw6ohysUDcWoPsTys
2026-10-14 20:30:18 +00:00
time e46ec071c1 ledger: 1 calls, $0.00 2026-10-14 20:26:12 +00:00
time 10d0466ad9 ledger: 10 calls, $0.13 2026-10-14 20:24:31 +00:00
teahubxyzandClaude Opus 5.5 f3a841a762 heartbeat: put each secret's comment back on its own line
ci / test (push) Successful in 36s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017fTCFiw6ohysUDcWoPsTys
2026-10-14 20:22:05 +00:00
teahubxyz bbc62970cb time: PRs open and merge as the time bot (TIME_TOKEN); Gitea denies both to the Actions identity
ci / test (push) Successful in 35s
venture / tick (push) Successful in 3s
2026-10-14 13:11:41 -07:00
time 8a14773aa0 ledger: 7 calls, $0.10 2026-10-14 19:55:41 +00:00
time 223a4a0617 Add ledger README
time/worker-run env | grep -E '^TIME_(WORKER|MODE|PLANNER|REVIEW)=' ; env -u TIME_WORKER -u TIME_MODE -u TIME_PLANNE
ci / test (pull_request) Successful in 35s
2026-10-14 19:55:31 +00:00
teahubxyz e12728c5ff hands: list_files resolves the branch to a sha (trees route rejects refs with a slash)
ci / test (push) Successful in 34s
2026-10-14 12:54:22 -07:00
time a694c10428 ledger: 1 calls, $0.00 2026-10-14 19:52:35 +00:00
teahubxyz 0eb9234a7e time: every write is a git push (Gitea refuses the Actions token's API writes); ledger appends; one commit per kept batch
ci / test (push) Successful in 35s
time/worker-run sed -n 262,335p .github/time/time.py
2026-10-14 12:51:52 -07:00
teahubxyz 444b01abca astra: daily planning workflow (off until TIME_ASTRA=on)
ci / test (push) Successful in 36s
2026-10-14 19:49:42 +00:00
teahubxyz 4086657dc8 astra: the daily planner (one call a day; queues cards, never spends beyond its call; guardrails in code)
ci / test (push) Has been cancelled
2026-10-14 19:49:35 +00:00
teahubxyz aecc4ee90d ci: don't retest on ledger commits
ci / test (push) Successful in 34s
2026-10-14 19:46:44 +00:00
teahubxyz c92313b62d doctor: the Cursor key is optional when a seat is the worker
ci / test (push) Successful in 34s
venture / tick (push) Successful in 2s
2026-10-14 12:38:27 -07:00
teahubxyz dc2a3e8a05 doctor: ANTHROPIC_API_KEY + spend caps
ci / test (push) Successful in 35s
2026-10-14 19:34:32 +00:00
teahubxyz a871722024 tests: provider routing, ledger booking, Budget, capped beat + andon, claude:sonnet worker
ci / test (push) Has been cancelled
2026-10-14 12:34:10 -07:00
teahubxyz 6bf0b0411b README: Claude seats and the spend governor
ci / test (push) Successful in 36s
2026-10-14 19:32:32 +00:00
teahubxyz 7c2b6a00a3 venture: ANTHROPIC_API_KEY + spend caps
ci / test (push) Has been cancelled
2026-10-14 19:32:11 +00:00
teahubxyz d05679b11a heartbeat: ANTHROPIC_API_KEY, TIME_DAILY_USD, TIME_MONTHLY_USD
ci / test (push) Has been cancelled
2026-10-14 19:31:54 +00:00
teahubxyz ee0302f763 mention: ANTHROPIC_API_KEY + spend caps
ci / test (push) Has been cancelled
2026-10-14 19:31:41 +00:00
teahubxyz 387fe44e15 time: Claude seats via the Claude API's OpenAI-compatible layer; spend ledger + dollar caps (governor)
ci / test (push) Successful in 37s
2026-10-14 19:25:42 +00:00
teahubxyz 9ffbb793bf seats: Claude seats (haiku, sonnet, opus, fable) with provider and prices
ci / test (push) Successful in 35s
2026-10-14 19:23:25 +00:00
teahubxyz bd6fcd7ed7 time: trust = repo owner, TIME_TRUSTED, or collaborator (the Actions token can't read permissions)
ci / test (push) Successful in 34s
heartbeat / tick (push) Successful in 3s
venture / tick (push) Successful in 3s
2026-10-13 23:58:48 -07:00
teahubxyz 8c874e8115 time: log why a permission lookup failed
ci / test (push) Successful in 34s
2026-10-13 23:57:12 -07:00
teahubxyz c360639456 Port: Time runs on Gitea (teahub.xyz) (#47)
ci / test (push) Successful in 35s
2026-10-14 06:55:19 +00:00
teahubxyzandclaude 8c6ad054b9 security: a real CI check before auto-merge; .github/ always protected (#46)
- checks(): the worker's own time/worker-run status can block or delay a merge but never counts as green
- dispatch_ci(): with no other check on the head, Time runs TIME_CI_WORKFLOW (ci.yml, workflow_dispatch) on the PR branch and waits; beat ci-dispatched, once
- ci.yml accepts workflow_dispatch
- touches_protected(): .github/ is always protected, whatever TIME_PROTECTED says
- labs-aicharts.yml: deploy URL via env, not ${{ }} in the script
- tests: worker-status-only no longer merges; dispatch once; real context merges


Claude-Session: https://claude.ai/code/session_01CYHXFvWMCs1GUmRmpySqQ6

Co-authored-by: claude <noreply@anthropic.com>
2026-10-13 21:33:35 -07:00
teahubxyzandclaude 17e51a6b08 security: harden Time for a public repo (#45)
- beats_of/verdict/retry: trust only github-actions[bot] and owner/member/collaborator authors (forged state and stranger retries on a public repo)
- touches_protected: paginate pull files and include previous_filename
- browser_check: drop .git after clone, serve only the venture folder, Chrome with no network but localhost
- Hands.run: execute in a docker container when a daemon exists (TIME_RUN_IMAGE), host shell fallback
- tests: logins on fake comments, stranger retry/forged beat cases, paginated files fake


Claude-Session: https://claude.ai/code/session_01CYHXFvWMCs1GUmRmpySqQ6

Co-authored-by: claude <noreply@anthropic.com>
2026-10-13 21:24:42 -07:00
teahubxyzandClaude e52e116815 labs/aicharts: show decision confidences, per-request floor, bench user agent (#41)
Live: Clef answered both probes right in ~0.5 s but at 0.21-0.25 confidence, so
the 0.5 floor sent them to the LLM. Expose every confidence and the weakest
question; a request may set its own floor (only changes cost); bench.py takes
clef@0 for calibration and sends a user agent Cloudflare accepts.


Claude-Session: https://claude.ai/code/session_01VDkN7ukK1kXkqov8FaZxva

Co-authored-by: Claude <noreply@anthropic.com>
2026-10-13 15:31:05 +00:00
teahubxyzandClaude 2d0f997030 labs/aicharts: Jev / Clef decision brains (choice answers -> spec), LLM as the door (#40)
decide.js asks ~10 choice questions in one call (mark, x, measure, agg, series,
order, top, one filter per text column) and assembles the spec; the validator
still checks it. Weakest needed answer < FLOOR, a failed check or a model error
hands the question to the LLM path, and the response says why. Page: brain
picker, latency/confidence line, 'or as <mark>' from the mark probabilities.
bench.py scores brains on 12 fixed questions.


Claude-Session: https://claude.ai/code/session_01VDkN7ukK1kXkqov8FaZxva

Co-authored-by: Claude <noreply@anthropic.com>
2026-10-13 15:25:17 +00:00
teahubxyzandClaude 3086cb52ff labs/aicharts: fast non-thinking model for specs (#39)
Live: gemma-4 took 70s+ and returned empty content on harder prompts (budget spent
thinking). Llama 3.3 70B fp8-fast answers the spec directly; still overridable.


Claude-Session: https://claude.ai/code/session_01VDkN7ukK1kXkqov8FaZxva

Co-authored-by: Claude <noreply@anthropic.com>
2026-10-13 14:01:33 +00:00
teahubxyzandClaude 9e065e416d labs/aicharts: plain prompt first, JSON mode only as fallback (#38)
Live, the json_schema decoder filled every step with the same key soup (order, step)
and dropped agg/by. The prompt's grammar + example steers better.


Claude-Session: https://claude.ai/code/session_01VDkN7ukK1kXkqov8FaZxva

Co-authored-by: Claude <noreply@anthropic.com>
2026-10-13 13:53:14 +00:00
teahubxyzandClaude 165d499644 labs/aicharts: fix model spelling drift, show the model's answer on failure (#37)
First live run: Workers AI answered specs the validator refused (agg spelling).
normalizeSpec fixes case and common aliases only; on a 422 the response
carries model_said (shown, never run). Smoke now fails on a bad spec.


Claude-Session: https://claude.ai/code/session_01VDkN7ukK1kXkqov8FaZxva

Co-authored-by: Claude <noreply@anthropic.com>
2026-10-13 13:47:49 +00:00
teahubxyzandClaude 8eff78170b labs/aicharts: live at aicharts.<venture domain>, like ventures (#36)
The account has no workers.dev subdomain; use TIME_VENTURE_DOMAIN when set.
Deploy step fails on its own error (pipefail); smoke waits up to 3 min for the cert.


Claude-Session: https://claude.ai/code/session_01VDkN7ukK1kXkqov8FaZxva

Co-authored-by: Claude <noreply@anthropic.com>
2026-10-13 13:42:56 +00:00