Skip to content

feat: measure run cost per BPMN element - #8

Merged
tenkeb merged 12 commits into
mainfrom
feat/run-costs
Oct 4, 2026
Merged

tenkeb merged 12 commits into
mainfrom
feat/run-costs

Conversation

@tenkeb

@tenkeb tenkeb commented Oct 4, 2026

Copy link
Copy Markdown
Contributor

Worum es geht

Was hat ein Lauf eines erzeugten Workflows gekostet, und welcher Teil des Diagramms wie viel davon? Die Messung ist deterministisch: Tokens aus den Session-Transkripten, Preise aus einer versionierten Tabelle, Zuordnung über die BPMN-Element-ID. Plan, Befunde und Aufgaben: docs/plans/laufkosten/.

Der Payload trägt Daten, das Plugin die Logik.

  • Payload (jeder erzeugte Workflow, generate 6b): ein Ledger-Hook (SubagentStop, Stop, SessionEnd), der jede abgeschlossene API-Anfrage einmal nach .claude/runs/<workflow>/ledger.jsonl schreibt, und eine Kostenkarte <workflow>-cost-map.json. Der Hook bricht nie einen Lauf ab und braucht nur transcript_path.
  • Plugin (bpmn2agent-cost): cost-report.mjs (Zuordnung je Element, Lane, Phase, Modell, Abgleich), cost-bench.mjs (wiederholte Läufe mit Median und Streuung, nur mit --confirm), prices.json.
  • Label-Konvention: agent()-Labels und Agent-Beschreibungen beginnen mit der Element-ID; verify prüft das für Workflow-Skripte.
  • Mapping-Ansicht: render-mapping.mjs --cost cost.json zeigt Badge je Element, Kostenabschnitt und Kostenzeile in den Details.

Befunde aus echten Daten (spike.md)

  • Je API-Anfrage zählt die Transkriptzeile mit den meisten output_tokens; damit stimmen die Tokens mit cost-state exakt überein, und die Preistabelle reproduziert costUSD (39 von 39 token-gleichen Modell-Sessions).
  • Hilfsaufrufe stehen nur in cost-state; sie werden als eigener Eimer ausgewiesen.
  • cost-state hinter dem Transkript (fortgesetzte Sessions) ist eine Warnung, kein Fehler. Über alle 125 lokalen Sessions mit cost-state: 0 Fehler, 0 Abstürze.

Prüfung

  • 20 Tests (node --test .agents/skills/bpmn2agent-cost/scripts/test.mjs), darunter Hook, Idempotenz, Abgleich, veraltete Preise und cost-bench gegen ein gefälschtes claude.
  • Ende-zu-Ende im Scratch-Projekt nur mit Payload + Plugin, ohne generated/: Ledger und Transkript liefern identische Zahlen.
  • npm run validate grün (eine bekannte Warnung zur CLAUDE.md); regenerate.sh endet mit RESULT: PASS, no reference problems, den drei Smoke-Zeilen und mapping view ok.
  • user-story-refinement mit dem Installer um Hook und Karte ergänzt (README und Mapping-Report von Hand angepasst); verify PASS. Das dark-factory-Mapping index.html ist durch regenerate.sh mit dem neuen Viewer-Code aktualisiert.

Noch offen

Braucht einen echten Lauf, nicht von diesem PR abhängig: die Felder der Hook-Payloads, ob Agents des Workflow-Tools unter subagents/ mit dem Label als description landen, und die Gegenprobe mit OpenTelemetry.

🤖 Generated with Claude Code

tenkeb and others added 12 commits October 4, 2026 16:39
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ecraft

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…e table

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Skip synthetic transcript lines before requiring a requestId and sum
cost-state per priced model so context variants like [1m] reconcile.
Checked against all 125 local sessions with a cost-state: no failures,
no crashes.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Install the cost ledger hook and cost map with install-cost-ledger.mjs and
describe them in the example's README and mapping report. Regenerating the
dark-factory example refreshes its mapping view with the new viewer code;
regenerate.sh still ends with RESULT: PASS and mapping view ok.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@tenkeb
tenkeb merged commit a2d6b4b into main Oct 4, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant