Router v1: Astra ranks every candidate with the owner's weights; the heartbeat promotes in that order (dry to start) #168

Closed
opened 2026-10-19 00:58:21 +00:00 by teahubxyz · 0 comments
Owner

Part of #72 (and #68). The owner, 2026-10-18: pause the venture loop and get back to the factory picking what it works on, whether that's a venture, new functionality, refinement or optimization. Balanced and tunable.

Changes:

  • router.py (new, pure):
    • The candidates: each open card with a DONE: line that isn't a parent, a human's or the venture loop's own, plus "start a new venture".
    • Kinds: venture / feature / refinement / optimization, with a fallback guess when the seat gives none.
    • The score: weight[kind] × restless(kind) × age × (value + 0.5 × waiting) / size.
    • An L is never queued (split it first). pick takes cards within the day's money left. Plus order and the table.
  • time/router.json (new): the owner's dials (mode, weights, restless, cost_usd). It starts with mode: dry.
  • astra.py, router path:
    • The seat judges every candidate (kind, value, size, why) and code ranks them. The log shows the ranked table.
    • dry touches nothing.
    • live queues from the top and writes the seat's new cards unqueued.
    • Astra now reads the last 14 days of its log; before, it read the thread's first twenty comments forever.
  • time.py: promote_next promotes queued cards in the latest live ranking's order, then oldest first.
  • Tests: test 80.

PR: #169

DONE: PR merged with test_time.py green in CI; the next Astra run posts a dry ranking on the Astra log.

Part of #72 (and #68). The owner, 2026-10-18: pause the venture loop and get back to the factory picking what it works on, whether that's a venture, new functionality, refinement or optimization. Balanced and tunable. Changes: - **`router.py` (new, pure):** - The candidates: each open card with a `DONE:` line that isn't a parent, a human's or the venture loop's own, plus "start a new venture". - Kinds: venture / feature / refinement / optimization, with a fallback guess when the seat gives none. - The score: `weight[kind] × restless(kind) × age × (value + 0.5 × waiting) / size`. - An L is never queued (split it first). `pick` takes cards within the day's money left. Plus `order` and the table. - **`time/router.json` (new):** the owner's dials (mode, weights, restless, cost_usd). It starts with `mode: dry`. - **`astra.py`, router path:** - The seat judges every candidate (kind, value, size, why) and code ranks them. The log shows the ranked table. - `dry` touches nothing. - `live` queues from the top and writes the seat's new cards unqueued. - Astra now reads the last 14 days of its log; before, it read the thread's first twenty comments forever. - **`time.py`:** `promote_next` promotes queued cards in the latest live ranking's order, then oldest first. - **Tests:** test 80. PR: #169 DONE: PR merged with test_time.py green in CI; the next Astra run posts a dry ranking on the Astra log.
teahubxyz added the ready label 2026-10-19 00:58:21 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: teahubxyz/time#168