* feat(loops): regeluppdat + docs-freshness scans (#1417)
Two new local loops per .claude/loops.md conventions:
- loop-regeluppdat (monthly): sweeps official Swedish sources (Skatteverket,
BFN, Bolagsverket, regeringen/riksdagen, BAS, DIGG/ViDA) for regulatory
changes, verifies each against the codebase anchors, and files deduped
tickets for gaps. Tickets only, never code: regulatory changes touch money
math and compliance surfaces.
- loop-docs-freshness (weekly): runs scripts/check-docs-freshness.mts, which
builds every docs page from source and diffs it against the live .md
mirrors on docs.accounted.se; files one deduped drift issue and proposes
the re-export PR in the gnubok-website repo.
Both self-gate on run markers so any invocation is idempotent; loop-ignite
now runs them when due (session crons cannot express weekly/monthly).
Labels loop:docs and loop:regeluppdat created on the repo.
Closes#1417
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(loops): explicit types for closure-captured docs-content imports
next build's type check rejects the bare let-in-try pattern when the
variables are read inside a nested function (implicit any).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
---------
Co-authored-by: Jakob Wennberg <311770904+jakobwennberg-oss@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Founder decision 2026-07-20: the three claude.ai cloud triggers ran for
19 days as silent no-ops (GH_TOKEN never provisioned, issue #993) and
were disabled instead of provisioned. loops.md and loop-ignite now
document local-only operation so future sessions do not re-enable the
dead triggers or re-ask for provisioning.
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* chore: salvage unmerged work from the 2026-07-16 worktree audit
Four items survived the 43-file dirty-tree audit as genuinely unmerged:
- CLAUDE.md: Definition of Done rule 9, the last mile is verified
in-session, not assumed (project-level counterpart of the switch-on
check; cloud agents only see the repo file).
- DECISIONS.md: eight decision lines from 2026-07-09 to 2026-07-15,
condensed and scrubbed of production identifiers for the public repo.
- .claude/skills/loop-ignite: skill that audits the agentic loops and
ignites dead ones; must live on main for cloud routines to load it.
- lib/bokslut/ixbrl testbank manual E2E: encodes the working testbank
endpoints and the Luhn-valid test pnr (the documented one fails);
skipped unless BOLAGSVERKET_TESTBANK_E2E=1, so zero CI cost.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* chore: address review findings on the salvage batch
- testbank e2e: kontrollera returns HTTP 200 even for invalid documents
(outcome is in utfall), so assert zero typ='error' entries; also assert
grunduppgifter returns a company name, not just the echoed orgnr.
- loop-ignite: make ignition explicitly idempotent (enable/repair an
existing trigger before creating, never duplicate).
Skipped the fourth finding (require an observed firing as switch-on
proof): a just-created cron cannot have fired yet; the audit table
already reports last observed run per loop.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>