fix(profile): read the Forgejo token from the runner env, not a missing secret #3

Merged
Phil merged 1 commit from fix/forgejo-token into main 2026-09-15 07:02:26 +00:00
Owner

Was kaputt war

profile-cards.yml setzte FORGEJO_TOKEN: ${{ secrets.PROFILE_TOKEN }}. Dieses Actions-Secret existiert in diesem Repository nicht. Ein undefiniertes Secret rendert als leerer String — der env:-Block hat damit einen eventuell vorhandenen Runner-Wert überschrieben, forgejo.ts hat den Authorization-Header still weggelassen (headers: TOKEN ? {...} : {}) und GET /user/repos kam als 401 token is required zurück. Zehn Nachtläufe, jeder nach ~12 s tot, bevor die erste Karte gezeichnet war.

Das ist exakt dasselbe Muster, das in flow.raven-deployment als RUNNER-JOURNEY.md:750 dokumentiert ist: "${{ secrets.FORGEJO_TOKEN }} existiert nirgends … und der env:-Block überschreibt damit den funktionierenden envFrom-Wert mit leer."

Was sich ändert

  1. Token kommt aus der Runner-Job-Env. Der Pool flow-raven-eval (auf dem dieser Job schon läuft) projiziert FORGEJO_TOKEN über sein env_file — belegt in flow.raven-deployment/.forgejo/workflows/deploy-raven-dev-eval.yml, EVAL_ALLOWLIST_REGEX führt FORGEJO_TOKEN namentlich. Die schattenwerfende secrets.*-Zeile ist raus, ebenso das zweite PUSH_TOKEN-Duplikat im Publish-Schritt.
  2. Preflight nach Vorbild deploy-raven-dev-sweep.yml — nur Namen, nie Werte. Fehlt der Token, bricht der Job in Sekunde eins mit MISSING: FORGEJO_TOKEN ab statt mit einem API-Fehler drei Schritte später.
  3. Kein stiller anonymer Modus mehr. forgejo.ts behandelt den Token nicht länger als optional: requireToken() wirft no Forgejo token configured (set FORGEJO_TOKEN).

Beleg

bun run typecheck grün. Der benannte Fehler lokal reproduziert:

$ FORGEJO_TOKEN= bun run src/main.ts
source: https://forgejo.philflow.me
error: no Forgejo token configured (set FORGEJO_TOKEN) — https://forgejo.philflow.me
only serves public data anonymously, so every private repository and the whole
contribution heatmap would be missing
      at requireToken (generator/src/forgejo.ts:37:15)

Offener Punkt für den Reviewer

Ob der flow-raven-eval-Runner den Token jetzt wirklich im Job-Env trägt, ist aus dem Repo heraus nicht beweisbar — die Allowlist erlaubt ihn, die Projektion überspringt aber leere Werte (WARN: skipping $key (empty value)), und flow.raven-deployment#1262 hält offen, ob Forgejo denselben Namen run-scoped überschreibt. Sollte der Token fehlen oder run-scoped ankommen, scheitert der Lauf ab jetzt benannt (Preflight bzw. heatmap is (near) empty) statt mit einem nackten 401. Fehlt er wirklich, ist der Ort der Reparatur Infisical (philflow-raven-os-pl, Key FORGEJO_TOKEN) plus ein Lauf von deploy-raven-dev-eval.yml, nicht dieses Repo.

Closes #2

🤖 Generated with Claude Code

https://claude.ai/code/session_019Wzp8PPYXc8rFynfSwMUCk

## Was kaputt war `profile-cards.yml` setzte `FORGEJO_TOKEN: ${{ secrets.PROFILE_TOKEN }}`. Dieses Actions-Secret existiert in diesem Repository nicht. Ein undefiniertes Secret rendert als **leerer String** — der `env:`-Block hat damit einen eventuell vorhandenen Runner-Wert überschrieben, `forgejo.ts` hat den Authorization-Header still weggelassen (`headers: TOKEN ? {...} : {}`) und `GET /user/repos` kam als `401 token is required` zurück. Zehn Nachtläufe, jeder nach ~12 s tot, bevor die erste Karte gezeichnet war. Das ist exakt dasselbe Muster, das in `flow.raven-deployment` als `RUNNER-JOURNEY.md:750` dokumentiert ist: *"`${{ secrets.FORGEJO_TOKEN }}` existiert nirgends … und der `env:`-Block überschreibt damit den funktionierenden envFrom-Wert mit leer."* ## Was sich ändert 1. **Token kommt aus der Runner-Job-Env.** Der Pool `flow-raven-eval` (auf dem dieser Job schon läuft) projiziert `FORGEJO_TOKEN` über sein `env_file` — belegt in `flow.raven-deployment/.forgejo/workflows/deploy-raven-dev-eval.yml`, `EVAL_ALLOWLIST_REGEX` führt `FORGEJO_TOKEN` namentlich. Die schattenwerfende `secrets.*`-Zeile ist raus, ebenso das zweite `PUSH_TOKEN`-Duplikat im Publish-Schritt. 2. **Preflight nach Vorbild `deploy-raven-dev-sweep.yml`** — nur Namen, nie Werte. Fehlt der Token, bricht der Job in Sekunde eins mit `MISSING: FORGEJO_TOKEN` ab statt mit einem API-Fehler drei Schritte später. 3. **Kein stiller anonymer Modus mehr.** `forgejo.ts` behandelt den Token nicht länger als optional: `requireToken()` wirft `no Forgejo token configured (set FORGEJO_TOKEN)`. ## Beleg `bun run typecheck` grün. Der benannte Fehler lokal reproduziert: ``` $ FORGEJO_TOKEN= bun run src/main.ts source: https://forgejo.philflow.me error: no Forgejo token configured (set FORGEJO_TOKEN) — https://forgejo.philflow.me only serves public data anonymously, so every private repository and the whole contribution heatmap would be missing at requireToken (generator/src/forgejo.ts:37:15) ``` ## Offener Punkt für den Reviewer Ob der `flow-raven-eval`-Runner den Token **jetzt** wirklich im Job-Env trägt, ist aus dem Repo heraus nicht beweisbar — die Allowlist erlaubt ihn, die Projektion überspringt aber leere Werte (`WARN: skipping $key (empty value)`), und `flow.raven-deployment#1262` hält offen, ob Forgejo denselben Namen run-scoped überschreibt. Sollte der Token fehlen oder run-scoped ankommen, scheitert der Lauf ab jetzt **benannt** (Preflight bzw. `heatmap is (near) empty`) statt mit einem nackten 401. Fehlt er wirklich, ist der Ort der Reparatur Infisical (`philflow-raven-os-pl`, Key `FORGEJO_TOKEN`) plus ein Lauf von `deploy-raven-dev-eval.yml`, nicht dieses Repo. Closes #2 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_019Wzp8PPYXc8rFynfSwMUCk
`FORGEJO_TOKEN: ${{ secrets.PROFILE_TOKEN }}` pointed at an Actions secret this
repository does not have. An undefined secret renders as the empty string, so
the `env:` block shadowed whatever the runner had exported and every request
went out unauthenticated — ten scheduled runs in a row died after ~12 s on
`GET /user/repos → 401 token is required`, before the first card was drawn.

The token now arrives the way every other scheduled workflow on this instance
gets one: from the runner job env. The `flow-raven-eval` pool already carries
FORGEJO_TOKEN through its `env_file` projection, so nothing new has to be
delivered — only the shadowing line had to go. A names-only preflight step,
shaped after flow.raven-deployment's deploy-raven-dev-sweep.yml, fails the job
early and by name if it is ever absent.

The client no longer treats the token as optional either. An empty value used
to silently drop the Authorization header and surface as a raw 401 from an
endpoint that never names the cause; it now raises
"no Forgejo token configured (set FORGEJO_TOKEN)" at the first request.

Closes #2

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019Wzp8PPYXc8rFynfSwMUCk
Author
Owner

CI-Beleg — der offene Punkt ist geschlossen, kein Blocker

Workflow auf dem Feature-Branch angestoßen. Run #35 (id 37038, SHA ed2dd53): success nach 17 s, bei zehn Vorläufern failure nach 12 s.

id=37038 run_number=35  Profile cards
  Status: success | Event: workflow_dispatch | SHA: ed2dd53 | Duration: 17s
id=37008 run_number=34  Status: failure | SHA: 0f3479c | Duration: 12s
id=36451 run_number=33  Status: failure | SHA: 0f3479c | Duration: 12s

Grün heißt hier nicht nur „Exit 0" — der Lauf hat die Karten tatsächlich neu gebaut und veröffentlicht:

$ git ls-remote origin
7d59ca830df36f8752a49c093f373f4123e73f31    refs/heads/output

$ git log -1 --format='%H %ci %s' origin/output
7d59ca83 2026-09-15 06:53:16 +0000 chore(profile): refresh cards 2026-09-15T06:53:16.134Z

$ git show origin/output:generated-at.txt
2026-09-15T06:53:16.134Z

Alle fünf Karten neu geschrieben (snake, streak, activity, contrib-3d, metrics) — die veralteten *-dark.svg aus dem August-Stand sind damit weg.

Das beantwortet die offene Frage aus der PR-Beschreibung: der flow-raven-eval-Runner trägt FORGEJO_TOKEN im Job-Env, und zwar als echten PAT, nicht als run-scoped Token. Beweis ohne Logs: main.ts wirft bei byDay.size <= 1 (heatmap is (near) empty) — ein repo-scoped Token hätte genau dort abgebrochen. Der Lauf ist durchgelaufen, die Heatmap war also gefüllt. Damit fällt auch die Sorge aus flow.raven-deployment#1262 für diesen Pool weg.

Es fehlt kein Secret. Weder in Infisical noch in der Runner-Env war etwas zu setzen — die Ursache war ausschließlich die schattenwerfende ${{ secrets.PROFILE_TOKEN }}-Zeile.

🤖 Generated with Claude Code

https://claude.ai/code/session_019Wzp8PPYXc8rFynfSwMUCk

## CI-Beleg — der offene Punkt ist geschlossen, kein Blocker Workflow auf dem Feature-Branch angestoßen. **Run #35 (id 37038, SHA `ed2dd53`): `success` nach 17 s**, bei zehn Vorläufern `failure` nach 12 s. ``` id=37038 run_number=35 Profile cards Status: success | Event: workflow_dispatch | SHA: ed2dd53 | Duration: 17s id=37008 run_number=34 Status: failure | SHA: 0f3479c | Duration: 12s id=36451 run_number=33 Status: failure | SHA: 0f3479c | Duration: 12s ``` Grün heißt hier nicht nur „Exit 0" — der Lauf hat die Karten tatsächlich neu gebaut und veröffentlicht: ``` $ git ls-remote origin 7d59ca830df36f8752a49c093f373f4123e73f31 refs/heads/output $ git log -1 --format='%H %ci %s' origin/output 7d59ca83 2026-09-15 06:53:16 +0000 chore(profile): refresh cards 2026-09-15T06:53:16.134Z $ git show origin/output:generated-at.txt 2026-09-15T06:53:16.134Z ``` Alle fünf Karten neu geschrieben (`snake`, `streak`, `activity`, `contrib-3d`, `metrics`) — die veralteten `*-dark.svg` aus dem August-Stand sind damit weg. **Das beantwortet die offene Frage aus der PR-Beschreibung:** der `flow-raven-eval`-Runner trägt `FORGEJO_TOKEN` im Job-Env, und zwar als **echten PAT**, nicht als run-scoped Token. Beweis ohne Logs: `main.ts` wirft bei `byDay.size <= 1` (`heatmap is (near) empty`) — ein repo-scoped Token hätte genau dort abgebrochen. Der Lauf ist durchgelaufen, die Heatmap war also gefüllt. Damit fällt auch die Sorge aus `flow.raven-deployment#1262` für diesen Pool weg. Es fehlt **kein** Secret. Weder in Infisical noch in der Runner-Env war etwas zu setzen — die Ursache war ausschließlich die schattenwerfende `${{ secrets.PROFILE_TOKEN }}`-Zeile. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_019Wzp8PPYXc8rFynfSwMUCk
Phil merged commit aa46133f4e into main 2026-09-15 07:02:26 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Phil/.profile!3
No description provided.