The omni provider's models.json entries carried no 'cost' field, so pi's
calculateCost() returned 0 for every run and Paperclip cost events/budgets
all read $0.00 despite real spend.
- scripts/omni-pricing.mjs: pulls authoritative prices (OmniRoute /api/pricing
for deepseek/*, OpenRouter /api/v1/models for openrouter/*) and injects
{ cost: { input, output, cacheRead, cacheWrite } } USD per 1M tokens.
- Priced: deepseek-v4-flash, deepseek-v4-pro, gemini-3.1-flash-lite, gemini-2.5-flash.
- Must be re-run after every /omni sync, which rewrites models.json wholesale.
- Ming (inclusionai/ming-image-0.1-design) is free and built for graphic-design
output with legible in-image text; now the preferred mockup model.
- Ming is a true image-generation model: the chat/completions endpoint rejects
it (HTTP 404). Documented the /api/v1/images call + base64 decode recipe.
- Kept paid chat-image models as a documented fallback.
- Fixed the API key location: OPENROUTER_API_KEY is in /home/sam/.secrets,
NOT ~/.config/environment.d/10-secrets.conf as the old text claimed.
- new obsidian-sorter skill: file notes via the 010 inbox on .27
- project-docs now writes to the inbox and lets the sorter choose the
folder + type, instead of the retired <vault>/Projects/ path
- obsidian-note template gains title/type/created and keeps skills:/tools:
- project-diagramming-archify (v1.1.0): new 'Dense maps' section — drop to --quality standard (4 checks vs 9), enlarge meta.viewBox (no schema max, examples up to 1080x780), or split maps, before simplifying node set; visual-check must fit 1440x900 without scrolling
- archify vendored SKILL.md: add dense-map off-ramp note near fast-authoring step 3
- fixes AI agents hitting showcase composition walls on rich maps + vertical-overflow confusion
- publish-maps.sh: incremental/atomic rsync of <project>/docs to maps.lab.audasmedia.com.au/<project>/docs (excludes visual-check sidecars)
- SKILL.md: document publish step after deliver + site URL
- maps.lab.audasmedia.com.au served by Caddy on .35 (file_server browse, no auth)
- falcode.ts: add child.on('error') handlers so a missing notify binary
(e.g. /bin/true on NixOS) can no longer take down pi via uncaughtException
- scripts/oc-notify.sh: real notifier (notify-send + ntfy) replacing the no-op
- oc-notify.sh also deployed to ~/.local/state/falcode-zellij/ on all machines