Configuration Reference¶
Use this reference when authoring .kiket/ directories across repositories.
Directory Layout¶
.kiket/
├── workflows/
├── boards/
├── analytics/
│ ├── metrics/
│ ├── dashboards/
│ └── reports/
├── extensions/
├── email_templates/
├── project.yaml
├── team.yaml
├── inbound_email.yaml
└── config.yaml
Key Files¶
project.yaml– Project metadata, integrations, defaults, and normalized team/permission data. The loader applies.kiket/project.yamlafter every workflow sync, creating pending memberships for email-only entries, storingteam.defaults, and reconciling manifest-managed integrations.team.yaml– Roles, permissions, and onboarding checklists.config.yaml– Feature flags, sync configuration, environment overrides.inbound_email.yaml– Email-to-issue mappings, sender policies, and auto-reply configuration.workflows/*.yaml– Workflow state machines.boards/*.yaml– Kanban, Scrum, and timeline boards.analytics/**/*.kql– DSAL metrics and reports.extensions/*/manifest.yaml– Extension manifests.email_templates/*.liquid– Liquid templates for auto-reply emails.
Loader Behavior Highlights¶
- Email-only team members in manifests become
ProjectMembershipinvitations (withinvited_at) until the user signs up. - Role definitions, groups, and defaults from the manifest are cached under
project.settings['team']for fast UI access. project_permissionsnow always containsallowed_actions,inheritance, andpublickeys, even when omitted in YAML.- Manifest-managed integrations are reconciled on each sync—missing entries are removed, and survivors receive refreshed settings and timestamps.
- Workflows define states only; keep board layouts in
.kiket/boards/*.yamland reference them fromproject.yaml. - Every configuration artifact must declare
model_version(current schema:1.0) so future parser changes can be rolled out safely.
Project Manifest Deep Dive¶
model_version: 1.0
version: "1.0"
project:
name: "Payments Platform"
key: "PAY"
visibility: team
settings:
auto_assign: true
require_approval: false
team:
lead: lead@acme.dev
defaults:
role: developer
groups:
- Core Services
members:
- email: alice@acme.dev
role: developer
- email: qa@acme.dev
role: qa
roles:
- name: developer
permissions: ["issues:*", "deploys:staging"]
- name: qa
permissions: ["issues:comment", "tests:run"]
groups:
- name: Core Services
members:
- lead@acme.dev
- alice@acme.dev
permissions:
default: developer
public: false
allowed_actions: [read, comment, vote]
overrides:
postmortems:
visibility: private
integrations:
- type: github
enabled: true
config:
repo: acme/payments
- type: slack
enabled: true
config:
channel: "#payments-alerts"
boards:
- boards/sprint-board.yaml
- boards/research-board.yaml
workflows:
- workflows/default.yaml
- workflows/release-management.yaml
The manifest wires together the discrete configuration files. During sync the loader:
- Applies project metadata and settings.
- Creates or updates manifest-managed memberships (inviting email-only members when necessary) and stores
team.defaults. - Hydrates
project_permissionswith defaults and overrides even if portions were omitted from YAML. - Reconciles integrations sourced from the manifest—missing entries are pruned, surviving records are refreshed.
- Resolves referenced workflow and board files using the loader precedence (repository → project → organization → defaults).
Workflow File Anatomy¶
model_version: 1.0
name: "Release Management"
version: 1.0
states:
planned:
type: initial
metadata:
description: "Scope captured and ready to execute"
ready_for_qa:
type: active
metadata:
icon: 🧪
qa_in_progress:
type: active
wip_limit: 5
ready_for_release:
type: active
releasing:
type: active
completed:
type: final
transitions:
- from: planned
to: ready_for_qa
name: start_qa
guards:
- checklist: release_planning
- from: ready_for_qa
to: qa_in_progress
name: begin_testing
- from: ready_for_release
to: releasing
name: deploy
guards:
- approvals:
roles: [lead, product]
- from: releasing
to: completed
name: close_release
checklists:
release_planning:
- Risks documented
- Rollback plan published
Keep workflow files focused on business flow: states, transitions, guards, and automation. Avoid embedding board definitions—reference dedicated board configs instead.
Board Files¶
model_version: 1.0
name: "Sprint Board"
type: kanban
workflow: default
columns:
- name: Sprint Backlog
states: [todo]
wip_limit: 20
- name: In Development
states: [in_progress]
wip_limit: 10
- name: Peer Review
states: [review]
wip_limit: 6
- name: Done
states: [done]
wip_limit: 40
swimlanes:
enabled: true
group_by: assignee
show_empty: false
filters:
labels:
exclude: [research]
card_template:
fields:
primary: [title, assignee]
secondary: [story_points, due_date]
badges:
- type: priority
Create as many board files as you need (.kiket/boards/*.yaml). Manifests reference them by path, letting teams share workflows while tailoring visual boards per project.
Tips for Board Definitions¶
- Ensure every workflow state used in the project is mapped to at least one column—otherwise cards in those states disappear from the board.
- Use filters to create specialized views (e.g., exclude research items from a delivery board).
- Prefer swimlanes when you need secondary grouping (assignee, priority, epic).
- Keep card templates minimal on busy boards; detailed cards can land in secondary views (e.g., report dashboards).
Project Custom Fields¶
Define project-level fields inside .kiket/project.yaml (or in a dedicated .kiket/custom_fields.yaml that the manifest references) so the configuration loader can create or update issue_field_definitions during syncs. Each entry should at least provide a field_key, label, data_type, and project key. Supported data types: string, text, number, boolean, enum.
model_version: 1.0
project:
key: platform-v2
name: "Platform V2"
custom_fields:
- field_key: customer_impact
label: Customer Impact
data_type: enum
options: [low, medium, high, critical]
issue_type: UserStory
helper_text: "How visible is this change to customers?"
position: 5
show_in_table: true
show_in_popover: true
- field_key: go_live_blocker
label: Go-Live Blocker
data_type: boolean
default: false
required: true
position: 10
show_in_table: true
show_in_popover: true
- Create new fields by adding entries with unique
field_keyvalues. The sync job upserts definitions without touching existing issue data or existing values. - Edit labels, helper text, defaults, enum
options, or requirement flags directly in YAML; rerun the sync to push changes consistently to every environment. Existingissue_field_valuesremain intact. - Reorder by adjusting
position(lower numbers render first in forms, detail panes, and exports). Update multiple fields at once; the loader applies the changes in a single transaction. - Deprecate by setting
active: falseto hide a field while preserving historical values; remove the block entirely when downstream automation no longer depends on it. You can re-enable later by flippingactive: truewithout data loss.
Additional attributes: use options for enums, issue_type to scope a field to a specific issue type, scope: organization when a definition should be shared across projects from a single repository, and show_in_table / show_in_popover to opt the field into or out of index table columns and quick-view popovers. For shared repositories managing multiple project manifests, include the project: slug to target the desired project configuration.
Issue Templates¶
Issue templates live in .kiket/templates/issues/*.yaml. Sync jobs parse each file, validate the schema, and publish active templates to projects or the entire organization depending on scope.
model_version: 1.0
template:
key: feature_request
name: Feature Request
description: Capture user problems and desired outcomes.
scope: organization # auto (default), organization, project, or project_key
defaults:
issue_type: UserStory
priority: medium
status: "To Do"
labels: [feature, discovery]
custom_fields:
product_area: core
required_fields:
- description
fields:
product_area:
type: enum
options: [core, growth, platform]
hint: "Select the product area impacted by this feature."
expected_value:
type: text
placeholder: "Summarize the user value and business impact."
high_risk:
type: boolean
boolean_label: "This feature carries notable risk"
keymust be unique per organization/project combination; it is what the UI submits when a user selects the template.scopecontrols visibility:auto(default) follows the repository context (project-specific repos map to that project; organization repos stay global).organizationmakes the template available to every project in the org.projectrestricts to the associated repo’s project.project_keyrequires aproject/project_keyentry in the payload to target another project explicitly.defaultspre-populate issue attributes (includingcustom_fields). Values only apply when the field is blank, so manual edits are preserved.required_fieldsensures the issue cannot be saved until those attributes are filled.fieldsdescribes template-specific custom fields. Supported types:string,text,number,boolean, andenum(requiresoptions).
Inbound Email Configuration¶
Configure email-to-issue functionality in .kiket/inbound_email.yaml:
inbound_email:
enabled: true
mappings:
- email_address: support@acme.inbound.kiket.dev
description: Customer support inbox
sender_policy: open # open | known_users | known_domains
issue_defaults:
issue_type: Ticket
priority: medium
status: todo
labels:
- support
- incoming
auto_reply: true
auto_reply_template: confirmation
blockchain_anchoring: false
- email_address: bugs@acme.inbound.kiket.dev
description: Bug reports
sender_policy: known_users
issue_defaults:
issue_type: Bug
priority: high
auto_reply: true
auto_reply_template: bug_received
Sender Policies¶
| Policy | Description |
|---|---|
open |
Accept emails from anyone (default) |
known_users |
Only accept from organization members |
known_domains |
Only accept from domains with existing org members |
Auto-Reply Templates¶
Place Liquid templates in .kiket/email_templates/. Available variables:
inbound_email.from_name,inbound_email.from_email,inbound_email.subjectissue.key,issue.title,issue.url,issue.status,issue.priorityorganization.name,organization.subdomainproject.name,project.key
See the Inbound Email Guide for complete setup instructions.
Naming Conventions¶
- Use lowercase, hyphen-separated filenames (
development.yaml,incident-response.yaml). - Keep keys unique per project (
workflowfield) to avoid collisions. - Prefix experimental configs with
_if you do not want them synced yet.
Provenance Metadata¶
- Sync jobs add
provenancedata (repository, path, commit) to boards and workflows. - Use this data in the UI to trace configuration origins.
Validation Commands¶
kiket definitions lint– Lint all definition assetskiket workflows validatekiket boards validatekiket analytics lintkiket extensions lint
The definitions lint command validates projects, workflows, dashboards, inbound email configs, and dbt models. Use flags to skip specific categories:
Environments¶
- Use
config.yamlto designate environments (dev/staging/prod) and override feature flags or endpoints per environment. - Repositories can contain multiple environment folders (
environments/dev/config.yaml).
This reference complements the deeper internal configuration-as-code guides shared through the customer enablement portal.