v0.12.0 — Audit log, session costs, session scope controls, and a rebuilt kortix.com
New
- Audit log — every API request and agent action lands in one centralized audit trail. The app gets a project and session audit explorer; the SDK gets reconstruction filters and client attribution.
- Session costs — one unified cost record per session, and a session cost explorer in billing that shows what each session spent.
- Session scope controls — new sessions can start with an explicit, opt-in scope over connectors and secrets. Agents can require connector profiles, connector profiles carry an authorization strategy, and denied secrets never enter the sandbox. When a required connector is missing, the session prompts to connect it instead of failing.
- Answerable approvals — approval prompts show the full tool arguments, and approval policies match on arguments, not just tool names.
- Automatic session titles — sessions are titled from the first prompt, server-side, on every session-start path.
- Signup lands in a project — new accounts go straight into a working project, with no blocking provisioning step.
- Microsoft Teams (experimental) — Teams is available as a per-project experimental channel.
- Embedding Kortix — per-end-user session caps enforced on create and resume, hardened sandbox isolation between end users, and mid-session re-scoping of secrets and connector bindings.
- New website — kortix.com rebuilt: home page, Solutions, Security, Self-hosted, Integrations, Channels, Automations, About, Careers, and a public /download page. An accuracy sweep removed claims that were not true and corrected public pricing copy.
Improved
- The project Files route opens instantly instead of after 5–6 seconds, session transcripts paint from cache instead of waiting on the sandbox VM, the sidebar no longer flickers on cold load, and older history loads by scrolling.
- Sandboxes have a bounded lifetime that a wedged box cannot escape, and compute is billed against liveness evidence, never wall-clock.
- Billing is one state machine: running out of credits reads as "out of credits", never "no plan"; one credit-debit function with no wallet-floor bypass; Stripe checkout returns work from any route.
- Sessions order by last activity, connector profile creation is atomic, and the icon set moved to Phosphor.
- Managed models group under Kortix in the model picker instead of being split across upstream provider names.
Fixed
- Gateway: Bedrock adaptive thinking and region-prefix normalization, and the correct base path for standalone OpenAI keys.
- A broken sandbox template no longer fails the whole template listing.
- Public file-share links restored across the file and preview surfaces.
- Signup and sign-in redirects can no longer land in a project the user cannot open.
- Opening a session with history no longer shows an empty new-session shell, and triggers show as active when they are active.
- CLI: private and self-hosted API hosts are no longer forced to https, and IPv6 hosts classify correctly.
- Every /docs route returned 500 after an icon namespace crossed the RSC boundary.
- Closed public SSH/RDP exposure on a network ACL and added an audit that keeps it closed.
What's Changed
- feat(sessions): generate session titles from the first prompt via the gateway by @markokraemer in #5733
- chore(dev-eks): deploy dev-5db7502b [skip ci] by @github-actions[bot] in #5734
- fix(sessions): title with the live picked model, not the stale opencode_model by @markokraemer in #5735
- chore(dev-eks): deploy dev-6b695ee4 [skip ci] by @github-actions[bot] in #5736
- fix(web): stop ambient voice transcript polling by @markokraemer in #5738
- refactor(sessions): one title path — delete the OpenCode title machinery by @markokraemer in #5739
- chore(dev-eks): deploy dev-efdb77c5 [skip ci] by @github-actions[bot] in #5740
- fix(prod): preserve API deployment selector by @markokraemer in #5737
- fix(web): remove session voice transcript tab by @markokraemer in #5742
- feat(models): per-project model enablement, gateway-enforced (backend) by @markokraemer in #5743
- chore(dev-eks): deploy gateway dev-6e0f8cf0 [skip ci] by @github-actions[bot] in #5744
- chore(dev-eks): deploy dev-6e0f8cf0 [skip ci] by @github-actions[bot] in #5745
- fix(release): block mismatched production Supabase auth by @markokraemer in #5747
- feat(models): wire the model-enablement UI to the server (Manage models + picker) by @markokraemer in #5746
- chore(dev-eks): deploy dev-d248b8ce [skip ci] by @github-actions[bot] in #5748
- fix(release): carry production Supabase guard to staging by @markokraemer in #5750
- feat(acp): add project-gated multi-harness runtime by @markokraemer in #5749
- chore(dev-eks): deploy gateway dev-239cda8a [skip ci] by @github-actions[bot] in #5752
- chore(dev-eks): deploy dev-239cda8a [skip ci] by @github-actions[bot] in #5753
- fix(web): restore public share links across the file and preview surfaces by @markokraemer in #5751
- chore(dev-eks): deploy dev-8e86e27d [skip ci] by @github-actions[bot] in #5754
- fix(security): close public SSH/RDP exposure on the us-east-2 ACL and prevent its return by @markokraemer in #5755
- test(ke2e): cover the public file-share branch in SESS-13 by @markokraemer in #5756
- fix(security): make the NACL admin-port audit actually run by @markokraemer in #5757
- fix(acp): refresh ingress credentials after restart by @markokraemer in #5759
- chore(dev-eks): deploy dev-35d4063c [skip ci] by @github-actions[bot] in #5761
- fix(ci): make drift detection actually run by @markokraemer in #5760
- docs(sdk): record deployed multi-harness proof by @markokraemer in #5762
- fix(ci): give drift detection the Cloudflare token it needs to plan by @markokraemer in #5763
- feat(onboarding): land every signup directly in a project, with no blocking provision by @markokraemer in #5758
- revert(session-chat): restore the pre-v0.11 transcript rendering by @markokraemer in #5764
- fix(ci): supply cloudflare_zone_id to the drift plan by @markokraemer in #5765
- fix(ci): scope drift detection to roots CI can actually plan by @markokraemer in #5766
- fix(onboarding): bind the remembered-project cookie to its owner by @markokraemer in #5767
- docs(acp): make Kortix multi-harness documentation complete by @markokraemer in #5768
- chore(dev-eks): deploy dev-3b3992fb [skip ci] by @github-actions[bot] in #5769
- refactor(infra): make Terraform the source of truth for the ECS envs by @markokraemer in #5771
- Slim the Kortix Starter to a 10-skill artifact floor by @markokraemer in #5770
- Start only the selected ACP harness and persist boot benchmarks by @markokraemer in #5772
- docs(compliance): record the open critical IaC finding on the audit role by @markokraemer in #5773
- chore(dev-eks): deploy gateway dev-81486b61 [skip ci] by @github-actions[bot] in #5775
- docs(sdk): record multi-harness docs deployment by @markokraemer in #5774
- chore(dev-eks): deploy dev-7935cd93 [skip ci] by @github-actions[bot] in #5777
- Repair marketplace tests missed by the starter slim-down by @markokraemer in #5776
- fix(infra): capture the Cloudflare zone id so plans stop proposing DNS churn by @markokraemer in #5778
- refactor(billing): make Stripe returns route-independent, delete the dead modal chain by @markokraemer in #5779
- docs(runtime): record live dev Pi latency proof by @markokraemer in #5781
- chore(security): adopt the last unmanaged IAM roles, retire the dead ones by @markokraemer in #5782
- ci: cover the ECS environments in drift detection by @markokraemer in #5783
- fix(models): one answer for "which models does this project offer" by @markokraemer in #5780
- feat(web): use harness favicons in agent selectors by @markokraemer in #5784
- chore(sdk): record BillingState in the type-surface snapshot by @markokraemer in #5786
- fix(models): never prune a managed or configured model from the default set by @markokraemer in #5785
- fix(db): restore dev migration order by @markokraemer in #5787
- chore(dev-eks): deploy dev-d55c0bb0 [skip ci] by @github-actions[bot] in #5788
- chore(dev-eks): deploy dev-16e14971 [skip ci] by @github-actions[bot] in #5789
- chore(dev-eks): deploy gateway dev-c59a9181 [skip ci] by @github-actions[bot] in #5790
- chore(dev-eks): deploy dev-c59a9181 [skip ci] by @github-actions[bot] in #5791
- docs: per-project model enablement, backend.mdx error table + wording by @agent-kortix in #5794
- feat(secrets): wire the delivery chokepoint — a denied secret never enters the sandbox by @Ino-Bagaric in #5793
- chore(dev-eks): deploy dev-ed342859 [skip ci] by @github-actions[bot] in #5796
- feat(whitelabel-demo): make every KaaB capability testable from the UI by @Ino-Bagaric in #5795
- fix(kaab): a sandbox may not enumerate other end-users' connector profiles by @Ino-Bagaric in #5797
- chore(dev-eks): deploy dev-efa9ef71 [skip ci] by @github-actions[bot] in #5799
- fix(kaab): enforce the per-end-user session cap on resume, not just create by @Ino-Bagaric in #5798
- chore(dev-eks): deploy dev-9a6a8b25 [skip ci] by @github-actions[bot] in #5800
- feat(whitelabel-demo): bottom scope bar + live API-call snippets by @Ino-Bagaric in #5801
- docs(kaab): END_USER_REF_CONFLICT is a 400, and pin it with a test by @Ino-Bagaric in #5802
- chore(dev-eks): deploy dev-47b9add5 [skip ci] by @github-actions[bot] in #5803
- fix(kaab): prove the WebSocket isolation, add the mode badge and runtime_context by @Ino-Bagaric in #5804
- chore(dev-eks): deploy dev-3998a94d [skip ci] by @github-actions[bot] in #5805
- feat(whitelabel-demo): gated import of existing account projects by @Ino-Bagaric in #5806
- feat(whitelabel-demo): syntax-highlight snippets + cover every KaaB call by @Ino-Bagaric in #5807
- feat(kaab): re-scope a running session's secrets and connector bindings by @Ino-Bagaric in #5808
- chore(dev-eks): deploy dev-51da6740 [skip ci] by @github-actions[bot] in #5809
- feat(kaab): mid-session re-scope in the demo, SDK method, and docs by @Ino-Bagaric in #5810
- fix(web): drop Safari generic SecurityError noise (BS 4 patterns, post-v0.11.0) by @agent-kortix in #5811
- fix(auth): never return sign-in to projects list by @markokraemer in #5814
- test(ke2e): cover PUT model-enablement route + regen manifest to 527 by @agent-kortix in #5792
- fix(web): make the sidebar Review pill actually open the Review inbox by @markokraemer in #5815
- fix(models): lock the default row, refresh without a reload, set the default inline by @markokraemer in #5813
- fix(web): order reused sessions by last activity by @markokraemer in #5816
- chore(dev-eks): deploy dev-61910424 [skip ci] by @github-actions[bot] in #5817
- docs(perf): preserve session-start evidence and stateful target by @markokraemer in #5818
- fix(auth): never send a signup to a project it cannot open by @markokraemer in #5819
- fix(whitelabel-demo): actually let the scope bar re-scope this session by @Ino-Bagaric in #5820
- feat(acp): add complete multi-harness starter and auth UX by @markokraemer in #5821
- chore(dev-eks): deploy dev-452948e8 [skip ci] by @github-actions[bot] in #5824
- docs(perf): record Platinum repository-image A/B by @markokraemer in #5822
- chore(dev-eks): deploy gateway dev-22e9259b [skip ci] by @github-actions[bot] in #5826
- fix(whitelabel-demo): call the re-scope hook unconditionally by @Ino-Bagaric in #5825
- chore(dev-eks): deploy dev-22e9259b [skip ci] by @github-actions[bot] in #5827
- chore(dev-eks): deploy gateway dev-d703d0e9 [skip ci] by @github-actions[bot] in #5828
- chore(dev-eks): deploy dev-d703d0e9 [skip ci] by @github-actions[bot] in #5830
- fix(whitelabel-demo): un-gate the scope editors that 'changeable' switched off by @Ino-Bagaric in #5829
- fix(acp): exempt harness turns from request deadline by @markokraemer in #5831
- chore(dev-eks): deploy dev-dfa2070d [skip ci] by @github-actions[bot] in #5832
- fix(sessions): converge every session-start path on server-side titling by @markokraemer in #5834
- chore(dev-eks): deploy dev-41d62c4f [skip ci] by @github-actions[bot] in #5836
- fix(web): stop the project sidebar flickering on cold load by @markokraemer in #5835
- fix: reject terminal soft-rate completions by @markokraemer in #5840
- fix(session): paint the transcript from cache instead of waiting on a VM by @markokraemer in #5837
- Recover conflicted changes with an agent by @markokraemer in #5839
- chore(dev-eks): deploy gateway dev-ae00d2ac [skip ci] by @github-actions[bot] in #5841
- chore(dev-eks): deploy dev-ae00d2ac [skip ci] by @github-actions[bot] in #5843
- feat(projects): make the default starter multi-harness by @markokraemer in #5842
- chore(dev-eks): deploy dev-a7038f49 [skip ci] by @github-actions[bot] in #5844
- fix(sdk): isolate preassigned OpenCode session state by @markokraemer in #5846
- chore(dev-eks): deploy dev-7a7bb4f1 [skip ci] by @github-actions[bot] in #5847
- fix(sdk): honor inherited OpenCode session defaults by @markokraemer in #5848
- chore(dev-eks): deploy dev-d6979ad9 [skip ci] by @github-actions[bot] in #5849
- docs(sdk): record inherited session delivery by @markokraemer in #5850
- chore(dev-eks): deploy dev-9a226118 [skip ci] by @github-actions[bot] in #5851
- fix(web): show triggers as active when they are active by @markokraemer in #5853
- fix(gateway): require zero usage for soft rate limits by @markokraemer in #5852
- chore(dev-eks): deploy gateway dev-0c27d730 [skip ci] by @github-actions[bot] in #5854
- chore(dev-eks): deploy dev-0c27d730 [skip ci] by @github-actions[bot] in #5856
- refactor(session): load older history by scrolling, not by clicking by @markokraemer in #5855
- ci(api): actually run the kortix-api suite on pull requests by @markokraemer in #5838
- fix(sandbox): derive the sandbox alert from live provider state, not the build log by @markokraemer in #5858
- chore(dev-eks): deploy dev-1949db07 [skip ci] by @github-actions[bot] in #5860
- fix(session): stop a session with history opening on the empty new-session shell by @markokraemer in #5857
- fix(executor): accept canonical dotted tool references by @markokraemer in #5859
- chore(dev-eks): deploy dev-31391b4b [skip ci] by @github-actions[bot] in #5861
- test(api): stop partial module mocks from killing whole test files by @markokraemer in #5863
- chore(dev-eks): deploy dev-d6413c2f [skip ci] by @github-actions[bot] in #5865
- feat(executor): make approvals answerable and enforce policy on arguments by @markokraemer in #5862
- fix(snapshots): attest sandbox CLI artifacts by @markokraemer in #5867
- chore(dev-eks): deploy gateway dev-4bc30619 [skip ci] by @github-actions[bot] in #5868
- fix(sandbox): bound sandbox lifetime — delete three self-granted vetoes, add one column the box cannot forge by @markokraemer in #5845
- test(api): retarget slash-command + manifest tests at the shipped design by @markokraemer in #5864
- fix(billing): one credit debit function, no floor bypass for unpaid subs, seat allowance not seat price by @markokraemer in #5869
- feat: add connector profile authorization and session costs by @Ino-Bagaric in #5872
- fix: repair dev migration order by @Ino-Bagaric in #5873
- chore(dev-eks): deploy dev-95c1e0ea [skip ci] by @github-actions[bot] in #5874
- fix: refresh session governance before provisioning by @Ino-Bagaric in #5878
- chore(dev-eks): deploy dev-37ce0d58 [skip ci] by @github-actions[bot] in #5879
- fix(api): fail closed for required connector profiles by @Ino-Bagaric in #5882
- chore(dev-eks): deploy dev-3f4fe600 [skip ci] by @github-actions[bot] in #5883
- perf(web): make the project Files route open instantly instead of after 5–6s by @sutharjay1 in #5881
- fix(api): support agent scope for version 3 manifests by @Ino-Bagaric in #5884
- chore(dev-eks): deploy dev-c88c94ea [skip ci] by @github-actions[bot] in #5885
- Migrate icon library to Phosphor icons by @sutharjay1 in #5386
- chore(dev-eks): deploy gateway dev-98e5fd0a [skip ci] by @github-actions[bot] in #5886
- chore(dev-eks): deploy dev-98e5fd0a [skip ci] by @github-actions[bot] in #5887
- fix(whitelabel): use project connection terminology by @Ino-Bagaric in #5888
- fix(web): make sidebar docking instant instead of a 200ms layout morph by @sutharjay1 in #5890
- content(blog): expand beyond-the-chat-box -- add unique section + outbound links by @agent-kortix in #5889
- fix(whitelabel): preserve session list shape in mock by @Ino-Bagaric in #5891
- chore(connectors): align project connection terminology by @Ino-Bagaric in #5892
- chore(dev-eks): deploy dev-536cccf1 [skip ci] by @github-actions[bot] in #5893
- fix: suppress wallet-extension inpage.js 'No error message' noise (pattern 61949432...) by @agent-kortix in #5894
- fix: restore OpenCode REST + kortix.yaml v2 as the default runtime, and a session-runtime bug bash by @markokraemer in #5870
- chore(dev-eks): deploy gateway dev-890095d6 [skip ci] by @github-actions[bot] in #5895
- chore(dev-eks): deploy dev-29bac7e1 [skip ci] by @github-actions[bot] in #5897
- Restore CLI SDK and API contract CI gates by @Ino-Bagaric in #5899
- chore(dev-eks): deploy dev-2cfff1e4 [skip ci] by @github-actions[bot] in #5900
- feat(web): generate connector profile slugs from names by @Ino-Bagaric in #5896
- Remove ACP and multi-harness runtime; restore OpenCode REST by @markokraemer in #5901
- chore(dev-eks): deploy gateway dev-5dc989f9 [skip ci] by @github-actions[bot] in #5902
- Fix ACP removal migration ordering by @markokraemer in #5903
- chore(dev-eks): deploy gateway dev-e4052cca [skip ci] by @github-actions[bot] in #5904
- chore(dev-eks): deploy dev-e4052cca [skip ci] by @github-actions[bot] in #5905
- Serve Roobert from one variable font and fix monospace alignment by @sutharjay1 in #5898
- fix(cli): don't force https on private hosts — self-host reaches its API over container names and LAN addresses by @Leonxu6 in #5876
- chore(dev-eks): deploy dev-b5ab22b0 [skip ci] by @github-actions[bot] in #5907
- fix(web): break the async import cycle between file-source and the project-files barrel by @Leonxu6 in #5880
- fix(sdk): keep the session boot poll running while the tab is in the background by @Leonxu6 in #5875
- chore(dev-eks): deploy dev-72797256 [skip ci] by @github-actions[bot] in #5909
- feat(teams): Teams is a per-project experimental feature, not a server env var by @markokraemer in #5908
- chore(dev-eks): deploy dev-1647c2ee [skip ci] by @github-actions[bot] in #5910
- fix(web): in-product CLI install command targets the deployment, not kortix.com by @Leonxu6 in #5877
- refactor(web): Easy panel fit & session info by @sutharjay1 in #5906
- feat(web): /a1o — standalone die that rolls the Kortix stack by @markokraemer in #5911
- chore(dev-eks): deploy gateway dev-b631bd9a [skip ci] by @github-actions[bot] in #5912
- chore(dev-eks): deploy dev-b631bd9a [skip ci] by @github-actions[bot] in #5913
- fix(api): gracefully skip broken sandbox templates instead of failing the full listing by @agent-kortix in #5915
- chore(dev-eks): deploy dev-d5f531f9 [skip ci] by @github-actions[bot] in #5916
- fix: suppress injectedScript.bundle.js sendMessage noise from browser extensions by @agent-kortix in #5914
- Marketing site rebuild, and a sweep of claims that were not true by @markokraemer in #5917
- test(ke2e): cover audit actor/resource/date-range/search/cursor/limit filters by @agent-kortix in #5481
- test(ke2e): prove project-scoped PAT cross-project WRITE boundary (TOK-5) by @agent-kortix in #5349
- Product showcase in both themes, and 2.76 MiB lighter by @markokraemer in #5919
- Preserve hydrated session content after runtime lookup misses by @Ino-Bagaric in #5920
- Improve session access scope selection by @Ino-Bagaric in #5921
- fix(connectors): lock the authorization owner after creation by @Ino-Bagaric in #5922
- feat(connectors): read-only authorization owner instead of a dead select by @Ino-Bagaric in #5924
- feat(audit): centralize reconstructable system activity by @Ino-Bagaric in #5925
- chore(dev-eks): deploy dev-9b82d8f1 [skip ci] by @github-actions[bot] in #5926
- fix(gateway): Bedrock adaptive thinking + region-prefix normalization by @markokraemer in #5927
- fix: all managed models group under Kortix in the picker, not Anthropic/DeepSeek by @agent-kortix in #5918
- feat(web): add a public /download page by @sutharjay1 in #5923
- chore(dev-eks): deploy gateway dev-be2690a5 [skip ci] by @github-actions[bot] in #5930
- chore(dev-eks): deploy dev-be2690a5 [skip ci] by @github-actions[bot] in #5931
- chore(release): promote current main to staging by @markokraemer in #5929
- Improve audit event labels and details by @Ino-Bagaric in #5928
- fix(tests): drop leftover public routines in db-reset so re-apply matches a fresh DB by @markokraemer in #5933
- revert(models): remove server-side per-project model enablement by @markokraemer in #5932
- chore(dev-eks): deploy gateway dev-6c168ee2 [skip ci] by @github-actions[bot] in #5936
- chore(dev-eks): deploy dev-6c168ee2 [skip ci] by @github-actions[bot] in #5937
- chore(release): promote main to staging — db-reset harness fix by @markokraemer in #5934
- chore(dev-eks): deploy gateway dev-58065906 [skip ci] by @github-actions[bot] in #5938
- chore(dev-eks): deploy dev-58065906 [skip ci] by @github-actions[bot] in #5939
- KaaB: prompt to connect a required connector instead of failing blind by @Ino-Bagaric in #5935
- chore(release): promote current main to staging by @markokraemer in #5942
- chore(dev-eks): deploy dev-b1b33ff8 [skip ci] by @github-actions[bot] in #5943
- Reorder the user menu, make Theme a submenu, drop the destructive dropdown variant by @sutharjay1 in #5941
- Merge main into staging — user menu reorder (#5941) by @sutharjay1 in #5945
- Allow agent switches within one session by @markokraemer in #5946
- chore(dev-eks): deploy dev-5606d63a [skip ci] by @github-actions[bot] in #5947
- fix(db,ke2e): unblock the v0.12.0 release gate — credit grant 42501 + database-only session fixture by @markokraemer in #5948
- chore(dev-eks): deploy dev-1fff69b1 [skip ci] by @github-actions[bot] in #5951
- chore(release): promote main to staging — v0.12.0 gate unblock by @markokraemer in #5950
- fix(ke2e): AUD-5 360s budget; COVD-1 manifest-read retry by @markokraemer in #5953
- chore(release): promote main to staging — final gate fixes (AUD-5, COVD-1) by @markokraemer in #5954
- Release v0.12.0 — Audit log, session costs, session scope controls, and a rebuilt kortix.com by @github-actions[bot] in #5955
New Contributors
Full Changelog: v0.11.0...v0.12.0