# Kai Ase Siren > Kai Ase Siren is a senior platform engineer. Policy bound agent systems, developer infrastructure, and the platform layer underneath. What a tool may run stays occluded until policy grants it. One guardfile becomes a guarded MCP server with a natural flow. Every agent role is cast from a single YAML roster, and the context each one loads is composed into a bundle you can diff before it runs. Use the pages below as the canonical public profile. Other routes are retained only for archival compatibility and should not be treated as current. ## Public pages - [Home](https://www.coilysiren.me/): Current platform thesis and active portfolio. - [About](https://www.coilysiren.me/about/): Biography, visual autobiography, and collected interests. - [Contracting](https://www.coilysiren.me/contracting/): Platform engineering by the hour, agent boundaries as the specialism, and engagement terms. - [Hiring](https://www.coilysiren.me/hiring/): Role fit, practical constraints, and interview boundaries. - [Resume](https://www.coilysiren.me/resume/): Canonical experience and impact record. - [Setups](https://www.coilysiren.me/setups/): umbra and agent-compose configured for a team, at fixed sizes. ## Projects - [umbra](https://umbra.coilyco.ai/): Occlusion for agent CLIs and APIs. Declare what an agent may run, and everything you did not name stays unreachable. - [mcp-beaver](https://beaver.coilyco.ai/): A MCP server generator with a natural flow. Renders one policy file into an MCP server, an HTTP tool API, a widget, and a helm release. - [housecast](https://housecast.coilyco.ai/): Agent context, cast from one roster. Change what a role may do and the evaluation that checks it moves with it, in the same commit. - [agent-compose](https://acompose.coilyco.ai/): Compose agent personas and context. Selects a role, its personality meld, the skills it can see, and the tools it gets, then materializes them as plain files. ## agent-compose docs agent-compose's own documentation, mounted verbatim from its repository and ordered by a manifest rather than alphabetically. The [front door](https://acompose.coilyco.ai/docs/) lists every shelf. ### Getting started - [Features](https://acompose.coilyco.ai/docs/features/): The engine, the roster, and the harnesses it reaches. - [Architecture and terminology](https://acompose.coilyco.ai/docs/architecture/): Providers, consumers, and the nine words in between. ### Guides - [Native role launch](https://acompose.coilyco.ai/docs/native-role-launch/): One command, one caller-assigned role. - [Launch-time refresh](https://acompose.coilyco.ai/docs/launch/): Freshen the context, then exec the real command. - [Cascade](https://acompose.coilyco.ai/docs/cascade/): Doctrine sources into each harness's global context. - [The staged home](https://acompose.coilyco.ai/docs/staged-home/): Turn a bundle into a home tree a launcher can boot. - [Identity overlay](https://acompose.coilyco.ai/docs/overlay/): One seat's identity, as a card or as JSON. - [Status line](https://acompose.coilyco.ai/docs/statusline/): The composition facts worth keeping visible. - [whoami and short ids](https://acompose.coilyco.ai/docs/whoami/): What a session calls itself, and how it knows. - [Person packages](https://acompose.coilyco.ai/docs/person-packages/): Replace the shipped roster entirely, never partly. - [Evaluation](https://acompose.coilyco.ai/docs/evaluation/): The board derives from the roster. A human grades it. ### Reference - [KDL contracts](https://acompose.coilyco.ai/docs/kdl-contracts/): Requests and policy, rejected on anything unknown. - [The bundle protocol](https://acompose.coilyco.ai/docs/bundle-protocol/): One immutable tree, entered through `manifest.json`. - [Bundle manifest](https://acompose.coilyco.ai/docs/manifest-schema/): What was composed, and where its entry points are. - [Decision trace](https://acompose.coilyco.ai/docs/decision-trace/): Every pick and its reason, recorded as it happens. - [Load-point projection](https://acompose.coilyco.ai/docs/projection/): Where each harness reads, and what gets placed there. - [The person contract](https://acompose.coilyco.ai/docs/person-contract/): The shape an external package has to match. - [Identity primitives](https://acompose.coilyco.ai/docs/identity/): Emblem, motif, geometry, sound, and the seat's name. - [Personalities](https://acompose.coilyco.ai/docs/personality/): Profiles, libraries, and the signature-and-bond pairing. - [Skill catalogues](https://acompose.coilyco.ai/docs/skill-catalogues/): Read the effective profile. Inspection changes nothing. - [Skill selectors](https://acompose.coilyco.ai/docs/skill-selectors/): Which ordinary skills a role gets, and where they land. - [Claude launch identity](https://acompose.coilyco.ai/docs/claude-launch-identity/): Two flags, so nothing has to land in `~/.claude`. - [Claude Code UI surfaces](https://acompose.coilyco.ai/docs/claude-native-ui-surfaces/): Themes, status lines, and verbs, read off the binary. - [Harness vendoring and model tiers](https://acompose.coilyco.ai/docs/harness-vendoring/): Three facts the harness never published, pinned in testdata. - [The mark and banner](https://acompose.coilyco.ai/docs/compose-marks/): A spool of thread, and every raster it ships as. - [The science role and its context budget](https://acompose.coilyco.ai/docs/science-context-budget/): The Applied Scientist role, and the skill context budget a - [Roster composition](https://acompose.coilyco.ai/docs/roster-composition/): What a deployment may add to the roster, derive from it, or ### Concepts - [Integration and delivery](https://acompose.coilyco.ai/docs/integration/): The cascade owns a host. Projection owns a container. - [Boundary and content ownership](https://acompose.coilyco.ai/docs/ownership/): The owner is a relationship, never an authority. - [Role boundaries](https://acompose.coilyco.ai/docs/role-boundaries/): One behavior, taken out of many charters and given to one. - [Role briefings and methods](https://acompose.coilyco.ai/docs/role-briefings/): What a charter carries, and what stays lazy. - [Role selection](https://acompose.coilyco.ai/docs/role-selection/): Task shape may suggest a role. It never overrides one. - [Role adjacency](https://acompose.coilyco.ai/docs/role-adjacency/): The two roles a seat is most likely to absorb. - [Native adaptation](https://acompose.coilyco.ai/docs/native-adaptation/): When a live session may switch, and when it may not. ### Contributing - [Release](https://acompose.coilyco.ai/docs/release/): Forgejo-canonical, and published only when inputs move. ## agent-compose guides End-to-end walkthroughs, separate from the reference above and scarce on purpose. The [front door](https://acompose.coilyco.ai/guides/) lists every shelf. ### Start here - [Quickstart](https://acompose.coilyco.ai/guides/quickstart/): From an empty terminal to an agent that knows which seat it is sitting in. - [Two roles, one morning](https://acompose.coilyco.ai/guides/two-roles-one-morning/): Run two roles side by side against the same morning, and see why neither answers the other's question. ### The seats - [Platform Engineer](https://acompose.coilyco.ai/guides/platform/): Angie builds the foundational software. Read this before you hand a seat something to build rather than something to specify. - [Systems Administrator](https://acompose.coilyco.ai/guides/sysadmin/): Vera changes running systems. Read this before you ask any other seat to touch production. - [Applied Scientist](https://acompose.coilyco.ai/guides/science/): Evie measures how agents and models behave on real hardware. Read this when you want a number rather than an opinion. - [Frontend Engineer](https://acompose.coilyco.ai/guides/frontend/): Delphi owns the surfaces a person navigates, including the words inside them. - [Game Developer](https://acompose.coilyco.ai/guides/gamedev/): Sprite ships playable games, the code and the assets and the build that carries both. - [Portfolio Director](https://acompose.coilyco.ai/guides/director/): Portia decides what the portfolio does next. Read this when the question is which thing, rather than how. - [Developer Advocate](https://acompose.coilyco.ai/guides/advocate/): Gem writes what reaches people outside the estate, and never sends it. ## housecast docs housecast's own documentation, mounted verbatim from its repository and ordered by a manifest rather than alphabetically. The [front door](https://housecast.coilyco.ai/docs/) lists every shelf. ### Getting started - [Features](https://housecast.coilyco.ai/docs/features/): Every capability that ships today, and what does not. ### The engine ### Evaluation - [Grading](https://housecast.coilyco.ai/docs/grading/): The human half, and why it ships in an extra. - [Grading surfaces](https://housecast.coilyco.ai/docs/grading-surfaces/): One set of rules across a terminal and a browser. - [Grading evidence](https://housecast.coilyco.ai/docs/grading-evidence/): The public and private halves of a single run. - [The deck](https://housecast.coilyco.ai/docs/deck/): housecast grade deck ROUNDS --run RUNDIR --out DECK builds - [The grading page](https://housecast.coilyco.ai/docs/grading-page/): housecast/grade/page/index.html renders a committed run and - [The grading page, payloads and delivery](https://housecast.coilyco.ai/docs/grading-page-delivery/): How grading-page.md gets data, and the test proving it needs - [The grading page palette](https://housecast.coilyco.ai/docs/grading-page-palette/): Where the colour and type come from, and where they deviate - [The grading page, colour and type](https://housecast.coilyco.ai/docs/grading-page-treatment/): How grading-page.md treats evidence, verdicts, and scale - [Presenting](https://housecast.coilyco.ai/docs/presenting/): housecast grade present serves a built deck to a room, taking - [Publishing to PyPI](https://housecast.coilyco.ai/docs/publishing/): How a housecast-v tag becomes a release - [Non-scores](https://housecast.coilyco.ai/docs/grading-non-scores/): A cell that is decided and is not a verdict, in three reasons - [CI](https://housecast.coilyco.ai/docs/ci/): How .forgejo/workflows/ci.yml gates main and pull requests - [MCP loop tasks](https://housecast.coilyco.ai/docs/mcp-tasks/): What a task file under housecast/mcpeval/tasks/ is, and what - [The live room](https://housecast.coilyco.ai/docs/room/): housecast room serve --subjects subjects.json --log - [The room's pages](https://housecast.coilyco.ai/docs/room-display/): The three pages room.md serves from housecast/room/page/ ## mcp-beaver docs mcp-beaver's own documentation, mounted verbatim from its repository and ordered by a manifest rather than alphabetically. The [front door](https://beaver.coilyco.ai/docs/) lists every shelf. ### Getting started - [The idea](https://beaver.coilyco.ai/docs/design/): One guardfile in, a running MCP out. - [Features](https://beaver.coilyco.ai/docs/features/): Every command and control that ships today. ### Guides - [serve](https://beaver.coilyco.ai/docs/serve/): Every grant becomes one tool and one endpoint. - [lint](https://beaver.coilyco.ai/docs/lint/): Validate a spec offline, then print its tool names. - [The passthrough proxy](https://beaver.coilyco.ai/docs/upstream/): Wrap an existing MCP down to an exact allowlist. - [Argument pins](https://beaver.coilyco.ai/docs/upstream-pins/): Fix a proxied argument when the scope rides in it. - [serve-ssm](https://beaver.coilyco.ai/docs/ssm/): One parameter, bounded twice, in policy and in IAM. - [serve-s3](https://beaver.coilyco.ai/docs/s3/): The one write-capable mode, fixed to a bucket. - [Image and packaging](https://beaver.coilyco.ai/docs/image/): One distroless binary drives every guardfile. - [CI](https://beaver.coilyco.ai/docs/ci/): Gate on every push, publish on a landed commit. - [The Helm chart](https://beaver.coilyco.ai/docs/chart/): Adding an MCP becomes a values file and an upgrade. - [Sidecars and upgrades](https://beaver.coilyco.ai/docs/chart-sidecars/): Co-locate an upstream, and why a selector blocks an upgrade. ### Reference - [Context nodes](https://beaver.coilyco.ai/docs/guardfile-siblings/): Instructions, resources, prompts, server-info. - [Controls](https://beaver.coilyco.ai/docs/guardfile-controls/): Pins, rate limits, cache, withheld verbs, confirmations. - [Extraction](https://beaver.coilyco.ai/docs/extraction/): Turn a PDF or a feed into something a model can read. - [Chart values](https://beaver.coilyco.ai/docs/chart-values/): Every value the chart takes, and what it defaults to. - [Request bounds](https://beaver.coilyco.ai/docs/request-bounds/): Deadlines, cancellation, and the upstream client. - [Protocol conformance](https://beaver.coilyco.ai/docs/conformance/): What MCP 2026-07-28 requires, and what it deprecated. - [Telemetry](https://beaver.coilyco.ai/docs/telemetry/): Opt-in OpenTelemetry, a no-op until you configure it. - [Structured logs](https://beaver.coilyco.ai/docs/logs/): One JSON line per call, joined to its trace. - [MCP Apps](https://beaver.coilyco.ai/docs/apps/): An MCP App is an interactive HTML widget a host renders in - [Generating the directory](https://beaver.coilyco.ai/docs/directory/): mcp-beaver directory -o <dir> sweeps the official MCP - [inherit: composing a guardfile from tiers](https://beaver.coilyco.ai/docs/inherit/): A guardfile can build on another - [OAuth2: a credential this runtime mints](https://beaver.coilyco.ai/docs/oauth2/): Every other value mcp-beaver presents is read from somewhere - [Pulling a guardfile from the registry](https://beaver.coilyco.ai/docs/pull/): mcp-beaver pull <registry-name> writes an mcp-upstream - [The registry-pull prototype](https://beaver.coilyco.ai/docs/registry-pull/): scripts/registry-probe/ is the working prototype behind - [Releasing mcp-beaver](https://beaver.coilyco.ai/docs/release/): Two artifacts leave this repo on two different cadences, and - [spec mode: resolving grants against an API document](https://beaver.coilyco.ai/docs/spec-mode/): A .mcp.kdl reaches its operations two ways now - [Guardfile controls on the proxy](https://beaver.coilyco.ai/docs/upstream-controls/): The sibling nodes an mcp-upstream guardfile states, and what ### Concepts - [Transports](https://beaver.coilyco.ai/docs/transports/): Two surfaces, one handler, and who owns the auth. - [Refusing an undeclared argument](https://beaver.coilyco.ai/docs/refusals/): A dropped filter returns a large, plausible, wrong number. ## umbra docs umbra's own documentation, mounted verbatim from its repository and ordered by a manifest rather than alphabetically. The [front door](https://umbra.coilyco.ai/docs/) lists every shelf. ### Getting started - [Getting started](https://umbra.coilyco.ai/docs/getting-started/): Install it, then watch a refusal. - [Features](https://umbra.coilyco.ai/docs/features/): The inventory of what ships today. - [Demos](https://umbra.coilyco.ai/docs/demos/): one verified, recorded demo per guardfile ### Guides - [The no-code driver](https://umbra.coilyco.ai/docs/umbra-cli/): Author policy and locks, never Go. - [Materialization](https://umbra.coilyco.ai/docs/umbra-materialization/): How `run` and `build` cache a generated binary. - [Fetch overlays](https://umbra.coilyco.ai/docs/specverb-fetch/): Mount fixed HTTP leaves straight from the guardfile. ### Reference - [Policy](https://umbra.coilyco.ai/docs/specverb-policy/): Auth, deny, restrict, tiering. - [Op resolution](https://umbra.coilyco.ai/docs/specverb-resolution/): Verbs, wildcards, unrecognised shapes. - [Request semantics](https://umbra.coilyco.ai/docs/specverb-request/): How a mounted leaf assembles and fires. - [Complex actions](https://umbra.coilyco.ai/docs/specverb-actions/): Composite verbs and their five invariants. - [Describe model](https://umbra.coilyco.ai/docs/specverb-describe/): Generated visibility for a generated surface. - [Descriptors](https://umbra.coilyco.ai/docs/specverb-descriptors/): The spec-driven source without a CLI tree. - [Inline operations](https://umbra.coilyco.ai/docs/opcore-inline/): Descriptors stated directly in KDL. - [Body projection](https://umbra.coilyco.ai/docs/opcore-body/): `map`, `set`, and pinned values. - [MCP Apps host](https://umbra.coilyco.ai/docs/mcpapps/): The frames a rendered widget sends back, under the guardfile. - [Serving the granted surface](https://umbra.coilyco.ai/docs/mcpverb-serving/): The same grants projected into what a server advertises. - [Value providers](https://umbra.coilyco.ai/docs/value-providers/): `env`, `file`, `literal`, and minted tokens. - [Audit spans](https://umbra.coilyco.ai/docs/audit-spans/): projecting audit records onto tracing spans, and why a - [default-allow](https://umbra.coilyco.ai/docs/execverb-default-allow/): Every other shape in the exec dialect is closed: a verb the - [Upstream guardfiles](https://umbra.coilyco.ai/docs/mcpverb-upstream/): `mcp-upstream`, the proxied-server shape - [Emitting OpenAPI](https://umbra.coilyco.ai/docs/openapigen/): rendering the granted subset as a spec other tools can read - [Action limits](https://umbra.coilyco.ai/docs/specverb-action-limits/): what an action deliberately cannot express, and what to reach - [YAML and TOML guardfiles](https://umbra.coilyco.ai/docs/guardfile-formats/): the same guardfiles in two other syntaxes, lowered to KDL - [Keyed maps and discriminated unions](https://umbra.coilyco.ai/docs/opcore-body-variants/): `keyed`, `entry`, and `variant` for a body shape a fixed - [Declaring a grant's response shape](https://umbra.coilyco.ai/docs/opcore-returns/): `returns`, enforced by pruning what a successful call hands - [Corpora](https://umbra.coilyco.ai/docs/corpora/): A corpus is the demo harness pointed at measurement instead - [Negative controls](https://umbra.coilyco.ai/docs/negative-controls/): umbra controls checks that every refusal a guardfile states ### Concepts - [Architecture](https://umbra.coilyco.ai/docs/architecture/): The two guarded surfaces and the shared core. - [Spec-driven verbs](https://umbra.coilyco.ai/docs/specverb/): The three-layer engine behind the HTTP surface. - [Exec-dialect verbs](https://umbra.coilyco.ai/docs/execverb/): The same grammar aimed at wrapped binaries. - [MCP-dialect verbs](https://umbra.coilyco.ai/docs/mcpverb/): The same grammar aimed at upstream MCP servers. - [What an MCP call costs](https://umbra.coilyco.ai/docs/mcpverb-cost/): Measured per-call latency, and the daemon it did not warrant. - [Occlusion primitives](https://umbra.coilyco.ai/docs/execverb-occlusion/): `withhold`, `pin`, and `resolve-flag` in the exec dialect - [Occluded replacement binaries](https://umbra.coilyco.ai/docs/execverb-replacement/): `replace`, and the generated binary installed under the ### Contributing - [Contributing](https://umbra.coilyco.ai/docs/contributing/): How to propose a change. - [Release pipeline](https://umbra.coilyco.ai/docs/release-pipeline/): Forgejo-canonical publication and the mark. ## Writing The [writing index](https://www.coilysiren.me/writing/) lists the promoted posts. Three are promoted. The rest of the archive is retained at its URLs but is not current. - [Stochastic Design Iteration](https://www.coilysiren.me/posts/stochastic-design-iteration/): A pattern for co-authoring a markdown design doc with an LLM. - [On Permissions Models for Cloud Platform Providers](https://www.coilysiren.me/posts/on-permissions-models-for-cloud-platform-providers/): How Kai would build permissions for a cloud platform provider. - [Deploying Azure OpenAI via Terraform](https://www.coilysiren.me/posts/azure-openai-terraform/): An end to end description of getting Azure OpenAI deployed via Terraform.