{
  "id": "ledger-api/invoice-number-sequences",
  "slug": "invoice-number-sequences",
  "title": "Session: invoice-number-sequences — 2026-10-08",
  "type": "source",
  "project": "ledger-api",
  "date": "2026-10-08",
  "started": "2026-10-08T13:50:00+00:00",
  "ended": "2026-10-08T14:50:00+00:00",
  "model": "gpt-5-codex",
  "cwd": "/home/dev/code/ledger-api",
  "git_branch": "feat/invoice-numbers",
  "permission_mode": "default",
  "user_messages": 1,
  "tool_calls": 3,
  "tools_used": [
    "Bash",
    "Write"
  ],
  "is_subagent": false,
  "wikilinks_out": [
    "PostgreSQL",
    "RowLocks",
    "ledger-api"
  ],
  "body_text": "Project: ledger-api · Branch: feat/invoice-numbers · Mode: default · Model: gpt-5-codex\n\nSummary\n\nGap-free invoice numbers per legal entity and year, allocated from a Postgres row lock instead of a sequence, because sequences can skip numbers on rollback.\n\nConversation\n\nTurn 1 — User\n\nAccounting needs invoice numbers without gaps.\n\nTurn 1 — Assistant\n\nPostgres sequences are not gap-free. Use a numbering table per entity and year, SELECT … FOR UPDATE inside the invoice transaction.\n\nTools used in this turn:\n\n- Write: ledger/numbering.py\n- Write: migrations/versions/0007_numbering.py\n- Bash: pytest tests/test_numbering.py -q — 5 passed\n\nConnections\n\n- ledger-api\n- PostgreSQL\n- RowLocks",
  "sha256": "60ca76b8e001cb76",
  "source_url": "sessions/ledger-api/2026-10-08-invoice-number-sequences.html"
}