With TIME_ASTRA_PITCH set, every planning seat proposes a slate of cards; the slates merge into one field (the same issue or title from two seats is one card with both proposers), the board seats (TIME_ASTRA_BOARD, default the pitching seats) rank the field with the venture board's own tally and `top` (Borda 3/2/1, quorum of two), and only the top picks are queued or created, under the single planner's guards and caps. A card one seat alone wants is never opened. Unset, Astra is unchanged. The Astra log carries the slates, the score/backer table and each seat's reason. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LaVWDr6h62YJk9LJqvQH7k
39 lines
1.9 KiB
YAML
39 lines
1.9 KiB
YAML
name: astra
|
|
# The slow loop: once a day, one planning call (TIME_ASTRA_SEAT, default `opus`) reads the board and the ledger and
|
|
# labels a few cards `queued` for the heartbeat to promote. It writes its reasoning to the "Astra log" issue; reply there to steer it.
|
|
# With TIME_ASTRA_PITCH (and TIME_ASTRA_BOARD) set, several seats propose slates and a board ranks them, the venture
|
|
# ceremony turned inward: only cards two seats want get queued.
|
|
# Guardrails are code: TIME_ASTRA_MAX_READY (2) / TIME_ASTRA_MAX_NEW (2) per day, nothing while an `andon` is open,
|
|
# and the same spend caps as every other call. Off until TIME_ASTRA=on.
|
|
on:
|
|
schedule:
|
|
- cron: "13 13 * * *"
|
|
workflow_dispatch:
|
|
concurrency:
|
|
group: astra
|
|
cancel-in-progress: false
|
|
jobs:
|
|
plan:
|
|
if: vars.TIME_ASTRA == 'on'
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 10
|
|
steps:
|
|
- uses: actions/checkout@v5
|
|
with:
|
|
sparse-checkout: .github/time
|
|
persist-credentials: false
|
|
- run: python3 .github/time/astra.py tick
|
|
env:
|
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
|
|
TIME_TOKEN: ${{ secrets.TIME_TOKEN }} # repo secret: Astra's issues and labels go out as the `time` bot
|
|
VENICE_API_KEY: ${{ secrets.VENICE_API_KEY }}
|
|
TIME_ASTRA_SEAT: ${{ vars.TIME_ASTRA_SEAT }}
|
|
TIME_ASTRA_PITCH: ${{ vars.TIME_ASTRA_PITCH }} # the board: seats that each propose a slate (unset: one planner)
|
|
TIME_ASTRA_BOARD: ${{ vars.TIME_ASTRA_BOARD }} # the board: seats that rank the field (default: the pitching seats)
|
|
TIME_ASTRA_MAX_READY: ${{ vars.TIME_ASTRA_MAX_READY }}
|
|
TIME_ASTRA_MAX_NEW: ${{ vars.TIME_ASTRA_MAX_NEW }}
|
|
TIME_SPINE: ${{ vars.TIME_SPINE }}
|
|
TIME_DAILY_USD: ${{ vars.TIME_DAILY_USD }}
|
|
TIME_MONTHLY_USD: ${{ vars.TIME_MONTHLY_USD }}
|