# 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. ## 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. - [housecast](https://housecast.coilyco.ai/): Human-graded behavior evaluations for any agent. Each answer goes in front of a person, with its target beside it, and the grade is recorded. - [agent-compose, archived](https://acompose.coilyco.ai/): agent-compose composed the context an agent harness loads into one bundle of plain files you could read before a run. It is no longer offered, and its source is no longer public. - [mcp-beaver, archived](https://beaver.coilyco.ai/): mcp-beaver rendered one umbra guardfile into an MCP server and an HTTP tool API, one tool per grant. It is no longer offered, and its source is no longer public. ## 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. ### Grading - [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/ - [The room as a static site](https://housecast.coilyco.ai/docs/room-site/): How the room pages ship without the room server serving them - [Commitments and prepared cases](https://housecast.coilyco.ai/docs/room-cases/): Every prompt carries a commitment (empty string when absent) - [Room load test](https://housecast.coilyco.ai/docs/room-load/): just room-load-test holds a dev or rehearsal room under - [A model per subject, and the fallback](https://housecast.coilyco.ai/docs/room-models/): Both are off until set, and with neither set every subject ## 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 - [paths-within](https://umbra.coilyco.ai/docs/execverb-paths-within/): A gate that refuses a call whose path operands leave a set of ### 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. - [umbra v2 on urfave/cli v4](https://umbra.coilyco.ai/docs/umbra-v2/): the living plan to rebuild on v4, and the upstream loop with ## 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.