diff --git a/.github/workflows/venture-loop.yml b/.github/workflows/venture-loop.yml new file mode 100644 index 0000000..2d29add --- /dev/null +++ b/.github/workflows/venture-loop.yml @@ -0,0 +1,83 @@ +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 +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 }} +jobs: + loop: + runs-on: ubuntu-latest + timeout-minutes: 60 + 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