name: venture loop # The venture loop, stage by stage: the same card and beats as venture.yml's tick, walked as one step per stage so the # whole loop is a workflow Havre's /open (https://havre.yolopreneur.lol/open/, Workflows → Import) shows as a chain of # nodes. Each step runs `venture.py stage `: it advances the card once if it stands at , else does # nothing, so one run carries a new card from scout to launch, and a re-run picks up wherever the card stands. # Off until TIME_VENTURE=on, like venture.yml; the two share every secret and variable. on: workflow_dispatch: inputs: card: description: "The venture card to advance (an issue number), or `new` to open today's card first" type: string default: new permissions: contents: write issues: write pages: write statuses: write concurrency: group: venture cancel-in-progress: false jobs: loop: runs-on: ubuntu-latest timeout-minutes: 60 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} VENICE_API_KEY: ${{ secrets.VENICE_API_KEY }} ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} TIME_TOKEN: ${{ secrets.TIME_TOKEN }} TIME_RUN_IMAGE: node:22-bookworm CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} TIME_DAILY_USD: ${{ vars.TIME_DAILY_USD }} TIME_MONTHLY_USD: ${{ vars.TIME_MONTHLY_USD }} TIME_VENTURE_DOMAIN: ${{ vars.TIME_VENTURE_DOMAIN }} TIME_VENTURE_AI_MODEL: ${{ vars.TIME_VENTURE_AI_MODEL }} TIME_VENTURE: ${{ vars.TIME_VENTURE }} TIME_VENTURE_PITCH: ${{ vars.TIME_VENTURE_PITCH }} TIME_VENTURE_BOARD: ${{ vars.TIME_VENTURE_BOARD }} TIME_VENTURE_CHAIR: ${{ vars.TIME_VENTURE_CHAIR }} TIME_VENTURE_JUDGE: ${{ vars.TIME_VENTURE_JUDGE }} TIME_VENTURE_ESCALATE: ${{ vars.TIME_VENTURE_ESCALATE }} TIME_VENTURE_PAGES_DOMAIN: ${{ vars.TIME_VENTURE_PAGES_DOMAIN }} TIME_TRUSTED: ${{ vars.TIME_TRUSTED }} TIME_CAP_SLACK: ${{ vars.TIME_CAP_SLACK }} TIME_ANTHROPIC_API: ${{ vars.TIME_ANTHROPIC_API }} TIME_VENTURE_MEASURE_DAYS: ${{ vars.TIME_VENTURE_MEASURE_DAYS }} TIME_WORKER: ${{ vars.TIME_VENTURE_WORKER || 'claude:sonnet' }} TIME_WORKER_STEPS: ${{ vars.TIME_WORKER_STEPS }} TIME_WORKER_MAX_TOKENS: ${{ vars.TIME_WORKER_MAX_TOKENS }} steps: - uses: actions/checkout@v5 with: sparse-checkout: .github/time persist-credentials: false - name: chromium, for the checks run: command -v chromium || (apt-get update -qq && apt-get install -y -qq --no-install-recommends chromium >/dev/null) - name: the card run: | card="${{ inputs.card }}" if [ "$card" = new ] || [ -z "$card" ]; then card=$(python3 .github/time/venture.py stage new | tail -1); fi echo "card=$card" >> "$GITHUB_ENV" && echo "venture card #$card" - name: scout (trending repos) run: python3 .github/time/venture.py stage "$card" new - name: research and pick (the lead), or pitches (the board) run: python3 .github/time/venture.py stage "$card" scouted - name: board vote (a batch, or no lead) run: python3 .github/time/venture.py stage "$card" pitched - name: plan (launch plan, signal issue, LAUNCH.md) run: python3 .github/time/venture.py stage "$card" picked - name: build (the worker, on the Pages branch) run: python3 .github/time/venture.py stage "$card" planned - name: check, fix or polish, judge; launch when it passes run: | for round in 1 2 3 4 5; do python3 .github/time/venture.py stage "$card" built | tee /tmp/round.txt grep -q "built -> built" /tmp/round.txt || break done - name: launch a venture held for its batch run: python3 .github/time/venture.py stage "$card" ready - name: measure (7 days on: signups against the plan's lines) run: python3 .github/time/venture.py stage "$card" launched