Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
82 changes: 82 additions & 0 deletions docs/budget-history/latest-report.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
# Latest cost projection — auto-generated

**Generated:** `2026-04-26T14:37:11Z`
**Factory git SHA:** `a7fb1dbd47b020ffb56e0a63935dc70dd7000aec`
**Source:** `tools/budget/daily-cost-report.sh` (wraps snapshot-burn.sh + project-runway.sh)

This file is **OVERWRITTEN** on each daily run. Historical snapshots live in
`docs/budget-history/snapshots.jsonl` (append-only); historical projections
can be reconstructed from any snapshot subset via `tools/budget/project-runway.sh`.

---

## Projection text

```text
Budget projection — three-repo-split Stages 1-4
================================================

Evidence source: docs/budget-history/snapshots.jsonl
Samples (N): 1
First snapshot: 2026-04-26T13:57:01Z
Latest snapshot: 2026-04-26T13:57:01Z
Latest factory SHA: 744e268dd6f57ba230deab8d77616ae19e38cf2f

Latest state
------------
Copilot plan: business
Copilot seats: 1
Actions total_duration_ms (last 20 runs, all repos): 513000
Actions billable_ms cumulative: 0

Projection parameters
---------------------
Estimated extra PRs for Stages 1-4: 20
Copilot Business seat rate (USD/mo): $19
Actions free-tier allowance (ms): 180000000
Assumed migration span (days): 30

Projection
----------
Per-PR Actions ms: insufficient data (N<2 or no duration delta)
Projected Actions ms: unavailable
Gate status: cannot project — accumulate more snapshots
Copilot projected USD (single span): $19

Human-maintainer-decision surface
----------------------
N=1; BACKLOG row requires N>=3 across >=2 LFG merges before
projection is considered decision-ready. Keep accumulating.

Caveats
-------
* recent_merged is a rolling-window count (last 10 closed PRs),
not a cumulative counter. Per-PR-ms uses it as a proxy —
introduces error when the 20-run window doesn't roll forward
between snapshots. A cumulative PR counter would be a
substrate improvement (BACKLOG follow-up).
* last_billable_ms on public repos is typically 0 (included
minutes). Projection still meaningful for macOS runs and
any future private-repo work.
* Copilot projection assumes constant seat count over the span.
Seat-count changes require rerunning projection.
```

---

## How to read this

- **`Actions billable_ms cumulative`** — cumulative GitHub-Actions billable runtime across captured snapshots. On public repos this is typically 0 (included minutes); meaningful for macOS / private-repo / Enterprise-plan accounts.
- **`Per-PR Actions ms (naive)`** — rolling-window estimate of per-merged-PR Actions cost. Caveats in the projection text below; treat as proxy until `N \geq 3` cumulative snapshots exist.
Copy link

Copilot AI Apr 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The report text says “Caveats in the projection text below”, but the projection (including the caveats section) appears above this “How to read this” section. Also, N \geq 3 renders literally inside inline code in Markdown; consider using N >= 3 (or N ≥ 3) so it reads correctly without LaTeX rendering.

Suggested change
- **`Per-PR Actions ms (naive)`** — rolling-window estimate of per-merged-PR Actions cost. Caveats in the projection text below; treat as proxy until `N \geq 3` cumulative snapshots exist.
- **`Per-PR Actions ms (naive)`** — rolling-window estimate of per-merged-PR Actions cost. Caveats in the projection text above; treat as proxy until `N >= 3` cumulative snapshots exist.

Copilot uses AI. Check for mistakes.
- **`Actions fit`** — whether projected Stages 1-4 burn fits the configured free-tier allowance. If `EXCEEDS`, the gate-conditions section names escape valves.
- **`Copilot projected USD`** — assumed-30-day span at the current seat count and rate. Re-run with `--copilot-rate` to model rate changes.

---

## Source data

- Snapshots: `docs/budget-history/snapshots.jsonl`
- Methodology: `docs/budget-history/README.md`
- Wrapper: `tools/budget/daily-cost-report.sh` (this run)
- Capture script: `tools/budget/snapshot-burn.sh`
- Projection script: `tools/budget/project-runway.sh`
1 change: 1 addition & 0 deletions docs/budget-history/snapshots.jsonl
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"ts":"2026-04-26T13:57:01Z","factory_git_sha":"744e268dd6f57ba230deab8d77616ae19e38cf2f","org":"Lucent-Financial-Group","note":null,"copilot_billing":{"seat_breakdown":{"pending_invitation":0,"pending_cancellation":0,"added_this_cycle":1,"total":1,"active_this_cycle":1,"inactive_this_cycle":0},"seat_management_setting":"assign_selected","plan_type":"business","public_code_suggestions":"allow","ide_chat":"enabled","cli":"enabled","platform_chat":"enabled"},"repos":[{"repo":"Lucent-Financial-Group/Zeta","agg":{"total_runs":20,"total_duration_ms":513000,"billable_ubuntu_ms":0,"billable_macos_ms":0,"billable_windows_ms":0},"pr":{"recent_merged":5,"last_merged_at":"2026-04-26T13:54:29Z"},"last_20_runs":[{"id":24958345708,"name":"Copilot code review","conclusion":null,"run_started_at":"2026-04-26T13:56:13Z","updated_at":"2026-04-26T13:56:27Z"},{"id":24958344924,"name":"CodeQL","conclusion":"success","run_started_at":"2026-04-26T13:56:10Z","updated_at":"2026-04-26T13:56:32Z"},{"id":24958344908,"name":"gate","conclusion":null,"run_started_at":"2026-04-26T13:56:10Z","updated_at":"2026-04-26T13:56:14Z"},{"id":24958344765,"name":"Automatic Dependency Submission (NuGet)","conclusion":"success","run_started_at":"2026-04-26T13:56:10Z","updated_at":"2026-04-26T13:56:54Z"},{"id":24958344331,"name":"Code Quality: PR #614","conclusion":null,"run_started_at":"2026-04-26T13:56:08Z","updated_at":"2026-04-26T13:56:13Z"},{"id":24958344166,"name":".github/workflows/github-settings-drift.yml","conclusion":"failure","run_started_at":"2026-04-26T13:56:08Z","updated_at":"2026-04-26T13:56:08Z"},{"id":24958324676,"name":"Copilot code review","conclusion":null,"run_started_at":"2026-04-26T13:55:09Z","updated_at":"2026-04-26T13:55:20Z"},{"id":24958323549,"name":"gate","conclusion":null,"run_started_at":"2026-04-26T13:55:06Z","updated_at":"2026-04-26T13:55:09Z"},{"id":24958323544,"name":"CodeQL","conclusion":"success","run_started_at":"2026-04-26T13:55:06Z","updated_at":"2026-04-26T13:55:27Z"},{"id":24958322995,"name":"Code Quality: PR #613","conclusion":"success","run_started_at":"2026-04-26T13:55:04Z","updated_at":"2026-04-26T13:56:54Z"},{"id":24958318853,"name":".github/workflows/github-settings-drift.yml","conclusion":"failure","run_started_at":"2026-04-26T13:54:52Z","updated_at":"2026-04-26T13:54:52Z"},{"id":24958318721,"name":"Automatic Dependency Submission (NuGet)","conclusion":"success","run_started_at":"2026-04-26T13:54:51Z","updated_at":"2026-04-26T13:55:36Z"},{"id":24958316252,"name":"Automatic Dependency Submission (NuGet)","conclusion":"success","run_started_at":"2026-04-26T13:54:43Z","updated_at":"2026-04-26T13:55:23Z"},{"id":24958313052,"name":"gate","conclusion":null,"run_started_at":"2026-04-26T13:54:32Z","updated_at":"2026-04-26T13:54:36Z"},{"id":24958313042,"name":"CodeQL","conclusion":null,"run_started_at":"2026-04-26T13:54:32Z","updated_at":"2026-04-26T13:54:44Z"},{"id":24958313038,"name":"scorecard","conclusion":"success","run_started_at":"2026-04-26T13:54:32Z","updated_at":"2026-04-26T13:55:08Z"},{"id":24958312685,"name":".github/workflows/github-settings-drift.yml","conclusion":"failure","run_started_at":"2026-04-26T13:54:31Z","updated_at":"2026-04-26T13:54:31Z"},{"id":24958312663,"name":"Code Quality: Push on main","conclusion":"success","run_started_at":"2026-04-26T13:54:31Z","updated_at":"2026-04-26T13:56:16Z"},{"id":24958285907,"name":"Copilot code review","conclusion":"success","run_started_at":"2026-04-26T13:53:13Z","updated_at":"2026-04-26T13:54:43Z"},{"id":24958285505,"name":"gate","conclusion":null,"run_started_at":"2026-04-26T13:53:12Z","updated_at":"2026-04-26T13:53:15Z"}]}],"scope_coverage":{"has_read_org":true,"has_admin_org":false,"covered":["copilot-seats","actions-runs-per-run-timing"],"missing_requires_admin_org":["actions-billing","packages-billing","shared-storage-billing"]}}
1 change: 0 additions & 1 deletion tools/budget/daily-cost-report.sh
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,6 @@ $projection
- Wrapper: \`tools/budget/daily-cost-report.sh\` (this run)
- Capture script: \`tools/budget/snapshot-burn.sh\`
- Projection script: \`tools/budget/project-runway.sh\`

EOF

echo "==> wrote $report_path"
Expand Down
2 changes: 1 addition & 1 deletion tools/budget/project-runway.sh
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ cat <<OUT
Budget projection — three-repo-split Stages 1-4
================================================

Evidence source: $file
Evidence source: ${file#"$repo_root"/}
Samples (N): $n
First snapshot: $first_ts
Latest snapshot: $last_ts
Expand Down
Loading