v0.4.12026-06-11

Bug Fixes

  • **b101-05:** default --out resolves to the real sibling hiresling-meta (4 ups, not 3)
  • **release:** staff recipients + graph-clean release-email module ([ba15574](https://github.com/42piratas/hiresling-app/commit/ba15574c43161c9b91e25409c74cb193ad35145c))
  • **release:** staff recipients + graph-clean release-email module ([fdaf95f](https://github.com/42piratas/hiresling-app/commit/fdaf95f9d83841f38a156c368da2f067c1675cdf))
v0.4.02026-06-11

Features

  • **beta:** streamline /beta intake — single atomic RPC, exact cap, device fence, SSR counter ([1c33a9e](https://github.com/42piratas/hiresling-app/commit/1c33a9eaea419ebf2f0f9b84bb38678a9f8962b9))
  • **cron:** daily LiteLLM per-user budget reconciliation (B99-99-98 followup) ([f8dc6cb](https://github.com/42piratas/hiresling-app/commit/f8dc6cb9e7ef53013d3f2cebf5632c9442c84c93))
  • **cron:** daily LiteLLM per-user budget reconciliation (B99-99-98 followup) ([02f499b](https://github.com/42piratas/hiresling-app/commit/02f499ba0f77bec0b36b919be1e2430cc8e67b60))

Bug Fixes

  • **release:** wrap send-release-email TLA in async main (B99-99-98 T2) ([795972c](https://github.com/42piratas/hiresling-app/commit/795972ccc3fdfe0f71dede0e99356c22d21995e2))
  • **release:** wrap send-release-email TLA in async main (B99-99-98 T2) ([e987b4f](https://github.com/42piratas/hiresling-app/commit/e987b4fc83d2c0a6e2bc26ba66f1fa7bec1e7fbe))
v0.3.02026-06-10

Features

  • **adhoc-tour-restyle:** match onboarding DS for tour + fold referrals into settings
  • **ai:** b91-05 idempotency keys — in-flight double-spend guard
  • **b101-01:** llm cost reduction — caching, batching, rerank gate, JD normalization ([3980848](https://github.com/42piratas/hiresling-app/commit/3980848b8ef65fd9d7280e0a38a7bd25296f3fbc))
  • **b101-01:** llm cost reduction (T1–T11) ([1f80fa1](https://github.com/42piratas/hiresling-app/commit/1f80fa11e944c26ce6c5edbd52ec90347ff73165))
  • **b101-03:** synthetic full-run audit harness + M1 live-usage tap ([445a022](https://github.com/42piratas/hiresling-app/commit/445a022bd134a7f64e59d9dbee0cc771eb57e80c))
  • **b101-03:** synthetic full-run audit harness + M1 live-usage tap ([01e7552](https://github.com/42piratas/hiresling-app/commit/01e75524f6126ff2a522064228b92536c68ef41b))
  • **b101-04:** Apollo industry name→tag-ID mapping (T1b precision) ([92ac058](https://github.com/42piratas/hiresling-app/commit/92ac05834bb22b9e3dc0b6b8df11338d40acaaac))
  • **b101-04:** deterministic resume-link guarantee + per-source company attribution ([3974680](https://github.com/42piratas/hiresling-app/commit/39746809ebe9bcc177c702fb196c007a409700ce))
  • **b101-04:** discovery wiring proof + paid-contact precision + per-source attribution + pre-flight gate ([188b3a6](https://github.com/42piratas/hiresling-app/commit/188b3a66b6ebfcb15ab91049172488f3fcfba385))
  • **b101-04:** map industry names to apollo tag-IDs (precise organization_industry_tag_ids) ([272e18f](https://github.com/42piratas/hiresling-app/commit/272e18f0319894e63c85dd9983b0bd26a58ea079))
  • **b101-04:** pre-flight source-validation harness (PASS/DEAD/EXHAUSTED/UNPROVISIONED) ([88e5120](https://github.com/42piratas/hiresling-app/commit/88e5120f34088f18c1e70f9f149c1d9d78bf3897))
  • **b101-06:** authoritative per-source cost map + completeness gate (T1) ([e48b964](https://github.com/42piratas/hiresling-app/commit/e48b964e0428f04f09d893e3c76bc0a1932a3508))
  • **b101-06:** daily source-value report (cost × yield × outcome per API) ([c668403](https://github.com/42piratas/hiresling-app/commit/c6684034cc2634d1433ee282f2facc21e7f8233b))
  • **b101-06:** digest daily-total header, non-API grouping, 09:00 UTC ([9a033a7](https://github.com/42piratas/hiresling-app/commit/9a033a7a814e8fc04f9ab7cdc53b98dc70b3f4b5))
  • **b101-06:** source-value rollup RPC + daily Slack digest (T2/T3) ([0f50424](https://github.com/42piratas/hiresling-app/commit/0f50424da167b73c4449fb67199f790e3beca8ee))
  • **b101-06:** stamp specific data-source API on user_companies.source (T0) ([e73e44f](https://github.com/42piratas/hiresling-app/commit/e73e44f50f42482f9db335e30bb2d77bb3d250e0))
  • **b101-07:** phase A — import-maximal, cost-aware acquisition model ([175166c](https://github.com/42piratas/hiresling-app/commit/175166c965632c2af48cf592b1c4eda16cf65192))
  • **b101-07:** phase A — import-maximal, cost-aware acquisition model ([bbf6f5d](https://github.com/42piratas/hiresling-app/commit/bbf6f5d0ec36fedd39d4ada15f592b600357103d))
  • **b101-07:** phase B — delivery + buffering on existing tables ([01040f8](https://github.com/42piratas/hiresling-app/commit/01040f820d79a396de43fe26272561c5cf773770))
  • **b101-07:** phase B — delivery + buffering on existing tables ([e11c9eb](https://github.com/42piratas/hiresling-app/commit/e11c9ebad05fd7f080c45e4770631ca6a944b183))
  • **b101-07:** phase C — two-lane queue + serialization + budget governor ([c22267c](https://github.com/42piratas/hiresling-app/commit/c22267cdc31c9749bd46735980c0473a111e38e6))
  • **b101-07:** phase C — two-lane queue, per-user serialization, budget governor ([0ba297e](https://github.com/42piratas/hiresling-app/commit/0ba297e8dbfa02ac00fabef2dc20fc227460b415))
  • **b101-08:** Phase A — pipeline_events cost/attribution ledger (T1–T6) ([aa6fc6d](https://github.com/42piratas/hiresling-app/commit/aa6fc6dbe5cc0ac74b023472a28b60cdbf0c57f9))
  • **b101-08:** phase a ledger foundation — pipeline_events table + emit module ([2368119](https://github.com/42piratas/hiresling-app/commit/23681195fe906e82cb8cdd85edaae16302384732))
  • **b101-08:** phase b reproducible cost-report generator (t7/t8) ([f54d418](https://github.com/42piratas/hiresling-app/commit/f54d418c4a42b488fdbbe204ef0ada33bc388196))
  • **b101-08:** phase b reproducible cost-report generator (T7/T8) ([353574e](https://github.com/42piratas/hiresling-app/commit/353574e9d2aea74e721eab4b7cc3e8340a5eb532))
  • **b101-08:** phase c sim fixes (T9–T12) ([41ade6c](https://github.com/42piratas/hiresling-app/commit/41ade6c67621e8b828f3f03f7bc2ed3248aea9aa))
  • **b101-08:** phase c sim fixes (T9–T12) ([8c906fb](https://github.com/42piratas/hiresling-app/commit/8c906fbd7d14265a5833c0ebf1cfff9422d999f4))
  • **b101-08:** phase d — parallel n-persona sim + behavior assertions + campaign report ([cdcc253](https://github.com/42piratas/hiresling-app/commit/cdcc2534914c08967154984b0bc2e3f078a0bb42))
  • **b101-08:** t4 payg billable units + t6 daily rollup/retention cron + tests ([f5b8802](https://github.com/42piratas/hiresling-app/commit/f5b8802d00c96021b3a994da1c804067ab5d5239))
  • **b101-08:** wire ai-leg + data-leg pipeline_events emits (t2/t3) ([a6c3bbe](https://github.com/42piratas/hiresling-app/commit/a6c3bbea1b8038b93c7aa111d28c1b82e68cc3dc))
  • **b101-09:** deterministic pipeline_events ledger reader for SIM reports ([018df58](https://github.com/42piratas/hiresling-app/commit/018df585e6834ef3f43cc1f3395ac4c2a869c10e))
  • **b101-10:** add staging-only test-enqueue endpoint for prod queue path ([c725c3c](https://github.com/42piratas/hiresling-app/commit/c725c3cf07999cc0c6649564aa9f737342a1801a))
  • **b101-10:** contact finders run cost-first, order read from the registry ([ebbd2b2](https://github.com/42piratas/hiresling-app/commit/ebbd2b2f05d6765d94b6735601eb898f66c8fa7c))
  • **b101-10:** drive SIM through the real deployed queue (prod-mirror harness) ([067a0c3](https://github.com/42piratas/hiresling-app/commit/067a0c303251ec71218c8e00ef2f2a356547cbf2))
  • **b101-10:** order discovery cascade cost-first (+ cascade check tolerance/exclusions) ([f7e4bbe](https://github.com/42piratas/hiresling-app/commit/f7e4bbee29cd320e1abc9e6f8d1f1bac078392dd))
  • **b101-10:** order discovery cascade cost-first + cascade check tolerance/exclusions ([4af918d](https://github.com/42piratas/hiresling-app/commit/4af918d8a2e6cab1c21a31e113894bbffedf8e35))
  • **b101-10:** prod-mirror SIM harness — drive the real deployed queue ([8ebf2ff](https://github.com/42piratas/hiresling-app/commit/8ebf2ffaf805bec2b384caa17ad7f7975394f2dd))
  • **b101-10:** propagate SIM prod-mirror to the deployed worker ([91b7898](https://github.com/42piratas/hiresling-app/commit/91b78986bf90e6a8e541bcff2fca705f90f505c1))
  • **b101-10:** propagate SIM prod-mirror to the deployed worker ([0589ef1](https://github.com/42piratas/hiresling-app/commit/0589ef15a8206b1bfceb177339d77cab34737b8f))
  • **b101-10:** raise internal credit caps to unreachable (defer to provider 429) ([2b408ed](https://github.com/42piratas/hiresling-app/commit/2b408ed9302036dd3456c4996d3619bcd84fc522))
  • **b101-10:** SIM fidelity — ledger spend + staging queue trigger ([0b29cb4](https://github.com/42piratas/hiresling-app/commit/0b29cb4052c7fdeab103a3828df238ee0b5b8e79))
  • **b101-10:** single per-call cost registry — kill cost bands ([9714d2b](https://github.com/42piratas/hiresling-app/commit/9714d2b5943e5cb74fe0081c88a6463c308014f1))
  • **b101-10:** single per-call cost registry — real subscription costs, kill cost bands ([b7cb448](https://github.com/42piratas/hiresling-app/commit/b7cb448853c0e81680d9df7dd4eeb5a55e7f3bd6))
  • **B101-11:** discovery funnel + cascade tolerance + AI-cost badge ([6e0475a](https://github.com/42piratas/hiresling-app/commit/6e0475a43f36053fed9d435c1baa8ad93017bc04))
  • **B101-11:** discovery funnel Returned→Unique→Net-new + cascade tolerance + AI-cost badge ([ab4d4b0](https://github.com/42piratas/hiresling-app/commit/ab4d4b0d182e18594a436560744ead23e31efb19))
  • **b101-11:** systemic feed ordering (cost→ROI) + provider-only spend control ([cdaf731](https://github.com/42piratas/hiresling-app/commit/cdaf731981378ad73b46da0c2189a5fcf2c29582))
  • **b101-11:** systemic feed ordering (cost→ROI) + provider-only spend control ([03fdfec](https://github.com/42piratas/hiresling-app/commit/03fdfecfe6c883dba1c6c0ba58c6e12eba40c518))
  • **b101-13:** ledger-report correctness + parametrized generator + SIM-harness assertion fixes ([ca9eab5](https://github.com/42piratas/hiresling-app/commit/ca9eab5e0d0b2f12b429521ba13a53dc0e97f534))
  • **b101-13:** ledger-report correctness + parametrized generator + SIM-harness assertion fixes ([bd02d53](https://github.com/42piratas/hiresling-app/commit/bd02d538a1f7564049c759be2d0b98ac11f0d5ea))
  • **b101-14:** breadth-first draft distribution (favor unique companies) ([8c2cd95](https://github.com/42piratas/hiresling-app/commit/8c2cd9509e3a347a3cfcb09a61e702b90347a7e8))
  • **b101-14:** breadth-first draft distribution (favor unique companies) ([34ee89d](https://github.com/42piratas/hiresling-app/commit/34ee89d620451e68f2ef5c51fcdfb12dda6d4dde))
  • **b101-15:** one-off staging→prod warehouse promote script (dry-run validated) ([b944620](https://github.com/42piratas/hiresling-app/commit/b94462049ebb001ce3ddb28f0a984eb0373edd4b))
  • **b101-15:** one-off staging→prod warehouse promote script (dry-run validated) ([93de9b6](https://github.com/42piratas/hiresling-app/commit/93de9b66a389e61ac4f64d7def7b752541436f31))
  • **b102-01:** author italian it.json + wire message data (T5–T6)
  • **b102-01:** italian (it) i18n scaffolding — dark-launched (T1–T4)
  • **b102-01:** italian legal pages — PrivacyIT + TermsIT (dark-launched)
  • **b102-01:** legal-page IT cross-links + PT/ES governing-language clause
  • **b103-01:** contact-leg funnel correctness — persisted net-new + dedup + delivered layer ([94bf56d](https://github.com/42piratas/hiresling-app/commit/94bf56d25c4c48dd41054a79f3e96f937ce01a77))
  • **b103-01:** contact-leg funnel correctness — persisted net-new + dedup + delivered layer ([f5a8783](https://github.com/42piratas/hiresling-app/commit/f5a8783418a302eaaf8b97e03536215b3653a368))
  • **b91-02-t1:** close the settings i18n + lift skipped suite
  • **b91-02:** t2/t3/t4 + server-side outreach consent + ui polish
  • **b91-03:** data lifecycle prune + per-type counters + audit log + Polar idempotency
  • **b91-06:** tier-aware action caps + per-draft revision cap + monthly ai budget ([89f41e4](https://github.com/42piratas/hiresling-app/commit/89f41e4ac57d9612aa154124c711dbd4d49fc1ff))
  • **b91-06:** tier-aware action caps, per-draft revision cap, monthly ai budget ([dc7957e](https://github.com/42piratas/hiresling-app/commit/dc7957e5c888e2fbd4b0bf467f84b3d11b5e9b28))
  • **b91-07:** pipe why_next calibration signal into draft prompt
  • **b91-08:** staging fixture pool expansion — 50 cos + recycling + fair rotation + E2E
  • **b92-01:** faq + public-kb drift proofing + email length caps
  • **b92-02:** chat streams + send-failure alarms to Slack, drop 3 admin panels
  • **b92-03:** gmail send-failure schema guardrails + aggregate alarm + atomic compensation ([13175e9](https://github.com/42piratas/hiresling-app/commit/13175e92fb33ce465b3d35106fece3ba68945961))
  • **b92-04:** polar-driven pricing single source of truth ([f342015](https://github.com/42piratas/hiresling-app/commit/f34201598cf048df213dad6ea27a2dc3e883de3a))
  • **b92-04:** polar-driven pricing single source of truth ([48190db](https://github.com/42piratas/hiresling-app/commit/48190db7dffc95ce9458fe8c0adee72100f9ebce))
  • **b92-05:** litellm daily spend digest to Slack
  • **b92-06:** matomo daily product digest + align litellm to 09:00 UTC
  • **b92-07:** support-chat KB drift proofing + comprehensive coverage refresh
  • **b92-adhoc-alpha1-coverage:** t1 gmail referral + t2 picker coverage + t3 badge
  • **b92-adhoc-design-polish:** full design-polish pass (15 tasks)
  • **b92-adhoc-litellm-alias-namespace:** t2 phase 2 — app cutover to hiresling/<purpose> aliases
  • **b92-adhoc-resend:** daily resend digest cron + per-day counter
  • **b92-adhoc-target-roles:** hard-filter target_roles at every pipeline path
  • **b92-adhoc-token-naming-standardize:** dual-naming layer + partial scope sweep ([b1f18c4](https://github.com/42piratas/hiresling-app/commit/b1f18c4eddd7b56c4f18aa7527ded36487317354))
  • **b92-adhoc-token-naming-standardize:** dual-naming layer + partial scope sweep ([3472225](https://github.com/42piratas/hiresling-app/commit/3472225f2276413c7eac8ed3667f4cc9df0a0aea))
  • **b93-03:** atomic approve_send_outreach rpc + send-time email_sent cap ([28c289f](https://github.com/42piratas/hiresling-app/commit/28c289f3cc2e91f2cbefb654231209820ec5aade))
  • **b93-03:** atomic approve_send_outreach rpc + send-time email_sent cap ([03aef34](https://github.com/42piratas/hiresling-app/commit/03aef346538bebf3df85131aefb8013140c356d8))
  • **b93-04:** restore landing SSG + locale-prefix /ref + /how + FAB i18n + ICU plural ([2be04d6](https://github.com/42piratas/hiresling-app/commit/2be04d660f6ee597895f5f6f955a731cd0becff6))
  • **b93-04:** restore landing SSG + locale-prefix /ref + /how + FAB i18n + ICU plural ([b21d57f](https://github.com/42piratas/hiresling-app/commit/b21d57f551793017628b6751dddfbc7c67bfe1b7))
  • **b93-05:** i18n leaks sweep + email body_language stamp ([c58f10b](https://github.com/42piratas/hiresling-app/commit/c58f10bbea237342a2cf893a2961cb0f8c4df328))
  • **b93-05:** i18n leaks sweep + email body_language stamp ([a5918f6](https://github.com/42piratas/hiresling-app/commit/a5918f66c5bf22e09b1a41190a5b578b867edee8))
  • **b93-adhoc-fixture-role-family-coverage:** expand fixture pool to 25 role families
  • **b93:** onboarding polish + dashboard launch modal + tour DS alignment
  • **b97-01:** per-user user_contacts + contact_hashes cost-dedup (T1-T6.5)
  • **b98-01:** litellm ops — daily digest, cache wiring, fit-score haiku swap, attribution cleanup ([f5da8bf](https://github.com/42piratas/hiresling-app/commit/f5da8bfc9abec8712d7aeef056780e13b57bd00e))
  • **b98-01:** litellm ops — daily digest, cache wiring, fit-score haiku swap, attribution cleanup ([e834347](https://github.com/42piratas/hiresling-app/commit/e8343472b4364e8dccf8cdfe9c805ac39ac1c3ff))
  • **b98-02:** t11 + t12 + t13 — digest lane split + EMBEDDINGS_GLOBAL_KILL + docs ([b1c8f32](https://github.com/42piratas/hiresling-app/commit/b1c8f32e26a9c7b20c6202f407611dca61df27c1))
  • **b98-02:** t11 + t12 + t13 — digest lane split + kill switch + docs ([b65f23f](https://github.com/42piratas/hiresling-app/commit/b65f23f9bac388d7e43f2ee1ad8f94379613914c))
  • **b98-02:** t2 + t3 + t4 — voyage gateway aliases, embeddings utility, pgvector schema ([de36776](https://github.com/42piratas/hiresling-app/commit/de367762ac011e3b341b6fe9e58521c53dae93f8))
  • **b98-02:** t2 + t3 + t4 + t4.5 — voyage gateway aliases, embeddings utility, pgvector, prospect-bifurcation collapse ([8fe98a6](https://github.com/42piratas/hiresling-app/commit/8fe98a6859758cf712b0d8dc04a2c50aa8514315))
  • **b98-02:** t4.5 collapse runprospecting/runstagingprospecting bifurcation ([d603d34](https://github.com/42piratas/hiresling-app/commit/d603d34bd11f4bce05f8110522705607915c2e60))
  • **b98-02:** voyage embeddings adoption — ship T5+T6+T7+T8+T9+T14 ([0ff10a1](https://github.com/42piratas/hiresling-app/commit/0ff10a12a5ff7859c42216ea06db7d2d1753dadd))
  • **b98-02:** voyage embeddings adoption — ship T5+T6+T7+T8+T9+T14 ([240d688](https://github.com/42piratas/hiresling-app/commit/240d688677abb6d4ec4b93e2b78515506b50f55a))
  • **b98-03:** per-day outreach_drafted cap on draft generation
  • **b98-04:** dashboard tour V1 — 13-step walkthrough + anchor refactor ([2d6cf5a](https://github.com/42piratas/hiresling-app/commit/2d6cf5aff728d21dca74c407b12775b831f69858))
  • **b98-04:** dashboard tour V1 — 13-step walkthrough + anchor refactor ([ccec89f](https://github.com/42piratas/hiresling-app/commit/ccec89f9f55a27d38441e71409235b7aa2cd22d1))
  • **b99-07:** paid sources default-OFF opt-in + jsearch keep-tune + staging alert wiring
  • **b99-99-01:** beta access provisioning — comp_beta_5d tier + public /beta overlay ([be5606f](https://github.com/42piratas/hiresling-app/commit/be5606f4c5d92769184db4704d3236ab6769c3d9))
  • **b99-99-01:** beta access provisioning — comp_beta_5d tier + public /beta overlay ([bf9c694](https://github.com/42piratas/hiresling-app/commit/bf9c694f918c251fbcec2dc12ee4d1facb4a8007))
  • **b99-99-02:** beta feedback gate starts day 2 (day 1 free) ([9003d89](https://github.com/42piratas/hiresling-app/commit/9003d898cf8f2d06205acdeb93e291a655e63ffe))
  • **b99-99-02:** beta feedback gate starts day 2 (day 1 free) ([5c55be2](https://github.com/42piratas/hiresling-app/commit/5c55be279988a158db2595ef17b7ce523ce2a840))
  • **b99-99-02:** in-tool daily beta feedback gate ([c7f7c81](https://github.com/42piratas/hiresling-app/commit/c7f7c81e6d3ee555bf533a6876d146b9b2209d1c))
  • **b99-99-02:** in-tool daily beta feedback gate ([dbdccd5](https://github.com/42piratas/hiresling-app/commit/dbdccd563d54e5fdcf8d52a44209c2ef080318eb))
  • **b99-adhoc-apollo-prod-gaps:** apollo contact rewrite, source kill-switches, adzuna depth ([f31c401](https://github.com/42piratas/hiresling-app/commit/f31c401c5e7cc459ca063c414e93a7a7cb13c384))
  • **b99-adhoc-apollo-prod-gaps:** apollo contact rewrite, source kill-switches, adzuna depth ([7c58759](https://github.com/42piratas/hiresling-app/commit/7c58759c9afb3c31b11d4ab01768cbc1ad8f3324))
  • **b99-adhoc-brand-casing:** recase product wordmark to Hiresling.ai ([baffad3](https://github.com/42piratas/hiresling-app/commit/baffad3751d8ee48ebecde07bfc6269fc511c1ab))
  • **b99-adhoc-brand-casing:** recase product wordmark to Hiresling.ai ([141afca](https://github.com/42piratas/hiresling-app/commit/141afcab8a5c20d4791e1e279c283d5e91312e83))
  • **b99-adhoc-comp-allowlist:** comp grant on signup via email allowlist + Unlimited daily cap ([4d26853](https://github.com/42piratas/hiresling-app/commit/4d26853d7579158d49915995a283c209c8508466))
  • **b99-adhoc-comp-allowlist:** comp grant on signup via email allowlist + Unlimited daily cap ([cc02c54](https://github.com/42piratas/hiresling-app/commit/cc02c545107a0b09811f533b69293475dc433755))
  • **b99-discovery-guarantee:** multi-source free-first discovery + always-deliver batch guarantee
  • **b99-renewal-banner:** opt-in renewal default + 5-day countdown banner ([d543397](https://github.com/42piratas/hiresling-app/commit/d54339718311fb23dbc2b4d46c1cbdc31bd41224))
  • **b99-renewal-banner:** opt-in renewal default + 5-day countdown banner ([2a71d4c](https://github.com/42piratas/hiresling-app/commit/2a71d4cd25060093ad20b2046304d158d04d402e))
  • **b99-source-ops:** commercial-safe source lineup + free-plan quota alerts
  • **caps:** lower Pro/Max monthly caps to 200/350 + grandfather mechanism ([368d74c](https://github.com/42piratas/hiresling-app/commit/368d74ccd05e11ad51ea0d601efa61ebedaf768c))
  • **caps:** per-tier LiteLLM monthly AI budget — $12/$17/$27 (B99-99-98 T4) ([16828aa](https://github.com/42piratas/hiresling-app/commit/16828aa3585f5ce85332ef833f7d7e853b3726ae))
  • **caps:** per-tier LiteLLM monthly AI budget $12/$17/$27 (B99-99-98 T4) ([c23df43](https://github.com/42piratas/hiresling-app/commit/c23df434c8948a057d0f4a85f9c0f1a3a647554c))
  • **changelog:** restyle /changelog in onboarding card style ([f91cf05](https://github.com/42piratas/hiresling-app/commit/f91cf058b7ca1c0a2cf1bb283433e8c1a77722c1))
  • **changelog:** restyle /changelog in onboarding card style ([ab8e055](https://github.com/42piratas/hiresling-app/commit/ab8e0555d8a0d3a22c96d2ec9d220f8f9f48b22b))
  • **data-sources:** uniform cap enforcement + per-source cap toggle (B101-05-02) ([65faac7](https://github.com/42piratas/hiresling-app/commit/65faac71c2567fa005b4873eba2be157e98d4d13))
  • **data-sources:** uniform cap enforcement + per-source cap toggle (B101-05-02) ([e4cb733](https://github.com/42piratas/hiresling-app/commit/e4cb733f7b7a95bedda02b4c69bd3583389a7cd4))
  • **i18n:** skill PT/ES translations + search aliases + Settings i18n + hero sentence_10 ([9150928](https://github.com/42piratas/hiresling-app/commit/9150928a604113b771e4d39cf2287dc4ba968923))
  • **i18n:** skill PT/ES translations + search aliases + Settings i18n + hero sentence_10 ([7bb588d](https://github.com/42piratas/hiresling-app/commit/7bb588d3e425e388a5c67a4c213adfc2444ca1df))
  • **legal:** b91-04 phase a — privacy + fit-scoring legal sweep ([#637](https://github.com/42piratas/hiresling-app/issues/637) follow-up)
  • **legal:** b91-04 phase b — terms §6 r1b controller/processor rewrite
  • **matomo:** track staging into idSite=8 + digest renders prod + staging
  • **onboarding:** prefill email-signature with Google account name ([20c5ac7](https://github.com/42piratas/hiresling-app/commit/20c5ac7bde9911c95ac6abe29d8fea6348e64adf))
  • parameterized comp trial tiers (comp_pro_7d) via COMP_TIER_CONFIG ([3696008](https://github.com/42piratas/hiresling-app/commit/36960080ff1acb71070488b96ac36cf2e9820a6a))
  • parameterized comp trial tiers (comp_pro_7d) via COMP_TIER_CONFIG ([232a4da](https://github.com/42piratas/hiresling-app/commit/232a4da8835a6d24eebe25c54c518e6e8404def1))
  • **scripts:** add set-admin + set-beta-tester operator provisioning CLIs ([1700f18](https://github.com/42piratas/hiresling-app/commit/1700f18a151003c7bde870f34e9108efefe49ef7))
  • **scripts:** operator provisioning CLIs (set-admin + set-beta-tester) ([23a74c3](https://github.com/42piratas/hiresling-app/commit/23a74c3ff9e8a49c005f3fb343f9605ae4b936de))
  • **settings:** rewrite Settings panel — referrals, compensation, email, targeting ([5b444ad](https://github.com/42piratas/hiresling-app/commit/5b444ad33f33c844f0a6a4514125c6abfb545001))
  • **settings:** rewrite Settings panel — referrals, compensation, email, targeting ([18da7ee](https://github.com/42piratas/hiresling-app/commit/18da7ee76ca671252fed121d16716adbda47a2e7))
  • **source-caps:** enforce real paid monthly quotas
  • **support:** env-gated CC on Plain email fallback

Bug Fixes

  • add `components/NonceBootstrap.tsx` server component that reads `x-nonce` from headers and renders a server-side `<script nonce={...}>` element. canonical next.js trigger to wire the nonce into `renderToReadableStream`, which stamps the same nonce on every inline framework script next emits for the route. mount in 5 protected layouts (dashboard / admin / onboarding / consent / relanguage). public routes untouched — locale layout stays static (b93-04 t1 ssg posture preserved). matomo + fp inline-hash list stays in protected posture (those scripts render without the nonce attribute by b93-04 t1 design; sha-256 match is correct for them). ([1e78ee6](https://github.com/42piratas/hiresling-app/commit/1e78ee64c70415710913203b55b44219d2add562))
  • add `components/NonceBootstrap.tsx` server component that reads `x-nonce` from headers and renders a server-side `<script nonce={...}>` element. canonical next.js trigger to wire the nonce into `renderToReadableStream`, which stamps the same nonce on every inline framework script next emits for the route. mount in 5 protected layouts (dashboard / admin / onboarding / consent / relanguage). public routes untouched — locale layout stays static (b93-04 t1 ssg posture preserved). matomo + fp inline-hash list stays in protected posture (those scripts render without the nonce attribute by b93-04 t1 design; sha-256 match is correct for them). ([14f4e96](https://github.com/42piratas/hiresling-app/commit/14f4e96960bdba4b8337af93bdc3f134ae3f7ea3))
  • **adhoc-chat-escalated-styling:** drop muted-foreground recolor on escalated messages
  • **adhoc-chat-slack-waituntil:** wrap Slack fire-and-forget in after()
  • **adhoc-fit-modal:** full-breakdown modal canon + cursor + email language
  • adhoc-pt-quality-sweep — apply 39 i18n findings + tone-tiered opt-out
  • **adhoc-support-chat-refund:** bucket billing/refund as escalation
  • **adhoc:** close every browser-console finding from 260520 staging audit
  • **adhoc:** wipe-user prod guard accepts the custom auth domain ([d546063](https://github.com/42piratas/hiresling-app/commit/d546063edfd3048b35ff3d6f866fa0f358b9e502))
  • **adhoc:** wipe-user prod guard accepts the custom auth domain ([3063b18](https://github.com/42piratas/hiresling-app/commit/3063b1844e2126e731913e91b415bd65f62e24fd))
  • **ai-call-worker:** nest cache_control inside content-block
  • **b101-01:** parallelize fit-canary candidate scoring ([9a4a3eb](https://github.com/42piratas/hiresling-app/commit/9a4a3ebc7eb451f1b83fbbaf21c8a11ce715232e))
  • **b101-01:** parallelize fit-canary candidate scoring ([561d7a3](https://github.com/42piratas/hiresling-app/commit/561d7a3190751b45df64082ecb452953632aa041))
  • **b101-04:** free-source health — careerjet retry + direct-HTTP pre-flight liveness ([de481cb](https://github.com/42piratas/hiresling-app/commit/de481cb63340611dc0ad5e72c59e471c31b37721))
  • **b101-04:** free-source health — careerjet retry + direct-HTTP pre-flight liveness (T7) ([de595cc](https://github.com/42piratas/hiresling-app/commit/de595ccb393e69d0397735c99a2cc67dc126fad7))
  • **b101-04:** pre-flight theirstack probe reads authoritative credit-balance ([a79953b](https://github.com/42piratas/hiresling-app/commit/a79953bde547b287ae755e8434c2dfb1474bffbd))
  • **b101-08:** make pipeline_events breadcrumbs throw-proof ([373764c](https://github.com/42piratas/hiresling-app/commit/373764c4b68a7a8ac7b999bef344081f49def0f7))
  • **b101-09:** correct jsearch employment enum + tomba preflight gate ([d8a9252](https://github.com/42piratas/hiresling-app/commit/d8a9252fee30ad55ecb23dab521b61de5e7f816b))
  • **b101-09:** correct jsearch employment enum + tomba preflight gate ([2bd29d5](https://github.com/42piratas/hiresling-app/commit/2bd29d551bccf0df792d68aaf8e27a0ff64a02a0))
  • **b101-09:** correct the 3 SIM behavior assertions (cascade/contact/buffering) ([7b8ef91](https://github.com/42piratas/hiresling-app/commit/7b8ef91e85ad36cc45c56b283dd6556e4665ce6d))
  • **b101-09:** correct the 3 SIM behavior assertions (cascade/contact/buffering) ([ae429ea](https://github.com/42piratas/hiresling-app/commit/ae429ea400ba47c6cd4503974d21480b2bf6e987))
  • **b101-09:** split SIM run-id off batchRunId so user_outreach inserts stop 22P02-ing ([c4c4810](https://github.com/42piratas/hiresling-app/commit/c4c48105e1a7372f0c0889a59398e6a145641bfb))
  • **b101-09:** split SIM run-id off batchRunId so user_outreach inserts stop 22P02-ing ([4b1e16f](https://github.com/42piratas/hiresling-app/commit/4b1e16f3f32a2c95ab4148f8ec8b5d53a0bb31a5))
  • **b101-10:** best_first_delivery assertion checks draft order, not send order ([d5f4ddc](https://github.com/42piratas/hiresling-app/commit/d5f4ddc581a4be7516df9ba7a6f28dbe452450da))
  • **b101-10:** best_first_delivery assertion checks draft order, not send order ([b83035b](https://github.com/42piratas/hiresling-app/commit/b83035b1f1d6643e92910e6c2ff26c4ec01d0a99))
  • **b101-10:** day-1 queued batch uses first-run order (drafts on day 1) ([5cb40ef](https://github.com/42piratas/hiresling-app/commit/5cb40efb87ce1ca42856c09db601e27b5e19f377))
  • **b101-10:** day-1 queued batch uses first-run order so it drafts ([ac256cb](https://github.com/42piratas/hiresling-app/commit/ac256cbcaf6119c91cf69dc7fd1c39ff42d25815))
  • **b101-10:** drop redundant server-only from source-costs so the SIM harness loads ([193d925](https://github.com/42piratas/hiresling-app/commit/193d92565b73ce3f86c0b9f909dba19a29d58502))
  • **b101-10:** preserve outer SIM context through processBatchForUser ([a8d80f4](https://github.com/42piratas/hiresling-app/commit/a8d80f41db10356b2842878b96677a8702b2ef07))
  • **b101-10:** preserve outer SIM context through processBatchForUser ([4c8935d](https://github.com/42piratas/hiresling-app/commit/4c8935d6a91d1ed8b81961343e8ee64646744f60))
  • **b101-10:** raise batch worker maxDuration for cold real first-batch ([629f1b3](https://github.com/42piratas/hiresling-app/commit/629f1b3928b650a01c9970d13fe8dc93a3ee8610))
  • **b101-10:** raise batch worker maxDuration for cold real first-batch ([ac1efed](https://github.com/42piratas/hiresling-app/commit/ac1efed969a6d41a27fea52517790ecef96a1db7))
  • **b101-10:** read sim spend from pipeline_events ledger, not /spend/logs ([1d74933](https://github.com/42piratas/hiresling-app/commit/1d749330f51d1e32c861f002a33bec2f7855b44b))
  • **b101-10:** SIM enablement — harness import + raise internal caps to defer to provider 429 ([5ea03f1](https://github.com/42piratas/hiresling-app/commit/5ea03f102e89db6111e8910468f01ce3dc0c4307))
  • **b101-10:** source-value digest reads the single per-call cost registry ([d095323](https://github.com/42piratas/hiresling-app/commit/d095323cc9a83075ea4405c5f560a9d1e6c593a7))
  • **B101-11:** company-leg yield = net-new inserts, not opening rows ([e438578](https://github.com/42piratas/hiresling-app/commit/e438578173090f5de66a8a384cb5925c7f8b7bb5))
  • **b101-11:** contact finder cost-order — rank dual-purpose apollo by per-call cost ([0f955b6](https://github.com/42piratas/hiresling-app/commit/0f955b6d05bf9a3d273a5dfcffec75d2f6081035))
  • **B101-11:** emit company-leg yield from net-new inserts, not opening rows ([8930c14](https://github.com/42piratas/hiresling-app/commit/8930c1486369421c431c4d6bee28f392187a86ce))
  • **b101-11:** rank contact finders by real per-call cost (dual-purpose apollo) ([49b02e9](https://github.com/42piratas/hiresling-app/commit/49b02e914a0623bfa6befe4f167611ee9046f3eb))
  • **B101-11:** zero rows_new on google_places self-emitted cost row ([c1aca38](https://github.com/42piratas/hiresling-app/commit/c1aca38e3275d67bbf15742ef697d7e4cf2669a2))
  • **B101-11:** zero rows_new on google_places self-emitted cost row ([0845026](https://github.com/42piratas/hiresling-app/commit/08450265715662c2386e3a220e230f88152abe3a))
  • **B101-13:** tag scrape contacts-report total as AI cost ([45aaf50](https://github.com/42piratas/hiresling-app/commit/45aaf5083b4b4969bf15b5376e03a279fb58060b))
  • **B101-13:** tag scrape contacts-report total as AI cost ([504a51c](https://github.com/42piratas/hiresling-app/commit/504a51ca8a57ebed5d9b32ff0341333733ea5e88))
  • **b102-02:** use ASCII apostrophe in IT close-button aria-label
  • **b103-01:** per-source funnel monotonicity + generic_inbox rows_distinct + HTML delivered line ([a85f3bb](https://github.com/42piratas/hiresling-app/commit/a85f3bb8f858df4cb611622a6d4b656dedf49cad))
  • **b103-01:** per-source funnel monotonicity + generic_inbox rows_distinct + HTML delivered line ([8ca30f6](https://github.com/42piratas/hiresling-app/commit/8ca30f629b2c034d8f870af3ef835c6a6df77310))
  • **b91-02-t1:** i18n the two strings the EN walk missed
  • **b91-03:** prune RPC keeps pending drafts in dormant threads
  • **b91-06:** drop orphan placeholder migrations ([b69fe94](https://github.com/42piratas/hiresling-app/commit/b69fe942bf045a1b0c5c5b171833e19d697bd19a))
  • **b91-06:** orphan migration placeholders unblock staging-db-sync ([2712921](https://github.com/42piratas/hiresling-app/commit/2712921e910c526ea9de5355c28fddea8f4cc75f))
  • **b91-06:** t11 max_budget sentinel + migration timestamp collision ([786b32e](https://github.com/42piratas/hiresling-app/commit/786b32ed70ff3fe0b1909e57533da9d0cfc1c0ef))
  • **b91-08:** emit one surface per company in runStagingProspecting
  • **b92-adhoc-csp-pure-nonce:** nonce-thread next bootstrap on protected routes
  • **b92-adhoc-e2e-findings:** 11 backend / a11y / seo fixes from 2026-05-23 e2e batch
  • **b92-adhoc-language-overwrite-fix:** single-writer language column
  • **b93-adhoc-language-picked-at-loop:** remove dashboard gate, stamp at signup, backfill nulls
  • **b93-adhoc-security-review-r8:** full r8 remediation + r7 carryover
  • **b93-adhoc-security-review-r8:** r8-h5 same-class sweep + migration doc fix ([01c599f](https://github.com/42piratas/hiresling-app/commit/01c599fa2d5c5b5c9a6fa7377a4b801913660f53))
  • **b93-adhoc-security-review-r8:** r8-h5 same-class sweep + migration doc fix ([81833ea](https://github.com/42piratas/hiresling-app/commit/81833eac6097373ab494f1491449a1d5a9aa1e79))
  • **b97-01 soak:** lazy-copy legacy contacts → user_contacts + repoint AC2
  • **b98-01:** slack mrkdwn whitespace, full-digest link, recordconsent silent error ([412b83c](https://github.com/42piratas/hiresling-app/commit/412b83c046e9bf65032fcef9f406d9821905c2ae))
  • **b98-02:** clear 3 lint errors blocking ci ([8bf1ad5](https://github.com/42piratas/hiresling-app/commit/8bf1ad5feb1c6e1af6df358af1b6010f45f01a09))
  • **b98-02:** t4.5-2 enrichCompany — coerce null stage + use correct freshness column ([baa3603](https://github.com/42piratas/hiresling-app/commit/baa3603399a85df5c6f32ddb8158b60af3f8f695))
  • **b99-06:** add wss: to prod CSP connect-src for Supabase Realtime ([95647d3](https://github.com/42piratas/hiresling-app/commit/95647d3370d43ffdc59aebdd1257ae52c9dc99a2))
  • **b99-06:** add wss: to prod CSP connect-src for Supabase Realtime ([23a2d0e](https://github.com/42piratas/hiresling-app/commit/23a2d0e34a1daf36d8cd684c89494ea5d6fdfc04))
  • **b99-06:** drop dropped-column write + always-render drafts footer ([48ace30](https://github.com/42piratas/hiresling-app/commit/48ace302b334b0e7bd08018c567de54661508d3e))
  • **b99-06:** drop dropped-column write + always-render drafts footer ([d75b009](https://github.com/42piratas/hiresling-app/commit/d75b009f1b0fd9210c75157809caf86e28198971))
  • **b99-06:** report purgedUsageRows from hourly-batch cron response ([5bcdd9d](https://github.com/42piratas/hiresling-app/commit/5bcdd9d21259c8686670181c812bf194ee617366))
  • **b99-06:** report purgedUsageRows from hourly-batch cron response ([94eaf2e](https://github.com/42piratas/hiresling-app/commit/94eaf2ed7fd410c16329e785724bde1f82848f2d))
  • **b99-06:** update 2 stale test assertions for the prospecting + footer fixes ([582fce2](https://github.com/42piratas/hiresling-app/commit/582fce24359c2d08d251cd91b7e073fbec98b502))
  • **b99-99-03:** buffer readiness probe at depth-1 (contact-cost claw-back pt 2)
  • **b99-discovery:** careerjet api is http-only, not https
  • **b99-renewal-banner:** calendar-day countdown (staging-walk off-by-one) ([36ca8a4](https://github.com/42piratas/hiresling-app/commit/36ca8a4389b4986c99a55a21af35fcf2e9786285))
  • **b99-renewal-banner:** count renewal countdown by calendar day, not elapsed ms ([ee5a597](https://github.com/42piratas/hiresling-app/commit/ee5a597faced3b7d70893b0e74f3661f4371de4f))
  • **b99-review-fixes:** consolidated R9 code/data/security fixes
  • **b99-review-fixes:** sync pnpm-lock.yaml after anthropic-sdk drop
  • **beta:** add point-of-collection privacy notice on /beta intake
  • **changelog:** move theme-light to layout per theme-scope invariant ([1eee32b](https://github.com/42piratas/hiresling-app/commit/1eee32b28a82ba624e22e81e163680b56e82b2fb))
  • **chat-kb:** drop email export path, sync settings/fit-score/pipeline copy ([f0ea1e4](https://github.com/42piratas/hiresling-app/commit/f0ea1e4e95595343191a867b991574becabe53ab))
  • **chat-kb:** drop email export path, sync settings/fit-score/pipeline copy ([f99f78c](https://github.com/42piratas/hiresling-app/commit/f99f78ca0521b1941e0da555ce25d893130b3226))
  • **ci:** wire staging E2E secrets + auto-apply fixture seed via staging-db
  • **comp:** extend users_tier_check to allow comp_pro_7d ([f5b419f](https://github.com/42piratas/hiresling-app/commit/f5b419f1491437a0eb331e0651cbbb1e76e4d330))
  • **comp:** extend users_tier_check to allow comp_pro_7d ([ccb8530](https://github.com/42piratas/hiresling-app/commit/ccb8530d7ad5b4d3b3c26d0bca3cc9dbc21b4f70))
  • **cost-ledger:** units-driven cost + persisted yield + report fidelity ([9f73f79](https://github.com/42piratas/hiresling-app/commit/9f73f792ca3927b3a6dbde15c2fc4ae818550dd1))
  • **cost-ledger:** units-driven cost + persisted yield + report fidelity ([0092214](https://github.com/42piratas/hiresling-app/commit/0092214294d42b9a84516b0e5ded853e0d999154))
  • **dashboard:** adhoc — drafts/activity tabs froze on parent prop reload
  • **dashboard:** drop empty-drafts subtext, keep 'No drafts pending' (B99-99-98) ([1b638c5](https://github.com/42piratas/hiresling-app/commit/1b638c51a575da8a30e6ccb10b2e69a2cb011716))
  • **dashboard:** drop empty-drafts subtext, keep core 'No drafts pending' (B99-99-98) ([365f417](https://github.com/42piratas/hiresling-app/commit/365f417a4da1fab8926e8579927f226b223cae53))
  • **e2e:** align fixture pool count + tolerate 502 on ai routes ([f4cddc4](https://github.com/42piratas/hiresling-app/commit/f4cddc4d3fee941b4ea40897a33c3296ccf81b01))
  • **e2e:** bump t1+t2 timeouts to absorb real pipeline latency
  • **e2e:** excellence path — SSR cookies for vitest + Playwright, fix landing CTA selector
  • **e2e:** mint real user JWT via verifyOtp + add required users.name in AC9 T6
  • **e2e:** per-test timeouts for AI routes + accept 502 from Polar SDK + always-run Playwright
  • **e2e:** poll DB for [T] outreach instead of DOM in B91-08 walk
  • **e2e:** record signup consent + handle orphan auth users in session mint
  • **e2e:** repair stale user shape on every mint + bump batch-completion timeout
  • **e2e:** seed GoTrue token columns on fixture-template auth row
  • **e2e:** set Playwright cookies non-httpOnly so browser Supabase client can read them
  • **e2e:** skip 5 broken Playwright tests with TODO pointing at magic-link flow mismatch
  • **e2e:** skip 7 broken authenticated API tests with TODO pointing at cookie/Bearer mismatch
  • **e2e:** swap fixture-pool spec batch trigger to end-user first-batch route
  • **e2e:** swap t1 batch trigger to end-user first-batch route
  • **email:** adhoc bundle — header mojibake, sample salutation, batch copy, signature spacing
  • **hero:** add APIs sentence, fix PT/ES overflow, drop discovery badges
  • **i18n-smoke:** map locale pt -&gt; pt-br for users.language CHECK ([66e372a](https://github.com/42piratas/hiresling-app/commit/66e372a1f4180641274afbcac95fda87da1caf47))
  • **i18n-smoke:** map locale pt -&gt; pt-br for users.language CHECK ([f20e549](https://github.com/42piratas/hiresling-app/commit/f20e5495f03c1dd7e734cc07af7cc1175bba23df))
  • **i18n-smoke:** scope EN-leak check to multi-word phrases ([329e6d5](https://github.com/42piratas/hiresling-app/commit/329e6d54b0e903770139cdf555fe37ac563ea0c8))
  • **i18n-smoke:** scope EN-leak check to multi-word phrases ([36a2345](https://github.com/42piratas/hiresling-app/commit/36a2345eb716b94f5a43a98d4da0cc68e72682b9))
  • **landing:** adhoc — explainer poster to true first frame
  • **landing:** adhoc — explainer video poster
  • **litellm-digest:** parse real /spend/logs shape (team_id UUID + string spend)
  • **outreach:** widen body_language to 'it', reserve PS budget, guard resume link (B101-04) ([fda87b7](https://github.com/42piratas/hiresling-app/commit/fda87b7cd73f9daeb7bcfb8d7dde1ef1cb2406a8))
  • **outreach:** widen body_language to 'it', reserve PS budget, guard resume link (B101-04) ([3af8e7a](https://github.com/42piratas/hiresling-app/commit/3af8e7a8ae18523baa96a8798cd94f62338c10dd))
  • **plain:** tighten ticket-title prompt so LLM emits a label, not a bot reply
  • **plain:** title-gen via callAI direct + drop meta-ticket cascade
  • **promote:** resolve staging↔main conflicts for [#675](https://github.com/42piratas/hiresling-app/issues/675) promotion ([76a0857](https://github.com/42piratas/hiresling-app/commit/76a0857722bcfe79e5c8ee63d11dc5a89c98971f))
  • **scripts:** set-beta-tester --reset clears pipeline only, not onboarding ([a9bdf25](https://github.com/42piratas/hiresling-app/commit/a9bdf2522311ba0e964660ff8c18f75703306724))
  • **sources:** repair Apollo company-search payload + Snov async domain-email flow (B101-04 bug 2) ([177b36f](https://github.com/42piratas/hiresling-app/commit/177b36fa793801976dc2b8dc314ffebfefb6878b))
  • **typst:** ship linux binary to all batch render routes ([8e35e2f](https://github.com/42piratas/hiresling-app/commit/8e35e2fab63fd601c3c59a95402849a4d048d063))
  • **typst:** ship linux binary to all batch render routes ([52a2fbe](https://github.com/42piratas/hiresling-app/commit/52a2fbe49a4a023b8a0726c139046ad3b0712fec))
  • **usage:** adhoc — checkLimit off-by-one undershoots tier cap by 1
v0.2.02026-04-14

Features

  • SurveyJS onboarding questionnaire replacing Fillout (steps 1–10, EN/PT/ES inline translations)
  • Dashboard onboarding tour (Shepherd.js, 8 steps, completion flag, admin reset)
  • Onboarding tour admin reset button and per-user API endpoint
  • Release notes system — /changelog page, release-please automation, Resend release emails

Bug Fixes

  • Canny feedback widget replaced with Discord Forum Channel escalation path