{"schema_version":2,"catalog_version":"2026.08.26","generated_at":"2026-08-26T00:00:00+00:00","counts":{"modules":19,"capabilities":105,"engines":9,"integrations":23},"modules":[{"id":"discovery-matching","ordinal":1,"title":"Discovery and Matching Engine","summary":"Klarum's core AI engine. It ingests public tenders and aid-funded opportunities globally, indexes them in one canonical table, and scores every firm/tender pair with a calibrated, explained multi-signal ensemble.","status":"ga","scope":"supplier","tier_min":"free","audience":["bid-manager","consultant","partner"],"keywords":["tender-search","matching","featured","notices","ensemble","pgvector","reranker","cpv","g3"],"capabilities":[{"id":"notices-index","title":"Notices (global tender index)","summary":"An unscored, searchable index of every open tender Klarum ingests, served over SSE so rows paint progressively, with the org's own inbound portal submissions prepended to page 1.","status":"ga"},{"id":"featured-shortlist","title":"Featured (per-org AI shortlist)","summary":"The pre-scored daily shortlist read from featured_match_results, refreshed by a 06:00 UTC cluster-singleton cron with an 08:00 UTC digest email to opted-in users.","status":"ga"},{"id":"send-to-featured","title":"Send to Featured (on-demand scoring)","summary":"Queues a single notice for the full orchestrator with real-time G3 extraction, returning 202 while the UI polls a pending skeleton every five seconds.","status":"ga"},{"id":"first-value-warmup","title":"First-value warm-up","summary":"Scores the whole candidate pool once for a brand-new org as soon as onboarding confirms its profile, so its feed is populated before it first reaches the dashboard (#1933).","status":"ga"},{"id":"filter-presets-read-time","title":"Read-time filter presets","summary":"Named presets re-slice the cached universe at the SQL layer, so switching one costs zero AI spend and returns instantly.","status":"ga"},{"id":"derived-primary-cpv","title":"Derived primary CPV division","summary":"Scores each notice's text against the 45 CPV division vectors and records the nearest division, used only where the source supplied no classification and only above a confidence floor.","status":"ga"},{"id":"matching-learning-loop","title":"Learning loop","summary":"Every ensemble run logs to match_signal_log and user actions supply labels, so calibration and future learned weights improve from real bid behaviour.","status":"ga"}]},{"id":"inbound-projects","ordinal":2,"title":"Inbound (Projects) and the applicant view","summary":"The org-facing inbox for applications it receives. Each submission lands as a scored Project with evidence highlights, and a Go promotes it into the same workspace machinery outbound tenders use.","status":"ga","scope":"supplier","tier_min":"free","audience":["bid-manager","consultant","applicant"],"keywords":["inbound","triage","go-no-go","match-score","applicant","applicant-view"],"capabilities":[{"id":"inbound-triage-queue","title":"Triage queue","summary":"A card grid of received applications with a NEW badge under 24 hours, extracted summary fields and per-criterion evidence bars.","status":"ga"},{"id":"inbound-accept-decline","title":"Accept and Decline","summary":"Accept promotes to a full workspace, seeds a checklist, writes a Go decision row and emails the applicant; Decline records the No-go.","status":"ga"},{"id":"inbound-committee-export","title":"Committee-pack export","summary":"Bulk export of the inbound queue to Excel or a ZIP archive, for the committee pack a bid decision is taken from.","status":"beta"},{"id":"project-owner-mirror","title":"Applicant submissions view","summary":"The applicant-facing mirror of Validated, Denied and In Progress submissions, with each one's best match score and status.","status":"beta"}]},{"id":"public-portal","ordinal":3,"title":"Public Portal and Intake Funnel","summary":"A per-org branded public front door for inbound opportunities. An applicant submits by chat or dynamic form without an account and gets a reference number plus a self-serve status page.","status":"ga","scope":"supplier","tier_min":"free","audience":["applicant","org-admin"],"keywords":["portal","intake","applicant-chat","form-builder","unauthenticated","branding"],"capabilities":[{"id":"applicant-chat-intake","title":"Conversational intake assistant","summary":"A stateless slot-filling LLM conversation that collects the submission fields, never re-asks a known field, never invents a value and emits strict JSON at temperature 0.4.","status":"ga"},{"id":"inbound-form-schema","title":"One schema, two consumers","summary":"A single builder schema drives both the portal render and the server-side validation, so the form a user sees and the rules the server enforces cannot drift.","status":"ga"},{"id":"portal-reference-status","title":"Reference and status check","summary":"A URL-safe INB-XXXXXXXX reference plus the applicant email acts as a bearer pair for the public status page; a mismatch 404s rather than confirming the reference exists.","status":"ga"},{"id":"portal-rate-limits","title":"Rate limiting on an unauthenticated surface","summary":"60 reads, 10 applies and 30 chat turns per minute, with a stateless chat so a bounced visit costs nothing.","status":"ga"}]},{"id":"workspaces","ordinal":4,"title":"Workspaces (Outbound Bid Cockpit)","summary":"One persistent cockpit that carries a single opportunity from \"we should bid\" to a submitted EOI: requirements, a searchable data room, AI document generation, meeting capture and issuer outreach.","status":"ga","scope":"both","tier_min":"basic","audience":["bid-manager","consultant","signatory","issuer-author"],"keywords":["workspace","bid","eoi","data-room","checklist","recordings","outreach","onlyoffice","timeline"],"capabilities":[{"id":"workspace-tab-overview","title":"Overview tab","summary":"At-a-glance command panel: urgency banner, tender facts, activity feed, editable notes, team, issuer context, embedded checklist mirror, timeline canvas and automations panel.","status":"ga"},{"id":"workspace-tab-items","title":"Items (Checklist) tab","summary":"The workspace-scoped twin of the global Items inbox. Nothing writes directly: every origin stages an item_proposal, deduped by normalised title, promoted on accept.","status":"ga"},{"id":"workspace-tab-requirements","title":"Requirements tab (conditional)","summary":"A split view of the tender's extracted requires_* claims against the verbatim evidence spans in the source text. One reusable panel: the issuer authors, the supplier reads read-only.","status":"ga"},{"id":"workspace-tab-source","title":"Source tab (conditional)","summary":"The tender notice as the buyer published it, fetched once per tender, sanitised server-side and rendered in a sandboxed frame - with the live page always one click away.","status":"ga"},{"id":"workspace-tab-notebook","title":"Notebook tab","summary":"The workspace's quantitative surface: an ordered chain of model, assistant, transform and document cells that pipe into each other, every run recorded and every figure citable.","status":"ga"},{"id":"workspace-tab-data-room","title":"Data room tab","summary":"Per-bid document repository plus collaboration substrate with Files, References, Decisions and Q&A sub-tabs, over semantic search of org knowledge.","status":"ga"},{"id":"workspace-tab-documents","title":"Documents tab","summary":"Disk-first attachments manager plus the freeform workspace brief the agent system prompt reads verbatim, capped at 8000 characters.","status":"ga"},{"id":"workspace-tab-generated-eoi","title":"Generated EOI tab","summary":"One-click generation of a world_bank_v1-templated EOI from org references and tender context, with per-section RAG, docxtpl assembly and PDF conversion.","status":"ga"},{"id":"workspace-tab-recordings","title":"Recordings tab","summary":"Meeting capture, transcription and AI summarisation, with a three-pane viewer and a one-click conversion of action items into workspace items.","status":"ga"},{"id":"workspace-tab-conversation","title":"Conversation tab","summary":"AI-assisted issuer outreach in two columns: a deterministic gap analysis of filled versus required EOI fields, and a tone-selectable AI-drafted email.","status":"ga"},{"id":"workspace-completeness","title":"Completeness and lifecycle","summary":"Every workspace carries a lifecycle stage, urgency, deadline, bid manager, team and a completeness score, which is what the list groups and the analytics funnel measures.","status":"ga"}]},{"id":"issuers","ordinal":5,"title":"Issuers (Contracting Authorities)","summary":"A supplier's CRM register of the buyer counterparties it cares about. An issuer is a lens over organizations where is_tenant is false, and it is the canonical buyer identity the rest of the platform points at.","status":"ga","scope":"supplier","tier_min":"free","audience":["bid-manager","consultant","partner"],"keywords":["issuer","crm","buyer","notes","timeline","contacts","organizations"],"capabilities":[{"id":"issuer-overview-tab","title":"Overview tab","summary":"Identity card, aggregate stats and the engagement rail. Pure CRUD and aggregation, powered by the same single backend read the workspace header uses.","status":"ga"},{"id":"issuer-timeline-tab","title":"Timeline tab","summary":"A month-grouped issuer_notes feed with source badges (Manual, Agent, Email, Import). This is the module's AI seat: it receives add_issuer_note agent writes.","status":"ga"},{"id":"issuer-people-tab","title":"People tab","summary":"Loginless contact rows held in members scoped to the issuer organization, managed by hand.","status":"ga"},{"id":"issuer-workspaces-tab","title":"Linked workspaces tab","summary":"An org-scoped relational join listing every workspace run against this buyer. The bridge to the Workspaces module.","status":"ga"},{"id":"agent-written-issuer-note","title":"Agent-written issuer note","summary":"The first write tool the chat agent was given, behind a per-org feature gate, written with source=agent and attributed to the human chat user. The agent cannot choose the issuer.","status":"ga"}]},{"id":"records","ordinal":6,"title":"Records (Proposals and EOI Ledger)","summary":"The org's spreadsheet-native ledger of every bid, rendered as an inline editable Excel-style table with typed core columns, an open JSONB tail and a two-way sync with workspaces.","status":"ga","scope":"supplier","tier_min":"free","audience":["bid-manager","org-admin","partner"],"keywords":["records","ledger","spreadsheet","import","sync","columns","org-fields"],"capabilities":[{"id":"records-column-dictionary","title":"Column dictionary","summary":"Typed core columns plus an open org_fields JSONB tail, with firm-defined columns type-enforced against a closed type set. Admin-managed.","status":"ga"},{"id":"records-workspace-sync","title":"Two-way record and workspace sync","summary":"A declarative map of about thirty field pairs mirrors edits both ways with deterministic converters, returning HTTP 409 with candidate options rather than guessing an ambiguous value.","status":"ga"},{"id":"records-excel-import","title":"Excel and CSV import","summary":"One-step import of an existing bid-tracking workbook, with an LLM column mapper that returns a per-header confidence flag and a circuit breaker back to a deterministic miss.","status":"ga"},{"id":"records-promote-to-workspace","title":"Promote to Workspaces","summary":"Turns a ledger row into a full working workspace in one click, creating and linking the two so the sync engine keeps them aligned from then on.","status":"ga"},{"id":"records-branded-report","title":"Branded PDF report","summary":"Quarterly, by-sector or by-country reporting over the ledger, rendered as a branded PDF that lands back in the document library.","status":"ga"}]},{"id":"documents","ordinal":7,"title":"Documents","summary":"Klarum's central document library and reader, where every file the platform touches becomes parsed, chunked, embedded, citable evidence rather than an opaque blob in a bucket.","status":"ga","scope":"both","tier_min":"basic","audience":["consultant","bid-manager","org-admin"],"keywords":["documents","s3","parsing","chunking","embeddings","citations","heatmap","rag"],"capabilities":[{"id":"document-ingest-path","title":"One ingest path","summary":"Every source, upload or cloud import or generated artifact, takes the same route to S3 plus a metadata row plus an async parse, chunk and embed pass with an explicit parse status.","status":"ga"},{"id":"document-match-heatmap","title":"Tender-match heatmap","summary":"Embeds the tender text and scores every chunk of a document against it, rendering a per-section heat score so the passages that drove a match score are visible.","status":"ga"},{"id":"document-citations","title":"Citations and annotations","summary":"RAG citations carry title, format, page and score, and document annotations record AI audits, user notes and risk warnings against a relevance score.","status":"ga"},{"id":"document-usage-loop","title":"Usage loop","summary":"Each document reports times used, last used, which EOIs and sections cite it and its average relevance, so a reference list earns or loses its place.","status":"ga"}]},{"id":"knowledge","ordinal":8,"title":"Knowledge (Org Knowledge Graph and Packages)","summary":"The org-specific context substrate. It turns a pile of PDFs into a structured capability graph with evidence, plus a searchable knowledge corpus and shareable packages the rest of the AI stack reads from.","status":"ga","scope":"both","tier_min":"free","audience":["consultant","bid-manager","org-admin"],"keywords":["knowledge-graph","capabilities","astaroth","packages","marketplace","cv","pds","mephiston"],"capabilities":[{"id":"capability-graph","title":"Firm knowledge graph","summary":"An org to category to capability to evidencing document tree, where every has_capability edge points back at the exact passage, page and confidence that justifies it.","status":"ga"},{"id":"knowledge-items","title":"Knowledge items","summary":"Curated org-scoped records with a title, markdown body and a kind. A sweep embeds them every 30 minutes, so a new item is keyword-findable at once and vector-findable at the next sweep.","status":"ga"},{"id":"knowledge-packages","title":"Knowledge packages","summary":"Named, versioned bundles of items, exportable as ZIP or branded PDF and installable into a workspace or another tenant. Cross-tenant public packages form a marketplace.","status":"ga"},{"id":"team-composition","title":"Team composition","summary":"Bulk-uploaded CVs are extracted for job title and seniority and rolled up into a view of who the org can actually deploy.","status":"ga"},{"id":"ingest-health","title":"Ingest health","summary":"Per-document parse and tag status with retry, bulk retry and reingest, and status synthesised defensively so the UI never shows a perpetual spinner.","status":"ga"}]},{"id":"templates","ordinal":9,"title":"Templates and Checklist Templates","summary":"Two org-owned template systems: a document section tree with typed variable slots that drives generation, and role-based checklist templates that seed every new workspace with a starting task list.","status":"ga","scope":"supplier","tier_min":"basic","audience":["org-admin","bid-manager"],"keywords":["templates","sections","variables","checklist","proposals","jinja2","fork"],"capabilities":[{"id":"document-section-tree","title":"Section tree and variable slots","summary":"A hierarchical section skeleton with per-section generation prompts and typed variable slots declaring where each piece of org context inserts at generation time.","status":"ga"},{"id":"template-fork-provenance","title":"Fork with provenance","summary":"An org forks a platform-shipped Standard template into a Custom one and the fork records meta.forked_from, so a customisation can always be traced back to its origin.","status":"ga"},{"id":"checklist-seeding","title":"Checklist seeding and Apply template","summary":"A default checklist is provisioned idempotently per org and copied once into each new workspace; the Apply picker is one relevance-ranked SQL query over issuer-matched, default and manual buckets.","status":"ga"},{"id":"staffing-scope","title":"Staffing-scope checklists","summary":"Checklist templates can declare a staffing scope for criteria matching. The scope is scaffolded and stored; the matcher behind it is not yet wired.","status":"planned"}]},{"id":"analytics","ordinal":10,"title":"Analytics (Org KPIs and Market Intelligence)","summary":"Two reporting surfaces over the two core substrates: org KPIs, SLA and funnel on the operational tables, and market intelligence with a streaming natural-language analyst over the whole tender corpus.","status":"ga","scope":"supplier","tier_min":"business","audience":["org-admin","bid-manager","partner"],"keywords":["kpi","sla","funnel","win-rate","market","forecast","sparkline","market-bot"],"capabilities":[{"id":"org-kpis","title":"Org KPIs","summary":"Workspace totals and stage split, EOIs sent all-time and rolling twelve months, average time to submit and a per-bid-manager breakdown.","status":"ga"},{"id":"sla-buckets","title":"SLA and deadline adherence","summary":"Workspaces joined to canonical tender deadlines and bucketed on-time, late, missed, at-risk and on-track, each bucket clicking through to the workspaces behind it.","status":"ga"},{"id":"pipeline-funnel","title":"Pipeline funnel","summary":"A Salesforce-shaped funnel combining snapshot conversion ratios with historical transition counts and average dwell time mined from the audit log by a window function.","status":"ga"},{"id":"market-forecast","title":"Volume forecast","summary":"A closed-form OLS regression over the last twelve monthly counts projecting three months ahead with a confidence band that widens with the horizon. Deterministic, computed inline in SQL.","status":"ga"},{"id":"market-analysis-bot","title":"Ask Data Studio","summary":"Ask the tender corpus a question in plain language, get a titled chart. It compiles into a validated, cost-gated query over an allowlisted semantic view rather than free SQL, so an answer is either faithful to the corpus or refused.","status":"beta"},{"id":"win-rate-history","title":"Historical win rate","summary":"A first-party aggregate over concluded bids broken down by country and donor or MDB. Descriptive today, and the substrate a predictive model would train on.","status":"ga"}]},{"id":"corpus-coverage","ordinal":11,"title":"Corpus Coverage (public, audited)","summary":"The one surface Klarum publishes outward about its own data: a per-market, per-source table of what the tender corpus contains, rendered from a hash-chained append-only snapshot anyone can re-derive.","status":"ga","scope":"both","tier_min":"free","audience":["prospect","analyst","buyer"],"keywords":["coverage","public","snapshot","hash-chain","methodology","falsifiable","dbt"],"capabilities":[{"id":"coverage-metric-registry","title":"Metric registry","summary":"Each metric's exact SQL and its plain-language meaning, denominator and exclusions live in one object, so a number cannot be computed one way for the page and described another way in a deck.","status":"ga"},{"id":"coverage-hash-chain","title":"Append-only hash chain","summary":"Snapshots are chained with the same integrity primitive as the workspace audit chain, append-only at the database with a unique prev_hash and a single-genesis index so the chain cannot fork.","status":"ga"},{"id":"coverage-publication-gates","title":"Four publication gates","summary":"Nothing publishes unless dbt data tests are green, the deployed transform fingerprint matches the checkout, the build is identifiable and the ingestion run was green.","status":"ga"}]},{"id":"automations","ordinal":12,"title":"Automations (Process Engine Console)","summary":"The console over Klarum's process engine: declarative multi-step processes with a narrow auditable DSL, pluggable compute backends, per-step budget envelopes and a live runs ledger.","status":"ga","scope":"both","tier_min":"business","audience":["org-admin","bid-manager","consultant"],"keywords":["process-engine","runs","steps","backends","budget-envelope","scheduler","dsl"],"capabilities":[{"id":"process-catalog","title":"Catalog of Standard and Custom processes","summary":"Platform-shipped Standard definitions cover the bid lifecycle end to end; an org forks or authors Custom ones alongside them.","status":"ga"},{"id":"runs-ledger","title":"Runs ledger","summary":"Every firing is recorded step by step with its inputs, outputs, cost and verdict, which is what makes an automated decision auditable after the fact.","status":"ga"},{"id":"budget-envelope","title":"Budget envelope","summary":"Per-step and aggregate ceilings on tokens, latency and cost, enforced by the engine, so a runaway automation stops rather than billing.","status":"ga"},{"id":"prompted-process-authoring","title":"Prompt a new automation","summary":"A plain-English description becomes a validated ProcessSpec, capped at four steps and restricted to LLM-only steps so a bad draft can at worst waste tokens.","status":"ga"},{"id":"eoi-citation-stripping","title":"Citation stripping","summary":"The EOI section path post-validates every [ref:id] citation against the supplied reference list and strips hallucinated ids, recording the event.","status":"ga"},{"id":"automation-suggestions","title":"Contextual suggestions","summary":"A first-match-wins regex rule table maps a checklist item to a suggested automation and a reason, deliberately not an LLM call so suggestion stays instant and free.","status":"ga"}]},{"id":"agent","ordinal":13,"title":"Agent (AI Assistant, \"Klara\")","summary":"Klarum's conversational assistant: a tool-using ReAct agent on LangGraph that reasons over the org's own data, calls tools to read and act on it, searches the web, and drives the UI of the page the user is on.","status":"ga","scope":"both","tier_min":"basic","audience":["consultant","bid-manager","org-admin"],"keywords":["langgraph","react-agent","tools","sse","notebook","page-bridge","dspy","rag","citations"],"capabilities":[{"id":"chat-mode","title":"Chat mode","summary":"Streaming multi-turn conversation with tool use, citations and live thinking and tool-call blocks, persisted to process_runs so a session is resumable.","status":"ga"},{"id":"notebook-mode","title":"Notebook mode","summary":"A Jupyter-style cell stack of promptable automations wired to the process engine and the knowledge API, for work that repeats.","status":"ga"},{"id":"page-action-bridge","title":"Page-action bridge","summary":"A server-stateless tool: the agent emits an action, the backend echoes it, and the frontend invokes the matching handler from its per-page registry. This is what lets the assistant operate the UI.","status":"ga"},{"id":"contract-manifest-state-edges","title":"Contract manifest and state-edges","summary":"A source-walked manifest maps every route to its components, testids, actions and dual doors, so an in-page view with no route of its own is still reachable and nothing is hand-maintained.","status":"ga"},{"id":"cross-context-isolation","title":"Cross-context isolation","summary":"Row-level firm scoping on every SQL and RAG call plus a non-negotiable prompt rule that the agent may only answer about the pinned workspace, so one deal cannot leak into another.","status":"ga"},{"id":"read-the-tender-notice","title":"Reading the tender's own notice","summary":"In a workspace built on a tender, the agent can read the notice the buyer published - the source document - rather than only the fields extracted from it.","status":"ga"},{"id":"gated-write-tools","title":"Gated write tools","summary":"Write tools sit behind a per-org opt-in flag and refuse when mis-wired, and confirm-gated proposals put a human between an intention and an effect.","status":"ga"},{"id":"brand-aware-document-generation","title":"Brand-aware document generation","summary":"On request the agent produces a finished on-brand PDF dressed in the org's own design tokens, routing between approved brands by matching the new document to the org's past accepted ones.","status":"ga"}]},{"id":"dashboard-items","ordinal":14,"title":"Dashboard and Items Cockpit","summary":"The command centre at the top of the authenticated app: a dashboard that triages what needs attention today, a cross-workspace items tracker, and a proposals queue every new item has to pass through.","status":"ga","scope":"both","tier_min":"free","audience":["consultant","bid-manager","org-admin"],"keywords":["dashboard","items","proposals","action-center","latent-capabilities","scoreboard"],"capabilities":[{"id":"action-center","title":"Action Center","summary":"Overdue, due-today and due-within-seven-days workspaces bucketed by calendar day in UTC, each with a Run with Agent hand-off.","status":"ga"},{"id":"self-hiding-widgets","title":"Self-hiding widgets","summary":"Each dashboard widget disappears when it has no signal, so the page stays calm when the org is calm rather than showing a wall of empty states.","status":"ga"},{"id":"latent-capabilities","title":"Latent capabilities","summary":"A deterministic SQL traversal of the org's capability edges minus what it already declares, banded by rank, with a one-click Declare that lifts future match scores.","status":"ga"},{"id":"proposals-first","title":"Proposals-first architecture","summary":"Nothing writes directly to items. All four creation origins stage a proposal first, through one idempotent dedupe gate and one review surface, and items exist only on promotion.","status":"ga"},{"id":"item-model","title":"The item model","summary":"Typed content slots, directed inter-item links, sub-items, labels and a per-item activity log, with an assessed flag that is a human-judgement marker distinct from completion.","status":"ga"},{"id":"process-state-buckets","title":"Process state buckets","summary":"Per-org process states map onto canonical buckets so filtering by \"open\" works across every org's custom state names.","status":"ga"}]},{"id":"issuer-procurement","ordinal":15,"title":"Issuer Procurement (Buy-Side, workspace-native)","summary":"The buy-side of a procurement, re-homed onto existing primitives: an issuer publishes an OCDS notice, suppliers bid, and a multi-role assessment chain runs to a framework-weighted award.","status":"ga","scope":"issuer","tier_min":"free","audience":["issuer-admin","evaluator","supplier"],"keywords":["ocds","notice","bids","assessment","mcda","award","panel","evaluation-framework"],"capabilities":[{"id":"ocds-publish","title":"OCDS publish","summary":"An OCDS release maps onto an opportunities row and idempotently creates a companion workspace linked both ways, so publishing produces a working data room rather than a listing.","status":"ga"},{"id":"requirements-authoring","title":"Requirements authoring and extraction","summary":"Requirements are claims of the same requires_* shape the supplier side reads, authored by hand or extracted from an uploaded spec by a structured LLM call with a regex fallback.","status":"ga"},{"id":"evaluation-framework","title":"Evaluation framework","summary":"A weighted MCDA definition held as a process_defs spec with criteria keyed to assessment roles, weights and gates, parametrizing the ranking rather than averaging it flat.","status":"ga"},{"id":"assessment-chain","title":"Multi-role assessment chain","summary":"Dated, assignee-scoped role assessments, each mirrored as a tracked item so an evaluation obligation appears where that person already works.","status":"ga"},{"id":"supplier-panel","title":"Pre-qualified supplier panel","summary":"Approved, conditional and rejected supplier tiers, shaped for later automatic classification but maintained by hand today.","status":"ga"},{"id":"award-handoff","title":"Award hand-off","summary":"Award flips the winning bid to WON, pushes a WON workspace and award letter to the supplier, and writes the contract into the supplier's own Records register.","status":"ga"}]},{"id":"registry","ordinal":16,"title":"Registry (suppliers and issuers, resolved against the company register)","summary":"One browsable list of the organisations on both sides of a public contract - who bought and who won - built from the procurement record itself, enriched by a national company register where one is integrated, and drawn on a world hex grid.","status":"beta","scope":"both","tier_min":"free","audience":["prospect","analyst","buyer"],"keywords":["registry","supplier","issuer","bolagsverket","organisationsnummer","h3","hex","map","sweden"],"capabilities":[{"id":"registry-resolution","title":"The record says it exists, the register says what it is","summary":"An identifier on a published award creates the organisation in any country; a company register then confirms it and adds what only a register knows. Name-only matches stay gated on the register.","status":"ga"},{"id":"registry-country-keys","title":"Per-country identifier normalisation","summary":"Each country's registration number is normalised by its own rule, because reducing every identifier to digits merges distinct companies rather than omitting them.","status":"ga"},{"id":"registry-hex-grid","title":"World H3 hex grid","summary":"A globe-wide Uber H3 grid at three resolutions, generated and stored in the database with every placed organisation assigned into it, read back one viewport at a time.","status":"ga"},{"id":"registry-placement","title":"Registered-seat placement","summary":"Postal address to coordinate by join against a free gazetteer, with precision recorded per row so a town centroid is never drawn as if it were an address.","status":"ga"}]},{"id":"platform-capabilities","ordinal":17,"title":"Platform Capabilities (Connectors, Integrations, Branding, RBAC, Developer)","summary":"The control plane that wires Klarum into an org's existing systems, governs who can do what, and exposes a developer surface. Supporting capability, not a headline tool.","status":"ga","scope":"both","tier_min":"free","audience":["org-admin","developer","consultant"],"keywords":["connectors","integrations","oauth","branding","rbac","roles","webhooks","scheduler","presets"],"capabilities":[{"id":"firm-connectors","title":"Connectors","summary":"Authenticated pipes into procurement portals Klarum cannot read anonymously, with per-connector credentials encrypted at rest and a probe endpoint that validates them.","status":"ga"},{"id":"integrations-catalogue","title":"Integrations","summary":"A server-side provider catalogue spanning storage, editor, comms, project management, CRM, signing and automation, with OAuth callbacks and a post-OAuth provisioning gate.","status":"ga"},{"id":"ai-behavior-preferences","title":"AI behaviour preferences","summary":"Org-level generation preferences (tone, default output language, preferred and avoided terminology) that steer LLM drafting without touching matching scoring. Admin-only.","status":"ga"},{"id":"branding-assets","title":"Branding and portal","summary":"Per-org document branding assets - header logo (required for EOI generation), footer logo falling back to the header, and a cover hero image.","status":"ga"},{"id":"org-roles-rbac","title":"Organization and roles (RBAC)","summary":"Three built-in role tiers plus tokenised invite-by-email restricted to the org's admin domains, with an active-org header so a user can belong to several orgs.","status":"ga"},{"id":"custom-roles-section-scoping","title":"Custom roles and section scoping","summary":"Business-tier admins define named roles and check which dashboard sections each may reach, derived from the org's plan so a role can never be granted an area the plan excludes.","status":"ga"},{"id":"developer-webhooks-capability","title":"Webhooks","summary":"Subscribe an external URL to org activity events. Delivery runs on the durable outbox with HMAC-signed attempts, exponential backoff and at-least-once semantics keyed on a stable delivery header.","status":"ga"},{"id":"developer-scheduler-capability","title":"Scheduler","summary":"Read-only admin observability over Klarum's cron jobs: last run plus full invocation history with status, latency, payload and replica id. Jobs run with cluster-singleton leader election.","status":"ga"},{"id":"filter-presets","title":"Filter presets","summary":"Personal colour-coded bundles of feed filters. \"Standard\" is the org-profile baseline; each named preset overrides it per key, and the default one's score threshold drives the daily digest.","status":"ga"},{"id":"product-catalogue","title":"Product catalogue","summary":"Klarum's own answer to \"what does this product ship\", published anonymously and in-app from one validated artifact, with the wiring graph behind the auth gate.","status":"ga"},{"id":"saved-searches","title":"Saved searches","summary":"Named outbound filter sets, saved per member and reusable across the opportunity feeds.","status":"beta"}]},{"id":"plans-billing","ordinal":18,"title":"Plans, Billing and Entitlements","summary":"How an org pays for Klarum and what each tier is entitled to: a four-tier ladder with Free as the floor, a per-seat Business tier, enforced monthly meters on Free inference spend, and the trial between them.","status":"ga","scope":"both","tier_min":"free","audience":["org-admin","prospect","finance"],"keywords":["tiers","stripe","meters","trial","seats","capabilities","checkout","entitlements"],"capabilities":[{"id":"tier-ladder","title":"The tier ladder","summary":"Four tiers low to high, Free, Basic, Business and Enterprise, with every Stripe lookup key round-tripping through one table so the webhook sync and the price resolver cannot disagree.","status":"ga"},{"id":"tier-capabilities","title":"Capabilities per tier","summary":"A capability is binary per tier: engine and exports and connectors from Free, doc generation from Basic, team seats and org settings from Business, and the enterprise block from Enterprise.","status":"ga"},{"id":"monthly-meters","title":"Meters","summary":"A monthly ceiling on something a tier already holds, enforced by one atomic statement that row-locks the org, resets lazily on a UTC month roll-over and writes nothing once the cap is reached.","status":"ga"},{"id":"business-trial","title":"The Business trial","summary":"A once-per-org trial of Business with a seven-day window to activate and three full days once activated, requiring no payment method and preserving data when it ends.","status":"ga"},{"id":"seat-billing","title":"Seat billing (Business)","summary":"Per-seat and metered with Stripe authoritative. A seat bills on acceptance, not on invite, with an idempotency key on the invitation id so a retried accept cannot double-bill.","status":"ga"},{"id":"self-serve-plan-management","title":"Self-serve plan management","summary":"Interval and plan changes are not self-serve. The Stripe Customer Portal session endpoint exists but no frontend component calls it, so the interval is chosen at Checkout.","status":"planned"}]},{"id":"ai-ml-stack","ordinal":19,"title":"AI/ML stack at a glance","summary":"Consolidated reference of every model and service the platform uses, what each is for and where. Providers marked currently configured are env-pluggable through the LiteLLM factory.","status":"ga","scope":"both","tier_min":"free","audience":["engineer","analyst","prospect"],"keywords":["litellm","bedrock","qwen","claude","cohere","bge-m3","pgvector","mephiston","reranker","dspy"],"capabilities":[]}],"preambles":{"what_klarum_is":"Klarum is a full-stack **infrastructure-project screening and bid-management\nplatform** built by Klarum for consultancies and contractors that chase\npublic-sector and development-bank work. Its spine is a **two-sided\ndeal-flow funnel running over one shared opportunity/knowledge substrate**:\n\n- **Outbound (supply-side hunt):** Klarum ingests public tenders and\n  aid-funded opportunities from around the world, understands them in plain\n  language, and tells each firm which ones are worth bidding on, then\n  converts a chosen tender into a full bid workspace.\n- **Inbound (demand-side intake):** firms receive applications, RFPs, and\n  expressions of interest through a branded public portal; each submission\n  is scored against the firm's profile and triaged with a Go/No-go\n  decision.\n\nBoth directions converge on the **same `opportunities`/`workspaces`\nabstraction** and the **same matching ensemble, knowledge graph,\nembeddings, and document-generation stack**, so a firm's pipeline, records\nregister, and AI tooling are unified regardless of how an opportunity\nentered the building.\n","how_the_platform_fits_together":"The end-to-end flow, and where each module sits:\n\n1. **Discovery and Matching** is the front door of the outbound funnel. A\n   global ingestion pipeline normalises 12+ tender sources into one\n   canonical table (`canonical_opportunities`); a multi-signal matching\n   ensemble turns \"a firm\" + \"a tender\" into a calibrated, explained fit\n   score; the **Notices** feed is the raw universe and **Featured** is the\n   per-firm, AI-ranked daily shortlist.\n\n2. **Inbound (Projects) and the Public Portal** are the demand-side on-ramp.\n   Applicants submit through a branded portal (chat or form); submissions\n   become scored `projects`/`opportunities` rows the firm triages and\n   accepts or declines.\n\n3. **Workspaces** are the operational heart: a \"Go\" on either an outbound\n   tender or an accepted inbound project spins up a 7-tab bid cockpit\n   (requirements, data room, documents, AI-generated EOI, recordings,\n   issuer outreach).\n\n4. **The Knowledge substrate** (the firm knowledge graph, documents,\n   embeddings, capability claims, and curated knowledge items/packages) is\n   the context layer every AI feature reads from. Without it, matching and\n   generation run \"cold.\"\n\n5. **Issuers** are the canonical buyer primitive (a lens over\n   `organizations`) that workspaces, tenders, and the agent all point at.\n\n6. **Records** is the firm's spreadsheet-native ledger of every bid,\n   two-way-synced with workspaces.\n\n7. **Analytics** measures the loop: firm KPIs/SLA/funnel on the operational\n   substrate, and market intelligence over the full tender corpus.\n\n8. **The Agent and Automations** are the cross-cutting AI layer: a\n   conversational, tool-using assistant and a declarative process engine\n   that both operate on the same canonical data the rest of the platform\n   uses.\n\n9. **The Dashboard and Items cockpit** is the daily entry point that\n   triages it all, and **Platform Capabilities** (connectors, integrations,\n   branding, RBAC, developer surfaces) is the control plane wiring Klarum\n   into a firm's existing systems.\n\n10. **Plans, Billing and Entitlements** is what a firm pays for all of the\n    above: a four-tier ladder with Free as the floor, a per-seat Business\n    tier, enforced monthly meters on the Free tier's inference spend, and\n    the trial that sits between them.\n\nA note on the AI itself, true across every module below: **LLM and embedding\nproviders are environment-configurable through a LiteLLM factory.** The\ndev/default path runs **Qwen3-32B on AWS Bedrock**\n(`us.qwen.qwen3-32b-v1:0`) for generation and **BAAI/bge-m3** for\nembeddings; the production path runs **Cohere Embed v4** on Bedrock's EU\ninference profile (`eu.cohere.embed-v4:0`) for embeddings and **Claude/Anthropic** (or Azure OpenAI / OpenAI / Gemini) models. Where a\nspecific model is named below it is the *currently configured* choice, not a\npermanent vendor lock: the provider can be swapped by env var without code\nchanges.\n","account_capabilities_and_surface_scope":"Klarum is a **two-sided** platform. The original product is the **Supplier**\n(consultancy/contractor) that hunts and bids on work; the **Issuer/Buyer**\nside (contracting authority that publishes tenders and assesses bids)\nlanded later via the issuer-accounts work (#1975 issuer cockpit, #2082\norg-capability model). One organization can hold **both** roles. Each module\ncarries a `scope` saying which side it belongs to, so issuer-side features\ncan be checked for bleed into supplier-only accounts.\n\n**Scope legend** (the `scope` field on every module):\n\n- **supplier** - supply-side: hunt, bid, submit. The original product.\n- **issuer** - buy-side: publish notices, assess and award bids.\n- **both** - genuinely shared, or one surface with role-conditional\n  behavior.\n\nTwo org-classification systems exist and they are not unified, so a reader\nshould know which one a surface reads: `organizations.meta.is_issuer` (the\nlegacy boolean that drives the nav label swap and the backend publish gate,\nand which cannot express \"both\"), and `organization_capabilities` (the\n`buyer` / `supplier` lex terms resolved by the shared `org_capabilities`\ntenancy helper, #2082), which is the intended capability substrate.\n"}}