Apps, tiers, bundles & skills — how a new feature is built and referenced
| Term | What it is | Example | Lives in |
|---|---|---|---|
| App tier | How a feature is surfaced. Tier 1 = built into Core; Tier 2 = standalone app with UI/API/users | console (T1), DET22 (T2) | apps/, koda_apps |
| Capability | A platform function Koda performs, granted per-user | research, drive.read | permissions table |
| Bundle | The sanctioned wrapper around one external integration | drive.yaml | bundles/*.yaml |
| Skill | A markdown playbook teaching the AI how to do a task | pdf, deploy-dashboard | skills/*.md |
Wraps an external integration. Makes the chokepoint discoverable; declares permissions and destructive-action gates. Loaded when the matcher detects your message is reaching that integration.
Teaches the AI how to perform a task — a workflow. Loaded when its trigger words fire. Neither contains the other.
A special always-on skill, bundle-self-check, tells the AI: "before you call any external thing, verify it's going through its bundle." So a skill polices bundle usage — but they are not nested.
lib/*.js module is allowed to talk to the external system. lib/drive.js for Drive.bundles/<name>.yaml declares the chokepoint functions, permissions, and destructive actions. The matcher pre-loads its instructions into the AI's prompt on the right turn.audit_log row.destructive_actions[] needs explicit owner yes/no before running.Drive is system infrastructure, not a Tier 2 app — there is no /drive slash command and no intent dispatch. The bundle is "bundle-as-docs": it routes the AI to the chokepoint and loads the guardrails. update_file_content is marked destructive, so a write requires owner confirm.
If a bundle YAML fails schema validation (e.g. an action marked destructive: true but missing from top-level destructive_actions[]), the registry silently drops it — the integration won't auto-fire. Run /bundles list to see load errors, fix the YAML, then /bundles reload. Since koda-core 2.140.3, Core also DMs the owner at boot if any bundle failed to load.