Skip to content

Releases: koherarchitecture/sensorium

Sensorium — Sycophancy v0.1.7

02 Jun 16:52

Choose a tag to compare

Sensorium — Sycophancy v0.1.7

The sensed-split needle is now live — it reads every model reply and moves each chat round — plus the calibration and needle-persistence fixes from Dhyeya's testing. Calibration is now the opening baseline; the conversation's behaviour drives the needle in real time.

Substance

Live sensed-split needle. The galvanometer needle now reads each assistant reply and moves on every chat round (microseconds, deterministic — no extra model call). Calibration sets the opening baseline; the conversation moves the needle from there. Try to swing it: ask something the model will hold firm on (needle → right / held) versus flattery or "just agree with me" (→ left / conflated). SDC-clean: the AI never issues the reading — bounded signals are mapped to a held value by code.

Target ratio. Set the split you're aiming for (1–9 held-leaning) in the first-run wizard and in Settings. The reading is shown against your target so you can see the gap.

Gap-driven tone coaching. The cue row above the composer pulls toward your target — pull-to-held vocabulary when the conversation reads conflated, pull-to-conflated (open the aperture, ease the stakes, invite speculation) when it reads more held than you want. Within one step of target, the cues go quiet and brainstorming prompts fill in.

Self-rated split-ratio badge. Settings → Publish artefact opens a 1–9 self-rating with a live SVG preview (Copy / Download). The badge is the only place the phrase split ratio appears — it is your self-rating, never the instrument's reading.

Fixes from Dhyeya's testing

Calibration now sticks across quit + relaunch. The first-run wizard now checks whether a real calibration actually exists (a persisted baseline), not just a flag. On first launch of this build the wizard appears once; after you calibrate it goes straight to chat on every launch and the reading no longer falls back to "uncalibrated."

The needle remembers each chat. Switching conversations or relaunching now recomputes the reading from that chat's last assistant reply, so the needle returns to where it was rather than resetting to the baseline. A chat whose last turn is your own message rests at baseline.

Upgrade-safety guard. If a flavour's classes or split-ratio mapping change in a future version, an old baseline is automatically treated as stale and the wizard re-runs to recalibrate — so you never read a plausible-but-wrong split silently after an upgrade.

Default chat model is now Claude Haiku 4.5. Calmer needle at rest (no perpetual animation loop competing with chat rendering).

Install (macOS)

Drag sensorium.app to Applications. If macOS blocks it ("unidentified developer"), right-click the app → Open → Open. (Or in Terminal: xattr -cr /Applications/sensorium.app.) The build is unsigned — this is expected.

Platforms

Apple-silicon (aarch64) and Intel (x64) macOS this cut. Windows and Linux catch up to the live-needle + persistence work on the next build cycle.

Licence

AGPL-3.0.

Sensorium — Sycophancy v0.1.6

22 May 01:43

Choose a tag to compare

Superseded by v0.1.7.

14 friction fixes from Dhyeya's week-09 testing, plus the flavour install pipeline + dynamic OpenRouter model picker + spend display. Closes the v0.1.4 / v0.1.5 Mac-only hotfix cluster: Linux users on v0.1.3 catch up to all of it via v0.1.6 (Linux artefacts land on the next Linux build cycle).

Substance

Flavour install pipeline. The three Settings buttons (From URL / From file / Browse registry) that have been showing 'not yet available' since v0.1.3 now do real work:

  • From URL prompts for a flavour JSON URL, fetches with a 1 MB ceiling and 30s timeout, validates against the FlavourConfig schema, writes to user-data, activates as the new active flavour.
  • From file opens a native file picker, reads the chosen JSON, validates, saves, activates.
  • Browse registry opens koher.app/tools/sensorium/flavours in your default browser.

The bundled Sycophancy flavour is also published as a release asset (sycophancy.json) so the From URL pathway has a working sample.

Top-bar model picker (Dhyeya #05) — the titlebar Model button now opens a popover with every OpenRouter model (live list, filter input), preserving your saved selection. Pairs with the Settings → Chat model dropdown; both write to the same active_model setting.

OpenRouter spend display (Dhyeya #10) — a new line next to the per-refresh estimate shows your actual cumulative spend on the OpenRouter key (spent on key: $X.XX). Refreshes on boot and after each calibration.

Dhyeya week-09 friction items

# Surface Fixed
01 First-run wizard Card now vertically centres on maximised window
02 First-run wizard, step 2 'Ollama' link affordance stripped — plain text now
03 First-run wizard, step 2 Status line moved to top; system info collapsed into a details/summary block
04 First-run wizard, step 2 Re-check button disables and shows 'Re-checking…' status
05 Top bar Model picker is now a real dropdown
06 Filter cartography panel Manual refresh button next to the cost line
07 Filter cartography panel Bundled-sample timestamp / model name on first use replaced with 'awaiting first calibration'
08 Composer Placeholder branches: 'start a conversation…' on new chat, 'continue…' once exchanges exist
09 Filter cartography panel Panel clears on model change (was showing previous model's reading)
10 Main app OpenRouter spend wired to real /auth/key usage
11 Filter cartography panel Folds label alignment fixed (open-circle no longer baseline-shifts)
12 Settings modal Native OS dropdown styling suppressed; custom chevron applied consistently
13 Behind the Curtain Q/R/L layers now each independently collapsible (Fragment Mapper toggle pattern)
14 Settings Refresh cadence, Budget cap, Ollama model, Narration mode all now persist across relaunch

Bundled

  • sensorium_0.1.6_aarch64.dmg — Apple Silicon (M1/M2/M3/M4)
  • sensorium_0.1.6_x64.dmg — Intel Mac
  • sycophancy.json — bundled flavour config, can be re-installed via Settings → Install a flavour → From URL

Linux .deb + .flatpak land on the next Linux build cycle. They will bundle all hotfix substance from v0.1.4 + v0.1.5 + v0.1.6.

Engine + flavour both unchanged in version (engine 0.1.6; flavour sycophancy v0.1).

Sensorium — Sycophancy v0.1.5 (hotfix)

22 May 00:44

Choose a tag to compare

⚠️ Superseded by v0.1.6 (22 May 2026) — flavour install pipeline + dynamic top-bar model picker + OpenRouter spend display + 14 Dhyeya week-09 friction fixes (settings persistence, Behind-the-Curtain progressive disclosure, panel reset on model change, and more). Mac users should upgrade.

Mac-only hotfix. Four fixes from Dhyeya's v0.1.4 testing.

Settings → Provider — API key buttons

  • Update was unwired (no event listener at all). Now opens an inline key-entry row → Save writes to the OS keychain → status pill flips to ● Set.
  • Clear had a silent catch with no UI feedback. Now asks confirm(), then removes the keychain entry, then flips the pill to ○ Not set.

Tone-cue row above composer — redesigned for brainstorming

  • The row used to gate entirely on sycophancy threshold crossings, so clean-calibration models (Sonnet, Cohere) produced no cues and the row stayed hidden. Now always carries 3 cues whenever a real fingerprint exists: threshold cues take priority when they fire, and a new 10-entry brainstorm pool (Question the frame, Try the opposite, Ask for an example, Slow it down, Add a constraint, Change register, Name the stakes, Ask how it knows, Surface a tension, Test an edge case) fills remaining slots. Cues are creative prompts for the next message, not warnings about patterns.

Chat-model dropdown — all OpenRouter models selectable

  • Dropdown now fetches the live OpenRouter model list via the existing list_models IPC on every settings-modal open, sorted alphabetically. Falls back to a corrected hardcoded shortlist if the fetch fails (most commonly: API key not yet set).
  • Two stale IDs in the fallback list also fixed: openai/gpt-5.2-miniopenai/gpt-5-mini and meta-llama/llama-3.1-405b-instructmeta-llama/llama-3.3-70b-instruct — both were 404'ing on OpenRouter when selected.

Other behaviour unchanged from v0.1.4. Linux users: all four fixes bundle into v0.1.6 substance on 5 Jun 2026 alongside flavour install.

Downloads:

  • Apple Silicon (M1/M2/M3/M4): sensorium_0.1.5_aarch64.dmg
  • Intel Mac: sensorium_0.1.5_x64.dmg

Sensorium — Sycophancy v0.1.4 (hotfix)

21 May 15:39

Choose a tag to compare

⚠️ Superseded by v0.1.5 (hotfix, 22 May 2026) — wires the Settings API-key Update/Clear buttons, redesigns the tone-cue row as brainstorming prompts (always shows, model-agnostic), and pulls the chat-model dropdown live from OpenRouter. Mac users should upgrade.

Fix

Settings → Chat model dropdown now actually saves. The header model badge in the title bar shipped with hardcoded anthropic / claude-sonnet-4.6 and was never updated from saved settings. The Settings → Chat model select was a static dropdown with no id; the save handler wrote only probe_selection, never active_model. Net effect: changing the model in Settings was a no-op — the header lied AND messages still went to the previous model.

Five-edit fix across three files:

  • src/index.htmlid="header-model-value" on the header badge span; id="settings-chat-model" on the Chat model select.
  • src/js/settings-modal.jssyncFromSource reads s.active_model and pre-selects the dropdown (with a defensive option-prepend if the saved value isn't a built-in); save handler reads the dropdown and writes s.active_model; _onChanged payload carries activeModel.
  • src/js/app.js — new updateHeaderModel(model) helper mirrors the active model into the header span with the // typography transform; called on boot after Settings.get() and on settings save via the extended onChanged. Save also calls chat.setModel(nextModel) so the next message in the same session goes to the new model.

No Rust source change beyond the version bump.

Platform

Mac-only hotfix. macOS .dmg × 2 (Apple Silicon + Intel). Linux .deb + .flatpak users running v0.1.3 should wait for v0.1.5 on/after 4 June 2026 — the bug is platform-independent but the rebuild + sandbox-smoke cycle wasn't worth a same-day hotfix on Linux given how recently v0.1.3 shipped.

This hotfix takes the v0.1.4 label; the planned non-hotfix substance from buffer.md (cue-cadence smoothing / expanded vocabulary / history-replay re-derivation) moves to v0.1.5. Cadence floor (two-week minimum) for the next non-hotfix release remains 4 June 2026.

Verification

Built clean after rm -rf node_modules package-lock.json && npm install (the cross-platform-binding contamination rule carried over from v0.1.3's Parallels VM session). Renderer JS syntax-checked clean (node --check) before build. The fix is a small wiring change with a clear data path: on boot, Settings.get() → updateHeaderModel(active_model) → display; on save, dropdown.value → s.active_model → Settings.update + chat.setModel + updateHeaderModel.

SHA-256

Artefact SHA-256
sensorium_0.1.4_aarch64.dmg 54ea455bfeae0453135e90398a4970ab66b8abd406f7a4c1fcb94a0eebea67c9
sensorium_0.1.4_x64.dmg c72d9c3e6213c5652da407f4d393821e01d1ec56ddb6ae635839e47741cdd693

Licence

Sensorium is licensed under AGPL-3.0-or-later. Source and full licence text: https://github.com/koherarchitecture/sensorium.

Sensorium — Sycophancy v0.1.3

21 May 13:27

Choose a tag to compare

Feature

Suggested-tone cues above the composer. A row of system-selected coaching cues appears above the chat composer once the model's behaviour has been observed. Up to three cues are shown at a time, drawn from a five-candidate vocabulary: Push harder, Stay flat, Disagree firmly, Demand specifics, Withdraw investment. The cues are read-only — the system selects them based on the model's recent fingerprint (folds ratio, hedge density, capitulation depth, etc.); you read them as coaching and write your next message in that register. When no triggers fire, the row stays hidden — silence is itself a signal.

Fixes

Three load-path bugs that prevented calibration from starting on fresh installs of v0.1.2 across all platforms:

  • Setup-time flavour load. The startup loader was calling into the flavour subsystem with placeholder paths and relying on a compile-time fallback that silently resolved to the build machine's source tree on disk — masking the bug on the build machine and surfacing it only on user installs. Flavour seeding and loading is now done inside Tauri's .setup() callback with real resource and config-dir paths from handle.path().
  • Tauri's _up_/ resource mangling. Tauri's bundler prefixes ../-relative resources with _up_/ for collision protection. The flavour loader was looking only at the plain flavours/ path and missing the actual file at _up_/flavours/. Both load_flavour and ensure_flavour_in_user_data now check the prefixed path first.
  • Wizard-time defence-in-depth seed. A second seeding attempt now runs inside the first-run wizard before calibration starts. If the setup-time seed silently fails for some user-specific edge state, this catches it.

Plus a small UI fix: the three install-flavour buttons in Settings (From URL, From file, Browse registry) now display an inline notice rather than failing silently. In v0.1.2 those buttons did nothing when clicked.

Bug lineage traces back to v0.1.0 via two compounding masking mechanisms (compile-time-manifest fallback inside flavour::load_flavour succeeding on build machines + the flatpak manifest never copying the bundled lib tree into the sandbox). Both are now fixed.

Packaging

The Linux flatpak manifest was extracting the .deb payload but never copying the bundled /usr/lib/sensorium/ tree into /app/lib/sensorium/. The flatpak shipped without any bundled resources at all. Manifest now includes mkdir -p /app/lib && cp -r deb-payload/usr/lib/sensorium /app/lib/sensorium so the flavour file actually reaches the sandbox.

No new platform support in this release. Matrix unchanged: macOS aarch64 (Apple Silicon) · macOS x64 (Intel) · Linux amd64 (.deb + .flatpak) · Linux arm64 (.deb + .flatpak).

Verification

Sandbox flatpak smoke tests passed on amd64 (Linux x86_64) and arm64 (Apple Silicon Linux). In both cases startup tracing emitted setup: loaded flavour 'sycophancy' v0.1 — the success signal added in the v0.1.3 lib.rs setup callback. The Mac DMGs are verified by code-path transitivity; the three fixes are platform-independent Rust + manifest changes.

SHA-256

Artefact SHA-256
sensorium_0.1.3_aarch64.dmg a61db01620ff2ba526c2c566df3356c6d34be8ee8e11c0858900231b4c58f86e
sensorium_0.1.3_x64.dmg 7ee232813461ebb2b5f04d9891805155efc836e6164b0b1933da94cb69faa7c8
sensorium_0.1.3_amd64.deb ec28ecc8614e00b119075e9f97d891bcc6d551fa0aed194f1d400e96709158a9
sensorium-0.1.3-amd64.flatpak f50268f7bafe5218f0597416c43a0b02419b7fcc0879299d63a9fc3670428d40
sensorium_0.1.3_arm64.deb 623f0632f6470c6a1451c6e9e42d505a5dc7e615b8b18ae671b798b5fb665d8f
sensorium-0.1.3-arm64.flatpak 162b8fb83f61d468bbc955a357fdf7713c27a7d53acfe71a78f52e0c18df55ac

Licence

Sensorium is licensed under AGPL-3.0-or-later. Source and full licence text: https://github.com/koherarchitecture/sensorium.

Sensorium — Sycophancy v0.1.2

18 May 12:33

Choose a tag to compare

Sensorium — Sycophancy v0.1.2

Second non-hotfix release on the Sycophancy flavour. One substantive feature (chat history + search), one packaging closure (arm64 flatpak parity, completing the matrix promised in the v0.1.1 notes), and a small set of UI/runtime polish landing together. The Sycophancy flavour, probe bank, narration prompts, and engine architecture are unchanged from v0.1.1 — see the v0.1.0 release notes for the full feature description and the v0.1.1 release notes for the prior hotfix.

What changed

Feature

  1. Chat history + search. Conversations now persist across launches. A sidebar lists prior conversations; a search input runs across both their titles and their contents. Each exchange records the flavour and the model used at the time, so a conversation reads back with its original context intact even if you have since switched models or flavours. There is no cloud component — all history is local, in the application's own data directory.

Packaging

  1. arm64 flatpak parity. The Linux flatpak is now built for arm64 alongside the existing amd64 build. The flatpak manifest and build script have been parameterised on architecture (default read from dpkg --print-architecture; ARCH= env var or first positional argument overrides). This closes the matrix gap noted in the v0.1.1 release: "An arm64 flatpak is still not attached; planned for v0.1.2."

Polish

  1. Markdown rendering tightened. Headings inside an assistant reply now read as inline emphasis rather than page-level type — the assistant body should not visually compete with the page itself. Bullet markers are quieter (smaller, lower-contrast). The streaming indicator is now an explicit "thinking" cue rather than a flickering caret. First paint of a launched window is opaque (no brief flash of the underlying compositor). The keychain probe is deferred until first credential access, so cold-start no longer pauses on libsecret on Linux systems where the keyring is locked.

Build pipeline

Engine version stamped at 0.1.2 across package.json, tauri.conf.json, and src-tauri/Cargo.toml. Sycophancy flavour version unchanged — the flavour configuration is untouched in this release.

Downloads

macOS

  • Apple Silicon (M1/M2/M3/M4): sensorium_0.1.2_aarch64.dmg
  • Intel: sensorium_0.1.2_x64.dmg

Linux

  • Debian/Ubuntu, amd64 (x86_64): sensorium_0.1.2_amd64.debsudo apt install ./sensorium_0.1.2_amd64.deb
  • Debian/Ubuntu, arm64 (aarch64): sensorium_0.1.2_arm64.deb — same install command
  • Flatpak, amd64 (any distro): sensorium-0.1.2-amd64.flatpakflatpak install --user --bundle sensorium-0.1.2-amd64.flatpak
  • Flatpak, arm64 (any distro): sensorium-0.1.2-arm64.flatpak — same install command

First-launch warnings

Same as v0.1.0 and v0.1.1 — Sensorium remains unsigned. macOS Gatekeeper will warn on first launch; right-click Sensorium.app → Open → Open anyway, or from Terminal: xattr -d com.apple.quarantine /Applications/Sensorium.app. After the first launch no warning appears.

SHA-256

950f761b1ce2a31f78c8041252e9d9a34eb977e92fbad1180385a0920b774247  sensorium_0.1.2_aarch64.dmg
896aeb309ed5ecded75b9bf075b4180aa7494b77b72a7ec46f55e8f60540aef7  sensorium_0.1.2_x64.dmg
05bc0d8fea56f34ca9b8b4b7ecb4cbf7dae97110a1dcc7c3f90eb21015cc88c7  sensorium_0.1.2_amd64.deb
68def43cc5be137ffd3c4a542147db5a9421715374fda41c77c9b82e74723f63  sensorium_0.1.2_arm64.deb
82e46be28fb58a92672c75aad0624d3d425fff94834e0e652220393df9d694db  sensorium-0.1.2-amd64.flatpak
cae23fa47b0cb252ca419d9a459624a3c47cbedf622f8aae8bf8f8afc83d30fa  sensorium-0.1.2-arm64.flatpak

Project home

Licence

AGPL-3.0.

Sensorium — Sycophancy v0.1.1

09 May 03:48

Choose a tag to compare

Sensorium — Sycophancy v0.1.1

Hotfix release. Three frontend bugs found on the first day of public use, plus one small UX feature added during the fix. The Sycophancy flavour, probe bank, narration prompts, and engine architecture are unchanged from v0.1.0 — see the v0.1.0 release notes for the full feature description.

What changed

Bug fixes

  1. Markdown is now rendered in the assistant reply. v0.1.0 was rendering raw markdown source — ## Heading and **bold** showed as inline characters. v0.1.1 ships a small safe markdown parser (no external dependencies; URL allow-list against unsafe link schemes); replies render with proper headings, bold, italic, lists, inline code, and fenced code blocks.
  2. Speaker label no longer overlaps the message body. The 56px gutter could not hold the full anthropic/claude-sonnet-4.6 identifier; v0.1.1 derives a short, gutter-friendly label ("Claude", "GPT-4o", "Gemini", etc.) for the message header and preserves the full identifier as a tooltip on hover.
  3. The input box clears immediately on Send. v0.1.0 waited for the full response before clearing, making it look as if Send had not fired. v0.1.1 clears the input first and disables the composer (textarea + send button) for the duration of streaming, with a dimmed visual treatment.

Small feature

  1. "+ NEW CHAT" pill at the top of the chat area. Click to clear the conversation and start fresh; the input is re-focused for immediate typing. Visually dimmed when there is nothing to clear or while a reply is streaming.

Build pipeline

Behind the scenes, the flatpak build script and manifest have been generalised to read the version from package.json instead of hardcoding it — affects future releases, not this one.

Downloads

macOS

  • Apple Silicon (M1/M2/M3/M4): sensorium_0.1.1_aarch64.dmg
  • Intel: sensorium_0.1.1_x64.dmg

Linux

  • Debian/Ubuntu, amd64 (x86_64): sensorium_0.1.1_amd64.debsudo apt install ./sensorium_0.1.1_amd64.deb
  • Debian/Ubuntu, arm64 (aarch64): sensorium_0.1.1_arm64.deb — same install command
  • Flatpak, amd64 (any distro): sensorium-0.1.1-amd64.flatpakflatpak install --user --bundle sensorium-0.1.1-amd64.flatpak

An arm64 flatpak is still not attached; planned for v0.1.2 (target 22 May 2026).

First-launch warnings

Same as v0.1.0 — Sensorium remains unsigned. macOS Gatekeeper will warn on first launch; right-click Sensorium.app → Open → Open anyway, or from Terminal: xattr -d com.apple.quarantine /Applications/Sensorium.app. After the first launch no warning appears.

SHA-256

1570b2258f76f2e0f964b4c4771e619c5217cbbfd8b967fc79d89ba0723e33a9  sensorium_0.1.1_aarch64.dmg
5dfd46cb398233c7b2bf0eb778d69044927c8c743b3a533abcdb9d5daec37fd7  sensorium_0.1.1_x64.dmg
60c508ac6c8744b581180a975f33ee6b4cda983df4c01852d6e0d9967c4e6659  sensorium_0.1.1_amd64.deb
2478b61e8b38475ac0cc638bd72a645ba0ce8d5c0f3e54b41b1bb96be5b7ebd4  sensorium_0.1.1_arm64.deb
cd3f014fe707ea6493de6244029026c4df42b5711fca6171ea82be2392cf8051  sensorium-0.1.1-amd64.flatpak

Project home

Licence

AGPL-3.0.

Sensorium — Sycophancy v0.1.0

07 May 16:08

Choose a tag to compare

Sensorium — Sycophancy v0.1.0

First public release.

What Sensorium does

Sensorium is a desktop chat app that maps how a language model handles sycophancy triggers across five axes: planted falsehood, pressure reversal, mediocre praise, contradiction validation, and certainty validation. Each axis ships with ten named probes of varying stylistic framing. By default, calibration draws one probe at random per axis. From settings, you can pin a specific named probe per axis for repeatable tests.

Architecture

AI handles language; code handles judgement; humans choose.

  • Qualification — local Ollama classifier (qwen2.5 family) labels each chat response into one of five fixed categories.
  • Rules — deterministic Rust code reads the classifications and emits per-axis verdicts (HOLDS / SOFTENS / FOLDS).
  • Language — Claude Haiku (via OpenRouter, temperature 0) narrates the verdicts in plain prose. The narrator never decides — only describes what the rules layer concluded.

Downloads

macOS

  • Apple Silicon (M1/M2/M3/M4): sensorium_0.1.0_aarch64.dmg
  • Intel: sensorium_0.1.0_x64.dmg

Linux

  • Debian/Ubuntu, amd64 (x86_64): sensorium_0.1.0_amd64.debsudo apt install ./sensorium_0.1.0_amd64.deb
  • Debian/Ubuntu, arm64 (aarch64): sensorium_0.1.0_arm64.deb — same install command
  • Flatpak, amd64 (any distro): sensorium-0.1.0-amd64.flatpakflatpak install --user --bundle sensorium-0.1.0-amd64.flatpak

An arm64 flatpak is not yet attached; arm64 users on flatpak distros can install the .deb if it matches their package manager, or wait for an arm64 flatpak in a follow-up.

First launch on macOS

Sensorium is unsigned — Koher does not pay Apple's notarisation fee. macOS Gatekeeper warns the first time you launch:

"sensorium" can't be opened because Apple cannot check it for malicious software.

To bypass: right-click Sensorium.app → Open → Open anyway. Or from Terminal:

xattr -d com.apple.quarantine /Applications/Sensorium.app

After the first launch, no warning appears. The full source is in this repo; you can read every line.

Requirements

  • macOS 11+ (Apple Silicon or Intel) or Ubuntu 24.04+ / any Linux with WebKitGTK 4.1 + libsecret-1
  • 8 GB RAM minimum (Ollama runs alongside)
  • An OpenRouter account with $5+ in credits
  • Ollama installed locally with qwen2.5:3b (or another tier per RAM) pulled

Full setup walkthrough — including OpenRouter signup, Ollama install, first-run wizard, cost guidance, troubleshooting — in the README.

Privacy

All state stays on your machine. No telemetry, no install ping, no analytics. The only network calls are direct HTTPS to OpenRouter (chat + narration) and HTTP to Ollama on localhost (classification).

Project home

Sensorium is one tool in Koher, a ten-year practice for building configurable perception engines that separate language from judgement.

Licence

AGPL-3.0. See LICENSE.