@nyuchi/mzizi-mcp 0.12.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/README.md +112 -7
  2. package/dist/docs-federation.d.ts +1 -1
  3. package/dist/docs-federation.d.ts.map +1 -1
  4. package/dist/docs-federation.js +1 -0
  5. package/dist/docs-federation.js.map +1 -1
  6. package/dist/fundi-client.d.ts +6 -0
  7. package/dist/fundi-client.d.ts.map +1 -1
  8. package/dist/fundi-client.js +14 -3
  9. package/dist/fundi-client.js.map +1 -1
  10. package/dist/generated/registry-pin.d.ts +1 -1
  11. package/dist/generated/registry-pin.js +1 -1
  12. package/dist/generated/registry.d.ts +2 -2
  13. package/dist/generated/registry.d.ts.map +1 -1
  14. package/dist/generated/registry.js +254 -198
  15. package/dist/generated/registry.js.map +1 -1
  16. package/dist/generated/skills.d.ts +15 -1
  17. package/dist/generated/skills.d.ts.map +1 -1
  18. package/dist/generated/skills.js +227 -17
  19. package/dist/generated/skills.js.map +1 -1
  20. package/dist/http.d.ts +22 -2
  21. package/dist/http.d.ts.map +1 -1
  22. package/dist/http.js +116 -19
  23. package/dist/http.js.map +1 -1
  24. package/dist/limits.d.ts +32 -0
  25. package/dist/limits.d.ts.map +1 -0
  26. package/dist/limits.js +44 -0
  27. package/dist/limits.js.map +1 -0
  28. package/dist/registry.d.ts +1 -1
  29. package/dist/registry.d.ts.map +1 -1
  30. package/dist/registry.js +22 -1
  31. package/dist/registry.js.map +1 -1
  32. package/dist/server.d.ts +37 -2
  33. package/dist/server.d.ts.map +1 -1
  34. package/dist/server.js +96 -3
  35. package/dist/server.js.map +1 -1
  36. package/dist/stdio.js +5 -4
  37. package/dist/stdio.js.map +1 -1
  38. package/dist/tools.d.ts +21 -1
  39. package/dist/tools.d.ts.map +1 -1
  40. package/dist/tools.js +336 -86
  41. package/dist/tools.js.map +1 -1
  42. package/dist/worker.d.ts.map +1 -1
  43. package/dist/worker.js +3 -0
  44. package/dist/worker.js.map +1 -1
  45. package/package.json +18 -17
@@ -6,44 +6,254 @@
6
6
  * changes a SKILL.md redeploys the Worker, and the Worker is what answers
7
7
  * `mzizi_get_skills`.
8
8
  */
9
+ /** Skill categories, from mzizi-skills/index.schema.json. */
10
+ export const SKILL_CATEGORIES = ["dev", "design", "language", "build"];
9
11
  export const BUNDLED_SKILLS = [
10
12
  {
11
13
  "name": "mzizi-language",
12
- "description": "Write and check Mzizi language source (.mz): LANGUAGE-TRACKER.md as the one list of what Mzizi can and cannot do, the component syntax (enum tables, props, the view tree, when / for each, records, use motion), the backend service (routes, handlers with when / header / respond, example and ensure contracts; RFC-0011), the mz check --agent loop and its NDJSON diagnostics, mz fix for every exact fix, mz contract (a component's contract, or a service run in process), mz build (a service to a local Rust + axum package), the diagnostic codes you will meet (MZ0101, MZ0106, MZ0312, MZ0313, MZ0406–MZ0409, MZ06xx, MZ07xx, MZ08xx), and what is not built yet: expressions, bindings, callable functions, loops, error handling, modules, a standard library, component lowering, a release.",
13
- "body_mdx": "# Writing and checking Mzizi\n\n**Mzizi is a general-purpose programming language, built to make Rust better, the way\nTypeScript makes JavaScript better** (`CHARTER.md` v0.4, \"Mzizi: a general-purpose\nprogramming language\"). How: no borrows, lifetimes or ownership in the language you write\n(RFC-0001 §1.8), with the harness at the core, the layer an agent reads. \"Makes Rust better\"\nis the goal Phase 0 measures, not a result. Only a backend `service` lowers to Rust today; no\ncomponent does.\n\nRust is its platform, the way JavaScript is TypeScript's: Mzizi is designed to lower to Rust (RFC-0001 §5), and Mzizi\nRoots is its component model, the way React is JavaScript's. Its goal is to be the language\npeople choose instead of TypeScript, Python and C++: write Mzizi, get Rust underneath. That\nis a goal, not a result. Phase 0 has one goal: to build Mzizi as a programming language,\nmeasured against the best existing language for each kind of task (RFC-0009). Nothing has\nbeen measured against that yet.\nIts syntax, type system and diagnostics are designed for machine authorship.\n\nThe language lives in [`mzizi-dev/mzizi`](https://github.com/mzizi-dev/mzizi) (public). Say\nwhich thing is which when you describe it:\n\n- **The language:** its syntax, type system, semantics, and contracts as a language\n feature.\n- **The harness, the core of Mzizi:** the layer an agent reads and works through. It covers\n the language as an agent sees it (grammar, types, contracts, canonical form), the agent\n protocol (`mz check --agent`, its diagnostics and fixes; RFC-0001 §4), and the plugin\n host that the toolchain, the CLI, the MCP server and plugins attach to natively. Part of\n it exists today, in the toolchain: the `mz check --agent` output this skill teaches. The\n harness as a whole is designed, not built: RFC-0012 (a draft) specifies it, and there is no\n `mz harness` command and no plugin host, so never say it works. It lives in\n `mzizi-dev/mzizi`, the language repository, and the `agent-tools`\n packages (`@nyuchi/mzizi-cli`, `mzizi-mcp`, `fundi`) are its clients. It is not\n `benchmarks/harness/`, which is the Phase 0 benchmark scorer.\n- **The toolchain, which implements and supports the language:** `mz` (the compiler, its\n IR and its NDJSON diagnostics, `mz fix`, `mz contract`, `mz build`), `@nyuchi/mzizi-cli`, the MCP\n server at `mcp.mzizi.dev`, these skills, and the Phase 0 benchmark harness. They are\n meant to attach to the harness. Never call the compiler \"the language\".\n- **The components, which support the language:** Mzizi Roots and the registry\n (`mzizi-dev/mzizi-registry`), the language's UI layer. That is the companion\n `mzizi-roots` skill. Supplying the benchmark's UI tasks is one of their jobs, not what\n they are.\n\nThis skill describes `main` at `62a0f32` (2026-09-30): 425 tests in the workspace\n(`cargo test --workspace`, 294 of them in the compiler crate) and 12,644 lines in\n`compiler/src`. Where this skill and the code disagree, **the code is the fact** (RFC-0003\n§7.1). Every example below is copied from a file in the repository that passes `mz check`\nand `mz contract` there.\n\n## Check the tracker before you claim anything\n\n[`LANGUAGE-TRACKER.md`](https://github.com/mzizi-dev/mzizi/blob/main/LANGUAGE-TRACKER.md) in\nthe language repository is **the one list of what Mzizi can and cannot do** (owner, 2026-09-30).\nIf a capability is not ✅ there, Mzizi does not have it, whatever any other page says, this\nskill included. Its status column is what the code on `main` does, never what an RFC designs.\nRead it before you tell anyone Mzizi can do something, and before you write Mzizi that relies\non a construct this skill does not show.\n\nWhat exists is the front end of a language whose first domains are UI components and one\nbackend slice. What the tracker lists as missing is almost everything a general-purpose\nprogram needs:\n\n- **No expressions or operators** (C1): no arithmetic, no `+`, no `==`. Comparisons exist only\n inside contracts and handler conditions (`is`, `in`, `at_least`, `at_most`).\n- **No bindings** (C2): no variables, no named values, no assignment.\n- **No callable functions** (C3): `fn` parses, but a body is nothing beyond `emit`; there are no\n parameters, return values or calls.\n- **No loops** (C4) outside a view's `for each`, and no early return except a handler's\n `respond`.\n- **No error handling** (C9): no result type and no propagation. Contracts check behaviour;\n they are not error handling.\n- **No modules or imports** (P1): one component or one service per file.\n- **No standard library** (P2), no text operations (C6), `int` is the only number (C5), and\n there is no map, set or tuple (C7).\n- **No program entry point that runs** (C10): there is no `mz run`.\n\nThe public benchmark suites (MultiPL-E, EvalPlus) are blocked until functions exist.\n\n## What exists, and what does not\n\n**Built and tested, in the toolchain:** the lexer, the recovering parser, the name and type\nresolver, the agent diagnostic protocol (`mz check --agent`), `mz fix`, the content-addressed\nIR, `mz outline`, contract evaluation (`mz contract`), nine primitives written in Mzizi\n(`primitives/*.mz`), two component examples and one service (`examples/*.mz`), and the Phase 0\nbenchmark harness and runner. All of it is gated in CI.\n\n**The backend slice (RFC-0011), built and tested:** a `service` with HTTP routes and handlers\n(`when`, `header`, `respond`), checked by `mz check`. `mz contract` runs a service in process\nand evaluates its `example` and `ensure` clauses. `mz build` lowers a service to a local\nRust + axum package, which CI compiles, tests and serves. That is **the whole of the lowering\ntoday:** no component lowers, and the package is a local server, with no Workers, WebAssembly\nor Containers target and no deployment. The `mzizi-be` benchmark arm, the probe crate\n`mzprobe` and backend task B1 exist; no backend episode has run.\n\n**Not built:** everything in the tracker list above, lowering of components, rendering, a\nrelease and a published binary. A component `.mz` file today is checked and its contract\nevaluated; **nothing runs it.** Do not tell anyone Mzizi \"compiles to Rust\" or is \"production\nready\"; say it is designed to lower to Rust, and that only a service does so today.\n\n**In progress, as design only:**\n\n- **The harness.** RFC-0012 (draft). Only the agent protocol exists (`mz check --agent`,\n `mz fix`, `mz contract`).\n- **Contracts everywhere.** RFC-0010 (draft) extends contracts to functions, handlers,\n services and records. Component contracts (RFC-0006) and service contracts (RFC-0011 §7) are\n evaluated. Of RFC-0010's codes, `MZ0606`, `MZ0611`, `MZ0612` and `MZ0613` exist, for\n services; `MZ0607`–`MZ0610` do not exist in the compiler.\n- **Request bodies** for a service (`body input: <record>` and `reject` blocks, RFC-0011 §4.3)\n are designed and not built. So is state (task B4).\n- **Modules.** There are no imports. Components are referenced by bare name\n (`primitives/confirm_bar.mz` uses `button` and `alert` with no import line). A reference to\n another component's enum (`button_variant.ghost`) is warning `MZ0502`, because it cannot be\n checked until modules exist.\n\n**Results, as they fell.** Two Phase 0 pilots ran on 2026-09-27 and neither showed an\nadvantage for Mzizi. On the frontier model the Mzizi and Dioxus arms tied, with Mzizi about 8%\nfewer transcript tokens. On the ~7B open-weight model, the design target, Mzizi did worse on\nall three metrics. Neither pilot is the kill-criterion run (RFC-0009 §6), and that run has not\nhappened. The pilots were tests inside Phase 0 on a few registry UI components against\nDioxus, not its goal. \"Designed for agents\" and \"aims to replace TypeScript, Python and C++\"\nare accurate; \"faster\" or \"better\" is not.\n\n## Getting `mz`\n\nThere is no release. Build it from source; the compiler crate has zero dependencies:\n\n```bash\ngit clone https://github.com/mzizi-dev/mzizi.git && cd mzizi/compiler\ncargo build --bin mz # ../target/debug/mz\ncargo run --bin mz -- check ../primitives/button.mz\n```\n\n**Never `cargo install mz`.** The `mz` crate on crates.io is an unrelated project, and the\ncompiler crate (`mzizi-lang-compiler`) is `publish = false`.\n\n## The commands\n\n`mz` takes exactly one file per call. `mz check ../primitives/*.mz` is a usage error (exit 2).\nLoop over files instead.\n\n| Command | Does |\n| ----------------------------------- | -------------------------------------------------------------------------------- |\n| `mz check <file>` | human-readable diagnostics |\n| `mz check --agent <file>` | NDJSON: one diagnostic per line, then one summary line. **Target this.** |\n| `mz fix <file>` | applies every `exact` fix in place, in one pass, then re-checks the file |\n| `mz contract <file>` | evaluates the file's `contract` block (only on a file that checks clean) |\n| `mz contract --agent <file>` | the same, as NDJSON; the summary adds `contract_clauses` and `contract_failures` |\n| `mz outline <file>` | the interface only (name, enums, props, contract subjects), as valid Mzizi |\n| `mz hash <file>` / `mz ir <file>` | the content-addressed root hash / every IR node with its hash and path |\n| `mz build <service.mz> --out <dir>` | lowers a service to a Rust + axum Cargo package in `<dir>` (only a clean file) |\n\nExit status: **0** no errors (warnings do not fail), **1** errors or a failed contract\nassertion, **2** a usage or I/O problem. Branch on the status; parse the NDJSON for detail.\n\nOn a **service**, `mz contract` runs the service in process (no lowering, no socket), and the\nsummary adds `contract_tested`, the number of generated requests its `ensure` clauses were\ntested over. `mz outline`, `mz hash` and `mz ir` do not cover services yet and exit 2. `mz\nbuild` on a component exits 2 (\"components do not lower yet\"), and on a file with errors it\nprints them, builds nothing and exits 1.\n\n`check` and `contract` are deliberately separate: a compile error is not a defect, and a\ncontract failure is. Your file is done when **both** `mz check --agent` and\n`mz contract --agent` exit 0.\n\n## The loop\n\n1. Write the file.\n2. `mz check --agent file.mz`. If it exits 0, go to 5.\n3. `mz fix file.mz` to apply every `exact` fix. Read each remaining diagnostic's `say`; apply\n `guess` fixes only after checking them.\n4. Fix everything reported, then go to 2. Errors are independent, so fix them all before\n re-running; do not fix one and re-run to \"see the next\".\n5. `mz contract --agent file.mz`. `MZ0603` means an assertion is false (a defect in the\n component or the contract); `MZ0605` means it could not be evaluated, which **counts as a\n failure**.\n\n## Reading the NDJSON\n\nThis file is wrong on purpose. It is the example in `benchmarks/prompts/mzizi-guide.md`, which\n`benchmarks/prompts/verify-guide.sh` checks against the real compiler.\n\n```mz\n## WRONG ON PURPOSE: three mistakes.\ncomponent tag\n\n enum tag_size\n snug class \"h-13 px-3\"\n end\n\n prop onPick: event(none)\n prop size: tag_size = snug\n\n view\n row\n slot = \"tag\"\n class = \"rounded-full {size.class}\"\n tap = on_pick\n end\n end\n\n contract\n slot is \"tag\"\n tag_size.snug height 52\n end\n\nend\n```\n\n`mz check --agent tag.mz` exits 1 and prints exactly:\n\n```text\n{\"code\":\"MZ0101\",\"severity\":\"error\",\"file\":\"tag.mz\",\"span\":[8,8,8,14],\"say\":\"`onPick` is not snake_case — Mzizi names are snake_case, so write `on_pick`\",\"fix\":{\"span\":[8,8,8,14],\"replace\":\"on_pick\",\"confidence\":\"exact\"}}\n{\"code\":\"MZ0602\",\"severity\":\"error\",\"file\":\"tag.mz\",\"span\":[21,26,21,28],\"say\":\"a contract clause needs a predicate (is / in / contains / not_empty / at_least / uses / min_height / shows), found `52`\",\"fix\":{\"span\":[21,26,21,26],\"replace\":\"is \",\"confidence\":\"exact\"}}\n{\"code\":\"MZ0208\",\"severity\":\"error\",\"file\":\"tag.mz\",\"span\":[24,1,24,4],\"say\":\"top-level blocks close with their name: write `end component tag`\",\"fix\":{\"span\":[24,1,24,4],\"replace\":\"end component tag\",\"confidence\":\"exact\"}}\n{\"summary\":true,\"errors\":3,\"warnings\":0,\"exact_fixable\":3,\"ms\":0}\n```\n\n`mz fix tag.mz` then prints `mz: applied 3 exact fixes; 0 errors (0 exact-fixable) remain`, and\n`mz contract --agent tag.mz` reports `\"contract_clauses\":2,\"contract_failures\":0`.\n\n- `code`, `severity` (`error` or `warning`), `file` (the path you passed), `span`\n `[line, col, end_line, end_col]` (1-indexed, end exclusive) and `say` are always present.\n- `say` quotes the offending source, so you need not re-read the file to understand it.\n- `fix` is optional: put `replace` at `fix.span`. An empty `replace` is a deletion. `exact`\n is safe to apply blind; `guess` has the right location and an inferred replacement.\n- The last line is always the summary.\n\n## Syntax essentials\n\nOne file holds one component, or one service (see \"Services\" below). There is one form per\nintent: if a construct is not shown here or in the RFCs, assume it does not exist. The order\ninside a component is doc lines, `use`, `enum` and `record`, `prop`, `view`, `fn`, `contract`.\n\nA complete primitive, `primitives/badge.mz`:\n\n```mz\n## A small status label. Not interactive, so no touch floor applies.\n## Corpus reference: n2-primitives/badge.tsx.\ncomponent badge\n\n enum badge_variant\n default class \"bg-primary text-primary-foreground\"\n secondary class \"bg-secondary text-secondary-foreground\"\n destructive class \"bg-destructive/10 text-destructive dark:bg-destructive/20\"\n outline class \"border-border text-foreground bg-input/30\"\n ghost class \"hover:bg-muted hover:text-muted-foreground\"\n link class \"text-primary underline-offset-4 hover:underline\"\n end\n\n prop variant: badge_variant = default\n prop label: text\n\n view\n mark\n slot = \"badge\"\n portal = \"https://mzizi.dev/components/badge\"\n variant = variant\n class = \"inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-md border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all {variant.class}\"\n text = label\n end\n end\n\n contract\n every badge_variant class not_empty\n badge_variant.default class contains \"bg-primary\"\n slot is \"badge\"\n end\n\nend component badge\n```\n\n- **Shape.** `component <name>` opens the file and `end component <name>` closes it, repeating\n the name. Every other block (`enum`, `record`, `view`, `contract`, each element, each `when`,\n each `for each`, each `fn`) closes with a bare `end`. Never `end enum` or `end view`.\n- **Comments.** `##` to end of line is the only comment form. `//` and `/* */` are errors.\n- **Names** are `snake_case`. `onRemove` is `MZ0101`, with the snake form as its `exact` fix.\n- **Enums are variant tables.** One row per variant: its name, then `column value` pairs. Every\n variant has every column (`MZ0303` otherwise). A column can carry meaning beyond styling, as in\n `primitives/alert.mz`, where `announce` ties the ARIA role to the severity:\n\n ```mz\n enum alert_variant\n default class \"bg-card text-card-foreground\" announce \"status\"\n destructive class \"bg-card text-destructive\" announce \"alert\"\n warning class \"bg-card text-[var(--status-warning,#FFD740)]\" announce \"alert\"\n info class \"bg-card text-[var(--status-info,#00B0FF)]\" announce \"status\"\n end\n ```\n\n- **Heights come from the class.** A variant's `height` is the pixels its `h-N` or `size-N`\n class renders (`N × 4`). You may leave the `height` column out. A written `height` that\n disagrees with the class is `MZ0313`, and its `exact` fix is the rendered number.\n- **Props.** `prop <name>: <type>`, optionally `= <default>`. The types are an enum name\n (`= default`), `text`, `bool`, `int`, `event(none)`, `event(<type>)`, `list(<type>)`\n (omitted means empty), `option(<type>)` (omitted means none) and a record name. Never\n `option(list(T))` (`MZ0703`).\n- **The view** holds exactly one element tree. An element is a bare word on its own line,\n closed by `end`. Inside it, each line is an attribute `name = value` (the `=` is required),\n a child element, a `when` block, a `for each`, or `nothing`. Strings interpolate with\n `{...}`; there is no `+`.\n- **Conditionals.** `when x` … `end`, `when not x`, `when v is <variant>`, and for an option or\n a list `when x is none` … `else` … `end`. There is no `if` (`MZ0407`, `exact` fix `when`)\n and no `match`. From `primitives/avatar.mz`:\n\n ```mz\n when image is none\n row\n slot = \"avatar-fallback\"\n class = \"flex size-full items-center justify-center rounded-full bg-muted text-muted-foreground {size.text_class}\"\n text = initials\n end\n else\n picture\n slot = \"avatar-image\"\n source = image\n alt = alt\n class = \"aspect-square size-full rounded-full object-cover\"\n end\n end\n ```\n\n- **Lists** render with `for each item in items`, whose first line is its `key = item.<field>`.\n- **Capabilities.** `use motion` if the component animates (`primitives/spinner.mz`). Nothing\n else needs `use`.\n- **Events.** Bind with `tap = on_tap` / `change = on_change`. A parameterless `fn` can `emit`\n an event prop, as in `examples/connectivity_bar.mz`:\n\n ```mz\n fn retry\n emit on_state_change(syncing)\n end\n ```\n\n- **No React carry-overs.** `...props` spreads are `MZ0106` (`exact` fix deletes the line).\n An `as_child` prop is warning `MZ0312`: delete it, and keep what the `as_child = false`\n branch renders. `className` pass-through has no equivalent.\n\n`benchmarks/prompts/mzizi-guide.md` is the complete one-file guide the benchmark gives a model,\nincluding records, `for each` and a React-to-Mzizi table. Read it before writing a component.\n\n## Services (the backend slice, RFC-0011)\n\nA backend program is one file holding one `service`, closed by `end service <name>`. Every\ninner block (`record`, `route`, `fallback`, `when`, `contract`) closes with a bare `end`. The\norder is doc lines, service-level `header` lines, `record`s (and `enum`s), `route`s,\n`fallback`, `contract`. There are no imports, no `main`, no server setup and no port.\n\n`examples/registry.mz`, the example service (22 clauses, all holding; its `ensure` clauses\ntested over 61 generated requests):\n\n```mz\n## A registry of two components: routes, methods, redirects and a JSON 404.\n## RFC-0011's worked example, shaped like the API gateway's `/v1/ui` routes (RFC-0009 §2.4, B1).\nservice registry\n\n header \"x-mzizi-source\" \"fixture\"\n\n record problem\n field error: text\n end\n\n record health\n field status: text\n end\n\n record item\n field name: text\n end\n\n route health_check\n get \"/v1/health\"\n respond 200 json health status \"ok\"\n end\n\n route ui_list\n get \"/v1/ui\"\n respond 200 file \"fixtures/ui.json\"\n end\n\n route ui_item\n get \"/v1/ui/{name}\"\n when name in \"badge\" \"button\"\n respond 200 json item name name\n end\n header \"cache-control\" \"private, no-cache, no-store, max-age=0, must-revalidate\"\n respond 404 json problem error \"Not found\"\n end\n\n fallback\n header \"cache-control\" \"private, no-cache, no-store, max-age=0, must-revalidate\"\n respond 404 json problem error \"Not found\"\n end\n\n contract\n example get \"/v1/health\" body.status is \"ok\"\n example get \"/v1/ui\" status is 200\n example get \"/v1/ui\" header \"content-type\" is \"application/json\"\n example get \"/v1/ui/button\" status is 200\n example get \"/v1/ui/button\" body.name is \"button\"\n example get \"/v1/ui/does-not-exist\" status is 404\n example get \"/v1/ui/does-not-exist\" body.error is \"Not found\"\n example get \"/v1/ui/does-not-exist\" header \"cache-control\" is \"private, no-cache, no-store, max-age=0, must-revalidate\"\n example head \"/v1/ui/button\" status is 200\n example head \"/v1/ui/button\" body is \"\"\n example options \"/v1/ui\" status is 204\n example options \"/v1/ui\" header \"allow\" is \"GET, HEAD, OPTIONS\"\n example delete \"/v1/ui/button\" status is 405\n example delete \"/v1/ui/button\" body is \"\"\n example get \"/v1/ui/\" status is 308\n example get \"/v1/ui/?limit=2\" header \"location\" is \"/v1/ui?limit=2\"\n example get \"/nope\" status is 404\n example get \"/nope\" header \"content-type\" is \"application/json\"\n ensure status in 200 204 308 404 405\n ensure header \"x-mzizi-source\" is \"fixture\"\n ensure when status is 404 then body.error is \"Not found\"\n ensure when status is 405 then header \"allow\" is \"GET, HEAD, OPTIONS\"\n end\n\nend service registry\n```\n\n- **A route** is `route <name>`, then exactly one `<method> \"<pattern>\"` line, then zero or\n more `query <name>: option(<scalar>)` lines, then statements, then `end`. The methods are\n `get`, `head`, `post`, `put`, `patch`, `delete` and `options`, lower case; a second method on\n the same path is a second route.\n- **A pattern** is `/` or `/`-separated segments of lower-case letters, digits and `-._~`,\n or a whole-segment `{name}`, which binds `name` as `text`. No trailing slash, no empty\n segment, no `?`. A literal segment beats a parameter at the same position.\n- **A query parameter is always an option:** `query limit: option(int)`. `option(int)` is\n `-`? then ASCII digits, so `\"0x10\"`, `\"1e2\"`, `\" 7 \"` and `\"1.5\"` are `none`; `option(bool)`\n is exactly `true` or `false`. Bad input is absence, never an error.\n- **A handler has three statements**, and every path through it must end in `respond`:\n\n | Statement | Means |\n | -------------------------------- | --------------------------------------------------------- |\n | `when <cond>` … [`else` …] `end` | a branch; with no `else`, a false condition falls through |\n | `header \"<name>\" \"<value>\"` | set a header on the response this path sends |\n | `respond <status> [<body>]` | send the response; nothing after it on the path runs |\n\n A condition is `p` / `not p` (a `bool`), `p is <literal>`, `p in <literal> …`,\n `p at_least <n>` / `p at_most <n>` (an `int`), or `p is none` … `else` (an option, which is\n narrowed in the `else`). There is no `if`, `==`, `return`, assignment, loop or call.\n\n- **Bodies:** none; `json <record> <field> <value> …` (every field once, a literal or a\n parameter, no punctuation; `application/json`); `text \"<string>\"` (may interpolate a\n parameter as `{name}`); or `file \"<path>\"` (a fixture beside the `.mz` file, embedded at\n build time). A response record's fields are scalars or options of scalars. `204`, `304` and\n `1xx` take no body.\n- **Headers** are lower case. A service-level `header` applies to every response, runtime\n ones included; a route's own `header` for the same name wins. `content-length` and\n `transfer-encoding` belong to the server.\n- **The runtime answers what HTTP defines, so do not write it:** `HEAD` for a `get` route\n (its status and headers, no body); `OPTIONS` (`204` with `allow`, e.g. `GET, HEAD, OPTIONS`);\n any other undeclared method on a matched path (`405` with the same `allow`, no body); and a\n trailing slash or `//` (`308` to the canonical path, query kept, never off-site). A path no\n route matches runs `fallback`, or gets an empty `404` when there is none.\n- **The contract:** `example <method> \"<target>\" <facet> <predicate>` sends one request;\n `ensure [when <facet> <predicate> then] <facet> <predicate>` must hold for every generated\n request. A facet is `status`, `header \"<name>\"`, `body` or `body.<field>`; a predicate is\n `is <value>`, `in <value> …`, `not_empty`, `contains \"<text>\"`, `at_least <n>` or\n `at_most <n>`. `header \"<name>\" is none` asserts absence and `body is \"\"` an empty body.\n `ensure` is **tested** over the generated set, never proven.\n\nThis file is wrong on purpose. It is the example in `benchmarks/prompts/mzizi-be-guide.md`:\n\n```mz\n## WRONG ON PURPOSE: three mistakes.\nservice shop\n\n record problem\n field error: text\n end\n\n route item\n GET \"/v1/items/{id}/\"\n when id is \"1\"\n respond 200 text \"one\"\n end\n end\n\nend service shop\n```\n\n`mz check --agent candidate.mz` exits 1 and prints:\n\n```text\n{\"code\":\"MZ0613\",\"severity\":\"warning\",\"file\":\"candidate.mz\",\"span\":[2,9,2,13],\"say\":\"`service shop` has no `contract` block — its behaviour is unverified (RFC-0010 §8)\"}\n{\"code\":\"MZ0801\",\"severity\":\"error\",\"file\":\"candidate.mz\",\"span\":[9,5,9,8],\"say\":\"`GET` is not a method — a route declares one of get, head, post, put, patch, delete, options\",\"fix\":{\"span\":[9,5,9,8],\"replace\":\"get\",\"confidence\":\"exact\"}}\n{\"code\":\"MZ0802\",\"severity\":\"error\",\"file\":\"candidate.mz\",\"span\":[9,9,9,26],\"say\":\"`\\\"/v1/items/{id}/\\\"` ends with `/` — patterns have no trailing slash; the runtime redirects `…/` to the path without it\",\"fix\":{\"span\":[9,9,9,26],\"replace\":\"\\\"/v1/items/{id}\\\"\",\"confidence\":\"exact\"}}\n{\"code\":\"MZ0804\",\"severity\":\"error\",\"file\":\"candidate.mz\",\"span\":[13,3,13,6],\"say\":\"a path through `route item` reaches `end` without a `respond` — when the `when` on line 10 does not respond on both branches; every path must respond\"}\n{\"summary\":true,\"errors\":3,\"warnings\":1,\"exact_fixable\":2,\"ms\":0}\n```\n\n`mz fix` applies the two `exact` fixes. `MZ0804` needs a decision: add\n`respond 404 json problem error \"Not found\"` after the `when`'s `end`, so the false path\nresponds too.\n\n**Building it.** `mz build registry.mz --out <dir>` checks the file and, with zero errors,\nwrites `Cargo.toml`, `src/main.rs` and the fixtures. The package is its own workspace root,\ngenerated output that is never committed, and depends on `axum =0.8.9` and `tokio =1.53.1`\n(tests add `tower`, `http-body-util` and `serde_json`). Every `example` becomes one\n`#[tokio::test]` (`cargo test` in the package); `ensure` clauses are evaluated by\n`mz contract` only. `cargo run --release --manifest-path <dir>/Cargo.toml` serves\n`127.0.0.1:$PORT` (8080 by default) and prints `listening on http://127.0.0.1:<port>`.\n\n## Contracts\n\nEvery component carries a `contract … end` block: one assertion per line,\n`<subject> <predicate>`, no colon. A file with no contract is warning `MZ0501`. It is checked\nagainst the file's own enums, view attributes and prop defaults (RFC-0006). From\n`primitives/button.mz`:\n\n```mz\n contract\n every button_size height at_least 48\n button_size.default height is 56\n button_size.sm height is 48\n button_variant.default class contains \"bg-primary\"\n slot is \"button\"\n end\n```\n\n| Subject | Means |\n| --------------------------- | -------------------------------------------------- |\n| `every <enum> <column>` | that column in every variant |\n| `<enum>.<variant> <column>` | one cell |\n| `<attribute>` | the root view element's attribute (`slot`, `role`) |\n| `<prop>` | the prop's default (only a prop that has one) |\n| `<element> \"<text>\"` | the element carrying that text |\n| `when <name>` | the `when` branch that mentions that name |\n\nPredicates: `is <value>` (exactly as written: `height is \"52\"` fails against `height 52`),\n`contains \"<s>\"`, `not_empty`, `at_least <n>`, `in \"<a>\" \"<b>\"`, `uses \"--token\"`,\n`uses <component>` (no subject), `shows <element> \"<t>\"` (after `when <name>`) and\n`min_height <n>`. `examples/connectivity_bar.mz` uses the last two:\n\n```mz\n when offline shows button \"Retry\"\n button \"Retry\" min_height 48\n```\n\nAssert what the source guarantees: every interactive size clears 48px, the `slot`, and the key\ncells. An assertion on a prop with no default is `MZ0605` (unevaluable), which fails.\n\n`mz contract` checks nothing rendered. The rendered half is `benchmarks/harness`, which diffs a\n`.mz` component's variants, defaults, touch heights and `data-slot` set against the Rust\nreference. Mzizi Roots components carry the same clause grammar as `pub const CONTRACT` and\ncheck it against their server-rendered markup (see the `mzizi-roots` skill).\n\nThe direction (RFC-0010, draft) is that **everything built carries a contract**: components,\nlanguage functions and backend handlers. The component form and the service form (\"Services\"\nabove) are evaluated today; functions have no contracts because they have no bodies.\n\n## Diagnostic codes you will meet\n\nThe ranges are `MZ01xx` lexing and names, `MZ02xx` blocks and closers, `MZ03xx` declarations,\n`MZ04xx` the view, `MZ05xx` lints, `MZ06xx` contracts, `MZ07xx` types and resolution, and\n`MZ08xx` services and handlers. The full tables are RFC-0001 §4.7, RFC-0006 §8, RFC-0008\n(types), RFC-0010 §6 and RFC-0011 §9. A service reuses `MZ0701`, `MZ0707`, `MZ0708` and\n`MZ0710` for unknown names and un-narrowed options.\n\n| Code | Severity | Written | Repair |\n| ------------------- | -------- | ---------------------------------------------------------------------------------- | ---------------------------------------------- |\n| `MZ0101` | error | a name that is not `snake_case` | `exact`: the snake form |\n| `MZ0105` | error | `list<T>`, `T[]`, `[T]` | `exact`: `list(T)` |\n| `MZ0106` | error | `...props`, `{...props}`, `..attributes` | `exact`: delete (the whole line when alone) |\n| `MZ0204` | error | a block never closed | `guess`: insert the `end`s |\n| `MZ0206`–`MZ0208` | error | a wrong closer (`end view`, a bare `end` for `component`) | `exact`: rewrite the whole closer line |\n| `MZ0303` | error | a variant missing a column another variant has | add the column |\n| `MZ0312` | warning | `prop as_child: bool` (React `asChild`) | `exact` when unread: delete the prop |\n| `MZ0313` | error | `icon class \"size-14\" height 48` | `exact`: the rendered px (`56`) |\n| `MZ0406` | error | `class \"flex\"` (attribute without `=`) | insert `=` (`exact` for known attribute words) |\n| `MZ0407` | error | `if open` | `exact`: `when open` |\n| `MZ0408` | error | an attribute directly under `view` | move it inside the root element |\n| `MZ0409` | error | `span class = \"x\"` (more after an element word) | put the element word on its own line |\n| `MZ0501` | warning | no `contract` block | write one |\n| `MZ0502` | warning | `<other>_enum.variant` from another component | none until modules |\n| `MZ0602` | error | a clause with no predicate (`height 52`) | `exact`: insert `is` (needs an operand) |\n| `MZ0603` | error | **an assertion that does not hold** | fix the component or the clause |\n| `MZ0605` | error | an assertion that cannot be evaluated | assert something the file defines |\n| `MZ0606` | error | an `example` status that an `ensure status in …` rules out | fix one of the two |\n| `MZ0611` / `MZ0612` | error | a service `ensure` / `example` that does not hold | `say` quotes the request that broke it |\n| `MZ0613` | warning | a service with no or an empty `contract` block | write one |\n| `MZ0701` | error | an unknown type (`strng`) | alias or nearest-name fix |\n| `MZ0706` | error | a default that does not fit its type | varies |\n| `MZ0707` / `MZ0708` | error | an unknown name / variant, column or field | nearest-name fix |\n| `MZ0710` | error | an option used without `when … is none … else` | narrow it first |\n| `MZ0711` / `MZ0712` | error | a wrong kind of value / a `when` that does not fit its type | see `say` |\n| `MZ0801` | error | a route not opening with `<method> \"<pattern>\"`, `GET`, a second method line | `exact` for `GET`; else a `guess` |\n| `MZ0802` | error | a bad pattern: trailing `/`, empty segment, `?`, no leading `/` | `exact` where the repair is certain |\n| `MZ0803` | error | two routes with one method and the same pattern | delete or change one |\n| `MZ0804` | error | a handler path that reaches `end` without `respond` | add the `respond` |\n| `MZ0805` | error | a line after `respond` that can never run | `exact`: delete it |\n| `MZ0806` | error | a bad `respond`: no status, not 100–599, a body on `204` | `exact` deletes a body that is not allowed |\n| `MZ0807` | error | a bad `header`: `\"Cache-Control\"`, set twice, server-owned | `exact`: the lower-case name |\n| `MZ0808` | error | a `json` literal with a missing, repeated or ill-typed field (unknown is `MZ0708`) | give every field once |\n| `MZ0809` | error | `query limit: int` | `exact`: `option(int)` |\n| `MZ0810` | error | a `file \"…\"` fixture that does not exist | add the file or fix the path |\n| `MZ0811` | error | a line a service or handler cannot hold (`return`, `=`, `view`) | see `say` (`is` for `=` is `exact`) |\n| `MZ0812` | error | a second `fallback`, or a route or parameter name used twice | rename or delete one |\n\nTwo real outputs, from pilot-2 candidates written by the 7B model and re-checked on `main`\n(`benchmarks/results/2026-09-27-pilot-2/raw/scored/…/mzizi/{button,badge}/seed-1/iter-01/candidate.mz`):\n\n```text\n{\"code\":\"MZ0313\",\"severity\":\"error\",\"file\":\"candidate.mz\",\"span\":[16,35,16,37],\"say\":\"`icon` declares `height 48` but its class `size-14` renders 56px (N × 4) — write `height 56`, or drop the column and let the class say it once\",\"fix\":{\"span\":[16,35,16,37],\"replace\":\"56\",\"confidence\":\"exact\"}}\n{\"code\":\"MZ0106\",\"severity\":\"error\",\"file\":\"candidate.mz\",\"span\":[15,8,15,16],\"say\":\"`...props` is a spread, and Mzizi has none: a component names each prop it reads and each attribute it sets. `props` has no equivalent — delete the line\",\"fix\":{\"span\":[15,1,16,1],\"replace\":\"\",\"confidence\":\"exact\"}}\n```\n\n## Contributing to the language\n\n- A language change needs an RFC in `design/`. Take the next unused number: RFC-0005 is\n reserved, and RFC-0011 (handlers) and RFC-0012 (the harness) exist, so the next is\n RFC-0013.\n- A PR that changes what the language can do updates its row in `LANGUAGE-TRACKER.md` in the\n same PR, with evidence, and adds a `CHANGELOG.md` entry.\n- CI runs `cargo fmt -- --check`, `cargo clippy --all-targets -- -D warnings`, `cargo test`,\n and `mz check` and `mz contract` over every file in `examples/` and `primitives/`, one file\n per call. Its `lowering` job runs `mz build` on `examples/registry.mz`, then `cargo test` and\n one request over a socket against the package, and `mzprobe verify` of task B1. `AGENTS.md`\n in the repo has the exact script.\n- Pull requests are rebase-merged. State what you measured in the commit message.\n- The repo consumes nothing else in the org: no build step, test or script may reach into\n `mzizi-registry` or `agent-tools`.\n\n## See also\n\n- `LANGUAGE-TRACKER.md` (what Mzizi can and cannot do), `CHARTER.md` (v0.4),\n `design/RFC-0001` (syntax and the agent protocol), `RFC-0006` (contracts), `RFC-0008`\n (types, collections, records), `RFC-0009` (the comparison benchmark and the kill\n criterion), `RFC-0010` (contracts everywhere, draft), `RFC-0011` (handlers, the backend\n slice), `RFC-0012` (the harness, draft), `benchmarks/prompts/mzizi-be-guide.md` (the\n one-file service guide) and `benchmarks/READINESS.md`.\n- The `mzizi-backend` skill: where a Mzizi service stands against the live TypeScript Workers.\n- The `mzizi-roots` skill: the Rust components built to support the language, its component\n model and where a component lowering would target.",
14
- "source": "mzizi-dev/agent-tools/mzizi-skills/skills/mzizi-language"
14
+ "category": "language",
15
+ "description": "Write and check Mzizi language source (.mz): LANGUAGE-TRACKER.md as the one list of what Mzizi can and cannot do, the component syntax (enum tables, props, the view tree, when / for each, records, use motion), the backend service (routes, handlers with when / header / respond, example and ensure contracts; RFC-0011), the mz check --agent loop and its NDJSON diagnostics, mz fix for every exact fix, mz contract (a component's contract, or a service run in process), mz build (a service to a local Rust + axum package), the diagnostic codes you will meet (MZ0101, MZ0106, MZ0312, MZ0313, MZ0406–MZ0409, MZ06xx, MZ07xx, MZ08xx), programs (RFC-0013, tracker C1-C10: functions, bindings, control flow, numbers, text, collections, records, enums, result and try) checked by mz check and run by mz run, the language harness (mz harness), and what is not built yet: modules, a standard library, component lowering, Rust interop, I/O, concurrency, generics, mz test, a release.",
16
+ "body_mdx": "# Writing and checking Mzizi\n\n**Mzizi is a general-purpose programming language, built to make Rust better, the way\nTypeScript makes JavaScript better** (`CHARTER.md` v0.4, \"Mzizi: a general-purpose\nprogramming language\"). How: no borrows, lifetimes or ownership in the language you write\n(RFC-0001 §1.8), with the harness at the core, the layer an agent reads. \"Makes Rust better\"\nis the goal Phase 0 measures, not a result. Only a backend `service` lowers to Rust today; no\ncomponent does.\n\nRust is its platform, the way JavaScript is TypeScript's: Mzizi is designed to lower to Rust (RFC-0001 §5), and Mzizi\nRoots is its component model, the way React is JavaScript's. Its goal is to be the language\npeople choose instead of TypeScript, Python and C++: write Mzizi, get Rust underneath. That\nis a goal, not a result. Phase 0 has one goal: to build Mzizi as a programming language,\nmeasured against the best existing language for each kind of task (RFC-0009). Nothing has\nbeen measured against that yet.\nIts syntax, type system and diagnostics are designed for machine authorship.\n\nThe language lives in [`mzizi-dev/mzizi`](https://github.com/mzizi-dev/mzizi) (public). Say\nwhich thing is which when you describe it:\n\n- **The language:** its syntax, type system, semantics, and contracts as a language\n feature.\n- **The harness, the core of Mzizi:** the layer an agent reads and works through. It covers\n the language as an agent sees it (grammar, types, contracts, canonical form), the agent\n protocol (`mz check --agent`, its diagnostics and fixes; RFC-0001 §4), and the plugin\n host that the toolchain, the CLI, the MCP server and plugins attach to natively. Part of\n it exists today, in the toolchain: the `mz check --agent` output this skill teaches. The\n harness as a whole is designed, not built: RFC-0012 (a draft) specifies it, and there is no\n `mz harness` command and no plugin host, so never say it works. It lives in\n `mzizi-dev/mzizi`, the language repository, and the `agent-tools`\n packages (`@nyuchi/mzizi-cli`, `mzizi-mcp`, `fundi`) are its clients. It is not\n `benchmarks/harness/`, which is the Phase 0 benchmark scorer.\n- **The toolchain, which implements and supports the language:** `mz` (the compiler, its\n IR and its NDJSON diagnostics, `mz fix`, `mz contract`, `mz build`), `@nyuchi/mzizi-cli`, the MCP\n server at `mcp.mzizi.dev`, these skills, and the Phase 0 benchmark harness. They are\n meant to attach to the harness. Never call the compiler \"the language\".\n- **The components, which support the language:** Mzizi Roots and the registry\n (`mzizi-dev/mzizi-registry`), the language's UI layer. That is the companion\n `mzizi-roots` skill. Supplying the benchmark's UI tasks is one of their jobs, not what\n they are.\n\nThis skill describes `main` at `cf3a44e` (2026-11-01): 765 tests in the workspace\n(`cargo test --workspace`, 634 of them in the compiler crate) and 33,540 lines in\n`compiler/src`. Where this skill and the code disagree, **the code is the fact** (RFC-0003\n§7.1). Every example below is copied from a file in the repository that passes `mz check`,\n`mz contract` and, for a program, `mz run` there.\n\n## Check the tracker before you claim anything\n\n[`LANGUAGE-TRACKER.md`](https://github.com/mzizi-dev/mzizi/blob/main/LANGUAGE-TRACKER.md) in\nthe language repository is **the one list of what Mzizi can and cannot do** (owner, 2026-09-30).\nIf a capability is not ✅ there, Mzizi does not have it, whatever any other page says, this\nskill included. Its status column is what the code on `main` does, never what an RFC designs.\nRead it before you tell anyone Mzizi can do something, and before you write Mzizi that relies\non a construct this skill does not show.\n\n**In a `program` (RFC-0013, rows C1–C10, all ✅ on `main` since the 2026-10-08 releases):**\nexpressions and operators (arithmetic, comparison with `is`, `and` / `or`, text interpolation\n`\"{x}\"`), bindings (`let`, `var`, assignment), functions with parameters, return types and\nrecursion, control flow (`when` / `else when` / `else`, exhaustive `match`, `when` and `match`\nas values, `for each` over `range(a, to = b)` or a list, `while`, `break`, `continue`, early\n`return`), `int` and `float` with the numeric methods, text methods (`s[i]`, `slice`, `find`,\n`split`, `chars`, `parse_int`, `parse_float`), collections (`list(T)`, `map(K, V)`, `set(K)`,\nbracket literals, indexing that returns an option read with `otherwise`, `in`, the named\nfolds), records with methods, enums with columns, and errors (`result(T, E)`,\n`return error(e)`, prefix `try`, a `match` on a result, and `main` returning a result).\n`mz run` lowers a program to a dependency-free Rust package, builds it with Cargo and runs it.\n\n**Still missing (❌ or partial in the tracker):** modules and imports (P1; one top-level\ndeclaration per file), a standard library (P2), lowering of components (P3 is partial: a\n`service` and a `program` lower, no component does), Rust interop (P6), state and I/O (P8),\nconcurrency (P9), generics and interfaces (P12), a formatter, a language server, `mz test`,\npackage management and a published release (`mzizi-lang-compiler` 0.0.0, `publish = false`).\nErrors are not yet mapped back to `.mz` lines (P5, designed). Do not write Mzizi that needs\nany of these, and do not tell anyone it exists.\n\nTwo pilots have run and neither showed an advantage for Mzizi. The run that tests the\ncharter's kill criterion has not happened, so never write that Mzizi is faster or better.\n\n## What exists, and what does not\n\n**Built and tested, in the toolchain:** the lexer, the recovering parser, the name and type\nresolver, the agent diagnostic protocol (`mz check --agent`), `mz fix`, the content-addressed\nIR, `mz outline`, contract evaluation (`mz contract`), the language harness (`mz harness`,\nRFC-0012: one machine-readable definition of every feature, operator and diagnostic code),\nnine primitives written in Mzizi (`primitives/*.mz`), component, service and program examples\n(`examples/*.mz`, each program with the output `mz run` must print in `examples/<name>.expected`),\nand the Phase 0 benchmark harness and runner. All of it is gated in CI.\n\n**Programs (RFC-0013), built and tested.** A `program` file holds one program with `fn main`.\n`mz check` checks it, and `mz run` lowers it to Rust, builds it and runs it:\n\n```mz\n## Fibonacci numbers by recursion, in RFC-0013's foundation slice (§18.1): functions,\n## calls, `let`, `var`, `when`, integer arithmetic and `print`, and no loops yet.\n## `mz run examples/fib.mz` prints what fib.expected holds; CI compares the two.\nprogram fib\n\n fn main\n print(\"fib(9) is {fib(9)}\")\n let n = 20\n let f = fib(n)\n print(\"fib({n}) is {f}\")\n var total = 0\n total = total + fib(10)\n total = total + fib(11)\n print(\"fib(10) + fib(11) is {total}, and that is fib(12): {total is fib(12)}\")\n print(parity(f))\n end fn main\n\n fn fib(n: int): int\n when n < 2\n return n\n end\n return fib(n - 1) + fib(n - 2)\n end fn fib\n\n fn parity(n: int): text\n when n % 2 is 0 and n > 0\n return \"{n} is even\"\n else\n return \"{n} is odd, or not positive\"\n end\n end fn parity\n\nend program fib\n```\n\n`mz run examples/fib.mz` prints:\n\n```text\nfib(9) is 34\nfib(20) is 6765\nfib(10) + fib(11) is 144, and that is fib(12): true\n6765 is odd, or not positive\n```\n\nErrors are values. A function returns `result(T, E)`, fails with `return error(e)`, and a\ncaller handles the result with `match` or propagates it with prefix `try`:\n\n```mz\n## Checks ages: one function fails with an error, its callers handle it with `match` or\n## propagate it with `try`, and `main` itself returns a result (RFC-0013 §12).\nprogram errors\n\n enum age_problem\n negative say \"is below zero\"\n too_old say \"is above 150\"\n end\n\n fn main: result(none, age_problem)\n print(describe(42))\n print(describe(-3))\n print(describe(200))\n let total = try total_age(20, 22)\n print(\"20 and 22 make {total}\")\n match total_age(20, 151)\n case ok sum\n print(\"20 and 151 make {sum}\")\n case error problem\n print(\"20 and 151 were rejected: {problem} {problem.say}\")\n end\n end fn main\n\n fn check_age(n: int): result(int, age_problem)\n when n < 0\n return error(negative)\n end\n when n > 150\n return error(too_old)\n end\n return n\n end fn check_age\n\n fn describe(n: int): text\n match check_age(n)\n case ok age\n return \"age {age} is fine\"\n case error problem\n return \"{n} is rejected: {problem} {problem.say}\"\n end\n end fn describe\n\n fn total_age(a: int, b: int): result(int, age_problem)\n return try check_age(a) + try check_age(b)\n end fn total_age\n\nend program errors\n```\n\n**The backend slice (RFC-0011), built and tested:** a `service` with HTTP routes and handlers\n(`when`, `header`, `respond`), checked by `mz check`. `mz contract` runs a service in process\nand evaluates its `example` and `ensure` clauses. `mz build` lowers a service to a local\nRust + axum package, which CI compiles, tests and serves. That is **the whole of the lowering\ntoday:** no component lowers, and the package is a local server, with no Workers, WebAssembly\nor Containers target and no deployment. The `mzizi-be` benchmark arm, the probe crate\n`mzprobe` and backend task B1 exist; no backend episode has run.\n\n**Not built:** everything in the \"still missing\" list above, lowering of components,\nrendering, a release and a published binary. A component `.mz` file today is checked and its contract\nevaluated; **nothing runs it.** Do not tell anyone Mzizi \"compiles to Rust\" or is \"production\nready\"; say it is designed to lower to Rust, and that only a service does so today.\n\n**In progress, as design only:**\n\n- **The harness.** RFC-0012 (draft). Only the agent protocol exists (`mz check --agent`,\n `mz fix`, `mz contract`).\n- **Contracts everywhere.** RFC-0010 (draft) extends contracts to functions, handlers,\n services and records. Component contracts (RFC-0006) and service contracts (RFC-0011 §7) are\n evaluated. Of RFC-0010's codes, `MZ0606`, `MZ0611`, `MZ0612` and `MZ0613` exist, for\n services; `MZ0607`–`MZ0610` do not exist in the compiler.\n- **Request bodies** for a service (`body input: <record>` and `reject` blocks, RFC-0011 §4.3)\n are designed and not built. So is state (task B4).\n- **Modules.** There are no imports. Components are referenced by bare name\n (`primitives/confirm_bar.mz` uses `button` and `alert` with no import line). A reference to\n another component's enum (`button_variant.ghost`) is warning `MZ0502`, because it cannot be\n checked until modules exist.\n\n**Results, as they fell.** Two Phase 0 pilots ran on 2026-09-27 and neither showed an\nadvantage for Mzizi. On the frontier model the Mzizi and Dioxus arms tied, with Mzizi about 8%\nfewer transcript tokens. On the ~7B open-weight model, the design target, Mzizi did worse on\nall three metrics. Neither pilot is the kill-criterion run (RFC-0009 §6), and that run has not\nhappened. The pilots were tests inside Phase 0 on a few registry UI components against\nDioxus, not its goal. \"Designed for agents\" and \"aims to replace TypeScript, Python and C++\"\nare accurate; \"faster\" or \"better\" is not.\n\n## Getting `mz`\n\nThere is no release. Build it from source; the compiler crate has zero dependencies:\n\n```bash\ngit clone https://github.com/mzizi-dev/mzizi.git && cd mzizi/compiler\ncargo build --bin mz # ../target/debug/mz\ncargo run --bin mz -- check ../primitives/button.mz\n```\n\n**Never `cargo install mz`.** The `mz` crate on crates.io is an unrelated project, and the\ncompiler crate (`mzizi-lang-compiler`) is `publish = false`.\n\n## The commands\n\n`mz` takes exactly one file per call. `mz check ../primitives/*.mz` is a usage error (exit 2).\nLoop over files instead.\n\n| Command | Does |\n| ----------------------------------- | -------------------------------------------------------------------------------- |\n| `mz check <file>` | human-readable diagnostics |\n| `mz check --agent <file>` | NDJSON: one diagnostic per line, then one summary line. **Target this.** |\n| `mz fix <file>` | applies every `exact` fix in place, in one pass, then re-checks the file |\n| `mz contract <file>` | evaluates the file's `contract` block (only on a file that checks clean) |\n| `mz contract --agent <file>` | the same, as NDJSON; the summary adds `contract_clauses` and `contract_failures` |\n| `mz outline <file>` | the interface only (name, enums, props, contract subjects), as valid Mzizi |\n| `mz hash <file>` / `mz ir <file>` | the content-addressed root hash / every IR node with its hash and path |\n| `mz build <service.mz> --out <dir>` | lowers a service to a Rust + axum Cargo package in `<dir>` (only a clean file) |\n| `mz build <program.mz> --out <dir>` | lowers a program to a dependency-free Rust package in `<dir>` |\n| `mz run <program.mz>` | lowers a program, builds it with Cargo and runs it |\n| `mz harness version` | protocol, language version and the definition's SHA-256 |\n| `mz harness definition --agent` | every language-harness entry (features, operators, codes) as one line of JSON |\n| `mz harness entry <name>` | one entry, e.g. `mz harness entry let` |\n\nExit status: **0** no errors (warnings do not fail), **1** errors or a failed contract\nassertion, **2** a usage or I/O problem. Branch on the status; parse the NDJSON for detail.\n\n`mz run` is the exception, because 1 belongs to the program it runs. It exits with the\nprogram's own status: 0; 1 when `main` returns an error (`MZ0992`); 101 for a trap (`MZ0991`)\nor a panic; 141 when standard output is closed; 128 plus the signal that ended it; **3** when\nthe check failed and nothing ran, or the lowered Rust did not compile (`MZ0990`); and 2 for a\nusage, environment or I/O problem (`--agent` is not accepted, a file that is not a `program`).\n\nOn a **service**, `mz contract` runs the service in process (no lowering, no socket), and the\nsummary adds `contract_tested`, the number of generated requests its `ensure` clauses were\ntested over. `mz outline`, `mz hash` and `mz ir` do not cover services yet and exit 2. `mz\nbuild` on a component exits 2 (\"components do not lower yet\"), and on a file with errors it\nprints them, builds nothing and exits 1.\n\n`check` and `contract` are deliberately separate: a compile error is not a defect, and a\ncontract failure is. Your file is done when **both** `mz check --agent` and\n`mz contract --agent` exit 0.\n\n## The loop\n\n1. Write the file.\n2. `mz check --agent file.mz`. If it exits 0, go to 5.\n3. `mz fix file.mz` to apply every `exact` fix. Read each remaining diagnostic's `say`; apply\n `guess` fixes only after checking them.\n4. Fix everything reported, then go to 2. Errors are independent, so fix them all before\n re-running; do not fix one and re-run to \"see the next\".\n5. `mz contract --agent file.mz`. `MZ0603` means an assertion is false (a defect in the\n component or the contract); `MZ0605` means it could not be evaluated, which **counts as a\n failure**.\n\n## Reading the NDJSON\n\nThis file is wrong on purpose. It is the example in `benchmarks/prompts/mzizi-guide.md`, which\n`benchmarks/prompts/verify-guide.sh` checks against the real compiler.\n\n```mz\n## WRONG ON PURPOSE: three mistakes.\ncomponent tag\n\n enum tag_size\n snug class \"h-13 px-3\"\n end\n\n prop onPick: event(none)\n prop size: tag_size = snug\n\n view\n row\n slot = \"tag\"\n class = \"rounded-full {size.class}\"\n tap = on_pick\n end\n end\n\n contract\n slot is \"tag\"\n tag_size.snug height 52\n end\n\nend\n```\n\n`mz check --agent tag.mz` exits 1 and prints exactly:\n\n```text\n{\"code\":\"MZ0101\",\"severity\":\"error\",\"file\":\"tag.mz\",\"span\":[8,8,8,14],\"say\":\"`onPick` is not snake_case — Mzizi names are snake_case, so write `on_pick`\",\"fix\":{\"span\":[8,8,8,14],\"replace\":\"on_pick\",\"confidence\":\"exact\"}}\n{\"code\":\"MZ0602\",\"severity\":\"error\",\"file\":\"tag.mz\",\"span\":[21,26,21,28],\"say\":\"a contract clause needs a predicate (is / in / contains / not_empty / at_least / uses / min_height / shows), found `52`\",\"fix\":{\"span\":[21,26,21,26],\"replace\":\"is \",\"confidence\":\"exact\"}}\n{\"code\":\"MZ0208\",\"severity\":\"error\",\"file\":\"tag.mz\",\"span\":[24,1,24,4],\"say\":\"top-level blocks close with their name: write `end component tag`\",\"fix\":{\"span\":[24,1,24,4],\"replace\":\"end component tag\",\"confidence\":\"exact\"}}\n{\"summary\":true,\"errors\":3,\"warnings\":0,\"exact_fixable\":3,\"ms\":0}\n```\n\n`mz fix tag.mz` then prints `mz: applied 3 exact fixes; 0 errors (0 exact-fixable) remain`, and\n`mz contract --agent tag.mz` reports `\"contract_clauses\":2,\"contract_failures\":0`.\n\n- `code`, `severity` (`error` or `warning`), `file` (the path you passed), `span`\n `[line, col, end_line, end_col]` (1-indexed, end exclusive) and `say` are always present.\n- `say` quotes the offending source, so you need not re-read the file to understand it.\n- `fix` is optional: put `replace` at `fix.span`. An empty `replace` is a deletion. `exact`\n is safe to apply blind; `guess` has the right location and an inferred replacement.\n- The last line is always the summary.\n\n## Syntax essentials\n\nOne file holds one component, or one service (see \"Services\" below). There is one form per\nintent: if a construct is not shown here or in the RFCs, assume it does not exist. The order\ninside a component is doc lines, `use`, `enum` and `record`, `prop`, `view`, `fn`, `contract`.\n\nA complete primitive, `primitives/badge.mz`:\n\n```mz\n## A small status label. Not interactive, so no touch floor applies.\n## Corpus reference: n2-primitives/badge.tsx.\ncomponent badge\n\n enum badge_variant\n default class \"bg-primary text-primary-foreground\"\n secondary class \"bg-secondary text-secondary-foreground\"\n destructive class \"bg-destructive/10 text-destructive dark:bg-destructive/20\"\n outline class \"border-border text-foreground bg-input/30\"\n ghost class \"hover:bg-muted hover:text-muted-foreground\"\n link class \"text-primary underline-offset-4 hover:underline\"\n end\n\n prop variant: badge_variant = default\n prop label: text\n\n view\n mark\n slot = \"badge\"\n portal = \"https://mzizi.dev/components/badge\"\n variant = variant\n class = \"inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-md border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all {variant.class}\"\n text = label\n end\n end\n\n contract\n every badge_variant class not_empty\n badge_variant.default class contains \"bg-primary\"\n slot is \"badge\"\n end\n\nend component badge\n```\n\n- **Shape.** `component <name>` opens the file and `end component <name>` closes it, repeating\n the name. Every other block (`enum`, `record`, `view`, `contract`, each element, each `when`,\n each `for each`, each `fn`) closes with a bare `end`. Never `end enum` or `end view`.\n- **Comments.** `##` to end of line is the only comment form. `//` and `/* */` are errors.\n- **Names** are `snake_case`. `onRemove` is `MZ0101`, with the snake form as its `exact` fix.\n- **Enums are variant tables.** One row per variant: its name, then `column value` pairs. Every\n variant has every column (`MZ0303` otherwise). A column can carry meaning beyond styling, as in\n `primitives/alert.mz`, where `announce` ties the ARIA role to the severity:\n\n ```mz\n enum alert_variant\n default class \"bg-card text-card-foreground\" announce \"status\"\n destructive class \"bg-card text-destructive\" announce \"alert\"\n warning class \"bg-card text-[var(--status-warning,#FFD740)]\" announce \"alert\"\n info class \"bg-card text-[var(--status-info,#00B0FF)]\" announce \"status\"\n end\n ```\n\n- **Heights come from the class.** A variant's `height` is the pixels its `h-N` or `size-N`\n class renders (`N × 4`). You may leave the `height` column out. A written `height` that\n disagrees with the class is `MZ0313`, and its `exact` fix is the rendered number.\n- **Props.** `prop <name>: <type>`, optionally `= <default>`. The types are an enum name\n (`= default`), `text`, `bool`, `int`, `event(none)`, `event(<type>)`, `list(<type>)`\n (omitted means empty), `option(<type>)` (omitted means none) and a record name. Never\n `option(list(T))` (`MZ0703`).\n- **The view** holds exactly one element tree. An element is a bare word on its own line,\n closed by `end`. Inside it, each line is an attribute `name = value` (the `=` is required),\n a child element, a `when` block, a `for each`, or `nothing`. Strings interpolate with\n `{...}`; there is no `+`.\n- **Conditionals.** `when x` … `end`, `when not x`, `when v is <variant>`, and for an option or\n a list `when x is none` … `else` … `end`. There is no `if` (`MZ0407`, `exact` fix `when`)\n and no `match`. From `primitives/avatar.mz`:\n\n ```mz\n when image is none\n row\n slot = \"avatar-fallback\"\n class = \"flex size-full items-center justify-center rounded-full bg-muted text-muted-foreground {size.text_class}\"\n text = initials\n end\n else\n picture\n slot = \"avatar-image\"\n source = image\n alt = alt\n class = \"aspect-square size-full rounded-full object-cover\"\n end\n end\n ```\n\n- **Lists** render with `for each item in items`, whose first line is its `key = item.<field>`.\n- **Capabilities.** `use motion` if the component animates (`primitives/spinner.mz`). Nothing\n else needs `use`.\n- **Events.** Bind with `tap = on_tap` / `change = on_change`. A parameterless `fn` can `emit`\n an event prop, as in `examples/connectivity_bar.mz`:\n\n ```mz\n fn retry\n emit on_state_change(syncing)\n end\n ```\n\n- **No React carry-overs.** `...props` spreads are `MZ0106` (`exact` fix deletes the line).\n An `as_child` prop is warning `MZ0312`: delete it, and keep what the `as_child = false`\n branch renders. `className` pass-through has no equivalent.\n\n`benchmarks/prompts/mzizi-guide.md` is the complete one-file guide the benchmark gives a model,\nincluding records, `for each` and a React-to-Mzizi table. Read it before writing a component.\n\n## Services (the backend slice, RFC-0011)\n\nA backend program is one file holding one `service`, closed by `end service <name>`. Every\ninner block (`record`, `route`, `fallback`, `when`, `contract`) closes with a bare `end`. The\norder is doc lines, service-level `header` lines, `record`s (and `enum`s), `route`s,\n`fallback`, `contract`. There are no imports, no `main`, no server setup and no port.\n\n`examples/registry.mz`, the example service (22 clauses, all holding; its `ensure` clauses\ntested over 61 generated requests):\n\n```mz\n## A registry of two components: routes, methods, redirects and a JSON 404.\n## RFC-0011's worked example, shaped like the API gateway's `/v1/ui` routes (RFC-0009 §2.4, B1).\nservice registry\n\n header \"x-mzizi-source\" \"fixture\"\n\n record problem\n field error: text\n end\n\n record health\n field status: text\n end\n\n record item\n field name: text\n end\n\n route health_check\n get \"/v1/health\"\n respond 200 json health status \"ok\"\n end\n\n route ui_list\n get \"/v1/ui\"\n respond 200 file \"fixtures/ui.json\"\n end\n\n route ui_item\n get \"/v1/ui/{name}\"\n when name in \"badge\" \"button\"\n respond 200 json item name name\n end\n header \"cache-control\" \"private, no-cache, no-store, max-age=0, must-revalidate\"\n respond 404 json problem error \"Not found\"\n end\n\n fallback\n header \"cache-control\" \"private, no-cache, no-store, max-age=0, must-revalidate\"\n respond 404 json problem error \"Not found\"\n end\n\n contract\n example get \"/v1/health\" body.status is \"ok\"\n example get \"/v1/ui\" status is 200\n example get \"/v1/ui\" header \"content-type\" is \"application/json\"\n example get \"/v1/ui/button\" status is 200\n example get \"/v1/ui/button\" body.name is \"button\"\n example get \"/v1/ui/does-not-exist\" status is 404\n example get \"/v1/ui/does-not-exist\" body.error is \"Not found\"\n example get \"/v1/ui/does-not-exist\" header \"cache-control\" is \"private, no-cache, no-store, max-age=0, must-revalidate\"\n example head \"/v1/ui/button\" status is 200\n example head \"/v1/ui/button\" body is \"\"\n example options \"/v1/ui\" status is 204\n example options \"/v1/ui\" header \"allow\" is \"GET, HEAD, OPTIONS\"\n example delete \"/v1/ui/button\" status is 405\n example delete \"/v1/ui/button\" body is \"\"\n example get \"/v1/ui/\" status is 308\n example get \"/v1/ui/?limit=2\" header \"location\" is \"/v1/ui?limit=2\"\n example get \"/nope\" status is 404\n example get \"/nope\" header \"content-type\" is \"application/json\"\n ensure status in 200 204 308 404 405\n ensure header \"x-mzizi-source\" is \"fixture\"\n ensure when status is 404 then body.error is \"Not found\"\n ensure when status is 405 then header \"allow\" is \"GET, HEAD, OPTIONS\"\n end\n\nend service registry\n```\n\n- **A route** is `route <name>`, then exactly one `<method> \"<pattern>\"` line, then zero or\n more `query <name>: option(<scalar>)` lines, then statements, then `end`. The methods are\n `get`, `head`, `post`, `put`, `patch`, `delete` and `options`, lower case; a second method on\n the same path is a second route.\n- **A pattern** is `/` or `/`-separated segments of lower-case letters, digits and `-._~`,\n or a whole-segment `{name}`, which binds `name` as `text`. No trailing slash, no empty\n segment, no `?`. A literal segment beats a parameter at the same position.\n- **A query parameter is always an option:** `query limit: option(int)`. `option(int)` is\n `-`? then ASCII digits, so `\"0x10\"`, `\"1e2\"`, `\" 7 \"` and `\"1.5\"` are `none`; `option(bool)`\n is exactly `true` or `false`. Bad input is absence, never an error.\n- **A handler has three statements**, and every path through it must end in `respond`:\n\n | Statement | Means |\n | -------------------------------- | --------------------------------------------------------- |\n | `when <cond>` … [`else` …] `end` | a branch; with no `else`, a false condition falls through |\n | `header \"<name>\" \"<value>\"` | set a header on the response this path sends |\n | `respond <status> [<body>]` | send the response; nothing after it on the path runs |\n\n A condition is `p` / `not p` (a `bool`), `p is <literal>`, `p in <literal> …`,\n `p at_least <n>` / `p at_most <n>` (an `int`), or `p is none` … `else` (an option, which is\n narrowed in the `else`). There is no `if`, `==`, `return`, assignment, loop or call.\n\n- **Bodies:** none; `json <record> <field> <value> …` (every field once, a literal or a\n parameter, no punctuation; `application/json`); `text \"<string>\"` (may interpolate a\n parameter as `{name}`); or `file \"<path>\"` (a fixture beside the `.mz` file, embedded at\n build time). A response record's fields are scalars or options of scalars. `204`, `304` and\n `1xx` take no body.\n- **Headers** are lower case. A service-level `header` applies to every response, runtime\n ones included; a route's own `header` for the same name wins. `content-length` and\n `transfer-encoding` belong to the server.\n- **The runtime answers what HTTP defines, so do not write it:** `HEAD` for a `get` route\n (its status and headers, no body); `OPTIONS` (`204` with `allow`, e.g. `GET, HEAD, OPTIONS`);\n any other undeclared method on a matched path (`405` with the same `allow`, no body); and a\n trailing slash or `//` (`308` to the canonical path, query kept, never off-site). A path no\n route matches runs `fallback`, or gets an empty `404` when there is none.\n- **The contract:** `example <method> \"<target>\" <facet> <predicate>` sends one request;\n `ensure [when <facet> <predicate> then] <facet> <predicate>` must hold for every generated\n request. A facet is `status`, `header \"<name>\"`, `body` or `body.<field>`; a predicate is\n `is <value>`, `in <value> …`, `not_empty`, `contains \"<text>\"`, `at_least <n>` or\n `at_most <n>`. `header \"<name>\" is none` asserts absence and `body is \"\"` an empty body.\n `ensure` is **tested** over the generated set, never proven.\n\nThis file is wrong on purpose. It is the example in `benchmarks/prompts/mzizi-be-guide.md`:\n\n```mz\n## WRONG ON PURPOSE: three mistakes.\nservice shop\n\n record problem\n field error: text\n end\n\n route item\n GET \"/v1/items/{id}/\"\n when id is \"1\"\n respond 200 text \"one\"\n end\n end\n\nend service shop\n```\n\n`mz check --agent candidate.mz` exits 1 and prints:\n\n```text\n{\"code\":\"MZ0613\",\"severity\":\"warning\",\"file\":\"candidate.mz\",\"span\":[2,9,2,13],\"say\":\"`service shop` has no `contract` block — its behaviour is unverified (RFC-0010 §8)\"}\n{\"code\":\"MZ0801\",\"severity\":\"error\",\"file\":\"candidate.mz\",\"span\":[9,5,9,8],\"say\":\"`GET` is not a method — a route declares one of get, head, post, put, patch, delete, options\",\"fix\":{\"span\":[9,5,9,8],\"replace\":\"get\",\"confidence\":\"exact\"}}\n{\"code\":\"MZ0802\",\"severity\":\"error\",\"file\":\"candidate.mz\",\"span\":[9,9,9,26],\"say\":\"`\\\"/v1/items/{id}/\\\"` ends with `/` — patterns have no trailing slash; the runtime redirects `…/` to the path without it\",\"fix\":{\"span\":[9,9,9,26],\"replace\":\"\\\"/v1/items/{id}\\\"\",\"confidence\":\"exact\"}}\n{\"code\":\"MZ0804\",\"severity\":\"error\",\"file\":\"candidate.mz\",\"span\":[13,3,13,6],\"say\":\"a path through `route item` reaches `end` without a `respond` — when the `when` on line 10 does not respond on both branches; every path must respond\"}\n{\"summary\":true,\"errors\":3,\"warnings\":1,\"exact_fixable\":2,\"ms\":0}\n```\n\n`mz fix` applies the two `exact` fixes. `MZ0804` needs a decision: add\n`respond 404 json problem error \"Not found\"` after the `when`'s `end`, so the false path\nresponds too.\n\n**Building it.** `mz build registry.mz --out <dir>` checks the file and, with zero errors,\nwrites `Cargo.toml`, `src/main.rs` and the fixtures. The package is its own workspace root,\ngenerated output that is never committed, and depends on `axum =0.8.9` and `tokio =1.53.1`\n(tests add `tower`, `http-body-util` and `serde_json`). Every `example` becomes one\n`#[tokio::test]` (`cargo test` in the package); `ensure` clauses are evaluated by\n`mz contract` only. `cargo run --release --manifest-path <dir>/Cargo.toml` serves\n`127.0.0.1:$PORT` (8080 by default) and prints `listening on http://127.0.0.1:<port>`.\n\n## Contracts\n\nEvery component carries a `contract … end` block: one assertion per line,\n`<subject> <predicate>`, no colon. A file with no contract is warning `MZ0501`. It is checked\nagainst the file's own enums, view attributes and prop defaults (RFC-0006). From\n`primitives/button.mz`:\n\n```mz\n contract\n every button_size height at_least 48\n button_size.default height is 56\n button_size.sm height is 48\n button_variant.default class contains \"bg-primary\"\n slot is \"button\"\n end\n```\n\n| Subject | Means |\n| --------------------------- | -------------------------------------------------- |\n| `every <enum> <column>` | that column in every variant |\n| `<enum>.<variant> <column>` | one cell |\n| `<attribute>` | the root view element's attribute (`slot`, `role`) |\n| `<prop>` | the prop's default (only a prop that has one) |\n| `<element> \"<text>\"` | the element carrying that text |\n| `when <name>` | the `when` branch that mentions that name |\n\nPredicates: `is <value>` (exactly as written: `height is \"52\"` fails against `height 52`),\n`contains \"<s>\"`, `not_empty`, `at_least <n>`, `in \"<a>\" \"<b>\"`, `uses \"--token\"`,\n`uses <component>` (no subject), `shows <element> \"<t>\"` (after `when <name>`) and\n`min_height <n>`. `examples/connectivity_bar.mz` uses the last two:\n\n```mz\n when offline shows button \"Retry\"\n button \"Retry\" min_height 48\n```\n\nAssert what the source guarantees: every interactive size clears 48px, the `slot`, and the key\ncells. An assertion on a prop with no default is `MZ0605` (unevaluable), which fails.\n\n`mz contract` checks nothing rendered. The rendered half is `benchmarks/harness`, which diffs a\n`.mz` component's variants, defaults, touch heights and `data-slot` set against the Rust\nreference. Mzizi Roots components carry the same clause grammar as `pub const CONTRACT` and\ncheck it against their server-rendered markup (see the `mzizi-roots` skill).\n\nThe direction (RFC-0010, draft) is that **everything built carries a contract**: components,\nlanguage functions and backend handlers. The component form and the service form (\"Services\"\nabove) are evaluated today; functions have no contracts because they have no bodies.\n\n## Diagnostic codes you will meet\n\nThe ranges are `MZ01xx` lexing and names, `MZ02xx` blocks and closers, `MZ03xx` declarations,\n`MZ04xx` the view, `MZ05xx` lints, `MZ06xx` contracts, `MZ07xx` types and resolution, and\n`MZ08xx` services and handlers. The full tables are RFC-0001 §4.7, RFC-0006 §8, RFC-0008\n(types), RFC-0010 §6 and RFC-0011 §9. A service reuses `MZ0701`, `MZ0707`, `MZ0708` and\n`MZ0710` for unknown names and un-narrowed options.\n\n| Code | Severity | Written | Repair |\n| ------------------- | -------- | ---------------------------------------------------------------------------------- | ---------------------------------------------- |\n| `MZ0101` | error | a name that is not `snake_case` | `exact`: the snake form |\n| `MZ0105` | error | `list<T>`, `T[]`, `[T]` | `exact`: `list(T)` |\n| `MZ0106` | error | `...props`, `{...props}`, `..attributes` | `exact`: delete (the whole line when alone) |\n| `MZ0204` | error | a block never closed | `guess`: insert the `end`s |\n| `MZ0206`–`MZ0208` | error | a wrong closer (`end view`, a bare `end` for `component`) | `exact`: rewrite the whole closer line |\n| `MZ0303` | error | a variant missing a column another variant has | add the column |\n| `MZ0312` | warning | `prop as_child: bool` (React `asChild`) | `exact` when unread: delete the prop |\n| `MZ0313` | error | `icon class \"size-14\" height 48` | `exact`: the rendered px (`56`) |\n| `MZ0406` | error | `class \"flex\"` (attribute without `=`) | insert `=` (`exact` for known attribute words) |\n| `MZ0407` | error | `if open` | `exact`: `when open` |\n| `MZ0408` | error | an attribute directly under `view` | move it inside the root element |\n| `MZ0409` | error | `span class = \"x\"` (more after an element word) | put the element word on its own line |\n| `MZ0501` | warning | no `contract` block | write one |\n| `MZ0502` | warning | `<other>_enum.variant` from another component | none until modules |\n| `MZ0602` | error | a clause with no predicate (`height 52`) | `exact`: insert `is` (needs an operand) |\n| `MZ0603` | error | **an assertion that does not hold** | fix the component or the clause |\n| `MZ0605` | error | an assertion that cannot be evaluated | assert something the file defines |\n| `MZ0606` | error | an `example` status that an `ensure status in …` rules out | fix one of the two |\n| `MZ0611` / `MZ0612` | error | a service `ensure` / `example` that does not hold | `say` quotes the request that broke it |\n| `MZ0613` | warning | a service with no or an empty `contract` block | write one |\n| `MZ0701` | error | an unknown type (`strng`) | alias or nearest-name fix |\n| `MZ0706` | error | a default that does not fit its type | varies |\n| `MZ0707` / `MZ0708` | error | an unknown name / variant, column or field | nearest-name fix |\n| `MZ0710` | error | an option used without `when … is none … else` | narrow it first |\n| `MZ0711` / `MZ0712` | error | a wrong kind of value / a `when` that does not fit its type | see `say` |\n| `MZ0801` | error | a route not opening with `<method> \"<pattern>\"`, `GET`, a second method line | `exact` for `GET`; else a `guess` |\n| `MZ0802` | error | a bad pattern: trailing `/`, empty segment, `?`, no leading `/` | `exact` where the repair is certain |\n| `MZ0803` | error | two routes with one method and the same pattern | delete or change one |\n| `MZ0804` | error | a handler path that reaches `end` without `respond` | add the `respond` |\n| `MZ0805` | error | a line after `respond` that can never run | `exact`: delete it |\n| `MZ0806` | error | a bad `respond`: no status, not 100–599, a body on `204` | `exact` deletes a body that is not allowed |\n| `MZ0807` | error | a bad `header`: `\"Cache-Control\"`, set twice, server-owned | `exact`: the lower-case name |\n| `MZ0808` | error | a `json` literal with a missing, repeated or ill-typed field (unknown is `MZ0708`) | give every field once |\n| `MZ0809` | error | `query limit: int` | `exact`: `option(int)` |\n| `MZ0810` | error | a `file \"…\"` fixture that does not exist | add the file or fix the path |\n| `MZ0811` | error | a line a service or handler cannot hold (`return`, `=`, `view`) | see `say` (`is` for `=` is `exact`) |\n| `MZ0812` | error | a second `fallback`, or a route or parameter name used twice | rename or delete one |\n\nTwo real outputs, from pilot-2 candidates written by the 7B model and re-checked on `main`\n(`benchmarks/results/2026-09-27-pilot-2/raw/scored/…/mzizi/{button,badge}/seed-1/iter-01/candidate.mz`):\n\n```text\n{\"code\":\"MZ0313\",\"severity\":\"error\",\"file\":\"candidate.mz\",\"span\":[16,35,16,37],\"say\":\"`icon` declares `height 48` but its class `size-14` renders 56px (N × 4) — write `height 56`, or drop the column and let the class say it once\",\"fix\":{\"span\":[16,35,16,37],\"replace\":\"56\",\"confidence\":\"exact\"}}\n{\"code\":\"MZ0106\",\"severity\":\"error\",\"file\":\"candidate.mz\",\"span\":[15,8,15,16],\"say\":\"`...props` is a spread, and Mzizi has none: a component names each prop it reads and each attribute it sets. `props` has no equivalent — delete the line\",\"fix\":{\"span\":[15,1,16,1],\"replace\":\"\",\"confidence\":\"exact\"}}\n```\n\n## Contributing to the language\n\n- A language change needs an RFC in `design/`. Take the next number not used on `main` or\n claimed by an open PR: RFC-0005 is reserved, and RFC-0011 (handlers), RFC-0012 (the language\n harness), RFC-0013 (the core language) and RFC-0014 (Tier 2, draft) exist, so the next is\n RFC-0015.\n- A PR that adds or changes a language feature adds or updates its language-harness entry in\n `compiler/src/harness.rs` in the same PR: one entry in `FEATURES`, one `Code` per diagnostic\n code with a `trigger`, and tested examples. `cargo test --test harness` is the check.\n- A PR that changes what the language can do updates its row in `LANGUAGE-TRACKER.md` in the\n same PR, with evidence, and adds a `CHANGELOG.md` entry.\n- CI runs `cargo fmt -- --check`, `cargo clippy --all-targets -- -D warnings`, `cargo test`,\n and `mz check` and `mz contract` over every file in `examples/` and `primitives/`, one file\n per call. Its `lowering` job runs `mz build` on `examples/registry.mz`, then `cargo test` and\n one request over a socket against the package, `mzprobe verify` of task B1, and `mz run` of\n every example program with its output diffed against `examples/<name>.expected`. `AGENTS.md`\n in the repo has the exact script.\n- Pull requests are squash-merged through the merge queue, and the squash commit keeps every\n commit message. State what you measured in the commit message.\n- The repo consumes nothing else in the org: no build step, test or script may reach into\n `mzizi-registry` or `agent-tools`.\n\n## See also\n\n- `LANGUAGE-TRACKER.md` (what Mzizi can and cannot do), `CHARTER.md` (v0.4),\n `design/RFC-0001` (syntax and the agent protocol), `RFC-0013` (the core language: programs),\n `RFC-0014` (Tier 2, draft), `RFC-0006` (contracts), `RFC-0008`\n (types, collections, records), `RFC-0009` (the comparison benchmark and the kill\n criterion), `RFC-0010` (contracts everywhere, draft), `RFC-0011` (handlers, the backend\n slice), `RFC-0012` (the language harness, draft), `benchmarks/prompts/mzizi-be-guide.md` (the\n one-file service guide) and `benchmarks/READINESS.md`.\n- The `mzizi-backend` skill: where a Mzizi service stands against the live TypeScript Workers.\n- The `mzizi-roots` skill: the Rust components built to support the language, its component\n model and where a component lowering would target.",
17
+ "source": "mzizi-dev/agent-tools/mzizi-skills/skills/mzizi-language",
18
+ "files": []
15
19
  },
16
20
  {
17
21
  "name": "mzizi-roots",
18
- "description": "Everything about Mzizi's components: Mzizi Roots, the Rust build (Dioxus UI and host-agnostic server components). cargo add mzizi-roots / mzizi-roots-server, what mzizi_get_component returns (Rust first: lead, rust, react), the node-to-crate map, pub const CONTRACT checked on dioxus-ssr markup, the component contracts in the registry's contracts/ for the Mzizi Dashboard Standard (app/, 31) and the Mzizi Discover Standard (discover/, 16 with the detail pattern and the canonical Open in Mukoko link), site/ (8) and ui/ (4): what to read before building or changing a @bundu/ui component, the no-JS fallback and density as requirements, and how Discover differs (no script, the same size on every pointer, server-filled shells), the frontend paths (pure .astro from the registry via mzizi add --target astro, Astro with Roots, or pure Rust; Next.js adopts through the registry's .tsx) and app setup, reuse before build, and adding a component to the registry (the node, the .rs and .tsx, registry.json, per-node checklists, the 48px floor, pnpm check and the cargo gates). The React/TSX build is the deprioritised secondary. Replaces scaffold-component, simplify and half of ecosystem-app-setup.",
19
- "body_mdx": "# Mzizi Roots — the Rust build of Mzizi's components\n\n**Mzizi Roots** is Mzizi's own components in Rust: UI components in Dioxus 0.7, and server\ncomponents as host-agnostic Rust. They are built to support the Mzizi language (the\n`mzizi-language` skill) as its component model, the way React is JavaScript's; they are not\nthe language. They live in\n[`mzizi-dev/mzizi-registry`](https://github.com/mzizi-dev/mzizi-registry) and are compiled by\nthe crates in its `mzizi-rs/` workspace. The plan is `docs/roots/RFC-roots.md` there.\n\n**Rust first.** Where a Rust implementation exists, present it and use it first. The React/TSX\ncomponents are **the React build**: they keep working for existing React apps, and they are\ndeprioritised, so no new work goes into them.\n\nThis skill describes registry `main` at `6663cb5` (2026-09-29) and its `contracts/` at\n`b17bafc` (2026-10-04: the Dashboard Standard from #406, the Discover Standard from #415, and\nevery `since` at `@bundu/ui` 0.3.0 from #419), the crates published to crates.io at **0.1.0**\non 2026-09-29, and `mzizi-mcp` 0.11.0. It replaces three 0.7.0 skills:\n`scaffold-component` (now \"Contributing a component\"), `simplify` (now \"Reuse before build\")\nand the frontend half of `ecosystem-app-setup` (now \"Starting an app\"). Tokens, brand and the\nUbuntu constraints are in the `mzizi-design` skill.\n\n## Install\n\nTwo umbrella crates with no code of their own re-export the node crates behind features:\n\n```sh\ncargo add mzizi-roots # UI: tokens + ui + brand + shell (all default features)\ncargo add mzizi-roots-server # server: assurance + fundi + docs + discovery\n```\n\nTake only what you use:\n\n```toml\n[dependencies]\nmzizi-roots = { version = \"0.1\", default-features = false, features = [\"brand\"] }\n```\n\nTo follow `main`, or pin a commit, install from git. Cargo finds a crate by name anywhere in the\nrepository's workspace:\n\n```sh\ncargo add mzizi-roots --git https://github.com/mzizi-dev/mzizi-registry\n```\n\n```toml\nmzizi-brand = { git = \"https://github.com/mzizi-dev/mzizi-registry\", rev = \"<commit>\" }\n```\n\nA single node crate works too (`cargo add mzizi-ui`). The crates depend on `dioxus` with\n`macro`, `signals`, `hooks` and `html` only, so the app that mounts them chooses web, desktop,\nmobile or server rendering.\n\n`mzizi add <name> --target rust` (`@nyuchi/mzizi-cli`) records the crate and prints the\n`cargo add` rather than copying a `.rs` file into your project: a copied component is a fork\nof a crate module.\n\n## What the MCP returns\n\n`mzizi_get_component` on `https://mcp.mzizi.dev/mcp` (free, no account; `mzizi-mcp` 0.11.0) is\nRust first. It returns `{name, renamedFrom?, lead, note, rust, react, docs?, versions?}`:\n\n- `lead` is `\"rust\"` when the component has a Roots implementation, else `\"react\"`; `note`\n says which build to use.\n- `rust` is the registry's `/v1/rs/<name>` answer with the install first: `crate`\n (`{name, registry, git}`), `install.cargo` (`cargo add <crate>`), `install.pinned`\n (`cargo add <crate> --git https://github.com/mzizi-dev/mzizi-registry --rev <pin>`, which\n builds exactly the source shown), `module` (e.g. `mzizi_brand`), `contract` (the\n `contract … end` text, or `null`), and `files[]` with the `.rs` source inline. With no Rust\n it is `null`.\n- `react` is the React build: `build: \"react\"`, `status: \"deprioritised\"`, `install` (the\n `npx shadcn@latest add https://api.mzizi.dev/v1/ui/<name>` line), then the `/v1/ui/<name>`\n body. It is no longer under a `component` key (that was 0.10.x).\n\n`mzizi_list_components` rows carry `rustCrate` when a component has Rust, the response carries\n`withRust`, and `rust: true` lists only those. `mzizi_search` hits carry `rustCrate` too. For\n`mzizi-hero-stat` the answer is `lead: \"rust\"`, crate `mzizi-brand`, and the four-clause\ncontract shown under \"Contracts\" below.\n\n## The crates\n\nOne crate per registry node that has Rust. The map is `mzizi-rs/crate-for-node.json`, and\n`pnpm rust:generate` refuses a node with Rust in it that no crate claims.\n\n| Node directory | Crate | Umbrella | What it holds |\n| ------------------- | ----------------- | ---------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `n1-tokens` | `mzizi-tokens` | `mzizi-roots` (always on) | the 21-family palette and scales as Rust consts, generated from `lib/tokens/palette.source.ts` |\n| `n2-primitives` | `mzizi-ui` | `mzizi-roots` (`ui`) | avatar, badge, button, card, chart, input, label, progress, separator |\n| `n3-brand` | `mzizi-brand` | `mzizi-roots` (`brand`) | alert banner, avatar stack, cover header, empty state, escalation card, gauge card, hero stat, meta tile, stats row, success screen, suitability card, user card (all `mzizi-*`) |\n| `n7-shell` | `mzizi-shell` | `mzizi-roots` (`shell`) | bottom nav, command palette, connectivity bar, deep-link handler, footer, mini-app runtime, notification center, persistent player, route guard, theme provider, toast provider, update prompt |\n| `n8-assurance` | `mzizi-assurance` | `mzizi-roots-server` (`assurance`) | probes, telemetry, the OTLP exporter, a11y and RTL conformity checks, alert and incident engines |\n| `n9-fundi` | `mzizi-fundi` | `mzizi-roots-server` (`fundi`) | the Fundi reporter and learning loop (client side) |\n| `n10-documentation` | `mzizi-docs` | `mzizi-roots-server` (`docs`) | the docs API and routing, AI context, the changelog and docs renderers (brings in `dioxus`) |\n| `n11-discovery` | `mzizi-discovery` | `mzizi-roots-server` (`discovery`) | page metadata and Schema.org JSON-LD |\n\nN4 safety, N5 resilience and N6 pages have no crate yet. When they do (`mzizi-safety`,\n`mzizi-resilience`, `mzizi-pages`), they join `mzizi-roots` as features. A Workers adapter\n(`mzizi-worker`) is planned for `mzizi-roots-server` and has not landed.\n\nThe registry has 577 items and 55 `.rs` files. Cite `GET https://api.mzizi.dev/v1/ui` or\n`/v1/stats` for a current count rather than repeating these. To find a component's crate, read\n`rust.crate` from `mzizi_get_component`, or take its node directory and read the table above.\n`https://api.mzizi.dev/v1/rs/<name>` also serves a `crate` field, derived from the same map on\nregistry `main`; the API serves the registry at a pinned commit, and until the gateway's pin\nmoves past the map it names `mzizi-ui` for every component. Trust the map, or the MCP.\n\n## Using a UI component\n\nThis compiles against `mzizi-roots` 0.1.0 from crates.io and renders the component to a static\nHTML fragment with `dioxus-ssr`:\n\n```toml\n[dependencies]\nmzizi-roots = { version = \"0.1\", default-features = false, features = [\"brand\"] }\ndioxus = { version = \"0.7\", default-features = false, features = [\"macro\", \"signals\", \"hooks\", \"html\"] }\ndioxus-ssr = \"0.7\"\n```\n\n```rust\nuse dioxus::prelude::*;\nuse mzizi_roots::brand::{AlertSeverity, MziziAlertBanner};\n\nfn banner() -> Element {\n rsx! {\n MziziAlertBanner {\n r#type: \"Thunderstorm\",\n severity: AlertSeverity::Severe,\n headline: \"Severe storms this afternoon\",\n }\n }\n}\n\nfn main() {\n let mut dom = VirtualDom::new(banner);\n dom.rebuild_in_place();\n let html = dioxus_ssr::render(&dom); // a static HTML fragment for Astro to place\n println!(\"{html}\");\n}\n```\n\nThe output is a `<div data-slot=\"mzizi-alert-banner\" data-portal=\"https://mzizi.dev/components/mzizi-alert-banner\" role=\"alert\" …>`\nwith the same Tailwind classes and CSS custom properties as the React build, so one stylesheet\nstyles both.\n\nWhat a Roots UI component looks like:\n\n- **Same contract as the React build:** the same registry name, `data-slot`, `data-portal`,\n variant names and Tailwind classes over the same `var(--…)` tokens. No colour literals.\n- **Variants are enums**, and a `match` replaces `class-variance-authority`\n (`n2-primitives/badge.rs`, `button.rs`).\n- **Browser facilities are props.** Where the `.tsx` reads `useMziziHarness`, the Rust takes the\n one bit it branches on, usually `prefers_reduced_motion: bool`. Logging is the host's.\n- **Icons are slots:** an `Element` the host renders, where the `.tsx` takes a Lucide component.\n- **Each file is self-contained.** No helpers shared between components.\n\n## The two frontend paths\n\nThe frontend is either **Astro** (pure `.astro` components, or Roots rendered underneath) or\n**pure Rust end to end**.\n\n- **Pure Rust.** A Dioxus app depends on the crates and mounts the components on web (wasm),\n desktop or mobile. Every component supports this today.\n- **Astro, static.** Render with `dioxus-ssr` at build time or in a Worker, and let Astro place\n the fragment, as in the example above. It ships no JavaScript and suits display components.\n The brand crate's contract suite does this for every component on every run.\n- **Astro, interactive islands.** Compile to wasm with Dioxus's web renderer and wrap it as a\n custom element. **Not packaged yet**: the wrapper crate (`mzizi-islands`) is proposed for\n batch 2 of the RFC.\n\n- **Astro, pure `.astro` components** (mzizi-registry #397, owner decision 2026-10-04). The\n registry is the single source of every component in every format: `.tsx`, `.rs`, `.astro`\n (and `.mz`, the Mzizi language, as it lands). A component's `.astro` sits beside its `.tsx`\n and `.rs` (`components/registry/n<N>-*/<name>.astro`), pure Astro with no React, Svelte or\n Vue under it and no client JavaScript unless its contract allows one enhancement script.\n Install with `mzizi add <name> --target astro` (inferred in an Astro project, even one with\n React islands): it reads `api.mzizi.dev/v1/astro/<name>` and writes the component,\n its flat-imported siblings (`./button.astro`, `./ui-utils`, `./server-table`) and any brand\n asset into `src/components/mzizi/`. A component with no `.astro` is refused by name, never\n replaced by its `.tsx`. `mzizi_get_component` returns the Astro block too.\n\nThe Mzizi Dashboard Standard's app components (`app-*`, plus the primitives `button`, `badge`,\n`card`, `alert`, `input`, `label`, `skeleton`), the Mzizi Discover Standard's components\n(`discover-*`, including the detail pattern) and the marketing-site components (`site-*`) all\nhave an `.astro` AND a `.tsx` in the registry (the `ui/` family's Astro ports keep the\nregistry's own `.tsx`, which share only what their contract's `identity` says), each held to\nits contract (\"The Dashboard and Discover Standards' contracts\" below). `@bundu/ui`\n(`@bundu/ui/app/*`, `@bundu/ui/discover/*`) is BUILT from these files at a pinned registry\ncommit, and its CI fails on drift; a Next.js app adopts the same design through the registry's\n`.tsx` (`mzizi add app-data-table --target tsx` or\n`npx shadcn add` of `api.mzizi.dev/v1/ui/<name>`). Use them as they are: do not\nfork, restyle or wrap the shell or a component; fix it upstream in the registry (contract,\n`.astro` and `.tsx` together), in the same change.\n\n## Starting an app\n\nFor a new Mzizi-ecosystem app, or any app that consumes the design system. Pick the path\nfirst (above); these steps are the Astro one, with the pure-Rust differences noted.\n\n### 1. Create the project (Astro)\n\n```bash\npnpm create astro@latest my-app -- --template minimal --typescript strict\ncd my-app\npnpm astro add tailwind cloudflare\n```\n\nAstro renders HTML by default, which is what makes a new app indexable by N11 and paintable on\na low-end device without opting in to either. For a pure-Rust app, start from\n`cargo new my-app` and a Dioxus 0.7 app instead, and skip to step 3.\n\n### 2. Wire the tokens\n\nCopy the generated stylesheet rather than retyping hexes: `skills/mzizi-design/tokens/palette.css`\nin `@nyuchi/mzizi-skills` (all 21 families, light and dark, generated from\n`palette.canonical.json` at the package root). Import it from your global stylesheet (in Astro,\n`src/styles/global.css`) and register the properties in the Tailwind 4 `@theme` block so\nutilities generate. In Rust the same palette is the `mzizi-tokens` crate, always on in\n`mzizi-roots`. How the 21 families are meant to be used, the radius scale and the 48px floor\nare in the `mzizi-design` skill.\n\nPick the app's accent through `--brand-accent` rather than hardcoding a mineral hex: nyuchi =\ngold, mukoko = tanzanite, and a Mzizi surface = hematite (a Heritage tone, not a mineral; see the\nconstellation in `mzizi-design`).\n\n### 3. Add the Roots components\n\n```bash\ncargo add mzizi-roots # tokens, primitives, brand components, app shell\n```\n\nFor Astro, a small Rust crate (a build step, or a `workers-rs` Worker for request-time\nrendering) renders each component to HTML with `dioxus-ssr`, and Astro places the fragment.\nThe fragment carries the same Tailwind classes as the React build, so the stylesheet from step 2\nstyles it, and it ships no JavaScript. Interactive islands (Roots compiled to wasm and wrapped\nas custom elements) are proposed and not packaged yet. \"Using a UI component\" above has a\ncompiling example.\n\nNever copy component source between apps. Depend on the crate, so every app inherits fixes.\n\n### 4. Give the app's AI assistants the doctrine\n\nInstall the published skills bundle so any assistant working in the repo has the design system,\nthe language and the components on hand:\n\n```bash\nnpm install -D @nyuchi/mzizi-skills\nnpx skills experimental_sync # links the bundled skills into .agents/skills/\n```\n\n`npx skills add @nyuchi/mzizi-skills` does **not** work: the `skills` CLI reads that argument\nas a GitHub repository and fails to clone it. `experimental_sync` is the CLI's route for skills\nthat ship in `node_modules`, and it is marked experimental. The same skills are served with no\ninstall at all by the MCP's `mzizi_get_skills`.\n\nThe public Claude Code plugin installs these skills and the MCP in one step:\n\n```\n/plugin marketplace add mzizi-dev/mzizi-registry\n/plugin install mzizi@mzizi\n```\n\nTo wire the MCP directly instead, add it to `.mcp.json` or your client config. It is free with\nno account; only the Fundi tools need sign-in:\n\n```json\n{\n \"mcpServers\": {\n \"mzizi\": { \"type\": \"http\", \"url\": \"https://mcp.mzizi.dev/mcp\" }\n }\n}\n```\n\n### 5. Let fundi read the project\n\n`@nyuchi/mzizi-cli` ships the **fundi** agent, which reads the project off disk and plans the\nwiring against the registry:\n\n```bash\npnpm add -D @nyuchi/mzizi-cli\npnpm exec fundi explore # offline — snapshot the project\npnpm exec fundi plan \"wire up Mzizi tokens\"\n```\n\nRun the bins from the installed package (`pnpm exec`, or `npx` inside the project). A bare\n`npx fundi` outside it fetches an unrelated npm package called `fundi`. `explore` runs without\ncredentials; `plan` and `chat` need `ANTHROPIC_API_KEY`. A plan is\ninert until you apply it, so read it before letting it write.\n\n### 6. Verify\n\n```bash\npnpm dev\n```\n\nConfirm the tokens resolve in light and dark, a rendered Roots fragment picks up the styles,\nand the page is readable with JavaScript off.\n\n### 7. An existing React app\n\nIf the app is already React, the React build installs with the CLI or shadcn, by absolute URL:\n\n```bash\npnpm add -D @nyuchi/mzizi-cli && pnpm exec mzizi add button # infers the tsx target\nnpx shadcn@latest add https://api.mzizi.dev/v1/ui/mzizi-theme-provider\n```\n\nPoint `components.json` `registries.mzizi.url` at `https://api.mzizi.dev/v1/ui`. A bare name\nresolves against shadcn's own registry and installs a different component. Do not start a new\napp this way.\n\n## Server components\n\nA Roots server component is a **sans-IO core**: typed request in, typed response out, every\nexternal facility (a store, a clock, an outbound fetch, a secret) behind a trait. The host owns\nI/O and credentials. `n10-documentation/mzizi-docs-api.rs` is the model: it parses a path into a\ntyped `Route`, asks a `DocsStore` trait for data and returns an `ApiResponse`. `mzizi-assurance`,\n`mzizi-fundi` and `mzizi-discovery` have no dependencies at all. The RFC records a passing\n`wasm32-unknown-unknown` `cargo check` for those three and `mzizi-docs`; CI does not run a\nwasm32 job yet.\n\nA host adapter mounts the core: a `workers-rs` adapter for Cloudflare Workers, an axum adapter\nfor containers. Neither adapter crate exists yet. Until then the host writes the few lines that\nturn its request into the core's request (see the `mzizi-backend` skill). Dioxus\n`#[server]` functions are one more possible adapter, not the building block.\n\n## Contracts\n\nEvery Roots component carries a contract, in two parts:\n\n1. **The registry contract:** one registry name, description, dependencies and variants shared\n by both builds, and the same `data-slot`, `data-portal` and tokens. Each crate's\n `tests/contract.rs` reads the `.tsx` sibling and asserts that the slot, the portal and every\n variant value the Rust emits appear there too. A deliberate divergence, such as a touch\n target raised to the 48px floor, is asserted from both sides, so the test fails when the\n React build is fixed.\n2. **Checkable clauses** in the Mzizi language's `contract … end` grammar (RFC-0006; the\n `mzizi-language` skill), exported as `pub const CONTRACT: &str`. From\n `n3-brand/mzizi-hero-stat.rs`:\n\n ```rust\n pub const CONTRACT: &str = r#\"contract\n slot is \"mzizi-hero-stat\"\n role is \"region\"\n label not_empty\n button \"Share\" min_height 48\n end\"#;\n ```\n\n `mzizi-brand`'s contract suite renders each component with `dioxus-ssr` in named states and\n evaluates every clause against the markup it emits. **A clause it cannot evaluate fails.**\n `mzizi_roots::brand::CONTRACTS` lists every brand component with its contract.\n\nToday the twelve `mzizi-brand` components export `CONTRACT`. The other crates check the\nregistry contract against the `.tsx`, and their `CONTRACT` clauses arrive batch by batch.\nServer-component clauses (status per route, CORS and cache headers, no credential in the core)\nwait on the language's contracts-everywhere RFC (RFC-0010). Until then their tests assert those\nproperties against an in-memory implementation of the traits. The language's own `service`\ncontracts (`example` and `ensure`, RFC-0011) apply to a Mzizi `service`, not to these Rust\ncrates. No component lowers to Rust yet (only a Mzizi `service` does, to a local axum\npackage), so `mz contract` does not read a Roots `CONTRACT`.\n\n### The Dashboard and Discover Standards' contracts\n\nThe registry's\n[`contracts/`](https://github.com/mzizi-dev/mzizi-registry/tree/main/contracts) holds a\nmachine-readable, versioned contract for every component of `@bundu/ui` (built in\n`mzizi-dev/packages-npm`), in two families of one format:\n\n- **`app/`, the Mzizi Dashboard Standard** (since registry `a298a4e`, 2026-10-04,\n mzizi-registry #404): the one dashboard design for every product in the Bundu ecosystem,\n with each brand's mineral as an overlay (docs.mzizi.dev/patterns/dashboard-standard). Its 31\n contracts are the server-rendered app components (`@bundu/ui/app/*.astro`): the shell, the\n page and data patterns, and seven primitives.\n- **`discover/`, the Mzizi Discover Standard** (since registry `0bea10c`, 2026-10-04,\n mzizi-registry #415, tracking issue #413): one design for every public discover and browse\n page in the Mukoko family (docs.mzizi.dev/patterns/discover-standard). Its 11 contracts are\n the Discover components (`@bundu/ui/discover/*.astro`). \"The Discover Standard\" below says\n what is different.\n\n| File | What it is |\n| ------------------------------------------------- | ---------------------------------------------------------------------------------- |\n| `contracts/schema/component-contract.schema.json` | the format, one for both families |\n| `contracts/app/<name>.contract.json` | one Dashboard Standard component's contract |\n| `contracts/discover/<name>.contract.json` | one Discover Standard component's contract |\n| `contracts/site/<name>.contract.json` | one marketing-site component's contract |\n| `contracts/ui/<name>.contract.json` | one Astro port of a registry primitive (native select, segmented control, …) |\n| `contracts/index.json` | all 59 contracts with their version and their `.astro`, `.tsx` and `.rs` items |\n| `contracts/README.md` | the coverage tables, the recorded gaps, the shared rules, how to change a contract |\n\n**Read the contract before you build or change a `@bundu/ui` component, in any language.** It is\nthe specification: `props` and `slots` (types, required, defaults, closed `values`; the\n`.astro` file's props and slots must be exactly these), `behaviour`, `states` (named fixtures,\n`default` required; every runner renders every state), `accessibility` (roles, keyboard,\nfocus, ARIA, WCAG 2.2 criteria), `density`, `theming`, `noJs`, `responsive`, the `contract`\nblock and `checks` (selector assertions on the rendered markup). `implementations` names the\nAstro export and the `.tsx` and `.rs` siblings, with what they share (`identity`: `slot`,\n`slot+role` or `slot+variants`) and their `divergences`; items under `related` look similar\nand have a different contract, so they are not implementations. `implementations.astro`\ngives the package, the export and `since`, which is `@bundu/ui` **0.3.0 for every contract in\nboth families** (mzizi-registry #419): the next `@bundu/ui` release, one minor above 0.2.0 on\nnpm. `gaps` records where the current build falls short.\n\nFour fields are requirements. packages-npm's contract test evaluates the first three on the\nrendered Astro build; the responsive rules are prose. The values below are the Dashboard\nStandard's; the Discover Standard's differ (below):\n\n- **No-JS fallback.** `noJs.script` is `none` (no script) or `enhancement` (one script, and\n everything in `noJs.without` works when it does not run). Only AppShell and CommandPalette\n are `enhancement`; every other app component ships no script.\n- **Density.** Each row gives a part's height in px for a fine pointer and a coarse one\n (touch), read from the rendered classes (`h-N`, `min-h-N`, `size-N` = N×4;\n `pointer-coarse:` for touch). Dashboards are dense on a mouse and 44–48px on touch: the app\n Button is 36px fine (32 `sm`, 40 `lg`) and 48px coarse (44 `sm`), with the small radius,\n and nav rows are 32 / 44. That is the contracts' rule for `@bundu/ui/app`, not the registry\n primitives' 48px floor. A control under 44px on touch is listed in `gaps`, not hidden.\n- **Theming.** A brand overlay changes colour only: `--primary`, `--ring`, AppShell's\n `--app-accent` and the brand mark. Layout never varies by brand. A mineral may be named only\n as one of the component's declared `statusColours`; any other mineral class, or any colour\n value, fails (the `mzizi-design` skill).\n- **Responsive.** Each contract's rules from 320px up.\n\nIn both families the tests also fail **any inline `style` attribute** on a rendered element, so\na page's Content-Security-Policy can keep `style-src 'self'` with no\n`style-src-attr 'unsafe-inline'`: custom properties go through classes or data attributes\n(AppShell's `data-accent`), sizes through classes or SVG geometry (BarChart). JSON-LD\n(`type=\"application/ld+json\"`) is data and does not count as a script.\n\n**How they relate to `CONTRACT` and the language.** The `contract` field is a\n`contract … end` block in the same clause grammar as a Roots `pub const CONTRACT` (RFC-0006\nand RFC-0010), restricted to what applies to rendered markup: subjects `slot`, `role`,\n`label`, `class`, `portal`, `<element> \"<text>\"`, `uses <data-slot>` and `when <state> …`;\npredicates `is`, `contains`, `not_empty`, `in`, `uses \"--token\"`, `min_height` and `shows`. As\nin the language, **a clause, check or density row a runner cannot evaluate fails** (FM-12).\nThe registry's own suites evaluate them: `__tests__/astro/contracts.test.ts` renders every\n`.astro` in every state (Astro's container, no renderer), `__tests__/contracts/\ntsx-contracts.test.tsx` renders every `contract`-identity `.tsx` with the same runner\n(`contracts/runner.ts`), and `__tests__/contracts/contracts.test.tsx` validates every contract\nagainst the schema and the grammar and checks each identity-only sibling. packages-npm's\n`src/app/contracts.test.ts` runs the same contracts again on the built package. A crate's own `CONTRACT`\nand `tests/contract.rs` still run as before.\n\nEvery contract has an `.astro` (`implementations.astro.registry`). The seven app primitives'\n`.tsx` are the registry's own `button`, `badge`, `card`, `alert`, `input`, `label` and\n`skeleton`, which share only their identity (the contract lists the divergences), as do the\n`ui/` family's; every other `.tsx` (`app-*`, `discover-*`, `site-*`) has\n`identity: \"contract\"`, held to the whole contract exactly as the Astro build is. A `.rs`\nexists in `mzizi-ui` for `button`, `badge`, `card`, `input`, `label` and `safe-area-frame`;\nmzizi-registry #401 tracks Rust ports of the rest, done when each passes the contract.\n\n### The Discover Standard\n\nThe 11 Discover Standard list-page contracts in `discover/` and the node each declares (the detail pattern below adds five more). DiscoverShell's `kind` is `shell`;\nthe other ten are `pattern`s.\n\n| Contract | Component | Node | What it is |\n| --------------------------- | --------------- | ---- | --------------------------------------------------------------------------------------------- |\n| `discover/discover-shell` | DiscoverShell | N7 | the frame: skip link, mineral strip, header (brand, \"Main\" nav, one action), `<main>`, footer |\n| `discover/discover-meta` | DiscoverMeta | N6 | the `<head>` tags: title, description, robots, canonical, Open Graph, the X card, JSON-LD |\n| `discover/discover-hero` | DiscoverHero | N6 | breadcrumbs, eyebrow, the page's one `<h1>`, lead, the search box and actions |\n| `discover/discover-search` | DiscoverSearch | N6 | the one search box: a `role=\"search\"` GET form, so every search is a URL |\n| `discover/category-chips` | CategoryChips | N6 | the category links as a named navigation landmark; chips wrap |\n| `discover/category-chip` | CategoryChip | N6 | one category link, with an optional count; a link, never a button |\n| `discover/discover-section` | DiscoverSection | N6 | one band: eyebrow, heading, description and \"See all\" over its content |\n| `discover/result-grid` | ResultGrid | N6 | a polite status line, the cards, the empty state and \"load more\"; `grid`, `list` or `rail` |\n| `discover/discover-card` | DiscoverCard | N6 | one card for every page, variants `article`, `event`, `circle`, `place` |\n| `discover/load-more` | LoadMore | N6 | cursor pagination: one `rel=\"next\"` link to `?cursor=…` |\n| `discover/open-in-app` | OpenInApp | N6 | \"Open in Mukoko\": an https link into the super-app, with one line saying what happens |\n\nSame format, schema, clause grammar and runners as the Dashboard Standard. What the Discover\ncontracts state differently:\n\n- **What it is for.** Public discover and browse pages in the Mukoko family (circles, news,\n events, weather, and the super-app on the web), not admin or operator dashboards. It reuses\n the Dashboard Standard where they overlap: ResultGrid's `empty` slot takes `app/empty-state`\n or `app/state-message`, and `related` names `app/filter-bar` and `app/pagination` as similar\n components with a different contract.\n- **No script at all.** Every Discover contract's `noJs.script` is `none`; there is no\n `enhancement` like AppShell's or CommandPalette's. Views are URLs, not client state: search\n is a GET form (`?q=`, with no `cursor`, so a new search starts at the first page), a category\n is a link, and paging is LoadMore's `rel=\"next\"` link to `?cursor=`.\n- **The same size on every pointer.** In every Discover density row `fine` equals `coarse`:\n 48px for the search field and its button, \"See all\", LoadMore, OpenInApp and DiscoverCard's\n app link; 44px for chips, the navigation links and the home link. Discover pages are not\n dense on a mouse, unlike the Dashboard Standard (most controls 32–40px on a fine pointer).\n- **Theming.** The brand-overlay rule is the same (colour only, no colour values, a mineral\n only as a declared status colour), but there is no AppShell `--app-accent`. A brand shows in\n DiscoverShell's `brand` slot (its mark) and in whatever primary action its `action` slot\n holds; the frame, header, navigation and footer are identical in every brand. `--primary` reaches only\n DiscoverHero's wash (`gradient-showcase`), DiscoverCard's monogram and `brand` badge tone,\n and OpenInApp's `primary` variant. Chips, sections and LoadMore are neutral in every brand,\n and DiscoverSearch follows the brand only in its focus ring (`--ring`). Only DiscoverCard\n declares status colours (`cobalt`, `malachite`, `gold`, `terracotta`), for its badge tones.\n- **Server-filled shells.** Every Discover component also works in an Astro page built once\n with `{{placeholders}}` and filled by a server, as circles.mukoko.com's Rust Worker does:\n text props are plain strings, text that fills to `\"\"` hides itself, and state switches are\n attributes styled by classes (ResultGrid, DiscoverSection and LoadMore `state`, DiscoverCard\n `badgeTone`, CategoryChip `current`). CategoryChip, DiscoverCard, DiscoverHero, LoadMore and\n ResultGrid have a `template` state with placeholders, rendered like every other state.\n DiscoverCard and CategoryChip render their own `<li>`, so they repeat as fragments.\n- **One card.** DiscoverCard's `variant` changes emphasis, never structure. Its title is the\n one primary link, stretched over the card; other actions stay separately focusable.\n- **OpenInApp's `href` is https** (a universal link or a server redirect), never a bare\n `mukoko://` link, which does nothing without the app.\n- **No siblings and no gaps yet.** No `.tsx` or `.rs` implements a Discover contract, and none\n records `gaps`. A React or Rust port is done when it passes the same contract.\n\n**Upstream first** (registry `CONTRIBUTING.md`, from #415, for both families): a component an\napp needs that Mzizi does not have, or a change to one it has, goes upstream immediately: its\ncontract in the registry, its build in `@bundu/ui` and its page on docs.mzizi.dev. An app keeps\na local copy only while that upstream pull request is open, marked at the top of the file with\n`TODO(mzizi): <upstream PR URL>`.\n\n### Changing a contract\n\n1. Edit `contracts/<family>/<name>.contract.json` in the registry and bump its `version`:\n major when a clause, prop, slot or state is removed or narrowed, minor when one is added,\n patch for prose. A new family also needs its directory in `FAMILIES` in\n `__tests__/contracts/contracts.test.tsx` and in packages-npm's `scripts/contract-paths.mjs`.\n2. Update `contracts/index.json` and the README's coverage table for that family. The test\n fails if either disagrees.\n3. Run `pnpm test` in the registry, then `pnpm contracts:fetch <branch>` and `pnpm test` in\n packages-npm. The Astro build must pass the new contract before either side merges. Never\n edit the copy in packages-npm.\n\n**The detail pattern** (mzizi-registry #429; docs.mzizi.dev/patterns/discover-detail): the\npage for one item reached from a discover page uses five more `discover/` contracts, each an\n`.astro` and a `.tsx`: `detail-hero` (the page's only `<h1>`, when/where, lead, image or media\nslot), `breadcrumb` (named `<nav>`, `aria-current=\"page\"`, BreadcrumbList JSON-LD), `meta-list`\n(a `<dl>` of facts), `detail-actions` (Open in Mukoko first, then secondary and share links; no\nscript) and `related-rail` (DiscoverCards; a scroll-snap row on phones, a grid from 48rem;\nhidden when empty).\n\n**Open in Mukoko** is one canonical https universal link, `mukoko.com/open/<service>/<id>`\n(`openInMukokoUrl` in `discover-open-link.ts`; `@bundu/ui/discover/open`). `open-in-app` 1.1.0\nand `detail-actions` take `service` (`news`, `events`, `weather`, `circles`) and `id`; `href` is\nonly an override. The apps claim `mukoko.com/open/*` as universal and app links; on the web a\nresolver (mukoko-dev/super-app-web `/open/*`) sends the reader to the service's page. Never a\nbare `mukoko://` link.\n\n## Reuse before build\n\n**The simplest change is the one you don't write.** Reuse before you build, compose before you\nimplement, and let one source own each decision. Use this before adding a component, a style or\na page, and during any refactor.\n\n1. **Reuse before build.** Search the registry first: `mzizi_search` or\n `mzizi_list_components` over the MCP (`https://mcp.mzizi.dev/mcp`, free), or\n `GET https://api.mzizi.dev/v1/ui`. Where a Rust implementation exists, depend on its crate\n (`cargo add mzizi-roots`). For the React build, install with\n `mzizi add <name>` or `npx shadcn@latest add https://api.mzizi.dev/v1/ui/<name>`. Never\n reimplement a primitive that already exists.\n2. **Styles are tokens.** Never hardcode a colour, radius, spacing, or motion value —\n consume `var(--…)` (or the `mzizi-tokens` consts in Rust). N1 is the only layer allowed to\n define values, so a rebrand is one edit. A new colour goes in the registry's\n `lib/tokens/palette.source.ts`, and `pnpm tokens:sync` regenerates `styles/globals.css`, the Rust\n tokens and the other emitters from it.\n3. **Compose, don't implement.** A page (N6) is a composition of N2 primitives and N3 brand\n components — never inline a `<button>`, a card, or an SVG. Pull spinners, skeletons, and\n badges from N2.\n4. **Variants over copies.** Collapse near-duplicate components into one variant table: an\n enum with a `match` in Rust, an `enum` table in Mzizi source, one `cva()` in the React\n build. Express differences as `variant` / `size` props, not new files.\n5. **One composition path.** In the React build, compose class names through `cn()` and\n extract shared logic into `lib/` or a hook. In Rust, a pure function beside the component.\n No logic duplicated across files.\n6. **Right altitude.** Keep each component self-contained, importing only from the layer\n below on its strand. A primitive that reaches up into page code can't be installed on its\n own.\n7. **Delete first.** Prefer removing over adding — dead code, unused props, redundant\n wrappers, commented-out blocks. Less code is less to break, read, and keep true.\n8. **Live data, not copies.** Read counts, tokens and doctrine from their source\n (`https://api.mzizi.dev/v1/stats`, `palette.canonical.json`, `mzizi_get_tokens`,\n `mzizi_get_doctrine`). A baked-in number or duplicated token guarantees drift.\n\n### Checklist\n\n- [ ] Searched the registry before building, and used the Rust build where one exists?\n- [ ] All styles are tokens (`var(--…)`), zero hardcoded values outside N1?\n- [ ] Page is pure composition of N2/N3, no inlined primitives?\n- [ ] Variation expressed as one variant table, not near-duplicate files?\n- [ ] One composition path, shared logic extracted once?\n- [ ] Each file self-contained and installable, importing only downward?\n- [ ] Deleted more than you added where you could?\n- [ ] Counts, tokens, and doctrine read live, not hardcoded?\n\n## Contributing a component\n\n**A component is a real file.** `components/registry/n<N>-<label>/<name>.rs` (Rust, compiled by\nthe node's crate in `mzizi-rs/`) and, for the React build, `<name>.tsx` beside it, which\n`pnpm typecheck` (`tsc --noEmit`) and `pnpm lint` check. An error in either fails CI. The\nregistry has no app to build: CI's `Rust` job runs `cargo fmt`, `check`, `clippy` and the\ncontract tests, and its `Build` job runs `pnpm build`, which runs every generator in write mode\nand fails if that changes a committed file.\n\n| File | What it is |\n| --------------------------------------------- | ----------------------------------------------------------------- |\n| `components/registry/n<N>-<label>/<name>.rs` | the Roots component (Dioxus UI, or a sans-IO server core) |\n| `components/registry/n<N>-<label>/<name>.tsx` | the React build of the same contract |\n| `registry.json` | the manifest `/v1/ui/<name>` and `npx shadcn add` resolve against |\n\n`registry.json` carries the install contract (description, dependencies,\n`registryDependencies`, target paths) and **never the source**. The node is derived from the\ndirectory the component lives in, so it cannot disagree with where the file is.\n\n**There is no database.** The registry's files are its data layer (mzizi-registry PR #368), and\na test fails the build if a Supabase import or a `SUPABASE_*` read comes back. Nothing about a\ncomponent, including its source, status or history, is written to a table. If you find\ninstructions anywhere telling you to `INSERT` a component or read a `component_documents` row,\nthey are stale.\n\n### Step 1 — Decide the node\n\nThe architecture is the **Mzizi DNA double helix**: eight nodes (N1–N8) on the engineering\nbackbone, four rungs (N9–N12) that bridge both backbones, and six strands. The N-numbers are\n**labels, not a sequence**.\n\nThe node decides the **directory**, the directory decides the **crate** that compiles the Rust\n(`mzizi-rs/crate-for-node.json`), and the directory is what the build reads. Choosing the node\nand choosing where the file goes are the same decision.\n\n| Node | Directory | Crate | What belongs there |\n| ----------------- | -------------------- | ----------------- | --------------------------------------------------------------------------- |\n| N1 tokens | `n1-tokens/` | `mzizi-tokens` | A token value or emitter (colour, spacing, motion, radius), not a component |\n| N2 primitive | `n2-primitives/` | `mzizi-ui` | Generic UI: button, card, input, dialog, toolbar, bento-grid |\n| N3 brand | `n3-brand/` | `mzizi-brand` | A branded composition with the mineral palette |\n| N4 safety | `n4-safety/` | none yet | A conditional-rendering gate: permission, geo, rate limit |\n| N5 resilience | `n5-resilience/` | none yet | Error boundary, skeleton, offline banner, fallback chain |\n| N6 pages | `n6-pages/` | none yet | Full-screen layout composition |\n| N7 shell | `n7-shell/` | `mzizi-shell` | App container: navigation, routing, lifecycle |\n| N8 assurance | `n8-assurance/` | `mzizi-assurance` | Instrumentation, a11y audit, RTL conformity, probes |\n| N9 fundi | `n9-fundi/` | `mzizi-fundi` | Automated healing (a rung) |\n| N10 documentation | `n10-documentation/` | `mzizi-docs` | Docs, AI instructions, docs infrastructure (a rung) |\n| N11 discovery | `n11-discovery/` | `mzizi-discovery` | SEO / AIO surfaces: if the machine can't see it, it doesn't exist (a rung) |\n| N12 skills | none in the registry | none | Agent skills (a rung), authored in `mzizi-dev/agent-tools/mzizi-skills/` |\n\nA node with no crate yet (N4, N5, N6) takes a `.tsx` today. Adding its first `.rs` means adding\nits crate and its `crate-for-node.json` entry in the same pull request; `pnpm rust:generate`\nrefuses Rust that no crate claims.\n\nIf you are unsure where something belongs, ask the MCP (`https://mcp.mzizi.dev/mcp`, free, no\naccount): `mzizi_list_components` with `node: N` shows what already lives in a node, and\n`mzizi_get_architecture` returns the node, rung and strand model with live counts. Never\nhardcode counts.\n\n### Step 2 — Write the file\n\nCreate it in the directory the node names:\n\n```\ncomponents/registry/n3-brand/mzizi-your-component.rs # the Roots component\ncomponents/registry/n3-brand/mzizi-your-component.tsx # the React build, same contract\n```\n\nThe Rust file carries `pub const CONTRACT: &str` and follows the rules in \"Using a UI component\" above: variants as enums, tokens by reference, browser facilities as props, icons as slots,\nno helpers shared between components. `.ts` is for a non-rendering module.\n\nThat is the authoring step. There is no row to insert and no registration to perform before\nwriting code: the file _is_ the component, and `cargo test` (for the `.rs`), `pnpm typecheck`\nand `pnpm lint` (for the `.tsx`) and `pnpm build` (every derived artifact regenerated, with no\ndiff) are what tell you it is real.\n\nNaming: N3 brand components take a `mzizi-` prefix. (Components formerly named `nyuchi-*` are\n`mzizi-*`, and the old names redirect.) Everything else is the bare name, matching what a\nconsumer will type in `mzizi add` or `npx shadcn add`.\n\n### Wiring the Rust into its crate\n\n`pnpm rust:generate` writes the committed copy to `mzizi-rs/crates/<crate>/src/generated/`. Add\nthe `#[path = \"generated/<name>.rs\"] pub mod <name_snake>;` line and the `pub use` to the\ncrate's `src/lib.rs` by hand, and add the component to the crate's `tests/contract.rs`. Edit\nthe registry file, never the copy. The workspace lints forbid `unsafe_code` and warn on\n`missing_docs`; clippy turns the warning into a failure. Cap parallel builds on a small machine\n(`CARGO_BUILD_JOBS=2`).\n\nA release is a version bump in `mzizi-rs/Cargo.toml`. On merge to `main`,\n`.github/workflows/publish-crates.yml` re-runs the Rust gate and publishes each crate in\ndependency order, skipping any version already on crates.io. A published crate name is\npermanent. Say in the PR body that components changed, so the site, docs and skills are\nupdated to match.\n\n### Step 3 — Declare it in `registry.json`\n\nOne item, carrying the install contract. `meta` is the part you author; four other fields are\n**derived from it** and must not be hand-written.\n\n```jsonc\n{\n \"name\": \"your-component-name\",\n \"type\": \"registry:ui\",\n \"description\": \"Short description of what it does.\",\n \"dependencies\": [],\n \"registryDependencies\": [],\n \"files\": [\n {\n \"path\": \"components/registry/n2-primitives/your-component-name.tsx\",\n \"target\": \"components/ui/your-component-name.tsx\",\n \"type\": \"registry:ui\"\n }\n ],\n \"meta\": {\n \"collection\": \"primitives\",\n \"owner\": \"mzizi\",\n \"useCases\": [\"Use case 1\", \"Use case 2\"],\n \"variants\": [\"default\", \"sm\", \"lg\"],\n \"sizes\": [\"default\", \"sm\", \"lg\"],\n \"features\": [\"cn() for className composition\", \"data-slot attribute\"],\n \"a11y\": [\"ARIA attributes\", \"Keyboard accessible\"],\n \"hasDemo\": true\n }\n}\n```\n\n`files[]` lists the `.tsx`: it is the shadcn install contract for the React build. The `.rs`\nbeside it is not listed; the node's crate compiles it, and `/v1/rs/<name>` serves it with the\ncrate's name.\n\n**Do not write `title`, `categories`, `docs` or `author`.** `pnpm registry:metadata` derives all\nfour from `meta` and the repo. `docs` in particular is what the shadcn CLI prints _after_\ninstalling, so it is generated from your `useCases` / `variants` / `sizes` / `features` / `a11y`\nrather than duplicated by hand — and an item with no `meta` deliberately gets no `docs`, because\na stub reads as documentation and says nothing.\n\nThen run the generators and let the gates check you:\n\n```bash\npnpm registry:paths # fill file paths from what is on disk\npnpm registry:metadata # derive title, categories, docs, author\npnpm registry:normalize # canonical ordering\npnpm registry:validate # every item resolves on disk; every dependency addressable\npnpm registry:verify # the CI drift gate\npnpm typecheck && pnpm lint && pnpm build # build: every generator; commit what it writes\n```\n\nFollow the criteria for the chosen node.\n\n#### Every node: the Rust file\n\n- `pub const CONTRACT: &str` with the clauses the rendered markup must meet (slot, role, touch\n floors, variant tables), evaluated by the crate's `tests/contract.rs` on `dioxus-ssr` output\n- The same `data-slot`, `data-portal` and variant values as the `.tsx`, asserted by the same\n suite; a deliberate divergence is asserted from both sides\n- `prefers_reduced_motion: bool` as a prop where the `.tsx` reads the harness's motion\n- Icons as `Element` slots, not an icon crate\n- Doc comments on every public item (`missing_docs` is a warning, and clippy runs with\n `-D warnings`); no `unsafe`\n\n#### N2 primitive checklist\n\n- No `useMziziHarness` import in the `.tsx`\n- `data-slot` attribute on the root element\n- `data-portal` attribute pointing at `https://mzizi.dev/components/<name>`\n- `cn()` for className composition in the `.tsx`\n- No raw Tailwind colours: use semantic tokens (`bg-primary`, `text-foreground`, …)\n- Icons from `@/lib/icons` in the `.tsx`, never `lucide-react` directly\n- **Touch targets never go below 48px.** Buttons and inputs are `h-14` (56px) default and\n `h-12` (48px) small, as `button.tsx`, `button.rs` and `primitives/button.mz` all state, and\n `/v1/brand` `.componentSpecs` serves (`minTouchTarget: 48`). A smaller visual box, such as a\n badge, is not a touch target; if it becomes one, give it `min-h-[48px]`.\n- Pill-shaped categories (button, input, avatar, badge, toggle) use `rounded-full`\n\n#### N3 brand checklist\n\n- `mzizi-` prefix on the name\n- `useMziziHarness(\"<name>\")` in the `.tsx` for the motion preference (and `log` or\n `LiveRegion` where the component uses them); `prefers_reduced_motion` as a prop in the `.rs`\n- The entrance animation off when motion is reduced\n- An ARIA role or `aria-label`, and a region that is named in every state, the loading\n skeleton included\n- `data-slot` and `data-portal` attributes, in every state\n- `focus-visible` ring on interactive elements, and interactive elements at the 48px floor\n- I18N via `Intl` formatters for dates, numbers and currency\n- Semantic tokens for status-bearing colours\n\n#### N6 page checklist\n\n- Pure composition: no inline buttons, cards or SVGs\n- Accept children/slots for content\n- Semantic CSS vars only (`bg-card`, `text-foreground`, `bg-primary`)\n- A loading-state prop\n- `role=\"main\"` and an `aria-label`\n\n#### N8 assurance checklist\n\n- A sans-IO Rust core (typed input, typed result, every facility behind a trait) in\n `mzizi-assurance`, with the `.ts` module as the React build\n- A banner comment identifying the node and purpose\n- A configurable rules array\n- Optional `onViolation` / `onComplete` callbacks\n\n### Step 4 — Docs and demos\n\nThere is nothing extra to write. Docs come from the `meta` you already authored in Step 3\n(`useCases`, `variants`, `sizes`, `features`, `a11y`), and `pnpm registry:metadata` turns them\ninto the `docs` string the CLI prints after install. Set `meta.hasDemo` when a demo exists.\n\nIf a prop table is expected, `pnpm props:extract` derives it from the component's own types and\n`pnpm props:verify` is the gate. Props are read from the code, never restated beside it.\n\n### Step 5 — Versions and history\n\nThere is no status row and no database. A component's version history is the registry's\nchangelog (`content/changelog/`, generated, checked by `pnpm changelog:generate:check`) and the\nrename map. `mzizi_get_component` with `include: [\"versions\"]` returns it. Read what a component\nis through the MCP or `https://api.mzizi.dev/v1/ui/<name>` rather than assuming.\n\n### Step 6 — Validate accessibility\n\nIf your component introduces a new colour pair, validate it before shipping. The MCP tool is\ncomputed locally and needs no account:\n\n```\nmzizi_check_accessibility(foreground: \"#FFFFFF\", background: \"#0047AB\")\n```\n\nIt returns the WCAG 2.1 contrast ratio with AA/AAA verdicts and whether the pair clears the\nMzizi floor (APCA and AAA).\n\n### Step 7 — Before you open the PR\n\n`pnpm check` runs every registry gate CI runs, in order, including `registry:validate`,\n`registry:verify`, `tokens:verify`, `changelog:generate:check`, `rust:generate:check`, the\ntests and the build. Then the Rust workspace gate:\n\n```bash\npnpm check\ncargo fmt --manifest-path mzizi-rs/Cargo.toml --all -- --check\ncargo clippy --manifest-path mzizi-rs/Cargo.toml --workspace --all-targets -- -D warnings\ncargo test --manifest-path mzizi-rs/Cargo.toml --workspace\ncargo package --manifest-path mzizi-rs/Cargo.toml --workspace\n```\n\nIf you touched `files[]` or `meta`, run `pnpm registry:paths`, `pnpm registry:metadata` and\n`pnpm registry:normalize` first; their `--check` twins fail otherwise.\n\nA green run means the item resolves to real files, every dependency is addressable, the derived\nfields match `meta`, the Rust compiles, and its contract holds on rendered markup. Say in the PR\nbody that a component changed, so the site, the docs and the skills are updated to match.\n\n### What to avoid\n\n- **Never put component source in a database row, a JSON document, or any second place.** The\n file under `components/registry/` is the component; everything else is a representation of\n it, and a representation can drift from the code while still looking correct. That is not\n hypothetical here: a `source_code` column once served stale copies for 571 components.\n- Never edit `mzizi-rs/crates/*/src/generated/`. It is overwritten by `pnpm rust:generate`.\n- Never hand-write `title`, `categories`, `docs` or `author` in `registry.json`. They are\n derived, and a hand-written value is a second source that the next generator run silently\n overwrites.\n- Never hardcode hex colour values (except documented third-party brands like Ethereum,\n Google, EcoCash).\n- Never use `lucide-react` directly in a `.tsx`; go through `@/lib/icons`.\n- Never use `margin-left` / `padding-right` / `left`; use logical properties\n (`margin-inline-start`, …) for RTL support.\n- Never start new work in the React build alone. If a component has a Rust implementation,\n change the Rust and keep the `.tsx` in step.\n- Never bump a major version on your own initiative. That is a maintainers' call.\n\n## The React build\n\n`npx shadcn@latest add https://api.mzizi.dev/v1/ui/<name>` installs the `.tsx` for an existing\nReact app, for all 577 items. Always pass the absolute URL: a bare name resolves against\nshadcn's own registry and installs a different component. `mzizi add <name>` installs the React\nbuild too. Neither is where new work goes.\n\n## See also\n\n- `docs/roots/RFC-roots.md` in the registry: the inventory, the conversion batches and what\n the API and site still need for Rust-first serving (`/v1/roots` is proposed, not live).\n- The `mzizi-language` skill for the clause grammar and `mz contract`.\n- The `mzizi-design` skill for the palette, radius, type and the Ubuntu constraints.\n- The `mzizi-backend` skill for mounting a server core on Workers.",
20
- "source": "mzizi-dev/agent-tools/mzizi-skills/skills/mzizi-roots"
22
+ "category": "build",
23
+ "description": "Everything about Mzizi's components: Mzizi Roots, the Rust build (UI crates built on Dioxus 0.7 today and moving to Mzizi's own renderer; host-agnostic server components). cargo add mzizi-roots / mzizi-roots-server, what mzizi_get_component returns (Rust first: lead, rust, react), the node-to-crate map, pub const CONTRACT checked on dioxus-ssr markup, the component contracts in the registry's contracts/ for the Mzizi Dashboard Standard (app/, 35) and the Mzizi Discover Standard (discover/, 16 with the detail pattern and the canonical Open in Mukoko link), site/ (8) and ui/ (18): what to read before building or changing a @bundu/ui component, the no-JS fallback and density as requirements, and how Discover differs (no script, the same size on every pointer, server-filled shells), installing the shell first (see mzizi-architecture), the frontend paths (pure .astro from the registry via mzizi add --target astro, Astro with Roots, or pure Rust; Next.js adopts through the registry's .tsx) and app setup, reuse before build, and adding a component to the registry (the node, the .rs and .tsx, registry.json, per-node checklists, the 48px floor, pnpm check and the cargo gates). The React/TSX build is the deprioritised secondary. Replaces scaffold-component, simplify and half of ecosystem-app-setup.",
24
+ "body_mdx": "# Mzizi Roots — the Rust build of Mzizi's components\n\n**Mzizi Roots** is Mzizi's own components in Rust: UI components, and server components as\nhost-agnostic Rust. The UI crates are built on Dioxus 0.7 today and are moving to Mzizi's own\nRust renderer (a pure `render(props) -> String`, with behaviour attached in the browser through\n`web-sys`). Do not write new Dioxus code for a Roots component. They are built to support the Mzizi language (the\n`mzizi-language` skill) as its component model, the way React is JavaScript's; they are not\nthe language. They live in\n[`mzizi-dev/mzizi-registry`](https://github.com/mzizi-dev/mzizi-registry) and are compiled by\nthe crates in its `mzizi-rs/` workspace. The plan is `docs/roots/RFC-roots.md` there.\n\n**Rust first.** Where a Rust implementation exists, present it and use it first. The React/TSX\ncomponents are **the React build**: they keep working for existing React apps, and they are\ndeprioritised, so no new work goes into them.\n\nThis skill describes registry `main` at v4.18.0 (`0d17818`, 2026-11-01) and its `contracts/`\n(77 component contracts in four families, and the `lib/` family), the crates at **0.7.0**\n(registry v4.18.0, on crates.io since 2026-11-01; 0.7.0 adds two crates, `mzizi-resilience`,\nthe N5 core, and `mzizi-chaos-engine`, the N8 seeded chaos engine, from registry PRs #584\nand #586; 0.6.0 before it carried the `--assurance-*` and `--attestation-*` roles in the generated\n`mzizi-tokens` pack, from mzizi-registry #578, and 0.5.0 the `mzizi-mongodb` security fixes from mzizi-registry #567; the UI crates\notherwise match 0.4.0, on crates.io since 2026-10-20 with `markdown-renderer` 1.2.0 and 1.2.1\nfrom mzizi-registry #483 and #517), and `mzizi-mcp` 0.13.0. It replaces three 0.7.0 skills:\n`scaffold-component` (now \"Contributing a component\"), `simplify` (now \"Reuse before build\")\nand the frontend half of `ecosystem-app-setup` (now \"Starting an app\"). Tokens, brand and the\nUbuntu constraints are in the `mzizi-design` skill.\n\n## Install\n\nTwo umbrella crates with no code of their own re-export the node crates behind features:\n\n```sh\ncargo add mzizi-roots # UI: tokens + ui + brand + shell (all default features)\ncargo add mzizi-roots-server # server: assurance + fundi + docs + discovery\n```\n\nTake only what you use:\n\n```toml\n[dependencies]\nmzizi-roots = { version = \"0.7\", default-features = false, features = [\"brand\"] }\n```\n\nTo follow `main`, or pin a commit, install from git. Cargo finds a crate by name anywhere in the\nrepository's workspace:\n\n```sh\ncargo add mzizi-roots --git https://github.com/mzizi-dev/mzizi-registry\n```\n\n```toml\nmzizi-brand = { git = \"https://github.com/mzizi-dev/mzizi-registry\", rev = \"<commit>\" }\n```\n\nA single node crate works too (`cargo add mzizi-ui`). The crates depend on `dioxus` with\n`macro`, `signals`, `hooks` and `html` only, so the app that mounts them chooses web, desktop,\nmobile or server rendering.\n\n`mzizi add <name> --target rust` (`@nyuchi/mzizi-cli`) records the crate and prints the\n`cargo add` rather than copying a `.rs` file into your project: a copied component is a fork\nof a crate module.\n\n## What the MCP returns\n\n`mzizi_get_component` on `https://mcp.mzizi.dev/mcp` (free, no account; `mzizi-mcp` 0.11.0) is\nRust first. It returns `{name, renamedFrom?, lead, note, rust, react, docs?, versions?}`:\n\n- `lead` is `\"rust\"` when the component has a Roots implementation, else `\"react\"`; `note`\n says which build to use.\n- `rust` is the registry's `/v1/rs/<name>` answer with the install first: `crate`\n (`{name, registry, git}`), `install.cargo` (`cargo add <crate>`), `install.pinned`\n (`cargo add <crate> --git https://github.com/mzizi-dev/mzizi-registry --rev <pin>`, which\n builds exactly the source shown), `module` (e.g. `mzizi_brand`), `contract` (the\n `contract … end` text, or `null`), and `files[]` with the `.rs` source inline. With no Rust\n it is `null`.\n- `react` is the React build: `build: \"react\"`, `status: \"deprioritised\"`, `install` (the\n `npx shadcn@latest add https://api.mzizi.dev/v1/ui/<name>` line), then the `/v1/ui/<name>`\n body. It is no longer under a `component` key (that was 0.10.x).\n\n`mzizi_list_components` rows carry `rustCrate` when a component has Rust, the response carries\n`withRust`, and `rust: true` lists only those. `mzizi_search` hits carry `rustCrate` too. For\n`mzizi-hero-stat` the answer is `lead: \"rust\"`, crate `mzizi-brand`, and the four-clause\ncontract shown under \"Contracts\" below.\n\n## The crates\n\nOne crate per registry node that has Rust. The map is `mzizi-rs/crate-for-node.json`, and\n`pnpm rust:generate` refuses a node with Rust in it that no crate claims.\n\n| Node directory | Crate | Umbrella | What it holds |\n| ------------------- | ----------------- | ---------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `n1-tokens` | `mzizi-tokens` | `mzizi-roots` (always on) | the 21-family palette and scales as Rust consts, generated from `lib/tokens/palette.source.ts` |\n| `n2-primitives` | `mzizi-ui` | `mzizi-roots` (`ui`) | alert, avatar, badge, button, card, chart, input, label, markdown renderer, progress, safe-area frame, separator, skeleton, status badge |\n| `n3-brand` | `mzizi-brand` | `mzizi-roots` (`brand`) | alert banner, avatar stack, cover header, empty state, escalation card, gauge card, hero stat, meta tile, stats row, success screen, suitability card, user card (all `mzizi-*`) |\n| `n7-shell` | `mzizi-shell` | `mzizi-roots` (`shell`) | bottom nav, command palette, connectivity bar, deep-link handler, footer, mini-app runtime, notification center, persistent player, route guard, theme provider, toast provider, update prompt |\n| `n8-assurance` | `mzizi-assurance` | `mzizi-roots-server` (`assurance`) | probes, telemetry, the OTLP exporter, a11y and RTL conformity checks, alert and incident engines |\n| `n9-fundi` | `mzizi-fundi` | `mzizi-roots-server` (`fundi`) | the Fundi reporter and learning loop (client side) |\n| `n10-documentation` | `mzizi-docs` | `mzizi-roots-server` (`docs`) | the docs API and routing, AI context, the changelog and docs renderers (brings in `dioxus`) |\n| `n11-discovery` | `mzizi-discovery` | `mzizi-roots-server` (`discovery`) | page metadata and Schema.org JSON-LD |\n\nN5 resilience has a crate since 0.7.0: `mzizi-resilience` (circuit breaker, retry backoff,\nbulkhead, rate limiter, fallback chain and deadline, each a sans-IO state machine with a\n`contracts/lib/` contract). Depend on it directly; no umbrella re-exports it yet, and\n`crate-for-node.json` still maps `n5-resilience` to `mzizi-data`. `mzizi-chaos-engine` (N8, a\nseeded deterministic fault schedule for chaos tests that refuses to run in production) is the\nsame. N4 safety and N6 pages have no crate (N6 never will: a page implements nothing). A Workers adapter\n(`mzizi-worker`) is planned for `mzizi-roots-server` and has not landed.\n\nThe registry has 577 items and 55 `.rs` files. Cite `GET https://api.mzizi.dev/v1/ui` or\n`/v1/stats` for a current count rather than repeating these. To find a component's crate, read\n`rust.crate` from `mzizi_get_component`, or take its node directory and read the table above.\n`https://api.mzizi.dev/v1/rs/<name>` also serves a `crate` field, derived from the same map on\nregistry `main`; the API serves the registry at a pinned commit, and until the gateway's pin\nmoves past the map it names `mzizi-ui` for every component. Trust the map, or the MCP.\n\n## The renderer\n\nMzizi components are built in-house in Rust, not borrowed from another framework.\n\n- **Built so far.** Seven components render with Mzizi's own `render(props) -> String`: the\n skeleton and six static primitives, merged in `mzizi-dev/mzizi-registry`\n ([#506](https://github.com/mzizi-dev/mzizi-registry/pull/506) and\n [#510](https://github.com/mzizi-dev/mzizi-registry/pull/510)).\n- **Not yet.** Dioxus is still a dependency of `mzizi-ui`, `mzizi-brand`, `mzizi-shell`,\n `mzizi-docs` and `mzizi-roots` until the migration in the registry's `RFC-roots-renderer`\n finishes. The examples in this skill use Dioxus because the published crates need it today.\n- **Direction.** No Dioxus, Leptos or Yew in new work. Astro renders HTML on the server, static\n components ship zero WASM, there is at most one WASM module per page, and Tokio runs\n server-side only.\n\n## Using a UI component\n\nThis compiles against `mzizi-roots` 0.7.0 from crates.io and renders the component to a static\nHTML fragment with `dioxus-ssr`:\n\n```toml\n[dependencies]\nmzizi-roots = { version = \"0.7\", default-features = false, features = [\"brand\"] }\ndioxus = { version = \"0.7\", default-features = false, features = [\"macro\", \"signals\", \"hooks\", \"html\"] }\ndioxus-ssr = \"0.7\"\n```\n\n```rust\nuse dioxus::prelude::*;\nuse mzizi_roots::brand::{AlertSeverity, MziziAlertBanner};\n\nfn banner() -> Element {\n rsx! {\n MziziAlertBanner {\n r#type: \"Thunderstorm\",\n severity: AlertSeverity::Severe,\n headline: \"Severe storms this afternoon\",\n }\n }\n}\n\nfn main() {\n let mut dom = VirtualDom::new(banner);\n dom.rebuild_in_place();\n let html = dioxus_ssr::render(&dom); // a static HTML fragment for Astro to place\n println!(\"{html}\");\n}\n```\n\nThe output is a `<div data-slot=\"mzizi-alert-banner\" data-portal=\"https://mzizi.dev/components/mzizi-alert-banner\" role=\"alert\" …>`\nwith the same Tailwind classes and CSS custom properties as the React build, so one stylesheet\nstyles both.\n\nWhat a Roots UI component looks like:\n\n- **Same contract as the React build:** the same registry name, `data-slot`, `data-portal`,\n variant names and Tailwind classes over the same `var(--…)` tokens. No colour literals.\n- **Variants are enums**, and a `match` replaces `class-variance-authority`\n (`n2-primitives/badge.rs`, `button.rs`).\n- **Browser facilities are props.** Where the `.tsx` reads `useMziziHarness`, the Rust takes the\n one bit it branches on, usually `prefers_reduced_motion: bool`. Logging is the host's.\n- **Icons are slots:** an `Element` the host renders, where the `.tsx` takes a Lucide component.\n- **Each file is self-contained.** No helpers shared between components.\n\n## The two frontend paths\n\nThe frontend is either **Astro** (pure `.astro` components, or Roots rendered underneath) or\n**pure Rust end to end**.\n\n- **Pure Rust.** A Dioxus app depends on the crates and mounts the components on web (wasm),\n desktop or mobile. Every component supports this today.\n- **Astro, static.** Render with `dioxus-ssr` at build time or in a Worker, and let Astro place\n the fragment, as in the example above. It ships no JavaScript and suits display components.\n The brand crate's contract suite does this for every component on every run.\n- **Astro, interactive islands.** Compile the behaviour to one wasm module per page and wrap it\n as a custom element. **Not packaged yet**: the wrapper crate (`mzizi-islands`) is proposed for\n batch 2 of the RFC.\n\n- **Astro, pure `.astro` components** (mzizi-registry #397, owner decision 2026-10-04). The\n registry is the single source of every component in every format: `.tsx`, `.rs`, `.astro`\n (and `.mz`, the Mzizi language, as it lands). A component's `.astro` sits beside its `.tsx`\n and `.rs` (`components/registry/n<N>-*/<name>.astro`), pure Astro with no React or\n Vue under it and no client JavaScript unless its contract allows one enhancement script.\n Install with `mzizi add <name> --target astro` (inferred in an Astro project, even one with\n React islands): it reads `api.mzizi.dev/v1/astro/<name>` and writes the component,\n its flat-imported siblings (`./button.astro`, `./ui-utils`, `./server-table`) and any brand\n asset into `src/components/mzizi/`. A component with no `.astro` is refused by name, never\n replaced by its `.tsx`. `mzizi_get_component` returns the Astro block too.\n\nThe Mzizi Dashboard Standard's app components (`app-*`, plus the primitives `button`, `badge`,\n`card`, `alert`, `input`, `label`, `skeleton`), the Mzizi Discover Standard's components\n(`discover-*`, including the detail pattern) and the marketing-site components (`site-*`) all\nhave an `.astro` AND a `.tsx` in the registry (the `ui/` family's Astro ports keep the\nregistry's own `.tsx`, which share only what their contract's `identity` says), each held to\nits contract (\"The Dashboard and Discover Standards' contracts\" below). `@bundu/ui`\n(`@bundu/ui/app/*`, `@bundu/ui/discover/*`) is BUILT from these files at a pinned registry\ncommit, and its CI fails on drift; a Next.js app adopts the same design through the registry's\n`.tsx` (`mzizi add app-data-table --target tsx` or\n`npx shadcn add` of `api.mzizi.dev/v1/ui/<name>`). Use them as they are: do not\nfork, restyle or wrap the shell or a component; fix it upstream in the registry (contract,\n`.astro` and `.tsx` together), in the same change.\n\n## Starting an app\n\n**Install the shell first.** Before the first page, mount the app's one shell: `AppShell` for a\nsigned-in app or console, `DiscoverShell` for a public discover site, both from `@bundu/ui`.\nThen check that every page renders inside it. The `mzizi-architecture` skill has the choice, the\ninstall and the check. Apps built page by page without a shell are the failure it exists to\nstop. Neither shell has a Rust build yet (`rs: null`), so a Rust or Astro-with-Roots app still\ntakes the shell from `@bundu/ui`.\n\nFor a new Mzizi-ecosystem app, or any app that consumes the design system. Pick the path\nfirst (above); these steps are the Astro one, with the pure-Rust differences noted.\n\n### 1. Create the project (Astro)\n\n```bash\npnpm create astro@latest my-app -- --template minimal --typescript strict\ncd my-app\npnpm astro add tailwind cloudflare\n```\n\nAstro renders HTML by default, which is what makes a new app indexable by N11 and paintable on\na low-end device without opting in to either. For a pure-Rust app, start from\n`cargo new my-app` and skip to step 3.\n\n### 2. Wire the tokens\n\nCopy the generated stylesheet rather than retyping hexes: `skills/mzizi-design/tokens/palette.css`\nin `@nyuchi/mzizi-skills` (all 21 families, light and dark, generated from\n`palette.canonical.json` at the package root). Import it from your global stylesheet (in Astro,\n`src/styles/global.css`) and register the properties in the Tailwind 4 `@theme` block so\nutilities generate. In Rust the same palette is the `mzizi-tokens` crate, always on in\n`mzizi-roots`. How the 21 families are meant to be used, the radius scale and the 48px floor\nare in the `mzizi-design` skill.\n\nPick the app's accent through `--brand-accent` rather than hardcoding a mineral hex: nyuchi =\ngold, mukoko = tanzanite, and a Mzizi surface = hematite (a Heritage tone, not a mineral; see the\nconstellation in `mzizi-design`).\n\n### 3. Add the Roots components\n\n```bash\ncargo add mzizi-roots # tokens, primitives, brand components, shell parts (no AppShell yet)\n```\n\nFor Astro, a small Rust crate (a build step, or a `workers-rs` Worker for request-time\nrendering) renders each component to HTML with `dioxus-ssr`, and Astro places the fragment.\nThe fragment carries the same Tailwind classes as the React build, so the stylesheet from step 2\nstyles it, and it ships no JavaScript. Interactive islands (Roots compiled to wasm and wrapped\nas custom elements) are proposed and not packaged yet. \"Using a UI component\" above has a\ncompiling example.\n\nNever copy component source between apps. Depend on the crate, so every app inherits fixes.\n\n### 4. Give the app's AI assistants the doctrine\n\nInstall the published skills bundle so any assistant working in the repo has the design system,\nthe language and the components on hand:\n\n```bash\nnpm install -D @nyuchi/mzizi-skills\nnpx skills experimental_sync # links the bundled skills into .agents/skills/\n```\n\n`npx skills add @nyuchi/mzizi-skills` does **not** work: the `skills` CLI reads that argument\nas a GitHub repository and fails to clone it. `experimental_sync` is the CLI's route for skills\nthat ship in `node_modules`, and it is marked experimental. The same skills are served with no\ninstall at all by the MCP's `mzizi_get_skills`.\n\nThe public Claude Code plugin installs these skills and the MCP in one step:\n\n```\n/plugin marketplace add mzizi-dev/mzizi-registry\n/plugin install mzizi@mzizi\n```\n\nTo wire the MCP directly instead, add it to `.mcp.json` or your client config. It is free with\nno account; only the Fundi tools need sign-in:\n\n```json\n{\n \"mcpServers\": {\n \"mzizi\": { \"type\": \"http\", \"url\": \"https://mcp.mzizi.dev/mcp\" }\n }\n}\n```\n\n### 5. Let fundi read the project\n\n`@nyuchi/mzizi-cli` ships the **fundi** agent, which reads the project off disk and plans the\nwiring against the registry:\n\n```bash\npnpm add -D @nyuchi/mzizi-cli\npnpm exec fundi explore # offline — snapshot the project\npnpm exec fundi plan \"wire up Mzizi tokens\"\n```\n\nRun the bins from the installed package (`pnpm exec`, or `npx` inside the project). A bare\n`npx fundi` outside it fetches an unrelated npm package called `fundi`. `explore` runs without\ncredentials; `plan` and `chat` need `ANTHROPIC_API_KEY`. A plan is\ninert until you apply it, so read it before letting it write.\n\n### 6. Verify\n\n```bash\npnpm dev\n```\n\nConfirm the tokens resolve in light and dark, a rendered Roots fragment picks up the styles,\nand the page is readable with JavaScript off.\n\n### 7. An existing React app\n\nIf the app is already React, the React build installs with the CLI or shadcn, by absolute URL:\n\n```bash\npnpm add -D @nyuchi/mzizi-cli && pnpm exec mzizi add button # infers the tsx target\nnpx shadcn@latest add https://api.mzizi.dev/v1/ui/mzizi-theme-provider\n```\n\nPoint `components.json` `registries.mzizi.url` at `https://api.mzizi.dev/v1/ui`. A bare name\nresolves against shadcn's own registry and installs a different component. Do not start a new\napp this way.\n\n## Server components\n\nA Roots server component is a **sans-IO core**: typed request in, typed response out, every\nexternal facility (a store, a clock, an outbound fetch, a secret) behind a trait. The host owns\nI/O and credentials. `n10-documentation/mzizi-docs-api.rs` is the model: it parses a path into a\ntyped `Route`, asks a `DocsStore` trait for data and returns an `ApiResponse`. `mzizi-assurance`,\n`mzizi-fundi` and `mzizi-discovery` have no dependencies at all. The RFC records a passing\n`wasm32-unknown-unknown` `cargo check` for those three and `mzizi-docs`; CI does not run a\nwasm32 job yet.\n\nA host adapter mounts the core: a `workers-rs` adapter for Cloudflare Workers, an axum adapter\nfor containers. Neither adapter crate exists yet. Until then the host writes the few lines that\nturn its request into the core's request (see the `mzizi-backend` skill). Dioxus\n`#[server]` functions are one more possible adapter, not the building block.\n\n## Contracts\n\nEvery Roots component carries a contract, in two parts:\n\n1. **The registry contract:** one registry name, description, dependencies and variants shared\n by both builds, and the same `data-slot`, `data-portal` and tokens. Each crate's\n `tests/contract.rs` reads the `.tsx` sibling and asserts that the slot, the portal and every\n variant value the Rust emits appear there too. A deliberate divergence, such as a touch\n target raised to the 48px floor, is asserted from both sides, so the test fails when the\n React build is fixed.\n2. **Checkable clauses** in the Mzizi language's `contract … end` grammar (RFC-0006; the\n `mzizi-language` skill), exported as `pub const CONTRACT: &str`. From\n `n3-brand/mzizi-hero-stat.rs`:\n\n ```rust\n pub const CONTRACT: &str = r#\"contract\n slot is \"mzizi-hero-stat\"\n role is \"region\"\n label not_empty\n button \"Share\" min_height 48\n end\"#;\n ```\n\n `mzizi-brand`'s contract suite renders each component with `dioxus-ssr` in named states and\n evaluates every clause against the markup it emits. **A clause it cannot evaluate fails.**\n `mzizi_roots::brand::CONTRACTS` lists every brand component with its contract.\n\nToday the twelve `mzizi-brand` components export `CONTRACT`. The other crates check the\nregistry contract against the `.tsx`, and their `CONTRACT` clauses arrive batch by batch.\nServer-component clauses (status per route, CORS and cache headers, no credential in the core)\nwait on the language's contracts-everywhere RFC (RFC-0010). Until then their tests assert those\nproperties against an in-memory implementation of the traits. The language's own `service`\ncontracts (`example` and `ensure`, RFC-0011) apply to a Mzizi `service`, not to these Rust\ncrates. No component lowers to Rust yet (only a Mzizi `service` does, to a local axum\npackage), so `mz contract` does not read a Roots `CONTRACT`.\n\n### The Dashboard and Discover Standards' contracts\n\nThe registry's\n[`contracts/`](https://github.com/mzizi-dev/mzizi-registry/tree/main/contracts) holds a\nmachine-readable, versioned contract for every component of `@bundu/ui` (built in\n`mzizi-dev/packages-npm`), in two families of one format:\n\n- **`app/`, the Mzizi Dashboard Standard** (since registry `a298a4e`, 2026-10-04,\n mzizi-registry #404): the one dashboard design for every product in the Bundu ecosystem,\n with each brand's mineral as an overlay (docs.mzizi.dev/patterns/dashboard-standard). Its 35\n contracts are the server-rendered app components (`@bundu/ui/app/*.astro`): the shell, the\n page and data patterns, and seven primitives.\n- **`discover/`, the Mzizi Discover Standard** (since registry `0bea10c`, 2026-10-04,\n mzizi-registry #415, tracking issue #413): one design for every public discover and browse\n page in the Mukoko family (docs.mzizi.dev/patterns/discover-standard). Its 16 contracts are\n the Discover components (`@bundu/ui/discover/*.astro`). \"The Discover Standard\" below says\n what is different.\n\n| File | What it is |\n| ------------------------------------------------- | ---------------------------------------------------------------------------------- |\n| `contracts/schema/component-contract.schema.json` | the format, one for both families |\n| `contracts/app/<name>.contract.json` | one Dashboard Standard component's contract |\n| `contracts/discover/<name>.contract.json` | one Discover Standard component's contract |\n| `contracts/site/<name>.contract.json` | one marketing-site component's contract |\n| `contracts/ui/<name>.contract.json` | one Astro port of a registry primitive (native select, segmented control, …) |\n| `contracts/index.json` | all 77 component contracts with their version and `.astro`, `.tsx`, `.rs` items |\n| `contracts/README.md` | the coverage tables, the recorded gaps, the shared rules, how to change a contract |\n\n**Read the contract before you build or change a `@bundu/ui` component, in any language.** It is\nthe specification: `props` and `slots` (types, required, defaults, closed `values`; the\n`.astro` file's props and slots must be exactly these), `behaviour`, `states` (named fixtures,\n`default` required; every runner renders every state), `accessibility` (roles, keyboard,\nfocus, ARIA, WCAG 2.2 criteria), `density`, `theming`, `noJs`, `responsive`, the `contract`\nblock and `checks` (selector assertions on the rendered markup). `implementations` names the\nAstro export and the `.tsx` and `.rs` siblings, with what they share (`identity`: `slot`,\n`slot+role` or `slot+variants`) and their `divergences`; items under `related` look similar\nand have a different contract, so they are not implementations. `implementations.astro`\ngives the package, the export and `since`: the `@bundu/ui` release that first shipped it, 0.3.0\nfor the original two families (mzizi-registry #419) and 0.6.0 for the components added since\n(money, plan summary, tier status, confirm action, the markdown renderer, and the trust and\naddress primitives).\n`@bundu/ui` is 0.7.0 on npm. `gaps` records where the current build falls short.\n\n**Every new build starts from its contract, library or component** (owner, 2026-10-31). Write or\nchange the contract first, then the builds. A fifth family, `lib/`, holds\ncontracts for non-visual libraries: the N5 resilience primitives (circuit breaker, retry,\nbulkhead, rate limiter, fallback chain, deadline) and the N8 chaos engine, in their own format\n(`schema/lib-contract.schema.json`), each invariant held by a test in the implementing crate\n(mzizi-registry #585, released in v4.18.0).\n\nFour fields are requirements. packages-npm's contract test evaluates the first three on the\nrendered Astro build; the responsive rules are prose. The values below are the Dashboard\nStandard's; the Discover Standard's differ (below):\n\n- **No-JS fallback.** `noJs.script` is `none` (no script) or `enhancement` (one script, and\n everything in `noJs.without` works when it does not run). Only AppShell and CommandPalette\n are `enhancement`; every other app component ships no script.\n- **Density.** Each row gives a part's height in px for a fine pointer and a coarse one\n (touch), read from the rendered classes (`h-N`, `min-h-N`, `size-N` = N×4;\n `pointer-coarse:` for touch). Dashboards are dense on a mouse and 44–48px on touch: the app\n Button is 36px fine (32 `sm`, 40 `lg`) and 48px coarse (44 `sm`), with the small radius,\n and nav rows are 32 / 44. That is the contracts' rule for `@bundu/ui/app`, not the registry\n primitives' 48px floor. A control under 44px on touch is listed in `gaps`, not hidden.\n- **Theming.** A brand overlay changes colour only: `--primary`, `--ring`, AppShell's\n `--app-accent` and the brand mark. Layout never varies by brand. A mineral may be named only\n as one of the component's declared `statusColours`; any other mineral class, or any colour\n value, fails (the `mzizi-design` skill).\n- **Responsive.** Each contract's rules from 320px up.\n\nIn both families the tests also fail **any inline `style` attribute** on a rendered element, so\na page's Content-Security-Policy can keep `style-src 'self'` with no\n`style-src-attr 'unsafe-inline'`: custom properties go through classes or data attributes\n(AppShell's `data-accent`), sizes through classes or SVG geometry (BarChart). JSON-LD\n(`type=\"application/ld+json\"`) is data and does not count as a script.\n\n**How they relate to `CONTRACT` and the language.** The `contract` field is a\n`contract … end` block in the same clause grammar as a Roots `pub const CONTRACT` (RFC-0006\nand RFC-0010), restricted to what applies to rendered markup: subjects `slot`, `role`,\n`label`, `class`, `portal`, `<element> \"<text>\"`, `uses <data-slot>` and `when <state> …`;\npredicates `is`, `contains`, `not_empty`, `in`, `uses \"--token\"`, `min_height` and `shows`. As\nin the language, **a clause, check or density row a runner cannot evaluate fails** (FM-12).\nThe registry's own suites evaluate them: `__tests__/astro/contracts.test.ts` renders every\n`.astro` in every state (Astro's container, no renderer), `__tests__/contracts/\ntsx-contracts.test.tsx` renders every `contract`-identity `.tsx` with the same runner\n(`contracts/runner.ts`), and `__tests__/contracts/contracts.test.tsx` validates every contract\nagainst the schema and the grammar and checks each identity-only sibling. packages-npm's\n`src/app/contracts.test.ts` runs the same contracts again on the built package. A crate's own `CONTRACT`\nand `tests/contract.rs` still run as before.\n\nEvery contract has an `.astro` (`implementations.astro.registry`). The seven app primitives'\n`.tsx` are the registry's own `button`, `badge`, `card`, `alert`, `input`, `label` and\n`skeleton`, which share only their identity (the contract lists the divergences), as do the\n`ui/` family's; every other `.tsx` (`app-*`, `discover-*`, `site-*`) has\n`identity: \"contract\"`, held to the whole contract exactly as the Astro build is. A `.rs`\nexists in `mzizi-ui` for `button`, `badge`, `card`, `input`, `label` and `safe-area-frame`;\nmzizi-registry #401 tracks Rust ports of the rest, done when each passes the contract.\n\n### The Discover Standard\n\nThe 11 Discover Standard list-page contracts in `discover/` and the node each declares (the detail pattern below adds five more). DiscoverShell's `kind` is `shell`;\nthe other ten are `pattern`s.\n\n| Contract | Component | Node | What it is |\n| --------------------------- | --------------- | ---- | --------------------------------------------------------------------------------------------- |\n| `discover/discover-shell` | DiscoverShell | N7 | the frame: skip link, mineral strip, header (brand, \"Main\" nav, one action), `<main>`, footer |\n| `discover/discover-meta` | DiscoverMeta | N6 | the `<head>` tags: title, description, robots, canonical, Open Graph, the X card, JSON-LD |\n| `discover/discover-hero` | DiscoverHero | N6 | breadcrumbs, eyebrow, the page's one `<h1>`, lead, the search box and actions |\n| `discover/discover-search` | DiscoverSearch | N6 | the one search box: a `role=\"search\"` GET form, so every search is a URL |\n| `discover/category-chips` | CategoryChips | N6 | the category links as a named navigation landmark; chips wrap |\n| `discover/category-chip` | CategoryChip | N6 | one category link, with an optional count; a link, never a button |\n| `discover/discover-section` | DiscoverSection | N6 | one band: eyebrow, heading, description and \"See all\" over its content |\n| `discover/result-grid` | ResultGrid | N6 | a polite status line, the cards, the empty state and \"load more\"; `grid`, `list` or `rail` |\n| `discover/discover-card` | DiscoverCard | N6 | one card for every page, variants `article`, `event`, `circle`, `place` |\n| `discover/load-more` | LoadMore | N6 | cursor pagination: one `rel=\"next\"` link to `?cursor=…` |\n| `discover/open-in-app` | OpenInApp | N6 | \"Open in Mukoko\": an https link into the super-app, with one line saying what happens |\n\nSame format, schema, clause grammar and runners as the Dashboard Standard. What the Discover\ncontracts state differently:\n\n- **What it is for.** Public discover and browse pages in the Mukoko family (circles, news,\n events, weather, and the super-app on the web), not admin or operator dashboards. It reuses\n the Dashboard Standard where they overlap: ResultGrid's `empty` slot takes `app/empty-state`\n or `app/state-message`, and `related` names `app/filter-bar` and `app/pagination` as similar\n components with a different contract.\n- **No script at all.** Every Discover contract's `noJs.script` is `none`; there is no\n `enhancement` like AppShell's or CommandPalette's. Views are URLs, not client state: search\n is a GET form (`?q=`, with no `cursor`, so a new search starts at the first page), a category\n is a link, and paging is LoadMore's `rel=\"next\"` link to `?cursor=`.\n- **The same size on every pointer.** In every Discover density row `fine` equals `coarse`:\n 48px for the search field and its button, \"See all\", LoadMore, OpenInApp and DiscoverCard's\n app link; 44px for chips, the navigation links and the home link. Discover pages are not\n dense on a mouse, unlike the Dashboard Standard (most controls 32–40px on a fine pointer).\n- **Theming.** The brand-overlay rule is the same (colour only, no colour values, a mineral\n only as a declared status colour), but there is no AppShell `--app-accent`. A brand shows in\n DiscoverShell's `brand` slot (its mark) and in whatever primary action its `action` slot\n holds; the frame, header, navigation and footer are identical in every brand. `--primary` reaches only\n DiscoverHero's wash (`gradient-showcase`), DiscoverCard's monogram and `brand` badge tone,\n and OpenInApp's `primary` variant. Chips, sections and LoadMore are neutral in every brand,\n and DiscoverSearch follows the brand only in its focus ring (`--ring`). Only DiscoverCard\n declares status colours (`cobalt`, `malachite`, `gold`, `terracotta`), for its badge tones.\n- **Server-filled shells.** Every Discover component also works in an Astro page built once\n with `{{placeholders}}` and filled by a server, as circles.mukoko.com's Rust Worker does:\n text props are plain strings, text that fills to `\"\"` hides itself, and state switches are\n attributes styled by classes (ResultGrid, DiscoverSection and LoadMore `state`, DiscoverCard\n `badgeTone`, CategoryChip `current`). CategoryChip, DiscoverCard, DiscoverHero, LoadMore and\n ResultGrid have a `template` state with placeholders, rendered like every other state.\n DiscoverCard and CategoryChip render their own `<li>`, so they repeat as fragments.\n- **One card.** DiscoverCard's `variant` changes emphasis, never structure. Its title is the\n one primary link, stretched over the card; other actions stay separately focusable.\n- **OpenInApp's `href` is https** (a universal link or a server redirect), never a bare\n `mukoko://` link, which does nothing without the app.\n- **No siblings and no gaps yet.** No `.tsx` or `.rs` implements a Discover contract, and none\n records `gaps`. A React or Rust port is done when it passes the same contract.\n\n**Upstream first** (registry `CONTRIBUTING.md`, from #415, for both families): a component an\napp needs that Mzizi does not have, or a change to one it has, goes upstream immediately: its\ncontract in the registry, its build in `@bundu/ui` and its page on docs.mzizi.dev. An app keeps\na local copy only while that upstream pull request is open, marked at the top of the file with\n`TODO(mzizi): <upstream PR URL>`.\n\n### Changing a contract\n\n1. Edit `contracts/<family>/<name>.contract.json` in the registry and bump its `version`:\n major when a clause, prop, slot or state is removed or narrowed, minor when one is added,\n patch for prose. A new family also needs its directory in `FAMILIES` in\n `__tests__/contracts/contracts.test.tsx` and in packages-npm's `scripts/contract-paths.mjs`.\n2. Update `contracts/index.json` and the README's coverage table for that family. The test\n fails if either disagrees.\n3. Run `pnpm test` in the registry, then `pnpm contracts:fetch <branch>` and `pnpm test` in\n packages-npm. The Astro build must pass the new contract before either side merges. Never\n edit the copy in packages-npm.\n\n**The detail pattern** (mzizi-registry #429; docs.mzizi.dev/patterns/discover-detail): the\npage for one item reached from a discover page uses five more `discover/` contracts, each an\n`.astro` and a `.tsx`: `detail-hero` (the page's only `<h1>`, when/where, lead, image or media\nslot), `breadcrumb` (named `<nav>`, `aria-current=\"page\"`, BreadcrumbList JSON-LD), `meta-list`\n(a `<dl>` of facts), `detail-actions` (Open in Mukoko first, then secondary and share links; no\nscript) and `related-rail` (DiscoverCards; a scroll-snap row on phones, a grid from 48rem;\nhidden when empty).\n\n**Open in Mukoko** is one canonical https universal link, `mukoko.com/open/<service>/<id>`\n(`openInMukokoUrl` in `discover-open-link.ts`; `@bundu/ui/discover/open`). `open-in-app` 1.1.0\nand `detail-actions` take `service` (`news`, `events`, `weather`, `circles`) and `id`; `href` is\nonly an override. The apps claim `mukoko.com/open/*` as universal and app links; on the web a\nresolver (mukoko-dev/super-app-web `/open/*`) sends the reader to the service's page. Never a\nbare `mukoko://` link.\n\n## Reuse before build\n\n**The simplest change is the one you don't write.** Reuse before you build, compose before you\nimplement, and let one source own each decision. Use this before adding a component, a style or\na page, and during any refactor.\n\n1. **Reuse before build.** Search the registry first: `mzizi_search` or\n `mzizi_list_components` over the MCP (`https://mcp.mzizi.dev/mcp`, free), or\n `GET https://api.mzizi.dev/v1/ui`. Where a Rust implementation exists, depend on its crate\n (`cargo add mzizi-roots`). For the React build, install with\n `mzizi add <name>` or `npx shadcn@latest add https://api.mzizi.dev/v1/ui/<name>`. Never\n reimplement a primitive that already exists.\n2. **Styles are tokens.** Never hardcode a colour, radius, spacing, or motion value —\n consume `var(--…)` (or the `mzizi-tokens` consts in Rust). N1 is the only layer allowed to\n define values, so a rebrand is one edit. A new colour goes in the registry's\n `lib/tokens/palette.source.ts`, and `pnpm tokens:sync` regenerates `styles/globals.css`, the Rust\n tokens and the other emitters from it.\n3. **Compose, don't implement.** A page (N6) is a composition of N2 primitives and N3 brand\n components — never inline a `<button>`, a card, or an SVG. Pull spinners, skeletons, and\n badges from N2.\n4. **Variants over copies.** Collapse near-duplicate components into one variant table: an\n enum with a `match` in Rust, an `enum` table in Mzizi source, one `cva()` in the React\n build. Express differences as `variant` / `size` props, not new files.\n5. **One composition path.** In the React build, compose class names through `cn()` and\n extract shared logic into `lib/` or a hook. In Rust, a pure function beside the component.\n No logic duplicated across files.\n6. **Right altitude.** Keep each component self-contained, importing only from the layer\n below on its strand. A primitive that reaches up into page code can't be installed on its\n own.\n7. **Delete first.** Prefer removing over adding — dead code, unused props, redundant\n wrappers, commented-out blocks. Less code is less to break, read, and keep true.\n8. **Live data, not copies.** Read counts, tokens and doctrine from their source\n (`https://api.mzizi.dev/v1/stats`, `palette.canonical.json`, `mzizi_get_tokens`,\n `mzizi_get_doctrine`). A baked-in number or duplicated token guarantees drift.\n\n### Checklist\n\n- [ ] Searched the registry before building, and used the Rust build where one exists?\n- [ ] All styles are tokens (`var(--…)`), zero hardcoded values outside N1?\n- [ ] Page is pure composition of N2/N3, no inlined primitives?\n- [ ] Variation expressed as one variant table, not near-duplicate files?\n- [ ] One composition path, shared logic extracted once?\n- [ ] Each file self-contained and installable, importing only downward?\n- [ ] Deleted more than you added where you could?\n- [ ] Counts, tokens, and doctrine read live, not hardcoded?\n\n## Contributing a component\n\n**A component is a real file.** `components/registry/n<N>-<label>/<name>.rs` (Rust, compiled by\nthe node's crate in `mzizi-rs/`) and, for the React build, `<name>.tsx` beside it, which\n`pnpm typecheck` (`tsc --noEmit`) and `pnpm lint` check. An error in either fails CI. The\nregistry has no app to build: CI's `Rust` job runs `cargo fmt`, `check`, `clippy` and the\ncontract tests, and its `Build` job runs `pnpm build`, which runs every generator in write mode\nand fails if that changes a committed file.\n\n| File | What it is |\n| --------------------------------------------- | ----------------------------------------------------------------- |\n| `components/registry/n<N>-<label>/<name>.rs` | the Roots component (Dioxus UI, or a sans-IO server core) |\n| `components/registry/n<N>-<label>/<name>.tsx` | the React build of the same contract |\n| `registry.json` | the manifest `/v1/ui/<name>` and `npx shadcn add` resolve against |\n\n`registry.json` carries the install contract (description, dependencies,\n`registryDependencies`, target paths) and **never the source**. The node is derived from the\ndirectory the component lives in, so it cannot disagree with where the file is.\n\n**There is no database.** The registry's files are its data layer (mzizi-registry PR #368), and\na test fails the build if a Supabase import or a `SUPABASE_*` read comes back. Nothing about a\ncomponent, including its source, status or history, is written to a table. If you find\ninstructions anywhere telling you to `INSERT` a component or read a `component_documents` row,\nthey are stale.\n\n### Step 1 — Decide the node\n\nThe architecture is the **Mzizi DNA double helix**: eight nodes (N1–N8) on the engineering\nbackbone, four rungs (N9–N12) that bridge both backbones, and six strands. The N-numbers are\n**labels, not a sequence**.\n\nThe node decides the **directory**, the directory decides the **crate** that compiles the Rust\n(`mzizi-rs/crate-for-node.json`), and the directory is what the build reads. Choosing the node\nand choosing where the file goes are the same decision.\n\n| Node | Directory | Crate | What belongs there |\n| ----------------- | -------------------- | ----------------- | --------------------------------------------------------------------------- |\n| N1 tokens | `n1-tokens/` | `mzizi-tokens` | A token value or emitter (colour, spacing, motion, radius), not a component |\n| N2 primitive | `n2-primitives/` | `mzizi-ui` | Generic UI: button, card, input, dialog, toolbar, bento-grid |\n| N3 brand | `n3-brand/` | `mzizi-brand` | A branded composition with the mineral palette |\n| N4 safety | `n4-safety/` | none yet | A conditional-rendering gate: permission, geo, rate limit |\n| N5 resilience | `n5-resilience/` | none yet | Error boundary, skeleton, offline banner, fallback chain |\n| N6 pages | `n6-pages/` | none yet | Full-screen layout composition |\n| N7 shell | `n7-shell/` | `mzizi-shell` | App container: navigation, routing, lifecycle |\n| N8 assurance | `n8-assurance/` | `mzizi-assurance` | Instrumentation, a11y audit, RTL conformity, probes |\n| N9 fundi | `n9-fundi/` | `mzizi-fundi` | Automated healing (a rung) |\n| N10 documentation | `n10-documentation/` | `mzizi-docs` | Docs, AI instructions, docs infrastructure (a rung) |\n| N11 discovery | `n11-discovery/` | `mzizi-discovery` | SEO / AIO surfaces: if the machine can't see it, it doesn't exist (a rung) |\n| N12 skills | none in the registry | none | Agent skills (a rung), authored in `mzizi-dev/agent-tools/mzizi-skills/` |\n\nA node with no crate yet (N4, N5, N6) takes a `.tsx` today. Adding its first `.rs` means adding\nits crate and its `crate-for-node.json` entry in the same pull request; `pnpm rust:generate`\nrefuses Rust that no crate claims.\n\nIf you are unsure where something belongs, ask the MCP (`https://mcp.mzizi.dev/mcp`, free, no\naccount): `mzizi_list_components` with `node: N` shows what already lives in a node, and\n`mzizi_get_architecture` returns the node, rung and strand model with live counts. Never\nhardcode counts.\n\n### Step 2 — Write the file\n\nCreate it in the directory the node names:\n\n```\ncomponents/registry/n3-brand/mzizi-your-component.rs # the Roots component\ncomponents/registry/n3-brand/mzizi-your-component.tsx # the React build, same contract\n```\n\nThe Rust file carries `pub const CONTRACT: &str` and follows the rules in \"Using a UI component\" above: variants as enums, tokens by reference, browser facilities as props, icons as slots,\nno helpers shared between components. `.ts` is for a non-rendering module.\n\nThat is the authoring step. There is no row to insert and no registration to perform before\nwriting code: the file _is_ the component, and `cargo test` (for the `.rs`), `pnpm typecheck`\nand `pnpm lint` (for the `.tsx`) and `pnpm build` (every derived artifact regenerated, with no\ndiff) are what tell you it is real.\n\nNaming: N3 brand components take a `mzizi-` prefix. (Components formerly named `nyuchi-*` are\n`mzizi-*`, and the old names redirect.) Everything else is the bare name, matching what a\nconsumer will type in `mzizi add` or `npx shadcn add`.\n\n### Wiring the Rust into its crate\n\n`pnpm rust:generate` writes the committed copy to `mzizi-rs/crates/<crate>/src/generated/`. Add\nthe `#[path = \"generated/<name>.rs\"] pub mod <name_snake>;` line and the `pub use` to the\ncrate's `src/lib.rs` by hand, and add the component to the crate's `tests/contract.rs`. Edit\nthe registry file, never the copy. The workspace lints forbid `unsafe_code` and warn on\n`missing_docs`; clippy turns the warning into a failure. Cap parallel builds on a small machine\n(`CARGO_BUILD_JOBS=2`).\n\nA release is a version bump in `mzizi-rs/Cargo.toml`. On merge to `main`,\n`.github/workflows/publish-crates.yml` re-runs the Rust gate and publishes each crate in\ndependency order, skipping any version already on crates.io. A published crate name is\npermanent. Say in the PR body that components changed, so the site, docs and skills are\nupdated to match.\n\n### Step 3 — Declare it in `registry.json`\n\nOne item, carrying the install contract. `meta` is the part you author; four other fields are\n**derived from it** and must not be hand-written.\n\n```jsonc\n{\n \"name\": \"your-component-name\",\n \"type\": \"registry:ui\",\n \"description\": \"Short description of what it does.\",\n \"dependencies\": [],\n \"registryDependencies\": [],\n \"files\": [\n {\n \"path\": \"components/registry/n2-primitives/your-component-name.tsx\",\n \"target\": \"components/ui/your-component-name.tsx\",\n \"type\": \"registry:ui\"\n }\n ],\n \"meta\": {\n \"collection\": \"primitives\",\n \"owner\": \"mzizi\",\n \"useCases\": [\"Use case 1\", \"Use case 2\"],\n \"variants\": [\"default\", \"sm\", \"lg\"],\n \"sizes\": [\"default\", \"sm\", \"lg\"],\n \"features\": [\"cn() for className composition\", \"data-slot attribute\"],\n \"a11y\": [\"ARIA attributes\", \"Keyboard accessible\"],\n \"hasDemo\": true\n }\n}\n```\n\n`files[]` lists the `.tsx`: it is the shadcn install contract for the React build. The `.rs`\nbeside it is not listed; the node's crate compiles it, and `/v1/rs/<name>` serves it with the\ncrate's name.\n\n**Do not write `title`, `categories`, `docs` or `author`.** `pnpm registry:metadata` derives all\nfour from `meta` and the repo. `docs` in particular is what the shadcn CLI prints _after_\ninstalling, so it is generated from your `useCases` / `variants` / `sizes` / `features` / `a11y`\nrather than duplicated by hand — and an item with no `meta` deliberately gets no `docs`, because\na stub reads as documentation and says nothing.\n\nThen run the generators and let the gates check you:\n\n```bash\npnpm registry:paths # fill file paths from what is on disk\npnpm registry:metadata # derive title, categories, docs, author\npnpm registry:normalize # canonical ordering\npnpm registry:validate # every item resolves on disk; every dependency addressable\npnpm registry:verify # the CI drift gate\npnpm typecheck && pnpm lint && pnpm build # build: every generator; commit what it writes\n```\n\nFollow the criteria for the chosen node.\n\n#### Every node: the Rust file\n\n- `pub const CONTRACT: &str` with the clauses the rendered markup must meet (slot, role, touch\n floors, variant tables), evaluated by the crate's `tests/contract.rs` on `dioxus-ssr` output\n- The same `data-slot`, `data-portal` and variant values as the `.tsx`, asserted by the same\n suite; a deliberate divergence is asserted from both sides\n- `prefers_reduced_motion: bool` as a prop where the `.tsx` reads the harness's motion\n- Icons as `Element` slots, not an icon crate\n- Doc comments on every public item (`missing_docs` is a warning, and clippy runs with\n `-D warnings`); no `unsafe`\n\n#### N2 primitive checklist\n\n- No `useMziziHarness` import in the `.tsx`\n- `data-slot` attribute on the root element\n- `data-portal` attribute pointing at `https://mzizi.dev/components/<name>`\n- `cn()` for className composition in the `.tsx`\n- No raw Tailwind colours: use semantic tokens (`bg-primary`, `text-foreground`, …)\n- Icons from `@/lib/icons` in the `.tsx`, never `lucide-react` directly\n- **Touch targets never go below 48px.** Buttons and inputs are `h-14` (56px) default and\n `h-12` (48px) small, as `button.tsx`, `button.rs` and `primitives/button.mz` all state, and\n `/v1/brand` `.componentSpecs` serves (`minTouchTarget: 48`). A smaller visual box, such as a\n badge, is not a touch target; if it becomes one, give it `min-h-[48px]`.\n- Pill-shaped categories (button, input, avatar, badge, toggle) use `rounded-full`\n\n#### N3 brand checklist\n\n- `mzizi-` prefix on the name\n- `useMziziHarness(\"<name>\")` in the `.tsx` for the motion preference (and `log` or\n `LiveRegion` where the component uses them); `prefers_reduced_motion` as a prop in the `.rs`\n- The entrance animation off when motion is reduced\n- An ARIA role or `aria-label`, and a region that is named in every state, the loading\n skeleton included\n- `data-slot` and `data-portal` attributes, in every state\n- `focus-visible` ring on interactive elements, and interactive elements at the 48px floor\n- I18N via `Intl` formatters for dates, numbers and currency\n- Semantic tokens for status-bearing colours\n\n#### N6 page checklist\n\n- Pure composition: no inline buttons, cards or SVGs\n- Accept children/slots for content\n- Semantic CSS vars only (`bg-card`, `text-foreground`, `bg-primary`)\n- A loading-state prop\n- `role=\"main\"` and an `aria-label`\n\n#### N8 assurance checklist\n\n- A sans-IO Rust core (typed input, typed result, every facility behind a trait) in\n `mzizi-assurance`, with the `.ts` module as the React build\n- A banner comment identifying the node and purpose\n- A configurable rules array\n- Optional `onViolation` / `onComplete` callbacks\n\n### Step 4 — Docs and demos\n\nThere is nothing extra to write. Docs come from the `meta` you already authored in Step 3\n(`useCases`, `variants`, `sizes`, `features`, `a11y`), and `pnpm registry:metadata` turns them\ninto the `docs` string the CLI prints after install. Set `meta.hasDemo` when a demo exists.\n\nIf a prop table is expected, `pnpm props:extract` derives it from the component's own types and\n`pnpm props:verify` is the gate. Props are read from the code, never restated beside it.\n\n### Step 5 — Versions and history\n\nThere is no status row and no database. A component's version history is the registry's\nchangelog (`content/changelog/`, generated, checked by `pnpm changelog:generate:check`) and the\nrename map. `mzizi_get_component` with `include: [\"versions\"]` returns it. Read what a component\nis through the MCP or `https://api.mzizi.dev/v1/ui/<name>` rather than assuming.\n\n### Step 6 — Validate accessibility\n\nIf your component introduces a new colour pair, validate it before shipping. The MCP tool is\ncomputed locally and needs no account:\n\n```\nmzizi_check_accessibility(foreground: \"#FFFFFF\", background: \"#0047AB\")\n```\n\nIt returns the WCAG 2.1 contrast ratio with AA/AAA verdicts and whether the pair clears the\nMzizi floor (APCA and AAA).\n\n### Step 7 — Before you open the PR\n\n`pnpm check` runs every registry gate CI runs, in order, including `registry:validate`,\n`registry:verify`, `tokens:verify`, `changelog:generate:check`, `rust:generate:check`, the\ntests and the build. Then the Rust workspace gate:\n\n```bash\npnpm check\ncargo fmt --manifest-path mzizi-rs/Cargo.toml --all -- --check\ncargo clippy --manifest-path mzizi-rs/Cargo.toml --workspace --all-targets -- -D warnings\ncargo test --manifest-path mzizi-rs/Cargo.toml --workspace\ncargo package --manifest-path mzizi-rs/Cargo.toml --workspace\n```\n\nIf you touched `files[]` or `meta`, run `pnpm registry:paths`, `pnpm registry:metadata` and\n`pnpm registry:normalize` first; their `--check` twins fail otherwise.\n\nA green run means the item resolves to real files, every dependency is addressable, the derived\nfields match `meta`, the Rust compiles, and its contract holds on rendered markup. Say in the PR\nbody that a component changed, so the site, the docs and the skills are updated to match.\n\n### What to avoid\n\n- **Never put component source in a database row, a JSON document, or any second place.** The\n file under `components/registry/` is the component; everything else is a representation of\n it, and a representation can drift from the code while still looking correct. That is not\n hypothetical here: a `source_code` column once served stale copies for 571 components.\n- Never edit `mzizi-rs/crates/*/src/generated/`. It is overwritten by `pnpm rust:generate`.\n- Never hand-write `title`, `categories`, `docs` or `author` in `registry.json`. They are\n derived, and a hand-written value is a second source that the next generator run silently\n overwrites.\n- Never hardcode hex colour values (except documented third-party brands like Ethereum,\n Google, EcoCash).\n- Never use `lucide-react` directly in a `.tsx`; go through `@/lib/icons`.\n- Never use `margin-left` / `padding-right` / `left`; use logical properties\n (`margin-inline-start`, …) for RTL support.\n- Never start new work in the React build alone. If a component has a Rust implementation,\n change the Rust and keep the `.tsx` in step.\n- Never bump a major version on your own initiative. That is a maintainers' call.\n\n## The React build\n\n`npx shadcn@latest add https://api.mzizi.dev/v1/ui/<name>` installs the `.tsx` for an existing\nReact app, for all 577 items. Always pass the absolute URL: a bare name resolves against\nshadcn's own registry and installs a different component. `mzizi add <name>` installs the React\nbuild too. Neither is where new work goes.\n\n## See also\n\n- `docs/roots/RFC-roots.md` in the registry: the inventory, the conversion batches and what\n the API and site still need for Rust-first serving (`/v1/roots` is proposed, not live).\n- The `mzizi-language` skill for the clause grammar and `mz contract`.\n- The `mzizi-design` skill for the palette, radius, type and the Ubuntu constraints.\n- The `mzizi-backend` skill for mounting a server core on Workers.",
25
+ "source": "mzizi-dev/agent-tools/mzizi-skills/skills/mzizi-roots",
26
+ "files": []
21
27
  },
22
28
  {
23
29
  "name": "mzizi-design",
24
- "description": "The Mzizi design system and brand: the canonical 21-family palette (seven African Minerals + seven Heritage tones + the Experimental Seven) with generated stylesheets (tokens/palette.css, tokens/minerals.css, tokens-update.css), the radius scale, Noto Sans/Serif + JetBrains Mono type, pill buttons and the 48px touch floor, status and surface tokens, the Dashboard and Discover Standards' brand overlays (colour and mark only), the verified brand constellation (Mzizi's own colour is hematite, a Heritage tone), the ecosystem identity (copper), the five Ubuntu pillars + five principles, what belongs in the ecosystem, and the wordmarks. Replaces nyuchi-design and half of ecosystem-app-setup, and carries the tokens that were in mukoko-design.",
25
- "body_mdx": "# Mzizi design — the system and the ecosystem\n\nThis skill replaces three 0.7.0 skills: `nyuchi-design` (UI and tokens, now \"The design\nsystem\" below), the Ubuntu and ownership half of `ecosystem-app-setup` (now \"What belongs in\nthe ecosystem\"), and the tokens of `mukoko-design`, which moved here. The mukoko brand assets\n(the Swarm mark, logos, icons) are no longer in this package; they move to a Nyuchi-owned\nbundle.\n\n## Files this skill ships\n\nAll generated from `palette.canonical.json` at the package root by\n`scripts/generate-tokens.mjs`, and gated against it. Never hand-edit them; never retype a hex.\n\n| File | Contents |\n| ---------------------- | ---------------------------------------------------------------------------------------------------- |\n| `tokens/palette.css` | all 21 families, light + dark, as CSS custom properties |\n| `tokens/palette.json` | all 21 families, machine-readable |\n| `tokens/minerals.css` | the seven minerals only |\n| `tokens/minerals.json` | the seven minerals only, machine-readable |\n| `tokens-update.css` | all 21 families (light, dark, `.dark`, `prefers-color-scheme`) plus the radius scale, as one drop-in |\n\n## The ecosystem\n\n**Mzizi** is the parent identity at the ecosystem level — the Mzizi programming language, its\ntoolchain, the design language, the component registry and the open doctrine every brand builds\non. Everything revenue-generating (the\nMzizi console, fundi, paid plans, billing) is Nyuchi's. Three pillars: **mukoko** (consumer super app), **nyuchi** (infrastructure &\nenterprise), and the **sister brands** (specialist verticals) — one identity, one design system, one\nopen data commons.\n\nDoctrine **v4.1.0**. **The repo is the source of truth, and there is no database.** Colour\ncomes from `palette.canonical.json` at the root of this package — 21 families, vendored from\n`mzizi-dev/mzizi-registry → lib/tokens/palette.source.ts` and gated against it. The ecosystem\nconstellation and the Ubuntu pillars and principles come from `mzizi-registry →\ncontent/doctrine/`, served at <https://api.mzizi.dev/v1/brand> (`.ecosystem`, `.philosophy`) and\nby the MCP as `mzizi_get_tokens` (`family: \"ecosystem\"`) and `mzizi_get_doctrine`. Two notes:\nprinciples were renamed in v4.x, so use the set below and not older Shona-named lists; and the\nregistry still names its ecosystem-layer entry `bundu` (URL **bundu.org**). That is registry\ndata, and it changes in mzizi-registry, not here.\n\nThe **five** pillars and **five** principles below are a count of Ubuntu doctrine, not of the\npalette, and they are correct — `/v1/brand` `.philosophy.ubuntuPillars` serves exactly these five.\nDo not \"fix\" them to seven to match the colour families.\n\n### The ecosystem-level identity\n\n- **Mineral:** `copper` — `#BF5A36` light / `#FF8A65` dark (`--color-copper`) · connection, foundation, stewardship\n- **Registry entry:** `bundu` in `/v1/brand` `.ecosystem` (meaning _wilderness_, Shona) · **URL:** <https://bundu.org>\n- **Voice:** visionary, grounded, inclusive\n- **Role:** the ecosystem — the layer that holds the whole, the commons, governance, philosophy\n- **Wordmark:** `Mzizi`, capitalised, Noto Serif 600. (The other wordmarks stay lowercase.)\n- **No standalone ecosystem-level logo mark is registered in the registry yet** — that's an open identity\n item. Until one exists, ecosystem-level materials use the wordmark in copper, optionally with\n Mukoko's Swarm mark (a Nyuchi asset, not in this package) when the subject is the product family. Don't invent an ecosystem mark ad hoc.\n- **Copper is the ecosystem layer, not Mzizi's own surfaces.** mzizi.dev, docs.mzizi.dev, the\n registry and the language are the `mzizi` row of the constellation below: theme them in\n **hematite** (owner decision, 2026-09-30). Keep copper for material where the ecosystem as a\n whole speaks: governance, the commons, the manifesto register.\n\n### The brand constellation (verified, v4.1.0)\n\nEvery brand owns a mineral and a voice. Theme each brand's surfaces and copy in **its own** mineral\nand register — never default everything to tanzanite.\n\n| Brand | Role | Mineral | Meaning | Voice |\n| ------------ | ------------------------------------------- | ---------- | ---------- | -------------------------------------- |\n| **bundu** | The ecosystem | copper | Wilderness | visionary, grounded, inclusive |\n| **nyuchi** | Infrastructure & enterprise | gold | Bee | technical, reliable, industrious |\n| **mukoko** | Africa's super app | tanzanite | Beehive | welcoming, structured, protective |\n| **shamwari** | Sovereign AI companion | sodalite | Friend | helpful, warm, intelligent |\n| **Mzizi** | The root: language, registry, design system | hematite ¹ | Root | precise, honest, grounded |\n| events | Events & gatherings (Mukoko Events) | malachite | Gathering | celebratory, communal, vibrant |\n| bushtrade | Marketplace | gold | Bush trade | practical, trustworthy, local |\n| lingo | Language learning | cobalt | Language | encouraging, cultural, playful |\n| campfire | Platform messaging anchor | malachite | Campfire | direct, warm, always present |\n| bytes | Short-form creator video | tanzanite | Bytes | energetic, creative, youthful |\n| novels | Publishing platform | malachite | Novels | literary, thoughtful, immersive |\n| places | Geographic knowledge graph | gold | Places | authoritative, helpful, discoverable |\n| transport | Public transit & booking | gold | Transport | efficient, reliable, practical |\n| planner | Productivity hub | cobalt | Planner | organised, clear, supportive |\n| wallet | Payments & tokens | gold | Wallet | trustworthy, precise, secure |\n| pulse | Feed & Mukoko Home | tanzanite | Pulse | personal, adaptive, ambient |\n| health | Wellness & telemedicine | malachite | Health | caring, accurate, private |\n| circles | Community messaging | terracotta | Circles | inclusive, moderated, community-driven |\n| kweli | Trust and verification | malachite | Truth | honest, rigorous, reassuring |\n| learning | Education (Nyuchi Learning) | gold | Learning | patient, practical, encouraging |\n| news | News and journalism | cobalt | News | clear, credible, balanced |\n| weather | Weather and alerts | cobalt | Weather | calm, precise, timely |\n\nThe `bundu` row is the ecosystem layer as `/v1/brand` serves it today; the table mirrors the\nregistry, so it changes when mzizi-registry renames the entry. The last four rows joined canon\non 2026-10-04 (owner decisions, mzizi-registry #409): kweli is malachite (it used to borrow\nMukoko's tanzanite), news and weather are cobalt, and **learning is gold** because every Nyuchi\nbrand is gold. The education industry category follows it: education is gold, not cobalt.\n\nThe `events` row is **Mukoko Events**, at `events.mukoko.com` (owner decision,\n2026-10-04). The _nhimbe_ brand is retired. `nhimbe` survives only as a deprecated alias of\n`events`: canon still resolves it, and `brand-nhimbe.css` re-exports `brand-events.css`, so\nnothing that names it breaks. New work names `events` and writes \"Mukoko Events\" in copy. The\nmineral is unchanged: malachite.\n\n¹ **Mzizi's brand colour is hematite, and hematite is a Heritage tone, not one of the seven\nminerals** (owner decision, 2026-09-30). `/v1/brand` serves it in `.ecosystem` as\n`{\"name\": \"mzizi\", \"meaning\": \"Root\", \"language\": \"Swahili\", \"mineral\": \"hematite\"}` and lists\nhematite under `.heritage`, not `.minerals`: the field is called `mineral`, but it names a\npalette family, usually a mineral. Mzizi owns and operates the language, the registry, the design\nsystem, the docs and the API; `/v1/brand` gives its role as \"Language, registry and design\nsystem\", and its voice as \"Precise, honest, grounded\". A Mzizi surface takes its primary from\nhematite, as the shipped stylesheets do: `@bundu/ui`'s `brand-mzizi.css` (which mzizi.dev uses)\nsets `--primary` to `var(--color-hematite)`, and the registry's `mzizi-tokens-globals.css`\ndefaults `--primary` to `var(--heritage-hematite-aa)`. Not gold (nyuchi's), not tanzanite (mukoko's), not copper (the\necosystem layer's). Take the values from `palette.canonical.json` (`hematite`, Heritage).\n\nThe narrative spine: **nyuchi is the bee, mukoko is the hive, Mzizi is the root everything\ngrows from.** Use this when explaining the ecosystem — it is the one-sentence architecture.\n\n### Ubuntu as identity (live doctrine)\n\nMzizi carries the philosophy. _Ndiri nekuti tiri_ — I am because we are.\n\n**Five Pillars** (spheres of belonging): **family** (the household and kin, the primary web of\nbelonging) → **community** (neighbours, peers, chosen kin) → **society** (the broader human web —\nstrangers, institutions, the polity) → **environment** (the natural world that holds all\nrelationships; Ubuntu is ecological before it is social) → **spirituality** (the vertical\ndimension — meaning, purpose, ancestry, the sacred).\n\n**Five Principles** (operating rules): **survival** (collective endurance — no one survives alone) ·\n**solidarity** (firm, persevering commitment to the common good) · **compassion** (active care shown\nthrough helping, sharing, welcoming) · **respect** (unprejudiced consideration of another's\nprivileges, beliefs, norms — includes elder-respect) · **dignity** (inherent worth by virtue of\nexistence, irrespective of status or background).\n\nIn ecosystem materials, philosophy is **structural, not decorative**: name a pillar/principle only\nwhen the feature or message genuinely embodies it.\n\n### Rules for ecosystem-level work\n\n- **Wordmarks:** `Mzizi` is capitalised. Every other wordmark is lowercase: `nyuchi`, `mukoko`,\n `shamwari`, `bundu` and every sister brand.\n- **Copper accents** signal \"this is the ecosystem speaking\" (parent-level pages, governance,\n commons, manifesto-register material).\n- **Cross-brand layouts:** lead with the brand that owns the message; bring in the constellation\n table's minerals when showing the family together (each brand in its own mineral).\n- **Voice shifts with the speaker.** An ecosystem-level page is visionary/grounded/inclusive; the same content\n on mukoko.com becomes welcoming/structured/protective. Don't copy-paste tone across brands.\n- Cultural specificity is non-negotiable: Shona vocabulary and Zimbabwean grounding are structural.\n- All UI tokens (radius, type, spacing, surfaces, status colours) are under \"The design system\"\n below. Mukoko's logo and assets are Nyuchi's and are not in this package.\n- **Every brand owns a mineral, but the palette is not only minerals.** A cross-brand piece has 21\n families to draw on — seven minerals, seven Heritage tones, the Experimental Seven. Use the\n minerals to say _who is speaking_ (and hematite when Mzizi is); use Heritage for atmosphere and surface, and the Experimental\n Seven for categorical sets that would otherwise stretch a mineral past its meaning.\n\n## The design system\n\n> **Doctrine v4.1.0. The canonical palette ships with this package.**\n> `palette.canonical.json` at the root of `@nyuchi/mzizi-skills` states all **21 colour\n> families** — seven African Minerals, seven Heritage tones, the Experimental Seven — and\n> every token file in this bundle is generated from it and gated against it. Read it, or the\n> stylesheets generated from it (`tokens-update.css` and `tokens/palette.css` here). Do not retype hex values out of this prose into a project.\n>\n> Canon upstream is `mzizi-dev/mzizi-registry → lib/tokens/palette.source.ts`, served publicly\n> at <https://api.mzizi.dev/v1/brand> and by the MCP as `mzizi_get_tokens`. There is no\n> database: the registry's files are the data layer.\n>\n> **Colour is derived and gated. Everything else on this page is hand-maintained** —\n> typography, spacing, radius, sizes, motion, shadow, z-index and the semantic set. The\n> radius scale and control sizes were checked against `mzizi-registry` `main` for 0.8.0;\n> confirm the rest with `mzizi_get_tokens` (`typography`, `spacing`, `radii`, `semantic`,\n> `componentSpecs`) if precision matters.\n\n**The published design system.** The brand book, the tokens as data, the marks and static\npreviews of the components (Badge, Button, Card, Checkbox, Input, StatusBadge, Switch, Tabs and\nmore) are published as the Design System artifact at\n<https://claude.ai/artifact/G8CCtAbZ8w717uQ3R5itCc>. Its source of truth is the `design-system/`\nfolder in `mzizi-dev/mzizi-registry` (arriving with mzizi-registry#418), which the artifact is\nbuilt from file for file. To change the design system, change that folder, never the artifact\npage: the artifact is republished from registry `main` after a merge that touches it.\n\n### Rules that are non-negotiable\n\n- **Wordmarks** — `Mzizi` is capitalised. `mukoko`, `nyuchi`, `bundu`, `shamwari`, `bushtrade` are lowercase, always. (Product names such as Mukoko Events are written as names, not wordmarks.)\n- **The palette is 21 families: seven Minerals + seven Heritage + the Experimental Seven.** Any interface that uses only the minerals is using a third of the system. Do not describe it as \"the seven-colour palette\".\n- **Seven African Minerals** (geological, the core palette). The custom properties are `--color-<mineral>`, `--color-<mineral>-container`, `--color-<mineral>-on-container` — those are the names the design system defines. (`--container-<mineral>` / `--on-container-<mineral>` appeared in earlier revisions of this skill and are defined nowhere upstream; `tokens-update.css` now ships them as aliases so existing work keeps rendering, but do not reach for them in new code.)\n - `cobalt` — primary blue, links, CTAs · digital future, trust\n - `tanzanite` — **mukoko's brand mineral**, social features · premium, connection\n - `malachite` — success states, positive actions · growth\n - `gold` — achievements, rewards, highlights · honey, warmth\n - `terracotta` — community features · earth, grounding\n - `sodalite` — **AI / Shamwari surfaces, deep-reasoning states** · intelligence, depth _(added v4.1.0)_\n - `copper` — **Bundu ecosystem identity, the commons** · connection, stewardship _(added v4.1.0)_\n- **Seven Heritage tones** (atmospheric anchors — mini-app surfaces, backgrounds, moods; no family or role, with one exception: `hematite` is Mzizi's brand colour): `indigo` (dusk, the dyer's craft) · `savanna` (sun-dried grass, the dry season) · `baobab` (the tree of life, bark, shelter) · `sunset` (day's end, the gathering hour) · `river` (flow, the journey) · `hematite` (the neutral anchor, the substrate) · `kalahari` (the light anchor, openness). Reach for them via `--color-<name>` (aliasing `--heritage-<name>`); values are in `palette.canonical.json`. _(Two earlier framings are withdrawn: the ten-colour one from before the palette settled, and the two-anchor one that survived into v0.5.1 of this bundle. **There are seven.** A skill that named two produced two-tone output in projects that had never seen each other.)_\n- **The Experimental Seven** — a computed heptagon (hues offset 17°, prime saturations, foregrounds solved to P7), each tone carrying a `heptagonIndex` 0–6 that fixes its place on the wheel: `ember` · `acacia` · `fern` · `lagoon` · `storm` · `dusk` · `protea`. Four tiers each: `--exp-<name>`, `--exp-<name>-container`, `--exp-<name>-on`, `--exp-<name>-ui`. Use them for generated/wheel-derived surfaces and categorical sets where the minerals would have to be stretched past their meanings.\n- **Each brand owns a mineral** (the ecosystem map, verified v4.1.0 and served at `/v1/brand` as `.ecosystem`): bundu→**copper**, nyuchi→**gold**, mukoko→**tanzanite**, shamwari→**sodalite**, Mzizi→**hematite** (a Heritage tone, not a mineral: the one brand whose colour comes from the Heritage set), events (Mukoko Events)/campfire/novels/health/kweli→malachite, lingo/planner/news/weather→cobalt, bushtrade/places/transport/wallet/learning→gold (learning, and with it the education category, is gold because every Nyuchi brand is), bytes/pulse→tanzanite, circles→terracotta. Theme a surface in its brand's colour — never default everything to tanzanite, and never give a Mzizi surface gold, tanzanite or copper as its primary.\n- **Buttons are ALWAYS pill** (`rounded-full` → `--radius-full`, 9999px). Inputs match buttons visually. The exception is the Mzizi Dashboard Standard (below): its app Button and controls use the small radius, as their contracts state.\n- **Nothing tappable goes below 48px.** Buttons are `h-14` (56px) default and large, `h-12` (48px) small; icon buttons `size-14` / `size-12`. Inputs are 56px default, 48px small. That is what `button.tsx`, the Roots `button.rs` and the language's `primitives/button.mz` all ship, and what `/v1/brand` `.componentSpecs` serves (`minTouchTarget: 48`). (0.7.0 of this skill said controls were dense, 32/36/40px, with 56px only for hero CTAs. The shipped primitives do not do that, so that rule described a system that does not exist.) Badges are 20px tall and are not touch targets; a small element that becomes one gets `min-h-[48px]`. Dashboards are the exception: the Dashboard Standard's app components are dense on a fine pointer (most controls 32–40px) and 44–48px on touch, each as its contract's `density` states. The Discover Standard's components are the same size on every pointer: 48px for the search field and button, \"See all\", \"Load more\" and \"Open in Mukoko\", 44px for category chips, navigation links and the home link.\n- **Radius scale** (px), every step from a 7px unit: `sm` 7 · `md` 12 · `lg` 14 (**DEFAULT** cards/panels) · `xl` 17 · `2xl` 17 · `full` 9999 (pills). That is `mzizi-registry/styles/globals.css`, the Rust `mzizi-tokens` `Radius`, and `/v1/brand` `.radii` (\"ecosystem numbers: 7, 12, 14, 17\"). Checkboxes use `sm`, inputs and small cards `md`, cards and panels `lg`, modals, sheets, dialogs and tabs `xl`. Reference via `--radius-<name>`. (Until 0.8.0 this skill also listed `none` 0, `xs` 4 and `2xl` 24; none of those is defined upstream.)\n- **H1–H3 are Noto Serif. H4+ and body are Noto Sans. Code is JetBrains Mono.**\n- **Rings over shadows.** Cards get `ring-1` of `--border`, not a drop shadow.\n- **No gradients, no glassmorphism** except sticky chrome (`backdrop-blur`) and the Discover Standard's hero wash (DiscoverHero's `gradient-showcase`, which mixes `--primary` into the background, as its contract declares).\n- **Emoji only as mini-app identifiers**, never as chrome or body decoration.\n- **Status has its own names: `--status-success` / `--status-warning` / `--status-error` / `--status-info` / `--status-neutral`.** Use those names and do not hardcode a hex. Upstream they alias `--success` / `--warning` / `--destructive` / `--info` / `--neutral`, so there is one decision per status — which means the resolved values are mineral-derived in the shipped theme (success reads as malachite, info as cobalt), not the standalone #22C55E/#F59E0B/#EF4444/#3B82F6 set an earlier revision of this skill listed. Those hexes are the per-component `var(--token, #hex)` fallback for an app that has not defined the properties; they are not the theme. Severity scale (`--severity-low/moderate/high/severe/extreme/cold`) and connection (`--connection-online/syncing/cached/offline`) follow the same logic. Verification tiers are the only place minerals carry status meaning (community→malachite, otp→cobalt, government→tanzanite, licensed→gold).\n- **Surfaces (April 2026 AAA refresh):** light mode — `--background` warm paper, `--card` pure white, `--muted` cream, `--overlay` white. Dark mode — `--background` warm stone L10%, `--card` L6% (darker than bg), `--muted` L2% (deepest), `--overlay` L14% (lighter than bg, scrim creates pop).\n- **Icons:** in the React build, Lucide through `@/lib/icons`, never `lucide-react` directly; in Mzizi Roots, an icon is an `Element` slot the host renders. For an HTML prototype, the Lucide CDN build is fine.\n- **APCA 3.0 AAA contrast** on both primary and secondary text on every surface.\n\n### When creating visual artifacts\n\nCreate static HTML files for the user to view. `@import` `tokens-update.css` at the top of every HTML file (or inline it). For slide decks use a mineral accent strip and serif display type.\n\n### When working on production code\n\nUse the registry's components, never hand-rolled copies. **Rust first:** Mzizi Roots is the lead build (`cargo add mzizi-roots`; see the `mzizi-roots` skill). The React build installs by absolute URL, for existing React apps:\n\n```bash\nnpx shadcn@latest add https://api.mzizi.dev/v1/ui/<name>\n```\n\nTake CSS variables from `tokens-update.css` or `tokens/palette.css` in this skill — it is generated from `palette.canonical.json` and carries all 21 families. The upstream equivalent is `mzizi-registry/styles/globals.css`, which is generated from the same canon. There is no database to refresh from.\n\n### Dashboards: brand overlays only\n\nAn admin or operator dashboard uses the **Mzizi Dashboard Standard**: the app components of\n`@bundu/ui` (`@bundu/ui/app/*`), one design for every product in the Bundu ecosystem, each\nwith a versioned contract in `mzizi-registry/contracts/app/` (see `mzizi-roots`). A brand\nchanges colour and mark, and nothing else:\n\n- **A brand overlay changes `--primary`, `--ring`, AppShell's `--app-accent` and the brand\n mark.** Layout, spacing, type and size never vary by brand. The overlay is one stylesheet\n imported after the tokens (`@bundu/ui/styles/brand-<brand>.css`). AppShell's `accent`\n takes one of the seven minerals and fills primary actions and the current nav indicator\n with its brand fill (`--color-<mineral>-brand`, text `--color-<mineral>-on-brand`); text\n links and the focus ring keep `--primary` and `--ring`.\n- **Status colours do not follow the brand.** Success is malachite, warning gold, error\n terracotta, info cobalt, in every brand. A component names a mineral only as one of its\n contract's `theming.statusColours`; any other mineral class, or a literal colour value,\n fails its contract test.\n- **Mzizi's hematite** is a Heritage tone, so AppShell's `accent` does not apply to it;\n `brand-mzizi.css` sets `--primary`.\n\n### Discover pages: the same overlay, touch-first\n\nA public discover or browse page in the Mukoko family (circles, news, events, weather, and the\nsuper-app on the web) uses the **Mzizi Discover Standard**: the Discover components of\n`@bundu/ui` (`@bundu/ui/discover/*`), each with a versioned contract in\n`mzizi-registry/contracts/discover/` (see `mzizi-roots`). The brand-overlay rule is the\nDashboard Standard's, with two differences the contracts state:\n\n- **No `--app-accent`.** A brand shows in DiscoverShell's `brand` slot (its mark) and in the\n primary action its `action` slot holds; the frame, header, navigation and footer are\n identical in every brand. `--primary` reaches only DiscoverHero's wash, DiscoverCard's\n monogram and `brand` badge tone, and OpenInApp's `primary` variant. Category chips, sections,\n search and \"Load more\" are neutral (search follows the brand only in its `--ring` focus\n ring). DiscoverCard is the one Discover component with status colours (`cobalt`,\n `malachite`, `gold`, `terracotta`), for its badge tones, and they do not follow the brand.\n- **The same size on every pointer.** Discover pages are not dense on a mouse: every density\n row in `contracts/discover/` gives the same height for a fine and a coarse pointer (48px or\n 44px, as above).\n\n## What belongs in the ecosystem\n\n### Ubuntu alignment\n\nThe ecosystem is built on Ubuntu — \"I am because we are.\" When you architect a new app:\n\n- Prefer open source over proprietary\n- Build for community, not extraction\n- Respect data sovereignty — African data stays on African infrastructure where possible\n- Accessibility is not an afterthought; it is the starting point\n- Every feature should contribute to collective wellbeing, not just individual efficiency\n\nThese aren't marketing claims, they're architectural constraints. If you find yourself\ndesigning something that only benefits a small subset of users at others' expense, question\nwhether it belongs in the ecosystem.\n\n### What is and isn't an ecosystem app\n\nThe ecosystem has two layers. **Mzizi** owns and operates the language, its toolchain, the\nregistry, the design system, the docs and the API, and sits under every app. **Nyuchi Africa**\noperates the Mzizi console and everything revenue-generating. Inside Nyuchi Africa\nsit three pillars and the platform:\n\n- **mukoko** — the consumer pillar: the super-app (social, commerce, payments, identity)\n- **nyuchi** — the commercial/infrastructure pillar and the platform (web services, developer\n tools, storage)\n- **shamwari ai** — the intelligence pillar, sovereign by nature (on-device inference,\n pod-resident context, no third-party AI vendor)\n- **Mukoko Events** (formerly nhimbe) — community events and gatherings\n\nMzizi is not an app and not a layer in a stack; it is the open, non-revenue foundation the\necosystem builds on and the doctrine that governs it. mukoko and shamwari ai are pillars inside Nyuchi Africa, not separate companies.\n\nNot ecosystem apps:\n\n- Any app that extracts value without giving back\n- Any app that requires surveillance for its business model\n- Any app that centralises what should be federated\n\nIf the app you're building doesn't fit, that's fine — consume the Mzizi design system, but\ndon't brand it as ecosystem.\n\n## If invoked with no other guidance\n\nAsk what the work is: (a) an interface or prototype (which surface: mobile, desktop, print,\nslide; which brand voice: Mzizi, nyuchi, mukoko, shamwari, Mukoko Events), (b) parent-brand material\n(ecosystem page, manifesto, deck), (c) a cross-brand piece, or (d) a voice or mineral decision\nfor one brand. Then apply the constellation table, the voice rules and the design system, and\noutput HTML artifacts or production code as the need requires.\n\n_Mzizi — the root everything grows from._",
26
- "source": "mzizi-dev/agent-tools/mzizi-skills/skills/mzizi-design"
30
+ "category": "design",
31
+ "description": "The Mzizi design system and brand: the canonical 21-family palette (seven African Minerals + seven Heritage tones + the Experimental Seven) with generated stylesheets (tokens/palette.css, tokens/minerals.css, tokens-update.css), the radius scale, Noto Sans/Serif + JetBrains Mono type, pill buttons and the 48px touch floor, status and surface tokens, the Dashboard and Discover Standards' brand overlays (colour and mark only), the verified brand constellation (Mzizi's own colour is hematite, a Heritage tone), the ecosystem identity (copper), the five Ubuntu pillars + five principles, what belongs in the ecosystem, and the wordmarks. Replaces nyuchi-design and half of ecosystem-app-setup, and carries the tokens that were in mukoko-design, and Apple's Human Interface Guidelines as the baseline (the eight design principles, layout, adaptivity, accessibility) with where Mzizi overrides them across all apps: touch targets, spacing, type scale, colour, pill geometry, materials, density and the shell.",
32
+ "body_mdx": "# Mzizi design — the system and the ecosystem\n\nThis skill replaces three 0.7.0 skills: `nyuchi-design` (UI and tokens, now \"The design\nsystem\" below), the Ubuntu and ownership half of `ecosystem-app-setup` (now \"What belongs in\nthe ecosystem\"), and the tokens of `mukoko-design`, which moved here. mukoko's brand files (the\nSwarm mark, the app icon, favicons, the lockup and backgrounds) are in the `mukoko-design` skill,\nrestored in 0.15.0.\n\n## Files this skill ships\n\nAll generated from `palette.canonical.json` at the package root by\n`scripts/generate-tokens.mjs`, and gated against it. Never hand-edit them; never retype a hex.\n\n| File | Contents |\n| ---------------------- | ---------------------------------------------------------------------------------------------------- |\n| `tokens/palette.css` | all 21 families, light + dark, as CSS custom properties |\n| `tokens/palette.json` | all 21 families, machine-readable |\n| `tokens/minerals.css` | the seven minerals only |\n| `tokens/minerals.json` | the seven minerals only, machine-readable |\n| `tokens-update.css` | all 21 families (light, dark, `.dark`, `prefers-color-scheme`) plus the radius scale, as one drop-in |\n\n## The ecosystem\n\n**Mzizi** is the parent identity at the ecosystem level — the Mzizi programming language, its\ntoolchain, the design language, the component registry and the open doctrine every brand builds\non. Everything revenue-generating (the\nMzizi console, fundi, paid plans, billing) is Nyuchi's. Three pillars: **mukoko** (consumer super app), **nyuchi** (infrastructure &\nenterprise), and **shamwari ai** (the intelligence pillar), with the **sister brands** as specialist\nverticals — one identity, one design system, one open data commons.\n\nDoctrine **v4.1.0**. **The repo is the source of truth, and there is no database.** Colour\ncomes from `palette.canonical.json` at the root of this package — 21 families, vendored from\n`mzizi-dev/mzizi-registry → lib/tokens/palette.source.ts` and gated against it. The ecosystem\nconstellation and the Ubuntu pillars and principles come from `mzizi-registry →\ncontent/doctrine/`, served at <https://api.mzizi.dev/v1/brand> (`.ecosystem`, `.philosophy`) and\nby the MCP as `mzizi_get_tokens` (`family: \"ecosystem\"`) and `mzizi_get_doctrine`. Two notes:\nprinciples were renamed in v4.x, so use the set below and not older Shona-named lists; and the\nregistry still names its ecosystem-layer entry `bundu` (URL **bundu.org**). That is registry\ndata, and it changes in mzizi-registry, not here.\n\nThe **five** pillars and **five** principles below are a count of Ubuntu doctrine, not of the\npalette, and they are correct — `/v1/brand` `.philosophy.ubuntuPillars` serves exactly these five.\nDo not \"fix\" them to seven to match the colour families.\n\n### The ecosystem-level identity\n\n- **Mineral:** `copper` — `#BF5A36` light / `#FF8A65` dark (`--color-copper`) · connection, foundation, stewardship\n- **Registry entry:** `bundu` in `/v1/brand` `.ecosystem` (meaning _wilderness_, Shona) · **URL:** <https://bundu.org>\n- **Voice:** visionary, grounded, inclusive\n- **Role:** the ecosystem — the layer that holds the whole, the commons, governance, philosophy\n- **Wordmark:** `Mzizi`, capitalised, Noto Serif 600. (The other wordmarks stay lowercase.)\n- **No standalone ecosystem-level logo mark is registered in the registry yet** — that's an open identity\n item. Until one exists, ecosystem-level materials use the wordmark in copper, optionally with\n Mukoko's Swarm mark (the `mukoko-design` skill) when the subject is the product family. Don't invent an ecosystem mark ad hoc.\n- **Copper is the ecosystem layer, not Mzizi's own surfaces.** mzizi.dev, docs.mzizi.dev, the\n registry and the language are the `mzizi` row of the constellation below: theme them in\n **hematite** (owner decision, 2026-09-30). Keep copper for material where the ecosystem as a\n whole speaks: governance, the commons, the manifesto register.\n\n### The brand constellation (verified, v4.1.0)\n\nEvery brand owns a mineral and a voice. Theme each brand's surfaces and copy in **its own** mineral\nand register — never default everything to tanzanite.\n\n| Brand | Role | Mineral | Meaning | Voice |\n| ------------ | ------------------------------------------- | ---------- | ---------- | -------------------------------------- |\n| **bundu** | The ecosystem | copper | Wilderness | visionary, grounded, inclusive |\n| **nyuchi** | Infrastructure & enterprise | gold | Bee | technical, reliable, industrious |\n| **mukoko** | Africa's super app | tanzanite | Beehive | welcoming, structured, protective |\n| **shamwari** | Sovereign AI companion | sodalite | Friend | helpful, warm, intelligent |\n| **Mzizi** | The root: language, registry, design system | hematite ¹ | Root | precise, honest, grounded |\n| events | Events & gatherings (Mukoko Events) | malachite | Gathering | celebratory, communal, vibrant |\n| bushtrade | Marketplace | gold | Bush trade | practical, trustworthy, local |\n| lingo | Language learning | cobalt | Language | encouraging, cultural, playful |\n| campfire | Platform messaging anchor | malachite | Campfire | direct, warm, always present |\n| bytes | Short-form creator video | tanzanite | Bytes | energetic, creative, youthful |\n| novels | Publishing platform | malachite | Novels | literary, thoughtful, immersive |\n| places | Geographic knowledge graph | gold | Places | authoritative, helpful, discoverable |\n| transport | Public transit & booking | gold | Transport | efficient, reliable, practical |\n| planner | Productivity hub | cobalt | Planner | organised, clear, supportive |\n| wallet | Payments & tokens | gold | Wallet | trustworthy, precise, secure |\n| pulse | Feed & Mukoko Home | tanzanite | Pulse | personal, adaptive, ambient |\n| health | Wellness & telemedicine | malachite | Health | caring, accurate, private |\n| circles | Community messaging | terracotta | Circles | inclusive, moderated, community-driven |\n| kweli | Trust and verification | malachite | Truth | honest, rigorous, reassuring |\n| learning | Education (Nyuchi Learning) | gold | Learning | patient, practical, encouraging |\n| news | News and journalism | cobalt | News | clear, credible, balanced |\n| weather | Weather and alerts | cobalt | Weather | calm, precise, timely |\n\nThe `bundu` row is the ecosystem layer as `/v1/brand` serves it today; the table mirrors the\nregistry, so it changes when mzizi-registry renames the entry. The last four rows joined canon\non 2026-10-04 (owner decisions, mzizi-registry #409): kweli is malachite (it used to borrow\nMukoko's tanzanite), news and weather are cobalt, and **learning is gold** because every Nyuchi\nbrand is gold. The education industry category follows it: education is gold, not cobalt.\n\nThe `events` row is **Mukoko Events**, at `events.mukoko.com` (owner decision,\n2026-10-04). The _nhimbe_ brand is retired. `nhimbe` survives only as a deprecated alias of\n`events`: canon still resolves it, and `brand-nhimbe.css` re-exports `brand-events.css`, so\nnothing that names it breaks. New work names `events` and writes \"Mukoko Events\" in copy. The\nmineral is unchanged: malachite.\n\n¹ **Mzizi's brand colour is hematite, and hematite is a Heritage tone, not one of the seven\nminerals** (owner decision, 2026-09-30). `/v1/brand` serves it in `.ecosystem` as\n`{\"name\": \"mzizi\", \"meaning\": \"Root\", \"language\": \"Swahili\", \"mineral\": \"hematite\"}` and lists\nhematite under `.heritage`, not `.minerals`: the field is called `mineral`, but it names a\npalette family, usually a mineral. Mzizi owns and operates the language, the registry, the design\nsystem, the docs and the API; `/v1/brand` gives its role as \"Language, registry and design\nsystem\", and its voice as \"Precise, honest, grounded\". A Mzizi surface takes its primary from\nhematite, as the shipped stylesheets do: `@bundu/ui`'s `brand-mzizi.css` (which mzizi.dev uses)\nsets `--primary` to `var(--color-hematite)`, and the registry's `mzizi-tokens-globals.css`\ndefaults `--primary` to `var(--heritage-hematite-aa)`. Not gold (nyuchi's), not tanzanite (mukoko's), not copper (the\necosystem layer's). Take the values from `palette.canonical.json` (`hematite`, Heritage).\n\nThe narrative spine: **nyuchi is the bee, mukoko is the hive, Mzizi is the root everything\ngrows from.** Use this when explaining the ecosystem — it is the one-sentence architecture.\n\n### Ubuntu as identity (live doctrine)\n\nMzizi carries the philosophy. _Ndiri nekuti tiri_ — I am because we are.\n\n**Five Pillars** (spheres of belonging): **family** (the household and kin, the primary web of\nbelonging) → **community** (neighbours, peers, chosen kin) → **society** (the broader human web —\nstrangers, institutions, the polity) → **environment** (the natural world that holds all\nrelationships; Ubuntu is ecological before it is social) → **spirituality** (the vertical\ndimension — meaning, purpose, ancestry, the sacred).\n\n**Five Principles** (operating rules): **survival** (collective endurance — no one survives alone) ·\n**solidarity** (firm, persevering commitment to the common good) · **compassion** (active care shown\nthrough helping, sharing, welcoming) · **respect** (unprejudiced consideration of another's\nprivileges, beliefs, norms — includes elder-respect) · **dignity** (inherent worth by virtue of\nexistence, irrespective of status or background).\n\nIn ecosystem materials, philosophy is **structural, not decorative**: name a pillar/principle only\nwhen the feature or message genuinely embodies it.\n\n### Rules for ecosystem-level work\n\n- **Wordmarks:** `Mzizi` is capitalised. Every other wordmark is lowercase: `nyuchi`, `mukoko`,\n `shamwari`, `bundu` and every sister brand.\n- **Copper accents** signal \"this is the ecosystem speaking\" (parent-level pages, governance,\n commons, manifesto-register material).\n- **Cross-brand layouts:** lead with the brand that owns the message; bring in the constellation\n table's minerals when showing the family together (each brand in its own mineral).\n- **Voice shifts with the speaker.** An ecosystem-level page is visionary/grounded/inclusive; the same content\n on mukoko.com becomes welcoming/structured/protective. Don't copy-paste tone across brands.\n- Cultural specificity is non-negotiable: Shona vocabulary and Zimbabwean grounding are structural.\n- All UI tokens (radius, type, spacing, surfaces, status colours) are under \"The design system\"\n below. Mukoko's logo and assets are in the `mukoko-design` skill.\n- **Every brand owns a mineral, but the palette is not only minerals.** A cross-brand piece has 21\n families to draw on — seven minerals, seven Heritage tones, the Experimental Seven. Use the\n minerals to say _who is speaking_ (and hematite when Mzizi is); use Heritage for atmosphere and surface, and the Experimental\n Seven for categorical sets that would otherwise stretch a mineral past its meaning.\n\n## The design system\n\n> **Doctrine v4.1.0. The canonical palette ships with this package.**\n> `palette.canonical.json` at the root of `@nyuchi/mzizi-skills` states all **21 colour\n> families** — seven African Minerals, seven Heritage tones, the Experimental Seven — and\n> every token file in this bundle is generated from it and gated against it. Read it, or the\n> stylesheets generated from it (`tokens-update.css` and `tokens/palette.css` here). Do not retype hex values out of this prose into a project.\n>\n> Canon upstream is `mzizi-dev/mzizi-registry → lib/tokens/palette.source.ts`, served publicly\n> at <https://api.mzizi.dev/v1/brand> and by the MCP as `mzizi_get_tokens`. There is no\n> database: the registry's files are the data layer.\n>\n> **Colour is derived and gated. Everything else on this page is hand-maintained** —\n> typography, spacing, radius, sizes, motion, shadow, z-index and the semantic set. The\n> radius scale and control sizes were checked against `mzizi-registry` `main` for 0.8.0;\n> confirm the rest with `mzizi_get_tokens` (`typography`, `spacing`, `radii`, `semantic`,\n> `componentSpecs`) if precision matters.\n\n**The published design system.** The brand book, the tokens as data, the marks and static\npreviews of the components (Badge, Button, Card, Checkbox, Input, StatusBadge, Switch, Tabs and\nmore) are published as the Design System artifact at\n<https://claude.ai/artifact/G8CCtAbZ8w717uQ3R5itCc>. Its source of truth is the `design-system/`\nfolder in `mzizi-dev/mzizi-registry` (arriving with mzizi-registry#418), which the artifact is\nbuilt from file for file. To change the design system, change that folder, never the artifact\npage: the artifact is republished from registry `main` after a merge that touches it.\n\n### Rules that are non-negotiable\n\n- **Wordmarks** — `Mzizi` is capitalised. `mukoko`, `nyuchi`, `bundu`, `shamwari`, `bushtrade` are lowercase, always. (Product names such as Mukoko Events are written as names, not wordmarks.)\n- **The palette is 21 families: seven Minerals + seven Heritage + the Experimental Seven.** Any interface that uses only the minerals is using a third of the system. Do not describe it as \"the seven-colour palette\".\n- **Seven African Minerals** (geological, the core palette). The custom properties are `--color-<mineral>`, `--color-<mineral>-container`, `--color-<mineral>-on-container` — those are the names the design system defines. (`--container-<mineral>` / `--on-container-<mineral>` appeared in earlier revisions of this skill and are defined nowhere upstream; `tokens-update.css` now ships them as aliases so existing work keeps rendering, but do not reach for them in new code.)\n - `cobalt` — primary blue, links, CTAs · digital future, trust\n - `tanzanite` — **mukoko's brand mineral**, social features · premium, connection\n - `malachite` — success states, positive actions · growth\n - `gold` — achievements, rewards, highlights · honey, warmth\n - `terracotta` — community features · earth, grounding\n - `sodalite` — **AI / Shamwari surfaces, deep-reasoning states** · intelligence, depth _(added v4.1.0)_\n - `copper` — **Bundu ecosystem identity, the commons** · connection, stewardship _(added v4.1.0)_\n- **Seven Heritage tones** (atmospheric anchors — mini-app surfaces, backgrounds, moods; no family or role, with one exception: `hematite` is Mzizi's brand colour): `indigo` (dusk, the dyer's craft) · `savanna` (sun-dried grass, the dry season) · `baobab` (the tree of life, bark, shelter) · `sunset` (day's end, the gathering hour) · `river` (flow, the journey) · `hematite` (the neutral anchor, the substrate) · `kalahari` (the light anchor, openness). Reach for them via `--color-<name>` (aliasing `--heritage-<name>`); values are in `palette.canonical.json`. _(Two earlier framings are withdrawn: the ten-colour one from before the palette settled, and the two-anchor one that survived into v0.5.1 of this bundle. **There are seven.** A skill that named two produced two-tone output in projects that had never seen each other.)_\n- **The Experimental Seven** — a computed heptagon (hues offset 17°, prime saturations, foregrounds solved to P7), each tone carrying a `heptagonIndex` 0–6 that fixes its place on the wheel: `ember` · `acacia` · `fern` · `lagoon` · `storm` · `dusk` · `protea`. Four tiers each: `--exp-<name>`, `--exp-<name>-container`, `--exp-<name>-on`, `--exp-<name>-ui`. Use them for generated/wheel-derived surfaces and categorical sets where the minerals would have to be stretched past their meanings.\n- **Each brand owns a mineral** (the ecosystem map, verified v4.1.0 and served at `/v1/brand` as `.ecosystem`): bundu→**copper**, nyuchi→**gold**, mukoko→**tanzanite**, shamwari→**sodalite**, Mzizi→**hematite** (a Heritage tone, not a mineral: the one brand whose colour comes from the Heritage set), events (Mukoko Events)/campfire/novels/health/kweli→malachite, lingo/planner/news/weather→cobalt, bushtrade/places/transport/wallet/learning→gold (learning, and with it the education category, is gold because every Nyuchi brand is), bytes/pulse→tanzanite, circles→terracotta. Theme a surface in its brand's colour — never default everything to tanzanite, and never give a Mzizi surface gold, tanzanite or copper as its primary.\n- **Buttons are ALWAYS pill** (`rounded-full` → `--radius-full`, 9999px). Inputs match buttons visually. The exception is the Mzizi Dashboard Standard (below): its app Button and controls use the small radius, as their contracts state.\n- **Nothing tappable goes below 48px.** Buttons are `h-14` (56px) default and large, `h-12` (48px) small; icon buttons `size-14` / `size-12`. Inputs are 56px default, 48px small. That is what `button.tsx`, the Roots `button.rs` and the language's `primitives/button.mz` all ship, and what `/v1/brand` `.componentSpecs` serves (`minTouchTarget: 48`). (0.7.0 of this skill said controls were dense, 32/36/40px, with 56px only for hero CTAs. The shipped primitives do not do that, so that rule described a system that does not exist.) Badges are 20px tall and are not touch targets; a small element that becomes one gets `min-h-[48px]`. Dashboards are the exception: the Dashboard Standard's app components are dense on a fine pointer (most controls 32–40px) and 44–48px on touch, each as its contract's `density` states. The Discover Standard's components are the same size on every pointer: 48px for the search field and button, \"See all\", \"Load more\" and \"Open in Mukoko\", 44px for category chips, navigation links and the home link.\n- **Radius scale** (px), every step from a 7px unit: `xs` 4 (unit − 3) · `sm` 7 · `md` 12 · `lg` 14 (**DEFAULT** cards/panels) · `xl` 17 · `2xl` 17 · `full` 9999 (pills). That is `mzizi-registry/styles/globals.css`, the Rust `mzizi-tokens` `Radius`, and `/v1/brand` `.radii` (\"ecosystem numbers: 4, 7, 12, 14, 17\"; `xs` joined in mzizi-registry#544). Legend swatches, kbd keys and inline tags use `xs`, checkboxes `sm`, inputs and small cards `md`, cards and panels `lg`, modals, sheets, dialogs and tabs `xl`. Reference via `--radius-<name>`. `2xl` is 17px, never 24. (Until 0.8.0 this skill listed `none` 0 and `2xl` 24, which were never upstream values.)\n- **H1–H3 are Noto Serif. H4+ and body are Noto Sans. Code is JetBrains Mono.**\n- **Rings over shadows.** Cards get `ring-1` of `--border`, not a drop shadow.\n- **No gradients, no glassmorphism** except sticky chrome (`backdrop-blur`) and the Discover Standard's hero wash (DiscoverHero's `gradient-showcase`, which mixes `--primary` into the background, as its contract declares).\n- **Emoji only as mini-app identifiers**, never as chrome or body decoration.\n- **Status has its own names: `--status-success` / `--status-warning` / `--status-error` / `--status-info` / `--status-neutral`.** Use those names and do not hardcode a hex. Upstream they alias `--success` / `--warning` / `--destructive` / `--info` / `--neutral`, so there is one decision per status — which means the resolved values are mineral-derived in the shipped theme (success reads as malachite, info as cobalt), not the standalone #22C55E/#F59E0B/#EF4444/#3B82F6 set an earlier revision of this skill listed. Those hexes are the per-component `var(--token, #hex)` fallback for an app that has not defined the properties; they are not the theme. Severity scale (`--severity-low/moderate/high/severe/extreme/cold`) and connection (`--connection-online/syncing/cached/offline`) follow the same logic. Verification is the only place minerals carry status meaning; it has its own rule, next.\n- **Verification is two things, not one ladder: assurance levels and attestations** (mzizi-registry#577; the source is `gateway/lib/assurance.py` in `nyuchi/nyuchi-api`, the one access decision every surface derives from — read that, never re-derive it). Read the roles, never a hex; each has `-container`, `-on-container` and `-text`, and passes APCA in both themes.\n - **Assurance levels** are ordered (`>=` is meaningful): how strongly an identity is proven. 0 `none` \"Unverified\" → `--assurance-none` (the neutral grey, `--status-neutral`) · 1 `otp` \"Contact Verified\" → `--assurance-otp` (cobalt) · 2 `documented` \"Documents Checked\" → `--assurance-documented` (sodalite) · 3 `government` \"Government Verified\" → `--assurance-government` (gold) · 4 `licensed` \"Licensed Professional\" → `--assurance-licensed` (tanzanite).\n - **A level can expire.** A `government` check holds for five years and a `licensed` one for a year (`LEVEL_VALIDITY_YEARS` in assurance.py, nyuchi-api#375). When the term runs out the level is withdrawn, so show the level a person holds now and never cache it as permanent.\n - **Attestations** are unordered and held beside the level: who vouches for the subject. `community` \"Community Vouched\" → `--attestation-community` (terracotta) · `business` \"Registered Business\" → `--attestation-business` (malachite) · `domain` \"Domain Verified\" → `--attestation-domain` (copper). Show each as its own chip next to the level (`app/tier-status` and `ui/mzizi-verified-badge` do this, from registry v4.17.0; `ui/mzizi-trust-meter` shows the level and renders no attestation chips).\n - **Provenance: where an attestation came from, and when it was checked** (mzizi-registry#593, on registry `staging`, released with the next registry version: `ui/mzizi-verified-badge` 1.2.0 and `app/tier-status` 1.2.0). A stored attestation record may carry `source` (a short id such as `\"osm\"`), `sourceRef` (the source's own reference, kept and never shown) and `checkedAt` (an ISO date or date-time). The chip label stays the canonical one (\"Community Vouched\"), and an optional second line reads \"via <Source> · checked <date>\", for example \"via OpenStreetMap · checked 14 Mar 2026\". Source names come from `ATTESTATION_SOURCES` in `mzizi-trust-tier-data` (`osm` → \"OpenStreetMap\"), and the line is built by `attestationProvenance`. Two rules: **never invent a check date.** With no `checkedAt`, or one that does not parse or names a day that does not exist, the line is \"via OpenStreetMap\" with no date. And **never a per-source label**: a source changes the second line only, never the chip's name, its colour or the closed set of three attestations (an OpenStreetMap verification is a `community` attestation, never a level). The date is formatted in UTC from the locale (`en-GB` by default) so the day never shifts. The chip's `aria-label` stays the canonical name and the line is its `aria-description` (badge) or is read with the name (tier status, the date as `<time datetime>`).\n - **Community is not a rung.** The old ladder put `community` at 1, below `otp`, which ranked a trader vouched for by their whole street below anyone who clicked a link in an email. Mukoko serves the informal economy: a tuck shop is level `otp` plus community, a registered firm is `government` plus business, and neither outranks the other. So never draw community on the level scale and never below otp; `tier=\"community\"` now renders as level Unverified plus a \"Community Vouched\" chip.\n - **`--tier-*` are legacy aliases**, kept while `bundu.verificationTier` (the `legacy_tier()` projection in assurance.py) still has readers: `--tier-unverified` → `--assurance-none`, `--tier-community` → `--attestation-community`, `--tier-otp` → `--assurance-otp`, `--tier-government` → `--assurance-government`, `--tier-licensed` → `--assurance-licensed`. They paint what they always did. New code reads `--assurance-*` and `--attestation-*`. (Earlier revisions of this skill listed a five-rung tier ladder, first as community→malachite, government→tanzanite, licensed→gold, then, after mzizi-registry#543, with community as terracotta; both treated community as a rung.)\n - Colour is never the only cue: every level and attestation carries its label and glyph. Heritage tones never carry a level or an attestation.\n- **Surfaces (April 2026 AAA refresh):** light mode — `--background` warm paper, `--card` pure white, `--muted` cream, `--overlay` white. Dark mode — `--background` warm stone L10%, `--card` L6% (darker than bg), `--muted` L2% (deepest), `--overlay` L14% (lighter than bg, scrim creates pop).\n- **Icons:** in the React build, Lucide through `@/lib/icons`, never `lucide-react` directly; in Mzizi Roots, an icon is an `Element` slot the host renders. For an HTML prototype, the Lucide CDN build is fine.\n- **APCA 3.0 AAA contrast** on both primary and secondary text on every surface.\n\n### When creating visual artifacts\n\nCreate static HTML files for the user to view. `@import` `tokens-update.css` at the top of every HTML file (or inline it). For slide decks use a mineral accent strip and serif display type.\n\n### When working on production code\n\nUse the registry's components, never hand-rolled copies. **Rust first:** Mzizi Roots is the lead build (`cargo add mzizi-roots`; see the `mzizi-roots` skill). The React build installs by absolute URL, for existing React apps:\n\n```bash\nnpx shadcn@latest add https://api.mzizi.dev/v1/ui/<name>\n```\n\nTake CSS variables from `tokens-update.css` or `tokens/palette.css` in this skill — it is generated from `palette.canonical.json` and carries all 21 families. The upstream equivalent is `mzizi-registry/styles/globals.css`, which is generated from the same canon. There is no database to refresh from.\n\n### Apple HIG: the baseline, and where Mzizi overrides it\n\nMzizi designs on Apple's Human Interface Guidelines\n(<https://developer.apple.com/design/human-interface-guidelines>). It applies them to **every**\nMzizi surface (web, native and console) and not only to Apple platforms. The HIG is the\nbaseline wherever Mzizi says nothing. Where Mzizi has a token, a registry component or a\ncontract, **Mzizi is the authority, across all apps**, and the HIG value does not apply. Read\nthe HIG pages live, because Apple revises them: the design principles were reintroduced on\n8 June 2026, Layout was updated on 9 September 2026, and Liquid Glass guidance arrived on\n9 June 2025.\n\n**The eight HIG design principles** (Design principles, June 2026) are the questions to ask of\nevery screen:\n\n| Principle | In Apple's words | In Mzizi terms |\n| -------------- | ------------------------------------ | ------------------------------------------------------------------------------------- |\n| Purpose | Make something meaningful. | Build what the person came for, and drop features nobody asked for. |\n| Agency | Let people do things their own way. | No locked flows, an escape from every guided step, undo before confirm. |\n| Responsibility | Act in people's best interest. | Say what is collected and why. Collect only what the product needs (Ubuntu: dignity). |\n| Familiarity | Build on what people know. | One shell and one set of patterns across every app (`mzizi-architecture`). |\n| Flexibility | Adapt to diverse contexts and needs. | Accessibility from the start, and every input (touch, keyboard, voice, pointer). |\n| Simplicity | Be clear and direct. | Every element earns its place. Hierarchy first, concise labels. |\n| Craft | Care about every detail. | The contract's checks pass, every state renders, motion is purposeful. |\n| Delight | Make it human. | Delight is never decoration. The minerals carry meaning, not ornament. |\n\n**Where Mzizi is the authority** (the HIG value is replaced, not blended):\n\n| Concern | HIG says | Mzizi rule (wins) |\n| ----------------------- | ------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Touch targets | 44×44 pt default, 28×28 pt minimum on iOS/iPadOS | **48px floor** for anything tappable (56px default buttons and inputs). Dashboards: each contract's `density`, 44–48px on touch |\n| Spacing and layout grid | system margins, layout guides | the Mzizi spacing tokens and each component contract's `responsive` rules, from 320px up |\n| Type scale and families | San Francisco, Dynamic Type sizes (17 pt default body on iOS) | Noto Serif H1–H3, Noto Sans H4 and body, JetBrains Mono for code, at the Mzizi type scale. **Text still scales with the user's setting** (rem units, no fixed px caps) |\n| Colour | system colours, dynamic colours | the 21 families and the semantic tokens only, through `var(--…)`. A brand overlay changes colour and mark only |\n| Contrast | 4.5:1 up to 17 pt, 3:1 at 18 pt or bold (WCAG) | APCA in both themes (the palette is solved for it), never weaker than the HIG/WCAG floor |\n| Shape | system control shapes, capsules in Liquid Glass | **pill buttons and inputs** (`--radius-full`), the radius scale above, and the Dashboard Standard's small radius where its contracts say so |\n| Materials | Liquid Glass for controls over content | solid surfaces and rings; blur only on sticky chrome. No glass panels on web surfaces |\n| Density | per-platform defaults | comfortable by default, dense only where a Standard's contract says so |\n| App chrome | tab bars, sidebars, toolbars per platform | **the shell**: AppShell or DiscoverShell from `@bundu/ui`, mounted once (`mzizi-architecture`) |\n\n**Where the HIG applies as written** (Mzizi is silent, so follow Apple):\n\n- **Hierarchy and layout.** Order content by importance (top and leading side first), align to\n make it scannable, group related items with space, containers or separators, and use\n progressive disclosure instead of showing every choice at once (Layout).\n- **Adaptivity.** Lay out by the space available, never by device type. Keep functionality\n the same as the size changes, and respect safe areas (the registry's `safe-area-frame`\n primitive does this on the web).\n- **Accessibility.** VoiceOver and screen-reader labels, Reduce Motion (stop auto-playing,\n zooming and parallax motion; Mzizi's harness exposes `prefers-reduced-motion`), Increase\n Contrast, keyboard and switch access, and never colour alone.\n- **Feedback and recovery.** Show state changes, confirm destructive actions, and make\n reversal cheap.\n- **Writing.** Be concise, use the exact words a control needs, and say what will happen.\n- **Native apps** (SwiftUI and other native platforms) use the system components and\n materials, Liquid Glass included, themed through the generated Swift and Kotlin tokens, while\n the Mzizi floor, type and colour rules still hold.\n\nWhen a HIG update conflicts with a Mzizi rule, the Mzizi rule stands until the registry changes\nit. Raise the conflict upstream in `mzizi-dev/mzizi-registry` and do not patch around it in an\napp.\n\n### Dashboards: brand overlays only\n\nAn admin or operator dashboard uses the **Mzizi Dashboard Standard**: the app components of\n`@bundu/ui` (`@bundu/ui/app/*`), one design for every product in the Bundu ecosystem, each\nwith a versioned contract in `mzizi-registry/contracts/app/` (see `mzizi-roots`). A brand\nchanges colour and mark, and nothing else:\n\n- **A brand overlay changes `--primary`, `--ring`, AppShell's `--app-accent` and the brand\n mark.** Layout, spacing, type and size never vary by brand. The overlay is one stylesheet\n imported after the tokens (`@bundu/ui/styles/brand-<brand>.css`). AppShell's `accent`\n takes one of the seven minerals and fills primary actions and the current nav indicator\n with its brand fill (`--color-<mineral>-brand`, text `--color-<mineral>-on-brand`); text\n links and the focus ring keep `--primary` and `--ring`.\n- **Status colours do not follow the brand.** Success is malachite, warning gold, error\n terracotta, info cobalt, in every brand. A component names a mineral only as one of its\n contract's `theming.statusColours`; any other mineral class, or a literal colour value,\n fails its contract test.\n- **Mzizi's hematite** is a Heritage tone, so AppShell's `accent` does not apply to it;\n `brand-mzizi.css` sets `--primary`.\n\n### Discover pages: the same overlay, touch-first\n\nA public discover or browse page in the Mukoko family (circles, news, events, weather, and the\nsuper-app on the web) uses the **Mzizi Discover Standard**: the Discover components of\n`@bundu/ui` (`@bundu/ui/discover/*`), each with a versioned contract in\n`mzizi-registry/contracts/discover/` (see `mzizi-roots`). The brand-overlay rule is the\nDashboard Standard's, with two differences the contracts state:\n\n- **No `--app-accent`.** A brand shows in DiscoverShell's `brand` slot (its mark) and in the\n primary action its `action` slot holds; the frame, header, navigation and footer are\n identical in every brand. `--primary` reaches only DiscoverHero's wash, DiscoverCard's\n monogram and `brand` badge tone, and OpenInApp's `primary` variant. Category chips, sections,\n search and \"Load more\" are neutral (search follows the brand only in its `--ring` focus\n ring). DiscoverCard is the one Discover component with status colours (`cobalt`,\n `malachite`, `gold`, `terracotta`), for its badge tones, and they do not follow the brand.\n- **The same size on every pointer.** Discover pages are not dense on a mouse: every density\n row in `contracts/discover/` gives the same height for a fine and a coarse pointer (48px or\n 44px, as above).\n\n## What belongs in the ecosystem\n\n### Ubuntu alignment\n\nThe ecosystem is built on Ubuntu — \"I am because we are.\" When you architect a new app:\n\n- Prefer open source over proprietary\n- Build for community, not extraction\n- Respect data sovereignty — African data stays on African infrastructure where possible\n- Accessibility is not an afterthought; it is the starting point\n- Every feature should contribute to collective wellbeing, not just individual efficiency\n\nThese aren't marketing claims, they're architectural constraints. If you find yourself\ndesigning something that only benefits a small subset of users at others' expense, question\nwhether it belongs in the ecosystem.\n\n### What is and isn't an ecosystem app\n\nThe ecosystem has two layers. **Mzizi** owns and operates the language, its toolchain, the\nregistry, the design system, the docs and the API, and sits under every app. **Nyuchi Africa**\noperates the Mzizi console and everything revenue-generating. Inside Nyuchi Africa\nsit three pillars and the platform:\n\n- **mukoko** — the consumer pillar: the super-app (social, commerce, payments, identity)\n- **nyuchi** — the commercial/infrastructure pillar and the platform (web services, developer\n tools, storage)\n- **shamwari ai** — the intelligence pillar, sovereign by nature (on-device inference,\n pod-resident context, no third-party AI vendor)\n- **Mukoko Events** (formerly nhimbe) — community events and gatherings\n\nMzizi is not an app and not a layer in a stack; it is the open, non-revenue foundation the\necosystem builds on and the doctrine that governs it. mukoko and shamwari ai are pillars inside Nyuchi Africa, not separate companies.\n\nNot ecosystem apps:\n\n- Any app that extracts value without giving back\n- Any app that requires surveillance for its business model\n- Any app that centralises what should be federated\n\nIf the app you're building doesn't fit, that's fine — consume the Mzizi design system, but\ndon't brand it as ecosystem.\n\n## If invoked with no other guidance\n\nAsk what the work is: (a) an interface or prototype (which surface: mobile, desktop, print,\nslide; which brand voice: Mzizi, nyuchi, mukoko, shamwari, Mukoko Events), (b) parent-brand material\n(ecosystem page, manifesto, deck), (c) a cross-brand piece, or (d) a voice or mineral decision\nfor one brand. Then apply the constellation table, the voice rules and the design system, and\noutput HTML artifacts or production code as the need requires.\n\n_Mzizi — the root everything grows from._",
33
+ "source": "mzizi-dev/agent-tools/mzizi-skills/skills/mzizi-design",
34
+ "files": [
35
+ {
36
+ "path": "tokens-update.css",
37
+ "mimeType": "text/css",
38
+ "bytes": 8457,
39
+ "encoding": "utf8",
40
+ "content": "/* ───────────────────────────────────────────────────────────────────────\n * nyuchi token refresh — merge into colors_and_type.css.\n *\n * GENERATED — DO NOT EDIT BY HAND.\n * source: palette.canonical.json (21 families, vendored from\n * mzizi-dev/mzizi-registry → lib/tokens/palette.source.ts)\n * generator: scripts/generate-tokens.mjs\n * refresh: node scripts/build-palette-snapshot.mjs && node scripts/generate-tokens.mjs\n * gate: node scripts/generate-tokens.mjs --check\n *\n * The palette is SEVEN MINERALS + SEVEN HERITAGE + SEVEN EXPERIMENTAL = 21\n * families. A stylesheet here that carries fewer has drifted, and the gate\n * above says so. Supabase is not the source of truth for any of it.\n * ─────────────────────────────────────────────────────────────────────── */\n\n:root {\n /* Seven African Minerals — light */\n --color-cobalt: #0047ab;\n --color-cobalt-container: #e3f2fd;\n --color-cobalt-on-container: #002966;\n --color-tanzanite: #4b0082;\n --color-tanzanite-container: #f3e5f5;\n --color-tanzanite-on-container: #2e004d;\n --color-malachite: #004d40;\n --color-malachite-container: #e0f2f1;\n --color-malachite-on-container: #00332b;\n --color-gold: #5d4037;\n --color-gold-container: #fff8e1;\n --color-gold-on-container: #3e2723;\n --color-terracotta: #a0522d;\n --color-terracotta-container: #f5e6d3;\n --color-terracotta-on-container: #5d2906;\n --color-sodalite: #283593;\n --color-sodalite-container: #e8eaf6;\n --color-sodalite-on-container: #141a5c;\n --color-copper: #bf5a36;\n --color-copper-container: #fbe4da;\n --color-copper-on-container: #5c2410;\n\n /* Seven Heritage tones — light */\n --heritage-indigo: #4527a0;\n --heritage-savanna: #8d6e1a;\n --heritage-baobab: #4e342e;\n --heritage-sunset: #d84315;\n --heritage-river: #006064;\n --heritage-hematite: #546e7a;\n --heritage-kalahari: #c9b589;\n\n /* The Experimental Seven — light */\n --exp-ember: #843d20;\n --exp-ember-container: #ebdfdb;\n --exp-ember-on: #7a3115;\n --exp-ember-ui: #cd5f33;\n --exp-acacia: #4d5615;\n --exp-acacia-container: #e9ebdb;\n --exp-acacia-on: #48510e;\n --exp-acacia-ui: #7e8c22;\n --exp-fern: #175e17;\n --exp-fern-container: #dbebdb;\n --exp-fern-on: #0f570f;\n --exp-fern-ui: #259725;\n --exp-lagoon: #165b51;\n --exp-lagoon-container: #dbebe9;\n --exp-lagoon-on: #0e554b;\n --exp-lagoon-ui: #249383;\n --exp-storm: #284ca6;\n --exp-storm-container: #dbe0eb;\n --exp-storm-on: #1a409b;\n --exp-storm-ui: #577bd6;\n --exp-dusk: #742aad;\n --exp-dusk-container: #e4dbeb;\n --exp-dusk-on: #661b9e;\n --exp-dusk-ui: #a35dd8;\n --exp-protea: #932464;\n --exp-protea-container: #ebdbe4;\n --exp-protea-on: #841656;\n --exp-protea-ui: #d34998;\n\n --color-indigo: var(--heritage-indigo);\n --color-savanna: var(--heritage-savanna);\n --color-baobab: var(--heritage-baobab);\n --color-sunset: var(--heritage-sunset);\n --color-river: var(--heritage-river);\n --color-hematite: var(--heritage-hematite);\n --color-kalahari: var(--heritage-kalahari);\n\n /* Legacy aliases — prefer --color-<mineral>-container / -on-container. */\n --container-cobalt: var(--color-cobalt-container);\n --on-container-cobalt: var(--color-cobalt-on-container);\n --container-tanzanite: var(--color-tanzanite-container);\n --on-container-tanzanite: var(--color-tanzanite-on-container);\n --container-malachite: var(--color-malachite-container);\n --on-container-malachite: var(--color-malachite-on-container);\n --container-gold: var(--color-gold-container);\n --on-container-gold: var(--color-gold-on-container);\n --container-terracotta: var(--color-terracotta-container);\n --on-container-terracotta: var(--color-terracotta-on-container);\n --container-sodalite: var(--color-sodalite-container);\n --on-container-sodalite: var(--color-sodalite-on-container);\n --container-copper: var(--color-copper-container);\n --on-container-copper: var(--color-copper-on-container);\n\n /* Radius scale (px) — equal to mzizi-registry/styles/globals.css; not part of the colour canon. */\n --radius-xs: 4px;\n --radius-sm: 7px;\n --radius-md: 12px;\n --radius-lg: 14px;\n --radius-xl: 17px;\n --radius-2xl: 17px;\n --radius-3xl: 9999px;\n --radius-4xl: 9999px;\n --radius-full: 9999px;\n}\n\n.dark {\n /* Seven African Minerals — dark */\n --color-cobalt: #00b0ff;\n --color-cobalt-container: #001f3f;\n --color-cobalt-on-container: #b3e5fc;\n --color-tanzanite: #b388ff;\n --color-tanzanite-container: #1a0033;\n --color-tanzanite-on-container: #e1bee7;\n --color-malachite: #64ffda;\n --color-malachite-container: #00251a;\n --color-malachite-on-container: #a7ffeb;\n --color-gold: #ffd740;\n --color-gold-container: #332200;\n --color-gold-on-container: #ffecb3;\n --color-terracotta: #e1b07e;\n --color-terracotta-container: #3e2817;\n --color-terracotta-on-container: #f5e6d3;\n --color-sodalite: #3d5afe;\n --color-sodalite-container: #0d1442;\n --color-sodalite-on-container: #c5cae9;\n --color-copper: #ff8a65;\n --color-copper-container: #3a1a0e;\n --color-copper-on-container: #ffd3c2;\n\n /* Seven Heritage tones — dark */\n --heritage-indigo: #7986cb;\n --heritage-savanna: #e5c158;\n --heritage-baobab: #a1887f;\n --heritage-sunset: #ff7043;\n --heritage-river: #4dd0e1;\n --heritage-hematite: #90a4ae;\n --heritage-kalahari: #e8d9b5;\n\n /* The Experimental Seven — dark */\n --exp-ember: #da8766;\n --exp-ember-container: #352721;\n --exp-ember-on: #eba68a;\n --exp-ember-ui: #bb562d;\n --exp-acacia: #93a528;\n --exp-acacia-container: #333521;\n --exp-acacia-on: #b6ce23;\n --exp-acacia-ui: #768420;\n --exp-fern: #2cb42b;\n --exp-fern-container: #213521;\n --exp-fern-on: #28db28;\n --exp-fern-ui: #228d22;\n --exp-lagoon: #2aae9b;\n --exp-lagoon-container: #213532;\n --exp-lagoon-on: #24d6bc;\n --exp-lagoon-ui: #218a7a;\n --exp-storm: #7e9be0;\n --exp-storm-container: #212735;\n --exp-storm-on: #99b2ee;\n --exp-storm-ui: #426cd1;\n --exp-dusk: #ba87e2;\n --exp-dusk-container: #2d2135;\n --exp-dusk-on: #cc9fef;\n --exp-dusk-ui: #9749d3;\n --exp-protea: #df7bb4;\n --exp-protea-container: #35212d;\n --exp-protea-on: #ed98c9;\n --exp-protea-ui: #ca3188;\n}\n\n@media (prefers-color-scheme: dark) {\n :root:not(.light) {\n /* Seven African Minerals — dark */\n --color-cobalt: #00b0ff;\n --color-cobalt-container: #001f3f;\n --color-cobalt-on-container: #b3e5fc;\n --color-tanzanite: #b388ff;\n --color-tanzanite-container: #1a0033;\n --color-tanzanite-on-container: #e1bee7;\n --color-malachite: #64ffda;\n --color-malachite-container: #00251a;\n --color-malachite-on-container: #a7ffeb;\n --color-gold: #ffd740;\n --color-gold-container: #332200;\n --color-gold-on-container: #ffecb3;\n --color-terracotta: #e1b07e;\n --color-terracotta-container: #3e2817;\n --color-terracotta-on-container: #f5e6d3;\n --color-sodalite: #3d5afe;\n --color-sodalite-container: #0d1442;\n --color-sodalite-on-container: #c5cae9;\n --color-copper: #ff8a65;\n --color-copper-container: #3a1a0e;\n --color-copper-on-container: #ffd3c2;\n\n /* Seven Heritage tones — dark */\n --heritage-indigo: #7986cb;\n --heritage-savanna: #e5c158;\n --heritage-baobab: #a1887f;\n --heritage-sunset: #ff7043;\n --heritage-river: #4dd0e1;\n --heritage-hematite: #90a4ae;\n --heritage-kalahari: #e8d9b5;\n\n /* The Experimental Seven — dark */\n --exp-ember: #da8766;\n --exp-ember-container: #352721;\n --exp-ember-on: #eba68a;\n --exp-ember-ui: #bb562d;\n --exp-acacia: #93a528;\n --exp-acacia-container: #333521;\n --exp-acacia-on: #b6ce23;\n --exp-acacia-ui: #768420;\n --exp-fern: #2cb42b;\n --exp-fern-container: #213521;\n --exp-fern-on: #28db28;\n --exp-fern-ui: #228d22;\n --exp-lagoon: #2aae9b;\n --exp-lagoon-container: #213532;\n --exp-lagoon-on: #24d6bc;\n --exp-lagoon-ui: #218a7a;\n --exp-storm: #7e9be0;\n --exp-storm-container: #212735;\n --exp-storm-on: #99b2ee;\n --exp-storm-ui: #426cd1;\n --exp-dusk: #ba87e2;\n --exp-dusk-container: #2d2135;\n --exp-dusk-on: #cc9fef;\n --exp-dusk-ui: #9749d3;\n --exp-protea: #df7bb4;\n --exp-protea-container: #35212d;\n --exp-protea-on: #ed98c9;\n --exp-protea-ui: #ca3188;\n }\n}\n"
41
+ },
42
+ {
43
+ "path": "tokens/minerals.css",
44
+ "mimeType": "text/css",
45
+ "bytes": 5236,
46
+ "encoding": "utf8",
47
+ "content": "/* ───────────────────────────────────────────────────────────────────────\n * The seven African Minerals — the mineral seventh of the palette.\n *\n * GENERATED — DO NOT EDIT BY HAND.\n * source: palette.canonical.json (21 families, vendored from\n * mzizi-dev/mzizi-registry → lib/tokens/palette.source.ts)\n * generator: scripts/generate-tokens.mjs\n * refresh: node scripts/build-palette-snapshot.mjs && node scripts/generate-tokens.mjs\n * gate: node scripts/generate-tokens.mjs --check\n *\n * The palette is SEVEN MINERALS + SEVEN HERITAGE + SEVEN EXPERIMENTAL = 21\n * families. A stylesheet here that carries fewer has drifted, and the gate\n * above says so. Supabase is not the source of truth for any of it.\n * ─────────────────────────────────────────────────────────────────────── */\n\n/* This file is the MINERALS ONLY. The palette has 21 families: the seven\n heritage tones and the Experimental Seven live in `palette.css` beside\n this file. Import `palette.css` unless you specifically want the mineral\n subset — an interface built from this file alone is missing two thirds of\n the system. */\n\n:root {\n /* Seven African Minerals — light */\n --color-cobalt: #0047ab;\n --color-cobalt-container: #e3f2fd;\n --color-cobalt-on-container: #002966;\n --color-tanzanite: #4b0082;\n --color-tanzanite-container: #f3e5f5;\n --color-tanzanite-on-container: #2e004d;\n --color-malachite: #004d40;\n --color-malachite-container: #e0f2f1;\n --color-malachite-on-container: #00332b;\n --color-gold: #5d4037;\n --color-gold-container: #fff8e1;\n --color-gold-on-container: #3e2723;\n --color-terracotta: #a0522d;\n --color-terracotta-container: #f5e6d3;\n --color-terracotta-on-container: #5d2906;\n --color-sodalite: #283593;\n --color-sodalite-container: #e8eaf6;\n --color-sodalite-on-container: #141a5c;\n --color-copper: #bf5a36;\n --color-copper-container: #fbe4da;\n --color-copper-on-container: #5c2410;\n\n /* Legacy aliases — prefer --color-<mineral>-container / -on-container. */\n --container-cobalt: var(--color-cobalt-container);\n --on-container-cobalt: var(--color-cobalt-on-container);\n --container-tanzanite: var(--color-tanzanite-container);\n --on-container-tanzanite: var(--color-tanzanite-on-container);\n --container-malachite: var(--color-malachite-container);\n --on-container-malachite: var(--color-malachite-on-container);\n --container-gold: var(--color-gold-container);\n --on-container-gold: var(--color-gold-on-container);\n --container-terracotta: var(--color-terracotta-container);\n --on-container-terracotta: var(--color-terracotta-on-container);\n --container-sodalite: var(--color-sodalite-container);\n --on-container-sodalite: var(--color-sodalite-on-container);\n --container-copper: var(--color-copper-container);\n --on-container-copper: var(--color-copper-on-container);\n\n /* Mukoko asset surfaces — brand vocabulary, not palette canon. */\n --surface-paper: #f3f2ee;\n --surface-ink: #141413;\n --surface-stone: #1b1a17;\n --surface-bone: #f5f5f4;\n}\n\n.dark {\n /* Seven African Minerals — dark */\n --color-cobalt: #00b0ff;\n --color-cobalt-container: #001f3f;\n --color-cobalt-on-container: #b3e5fc;\n --color-tanzanite: #b388ff;\n --color-tanzanite-container: #1a0033;\n --color-tanzanite-on-container: #e1bee7;\n --color-malachite: #64ffda;\n --color-malachite-container: #00251a;\n --color-malachite-on-container: #a7ffeb;\n --color-gold: #ffd740;\n --color-gold-container: #332200;\n --color-gold-on-container: #ffecb3;\n --color-terracotta: #e1b07e;\n --color-terracotta-container: #3e2817;\n --color-terracotta-on-container: #f5e6d3;\n --color-sodalite: #3d5afe;\n --color-sodalite-container: #0d1442;\n --color-sodalite-on-container: #c5cae9;\n --color-copper: #ff8a65;\n --color-copper-container: #3a1a0e;\n --color-copper-on-container: #ffd3c2;\n\n /* Mukoko asset surfaces — dark */\n --surface-paper: #1b1a17;\n --surface-ink: #f5f5f4;\n}\n\n@media (prefers-color-scheme: dark) {\n :root:not(.light) {\n /* Seven African Minerals — dark */\n --color-cobalt: #00b0ff;\n --color-cobalt-container: #001f3f;\n --color-cobalt-on-container: #b3e5fc;\n --color-tanzanite: #b388ff;\n --color-tanzanite-container: #1a0033;\n --color-tanzanite-on-container: #e1bee7;\n --color-malachite: #64ffda;\n --color-malachite-container: #00251a;\n --color-malachite-on-container: #a7ffeb;\n --color-gold: #ffd740;\n --color-gold-container: #332200;\n --color-gold-on-container: #ffecb3;\n --color-terracotta: #e1b07e;\n --color-terracotta-container: #3e2817;\n --color-terracotta-on-container: #f5e6d3;\n --color-sodalite: #3d5afe;\n --color-sodalite-container: #0d1442;\n --color-sodalite-on-container: #c5cae9;\n --color-copper: #ff8a65;\n --color-copper-container: #3a1a0e;\n --color-copper-on-container: #ffd3c2;\n\n /* Mukoko asset surfaces — dark */\n --surface-paper: #1b1a17;\n --surface-ink: #f5f5f4;\n }\n}\n"
48
+ },
49
+ {
50
+ "path": "tokens/minerals.json",
51
+ "mimeType": "application/json",
52
+ "bytes": 3213,
53
+ "encoding": "utf8",
54
+ "content": "{\n \"_generated\": \"DO NOT EDIT — scripts/generate-tokens.mjs\",\n \"_source\": \"palette.canonical.json (mzizi-dev/mzizi-registry → lib/tokens/palette.source.ts)\",\n \"_check\": \"node scripts/generate-tokens.mjs --check\",\n \"_note\": \"Minerals only — seven of the palette's twenty-one families. heritage and experimental are in palette.json beside this file.\",\n \"doctrineVersion\": \"4.1.0\",\n \"core\": \"tanzanite\",\n \"ring_order\": [\n \"cobalt\",\n \"gold\",\n \"malachite\",\n \"copper\",\n \"sodalite\",\n \"terracotta\"\n ],\n \"minerals\": [\n {\n \"name\": \"cobalt\",\n \"role\": \"Knowledge\",\n \"family\": \"deep-earth\",\n \"light\": \"#0047AB\",\n \"dark\": \"#00B0FF\",\n \"cl\": \"#E3F2FD\",\n \"cd\": \"#001F3F\",\n \"ocl\": \"#002966\",\n \"ocd\": \"#B3E5FC\",\n \"origin\": \"Katanga (DRC) and Zambian Copperbelt\",\n \"sym\": \"Digital future, trust, knowledge\",\n \"use\": \"Primary blue, links, CTAs\"\n },\n {\n \"name\": \"tanzanite\",\n \"role\": \"Identity\",\n \"family\": \"deep-earth\",\n \"light\": \"#4B0082\",\n \"dark\": \"#B388FF\",\n \"cl\": \"#F3E5F5\",\n \"cd\": \"#1A0033\",\n \"ocl\": \"#2E004D\",\n \"ocd\": \"#E1BEE7\",\n \"origin\": \"Merelani Hills, Tanzania\",\n \"sym\": \"Premium, creativity, connection\",\n \"use\": \"Purple accent, brand/logo, social features\"\n },\n {\n \"name\": \"malachite\",\n \"role\": \"Growth\",\n \"family\": \"deep-earth\",\n \"light\": \"#004D40\",\n \"dark\": \"#64FFDA\",\n \"cl\": \"#E0F2F1\",\n \"cd\": \"#00251A\",\n \"ocl\": \"#00332B\",\n \"ocd\": \"#A7FFEB\",\n \"origin\": \"Congo Copper Belt\",\n \"sym\": \"Growth, nature, success\",\n \"use\": \"Success states, positive actions\"\n },\n {\n \"name\": \"gold\",\n \"role\": \"Value\",\n \"family\": \"hand\",\n \"light\": \"#5D4037\",\n \"dark\": \"#FFD740\",\n \"cl\": \"#FFF8E1\",\n \"cd\": \"#332200\",\n \"ocl\": \"#3E2723\",\n \"ocd\": \"#FFECB3\",\n \"origin\": \"Ghana, South Africa, Mali\",\n \"sym\": \"Honey, rewards, warmth\",\n \"use\": \"Achievements, rewards, highlights\"\n },\n {\n \"name\": \"terracotta\",\n \"role\": \"Community\",\n \"family\": \"hand\",\n \"light\": \"#A0522D\",\n \"dark\": \"#E1B07E\",\n \"cl\": \"#F5E6D3\",\n \"cd\": \"#3E2817\",\n \"ocl\": \"#5D2906\",\n \"ocd\": \"#F5E6D3\",\n \"origin\": \"Pan-African Sahel\",\n \"sym\": \"Earth, community, grounding\",\n \"use\": \"Community features, warmth\"\n },\n {\n \"name\": \"sodalite\",\n \"role\": \"Intelligence\",\n \"family\": \"deep-earth\",\n \"light\": \"#283593\",\n \"dark\": \"#3D5AFE\",\n \"cl\": \"#E8EAF6\",\n \"cd\": \"#0D1442\",\n \"ocl\": \"#141A5C\",\n \"ocd\": \"#C5CAE9\",\n \"origin\": \"Kunene River, Namibia & South Africa\",\n \"sym\": \"Intelligence, depth, reasoning\",\n \"use\": \"AI/Shamwari surfaces, deep-reasoning states\"\n },\n {\n \"name\": \"copper\",\n \"role\": \"Stewardship\",\n \"family\": \"hand\",\n \"light\": \"#BF5A36\",\n \"dark\": \"#FF8A65\",\n \"cl\": \"#FBE4DA\",\n \"cd\": \"#3A1A0E\",\n \"ocl\": \"#5C2410\",\n \"ocd\": \"#FFD3C2\",\n \"origin\": \"Central African Copperbelt, Zambia & DRC\",\n \"sym\": \"Connection, foundation, stewardship\",\n \"use\": \"Bundu ecosystem identity, the commons\"\n }\n ]\n}\n"
55
+ },
56
+ {
57
+ "path": "tokens/palette.css",
58
+ "mimeType": "text/css",
59
+ "bytes": 8292,
60
+ "encoding": "utf8",
61
+ "content": "/* ───────────────────────────────────────────────────────────────────────\n * The canonical Mzizi palette — all 21 colour families.\n *\n * GENERATED — DO NOT EDIT BY HAND.\n * source: palette.canonical.json (21 families, vendored from\n * mzizi-dev/mzizi-registry → lib/tokens/palette.source.ts)\n * generator: scripts/generate-tokens.mjs\n * refresh: node scripts/build-palette-snapshot.mjs && node scripts/generate-tokens.mjs\n * gate: node scripts/generate-tokens.mjs --check\n *\n * The palette is SEVEN MINERALS + SEVEN HERITAGE + SEVEN EXPERIMENTAL = 21\n * families. A stylesheet here that carries fewer has drifted, and the gate\n * above says so. Supabase is not the source of truth for any of it.\n * ─────────────────────────────────────────────────────────────────────── */\n\n:root {\n /* Seven African Minerals — light */\n --color-cobalt: #0047ab;\n --color-cobalt-container: #e3f2fd;\n --color-cobalt-on-container: #002966;\n --color-tanzanite: #4b0082;\n --color-tanzanite-container: #f3e5f5;\n --color-tanzanite-on-container: #2e004d;\n --color-malachite: #004d40;\n --color-malachite-container: #e0f2f1;\n --color-malachite-on-container: #00332b;\n --color-gold: #5d4037;\n --color-gold-container: #fff8e1;\n --color-gold-on-container: #3e2723;\n --color-terracotta: #a0522d;\n --color-terracotta-container: #f5e6d3;\n --color-terracotta-on-container: #5d2906;\n --color-sodalite: #283593;\n --color-sodalite-container: #e8eaf6;\n --color-sodalite-on-container: #141a5c;\n --color-copper: #bf5a36;\n --color-copper-container: #fbe4da;\n --color-copper-on-container: #5c2410;\n\n /* Seven Heritage tones — light */\n --heritage-indigo: #4527a0;\n --heritage-savanna: #8d6e1a;\n --heritage-baobab: #4e342e;\n --heritage-sunset: #d84315;\n --heritage-river: #006064;\n --heritage-hematite: #546e7a;\n --heritage-kalahari: #c9b589;\n\n /* The Experimental Seven — computed heptagon, light */\n --exp-ember: #843d20;\n --exp-ember-container: #ebdfdb;\n --exp-ember-on: #7a3115;\n --exp-ember-ui: #cd5f33;\n --exp-acacia: #4d5615;\n --exp-acacia-container: #e9ebdb;\n --exp-acacia-on: #48510e;\n --exp-acacia-ui: #7e8c22;\n --exp-fern: #175e17;\n --exp-fern-container: #dbebdb;\n --exp-fern-on: #0f570f;\n --exp-fern-ui: #259725;\n --exp-lagoon: #165b51;\n --exp-lagoon-container: #dbebe9;\n --exp-lagoon-on: #0e554b;\n --exp-lagoon-ui: #249383;\n --exp-storm: #284ca6;\n --exp-storm-container: #dbe0eb;\n --exp-storm-on: #1a409b;\n --exp-storm-ui: #577bd6;\n --exp-dusk: #742aad;\n --exp-dusk-container: #e4dbeb;\n --exp-dusk-on: #661b9e;\n --exp-dusk-ui: #a35dd8;\n --exp-protea: #932464;\n --exp-protea-container: #ebdbe4;\n --exp-protea-on: #841656;\n --exp-protea-ui: #d34998;\n\n /* Stable aliases: --color-<name> for every family. */\n --color-indigo: var(--heritage-indigo);\n --color-savanna: var(--heritage-savanna);\n --color-baobab: var(--heritage-baobab);\n --color-sunset: var(--heritage-sunset);\n --color-river: var(--heritage-river);\n --color-hematite: var(--heritage-hematite);\n --color-kalahari: var(--heritage-kalahari);\n\n /* Legacy aliases — the names older revisions of this skill used.\n Prefer --color-<mineral>-container / -on-container in new work. */\n --container-cobalt: var(--color-cobalt-container);\n --on-container-cobalt: var(--color-cobalt-on-container);\n --container-tanzanite: var(--color-tanzanite-container);\n --on-container-tanzanite: var(--color-tanzanite-on-container);\n --container-malachite: var(--color-malachite-container);\n --on-container-malachite: var(--color-malachite-on-container);\n --container-gold: var(--color-gold-container);\n --on-container-gold: var(--color-gold-on-container);\n --container-terracotta: var(--color-terracotta-container);\n --on-container-terracotta: var(--color-terracotta-on-container);\n --container-sodalite: var(--color-sodalite-container);\n --on-container-sodalite: var(--color-sodalite-on-container);\n --container-copper: var(--color-copper-container);\n --on-container-copper: var(--color-copper-on-container);\n}\n\n.dark {\n /* Seven African Minerals — dark */\n --color-cobalt: #00b0ff;\n --color-cobalt-container: #001f3f;\n --color-cobalt-on-container: #b3e5fc;\n --color-tanzanite: #b388ff;\n --color-tanzanite-container: #1a0033;\n --color-tanzanite-on-container: #e1bee7;\n --color-malachite: #64ffda;\n --color-malachite-container: #00251a;\n --color-malachite-on-container: #a7ffeb;\n --color-gold: #ffd740;\n --color-gold-container: #332200;\n --color-gold-on-container: #ffecb3;\n --color-terracotta: #e1b07e;\n --color-terracotta-container: #3e2817;\n --color-terracotta-on-container: #f5e6d3;\n --color-sodalite: #3d5afe;\n --color-sodalite-container: #0d1442;\n --color-sodalite-on-container: #c5cae9;\n --color-copper: #ff8a65;\n --color-copper-container: #3a1a0e;\n --color-copper-on-container: #ffd3c2;\n\n /* Seven Heritage tones — dark */\n --heritage-indigo: #7986cb;\n --heritage-savanna: #e5c158;\n --heritage-baobab: #a1887f;\n --heritage-sunset: #ff7043;\n --heritage-river: #4dd0e1;\n --heritage-hematite: #90a4ae;\n --heritage-kalahari: #e8d9b5;\n\n /* The Experimental Seven — dark */\n --exp-ember: #da8766;\n --exp-ember-container: #352721;\n --exp-ember-on: #eba68a;\n --exp-ember-ui: #bb562d;\n --exp-acacia: #93a528;\n --exp-acacia-container: #333521;\n --exp-acacia-on: #b6ce23;\n --exp-acacia-ui: #768420;\n --exp-fern: #2cb42b;\n --exp-fern-container: #213521;\n --exp-fern-on: #28db28;\n --exp-fern-ui: #228d22;\n --exp-lagoon: #2aae9b;\n --exp-lagoon-container: #213532;\n --exp-lagoon-on: #24d6bc;\n --exp-lagoon-ui: #218a7a;\n --exp-storm: #7e9be0;\n --exp-storm-container: #212735;\n --exp-storm-on: #99b2ee;\n --exp-storm-ui: #426cd1;\n --exp-dusk: #ba87e2;\n --exp-dusk-container: #2d2135;\n --exp-dusk-on: #cc9fef;\n --exp-dusk-ui: #9749d3;\n --exp-protea: #df7bb4;\n --exp-protea-container: #35212d;\n --exp-protea-on: #ed98c9;\n --exp-protea-ui: #ca3188;\n}\n\n@media (prefers-color-scheme: dark) {\n :root:not(.light) {\n /* Seven African Minerals — dark */\n --color-cobalt: #00b0ff;\n --color-cobalt-container: #001f3f;\n --color-cobalt-on-container: #b3e5fc;\n --color-tanzanite: #b388ff;\n --color-tanzanite-container: #1a0033;\n --color-tanzanite-on-container: #e1bee7;\n --color-malachite: #64ffda;\n --color-malachite-container: #00251a;\n --color-malachite-on-container: #a7ffeb;\n --color-gold: #ffd740;\n --color-gold-container: #332200;\n --color-gold-on-container: #ffecb3;\n --color-terracotta: #e1b07e;\n --color-terracotta-container: #3e2817;\n --color-terracotta-on-container: #f5e6d3;\n --color-sodalite: #3d5afe;\n --color-sodalite-container: #0d1442;\n --color-sodalite-on-container: #c5cae9;\n --color-copper: #ff8a65;\n --color-copper-container: #3a1a0e;\n --color-copper-on-container: #ffd3c2;\n\n /* Seven Heritage tones — dark */\n --heritage-indigo: #7986cb;\n --heritage-savanna: #e5c158;\n --heritage-baobab: #a1887f;\n --heritage-sunset: #ff7043;\n --heritage-river: #4dd0e1;\n --heritage-hematite: #90a4ae;\n --heritage-kalahari: #e8d9b5;\n\n /* The Experimental Seven — dark */\n --exp-ember: #da8766;\n --exp-ember-container: #352721;\n --exp-ember-on: #eba68a;\n --exp-ember-ui: #bb562d;\n --exp-acacia: #93a528;\n --exp-acacia-container: #333521;\n --exp-acacia-on: #b6ce23;\n --exp-acacia-ui: #768420;\n --exp-fern: #2cb42b;\n --exp-fern-container: #213521;\n --exp-fern-on: #28db28;\n --exp-fern-ui: #228d22;\n --exp-lagoon: #2aae9b;\n --exp-lagoon-container: #213532;\n --exp-lagoon-on: #24d6bc;\n --exp-lagoon-ui: #218a7a;\n --exp-storm: #7e9be0;\n --exp-storm-container: #212735;\n --exp-storm-on: #99b2ee;\n --exp-storm-ui: #426cd1;\n --exp-dusk: #ba87e2;\n --exp-dusk-container: #2d2135;\n --exp-dusk-on: #cc9fef;\n --exp-dusk-ui: #9749d3;\n --exp-protea: #df7bb4;\n --exp-protea-container: #35212d;\n --exp-protea-on: #ed98c9;\n --exp-protea-ui: #ca3188;\n }\n}\n"
62
+ },
63
+ {
64
+ "path": "tokens/palette.json",
65
+ "mimeType": "application/json",
66
+ "bytes": 9103,
67
+ "encoding": "utf8",
68
+ "content": "{\n \"_generated\": \"DO NOT EDIT — scripts/generate-tokens.mjs\",\n \"_source\": \"palette.canonical.json (mzizi-dev/mzizi-registry → lib/tokens/palette.source.ts)\",\n \"_check\": \"node scripts/generate-tokens.mjs --check\",\n \"doctrineVersion\": \"4.1.0\",\n \"families\": {\n \"minerals\": 7,\n \"heritage\": 7,\n \"experimental\": 7,\n \"total\": 21\n },\n \"cssVarConvention\": {\n \"mineral\": \"--color-<name>\",\n \"mineralContainer\": \"--color-<name>-container\",\n \"mineralOnContainer\": \"--color-<name>-on-container\",\n \"heritage\": \"--color-<name> (aliases --heritage-<name>)\",\n \"experimental\": \"--exp-<name>, --exp-<name>-container, --exp-<name>-on, --exp-<name>-ui\"\n },\n \"minerals\": [\n {\n \"name\": \"cobalt\",\n \"role\": \"Knowledge\",\n \"family\": \"deep-earth\",\n \"cssVar\": \"--color-cobalt\",\n \"lightHex\": \"#0047AB\",\n \"darkHex\": \"#00B0FF\",\n \"containerLight\": \"#E3F2FD\",\n \"containerDark\": \"#001F3F\",\n \"onContainerLight\": \"#002966\",\n \"onContainerDark\": \"#B3E5FC\",\n \"sortOrder\": 0,\n \"origin\": \"Katanga (DRC) and Zambian Copperbelt\",\n \"symbolism\": \"Digital future, trust, knowledge\",\n \"usage\": \"Primary blue, links, CTAs\"\n },\n {\n \"name\": \"tanzanite\",\n \"role\": \"Identity\",\n \"family\": \"deep-earth\",\n \"cssVar\": \"--color-tanzanite\",\n \"lightHex\": \"#4B0082\",\n \"darkHex\": \"#B388FF\",\n \"containerLight\": \"#F3E5F5\",\n \"containerDark\": \"#1A0033\",\n \"onContainerLight\": \"#2E004D\",\n \"onContainerDark\": \"#E1BEE7\",\n \"sortOrder\": 1,\n \"origin\": \"Merelani Hills, Tanzania\",\n \"symbolism\": \"Premium, creativity, connection\",\n \"usage\": \"Purple accent, brand/logo, social features\"\n },\n {\n \"name\": \"malachite\",\n \"role\": \"Growth\",\n \"family\": \"deep-earth\",\n \"cssVar\": \"--color-malachite\",\n \"lightHex\": \"#004D40\",\n \"darkHex\": \"#64FFDA\",\n \"containerLight\": \"#E0F2F1\",\n \"containerDark\": \"#00251A\",\n \"onContainerLight\": \"#00332B\",\n \"onContainerDark\": \"#A7FFEB\",\n \"sortOrder\": 2,\n \"origin\": \"Congo Copper Belt\",\n \"symbolism\": \"Growth, nature, success\",\n \"usage\": \"Success states, positive actions\"\n },\n {\n \"name\": \"gold\",\n \"role\": \"Value\",\n \"family\": \"hand\",\n \"cssVar\": \"--color-gold\",\n \"lightHex\": \"#5D4037\",\n \"darkHex\": \"#FFD740\",\n \"containerLight\": \"#FFF8E1\",\n \"containerDark\": \"#332200\",\n \"onContainerLight\": \"#3E2723\",\n \"onContainerDark\": \"#FFECB3\",\n \"sortOrder\": 3,\n \"origin\": \"Ghana, South Africa, Mali\",\n \"symbolism\": \"Honey, rewards, warmth\",\n \"usage\": \"Achievements, rewards, highlights\"\n },\n {\n \"name\": \"terracotta\",\n \"role\": \"Community\",\n \"family\": \"hand\",\n \"cssVar\": \"--color-terracotta\",\n \"lightHex\": \"#A0522D\",\n \"darkHex\": \"#E1B07E\",\n \"containerLight\": \"#F5E6D3\",\n \"containerDark\": \"#3E2817\",\n \"onContainerLight\": \"#5D2906\",\n \"onContainerDark\": \"#F5E6D3\",\n \"sortOrder\": 4,\n \"origin\": \"Pan-African Sahel\",\n \"symbolism\": \"Earth, community, grounding\",\n \"usage\": \"Community features, warmth\"\n },\n {\n \"name\": \"sodalite\",\n \"role\": \"Intelligence\",\n \"family\": \"deep-earth\",\n \"cssVar\": \"--color-sodalite\",\n \"lightHex\": \"#283593\",\n \"darkHex\": \"#3D5AFE\",\n \"containerLight\": \"#E8EAF6\",\n \"containerDark\": \"#0D1442\",\n \"onContainerLight\": \"#141A5C\",\n \"onContainerDark\": \"#C5CAE9\",\n \"sortOrder\": 5,\n \"origin\": \"Kunene River, Namibia & South Africa\",\n \"symbolism\": \"Intelligence, depth, reasoning\",\n \"usage\": \"AI/Shamwari surfaces, deep-reasoning states\"\n },\n {\n \"name\": \"copper\",\n \"role\": \"Stewardship\",\n \"family\": \"hand\",\n \"cssVar\": \"--color-copper\",\n \"lightHex\": \"#BF5A36\",\n \"darkHex\": \"#FF8A65\",\n \"containerLight\": \"#FBE4DA\",\n \"containerDark\": \"#3A1A0E\",\n \"onContainerLight\": \"#5C2410\",\n \"onContainerDark\": \"#FFD3C2\",\n \"sortOrder\": 6,\n \"origin\": \"Central African Copperbelt, Zambia & DRC\",\n \"symbolism\": \"Connection, foundation, stewardship\",\n \"usage\": \"Bundu ecosystem identity, the commons\"\n }\n ],\n \"heritage\": [\n {\n \"name\": \"indigo\",\n \"cssVar\": \"--color-indigo\",\n \"lightHex\": \"#4527A0\",\n \"darkHex\": \"#7986CB\",\n \"sortOrder\": 0,\n \"origin\": \"Indigofera, West Africa textile tradition\",\n \"symbolism\": \"Dusk, depth, the dyer's craft\",\n \"usage\": \"Twilight surfaces, deep atmosphere, mini-app moods\"\n },\n {\n \"name\": \"savanna\",\n \"cssVar\": \"--color-savanna\",\n \"lightHex\": \"#8D6E1A\",\n \"darkHex\": \"#E5C158\",\n \"sortOrder\": 1,\n \"origin\": \"Sub-Saharan grasslands\",\n \"symbolism\": \"Sun-dried grass, open land, the dry season\",\n \"usage\": \"Warm grassland surfaces, daylight atmosphere\"\n },\n {\n \"name\": \"baobab\",\n \"cssVar\": \"--color-baobab\",\n \"lightHex\": \"#4E342E\",\n \"darkHex\": \"#A1887F\",\n \"sortOrder\": 2,\n \"origin\": \"Adansonia, across the African continent\",\n \"symbolism\": \"The tree of life, age, shelter\",\n \"usage\": \"Earthy surfaces, grounded atmosphere, bark tones\"\n },\n {\n \"name\": \"sunset\",\n \"cssVar\": \"--color-sunset\",\n \"lightHex\": \"#D84315\",\n \"darkHex\": \"#FF7043\",\n \"sortOrder\": 3,\n \"origin\": \"The African horizon at dusk\",\n \"symbolism\": \"Day's end, warmth, the gathering hour\",\n \"usage\": \"Warm accent surfaces, golden-hour atmosphere\"\n },\n {\n \"name\": \"river\",\n \"cssVar\": \"--color-river\",\n \"lightHex\": \"#006064\",\n \"darkHex\": \"#4DD0E1\",\n \"sortOrder\": 4,\n \"origin\": \"The great African rivers — Zambezi, Nile, Congo\",\n \"symbolism\": \"Flow, life, the journey\",\n \"usage\": \"Cool surfaces, flowing atmosphere, water tones\"\n },\n {\n \"name\": \"hematite\",\n \"cssVar\": \"--color-hematite\",\n \"lightHex\": \"#546E7A\",\n \"darkHex\": \"#90A4AE\",\n \"sortOrder\": 5,\n \"origin\": \"Sishen & Thabazimbi, South Africa\",\n \"symbolism\": \"Foundation, endurance, the substrate\",\n \"usage\": \"Neutral anchor, mini-app surfaces, atmosphere\"\n },\n {\n \"name\": \"kalahari\",\n \"cssVar\": \"--color-kalahari\",\n \"lightHex\": \"#C9B589\",\n \"darkHex\": \"#E8D9B5\",\n \"sortOrder\": 6,\n \"origin\": \"Kalahari & Namib, Southern Africa\",\n \"symbolism\": \"Openness, space, the light pole\",\n \"usage\": \"Light anchor, warm backgrounds, mini-app surfaces\"\n }\n ],\n \"experimental\": [\n {\n \"name\": \"ember\",\n \"cssVar\": \"--exp-ember\",\n \"lightHex\": \"#843D20\",\n \"darkHex\": \"#DA8766\",\n \"containerLight\": \"#EBDFDB\",\n \"containerDark\": \"#352721\",\n \"onContainerLight\": \"#7A3115\",\n \"onContainerDark\": \"#EBA68A\",\n \"uiLight\": \"#CD5F33\",\n \"uiDark\": \"#BB562D\",\n \"heptagonIndex\": 0,\n \"sortOrder\": 0\n },\n {\n \"name\": \"acacia\",\n \"cssVar\": \"--exp-acacia\",\n \"lightHex\": \"#4D5615\",\n \"darkHex\": \"#93A528\",\n \"containerLight\": \"#E9EBDB\",\n \"containerDark\": \"#333521\",\n \"onContainerLight\": \"#48510E\",\n \"onContainerDark\": \"#B6CE23\",\n \"uiLight\": \"#7E8C22\",\n \"uiDark\": \"#768420\",\n \"heptagonIndex\": 1,\n \"sortOrder\": 1\n },\n {\n \"name\": \"fern\",\n \"cssVar\": \"--exp-fern\",\n \"lightHex\": \"#175E17\",\n \"darkHex\": \"#2CB42B\",\n \"containerLight\": \"#DBEBDB\",\n \"containerDark\": \"#213521\",\n \"onContainerLight\": \"#0F570F\",\n \"onContainerDark\": \"#28DB28\",\n \"uiLight\": \"#259725\",\n \"uiDark\": \"#228D22\",\n \"heptagonIndex\": 2,\n \"sortOrder\": 2\n },\n {\n \"name\": \"lagoon\",\n \"cssVar\": \"--exp-lagoon\",\n \"lightHex\": \"#165B51\",\n \"darkHex\": \"#2AAE9B\",\n \"containerLight\": \"#DBEBE9\",\n \"containerDark\": \"#213532\",\n \"onContainerLight\": \"#0E554B\",\n \"onContainerDark\": \"#24D6BC\",\n \"uiLight\": \"#249383\",\n \"uiDark\": \"#218A7A\",\n \"heptagonIndex\": 3,\n \"sortOrder\": 3\n },\n {\n \"name\": \"storm\",\n \"cssVar\": \"--exp-storm\",\n \"lightHex\": \"#284CA6\",\n \"darkHex\": \"#7E9BE0\",\n \"containerLight\": \"#DBE0EB\",\n \"containerDark\": \"#212735\",\n \"onContainerLight\": \"#1A409B\",\n \"onContainerDark\": \"#99B2EE\",\n \"uiLight\": \"#577BD6\",\n \"uiDark\": \"#426CD1\",\n \"heptagonIndex\": 4,\n \"sortOrder\": 4\n },\n {\n \"name\": \"dusk\",\n \"cssVar\": \"--exp-dusk\",\n \"lightHex\": \"#742AAD\",\n \"darkHex\": \"#BA87E2\",\n \"containerLight\": \"#E4DBEB\",\n \"containerDark\": \"#2D2135\",\n \"onContainerLight\": \"#661B9E\",\n \"onContainerDark\": \"#CC9FEF\",\n \"uiLight\": \"#A35DD8\",\n \"uiDark\": \"#9749D3\",\n \"heptagonIndex\": 5,\n \"sortOrder\": 5\n },\n {\n \"name\": \"protea\",\n \"cssVar\": \"--exp-protea\",\n \"lightHex\": \"#932464\",\n \"darkHex\": \"#DF7BB4\",\n \"containerLight\": \"#EBDBE4\",\n \"containerDark\": \"#35212D\",\n \"onContainerLight\": \"#841656\",\n \"onContainerDark\": \"#ED98C9\",\n \"uiLight\": \"#D34998\",\n \"uiDark\": \"#CA3188\",\n \"heptagonIndex\": 6,\n \"sortOrder\": 6\n }\n ]\n}\n"
69
+ }
70
+ ]
71
+ },
72
+ {
73
+ "name": "mukoko-design",
74
+ "category": "design",
75
+ "description": "mukoko's brand files and the rules for them: the Seed of Life mark (the Swarm) in the seven minerals with tanzanite at the core, copied byte for byte from mukoko-dev/mukoko-news public/ (the source of truth, which mukoko-weather and mukoko-events pin by hash): the full-palette mark light and dark, the app icon on deep tanzanite, the paper icon, the favicon set (favicon.svg with its own ground, 16 and 32 PNG, .ico, apple-touch-icon) and the lowercase serif lockup; plus the honeycomb backgrounds and the 1080x1920 splash carried over from before 0.8.0. SOURCES.md names every file's source and SHA-256, and a test holds them to it. The rules: the full-palette mark is the only icon at every size, with no mono or single-colour reduction; never recolour, reorder, add a gradient or shadow, or redraw; the wordmark is always lowercase mukoko in Noto Serif 600. Meanings from mzizi_get_tokens. For the 21-family palette, tokens and UI use mzizi-design.",
76
+ "body_mdx": "# mukoko design: the Swarm\n\nThe visual identity of **mukoko**, the hive at the centre of the Bundu ecosystem: _nyuchi is the\nbee, mukoko is the hive_. This skill ships Mukoko's brand files and the rules for using them.\n\n**Where the files come from.** Everything under `mark/`, `lockup/`, `app-icon/` and `favicon/`\nis copied byte for byte from `public/` in\n[`mukoko-dev/mukoko-news`](https://github.com/mukoko-dev/mukoko-news). That repository is the\nsource of truth for the mark and the icons, and mukoko-weather and mukoko-events ship\nbyte-identical copies pinned by hash tests. `SOURCES.md` names each file's source and its\nSHA-256, and `scripts/mukoko-design.test.sh` fails when a file here stops matching it. To change\nan icon, change it in mukoko-news first and then copy it here. Never redraw one.\n\nThe colours come from the Mzizi palette (`mzizi_get_tokens` on the Mzizi MCP, and\n`palette.canonical.json` in this package). Tokens, stylesheets, the 21 families and UI rules are\nin the `mzizi-design` skill. This skill does not duplicate them.\n\n## The idea\n\nThe mark is the **Seed of Life**: one centre cell ringed by six, the first complete ring of the\nhoneycomb, rendered in the **seven African Minerals**.\n\n> **Tanzanite at the core** (mukoko, the brand), ringed by the six minerals of the ecosystem.\n> One hive holding the whole. **Ndiri nekuti tiri**: _I am because we are._\n\nIt is a known geometric figure, like the Olympic rings, made Mukoko's through the mineral palette\nand the meaning. mukoko's mark is the hive, never a bee; the bee is nyuchi's.\n\n## The seven minerals of the mark\n\nThe meanings are `symbolism` from `mzizi_get_tokens`. The `light` value is used on light\nsurfaces, and the `dark` value on dark ones:\n\n| Mineral | Light | Dark | Meaning |\n| ------------- | --------- | --------- | ----------------------------------- |\n| cobalt | `#0047AB` | `#00B0FF` | Digital future, trust, knowledge |\n| **tanzanite** | `#4B0082` | `#B388FF` | Premium, creativity, connection |\n| malachite | `#004D40` | `#64FFDA` | Growth, nature, success |\n| gold | `#5D4037` | `#FFD740` | Honey, rewards, warmth |\n| terracotta | `#A0522D` | `#E1B07E` | Earth, community, grounding |\n| sodalite | `#283593` | `#3D5AFE` | Intelligence, depth, reasoning |\n| copper | `#BF5A36` | `#FF8A65` | Connection, foundation, stewardship |\n\n**The ring, as the canonical files draw it.** Tanzanite sits in the centre. Clockwise from the\ntop cell, the ring runs **sodalite, terracotta, cobalt, gold, malachite, copper**, alternating\ncool and warm. The files are the reference; never reorder the ring.\n\n**The seven minerals are the mark, not the palette.** The Mzizi palette has 21 families: these\nseven, the seven Heritage tones and the Experimental Seven (`mzizi-design`). Build pages, decks\nand mini-app surfaces from the palette and the semantic tokens. Do not build them from the mark's\nseven colours alone.\n\n## Files\n\n```text\nmark/ mukoko-mark-full-light.svg, mukoko-mark-full-dark.svg\n The bare full-palette mark on a transparent ground. Light minerals on light\n surfaces, dark minerals on dark ones.\nlockup/ mukoko-lockup-light.svg, mukoko-lockup-dark.svg\n The mark plus the lowercase `mukoko` wordmark in Noto Serif 600.\napp-icon/ mukoko-appicon.png the app icon: the full mark on the deep tanzanite\n ground (`#1A0033`). The favicons are downscaled from it.\n mukoko-appicon-paper.png the full mark on a paper ground, for light stores and surfaces\nfavicon/ favicon.svg (carries its own ground, so one file serves both browser themes),\n favicon-16.png, favicon-32.png, favicon.ico (16/32/48), apple-touch-icon.png (180)\nbackgrounds/ honeycomb-grain-paper.svg faint tanzanite outline texture for body and empty states\n honeycomb-tanzanite-header.svg header and email band\n honeycomb-pattern-full.svg the full-mineral tile for heroes and social backdrops\n honeycomb-splash-stone.svg / -1080x1920.png launch screen: mark centred, wordmark below\nSOURCES.md each file's source and SHA-256\n```\n\nOn the web, link the favicons as mukoko-news does:\n\n```html\n<link rel=\"icon\" href=\"/favicon.ico\" sizes=\"48x48\" />\n<link rel=\"icon\" type=\"image/svg+xml\" href=\"/favicon.svg\" />\n<link rel=\"apple-touch-icon\" href=\"/apple-touch-icon.png\" />\n```\n\n## Rules for the mark\n\nThese rules are owner doctrine, recorded in mukoko-news `CLAUDE.md` under \"Design System\". They\noverride every earlier version of this skill.\n\n- **The full-palette mark is the only icon, at every size.** There is no mono, single-colour or\n knockout reduction, at 16px or anywhere else. The favicons are the full mark.\n - **Why (owner correction, 2026-09-01).** A mono tanzanite favicon made the browser tab a\n solid purple blob that looked like a different product.\n - **Withdrawn.** The mono marks and the mono tanzanite app icon were withdrawn so they cannot\n be wired up again. Do not recreate them.\n- **The app icon is `app-icon/mukoko-appicon.png`**: the mark on deep tanzanite (`#1A0033`).\n The browser tab, the installed app and every other surface carry the same artwork.\n- **Never** add gradients, shadows, glows or outlines. Never recolour a cell, reorder the ring,\n or rotate, stretch or rearrange the cells.\n- **Clear space** is one cell-radius on all sides. Nothing else goes inside it.\n- **The wordmark is always lowercase**: `mukoko`, never `Mukoko` or `MUKOKO`. It is set in Noto\n Serif 600. UI text is Noto Sans; code and labels are JetBrains Mono. Product names are names,\n not wordmarks (\"Mukoko Events\", \"Mukoko News\").\n- **Use the files.** Scale the SVGs freely. Export other PNG sizes from `mukoko-appicon.png` or\n the SVGs. Never trace or redraw the mark.\n\n## The backgrounds\n\nThe honeycomb backgrounds and the splash come from this skill's last version before 0.8.0. No\nlive surface ships them, so they are carried over unchanged. Their ground colours predate today's\nMzizi surface scale (`mzizi_get_tokens`, `backgrounds`). When one sits behind content, check its\nground against the surface it replaces. Where it clashes, set the pattern over\n`var(--background)` and do not hand-pick a hex. If a background needs a new ground, change it\nhere in a reviewed PR and record the reason in `SOURCES.md`.\n\n## If invoked with no other guidance\n\n1. Ask what is needed: a logo export, an app icon, a favicon set, a social or launch asset, a\n splash screen or a header band.\n2. Confirm whether the surface is light or dark.\n3. Hand over the file from this skill, or export a size from it.\n4. For anything beyond the brand files (a page, a component, a palette question), go to\n `mzizi-design`.\n\n_mukoko: the hive that holds the whole._",
77
+ "source": "mzizi-dev/agent-tools/mzizi-skills/skills/mukoko-design",
78
+ "files": [
79
+ {
80
+ "path": "app-icon/mukoko-appicon-paper.png",
81
+ "mimeType": "image/png",
82
+ "bytes": 51887,
83
+ "encoding": "base64",
84
+ "content": "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"
85
+ },
86
+ {
87
+ "path": "app-icon/mukoko-appicon.png",
88
+ "mimeType": "image/png",
89
+ "bytes": 49157,
90
+ "encoding": "base64",
91
+ "content": "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"
92
+ },
93
+ {
94
+ "path": "backgrounds/honeycomb-grain-paper.svg",
95
+ "mimeType": "image/svg+xml",
96
+ "bytes": 58365,
97
+ "encoding": "utf8",
98
+ "content": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1600 900\" width=\"1600\" height=\"900\"><rect width=\"1600\" height=\"900\" fill=\"#F3F2EE\"/><polygon points=\"0.000,-46.000 -23.000,-6.163 -69.000,-6.163 -92.000,-46.000 -69.000,-85.837 -23.000,-85.837\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"0.000,33.674 -23.000,73.512 -69.000,73.512 -92.000,33.674 -69.000,-6.163 -23.000,-6.163\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"0.000,113.349 -23.000,153.186 -69.000,153.186 -92.000,113.349 -69.000,73.512 -23.000,73.512\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"0.000,193.023 -23.000,232.860 -69.000,232.860 -92.000,193.023 -69.000,153.186 -23.000,153.186\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"0.000,272.697 -23.000,312.535 -69.000,312.535 -92.000,272.697 -69.000,232.860 -23.000,232.860\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"0.000,352.372 -23.000,392.209 -69.000,392.209 -92.000,352.372 -69.000,312.535 -23.000,312.535\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"0.000,432.046 -23.000,471.883 -69.000,471.883 -92.000,432.046 -69.000,392.209 -23.000,392.209\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"0.000,511.720 -23.000,551.558 -69.000,551.558 -92.000,511.720 -69.000,471.883 -23.000,471.883\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"0.000,591.395 -23.000,631.232 -69.000,631.232 -92.000,591.395 -69.000,551.558 -23.000,551.558\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"0.000,671.069 -23.000,710.906 -69.000,710.906 -92.000,671.069 -69.000,631.232 -23.000,631.232\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"0.000,750.743 -23.000,790.581 -69.000,790.581 -92.000,750.743 -69.000,710.906 -23.000,710.906\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"0.000,830.418 -23.000,870.255 -69.000,870.255 -92.000,830.418 -69.000,790.581 -23.000,790.581\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"0.000,910.092 -23.000,949.929 -69.000,949.929 -92.000,910.092 -69.000,870.255 -23.000,870.255\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"69.000,-6.163 46.000,33.674 0.000,33.674 -23.000,-6.163 -0.000,-46.000 46.000,-46.000\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"69.000,73.512 46.000,113.349 0.000,113.349 -23.000,73.512 -0.000,33.674 46.000,33.674\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"69.000,153.186 46.000,193.023 0.000,193.023 -23.000,153.186 -0.000,113.349 46.000,113.349\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"69.000,232.860 46.000,272.697 0.000,272.697 -23.000,232.860 -0.000,193.023 46.000,193.023\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"69.000,312.535 46.000,352.372 0.000,352.372 -23.000,312.535 -0.000,272.697 46.000,272.697\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"69.000,392.209 46.000,432.046 0.000,432.046 -23.000,392.209 -0.000,352.372 46.000,352.372\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"69.000,471.883 46.000,511.720 0.000,511.720 -23.000,471.883 -0.000,432.046 46.000,432.046\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"69.000,551.558 46.000,591.395 0.000,591.395 -23.000,551.558 -0.000,511.720 46.000,511.720\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"69.000,631.232 46.000,671.069 0.000,671.069 -23.000,631.232 -0.000,591.395 46.000,591.395\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"69.000,710.906 46.000,750.743 0.000,750.743 -23.000,710.906 -0.000,671.069 46.000,671.069\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"69.000,790.581 46.000,830.418 0.000,830.418 -23.000,790.581 -0.000,750.743 46.000,750.743\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"69.000,870.255 46.000,910.092 0.000,910.092 -23.000,870.255 -0.000,830.418 46.000,830.418\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"69.000,949.929 46.000,989.766 0.000,989.766 -23.000,949.929 -0.000,910.092 46.000,910.092\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"138.000,-46.000 115.000,-6.163 69.000,-6.163 46.000,-46.000 69.000,-85.837 115.000,-85.837\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"138.000,33.674 115.000,73.512 69.000,73.512 46.000,33.674 69.000,-6.163 115.000,-6.163\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"138.000,113.349 115.000,153.186 69.000,153.186 46.000,113.349 69.000,73.512 115.000,73.512\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"138.000,193.023 115.000,232.860 69.000,232.860 46.000,193.023 69.000,153.186 115.000,153.186\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"138.000,272.697 115.000,312.535 69.000,312.535 46.000,272.697 69.000,232.860 115.000,232.860\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"138.000,352.372 115.000,392.209 69.000,392.209 46.000,352.372 69.000,312.535 115.000,312.535\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"138.000,432.046 115.000,471.883 69.000,471.883 46.000,432.046 69.000,392.209 115.000,392.209\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"138.000,511.720 115.000,551.558 69.000,551.558 46.000,511.720 69.000,471.883 115.000,471.883\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"138.000,591.395 115.000,631.232 69.000,631.232 46.000,591.395 69.000,551.558 115.000,551.558\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"138.000,671.069 115.000,710.906 69.000,710.906 46.000,671.069 69.000,631.232 115.000,631.232\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"138.000,750.743 115.000,790.581 69.000,790.581 46.000,750.743 69.000,710.906 115.000,710.906\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"138.000,830.418 115.000,870.255 69.000,870.255 46.000,830.418 69.000,790.581 115.000,790.581\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"138.000,910.092 115.000,949.929 69.000,949.929 46.000,910.092 69.000,870.255 115.000,870.255\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"207.000,-6.163 184.000,33.674 138.000,33.674 115.000,-6.163 138.000,-46.000 184.000,-46.000\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"207.000,73.512 184.000,113.349 138.000,113.349 115.000,73.512 138.000,33.674 184.000,33.674\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"207.000,153.186 184.000,193.023 138.000,193.023 115.000,153.186 138.000,113.349 184.000,113.349\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"207.000,232.860 184.000,272.697 138.000,272.697 115.000,232.860 138.000,193.023 184.000,193.023\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"207.000,312.535 184.000,352.372 138.000,352.372 115.000,312.535 138.000,272.697 184.000,272.697\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"207.000,392.209 184.000,432.046 138.000,432.046 115.000,392.209 138.000,352.372 184.000,352.372\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"207.000,471.883 184.000,511.720 138.000,511.720 115.000,471.883 138.000,432.046 184.000,432.046\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"207.000,551.558 184.000,591.395 138.000,591.395 115.000,551.558 138.000,511.720 184.000,511.720\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"207.000,631.232 184.000,671.069 138.000,671.069 115.000,631.232 138.000,591.395 184.000,591.395\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"207.000,710.906 184.000,750.743 138.000,750.743 115.000,710.906 138.000,671.069 184.000,671.069\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"207.000,790.581 184.000,830.418 138.000,830.418 115.000,790.581 138.000,750.743 184.000,750.743\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"207.000,870.255 184.000,910.092 138.000,910.092 115.000,870.255 138.000,830.418 184.000,830.418\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"207.000,949.929 184.000,989.766 138.000,989.766 115.000,949.929 138.000,910.092 184.000,910.092\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"276.000,-46.000 253.000,-6.163 207.000,-6.163 184.000,-46.000 207.000,-85.837 253.000,-85.837\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"276.000,33.674 253.000,73.512 207.000,73.512 184.000,33.674 207.000,-6.163 253.000,-6.163\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"276.000,113.349 253.000,153.186 207.000,153.186 184.000,113.349 207.000,73.512 253.000,73.512\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"276.000,193.023 253.000,232.860 207.000,232.860 184.000,193.023 207.000,153.186 253.000,153.186\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"276.000,272.697 253.000,312.535 207.000,312.535 184.000,272.697 207.000,232.860 253.000,232.860\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"276.000,352.372 253.000,392.209 207.000,392.209 184.000,352.372 207.000,312.535 253.000,312.535\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"276.000,432.046 253.000,471.883 207.000,471.883 184.000,432.046 207.000,392.209 253.000,392.209\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"276.000,511.720 253.000,551.558 207.000,551.558 184.000,511.720 207.000,471.883 253.000,471.883\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"276.000,591.395 253.000,631.232 207.000,631.232 184.000,591.395 207.000,551.558 253.000,551.558\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"276.000,671.069 253.000,710.906 207.000,710.906 184.000,671.069 207.000,631.232 253.000,631.232\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"276.000,750.743 253.000,790.581 207.000,790.581 184.000,750.743 207.000,710.906 253.000,710.906\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"276.000,830.418 253.000,870.255 207.000,870.255 184.000,830.418 207.000,790.581 253.000,790.581\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"276.000,910.092 253.000,949.929 207.000,949.929 184.000,910.092 207.000,870.255 253.000,870.255\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"345.000,-6.163 322.000,33.674 276.000,33.674 253.000,-6.163 276.000,-46.000 322.000,-46.000\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"345.000,73.512 322.000,113.349 276.000,113.349 253.000,73.512 276.000,33.674 322.000,33.674\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"345.000,153.186 322.000,193.023 276.000,193.023 253.000,153.186 276.000,113.349 322.000,113.349\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"345.000,232.860 322.000,272.697 276.000,272.697 253.000,232.860 276.000,193.023 322.000,193.023\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"345.000,312.535 322.000,352.372 276.000,352.372 253.000,312.535 276.000,272.697 322.000,272.697\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"345.000,392.209 322.000,432.046 276.000,432.046 253.000,392.209 276.000,352.372 322.000,352.372\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"345.000,471.883 322.000,511.720 276.000,511.720 253.000,471.883 276.000,432.046 322.000,432.046\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"345.000,551.558 322.000,591.395 276.000,591.395 253.000,551.558 276.000,511.720 322.000,511.720\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"345.000,631.232 322.000,671.069 276.000,671.069 253.000,631.232 276.000,591.395 322.000,591.395\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"345.000,710.906 322.000,750.743 276.000,750.743 253.000,710.906 276.000,671.069 322.000,671.069\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"345.000,790.581 322.000,830.418 276.000,830.418 253.000,790.581 276.000,750.743 322.000,750.743\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"345.000,870.255 322.000,910.092 276.000,910.092 253.000,870.255 276.000,830.418 322.000,830.418\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"345.000,949.929 322.000,989.766 276.000,989.766 253.000,949.929 276.000,910.092 322.000,910.092\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"414.000,-46.000 391.000,-6.163 345.000,-6.163 322.000,-46.000 345.000,-85.837 391.000,-85.837\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"414.000,33.674 391.000,73.512 345.000,73.512 322.000,33.674 345.000,-6.163 391.000,-6.163\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"414.000,113.349 391.000,153.186 345.000,153.186 322.000,113.349 345.000,73.512 391.000,73.512\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"414.000,193.023 391.000,232.860 345.000,232.860 322.000,193.023 345.000,153.186 391.000,153.186\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"414.000,272.697 391.000,312.535 345.000,312.535 322.000,272.697 345.000,232.860 391.000,232.860\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"414.000,352.372 391.000,392.209 345.000,392.209 322.000,352.372 345.000,312.535 391.000,312.535\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"414.000,432.046 391.000,471.883 345.000,471.883 322.000,432.046 345.000,392.209 391.000,392.209\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"414.000,511.720 391.000,551.558 345.000,551.558 322.000,511.720 345.000,471.883 391.000,471.883\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"414.000,591.395 391.000,631.232 345.000,631.232 322.000,591.395 345.000,551.558 391.000,551.558\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"414.000,671.069 391.000,710.906 345.000,710.906 322.000,671.069 345.000,631.232 391.000,631.232\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"414.000,750.743 391.000,790.581 345.000,790.581 322.000,750.743 345.000,710.906 391.000,710.906\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"414.000,830.418 391.000,870.255 345.000,870.255 322.000,830.418 345.000,790.581 391.000,790.581\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"414.000,910.092 391.000,949.929 345.000,949.929 322.000,910.092 345.000,870.255 391.000,870.255\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"483.000,-6.163 460.000,33.674 414.000,33.674 391.000,-6.163 414.000,-46.000 460.000,-46.000\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"483.000,73.512 460.000,113.349 414.000,113.349 391.000,73.512 414.000,33.674 460.000,33.674\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"483.000,153.186 460.000,193.023 414.000,193.023 391.000,153.186 414.000,113.349 460.000,113.349\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"483.000,232.860 460.000,272.697 414.000,272.697 391.000,232.860 414.000,193.023 460.000,193.023\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"483.000,312.535 460.000,352.372 414.000,352.372 391.000,312.535 414.000,272.697 460.000,272.697\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"483.000,392.209 460.000,432.046 414.000,432.046 391.000,392.209 414.000,352.372 460.000,352.372\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"483.000,471.883 460.000,511.720 414.000,511.720 391.000,471.883 414.000,432.046 460.000,432.046\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"483.000,551.558 460.000,591.395 414.000,591.395 391.000,551.558 414.000,511.720 460.000,511.720\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"483.000,631.232 460.000,671.069 414.000,671.069 391.000,631.232 414.000,591.395 460.000,591.395\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"483.000,710.906 460.000,750.743 414.000,750.743 391.000,710.906 414.000,671.069 460.000,671.069\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"483.000,790.581 460.000,830.418 414.000,830.418 391.000,790.581 414.000,750.743 460.000,750.743\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"483.000,870.255 460.000,910.092 414.000,910.092 391.000,870.255 414.000,830.418 460.000,830.418\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"483.000,949.929 460.000,989.766 414.000,989.766 391.000,949.929 414.000,910.092 460.000,910.092\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"552.000,-46.000 529.000,-6.163 483.000,-6.163 460.000,-46.000 483.000,-85.837 529.000,-85.837\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"552.000,33.674 529.000,73.512 483.000,73.512 460.000,33.674 483.000,-6.163 529.000,-6.163\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"552.000,113.349 529.000,153.186 483.000,153.186 460.000,113.349 483.000,73.512 529.000,73.512\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"552.000,193.023 529.000,232.860 483.000,232.860 460.000,193.023 483.000,153.186 529.000,153.186\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"552.000,272.697 529.000,312.535 483.000,312.535 460.000,272.697 483.000,232.860 529.000,232.860\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"552.000,352.372 529.000,392.209 483.000,392.209 460.000,352.372 483.000,312.535 529.000,312.535\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"552.000,432.046 529.000,471.883 483.000,471.883 460.000,432.046 483.000,392.209 529.000,392.209\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"552.000,511.720 529.000,551.558 483.000,551.558 460.000,511.720 483.000,471.883 529.000,471.883\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"552.000,591.395 529.000,631.232 483.000,631.232 460.000,591.395 483.000,551.558 529.000,551.558\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"552.000,671.069 529.000,710.906 483.000,710.906 460.000,671.069 483.000,631.232 529.000,631.232\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"552.000,750.743 529.000,790.581 483.000,790.581 460.000,750.743 483.000,710.906 529.000,710.906\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"552.000,830.418 529.000,870.255 483.000,870.255 460.000,830.418 483.000,790.581 529.000,790.581\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"552.000,910.092 529.000,949.929 483.000,949.929 460.000,910.092 483.000,870.255 529.000,870.255\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"621.000,-6.163 598.000,33.674 552.000,33.674 529.000,-6.163 552.000,-46.000 598.000,-46.000\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"621.000,73.512 598.000,113.349 552.000,113.349 529.000,73.512 552.000,33.674 598.000,33.674\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"621.000,153.186 598.000,193.023 552.000,193.023 529.000,153.186 552.000,113.349 598.000,113.349\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"621.000,232.860 598.000,272.697 552.000,272.697 529.000,232.860 552.000,193.023 598.000,193.023\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"621.000,312.535 598.000,352.372 552.000,352.372 529.000,312.535 552.000,272.697 598.000,272.697\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"621.000,392.209 598.000,432.046 552.000,432.046 529.000,392.209 552.000,352.372 598.000,352.372\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"621.000,471.883 598.000,511.720 552.000,511.720 529.000,471.883 552.000,432.046 598.000,432.046\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"621.000,551.558 598.000,591.395 552.000,591.395 529.000,551.558 552.000,511.720 598.000,511.720\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"621.000,631.232 598.000,671.069 552.000,671.069 529.000,631.232 552.000,591.395 598.000,591.395\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"621.000,710.906 598.000,750.743 552.000,750.743 529.000,710.906 552.000,671.069 598.000,671.069\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"621.000,790.581 598.000,830.418 552.000,830.418 529.000,790.581 552.000,750.743 598.000,750.743\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"621.000,870.255 598.000,910.092 552.000,910.092 529.000,870.255 552.000,830.418 598.000,830.418\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"621.000,949.929 598.000,989.766 552.000,989.766 529.000,949.929 552.000,910.092 598.000,910.092\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"690.000,-46.000 667.000,-6.163 621.000,-6.163 598.000,-46.000 621.000,-85.837 667.000,-85.837\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"690.000,33.674 667.000,73.512 621.000,73.512 598.000,33.674 621.000,-6.163 667.000,-6.163\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"690.000,113.349 667.000,153.186 621.000,153.186 598.000,113.349 621.000,73.512 667.000,73.512\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"690.000,193.023 667.000,232.860 621.000,232.860 598.000,193.023 621.000,153.186 667.000,153.186\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"690.000,272.697 667.000,312.535 621.000,312.535 598.000,272.697 621.000,232.860 667.000,232.860\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"690.000,352.372 667.000,392.209 621.000,392.209 598.000,352.372 621.000,312.535 667.000,312.535\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"690.000,432.046 667.000,471.883 621.000,471.883 598.000,432.046 621.000,392.209 667.000,392.209\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"690.000,511.720 667.000,551.558 621.000,551.558 598.000,511.720 621.000,471.883 667.000,471.883\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"690.000,591.395 667.000,631.232 621.000,631.232 598.000,591.395 621.000,551.558 667.000,551.558\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"690.000,671.069 667.000,710.906 621.000,710.906 598.000,671.069 621.000,631.232 667.000,631.232\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"690.000,750.743 667.000,790.581 621.000,790.581 598.000,750.743 621.000,710.906 667.000,710.906\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"690.000,830.418 667.000,870.255 621.000,870.255 598.000,830.418 621.000,790.581 667.000,790.581\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"690.000,910.092 667.000,949.929 621.000,949.929 598.000,910.092 621.000,870.255 667.000,870.255\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"759.000,-6.163 736.000,33.674 690.000,33.674 667.000,-6.163 690.000,-46.000 736.000,-46.000\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"759.000,73.512 736.000,113.349 690.000,113.349 667.000,73.512 690.000,33.674 736.000,33.674\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"759.000,153.186 736.000,193.023 690.000,193.023 667.000,153.186 690.000,113.349 736.000,113.349\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"759.000,232.860 736.000,272.697 690.000,272.697 667.000,232.860 690.000,193.023 736.000,193.023\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"759.000,312.535 736.000,352.372 690.000,352.372 667.000,312.535 690.000,272.697 736.000,272.697\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"759.000,392.209 736.000,432.046 690.000,432.046 667.000,392.209 690.000,352.372 736.000,352.372\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"759.000,471.883 736.000,511.720 690.000,511.720 667.000,471.883 690.000,432.046 736.000,432.046\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"759.000,551.558 736.000,591.395 690.000,591.395 667.000,551.558 690.000,511.720 736.000,511.720\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"759.000,631.232 736.000,671.069 690.000,671.069 667.000,631.232 690.000,591.395 736.000,591.395\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"759.000,710.906 736.000,750.743 690.000,750.743 667.000,710.906 690.000,671.069 736.000,671.069\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"759.000,790.581 736.000,830.418 690.000,830.418 667.000,790.581 690.000,750.743 736.000,750.743\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"759.000,870.255 736.000,910.092 690.000,910.092 667.000,870.255 690.000,830.418 736.000,830.418\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"759.000,949.929 736.000,989.766 690.000,989.766 667.000,949.929 690.000,910.092 736.000,910.092\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"828.000,-46.000 805.000,-6.163 759.000,-6.163 736.000,-46.000 759.000,-85.837 805.000,-85.837\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"828.000,33.674 805.000,73.512 759.000,73.512 736.000,33.674 759.000,-6.163 805.000,-6.163\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"828.000,113.349 805.000,153.186 759.000,153.186 736.000,113.349 759.000,73.512 805.000,73.512\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"828.000,193.023 805.000,232.860 759.000,232.860 736.000,193.023 759.000,153.186 805.000,153.186\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"828.000,272.697 805.000,312.535 759.000,312.535 736.000,272.697 759.000,232.860 805.000,232.860\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"828.000,352.372 805.000,392.209 759.000,392.209 736.000,352.372 759.000,312.535 805.000,312.535\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"828.000,432.046 805.000,471.883 759.000,471.883 736.000,432.046 759.000,392.209 805.000,392.209\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"828.000,511.720 805.000,551.558 759.000,551.558 736.000,511.720 759.000,471.883 805.000,471.883\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"828.000,591.395 805.000,631.232 759.000,631.232 736.000,591.395 759.000,551.558 805.000,551.558\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"828.000,671.069 805.000,710.906 759.000,710.906 736.000,671.069 759.000,631.232 805.000,631.232\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"828.000,750.743 805.000,790.581 759.000,790.581 736.000,750.743 759.000,710.906 805.000,710.906\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"828.000,830.418 805.000,870.255 759.000,870.255 736.000,830.418 759.000,790.581 805.000,790.581\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"828.000,910.092 805.000,949.929 759.000,949.929 736.000,910.092 759.000,870.255 805.000,870.255\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"897.000,-6.163 874.000,33.674 828.000,33.674 805.000,-6.163 828.000,-46.000 874.000,-46.000\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"897.000,73.512 874.000,113.349 828.000,113.349 805.000,73.512 828.000,33.674 874.000,33.674\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"897.000,153.186 874.000,193.023 828.000,193.023 805.000,153.186 828.000,113.349 874.000,113.349\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"897.000,232.860 874.000,272.697 828.000,272.697 805.000,232.860 828.000,193.023 874.000,193.023\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"897.000,312.535 874.000,352.372 828.000,352.372 805.000,312.535 828.000,272.697 874.000,272.697\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"897.000,392.209 874.000,432.046 828.000,432.046 805.000,392.209 828.000,352.372 874.000,352.372\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"897.000,471.883 874.000,511.720 828.000,511.720 805.000,471.883 828.000,432.046 874.000,432.046\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"897.000,551.558 874.000,591.395 828.000,591.395 805.000,551.558 828.000,511.720 874.000,511.720\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"897.000,631.232 874.000,671.069 828.000,671.069 805.000,631.232 828.000,591.395 874.000,591.395\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"897.000,710.906 874.000,750.743 828.000,750.743 805.000,710.906 828.000,671.069 874.000,671.069\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"897.000,790.581 874.000,830.418 828.000,830.418 805.000,790.581 828.000,750.743 874.000,750.743\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"897.000,870.255 874.000,910.092 828.000,910.092 805.000,870.255 828.000,830.418 874.000,830.418\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"897.000,949.929 874.000,989.766 828.000,989.766 805.000,949.929 828.000,910.092 874.000,910.092\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"966.000,-46.000 943.000,-6.163 897.000,-6.163 874.000,-46.000 897.000,-85.837 943.000,-85.837\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"966.000,33.674 943.000,73.512 897.000,73.512 874.000,33.674 897.000,-6.163 943.000,-6.163\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"966.000,113.349 943.000,153.186 897.000,153.186 874.000,113.349 897.000,73.512 943.000,73.512\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"966.000,193.023 943.000,232.860 897.000,232.860 874.000,193.023 897.000,153.186 943.000,153.186\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"966.000,272.697 943.000,312.535 897.000,312.535 874.000,272.697 897.000,232.860 943.000,232.860\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"966.000,352.372 943.000,392.209 897.000,392.209 874.000,352.372 897.000,312.535 943.000,312.535\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"966.000,432.046 943.000,471.883 897.000,471.883 874.000,432.046 897.000,392.209 943.000,392.209\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"966.000,511.720 943.000,551.558 897.000,551.558 874.000,511.720 897.000,471.883 943.000,471.883\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"966.000,591.395 943.000,631.232 897.000,631.232 874.000,591.395 897.000,551.558 943.000,551.558\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"966.000,671.069 943.000,710.906 897.000,710.906 874.000,671.069 897.000,631.232 943.000,631.232\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"966.000,750.743 943.000,790.581 897.000,790.581 874.000,750.743 897.000,710.906 943.000,710.906\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"966.000,830.418 943.000,870.255 897.000,870.255 874.000,830.418 897.000,790.581 943.000,790.581\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"966.000,910.092 943.000,949.929 897.000,949.929 874.000,910.092 897.000,870.255 943.000,870.255\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1035.000,-6.163 1012.000,33.674 966.000,33.674 943.000,-6.163 966.000,-46.000 1012.000,-46.000\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1035.000,73.512 1012.000,113.349 966.000,113.349 943.000,73.512 966.000,33.674 1012.000,33.674\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1035.000,153.186 1012.000,193.023 966.000,193.023 943.000,153.186 966.000,113.349 1012.000,113.349\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1035.000,232.860 1012.000,272.697 966.000,272.697 943.000,232.860 966.000,193.023 1012.000,193.023\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1035.000,312.535 1012.000,352.372 966.000,352.372 943.000,312.535 966.000,272.697 1012.000,272.697\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1035.000,392.209 1012.000,432.046 966.000,432.046 943.000,392.209 966.000,352.372 1012.000,352.372\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1035.000,471.883 1012.000,511.720 966.000,511.720 943.000,471.883 966.000,432.046 1012.000,432.046\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1035.000,551.558 1012.000,591.395 966.000,591.395 943.000,551.558 966.000,511.720 1012.000,511.720\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1035.000,631.232 1012.000,671.069 966.000,671.069 943.000,631.232 966.000,591.395 1012.000,591.395\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1035.000,710.906 1012.000,750.743 966.000,750.743 943.000,710.906 966.000,671.069 1012.000,671.069\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1035.000,790.581 1012.000,830.418 966.000,830.418 943.000,790.581 966.000,750.743 1012.000,750.743\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1035.000,870.255 1012.000,910.092 966.000,910.092 943.000,870.255 966.000,830.418 1012.000,830.418\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1035.000,949.929 1012.000,989.766 966.000,989.766 943.000,949.929 966.000,910.092 1012.000,910.092\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1104.000,-46.000 1081.000,-6.163 1035.000,-6.163 1012.000,-46.000 1035.000,-85.837 1081.000,-85.837\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1104.000,33.674 1081.000,73.512 1035.000,73.512 1012.000,33.674 1035.000,-6.163 1081.000,-6.163\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1104.000,113.349 1081.000,153.186 1035.000,153.186 1012.000,113.349 1035.000,73.512 1081.000,73.512\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1104.000,193.023 1081.000,232.860 1035.000,232.860 1012.000,193.023 1035.000,153.186 1081.000,153.186\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1104.000,272.697 1081.000,312.535 1035.000,312.535 1012.000,272.697 1035.000,232.860 1081.000,232.860\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1104.000,352.372 1081.000,392.209 1035.000,392.209 1012.000,352.372 1035.000,312.535 1081.000,312.535\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1104.000,432.046 1081.000,471.883 1035.000,471.883 1012.000,432.046 1035.000,392.209 1081.000,392.209\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1104.000,511.720 1081.000,551.558 1035.000,551.558 1012.000,511.720 1035.000,471.883 1081.000,471.883\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1104.000,591.395 1081.000,631.232 1035.000,631.232 1012.000,591.395 1035.000,551.558 1081.000,551.558\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1104.000,671.069 1081.000,710.906 1035.000,710.906 1012.000,671.069 1035.000,631.232 1081.000,631.232\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1104.000,750.743 1081.000,790.581 1035.000,790.581 1012.000,750.743 1035.000,710.906 1081.000,710.906\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1104.000,830.418 1081.000,870.255 1035.000,870.255 1012.000,830.418 1035.000,790.581 1081.000,790.581\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1104.000,910.092 1081.000,949.929 1035.000,949.929 1012.000,910.092 1035.000,870.255 1081.000,870.255\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1173.000,-6.163 1150.000,33.674 1104.000,33.674 1081.000,-6.163 1104.000,-46.000 1150.000,-46.000\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1173.000,73.512 1150.000,113.349 1104.000,113.349 1081.000,73.512 1104.000,33.674 1150.000,33.674\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1173.000,153.186 1150.000,193.023 1104.000,193.023 1081.000,153.186 1104.000,113.349 1150.000,113.349\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1173.000,232.860 1150.000,272.697 1104.000,272.697 1081.000,232.860 1104.000,193.023 1150.000,193.023\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1173.000,312.535 1150.000,352.372 1104.000,352.372 1081.000,312.535 1104.000,272.697 1150.000,272.697\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1173.000,392.209 1150.000,432.046 1104.000,432.046 1081.000,392.209 1104.000,352.372 1150.000,352.372\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1173.000,471.883 1150.000,511.720 1104.000,511.720 1081.000,471.883 1104.000,432.046 1150.000,432.046\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1173.000,551.558 1150.000,591.395 1104.000,591.395 1081.000,551.558 1104.000,511.720 1150.000,511.720\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1173.000,631.232 1150.000,671.069 1104.000,671.069 1081.000,631.232 1104.000,591.395 1150.000,591.395\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1173.000,710.906 1150.000,750.743 1104.000,750.743 1081.000,710.906 1104.000,671.069 1150.000,671.069\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1173.000,790.581 1150.000,830.418 1104.000,830.418 1081.000,790.581 1104.000,750.743 1150.000,750.743\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1173.000,870.255 1150.000,910.092 1104.000,910.092 1081.000,870.255 1104.000,830.418 1150.000,830.418\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1173.000,949.929 1150.000,989.766 1104.000,989.766 1081.000,949.929 1104.000,910.092 1150.000,910.092\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1242.000,-46.000 1219.000,-6.163 1173.000,-6.163 1150.000,-46.000 1173.000,-85.837 1219.000,-85.837\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1242.000,33.674 1219.000,73.512 1173.000,73.512 1150.000,33.674 1173.000,-6.163 1219.000,-6.163\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1242.000,113.349 1219.000,153.186 1173.000,153.186 1150.000,113.349 1173.000,73.512 1219.000,73.512\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1242.000,193.023 1219.000,232.860 1173.000,232.860 1150.000,193.023 1173.000,153.186 1219.000,153.186\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1242.000,272.697 1219.000,312.535 1173.000,312.535 1150.000,272.697 1173.000,232.860 1219.000,232.860\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1242.000,352.372 1219.000,392.209 1173.000,392.209 1150.000,352.372 1173.000,312.535 1219.000,312.535\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1242.000,432.046 1219.000,471.883 1173.000,471.883 1150.000,432.046 1173.000,392.209 1219.000,392.209\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1242.000,511.720 1219.000,551.558 1173.000,551.558 1150.000,511.720 1173.000,471.883 1219.000,471.883\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1242.000,591.395 1219.000,631.232 1173.000,631.232 1150.000,591.395 1173.000,551.558 1219.000,551.558\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1242.000,671.069 1219.000,710.906 1173.000,710.906 1150.000,671.069 1173.000,631.232 1219.000,631.232\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1242.000,750.743 1219.000,790.581 1173.000,790.581 1150.000,750.743 1173.000,710.906 1219.000,710.906\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1242.000,830.418 1219.000,870.255 1173.000,870.255 1150.000,830.418 1173.000,790.581 1219.000,790.581\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1242.000,910.092 1219.000,949.929 1173.000,949.929 1150.000,910.092 1173.000,870.255 1219.000,870.255\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1311.000,-6.163 1288.000,33.674 1242.000,33.674 1219.000,-6.163 1242.000,-46.000 1288.000,-46.000\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1311.000,73.512 1288.000,113.349 1242.000,113.349 1219.000,73.512 1242.000,33.674 1288.000,33.674\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1311.000,153.186 1288.000,193.023 1242.000,193.023 1219.000,153.186 1242.000,113.349 1288.000,113.349\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1311.000,232.860 1288.000,272.697 1242.000,272.697 1219.000,232.860 1242.000,193.023 1288.000,193.023\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1311.000,312.535 1288.000,352.372 1242.000,352.372 1219.000,312.535 1242.000,272.697 1288.000,272.697\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1311.000,392.209 1288.000,432.046 1242.000,432.046 1219.000,392.209 1242.000,352.372 1288.000,352.372\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1311.000,471.883 1288.000,511.720 1242.000,511.720 1219.000,471.883 1242.000,432.046 1288.000,432.046\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1311.000,551.558 1288.000,591.395 1242.000,591.395 1219.000,551.558 1242.000,511.720 1288.000,511.720\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1311.000,631.232 1288.000,671.069 1242.000,671.069 1219.000,631.232 1242.000,591.395 1288.000,591.395\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1311.000,710.906 1288.000,750.743 1242.000,750.743 1219.000,710.906 1242.000,671.069 1288.000,671.069\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1311.000,790.581 1288.000,830.418 1242.000,830.418 1219.000,790.581 1242.000,750.743 1288.000,750.743\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1311.000,870.255 1288.000,910.092 1242.000,910.092 1219.000,870.255 1242.000,830.418 1288.000,830.418\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1311.000,949.929 1288.000,989.766 1242.000,989.766 1219.000,949.929 1242.000,910.092 1288.000,910.092\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1380.000,-46.000 1357.000,-6.163 1311.000,-6.163 1288.000,-46.000 1311.000,-85.837 1357.000,-85.837\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1380.000,33.674 1357.000,73.512 1311.000,73.512 1288.000,33.674 1311.000,-6.163 1357.000,-6.163\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1380.000,113.349 1357.000,153.186 1311.000,153.186 1288.000,113.349 1311.000,73.512 1357.000,73.512\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1380.000,193.023 1357.000,232.860 1311.000,232.860 1288.000,193.023 1311.000,153.186 1357.000,153.186\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1380.000,272.697 1357.000,312.535 1311.000,312.535 1288.000,272.697 1311.000,232.860 1357.000,232.860\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1380.000,352.372 1357.000,392.209 1311.000,392.209 1288.000,352.372 1311.000,312.535 1357.000,312.535\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1380.000,432.046 1357.000,471.883 1311.000,471.883 1288.000,432.046 1311.000,392.209 1357.000,392.209\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1380.000,511.720 1357.000,551.558 1311.000,551.558 1288.000,511.720 1311.000,471.883 1357.000,471.883\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1380.000,591.395 1357.000,631.232 1311.000,631.232 1288.000,591.395 1311.000,551.558 1357.000,551.558\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1380.000,671.069 1357.000,710.906 1311.000,710.906 1288.000,671.069 1311.000,631.232 1357.000,631.232\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1380.000,750.743 1357.000,790.581 1311.000,790.581 1288.000,750.743 1311.000,710.906 1357.000,710.906\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1380.000,830.418 1357.000,870.255 1311.000,870.255 1288.000,830.418 1311.000,790.581 1357.000,790.581\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1380.000,910.092 1357.000,949.929 1311.000,949.929 1288.000,910.092 1311.000,870.255 1357.000,870.255\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1449.000,-6.163 1426.000,33.674 1380.000,33.674 1357.000,-6.163 1380.000,-46.000 1426.000,-46.000\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1449.000,73.512 1426.000,113.349 1380.000,113.349 1357.000,73.512 1380.000,33.674 1426.000,33.674\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1449.000,153.186 1426.000,193.023 1380.000,193.023 1357.000,153.186 1380.000,113.349 1426.000,113.349\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1449.000,232.860 1426.000,272.697 1380.000,272.697 1357.000,232.860 1380.000,193.023 1426.000,193.023\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1449.000,312.535 1426.000,352.372 1380.000,352.372 1357.000,312.535 1380.000,272.697 1426.000,272.697\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1449.000,392.209 1426.000,432.046 1380.000,432.046 1357.000,392.209 1380.000,352.372 1426.000,352.372\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1449.000,471.883 1426.000,511.720 1380.000,511.720 1357.000,471.883 1380.000,432.046 1426.000,432.046\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1449.000,551.558 1426.000,591.395 1380.000,591.395 1357.000,551.558 1380.000,511.720 1426.000,511.720\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1449.000,631.232 1426.000,671.069 1380.000,671.069 1357.000,631.232 1380.000,591.395 1426.000,591.395\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1449.000,710.906 1426.000,750.743 1380.000,750.743 1357.000,710.906 1380.000,671.069 1426.000,671.069\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1449.000,790.581 1426.000,830.418 1380.000,830.418 1357.000,790.581 1380.000,750.743 1426.000,750.743\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1449.000,870.255 1426.000,910.092 1380.000,910.092 1357.000,870.255 1380.000,830.418 1426.000,830.418\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1449.000,949.929 1426.000,989.766 1380.000,989.766 1357.000,949.929 1380.000,910.092 1426.000,910.092\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1518.000,-46.000 1495.000,-6.163 1449.000,-6.163 1426.000,-46.000 1449.000,-85.837 1495.000,-85.837\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1518.000,33.674 1495.000,73.512 1449.000,73.512 1426.000,33.674 1449.000,-6.163 1495.000,-6.163\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1518.000,113.349 1495.000,153.186 1449.000,153.186 1426.000,113.349 1449.000,73.512 1495.000,73.512\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1518.000,193.023 1495.000,232.860 1449.000,232.860 1426.000,193.023 1449.000,153.186 1495.000,153.186\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1518.000,272.697 1495.000,312.535 1449.000,312.535 1426.000,272.697 1449.000,232.860 1495.000,232.860\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1518.000,352.372 1495.000,392.209 1449.000,392.209 1426.000,352.372 1449.000,312.535 1495.000,312.535\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1518.000,432.046 1495.000,471.883 1449.000,471.883 1426.000,432.046 1449.000,392.209 1495.000,392.209\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1518.000,511.720 1495.000,551.558 1449.000,551.558 1426.000,511.720 1449.000,471.883 1495.000,471.883\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1518.000,591.395 1495.000,631.232 1449.000,631.232 1426.000,591.395 1449.000,551.558 1495.000,551.558\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1518.000,671.069 1495.000,710.906 1449.000,710.906 1426.000,671.069 1449.000,631.232 1495.000,631.232\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1518.000,750.743 1495.000,790.581 1449.000,790.581 1426.000,750.743 1449.000,710.906 1495.000,710.906\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1518.000,830.418 1495.000,870.255 1449.000,870.255 1426.000,830.418 1449.000,790.581 1495.000,790.581\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1518.000,910.092 1495.000,949.929 1449.000,949.929 1426.000,910.092 1449.000,870.255 1495.000,870.255\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1587.000,-6.163 1564.000,33.674 1518.000,33.674 1495.000,-6.163 1518.000,-46.000 1564.000,-46.000\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1587.000,73.512 1564.000,113.349 1518.000,113.349 1495.000,73.512 1518.000,33.674 1564.000,33.674\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1587.000,153.186 1564.000,193.023 1518.000,193.023 1495.000,153.186 1518.000,113.349 1564.000,113.349\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1587.000,232.860 1564.000,272.697 1518.000,272.697 1495.000,232.860 1518.000,193.023 1564.000,193.023\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1587.000,312.535 1564.000,352.372 1518.000,352.372 1495.000,312.535 1518.000,272.697 1564.000,272.697\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1587.000,392.209 1564.000,432.046 1518.000,432.046 1495.000,392.209 1518.000,352.372 1564.000,352.372\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1587.000,471.883 1564.000,511.720 1518.000,511.720 1495.000,471.883 1518.000,432.046 1564.000,432.046\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1587.000,551.558 1564.000,591.395 1518.000,591.395 1495.000,551.558 1518.000,511.720 1564.000,511.720\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1587.000,631.232 1564.000,671.069 1518.000,671.069 1495.000,631.232 1518.000,591.395 1564.000,591.395\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1587.000,710.906 1564.000,750.743 1518.000,750.743 1495.000,710.906 1518.000,671.069 1564.000,671.069\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1587.000,790.581 1564.000,830.418 1518.000,830.418 1495.000,790.581 1518.000,750.743 1564.000,750.743\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1587.000,870.255 1564.000,910.092 1518.000,910.092 1495.000,870.255 1518.000,830.418 1564.000,830.418\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1587.000,949.929 1564.000,989.766 1518.000,989.766 1495.000,949.929 1518.000,910.092 1564.000,910.092\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1656.000,-46.000 1633.000,-6.163 1587.000,-6.163 1564.000,-46.000 1587.000,-85.837 1633.000,-85.837\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1656.000,33.674 1633.000,73.512 1587.000,73.512 1564.000,33.674 1587.000,-6.163 1633.000,-6.163\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1656.000,113.349 1633.000,153.186 1587.000,153.186 1564.000,113.349 1587.000,73.512 1633.000,73.512\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1656.000,193.023 1633.000,232.860 1587.000,232.860 1564.000,193.023 1587.000,153.186 1633.000,153.186\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1656.000,272.697 1633.000,312.535 1587.000,312.535 1564.000,272.697 1587.000,232.860 1633.000,232.860\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1656.000,352.372 1633.000,392.209 1587.000,392.209 1564.000,352.372 1587.000,312.535 1633.000,312.535\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1656.000,432.046 1633.000,471.883 1587.000,471.883 1564.000,432.046 1587.000,392.209 1633.000,392.209\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1656.000,511.720 1633.000,551.558 1587.000,551.558 1564.000,511.720 1587.000,471.883 1633.000,471.883\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1656.000,591.395 1633.000,631.232 1587.000,631.232 1564.000,591.395 1587.000,551.558 1633.000,551.558\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1656.000,671.069 1633.000,710.906 1587.000,710.906 1564.000,671.069 1587.000,631.232 1633.000,631.232\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1656.000,750.743 1633.000,790.581 1587.000,790.581 1564.000,750.743 1587.000,710.906 1633.000,710.906\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1656.000,830.418 1633.000,870.255 1587.000,870.255 1564.000,830.418 1587.000,790.581 1633.000,790.581\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/>\n<polygon points=\"1656.000,910.092 1633.000,949.929 1587.000,949.929 1564.000,910.092 1587.000,870.255 1633.000,870.255\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.0\" opacity=\"0.1\"/></svg>\n"
99
+ },
100
+ {
101
+ "path": "backgrounds/honeycomb-pattern-full.svg",
102
+ "mimeType": "image/svg+xml",
103
+ "bytes": 74834,
104
+ "encoding": "utf8",
105
+ "content": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1200 1200\" width=\"1200\" height=\"1200\"><rect width=\"1200\" height=\"1200\" fill=\"#1B1A17\"/><polygon points=\"0.000,-40.000 -20.000,-5.359 -60.000,-5.359 -80.000,-40.000 -60.000,-74.641 -20.000,-74.641\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"0.000,29.282 -20.000,63.923 -60.000,63.923 -80.000,29.282 -60.000,-5.359 -20.000,-5.359\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"0.000,98.564 -20.000,133.205 -60.000,133.205 -80.000,98.564 -60.000,63.923 -20.000,63.923\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"0.000,167.846 -20.000,202.487 -60.000,202.487 -80.000,167.846 -60.000,133.205 -20.000,133.205\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"0.000,237.128 -20.000,271.769 -60.000,271.769 -80.000,237.128 -60.000,202.487 -20.000,202.487\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"0.000,306.410 -20.000,341.051 -60.000,341.051 -80.000,306.410 -60.000,271.769 -20.000,271.769\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"0.000,375.692 -20.000,410.333 -60.000,410.333 -80.000,375.692 -60.000,341.051 -20.000,341.051\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"0.000,444.974 -20.000,479.615 -60.000,479.615 -80.000,444.974 -60.000,410.333 -20.000,410.333\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"0.000,514.256 -20.000,548.897 -60.000,548.897 -80.000,514.256 -60.000,479.615 -20.000,479.615\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"0.000,583.538 -20.000,618.179 -60.000,618.179 -80.000,583.538 -60.000,548.897 -20.000,548.897\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"0.000,652.820 -20.000,687.461 -60.000,687.461 -80.000,652.820 -60.000,618.179 -20.000,618.179\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"0.000,722.102 -20.000,756.743 -60.000,756.743 -80.000,722.102 -60.000,687.461 -20.000,687.461\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"0.000,791.384 -20.000,826.025 -60.000,826.025 -80.000,791.384 -60.000,756.743 -20.000,756.743\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"0.000,860.666 -20.000,895.307 -60.000,895.307 -80.000,860.666 -60.000,826.025 -20.000,826.025\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"0.000,929.948 -20.000,964.589 -60.000,964.589 -80.000,929.948 -60.000,895.307 -20.000,895.307\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"0.000,999.230 -20.000,1033.872 -60.000,1033.872 -80.000,999.230 -60.000,964.589 -20.000,964.589\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"0.000,1068.513 -20.000,1103.154 -60.000,1103.154 -80.000,1068.513 -60.000,1033.872 -20.000,1033.872\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"0.000,1137.795 -20.000,1172.436 -60.000,1172.436 -80.000,1137.795 -60.000,1103.154 -20.000,1103.154\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"0.000,1207.077 -20.000,1241.718 -60.000,1241.718 -80.000,1207.077 -60.000,1172.436 -20.000,1172.436\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"60.000,-5.359 40.000,29.282 0.000,29.282 -20.000,-5.359 -0.000,-40.000 40.000,-40.000\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"60.000,63.923 40.000,98.564 0.000,98.564 -20.000,63.923 -0.000,29.282 40.000,29.282\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"60.000,133.205 40.000,167.846 0.000,167.846 -20.000,133.205 -0.000,98.564 40.000,98.564\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"60.000,202.487 40.000,237.128 0.000,237.128 -20.000,202.487 -0.000,167.846 40.000,167.846\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"60.000,271.769 40.000,306.410 0.000,306.410 -20.000,271.769 -0.000,237.128 40.000,237.128\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"60.000,341.051 40.000,375.692 0.000,375.692 -20.000,341.051 -0.000,306.410 40.000,306.410\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"60.000,410.333 40.000,444.974 0.000,444.974 -20.000,410.333 -0.000,375.692 40.000,375.692\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"60.000,479.615 40.000,514.256 0.000,514.256 -20.000,479.615 -0.000,444.974 40.000,444.974\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"60.000,548.897 40.000,583.538 0.000,583.538 -20.000,548.897 -0.000,514.256 40.000,514.256\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"60.000,618.179 40.000,652.820 0.000,652.820 -20.000,618.179 -0.000,583.538 40.000,583.538\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"60.000,687.461 40.000,722.102 0.000,722.102 -20.000,687.461 -0.000,652.820 40.000,652.820\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"60.000,756.743 40.000,791.384 0.000,791.384 -20.000,756.743 -0.000,722.102 40.000,722.102\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"60.000,826.025 40.000,860.666 0.000,860.666 -20.000,826.025 -0.000,791.384 40.000,791.384\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"60.000,895.307 40.000,929.948 0.000,929.948 -20.000,895.307 -0.000,860.666 40.000,860.666\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"60.000,964.589 40.000,999.230 0.000,999.230 -20.000,964.589 -0.000,929.948 40.000,929.948\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"60.000,1033.872 40.000,1068.513 0.000,1068.513 -20.000,1033.872 -0.000,999.230 40.000,999.230\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"60.000,1103.154 40.000,1137.795 0.000,1137.795 -20.000,1103.154 -0.000,1068.513 40.000,1068.513\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"60.000,1172.436 40.000,1207.077 0.000,1207.077 -20.000,1172.436 -0.000,1137.795 40.000,1137.795\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"60.000,1241.718 40.000,1276.359 0.000,1276.359 -20.000,1241.718 -0.000,1207.077 40.000,1207.077\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"120.000,-40.000 100.000,-5.359 60.000,-5.359 40.000,-40.000 60.000,-74.641 100.000,-74.641\" fill=\"#3D5AFE\" stroke=\"#3D5AFE\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"120.000,29.282 100.000,63.923 60.000,63.923 40.000,29.282 60.000,-5.359 100.000,-5.359\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"120.000,98.564 100.000,133.205 60.000,133.205 40.000,98.564 60.000,63.923 100.000,63.923\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"120.000,167.846 100.000,202.487 60.000,202.487 40.000,167.846 60.000,133.205 100.000,133.205\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"120.000,237.128 100.000,271.769 60.000,271.769 40.000,237.128 60.000,202.487 100.000,202.487\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"120.000,306.410 100.000,341.051 60.000,341.051 40.000,306.410 60.000,271.769 100.000,271.769\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"120.000,375.692 100.000,410.333 60.000,410.333 40.000,375.692 60.000,341.051 100.000,341.051\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"120.000,444.974 100.000,479.615 60.000,479.615 40.000,444.974 60.000,410.333 100.000,410.333\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"120.000,514.256 100.000,548.897 60.000,548.897 40.000,514.256 60.000,479.615 100.000,479.615\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"120.000,583.538 100.000,618.179 60.000,618.179 40.000,583.538 60.000,548.897 100.000,548.897\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"120.000,652.820 100.000,687.461 60.000,687.461 40.000,652.820 60.000,618.179 100.000,618.179\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"120.000,722.102 100.000,756.743 60.000,756.743 40.000,722.102 60.000,687.461 100.000,687.461\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"120.000,791.384 100.000,826.025 60.000,826.025 40.000,791.384 60.000,756.743 100.000,756.743\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"120.000,860.666 100.000,895.307 60.000,895.307 40.000,860.666 60.000,826.025 100.000,826.025\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"120.000,929.948 100.000,964.589 60.000,964.589 40.000,929.948 60.000,895.307 100.000,895.307\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"120.000,999.230 100.000,1033.872 60.000,1033.872 40.000,999.230 60.000,964.589 100.000,964.589\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"120.000,1068.513 100.000,1103.154 60.000,1103.154 40.000,1068.513 60.000,1033.872 100.000,1033.872\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"120.000,1137.795 100.000,1172.436 60.000,1172.436 40.000,1137.795 60.000,1103.154 100.000,1103.154\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"120.000,1207.077 100.000,1241.718 60.000,1241.718 40.000,1207.077 60.000,1172.436 100.000,1172.436\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"180.000,-5.359 160.000,29.282 120.000,29.282 100.000,-5.359 120.000,-40.000 160.000,-40.000\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"180.000,63.923 160.000,98.564 120.000,98.564 100.000,63.923 120.000,29.282 160.000,29.282\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"180.000,133.205 160.000,167.846 120.000,167.846 100.000,133.205 120.000,98.564 160.000,98.564\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"180.000,202.487 160.000,237.128 120.000,237.128 100.000,202.487 120.000,167.846 160.000,167.846\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"180.000,271.769 160.000,306.410 120.000,306.410 100.000,271.769 120.000,237.128 160.000,237.128\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"180.000,341.051 160.000,375.692 120.000,375.692 100.000,341.051 120.000,306.410 160.000,306.410\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"180.000,410.333 160.000,444.974 120.000,444.974 100.000,410.333 120.000,375.692 160.000,375.692\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"180.000,479.615 160.000,514.256 120.000,514.256 100.000,479.615 120.000,444.974 160.000,444.974\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"180.000,548.897 160.000,583.538 120.000,583.538 100.000,548.897 120.000,514.256 160.000,514.256\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"180.000,618.179 160.000,652.820 120.000,652.820 100.000,618.179 120.000,583.538 160.000,583.538\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"180.000,687.461 160.000,722.102 120.000,722.102 100.000,687.461 120.000,652.820 160.000,652.820\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"180.000,756.743 160.000,791.384 120.000,791.384 100.000,756.743 120.000,722.102 160.000,722.102\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"180.000,826.025 160.000,860.666 120.000,860.666 100.000,826.025 120.000,791.384 160.000,791.384\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"180.000,895.307 160.000,929.948 120.000,929.948 100.000,895.307 120.000,860.666 160.000,860.666\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"180.000,964.589 160.000,999.230 120.000,999.230 100.000,964.589 120.000,929.948 160.000,929.948\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"180.000,1033.872 160.000,1068.513 120.000,1068.513 100.000,1033.872 120.000,999.230 160.000,999.230\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"180.000,1103.154 160.000,1137.795 120.000,1137.795 100.000,1103.154 120.000,1068.513 160.000,1068.513\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"180.000,1172.436 160.000,1207.077 120.000,1207.077 100.000,1172.436 120.000,1137.795 160.000,1137.795\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"180.000,1241.718 160.000,1276.359 120.000,1276.359 100.000,1241.718 120.000,1207.077 160.000,1207.077\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"240.000,-40.000 220.000,-5.359 180.000,-5.359 160.000,-40.000 180.000,-74.641 220.000,-74.641\" fill=\"#3D5AFE\" stroke=\"#3D5AFE\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"240.000,29.282 220.000,63.923 180.000,63.923 160.000,29.282 180.000,-5.359 220.000,-5.359\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"240.000,98.564 220.000,133.205 180.000,133.205 160.000,98.564 180.000,63.923 220.000,63.923\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"240.000,167.846 220.000,202.487 180.000,202.487 160.000,167.846 180.000,133.205 220.000,133.205\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"240.000,237.128 220.000,271.769 180.000,271.769 160.000,237.128 180.000,202.487 220.000,202.487\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"240.000,306.410 220.000,341.051 180.000,341.051 160.000,306.410 180.000,271.769 220.000,271.769\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"240.000,375.692 220.000,410.333 180.000,410.333 160.000,375.692 180.000,341.051 220.000,341.051\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"240.000,444.974 220.000,479.615 180.000,479.615 160.000,444.974 180.000,410.333 220.000,410.333\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"240.000,514.256 220.000,548.897 180.000,548.897 160.000,514.256 180.000,479.615 220.000,479.615\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"240.000,583.538 220.000,618.179 180.000,618.179 160.000,583.538 180.000,548.897 220.000,548.897\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"240.000,652.820 220.000,687.461 180.000,687.461 160.000,652.820 180.000,618.179 220.000,618.179\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"240.000,722.102 220.000,756.743 180.000,756.743 160.000,722.102 180.000,687.461 220.000,687.461\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"240.000,791.384 220.000,826.025 180.000,826.025 160.000,791.384 180.000,756.743 220.000,756.743\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"240.000,860.666 220.000,895.307 180.000,895.307 160.000,860.666 180.000,826.025 220.000,826.025\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"240.000,929.948 220.000,964.589 180.000,964.589 160.000,929.948 180.000,895.307 220.000,895.307\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"240.000,999.230 220.000,1033.872 180.000,1033.872 160.000,999.230 180.000,964.589 220.000,964.589\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"240.000,1068.513 220.000,1103.154 180.000,1103.154 160.000,1068.513 180.000,1033.872 220.000,1033.872\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"240.000,1137.795 220.000,1172.436 180.000,1172.436 160.000,1137.795 180.000,1103.154 220.000,1103.154\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"240.000,1207.077 220.000,1241.718 180.000,1241.718 160.000,1207.077 180.000,1172.436 220.000,1172.436\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"300.000,-5.359 280.000,29.282 240.000,29.282 220.000,-5.359 240.000,-40.000 280.000,-40.000\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"300.000,63.923 280.000,98.564 240.000,98.564 220.000,63.923 240.000,29.282 280.000,29.282\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"300.000,133.205 280.000,167.846 240.000,167.846 220.000,133.205 240.000,98.564 280.000,98.564\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"300.000,202.487 280.000,237.128 240.000,237.128 220.000,202.487 240.000,167.846 280.000,167.846\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"300.000,271.769 280.000,306.410 240.000,306.410 220.000,271.769 240.000,237.128 280.000,237.128\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"300.000,341.051 280.000,375.692 240.000,375.692 220.000,341.051 240.000,306.410 280.000,306.410\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"300.000,410.333 280.000,444.974 240.000,444.974 220.000,410.333 240.000,375.692 280.000,375.692\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"300.000,479.615 280.000,514.256 240.000,514.256 220.000,479.615 240.000,444.974 280.000,444.974\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"300.000,548.897 280.000,583.538 240.000,583.538 220.000,548.897 240.000,514.256 280.000,514.256\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"300.000,618.179 280.000,652.820 240.000,652.820 220.000,618.179 240.000,583.538 280.000,583.538\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"300.000,687.461 280.000,722.102 240.000,722.102 220.000,687.461 240.000,652.820 280.000,652.820\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"300.000,756.743 280.000,791.384 240.000,791.384 220.000,756.743 240.000,722.102 280.000,722.102\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"300.000,826.025 280.000,860.666 240.000,860.666 220.000,826.025 240.000,791.384 280.000,791.384\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"300.000,895.307 280.000,929.948 240.000,929.948 220.000,895.307 240.000,860.666 280.000,860.666\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"300.000,964.589 280.000,999.230 240.000,999.230 220.000,964.589 240.000,929.948 280.000,929.948\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"300.000,1033.872 280.000,1068.513 240.000,1068.513 220.000,1033.872 240.000,999.230 280.000,999.230\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"300.000,1103.154 280.000,1137.795 240.000,1137.795 220.000,1103.154 240.000,1068.513 280.000,1068.513\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"300.000,1172.436 280.000,1207.077 240.000,1207.077 220.000,1172.436 240.000,1137.795 280.000,1137.795\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"300.000,1241.718 280.000,1276.359 240.000,1276.359 220.000,1241.718 240.000,1207.077 280.000,1207.077\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"360.000,-40.000 340.000,-5.359 300.000,-5.359 280.000,-40.000 300.000,-74.641 340.000,-74.641\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"360.000,29.282 340.000,63.923 300.000,63.923 280.000,29.282 300.000,-5.359 340.000,-5.359\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"360.000,98.564 340.000,133.205 300.000,133.205 280.000,98.564 300.000,63.923 340.000,63.923\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"360.000,167.846 340.000,202.487 300.000,202.487 280.000,167.846 300.000,133.205 340.000,133.205\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"360.000,237.128 340.000,271.769 300.000,271.769 280.000,237.128 300.000,202.487 340.000,202.487\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"360.000,306.410 340.000,341.051 300.000,341.051 280.000,306.410 300.000,271.769 340.000,271.769\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"360.000,375.692 340.000,410.333 300.000,410.333 280.000,375.692 300.000,341.051 340.000,341.051\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"360.000,444.974 340.000,479.615 300.000,479.615 280.000,444.974 300.000,410.333 340.000,410.333\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"360.000,514.256 340.000,548.897 300.000,548.897 280.000,514.256 300.000,479.615 340.000,479.615\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"360.000,583.538 340.000,618.179 300.000,618.179 280.000,583.538 300.000,548.897 340.000,548.897\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"360.000,652.820 340.000,687.461 300.000,687.461 280.000,652.820 300.000,618.179 340.000,618.179\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"360.000,722.102 340.000,756.743 300.000,756.743 280.000,722.102 300.000,687.461 340.000,687.461\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"360.000,791.384 340.000,826.025 300.000,826.025 280.000,791.384 300.000,756.743 340.000,756.743\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"360.000,860.666 340.000,895.307 300.000,895.307 280.000,860.666 300.000,826.025 340.000,826.025\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"360.000,929.948 340.000,964.589 300.000,964.589 280.000,929.948 300.000,895.307 340.000,895.307\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"360.000,999.230 340.000,1033.872 300.000,1033.872 280.000,999.230 300.000,964.589 340.000,964.589\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"360.000,1068.513 340.000,1103.154 300.000,1103.154 280.000,1068.513 300.000,1033.872 340.000,1033.872\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"360.000,1137.795 340.000,1172.436 300.000,1172.436 280.000,1137.795 300.000,1103.154 340.000,1103.154\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"360.000,1207.077 340.000,1241.718 300.000,1241.718 280.000,1207.077 300.000,1172.436 340.000,1172.436\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"420.000,-5.359 400.000,29.282 360.000,29.282 340.000,-5.359 360.000,-40.000 400.000,-40.000\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"420.000,63.923 400.000,98.564 360.000,98.564 340.000,63.923 360.000,29.282 400.000,29.282\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"420.000,133.205 400.000,167.846 360.000,167.846 340.000,133.205 360.000,98.564 400.000,98.564\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"420.000,202.487 400.000,237.128 360.000,237.128 340.000,202.487 360.000,167.846 400.000,167.846\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"420.000,271.769 400.000,306.410 360.000,306.410 340.000,271.769 360.000,237.128 400.000,237.128\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"420.000,341.051 400.000,375.692 360.000,375.692 340.000,341.051 360.000,306.410 400.000,306.410\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"420.000,410.333 400.000,444.974 360.000,444.974 340.000,410.333 360.000,375.692 400.000,375.692\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"420.000,479.615 400.000,514.256 360.000,514.256 340.000,479.615 360.000,444.974 400.000,444.974\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"420.000,548.897 400.000,583.538 360.000,583.538 340.000,548.897 360.000,514.256 400.000,514.256\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"420.000,618.179 400.000,652.820 360.000,652.820 340.000,618.179 360.000,583.538 400.000,583.538\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"420.000,687.461 400.000,722.102 360.000,722.102 340.000,687.461 360.000,652.820 400.000,652.820\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"420.000,756.743 400.000,791.384 360.000,791.384 340.000,756.743 360.000,722.102 400.000,722.102\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"420.000,826.025 400.000,860.666 360.000,860.666 340.000,826.025 360.000,791.384 400.000,791.384\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"420.000,895.307 400.000,929.948 360.000,929.948 340.000,895.307 360.000,860.666 400.000,860.666\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"420.000,964.589 400.000,999.230 360.000,999.230 340.000,964.589 360.000,929.948 400.000,929.948\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"420.000,1033.872 400.000,1068.513 360.000,1068.513 340.000,1033.872 360.000,999.230 400.000,999.230\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"420.000,1103.154 400.000,1137.795 360.000,1137.795 340.000,1103.154 360.000,1068.513 400.000,1068.513\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"420.000,1172.436 400.000,1207.077 360.000,1207.077 340.000,1172.436 360.000,1137.795 400.000,1137.795\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"420.000,1241.718 400.000,1276.359 360.000,1276.359 340.000,1241.718 360.000,1207.077 400.000,1207.077\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"480.000,-40.000 460.000,-5.359 420.000,-5.359 400.000,-40.000 420.000,-74.641 460.000,-74.641\" fill=\"#3D5AFE\" stroke=\"#3D5AFE\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"480.000,29.282 460.000,63.923 420.000,63.923 400.000,29.282 420.000,-5.359 460.000,-5.359\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"480.000,98.564 460.000,133.205 420.000,133.205 400.000,98.564 420.000,63.923 460.000,63.923\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"480.000,167.846 460.000,202.487 420.000,202.487 400.000,167.846 420.000,133.205 460.000,133.205\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"480.000,237.128 460.000,271.769 420.000,271.769 400.000,237.128 420.000,202.487 460.000,202.487\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"480.000,306.410 460.000,341.051 420.000,341.051 400.000,306.410 420.000,271.769 460.000,271.769\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"480.000,375.692 460.000,410.333 420.000,410.333 400.000,375.692 420.000,341.051 460.000,341.051\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"480.000,444.974 460.000,479.615 420.000,479.615 400.000,444.974 420.000,410.333 460.000,410.333\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"480.000,514.256 460.000,548.897 420.000,548.897 400.000,514.256 420.000,479.615 460.000,479.615\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"480.000,583.538 460.000,618.179 420.000,618.179 400.000,583.538 420.000,548.897 460.000,548.897\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"480.000,652.820 460.000,687.461 420.000,687.461 400.000,652.820 420.000,618.179 460.000,618.179\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"480.000,722.102 460.000,756.743 420.000,756.743 400.000,722.102 420.000,687.461 460.000,687.461\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"480.000,791.384 460.000,826.025 420.000,826.025 400.000,791.384 420.000,756.743 460.000,756.743\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"480.000,860.666 460.000,895.307 420.000,895.307 400.000,860.666 420.000,826.025 460.000,826.025\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"480.000,929.948 460.000,964.589 420.000,964.589 400.000,929.948 420.000,895.307 460.000,895.307\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"480.000,999.230 460.000,1033.872 420.000,1033.872 400.000,999.230 420.000,964.589 460.000,964.589\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"480.000,1068.513 460.000,1103.154 420.000,1103.154 400.000,1068.513 420.000,1033.872 460.000,1033.872\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"480.000,1137.795 460.000,1172.436 420.000,1172.436 400.000,1137.795 420.000,1103.154 460.000,1103.154\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"480.000,1207.077 460.000,1241.718 420.000,1241.718 400.000,1207.077 420.000,1172.436 460.000,1172.436\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"540.000,-5.359 520.000,29.282 480.000,29.282 460.000,-5.359 480.000,-40.000 520.000,-40.000\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"540.000,63.923 520.000,98.564 480.000,98.564 460.000,63.923 480.000,29.282 520.000,29.282\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"540.000,133.205 520.000,167.846 480.000,167.846 460.000,133.205 480.000,98.564 520.000,98.564\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"540.000,202.487 520.000,237.128 480.000,237.128 460.000,202.487 480.000,167.846 520.000,167.846\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"540.000,271.769 520.000,306.410 480.000,306.410 460.000,271.769 480.000,237.128 520.000,237.128\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"540.000,341.051 520.000,375.692 480.000,375.692 460.000,341.051 480.000,306.410 520.000,306.410\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"540.000,410.333 520.000,444.974 480.000,444.974 460.000,410.333 480.000,375.692 520.000,375.692\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"540.000,479.615 520.000,514.256 480.000,514.256 460.000,479.615 480.000,444.974 520.000,444.974\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"540.000,548.897 520.000,583.538 480.000,583.538 460.000,548.897 480.000,514.256 520.000,514.256\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"540.000,618.179 520.000,652.820 480.000,652.820 460.000,618.179 480.000,583.538 520.000,583.538\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"540.000,687.461 520.000,722.102 480.000,722.102 460.000,687.461 480.000,652.820 520.000,652.820\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"540.000,756.743 520.000,791.384 480.000,791.384 460.000,756.743 480.000,722.102 520.000,722.102\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"540.000,826.025 520.000,860.666 480.000,860.666 460.000,826.025 480.000,791.384 520.000,791.384\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"540.000,895.307 520.000,929.948 480.000,929.948 460.000,895.307 480.000,860.666 520.000,860.666\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"540.000,964.589 520.000,999.230 480.000,999.230 460.000,964.589 480.000,929.948 520.000,929.948\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"540.000,1033.872 520.000,1068.513 480.000,1068.513 460.000,1033.872 480.000,999.230 520.000,999.230\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"540.000,1103.154 520.000,1137.795 480.000,1137.795 460.000,1103.154 480.000,1068.513 520.000,1068.513\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"540.000,1172.436 520.000,1207.077 480.000,1207.077 460.000,1172.436 480.000,1137.795 520.000,1137.795\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"540.000,1241.718 520.000,1276.359 480.000,1276.359 460.000,1241.718 480.000,1207.077 520.000,1207.077\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"600.000,-40.000 580.000,-5.359 540.000,-5.359 520.000,-40.000 540.000,-74.641 580.000,-74.641\" fill=\"#3D5AFE\" stroke=\"#3D5AFE\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"600.000,29.282 580.000,63.923 540.000,63.923 520.000,29.282 540.000,-5.359 580.000,-5.359\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"600.000,98.564 580.000,133.205 540.000,133.205 520.000,98.564 540.000,63.923 580.000,63.923\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"600.000,167.846 580.000,202.487 540.000,202.487 520.000,167.846 540.000,133.205 580.000,133.205\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"600.000,237.128 580.000,271.769 540.000,271.769 520.000,237.128 540.000,202.487 580.000,202.487\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"600.000,306.410 580.000,341.051 540.000,341.051 520.000,306.410 540.000,271.769 580.000,271.769\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"600.000,375.692 580.000,410.333 540.000,410.333 520.000,375.692 540.000,341.051 580.000,341.051\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"600.000,444.974 580.000,479.615 540.000,479.615 520.000,444.974 540.000,410.333 580.000,410.333\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"600.000,514.256 580.000,548.897 540.000,548.897 520.000,514.256 540.000,479.615 580.000,479.615\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"600.000,583.538 580.000,618.179 540.000,618.179 520.000,583.538 540.000,548.897 580.000,548.897\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"600.000,652.820 580.000,687.461 540.000,687.461 520.000,652.820 540.000,618.179 580.000,618.179\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"600.000,722.102 580.000,756.743 540.000,756.743 520.000,722.102 540.000,687.461 580.000,687.461\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"600.000,791.384 580.000,826.025 540.000,826.025 520.000,791.384 540.000,756.743 580.000,756.743\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"600.000,860.666 580.000,895.307 540.000,895.307 520.000,860.666 540.000,826.025 580.000,826.025\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"600.000,929.948 580.000,964.589 540.000,964.589 520.000,929.948 540.000,895.307 580.000,895.307\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"600.000,999.230 580.000,1033.872 540.000,1033.872 520.000,999.230 540.000,964.589 580.000,964.589\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"600.000,1068.513 580.000,1103.154 540.000,1103.154 520.000,1068.513 540.000,1033.872 580.000,1033.872\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"600.000,1137.795 580.000,1172.436 540.000,1172.436 520.000,1137.795 540.000,1103.154 580.000,1103.154\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"600.000,1207.077 580.000,1241.718 540.000,1241.718 520.000,1207.077 540.000,1172.436 580.000,1172.436\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"660.000,-5.359 640.000,29.282 600.000,29.282 580.000,-5.359 600.000,-40.000 640.000,-40.000\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"660.000,63.923 640.000,98.564 600.000,98.564 580.000,63.923 600.000,29.282 640.000,29.282\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"660.000,133.205 640.000,167.846 600.000,167.846 580.000,133.205 600.000,98.564 640.000,98.564\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"660.000,202.487 640.000,237.128 600.000,237.128 580.000,202.487 600.000,167.846 640.000,167.846\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"660.000,271.769 640.000,306.410 600.000,306.410 580.000,271.769 600.000,237.128 640.000,237.128\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"660.000,341.051 640.000,375.692 600.000,375.692 580.000,341.051 600.000,306.410 640.000,306.410\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"660.000,410.333 640.000,444.974 600.000,444.974 580.000,410.333 600.000,375.692 640.000,375.692\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"660.000,479.615 640.000,514.256 600.000,514.256 580.000,479.615 600.000,444.974 640.000,444.974\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"660.000,548.897 640.000,583.538 600.000,583.538 580.000,548.897 600.000,514.256 640.000,514.256\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"660.000,618.179 640.000,652.820 600.000,652.820 580.000,618.179 600.000,583.538 640.000,583.538\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"660.000,687.461 640.000,722.102 600.000,722.102 580.000,687.461 600.000,652.820 640.000,652.820\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"660.000,756.743 640.000,791.384 600.000,791.384 580.000,756.743 600.000,722.102 640.000,722.102\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"660.000,826.025 640.000,860.666 600.000,860.666 580.000,826.025 600.000,791.384 640.000,791.384\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"660.000,895.307 640.000,929.948 600.000,929.948 580.000,895.307 600.000,860.666 640.000,860.666\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"660.000,964.589 640.000,999.230 600.000,999.230 580.000,964.589 600.000,929.948 640.000,929.948\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"660.000,1033.872 640.000,1068.513 600.000,1068.513 580.000,1033.872 600.000,999.230 640.000,999.230\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"660.000,1103.154 640.000,1137.795 600.000,1137.795 580.000,1103.154 600.000,1068.513 640.000,1068.513\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"660.000,1172.436 640.000,1207.077 600.000,1207.077 580.000,1172.436 600.000,1137.795 640.000,1137.795\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"660.000,1241.718 640.000,1276.359 600.000,1276.359 580.000,1241.718 600.000,1207.077 640.000,1207.077\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"720.000,-40.000 700.000,-5.359 660.000,-5.359 640.000,-40.000 660.000,-74.641 700.000,-74.641\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"720.000,29.282 700.000,63.923 660.000,63.923 640.000,29.282 660.000,-5.359 700.000,-5.359\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"720.000,98.564 700.000,133.205 660.000,133.205 640.000,98.564 660.000,63.923 700.000,63.923\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"720.000,167.846 700.000,202.487 660.000,202.487 640.000,167.846 660.000,133.205 700.000,133.205\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"720.000,237.128 700.000,271.769 660.000,271.769 640.000,237.128 660.000,202.487 700.000,202.487\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"720.000,306.410 700.000,341.051 660.000,341.051 640.000,306.410 660.000,271.769 700.000,271.769\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"720.000,375.692 700.000,410.333 660.000,410.333 640.000,375.692 660.000,341.051 700.000,341.051\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"720.000,444.974 700.000,479.615 660.000,479.615 640.000,444.974 660.000,410.333 700.000,410.333\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"720.000,514.256 700.000,548.897 660.000,548.897 640.000,514.256 660.000,479.615 700.000,479.615\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"720.000,583.538 700.000,618.179 660.000,618.179 640.000,583.538 660.000,548.897 700.000,548.897\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"720.000,652.820 700.000,687.461 660.000,687.461 640.000,652.820 660.000,618.179 700.000,618.179\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"720.000,722.102 700.000,756.743 660.000,756.743 640.000,722.102 660.000,687.461 700.000,687.461\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"720.000,791.384 700.000,826.025 660.000,826.025 640.000,791.384 660.000,756.743 700.000,756.743\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"720.000,860.666 700.000,895.307 660.000,895.307 640.000,860.666 660.000,826.025 700.000,826.025\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"720.000,929.948 700.000,964.589 660.000,964.589 640.000,929.948 660.000,895.307 700.000,895.307\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"720.000,999.230 700.000,1033.872 660.000,1033.872 640.000,999.230 660.000,964.589 700.000,964.589\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"720.000,1068.513 700.000,1103.154 660.000,1103.154 640.000,1068.513 660.000,1033.872 700.000,1033.872\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"720.000,1137.795 700.000,1172.436 660.000,1172.436 640.000,1137.795 660.000,1103.154 700.000,1103.154\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"720.000,1207.077 700.000,1241.718 660.000,1241.718 640.000,1207.077 660.000,1172.436 700.000,1172.436\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"780.000,-5.359 760.000,29.282 720.000,29.282 700.000,-5.359 720.000,-40.000 760.000,-40.000\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"780.000,63.923 760.000,98.564 720.000,98.564 700.000,63.923 720.000,29.282 760.000,29.282\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"780.000,133.205 760.000,167.846 720.000,167.846 700.000,133.205 720.000,98.564 760.000,98.564\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"780.000,202.487 760.000,237.128 720.000,237.128 700.000,202.487 720.000,167.846 760.000,167.846\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"780.000,271.769 760.000,306.410 720.000,306.410 700.000,271.769 720.000,237.128 760.000,237.128\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"780.000,341.051 760.000,375.692 720.000,375.692 700.000,341.051 720.000,306.410 760.000,306.410\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"780.000,410.333 760.000,444.974 720.000,444.974 700.000,410.333 720.000,375.692 760.000,375.692\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"780.000,479.615 760.000,514.256 720.000,514.256 700.000,479.615 720.000,444.974 760.000,444.974\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"780.000,548.897 760.000,583.538 720.000,583.538 700.000,548.897 720.000,514.256 760.000,514.256\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"780.000,618.179 760.000,652.820 720.000,652.820 700.000,618.179 720.000,583.538 760.000,583.538\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"780.000,687.461 760.000,722.102 720.000,722.102 700.000,687.461 720.000,652.820 760.000,652.820\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"780.000,756.743 760.000,791.384 720.000,791.384 700.000,756.743 720.000,722.102 760.000,722.102\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"780.000,826.025 760.000,860.666 720.000,860.666 700.000,826.025 720.000,791.384 760.000,791.384\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"780.000,895.307 760.000,929.948 720.000,929.948 700.000,895.307 720.000,860.666 760.000,860.666\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"780.000,964.589 760.000,999.230 720.000,999.230 700.000,964.589 720.000,929.948 760.000,929.948\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"780.000,1033.872 760.000,1068.513 720.000,1068.513 700.000,1033.872 720.000,999.230 760.000,999.230\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"780.000,1103.154 760.000,1137.795 720.000,1137.795 700.000,1103.154 720.000,1068.513 760.000,1068.513\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"780.000,1172.436 760.000,1207.077 720.000,1207.077 700.000,1172.436 720.000,1137.795 760.000,1137.795\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"780.000,1241.718 760.000,1276.359 720.000,1276.359 700.000,1241.718 720.000,1207.077 760.000,1207.077\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"840.000,-40.000 820.000,-5.359 780.000,-5.359 760.000,-40.000 780.000,-74.641 820.000,-74.641\" fill=\"#3D5AFE\" stroke=\"#3D5AFE\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"840.000,29.282 820.000,63.923 780.000,63.923 760.000,29.282 780.000,-5.359 820.000,-5.359\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"840.000,98.564 820.000,133.205 780.000,133.205 760.000,98.564 780.000,63.923 820.000,63.923\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"840.000,167.846 820.000,202.487 780.000,202.487 760.000,167.846 780.000,133.205 820.000,133.205\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"840.000,237.128 820.000,271.769 780.000,271.769 760.000,237.128 780.000,202.487 820.000,202.487\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"840.000,306.410 820.000,341.051 780.000,341.051 760.000,306.410 780.000,271.769 820.000,271.769\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"840.000,375.692 820.000,410.333 780.000,410.333 760.000,375.692 780.000,341.051 820.000,341.051\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"840.000,444.974 820.000,479.615 780.000,479.615 760.000,444.974 780.000,410.333 820.000,410.333\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"840.000,514.256 820.000,548.897 780.000,548.897 760.000,514.256 780.000,479.615 820.000,479.615\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"840.000,583.538 820.000,618.179 780.000,618.179 760.000,583.538 780.000,548.897 820.000,548.897\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"840.000,652.820 820.000,687.461 780.000,687.461 760.000,652.820 780.000,618.179 820.000,618.179\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"840.000,722.102 820.000,756.743 780.000,756.743 760.000,722.102 780.000,687.461 820.000,687.461\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"840.000,791.384 820.000,826.025 780.000,826.025 760.000,791.384 780.000,756.743 820.000,756.743\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"840.000,860.666 820.000,895.307 780.000,895.307 760.000,860.666 780.000,826.025 820.000,826.025\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"840.000,929.948 820.000,964.589 780.000,964.589 760.000,929.948 780.000,895.307 820.000,895.307\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"840.000,999.230 820.000,1033.872 780.000,1033.872 760.000,999.230 780.000,964.589 820.000,964.589\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"840.000,1068.513 820.000,1103.154 780.000,1103.154 760.000,1068.513 780.000,1033.872 820.000,1033.872\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"840.000,1137.795 820.000,1172.436 780.000,1172.436 760.000,1137.795 780.000,1103.154 820.000,1103.154\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"840.000,1207.077 820.000,1241.718 780.000,1241.718 760.000,1207.077 780.000,1172.436 820.000,1172.436\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"900.000,-5.359 880.000,29.282 840.000,29.282 820.000,-5.359 840.000,-40.000 880.000,-40.000\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"900.000,63.923 880.000,98.564 840.000,98.564 820.000,63.923 840.000,29.282 880.000,29.282\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"900.000,133.205 880.000,167.846 840.000,167.846 820.000,133.205 840.000,98.564 880.000,98.564\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"900.000,202.487 880.000,237.128 840.000,237.128 820.000,202.487 840.000,167.846 880.000,167.846\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"900.000,271.769 880.000,306.410 840.000,306.410 820.000,271.769 840.000,237.128 880.000,237.128\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"900.000,341.051 880.000,375.692 840.000,375.692 820.000,341.051 840.000,306.410 880.000,306.410\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"900.000,410.333 880.000,444.974 840.000,444.974 820.000,410.333 840.000,375.692 880.000,375.692\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"900.000,479.615 880.000,514.256 840.000,514.256 820.000,479.615 840.000,444.974 880.000,444.974\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"900.000,548.897 880.000,583.538 840.000,583.538 820.000,548.897 840.000,514.256 880.000,514.256\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"900.000,618.179 880.000,652.820 840.000,652.820 820.000,618.179 840.000,583.538 880.000,583.538\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"900.000,687.461 880.000,722.102 840.000,722.102 820.000,687.461 840.000,652.820 880.000,652.820\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"900.000,756.743 880.000,791.384 840.000,791.384 820.000,756.743 840.000,722.102 880.000,722.102\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"900.000,826.025 880.000,860.666 840.000,860.666 820.000,826.025 840.000,791.384 880.000,791.384\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"900.000,895.307 880.000,929.948 840.000,929.948 820.000,895.307 840.000,860.666 880.000,860.666\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"900.000,964.589 880.000,999.230 840.000,999.230 820.000,964.589 840.000,929.948 880.000,929.948\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"900.000,1033.872 880.000,1068.513 840.000,1068.513 820.000,1033.872 840.000,999.230 880.000,999.230\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"900.000,1103.154 880.000,1137.795 840.000,1137.795 820.000,1103.154 840.000,1068.513 880.000,1068.513\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"900.000,1172.436 880.000,1207.077 840.000,1207.077 820.000,1172.436 840.000,1137.795 880.000,1137.795\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"900.000,1241.718 880.000,1276.359 840.000,1276.359 820.000,1241.718 840.000,1207.077 880.000,1207.077\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"960.000,-40.000 940.000,-5.359 900.000,-5.359 880.000,-40.000 900.000,-74.641 940.000,-74.641\" fill=\"#3D5AFE\" stroke=\"#3D5AFE\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"960.000,29.282 940.000,63.923 900.000,63.923 880.000,29.282 900.000,-5.359 940.000,-5.359\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"960.000,98.564 940.000,133.205 900.000,133.205 880.000,98.564 900.000,63.923 940.000,63.923\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"960.000,167.846 940.000,202.487 900.000,202.487 880.000,167.846 900.000,133.205 940.000,133.205\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"960.000,237.128 940.000,271.769 900.000,271.769 880.000,237.128 900.000,202.487 940.000,202.487\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"960.000,306.410 940.000,341.051 900.000,341.051 880.000,306.410 900.000,271.769 940.000,271.769\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"960.000,375.692 940.000,410.333 900.000,410.333 880.000,375.692 900.000,341.051 940.000,341.051\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"960.000,444.974 940.000,479.615 900.000,479.615 880.000,444.974 900.000,410.333 940.000,410.333\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"960.000,514.256 940.000,548.897 900.000,548.897 880.000,514.256 900.000,479.615 940.000,479.615\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"960.000,583.538 940.000,618.179 900.000,618.179 880.000,583.538 900.000,548.897 940.000,548.897\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"960.000,652.820 940.000,687.461 900.000,687.461 880.000,652.820 900.000,618.179 940.000,618.179\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"960.000,722.102 940.000,756.743 900.000,756.743 880.000,722.102 900.000,687.461 940.000,687.461\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"960.000,791.384 940.000,826.025 900.000,826.025 880.000,791.384 900.000,756.743 940.000,756.743\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"960.000,860.666 940.000,895.307 900.000,895.307 880.000,860.666 900.000,826.025 940.000,826.025\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"960.000,929.948 940.000,964.589 900.000,964.589 880.000,929.948 900.000,895.307 940.000,895.307\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"960.000,999.230 940.000,1033.872 900.000,1033.872 880.000,999.230 900.000,964.589 940.000,964.589\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"960.000,1068.513 940.000,1103.154 900.000,1103.154 880.000,1068.513 900.000,1033.872 940.000,1033.872\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"960.000,1137.795 940.000,1172.436 900.000,1172.436 880.000,1137.795 900.000,1103.154 940.000,1103.154\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"960.000,1207.077 940.000,1241.718 900.000,1241.718 880.000,1207.077 900.000,1172.436 940.000,1172.436\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1020.000,-5.359 1000.000,29.282 960.000,29.282 940.000,-5.359 960.000,-40.000 1000.000,-40.000\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1020.000,63.923 1000.000,98.564 960.000,98.564 940.000,63.923 960.000,29.282 1000.000,29.282\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1020.000,133.205 1000.000,167.846 960.000,167.846 940.000,133.205 960.000,98.564 1000.000,98.564\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1020.000,202.487 1000.000,237.128 960.000,237.128 940.000,202.487 960.000,167.846 1000.000,167.846\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1020.000,271.769 1000.000,306.410 960.000,306.410 940.000,271.769 960.000,237.128 1000.000,237.128\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1020.000,341.051 1000.000,375.692 960.000,375.692 940.000,341.051 960.000,306.410 1000.000,306.410\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1020.000,410.333 1000.000,444.974 960.000,444.974 940.000,410.333 960.000,375.692 1000.000,375.692\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1020.000,479.615 1000.000,514.256 960.000,514.256 940.000,479.615 960.000,444.974 1000.000,444.974\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1020.000,548.897 1000.000,583.538 960.000,583.538 940.000,548.897 960.000,514.256 1000.000,514.256\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1020.000,618.179 1000.000,652.820 960.000,652.820 940.000,618.179 960.000,583.538 1000.000,583.538\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1020.000,687.461 1000.000,722.102 960.000,722.102 940.000,687.461 960.000,652.820 1000.000,652.820\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1020.000,756.743 1000.000,791.384 960.000,791.384 940.000,756.743 960.000,722.102 1000.000,722.102\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1020.000,826.025 1000.000,860.666 960.000,860.666 940.000,826.025 960.000,791.384 1000.000,791.384\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1020.000,895.307 1000.000,929.948 960.000,929.948 940.000,895.307 960.000,860.666 1000.000,860.666\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1020.000,964.589 1000.000,999.230 960.000,999.230 940.000,964.589 960.000,929.948 1000.000,929.948\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1020.000,1033.872 1000.000,1068.513 960.000,1068.513 940.000,1033.872 960.000,999.230 1000.000,999.230\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1020.000,1103.154 1000.000,1137.795 960.000,1137.795 940.000,1103.154 960.000,1068.513 1000.000,1068.513\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1020.000,1172.436 1000.000,1207.077 960.000,1207.077 940.000,1172.436 960.000,1137.795 1000.000,1137.795\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1020.000,1241.718 1000.000,1276.359 960.000,1276.359 940.000,1241.718 960.000,1207.077 1000.000,1207.077\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1080.000,-40.000 1060.000,-5.359 1020.000,-5.359 1000.000,-40.000 1020.000,-74.641 1060.000,-74.641\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1080.000,29.282 1060.000,63.923 1020.000,63.923 1000.000,29.282 1020.000,-5.359 1060.000,-5.359\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1080.000,98.564 1060.000,133.205 1020.000,133.205 1000.000,98.564 1020.000,63.923 1060.000,63.923\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1080.000,167.846 1060.000,202.487 1020.000,202.487 1000.000,167.846 1020.000,133.205 1060.000,133.205\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1080.000,237.128 1060.000,271.769 1020.000,271.769 1000.000,237.128 1020.000,202.487 1060.000,202.487\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1080.000,306.410 1060.000,341.051 1020.000,341.051 1000.000,306.410 1020.000,271.769 1060.000,271.769\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1080.000,375.692 1060.000,410.333 1020.000,410.333 1000.000,375.692 1020.000,341.051 1060.000,341.051\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1080.000,444.974 1060.000,479.615 1020.000,479.615 1000.000,444.974 1020.000,410.333 1060.000,410.333\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1080.000,514.256 1060.000,548.897 1020.000,548.897 1000.000,514.256 1020.000,479.615 1060.000,479.615\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1080.000,583.538 1060.000,618.179 1020.000,618.179 1000.000,583.538 1020.000,548.897 1060.000,548.897\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1080.000,652.820 1060.000,687.461 1020.000,687.461 1000.000,652.820 1020.000,618.179 1060.000,618.179\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1080.000,722.102 1060.000,756.743 1020.000,756.743 1000.000,722.102 1020.000,687.461 1060.000,687.461\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1080.000,791.384 1060.000,826.025 1020.000,826.025 1000.000,791.384 1020.000,756.743 1060.000,756.743\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1080.000,860.666 1060.000,895.307 1020.000,895.307 1000.000,860.666 1020.000,826.025 1060.000,826.025\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1080.000,929.948 1060.000,964.589 1020.000,964.589 1000.000,929.948 1020.000,895.307 1060.000,895.307\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1080.000,999.230 1060.000,1033.872 1020.000,1033.872 1000.000,999.230 1020.000,964.589 1060.000,964.589\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1080.000,1068.513 1060.000,1103.154 1020.000,1103.154 1000.000,1068.513 1020.000,1033.872 1060.000,1033.872\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1080.000,1137.795 1060.000,1172.436 1020.000,1172.436 1000.000,1137.795 1020.000,1103.154 1060.000,1103.154\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1080.000,1207.077 1060.000,1241.718 1020.000,1241.718 1000.000,1207.077 1020.000,1172.436 1060.000,1172.436\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1140.000,-5.359 1120.000,29.282 1080.000,29.282 1060.000,-5.359 1080.000,-40.000 1120.000,-40.000\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1140.000,63.923 1120.000,98.564 1080.000,98.564 1060.000,63.923 1080.000,29.282 1120.000,29.282\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1140.000,133.205 1120.000,167.846 1080.000,167.846 1060.000,133.205 1080.000,98.564 1120.000,98.564\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1140.000,202.487 1120.000,237.128 1080.000,237.128 1060.000,202.487 1080.000,167.846 1120.000,167.846\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1140.000,271.769 1120.000,306.410 1080.000,306.410 1060.000,271.769 1080.000,237.128 1120.000,237.128\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1140.000,341.051 1120.000,375.692 1080.000,375.692 1060.000,341.051 1080.000,306.410 1120.000,306.410\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1140.000,410.333 1120.000,444.974 1080.000,444.974 1060.000,410.333 1080.000,375.692 1120.000,375.692\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1140.000,479.615 1120.000,514.256 1080.000,514.256 1060.000,479.615 1080.000,444.974 1120.000,444.974\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1140.000,548.897 1120.000,583.538 1080.000,583.538 1060.000,548.897 1080.000,514.256 1120.000,514.256\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1140.000,618.179 1120.000,652.820 1080.000,652.820 1060.000,618.179 1080.000,583.538 1120.000,583.538\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1140.000,687.461 1120.000,722.102 1080.000,722.102 1060.000,687.461 1080.000,652.820 1120.000,652.820\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1140.000,756.743 1120.000,791.384 1080.000,791.384 1060.000,756.743 1080.000,722.102 1120.000,722.102\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1140.000,826.025 1120.000,860.666 1080.000,860.666 1060.000,826.025 1080.000,791.384 1120.000,791.384\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1140.000,895.307 1120.000,929.948 1080.000,929.948 1060.000,895.307 1080.000,860.666 1120.000,860.666\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1140.000,964.589 1120.000,999.230 1080.000,999.230 1060.000,964.589 1080.000,929.948 1120.000,929.948\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1140.000,1033.872 1120.000,1068.513 1080.000,1068.513 1060.000,1033.872 1080.000,999.230 1120.000,999.230\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1140.000,1103.154 1120.000,1137.795 1080.000,1137.795 1060.000,1103.154 1080.000,1068.513 1120.000,1068.513\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1140.000,1172.436 1120.000,1207.077 1080.000,1207.077 1060.000,1172.436 1080.000,1137.795 1120.000,1137.795\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1140.000,1241.718 1120.000,1276.359 1080.000,1276.359 1060.000,1241.718 1080.000,1207.077 1120.000,1207.077\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1200.000,-40.000 1180.000,-5.359 1140.000,-5.359 1120.000,-40.000 1140.000,-74.641 1180.000,-74.641\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1200.000,29.282 1180.000,63.923 1140.000,63.923 1120.000,29.282 1140.000,-5.359 1180.000,-5.359\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1200.000,98.564 1180.000,133.205 1140.000,133.205 1120.000,98.564 1140.000,63.923 1180.000,63.923\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1200.000,167.846 1180.000,202.487 1140.000,202.487 1120.000,167.846 1140.000,133.205 1180.000,133.205\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1200.000,237.128 1180.000,271.769 1140.000,271.769 1120.000,237.128 1140.000,202.487 1180.000,202.487\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1200.000,306.410 1180.000,341.051 1140.000,341.051 1120.000,306.410 1140.000,271.769 1180.000,271.769\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1200.000,375.692 1180.000,410.333 1140.000,410.333 1120.000,375.692 1140.000,341.051 1180.000,341.051\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1200.000,444.974 1180.000,479.615 1140.000,479.615 1120.000,444.974 1140.000,410.333 1180.000,410.333\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1200.000,514.256 1180.000,548.897 1140.000,548.897 1120.000,514.256 1140.000,479.615 1180.000,479.615\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1200.000,583.538 1180.000,618.179 1140.000,618.179 1120.000,583.538 1140.000,548.897 1180.000,548.897\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1200.000,652.820 1180.000,687.461 1140.000,687.461 1120.000,652.820 1140.000,618.179 1180.000,618.179\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1200.000,722.102 1180.000,756.743 1140.000,756.743 1120.000,722.102 1140.000,687.461 1180.000,687.461\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1200.000,791.384 1180.000,826.025 1140.000,826.025 1120.000,791.384 1140.000,756.743 1180.000,756.743\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1200.000,860.666 1180.000,895.307 1140.000,895.307 1120.000,860.666 1140.000,826.025 1180.000,826.025\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1200.000,929.948 1180.000,964.589 1140.000,964.589 1120.000,929.948 1140.000,895.307 1180.000,895.307\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1200.000,999.230 1180.000,1033.872 1140.000,1033.872 1120.000,999.230 1140.000,964.589 1180.000,964.589\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1200.000,1068.513 1180.000,1103.154 1140.000,1103.154 1120.000,1068.513 1140.000,1033.872 1180.000,1033.872\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1200.000,1137.795 1180.000,1172.436 1140.000,1172.436 1120.000,1137.795 1140.000,1103.154 1180.000,1103.154\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1200.000,1207.077 1180.000,1241.718 1140.000,1241.718 1120.000,1207.077 1140.000,1172.436 1180.000,1172.436\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1260.000,-5.359 1240.000,29.282 1200.000,29.282 1180.000,-5.359 1200.000,-40.000 1240.000,-40.000\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1260.000,63.923 1240.000,98.564 1200.000,98.564 1180.000,63.923 1200.000,29.282 1240.000,29.282\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1260.000,133.205 1240.000,167.846 1200.000,167.846 1180.000,133.205 1200.000,98.564 1240.000,98.564\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1260.000,202.487 1240.000,237.128 1200.000,237.128 1180.000,202.487 1200.000,167.846 1240.000,167.846\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1260.000,271.769 1240.000,306.410 1200.000,306.410 1180.000,271.769 1200.000,237.128 1240.000,237.128\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1260.000,341.051 1240.000,375.692 1200.000,375.692 1180.000,341.051 1200.000,306.410 1240.000,306.410\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1260.000,410.333 1240.000,444.974 1200.000,444.974 1180.000,410.333 1200.000,375.692 1240.000,375.692\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1260.000,479.615 1240.000,514.256 1200.000,514.256 1180.000,479.615 1200.000,444.974 1240.000,444.974\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1260.000,548.897 1240.000,583.538 1200.000,583.538 1180.000,548.897 1200.000,514.256 1240.000,514.256\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1260.000,618.179 1240.000,652.820 1200.000,652.820 1180.000,618.179 1200.000,583.538 1240.000,583.538\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1260.000,687.461 1240.000,722.102 1200.000,722.102 1180.000,687.461 1200.000,652.820 1240.000,652.820\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1260.000,756.743 1240.000,791.384 1200.000,791.384 1180.000,756.743 1200.000,722.102 1240.000,722.102\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1260.000,826.025 1240.000,860.666 1200.000,860.666 1180.000,826.025 1200.000,791.384 1240.000,791.384\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1260.000,895.307 1240.000,929.948 1200.000,929.948 1180.000,895.307 1200.000,860.666 1240.000,860.666\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1260.000,964.589 1240.000,999.230 1200.000,999.230 1180.000,964.589 1200.000,929.948 1240.000,929.948\" fill=\"none\" stroke=\"#1B1A17\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1260.000,1033.872 1240.000,1068.513 1200.000,1068.513 1180.000,1033.872 1200.000,999.230 1240.000,999.230\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1260.000,1103.154 1240.000,1137.795 1200.000,1137.795 1180.000,1103.154 1200.000,1068.513 1240.000,1068.513\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1260.000,1172.436 1240.000,1207.077 1200.000,1207.077 1180.000,1172.436 1200.000,1137.795 1240.000,1137.795\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3\" opacity=\"1.0\"/>\n<polygon points=\"1260.000,1241.718 1240.000,1276.359 1200.000,1276.359 1180.000,1241.718 1200.000,1207.077 1240.000,1207.077\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3\" opacity=\"1.0\"/></svg>\n"
106
+ },
107
+ {
108
+ "path": "backgrounds/honeycomb-splash-stone-1080x1920.png",
109
+ "mimeType": "image/png",
110
+ "bytes": 83558,
111
+ "encoding": "base64",
112
+ "content": "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"
113
+ },
114
+ {
115
+ "path": "backgrounds/honeycomb-splash-stone.svg",
116
+ "mimeType": "image/svg+xml",
117
+ "bytes": 51128,
118
+ "encoding": "utf8",
119
+ "content": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1080 1920\" width=\"1080\" height=\"1920\"><rect width=\"1080\" height=\"1920\" fill=\"#1B1A17\"/><polygon points=\"0.000,-60.000 -30.000,-8.038 -90.000,-8.038 -120.000,-60.000 -90.000,-111.962 -30.000,-111.962\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"0.000,43.923 -30.000,95.885 -90.000,95.885 -120.000,43.923 -90.000,-8.038 -30.000,-8.038\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"0.000,147.846 -30.000,199.808 -90.000,199.808 -120.000,147.846 -90.000,95.885 -30.000,95.885\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"0.000,251.769 -30.000,303.731 -90.000,303.731 -120.000,251.769 -90.000,199.808 -30.000,199.808\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"0.000,355.692 -30.000,407.654 -90.000,407.654 -120.000,355.692 -90.000,303.731 -30.000,303.731\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"0.000,459.615 -30.000,511.577 -90.000,511.577 -120.000,459.615 -90.000,407.654 -30.000,407.654\" fill=\"#FFD740\" stroke=\"#FFD740\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"0.000,563.538 -30.000,615.500 -90.000,615.500 -120.000,563.538 -90.000,511.577 -30.000,511.577\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"0.000,667.461 -30.000,719.423 -90.000,719.423 -120.000,667.461 -90.000,615.500 -30.000,615.500\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"0.000,771.384 -30.000,823.346 -90.000,823.346 -120.000,771.384 -90.000,719.423 -30.000,719.423\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"0.000,875.307 -30.000,927.269 -90.000,927.269 -120.000,875.307 -90.000,823.346 -30.000,823.346\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"0.000,979.230 -30.000,1031.192 -90.000,1031.192 -120.000,979.230 -90.000,927.269 -30.000,927.269\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"0.000,1083.154 -30.000,1135.115 -90.000,1135.115 -120.000,1083.154 -90.000,1031.192 -30.000,1031.192\" fill=\"#FFD740\" stroke=\"#FFD740\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"0.000,1187.077 -30.000,1239.038 -90.000,1239.038 -120.000,1187.077 -90.000,1135.115 -30.000,1135.115\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"0.000,1291.000 -30.000,1342.961 -90.000,1342.961 -120.000,1291.000 -90.000,1239.038 -30.000,1239.038\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"0.000,1394.923 -30.000,1446.884 -90.000,1446.884 -120.000,1394.923 -90.000,1342.961 -30.000,1342.961\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"0.000,1498.846 -30.000,1550.807 -90.000,1550.807 -120.000,1498.846 -90.000,1446.884 -30.000,1446.884\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"0.000,1602.769 -30.000,1654.730 -90.000,1654.730 -120.000,1602.769 -90.000,1550.807 -30.000,1550.807\" fill=\"#FFD740\" stroke=\"#FFD740\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"0.000,1706.692 -30.000,1758.653 -90.000,1758.653 -120.000,1706.692 -90.000,1654.730 -30.000,1654.730\" fill=\"#FFD740\" stroke=\"#FFD740\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"0.000,1810.615 -30.000,1862.576 -90.000,1862.576 -120.000,1810.615 -90.000,1758.653 -30.000,1758.653\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"0.000,1914.538 -30.000,1966.499 -90.000,1966.499 -120.000,1914.538 -90.000,1862.576 -30.000,1862.576\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"90.000,-8.038 60.000,43.923 0.000,43.923 -30.000,-8.038 -0.000,-60.000 60.000,-60.000\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"90.000,95.885 60.000,147.846 0.000,147.846 -30.000,95.885 -0.000,43.923 60.000,43.923\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"90.000,199.808 60.000,251.769 0.000,251.769 -30.000,199.808 -0.000,147.846 60.000,147.846\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"90.000,303.731 60.000,355.692 0.000,355.692 -30.000,303.731 -0.000,251.769 60.000,251.769\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"90.000,407.654 60.000,459.615 0.000,459.615 -30.000,407.654 -0.000,355.692 60.000,355.692\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"90.000,511.577 60.000,563.538 0.000,563.538 -30.000,511.577 -0.000,459.615 60.000,459.615\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"90.000,615.500 60.000,667.461 0.000,667.461 -30.000,615.500 -0.000,563.538 60.000,563.538\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"90.000,719.423 60.000,771.384 0.000,771.384 -30.000,719.423 -0.000,667.461 60.000,667.461\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"90.000,823.346 60.000,875.307 0.000,875.307 -30.000,823.346 -0.000,771.384 60.000,771.384\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"90.000,927.269 60.000,979.230 0.000,979.230 -30.000,927.269 -0.000,875.307 60.000,875.307\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"90.000,1031.192 60.000,1083.154 0.000,1083.154 -30.000,1031.192 -0.000,979.230 60.000,979.230\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"90.000,1135.115 60.000,1187.077 0.000,1187.077 -30.000,1135.115 -0.000,1083.154 60.000,1083.154\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"90.000,1239.038 60.000,1291.000 0.000,1291.000 -30.000,1239.038 -0.000,1187.077 60.000,1187.077\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"90.000,1342.961 60.000,1394.923 0.000,1394.923 -30.000,1342.961 -0.000,1291.000 60.000,1291.000\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"90.000,1446.884 60.000,1498.846 0.000,1498.846 -30.000,1446.884 -0.000,1394.923 60.000,1394.923\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"90.000,1550.807 60.000,1602.769 0.000,1602.769 -30.000,1550.807 -0.000,1498.846 60.000,1498.846\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"90.000,1654.730 60.000,1706.692 0.000,1706.692 -30.000,1654.730 -0.000,1602.769 60.000,1602.769\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"90.000,1758.653 60.000,1810.615 0.000,1810.615 -30.000,1758.653 -0.000,1706.692 60.000,1706.692\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"90.000,1862.576 60.000,1914.538 0.000,1914.538 -30.000,1862.576 -0.000,1810.615 60.000,1810.615\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"90.000,1966.499 60.000,2018.461 0.000,2018.461 -30.000,1966.499 -0.000,1914.538 60.000,1914.538\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"180.000,-60.000 150.000,-8.038 90.000,-8.038 60.000,-60.000 90.000,-111.962 150.000,-111.962\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"180.000,43.923 150.000,95.885 90.000,95.885 60.000,43.923 90.000,-8.038 150.000,-8.038\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"180.000,147.846 150.000,199.808 90.000,199.808 60.000,147.846 90.000,95.885 150.000,95.885\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"180.000,251.769 150.000,303.731 90.000,303.731 60.000,251.769 90.000,199.808 150.000,199.808\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"180.000,355.692 150.000,407.654 90.000,407.654 60.000,355.692 90.000,303.731 150.000,303.731\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"180.000,459.615 150.000,511.577 90.000,511.577 60.000,459.615 90.000,407.654 150.000,407.654\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"180.000,563.538 150.000,615.500 90.000,615.500 60.000,563.538 90.000,511.577 150.000,511.577\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"180.000,667.461 150.000,719.423 90.000,719.423 60.000,667.461 90.000,615.500 150.000,615.500\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"180.000,771.384 150.000,823.346 90.000,823.346 60.000,771.384 90.000,719.423 150.000,719.423\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"180.000,875.307 150.000,927.269 90.000,927.269 60.000,875.307 90.000,823.346 150.000,823.346\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"180.000,979.230 150.000,1031.192 90.000,1031.192 60.000,979.230 90.000,927.269 150.000,927.269\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"180.000,1083.154 150.000,1135.115 90.000,1135.115 60.000,1083.154 90.000,1031.192 150.000,1031.192\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"180.000,1187.077 150.000,1239.038 90.000,1239.038 60.000,1187.077 90.000,1135.115 150.000,1135.115\" fill=\"#FFD740\" stroke=\"#FFD740\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"180.000,1291.000 150.000,1342.961 90.000,1342.961 60.000,1291.000 90.000,1239.038 150.000,1239.038\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"180.000,1394.923 150.000,1446.884 90.000,1446.884 60.000,1394.923 90.000,1342.961 150.000,1342.961\" fill=\"#FFD740\" stroke=\"#FFD740\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"180.000,1498.846 150.000,1550.807 90.000,1550.807 60.000,1498.846 90.000,1446.884 150.000,1446.884\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"180.000,1602.769 150.000,1654.730 90.000,1654.730 60.000,1602.769 90.000,1550.807 150.000,1550.807\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"180.000,1706.692 150.000,1758.653 90.000,1758.653 60.000,1706.692 90.000,1654.730 150.000,1654.730\" fill=\"#FFD740\" stroke=\"#FFD740\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"180.000,1810.615 150.000,1862.576 90.000,1862.576 60.000,1810.615 90.000,1758.653 150.000,1758.653\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"180.000,1914.538 150.000,1966.499 90.000,1966.499 60.000,1914.538 90.000,1862.576 150.000,1862.576\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"270.000,-8.038 240.000,43.923 180.000,43.923 150.000,-8.038 180.000,-60.000 240.000,-60.000\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"270.000,95.885 240.000,147.846 180.000,147.846 150.000,95.885 180.000,43.923 240.000,43.923\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"270.000,199.808 240.000,251.769 180.000,251.769 150.000,199.808 180.000,147.846 240.000,147.846\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"270.000,303.731 240.000,355.692 180.000,355.692 150.000,303.731 180.000,251.769 240.000,251.769\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"270.000,407.654 240.000,459.615 180.000,459.615 150.000,407.654 180.000,355.692 240.000,355.692\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"270.000,511.577 240.000,563.538 180.000,563.538 150.000,511.577 180.000,459.615 240.000,459.615\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"270.000,615.500 240.000,667.461 180.000,667.461 150.000,615.500 180.000,563.538 240.000,563.538\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"270.000,719.423 240.000,771.384 180.000,771.384 150.000,719.423 180.000,667.461 240.000,667.461\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"270.000,823.346 240.000,875.307 180.000,875.307 150.000,823.346 180.000,771.384 240.000,771.384\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"270.000,927.269 240.000,979.230 180.000,979.230 150.000,927.269 180.000,875.307 240.000,875.307\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"270.000,1031.192 240.000,1083.154 180.000,1083.154 150.000,1031.192 180.000,979.230 240.000,979.230\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"270.000,1135.115 240.000,1187.077 180.000,1187.077 150.000,1135.115 180.000,1083.154 240.000,1083.154\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"270.000,1239.038 240.000,1291.000 180.000,1291.000 150.000,1239.038 180.000,1187.077 240.000,1187.077\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"270.000,1342.961 240.000,1394.923 180.000,1394.923 150.000,1342.961 180.000,1291.000 240.000,1291.000\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"270.000,1446.884 240.000,1498.846 180.000,1498.846 150.000,1446.884 180.000,1394.923 240.000,1394.923\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"270.000,1550.807 240.000,1602.769 180.000,1602.769 150.000,1550.807 180.000,1498.846 240.000,1498.846\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"270.000,1654.730 240.000,1706.692 180.000,1706.692 150.000,1654.730 180.000,1602.769 240.000,1602.769\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"270.000,1758.653 240.000,1810.615 180.000,1810.615 150.000,1758.653 180.000,1706.692 240.000,1706.692\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"270.000,1862.576 240.000,1914.538 180.000,1914.538 150.000,1862.576 180.000,1810.615 240.000,1810.615\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"270.000,1966.499 240.000,2018.461 180.000,2018.461 150.000,1966.499 180.000,1914.538 240.000,1914.538\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"360.000,-60.000 330.000,-8.038 270.000,-8.038 240.000,-60.000 270.000,-111.962 330.000,-111.962\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"360.000,43.923 330.000,95.885 270.000,95.885 240.000,43.923 270.000,-8.038 330.000,-8.038\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"360.000,147.846 330.000,199.808 270.000,199.808 240.000,147.846 270.000,95.885 330.000,95.885\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"360.000,251.769 330.000,303.731 270.000,303.731 240.000,251.769 270.000,199.808 330.000,199.808\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"360.000,355.692 330.000,407.654 270.000,407.654 240.000,355.692 270.000,303.731 330.000,303.731\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"360.000,459.615 330.000,511.577 270.000,511.577 240.000,459.615 270.000,407.654 330.000,407.654\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"360.000,563.538 330.000,615.500 270.000,615.500 240.000,563.538 270.000,511.577 330.000,511.577\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"360.000,667.461 330.000,719.423 270.000,719.423 240.000,667.461 270.000,615.500 330.000,615.500\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"360.000,771.384 330.000,823.346 270.000,823.346 240.000,771.384 270.000,719.423 330.000,719.423\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"360.000,875.307 330.000,927.269 270.000,927.269 240.000,875.307 270.000,823.346 330.000,823.346\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"360.000,979.230 330.000,1031.192 270.000,1031.192 240.000,979.230 270.000,927.269 330.000,927.269\" fill=\"#FFD740\" stroke=\"#FFD740\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"360.000,1083.154 330.000,1135.115 270.000,1135.115 240.000,1083.154 270.000,1031.192 330.000,1031.192\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"360.000,1187.077 330.000,1239.038 270.000,1239.038 240.000,1187.077 270.000,1135.115 330.000,1135.115\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"360.000,1291.000 330.000,1342.961 270.000,1342.961 240.000,1291.000 270.000,1239.038 330.000,1239.038\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"360.000,1394.923 330.000,1446.884 270.000,1446.884 240.000,1394.923 270.000,1342.961 330.000,1342.961\" fill=\"#FFD740\" stroke=\"#FFD740\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"360.000,1498.846 330.000,1550.807 270.000,1550.807 240.000,1498.846 270.000,1446.884 330.000,1446.884\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"360.000,1602.769 330.000,1654.730 270.000,1654.730 240.000,1602.769 270.000,1550.807 330.000,1550.807\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"360.000,1706.692 330.000,1758.653 270.000,1758.653 240.000,1706.692 270.000,1654.730 330.000,1654.730\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"360.000,1810.615 330.000,1862.576 270.000,1862.576 240.000,1810.615 270.000,1758.653 330.000,1758.653\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"360.000,1914.538 330.000,1966.499 270.000,1966.499 240.000,1914.538 270.000,1862.576 330.000,1862.576\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"450.000,-8.038 420.000,43.923 360.000,43.923 330.000,-8.038 360.000,-60.000 420.000,-60.000\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"450.000,95.885 420.000,147.846 360.000,147.846 330.000,95.885 360.000,43.923 420.000,43.923\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"450.000,199.808 420.000,251.769 360.000,251.769 330.000,199.808 360.000,147.846 420.000,147.846\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"450.000,303.731 420.000,355.692 360.000,355.692 330.000,303.731 360.000,251.769 420.000,251.769\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"450.000,407.654 420.000,459.615 360.000,459.615 330.000,407.654 360.000,355.692 420.000,355.692\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"450.000,511.577 420.000,563.538 360.000,563.538 330.000,511.577 360.000,459.615 420.000,459.615\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"450.000,615.500 420.000,667.461 360.000,667.461 330.000,615.500 360.000,563.538 420.000,563.538\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"450.000,719.423 420.000,771.384 360.000,771.384 330.000,719.423 360.000,667.461 420.000,667.461\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"450.000,823.346 420.000,875.307 360.000,875.307 330.000,823.346 360.000,771.384 420.000,771.384\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"450.000,927.269 420.000,979.230 360.000,979.230 330.000,927.269 360.000,875.307 420.000,875.307\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"450.000,1031.192 420.000,1083.154 360.000,1083.154 330.000,1031.192 360.000,979.230 420.000,979.230\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"450.000,1135.115 420.000,1187.077 360.000,1187.077 330.000,1135.115 360.000,1083.154 420.000,1083.154\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"450.000,1239.038 420.000,1291.000 360.000,1291.000 330.000,1239.038 360.000,1187.077 420.000,1187.077\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"450.000,1342.961 420.000,1394.923 360.000,1394.923 330.000,1342.961 360.000,1291.000 420.000,1291.000\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"450.000,1446.884 420.000,1498.846 360.000,1498.846 330.000,1446.884 360.000,1394.923 420.000,1394.923\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"450.000,1550.807 420.000,1602.769 360.000,1602.769 330.000,1550.807 360.000,1498.846 420.000,1498.846\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"450.000,1654.730 420.000,1706.692 360.000,1706.692 330.000,1654.730 360.000,1602.769 420.000,1602.769\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"450.000,1758.653 420.000,1810.615 360.000,1810.615 330.000,1758.653 360.000,1706.692 420.000,1706.692\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"450.000,1862.576 420.000,1914.538 360.000,1914.538 330.000,1862.576 360.000,1810.615 420.000,1810.615\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"450.000,1966.499 420.000,2018.461 360.000,2018.461 330.000,1966.499 360.000,1914.538 420.000,1914.538\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"540.000,-60.000 510.000,-8.038 450.000,-8.038 420.000,-60.000 450.000,-111.962 510.000,-111.962\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"540.000,43.923 510.000,95.885 450.000,95.885 420.000,43.923 450.000,-8.038 510.000,-8.038\" fill=\"#FFD740\" stroke=\"#FFD740\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"540.000,147.846 510.000,199.808 450.000,199.808 420.000,147.846 450.000,95.885 510.000,95.885\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"540.000,251.769 510.000,303.731 450.000,303.731 420.000,251.769 450.000,199.808 510.000,199.808\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"540.000,355.692 510.000,407.654 450.000,407.654 420.000,355.692 450.000,303.731 510.000,303.731\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"540.000,459.615 510.000,511.577 450.000,511.577 420.000,459.615 450.000,407.654 510.000,407.654\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"540.000,563.538 510.000,615.500 450.000,615.500 420.000,563.538 450.000,511.577 510.000,511.577\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"540.000,667.461 510.000,719.423 450.000,719.423 420.000,667.461 450.000,615.500 510.000,615.500\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"540.000,771.384 510.000,823.346 450.000,823.346 420.000,771.384 450.000,719.423 510.000,719.423\" fill=\"#FFD740\" stroke=\"#FFD740\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"540.000,875.307 510.000,927.269 450.000,927.269 420.000,875.307 450.000,823.346 510.000,823.346\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"540.000,979.230 510.000,1031.192 450.000,1031.192 420.000,979.230 450.000,927.269 510.000,927.269\" fill=\"#FFD740\" stroke=\"#FFD740\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"540.000,1083.154 510.000,1135.115 450.000,1135.115 420.000,1083.154 450.000,1031.192 510.000,1031.192\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"540.000,1187.077 510.000,1239.038 450.000,1239.038 420.000,1187.077 450.000,1135.115 510.000,1135.115\" fill=\"#FFD740\" stroke=\"#FFD740\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"540.000,1291.000 510.000,1342.961 450.000,1342.961 420.000,1291.000 450.000,1239.038 510.000,1239.038\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"540.000,1394.923 510.000,1446.884 450.000,1446.884 420.000,1394.923 450.000,1342.961 510.000,1342.961\" fill=\"#FFD740\" stroke=\"#FFD740\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"540.000,1498.846 510.000,1550.807 450.000,1550.807 420.000,1498.846 450.000,1446.884 510.000,1446.884\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"540.000,1602.769 510.000,1654.730 450.000,1654.730 420.000,1602.769 450.000,1550.807 510.000,1550.807\" fill=\"#FFD740\" stroke=\"#FFD740\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"540.000,1706.692 510.000,1758.653 450.000,1758.653 420.000,1706.692 450.000,1654.730 510.000,1654.730\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"540.000,1810.615 510.000,1862.576 450.000,1862.576 420.000,1810.615 450.000,1758.653 510.000,1758.653\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"540.000,1914.538 510.000,1966.499 450.000,1966.499 420.000,1914.538 450.000,1862.576 510.000,1862.576\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"630.000,-8.038 600.000,43.923 540.000,43.923 510.000,-8.038 540.000,-60.000 600.000,-60.000\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"630.000,95.885 600.000,147.846 540.000,147.846 510.000,95.885 540.000,43.923 600.000,43.923\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"630.000,199.808 600.000,251.769 540.000,251.769 510.000,199.808 540.000,147.846 600.000,147.846\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"630.000,303.731 600.000,355.692 540.000,355.692 510.000,303.731 540.000,251.769 600.000,251.769\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"630.000,407.654 600.000,459.615 540.000,459.615 510.000,407.654 540.000,355.692 600.000,355.692\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"630.000,511.577 600.000,563.538 540.000,563.538 510.000,511.577 540.000,459.615 600.000,459.615\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"630.000,615.500 600.000,667.461 540.000,667.461 510.000,615.500 540.000,563.538 600.000,563.538\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"630.000,719.423 600.000,771.384 540.000,771.384 510.000,719.423 540.000,667.461 600.000,667.461\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"630.000,823.346 600.000,875.307 540.000,875.307 510.000,823.346 540.000,771.384 600.000,771.384\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"630.000,927.269 600.000,979.230 540.000,979.230 510.000,927.269 540.000,875.307 600.000,875.307\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"630.000,1031.192 600.000,1083.154 540.000,1083.154 510.000,1031.192 540.000,979.230 600.000,979.230\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"630.000,1135.115 600.000,1187.077 540.000,1187.077 510.000,1135.115 540.000,1083.154 600.000,1083.154\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"630.000,1239.038 600.000,1291.000 540.000,1291.000 510.000,1239.038 540.000,1187.077 600.000,1187.077\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"630.000,1342.961 600.000,1394.923 540.000,1394.923 510.000,1342.961 540.000,1291.000 600.000,1291.000\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"630.000,1446.884 600.000,1498.846 540.000,1498.846 510.000,1446.884 540.000,1394.923 600.000,1394.923\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"630.000,1550.807 600.000,1602.769 540.000,1602.769 510.000,1550.807 540.000,1498.846 600.000,1498.846\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"630.000,1654.730 600.000,1706.692 540.000,1706.692 510.000,1654.730 540.000,1602.769 600.000,1602.769\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"630.000,1758.653 600.000,1810.615 540.000,1810.615 510.000,1758.653 540.000,1706.692 600.000,1706.692\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"630.000,1862.576 600.000,1914.538 540.000,1914.538 510.000,1862.576 540.000,1810.615 600.000,1810.615\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"630.000,1966.499 600.000,2018.461 540.000,2018.461 510.000,1966.499 540.000,1914.538 600.000,1914.538\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"720.000,-60.000 690.000,-8.038 630.000,-8.038 600.000,-60.000 630.000,-111.962 690.000,-111.962\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"720.000,43.923 690.000,95.885 630.000,95.885 600.000,43.923 630.000,-8.038 690.000,-8.038\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"720.000,147.846 690.000,199.808 630.000,199.808 600.000,147.846 630.000,95.885 690.000,95.885\" fill=\"#FFD740\" stroke=\"#FFD740\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"720.000,251.769 690.000,303.731 630.000,303.731 600.000,251.769 630.000,199.808 690.000,199.808\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"720.000,355.692 690.000,407.654 630.000,407.654 600.000,355.692 630.000,303.731 690.000,303.731\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"720.000,459.615 690.000,511.577 630.000,511.577 600.000,459.615 630.000,407.654 690.000,407.654\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"720.000,563.538 690.000,615.500 630.000,615.500 600.000,563.538 630.000,511.577 690.000,511.577\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"720.000,667.461 690.000,719.423 630.000,719.423 600.000,667.461 630.000,615.500 690.000,615.500\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"720.000,771.384 690.000,823.346 630.000,823.346 600.000,771.384 630.000,719.423 690.000,719.423\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"720.000,875.307 690.000,927.269 630.000,927.269 600.000,875.307 630.000,823.346 690.000,823.346\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"720.000,979.230 690.000,1031.192 630.000,1031.192 600.000,979.230 630.000,927.269 690.000,927.269\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"720.000,1083.154 690.000,1135.115 630.000,1135.115 600.000,1083.154 630.000,1031.192 690.000,1031.192\" fill=\"#FFD740\" stroke=\"#FFD740\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"720.000,1187.077 690.000,1239.038 630.000,1239.038 600.000,1187.077 630.000,1135.115 690.000,1135.115\" fill=\"#FFD740\" stroke=\"#FFD740\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"720.000,1291.000 690.000,1342.961 630.000,1342.961 600.000,1291.000 630.000,1239.038 690.000,1239.038\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"720.000,1394.923 690.000,1446.884 630.000,1446.884 600.000,1394.923 630.000,1342.961 690.000,1342.961\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"720.000,1498.846 690.000,1550.807 630.000,1550.807 600.000,1498.846 630.000,1446.884 690.000,1446.884\" fill=\"#FFD740\" stroke=\"#FFD740\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"720.000,1602.769 690.000,1654.730 630.000,1654.730 600.000,1602.769 630.000,1550.807 690.000,1550.807\" fill=\"#FFD740\" stroke=\"#FFD740\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"720.000,1706.692 690.000,1758.653 630.000,1758.653 600.000,1706.692 630.000,1654.730 690.000,1654.730\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"720.000,1810.615 690.000,1862.576 630.000,1862.576 600.000,1810.615 630.000,1758.653 690.000,1758.653\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"720.000,1914.538 690.000,1966.499 630.000,1966.499 600.000,1914.538 630.000,1862.576 690.000,1862.576\" fill=\"#FFD740\" stroke=\"#FFD740\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"810.000,-8.038 780.000,43.923 720.000,43.923 690.000,-8.038 720.000,-60.000 780.000,-60.000\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"810.000,95.885 780.000,147.846 720.000,147.846 690.000,95.885 720.000,43.923 780.000,43.923\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"810.000,199.808 780.000,251.769 720.000,251.769 690.000,199.808 720.000,147.846 780.000,147.846\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"810.000,303.731 780.000,355.692 720.000,355.692 690.000,303.731 720.000,251.769 780.000,251.769\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"810.000,407.654 780.000,459.615 720.000,459.615 690.000,407.654 720.000,355.692 780.000,355.692\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"810.000,511.577 780.000,563.538 720.000,563.538 690.000,511.577 720.000,459.615 780.000,459.615\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"810.000,615.500 780.000,667.461 720.000,667.461 690.000,615.500 720.000,563.538 780.000,563.538\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"810.000,719.423 780.000,771.384 720.000,771.384 690.000,719.423 720.000,667.461 780.000,667.461\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"810.000,823.346 780.000,875.307 720.000,875.307 690.000,823.346 720.000,771.384 780.000,771.384\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"810.000,927.269 780.000,979.230 720.000,979.230 690.000,927.269 720.000,875.307 780.000,875.307\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"810.000,1031.192 780.000,1083.154 720.000,1083.154 690.000,1031.192 720.000,979.230 780.000,979.230\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"810.000,1135.115 780.000,1187.077 720.000,1187.077 690.000,1135.115 720.000,1083.154 780.000,1083.154\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"810.000,1239.038 780.000,1291.000 720.000,1291.000 690.000,1239.038 720.000,1187.077 780.000,1187.077\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"810.000,1342.961 780.000,1394.923 720.000,1394.923 690.000,1342.961 720.000,1291.000 780.000,1291.000\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"810.000,1446.884 780.000,1498.846 720.000,1498.846 690.000,1446.884 720.000,1394.923 780.000,1394.923\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"810.000,1550.807 780.000,1602.769 720.000,1602.769 690.000,1550.807 720.000,1498.846 780.000,1498.846\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"810.000,1654.730 780.000,1706.692 720.000,1706.692 690.000,1654.730 720.000,1602.769 780.000,1602.769\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"810.000,1758.653 780.000,1810.615 720.000,1810.615 690.000,1758.653 720.000,1706.692 780.000,1706.692\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"810.000,1862.576 780.000,1914.538 720.000,1914.538 690.000,1862.576 720.000,1810.615 780.000,1810.615\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"810.000,1966.499 780.000,2018.461 720.000,2018.461 690.000,1966.499 720.000,1914.538 780.000,1914.538\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"900.000,-60.000 870.000,-8.038 810.000,-8.038 780.000,-60.000 810.000,-111.962 870.000,-111.962\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"900.000,43.923 870.000,95.885 810.000,95.885 780.000,43.923 810.000,-8.038 870.000,-8.038\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"900.000,147.846 870.000,199.808 810.000,199.808 780.000,147.846 810.000,95.885 870.000,95.885\" fill=\"#FFD740\" stroke=\"#FFD740\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"900.000,251.769 870.000,303.731 810.000,303.731 780.000,251.769 810.000,199.808 870.000,199.808\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"900.000,355.692 870.000,407.654 810.000,407.654 780.000,355.692 810.000,303.731 870.000,303.731\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"900.000,459.615 870.000,511.577 810.000,511.577 780.000,459.615 810.000,407.654 870.000,407.654\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"900.000,563.538 870.000,615.500 810.000,615.500 780.000,563.538 810.000,511.577 870.000,511.577\" fill=\"#FFD740\" stroke=\"#FFD740\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"900.000,667.461 870.000,719.423 810.000,719.423 780.000,667.461 810.000,615.500 870.000,615.500\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"900.000,771.384 870.000,823.346 810.000,823.346 780.000,771.384 810.000,719.423 870.000,719.423\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"900.000,875.307 870.000,927.269 810.000,927.269 780.000,875.307 810.000,823.346 870.000,823.346\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"900.000,979.230 870.000,1031.192 810.000,1031.192 780.000,979.230 810.000,927.269 870.000,927.269\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"900.000,1083.154 870.000,1135.115 810.000,1135.115 780.000,1083.154 810.000,1031.192 870.000,1031.192\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"900.000,1187.077 870.000,1239.038 810.000,1239.038 780.000,1187.077 810.000,1135.115 870.000,1135.115\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"900.000,1291.000 870.000,1342.961 810.000,1342.961 780.000,1291.000 810.000,1239.038 870.000,1239.038\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"900.000,1394.923 870.000,1446.884 810.000,1446.884 780.000,1394.923 810.000,1342.961 870.000,1342.961\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"900.000,1498.846 870.000,1550.807 810.000,1550.807 780.000,1498.846 810.000,1446.884 870.000,1446.884\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"900.000,1602.769 870.000,1654.730 810.000,1654.730 780.000,1602.769 810.000,1550.807 870.000,1550.807\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"900.000,1706.692 870.000,1758.653 810.000,1758.653 780.000,1706.692 810.000,1654.730 870.000,1654.730\" fill=\"#FFD740\" stroke=\"#FFD740\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"900.000,1810.615 870.000,1862.576 810.000,1862.576 780.000,1810.615 810.000,1758.653 870.000,1758.653\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"900.000,1914.538 870.000,1966.499 810.000,1966.499 780.000,1914.538 810.000,1862.576 870.000,1862.576\" fill=\"#FFD740\" stroke=\"#FFD740\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"990.000,-8.038 960.000,43.923 900.000,43.923 870.000,-8.038 900.000,-60.000 960.000,-60.000\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"990.000,95.885 960.000,147.846 900.000,147.846 870.000,95.885 900.000,43.923 960.000,43.923\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"990.000,199.808 960.000,251.769 900.000,251.769 870.000,199.808 900.000,147.846 960.000,147.846\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"990.000,303.731 960.000,355.692 900.000,355.692 870.000,303.731 900.000,251.769 960.000,251.769\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"990.000,407.654 960.000,459.615 900.000,459.615 870.000,407.654 900.000,355.692 960.000,355.692\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"990.000,511.577 960.000,563.538 900.000,563.538 870.000,511.577 900.000,459.615 960.000,459.615\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"990.000,615.500 960.000,667.461 900.000,667.461 870.000,615.500 900.000,563.538 960.000,563.538\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"990.000,719.423 960.000,771.384 900.000,771.384 870.000,719.423 900.000,667.461 960.000,667.461\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"990.000,823.346 960.000,875.307 900.000,875.307 870.000,823.346 900.000,771.384 960.000,771.384\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"990.000,927.269 960.000,979.230 900.000,979.230 870.000,927.269 900.000,875.307 960.000,875.307\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"990.000,1031.192 960.000,1083.154 900.000,1083.154 870.000,1031.192 900.000,979.230 960.000,979.230\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"990.000,1135.115 960.000,1187.077 900.000,1187.077 870.000,1135.115 900.000,1083.154 960.000,1083.154\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"990.000,1239.038 960.000,1291.000 900.000,1291.000 870.000,1239.038 900.000,1187.077 960.000,1187.077\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"990.000,1342.961 960.000,1394.923 900.000,1394.923 870.000,1342.961 900.000,1291.000 960.000,1291.000\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"990.000,1446.884 960.000,1498.846 900.000,1498.846 870.000,1446.884 900.000,1394.923 960.000,1394.923\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"990.000,1550.807 960.000,1602.769 900.000,1602.769 870.000,1550.807 900.000,1498.846 960.000,1498.846\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"990.000,1654.730 960.000,1706.692 900.000,1706.692 870.000,1654.730 900.000,1602.769 960.000,1602.769\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"990.000,1758.653 960.000,1810.615 900.000,1810.615 870.000,1758.653 900.000,1706.692 960.000,1706.692\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"990.000,1862.576 960.000,1914.538 900.000,1914.538 870.000,1862.576 900.000,1810.615 960.000,1810.615\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"990.000,1966.499 960.000,2018.461 900.000,2018.461 870.000,1966.499 900.000,1914.538 960.000,1914.538\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"1080.000,-60.000 1050.000,-8.038 990.000,-8.038 960.000,-60.000 990.000,-111.962 1050.000,-111.962\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"1080.000,43.923 1050.000,95.885 990.000,95.885 960.000,43.923 990.000,-8.038 1050.000,-8.038\" fill=\"#FFD740\" stroke=\"#FFD740\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"1080.000,147.846 1050.000,199.808 990.000,199.808 960.000,147.846 990.000,95.885 1050.000,95.885\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"1080.000,251.769 1050.000,303.731 990.000,303.731 960.000,251.769 990.000,199.808 1050.000,199.808\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"1080.000,355.692 1050.000,407.654 990.000,407.654 960.000,355.692 990.000,303.731 1050.000,303.731\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"1080.000,459.615 1050.000,511.577 990.000,511.577 960.000,459.615 990.000,407.654 1050.000,407.654\" fill=\"#FFD740\" stroke=\"#FFD740\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"1080.000,563.538 1050.000,615.500 990.000,615.500 960.000,563.538 990.000,511.577 1050.000,511.577\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"1080.000,667.461 1050.000,719.423 990.000,719.423 960.000,667.461 990.000,615.500 1050.000,615.500\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"1080.000,771.384 1050.000,823.346 990.000,823.346 960.000,771.384 990.000,719.423 1050.000,719.423\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"1080.000,875.307 1050.000,927.269 990.000,927.269 960.000,875.307 990.000,823.346 1050.000,823.346\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"1080.000,979.230 1050.000,1031.192 990.000,1031.192 960.000,979.230 990.000,927.269 1050.000,927.269\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"1080.000,1083.154 1050.000,1135.115 990.000,1135.115 960.000,1083.154 990.000,1031.192 1050.000,1031.192\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"1080.000,1187.077 1050.000,1239.038 990.000,1239.038 960.000,1187.077 990.000,1135.115 1050.000,1135.115\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"1080.000,1291.000 1050.000,1342.961 990.000,1342.961 960.000,1291.000 990.000,1239.038 1050.000,1239.038\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"1080.000,1394.923 1050.000,1446.884 990.000,1446.884 960.000,1394.923 990.000,1342.961 1050.000,1342.961\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"1080.000,1498.846 1050.000,1550.807 990.000,1550.807 960.000,1498.846 990.000,1446.884 1050.000,1446.884\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"1080.000,1602.769 1050.000,1654.730 990.000,1654.730 960.000,1602.769 990.000,1550.807 1050.000,1550.807\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"1080.000,1706.692 1050.000,1758.653 990.000,1758.653 960.000,1706.692 990.000,1654.730 1050.000,1654.730\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"1080.000,1810.615 1050.000,1862.576 990.000,1862.576 960.000,1810.615 990.000,1758.653 1050.000,1758.653\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"1080.000,1914.538 1050.000,1966.499 990.000,1966.499 960.000,1914.538 990.000,1862.576 1050.000,1862.576\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"1170.000,-8.038 1140.000,43.923 1080.000,43.923 1050.000,-8.038 1080.000,-60.000 1140.000,-60.000\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"1170.000,95.885 1140.000,147.846 1080.000,147.846 1050.000,95.885 1080.000,43.923 1140.000,43.923\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"1170.000,199.808 1140.000,251.769 1080.000,251.769 1050.000,199.808 1080.000,147.846 1140.000,147.846\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"1170.000,303.731 1140.000,355.692 1080.000,355.692 1050.000,303.731 1080.000,251.769 1140.000,251.769\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"1170.000,407.654 1140.000,459.615 1080.000,459.615 1050.000,407.654 1080.000,355.692 1140.000,355.692\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"1170.000,511.577 1140.000,563.538 1080.000,563.538 1050.000,511.577 1080.000,459.615 1140.000,459.615\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"1170.000,615.500 1140.000,667.461 1080.000,667.461 1050.000,615.500 1080.000,563.538 1140.000,563.538\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"1170.000,719.423 1140.000,771.384 1080.000,771.384 1050.000,719.423 1080.000,667.461 1140.000,667.461\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"1170.000,823.346 1140.000,875.307 1080.000,875.307 1050.000,823.346 1080.000,771.384 1140.000,771.384\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"1170.000,927.269 1140.000,979.230 1080.000,979.230 1050.000,927.269 1080.000,875.307 1140.000,875.307\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"1170.000,1031.192 1140.000,1083.154 1080.000,1083.154 1050.000,1031.192 1080.000,979.230 1140.000,979.230\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"1170.000,1135.115 1140.000,1187.077 1080.000,1187.077 1050.000,1135.115 1080.000,1083.154 1140.000,1083.154\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"1170.000,1239.038 1140.000,1291.000 1080.000,1291.000 1050.000,1239.038 1080.000,1187.077 1140.000,1187.077\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"1170.000,1342.961 1140.000,1394.923 1080.000,1394.923 1050.000,1342.961 1080.000,1291.000 1140.000,1291.000\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"1170.000,1446.884 1140.000,1498.846 1080.000,1498.846 1050.000,1446.884 1080.000,1394.923 1140.000,1394.923\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"1170.000,1550.807 1140.000,1602.769 1080.000,1602.769 1050.000,1550.807 1080.000,1498.846 1140.000,1498.846\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"1170.000,1654.730 1140.000,1706.692 1080.000,1706.692 1050.000,1654.730 1080.000,1602.769 1140.000,1602.769\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"1170.000,1758.653 1140.000,1810.615 1080.000,1810.615 1050.000,1758.653 1080.000,1706.692 1140.000,1706.692\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"1170.000,1862.576 1140.000,1914.538 1080.000,1914.538 1050.000,1862.576 1080.000,1810.615 1140.000,1810.615\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/>\n<polygon points=\"1170.000,1966.499 1140.000,2018.461 1080.000,2018.461 1050.000,1966.499 1080.000,1914.538 1140.000,1914.538\" fill=\"none\" stroke=\"none\" stroke-width=\"0\" opacity=\"1.0\"/><g transform=\"translate(540,860) scale(2.1)\"><g transform=\"translate(-100,-100)\"><polygon points=\"188.828,131.655 171.828,161.100 137.828,161.100 120.828,131.655 137.828,102.210 171.828,102.210\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/>\n<polygon points=\"134.000,163.310 117.000,192.755 83.000,192.755 66.000,163.310 83.000,133.865 117.000,133.865\" fill=\"#FFD740\" stroke=\"#FFD740\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/>\n<polygon points=\"79.172,131.655 62.172,161.100 28.172,161.100 11.172,131.655 28.172,102.210 62.172,102.210\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/>\n<polygon points=\"79.172,68.345 62.172,97.790 28.172,97.790 11.172,68.345 28.172,38.900 62.172,38.900\" fill=\"#FF8A65\" stroke=\"#FF8A65\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/>\n<polygon points=\"134.000,36.690 117.000,66.135 83.000,66.135 66.000,36.690 83.000,7.245 117.000,7.245\" fill=\"#3D5AFE\" stroke=\"#3D5AFE\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/>\n<polygon points=\"188.828,68.345 171.828,97.790 137.828,97.790 120.828,68.345 137.828,38.900 171.828,38.900\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/>\n<polygon points=\"134.000,100.000 117.000,129.445 83.000,129.445 66.000,100.000 83.000,70.555 117.000,70.555\" fill=\"#B388FF\" stroke=\"#B388FF\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/></g></g><text x=\"540\" y=\"1180\" text-anchor=\"middle\" font-family=\"Noto Serif, serif\" font-weight=\"600\" font-size=\"96\" fill=\"#F5F5F4\" letter-spacing=\"-2\">mukoko</text></svg>\n"
120
+ },
121
+ {
122
+ "path": "backgrounds/honeycomb-tanzanite-header.svg",
123
+ "mimeType": "image/svg+xml",
124
+ "bytes": 27820,
125
+ "encoding": "utf8",
126
+ "content": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1600 500\" width=\"1600\" height=\"500\"><rect width=\"1600\" height=\"500\" fill=\"#F3E5F5\"/><polygon points=\"0.000,-54.000 -27.000,-7.235 -81.000,-7.235 -108.000,-54.000 -81.000,-100.765 -27.000,-100.765\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"0.000,39.531 -27.000,86.296 -81.000,86.296 -108.000,39.531 -81.000,-7.235 -27.000,-7.235\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"0.000,133.061 -27.000,179.827 -81.000,179.827 -108.000,133.061 -81.000,86.296 -27.000,86.296\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"0.000,226.592 -27.000,273.358 -81.000,273.358 -108.000,226.592 -81.000,179.827 -27.000,179.827\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"0.000,320.123 -27.000,366.888 -81.000,366.888 -108.000,320.123 -81.000,273.358 -27.000,273.358\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"0.000,413.654 -27.000,460.419 -81.000,460.419 -108.000,413.654 -81.000,366.888 -27.000,366.888\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"0.000,507.184 -27.000,553.950 -81.000,553.950 -108.000,507.184 -81.000,460.419 -27.000,460.419\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"81.000,-7.235 54.000,39.531 0.000,39.531 -27.000,-7.235 -0.000,-54.000 54.000,-54.000\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"81.000,86.296 54.000,133.061 0.000,133.061 -27.000,86.296 -0.000,39.531 54.000,39.531\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"81.000,179.827 54.000,226.592 0.000,226.592 -27.000,179.827 -0.000,133.061 54.000,133.061\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"81.000,273.358 54.000,320.123 0.000,320.123 -27.000,273.358 -0.000,226.592 54.000,226.592\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"81.000,366.888 54.000,413.654 0.000,413.654 -27.000,366.888 -0.000,320.123 54.000,320.123\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"81.000,460.419 54.000,507.184 0.000,507.184 -27.000,460.419 -0.000,413.654 54.000,413.654\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"81.000,553.950 54.000,600.715 0.000,600.715 -27.000,553.950 -0.000,507.184 54.000,507.184\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"162.000,-54.000 135.000,-7.235 81.000,-7.235 54.000,-54.000 81.000,-100.765 135.000,-100.765\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"162.000,39.531 135.000,86.296 81.000,86.296 54.000,39.531 81.000,-7.235 135.000,-7.235\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"162.000,133.061 135.000,179.827 81.000,179.827 54.000,133.061 81.000,86.296 135.000,86.296\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"162.000,226.592 135.000,273.358 81.000,273.358 54.000,226.592 81.000,179.827 135.000,179.827\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"162.000,320.123 135.000,366.888 81.000,366.888 54.000,320.123 81.000,273.358 135.000,273.358\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"162.000,413.654 135.000,460.419 81.000,460.419 54.000,413.654 81.000,366.888 135.000,366.888\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"162.000,507.184 135.000,553.950 81.000,553.950 54.000,507.184 81.000,460.419 135.000,460.419\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"243.000,-7.235 216.000,39.531 162.000,39.531 135.000,-7.235 162.000,-54.000 216.000,-54.000\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"243.000,86.296 216.000,133.061 162.000,133.061 135.000,86.296 162.000,39.531 216.000,39.531\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"243.000,179.827 216.000,226.592 162.000,226.592 135.000,179.827 162.000,133.061 216.000,133.061\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"243.000,273.358 216.000,320.123 162.000,320.123 135.000,273.358 162.000,226.592 216.000,226.592\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"243.000,366.888 216.000,413.654 162.000,413.654 135.000,366.888 162.000,320.123 216.000,320.123\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"243.000,460.419 216.000,507.184 162.000,507.184 135.000,460.419 162.000,413.654 216.000,413.654\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"243.000,553.950 216.000,600.715 162.000,600.715 135.000,553.950 162.000,507.184 216.000,507.184\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"324.000,-54.000 297.000,-7.235 243.000,-7.235 216.000,-54.000 243.000,-100.765 297.000,-100.765\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"324.000,39.531 297.000,86.296 243.000,86.296 216.000,39.531 243.000,-7.235 297.000,-7.235\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"324.000,133.061 297.000,179.827 243.000,179.827 216.000,133.061 243.000,86.296 297.000,86.296\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"324.000,226.592 297.000,273.358 243.000,273.358 216.000,226.592 243.000,179.827 297.000,179.827\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"324.000,320.123 297.000,366.888 243.000,366.888 216.000,320.123 243.000,273.358 297.000,273.358\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"324.000,413.654 297.000,460.419 243.000,460.419 216.000,413.654 243.000,366.888 297.000,366.888\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"324.000,507.184 297.000,553.950 243.000,553.950 216.000,507.184 243.000,460.419 297.000,460.419\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"405.000,-7.235 378.000,39.531 324.000,39.531 297.000,-7.235 324.000,-54.000 378.000,-54.000\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"405.000,86.296 378.000,133.061 324.000,133.061 297.000,86.296 324.000,39.531 378.000,39.531\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"405.000,179.827 378.000,226.592 324.000,226.592 297.000,179.827 324.000,133.061 378.000,133.061\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"405.000,273.358 378.000,320.123 324.000,320.123 297.000,273.358 324.000,226.592 378.000,226.592\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"405.000,366.888 378.000,413.654 324.000,413.654 297.000,366.888 324.000,320.123 378.000,320.123\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"405.000,460.419 378.000,507.184 324.000,507.184 297.000,460.419 324.000,413.654 378.000,413.654\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"405.000,553.950 378.000,600.715 324.000,600.715 297.000,553.950 324.000,507.184 378.000,507.184\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"486.000,-54.000 459.000,-7.235 405.000,-7.235 378.000,-54.000 405.000,-100.765 459.000,-100.765\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"486.000,39.531 459.000,86.296 405.000,86.296 378.000,39.531 405.000,-7.235 459.000,-7.235\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"486.000,133.061 459.000,179.827 405.000,179.827 378.000,133.061 405.000,86.296 459.000,86.296\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"486.000,226.592 459.000,273.358 405.000,273.358 378.000,226.592 405.000,179.827 459.000,179.827\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"486.000,320.123 459.000,366.888 405.000,366.888 378.000,320.123 405.000,273.358 459.000,273.358\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"486.000,413.654 459.000,460.419 405.000,460.419 378.000,413.654 405.000,366.888 459.000,366.888\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"486.000,507.184 459.000,553.950 405.000,553.950 378.000,507.184 405.000,460.419 459.000,460.419\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"567.000,-7.235 540.000,39.531 486.000,39.531 459.000,-7.235 486.000,-54.000 540.000,-54.000\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"567.000,86.296 540.000,133.061 486.000,133.061 459.000,86.296 486.000,39.531 540.000,39.531\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"567.000,179.827 540.000,226.592 486.000,226.592 459.000,179.827 486.000,133.061 540.000,133.061\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"567.000,273.358 540.000,320.123 486.000,320.123 459.000,273.358 486.000,226.592 540.000,226.592\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"567.000,366.888 540.000,413.654 486.000,413.654 459.000,366.888 486.000,320.123 540.000,320.123\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"567.000,460.419 540.000,507.184 486.000,507.184 459.000,460.419 486.000,413.654 540.000,413.654\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"567.000,553.950 540.000,600.715 486.000,600.715 459.000,553.950 486.000,507.184 540.000,507.184\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"648.000,-54.000 621.000,-7.235 567.000,-7.235 540.000,-54.000 567.000,-100.765 621.000,-100.765\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"648.000,39.531 621.000,86.296 567.000,86.296 540.000,39.531 567.000,-7.235 621.000,-7.235\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"648.000,133.061 621.000,179.827 567.000,179.827 540.000,133.061 567.000,86.296 621.000,86.296\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"648.000,226.592 621.000,273.358 567.000,273.358 540.000,226.592 567.000,179.827 621.000,179.827\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"648.000,320.123 621.000,366.888 567.000,366.888 540.000,320.123 567.000,273.358 621.000,273.358\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"648.000,413.654 621.000,460.419 567.000,460.419 540.000,413.654 567.000,366.888 621.000,366.888\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"648.000,507.184 621.000,553.950 567.000,553.950 540.000,507.184 567.000,460.419 621.000,460.419\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"729.000,-7.235 702.000,39.531 648.000,39.531 621.000,-7.235 648.000,-54.000 702.000,-54.000\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"729.000,86.296 702.000,133.061 648.000,133.061 621.000,86.296 648.000,39.531 702.000,39.531\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"729.000,179.827 702.000,226.592 648.000,226.592 621.000,179.827 648.000,133.061 702.000,133.061\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"729.000,273.358 702.000,320.123 648.000,320.123 621.000,273.358 648.000,226.592 702.000,226.592\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"729.000,366.888 702.000,413.654 648.000,413.654 621.000,366.888 648.000,320.123 702.000,320.123\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"729.000,460.419 702.000,507.184 648.000,507.184 621.000,460.419 648.000,413.654 702.000,413.654\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"729.000,553.950 702.000,600.715 648.000,600.715 621.000,553.950 648.000,507.184 702.000,507.184\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"810.000,-54.000 783.000,-7.235 729.000,-7.235 702.000,-54.000 729.000,-100.765 783.000,-100.765\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"810.000,39.531 783.000,86.296 729.000,86.296 702.000,39.531 729.000,-7.235 783.000,-7.235\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"810.000,133.061 783.000,179.827 729.000,179.827 702.000,133.061 729.000,86.296 783.000,86.296\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"810.000,226.592 783.000,273.358 729.000,273.358 702.000,226.592 729.000,179.827 783.000,179.827\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"810.000,320.123 783.000,366.888 729.000,366.888 702.000,320.123 729.000,273.358 783.000,273.358\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"810.000,413.654 783.000,460.419 729.000,460.419 702.000,413.654 729.000,366.888 783.000,366.888\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"810.000,507.184 783.000,553.950 729.000,553.950 702.000,507.184 729.000,460.419 783.000,460.419\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"891.000,-7.235 864.000,39.531 810.000,39.531 783.000,-7.235 810.000,-54.000 864.000,-54.000\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"891.000,86.296 864.000,133.061 810.000,133.061 783.000,86.296 810.000,39.531 864.000,39.531\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"891.000,179.827 864.000,226.592 810.000,226.592 783.000,179.827 810.000,133.061 864.000,133.061\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"891.000,273.358 864.000,320.123 810.000,320.123 783.000,273.358 810.000,226.592 864.000,226.592\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"891.000,366.888 864.000,413.654 810.000,413.654 783.000,366.888 810.000,320.123 864.000,320.123\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"891.000,460.419 864.000,507.184 810.000,507.184 783.000,460.419 810.000,413.654 864.000,413.654\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"891.000,553.950 864.000,600.715 810.000,600.715 783.000,553.950 810.000,507.184 864.000,507.184\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"972.000,-54.000 945.000,-7.235 891.000,-7.235 864.000,-54.000 891.000,-100.765 945.000,-100.765\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"972.000,39.531 945.000,86.296 891.000,86.296 864.000,39.531 891.000,-7.235 945.000,-7.235\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"972.000,133.061 945.000,179.827 891.000,179.827 864.000,133.061 891.000,86.296 945.000,86.296\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"972.000,226.592 945.000,273.358 891.000,273.358 864.000,226.592 891.000,179.827 945.000,179.827\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"972.000,320.123 945.000,366.888 891.000,366.888 864.000,320.123 891.000,273.358 945.000,273.358\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"972.000,413.654 945.000,460.419 891.000,460.419 864.000,413.654 891.000,366.888 945.000,366.888\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"972.000,507.184 945.000,553.950 891.000,553.950 864.000,507.184 891.000,460.419 945.000,460.419\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1053.000,-7.235 1026.000,39.531 972.000,39.531 945.000,-7.235 972.000,-54.000 1026.000,-54.000\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1053.000,86.296 1026.000,133.061 972.000,133.061 945.000,86.296 972.000,39.531 1026.000,39.531\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1053.000,179.827 1026.000,226.592 972.000,226.592 945.000,179.827 972.000,133.061 1026.000,133.061\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1053.000,273.358 1026.000,320.123 972.000,320.123 945.000,273.358 972.000,226.592 1026.000,226.592\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1053.000,366.888 1026.000,413.654 972.000,413.654 945.000,366.888 972.000,320.123 1026.000,320.123\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1053.000,460.419 1026.000,507.184 972.000,507.184 945.000,460.419 972.000,413.654 1026.000,413.654\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1053.000,553.950 1026.000,600.715 972.000,600.715 945.000,553.950 972.000,507.184 1026.000,507.184\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1134.000,-54.000 1107.000,-7.235 1053.000,-7.235 1026.000,-54.000 1053.000,-100.765 1107.000,-100.765\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1134.000,39.531 1107.000,86.296 1053.000,86.296 1026.000,39.531 1053.000,-7.235 1107.000,-7.235\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1134.000,133.061 1107.000,179.827 1053.000,179.827 1026.000,133.061 1053.000,86.296 1107.000,86.296\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1134.000,226.592 1107.000,273.358 1053.000,273.358 1026.000,226.592 1053.000,179.827 1107.000,179.827\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1134.000,320.123 1107.000,366.888 1053.000,366.888 1026.000,320.123 1053.000,273.358 1107.000,273.358\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1134.000,413.654 1107.000,460.419 1053.000,460.419 1026.000,413.654 1053.000,366.888 1107.000,366.888\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1134.000,507.184 1107.000,553.950 1053.000,553.950 1026.000,507.184 1053.000,460.419 1107.000,460.419\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1215.000,-7.235 1188.000,39.531 1134.000,39.531 1107.000,-7.235 1134.000,-54.000 1188.000,-54.000\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1215.000,86.296 1188.000,133.061 1134.000,133.061 1107.000,86.296 1134.000,39.531 1188.000,39.531\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1215.000,179.827 1188.000,226.592 1134.000,226.592 1107.000,179.827 1134.000,133.061 1188.000,133.061\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1215.000,273.358 1188.000,320.123 1134.000,320.123 1107.000,273.358 1134.000,226.592 1188.000,226.592\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1215.000,366.888 1188.000,413.654 1134.000,413.654 1107.000,366.888 1134.000,320.123 1188.000,320.123\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1215.000,460.419 1188.000,507.184 1134.000,507.184 1107.000,460.419 1134.000,413.654 1188.000,413.654\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1215.000,553.950 1188.000,600.715 1134.000,600.715 1107.000,553.950 1134.000,507.184 1188.000,507.184\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1296.000,-54.000 1269.000,-7.235 1215.000,-7.235 1188.000,-54.000 1215.000,-100.765 1269.000,-100.765\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1296.000,39.531 1269.000,86.296 1215.000,86.296 1188.000,39.531 1215.000,-7.235 1269.000,-7.235\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1296.000,133.061 1269.000,179.827 1215.000,179.827 1188.000,133.061 1215.000,86.296 1269.000,86.296\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1296.000,226.592 1269.000,273.358 1215.000,273.358 1188.000,226.592 1215.000,179.827 1269.000,179.827\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1296.000,320.123 1269.000,366.888 1215.000,366.888 1188.000,320.123 1215.000,273.358 1269.000,273.358\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1296.000,413.654 1269.000,460.419 1215.000,460.419 1188.000,413.654 1215.000,366.888 1269.000,366.888\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1296.000,507.184 1269.000,553.950 1215.000,553.950 1188.000,507.184 1215.000,460.419 1269.000,460.419\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1377.000,-7.235 1350.000,39.531 1296.000,39.531 1269.000,-7.235 1296.000,-54.000 1350.000,-54.000\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1377.000,86.296 1350.000,133.061 1296.000,133.061 1269.000,86.296 1296.000,39.531 1350.000,39.531\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1377.000,179.827 1350.000,226.592 1296.000,226.592 1269.000,179.827 1296.000,133.061 1350.000,133.061\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1377.000,273.358 1350.000,320.123 1296.000,320.123 1269.000,273.358 1296.000,226.592 1350.000,226.592\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1377.000,366.888 1350.000,413.654 1296.000,413.654 1269.000,366.888 1296.000,320.123 1350.000,320.123\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1377.000,460.419 1350.000,507.184 1296.000,507.184 1269.000,460.419 1296.000,413.654 1350.000,413.654\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1377.000,553.950 1350.000,600.715 1296.000,600.715 1269.000,553.950 1296.000,507.184 1350.000,507.184\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1458.000,-54.000 1431.000,-7.235 1377.000,-7.235 1350.000,-54.000 1377.000,-100.765 1431.000,-100.765\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1458.000,39.531 1431.000,86.296 1377.000,86.296 1350.000,39.531 1377.000,-7.235 1431.000,-7.235\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1458.000,133.061 1431.000,179.827 1377.000,179.827 1350.000,133.061 1377.000,86.296 1431.000,86.296\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1458.000,226.592 1431.000,273.358 1377.000,273.358 1350.000,226.592 1377.000,179.827 1431.000,179.827\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1458.000,320.123 1431.000,366.888 1377.000,366.888 1350.000,320.123 1377.000,273.358 1431.000,273.358\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1458.000,413.654 1431.000,460.419 1377.000,460.419 1350.000,413.654 1377.000,366.888 1431.000,366.888\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1458.000,507.184 1431.000,553.950 1377.000,553.950 1350.000,507.184 1377.000,460.419 1431.000,460.419\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1539.000,-7.235 1512.000,39.531 1458.000,39.531 1431.000,-7.235 1458.000,-54.000 1512.000,-54.000\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1539.000,86.296 1512.000,133.061 1458.000,133.061 1431.000,86.296 1458.000,39.531 1512.000,39.531\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1539.000,179.827 1512.000,226.592 1458.000,226.592 1431.000,179.827 1458.000,133.061 1512.000,133.061\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1539.000,273.358 1512.000,320.123 1458.000,320.123 1431.000,273.358 1458.000,226.592 1512.000,226.592\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1539.000,366.888 1512.000,413.654 1458.000,413.654 1431.000,366.888 1458.000,320.123 1512.000,320.123\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1539.000,460.419 1512.000,507.184 1458.000,507.184 1431.000,460.419 1458.000,413.654 1512.000,413.654\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1539.000,553.950 1512.000,600.715 1458.000,600.715 1431.000,553.950 1458.000,507.184 1512.000,507.184\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1620.000,-54.000 1593.000,-7.235 1539.000,-7.235 1512.000,-54.000 1539.000,-100.765 1593.000,-100.765\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1620.000,39.531 1593.000,86.296 1539.000,86.296 1512.000,39.531 1539.000,-7.235 1593.000,-7.235\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1620.000,133.061 1593.000,179.827 1539.000,179.827 1512.000,133.061 1539.000,86.296 1593.000,86.296\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1620.000,226.592 1593.000,273.358 1539.000,273.358 1512.000,226.592 1539.000,179.827 1593.000,179.827\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1620.000,320.123 1593.000,366.888 1539.000,366.888 1512.000,320.123 1539.000,273.358 1593.000,273.358\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1620.000,413.654 1593.000,460.419 1539.000,460.419 1512.000,413.654 1539.000,366.888 1593.000,366.888\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1620.000,507.184 1593.000,553.950 1539.000,553.950 1512.000,507.184 1539.000,460.419 1593.000,460.419\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1701.000,-7.235 1674.000,39.531 1620.000,39.531 1593.000,-7.235 1620.000,-54.000 1674.000,-54.000\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1701.000,86.296 1674.000,133.061 1620.000,133.061 1593.000,86.296 1620.000,39.531 1674.000,39.531\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1701.000,179.827 1674.000,226.592 1620.000,226.592 1593.000,179.827 1620.000,133.061 1674.000,133.061\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1701.000,273.358 1674.000,320.123 1620.000,320.123 1593.000,273.358 1620.000,226.592 1674.000,226.592\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1701.000,366.888 1674.000,413.654 1620.000,413.654 1593.000,366.888 1620.000,320.123 1674.000,320.123\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1701.000,460.419 1674.000,507.184 1620.000,507.184 1593.000,460.419 1620.000,413.654 1674.000,413.654\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/>\n<polygon points=\"1701.000,553.950 1674.000,600.715 1620.000,600.715 1593.000,553.950 1620.000,507.184 1674.000,507.184\" fill=\"none\" stroke=\"#4B0082\" stroke-width=\"2.2\" opacity=\"0.12\"/></svg>\n"
127
+ },
128
+ {
129
+ "path": "favicon/apple-touch-icon.png",
130
+ "mimeType": "image/png",
131
+ "bytes": 9850,
132
+ "encoding": "base64",
133
+ "content": "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"
134
+ },
135
+ {
136
+ "path": "favicon/favicon-16.png",
137
+ "mimeType": "image/png",
138
+ "bytes": 700,
139
+ "encoding": "base64",
140
+ "content": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACg0lEQVR42mWTTWyMURSGn3PvdL6pTqtoMa0yISEaEjriJxUhIYiQVIJUCQuhGyKxtWhiKbFHrEjErhZYqITEgpiIoIsRNJRUBa2p/szPvcfi+0aLm9zck3NPzvu+9z1XAFJkOg3So+hSwAICTB8oMwInyHtPuWeIFzelibaDgr0Fik4XAoJSjqLYzCYIEt27Q5Ki7aPBtijOgVhrQlTnS5iqegB8aRRr46CK8wqoE6z1uEEjSIviAbEAo97z3ecJGteT7ugl3dFL0LieH26EvHcVDlbxCNISmynOo3SsnEO8qprcotNIdT2i0LzhDO0jA0wVAh5nh5BIBICtpanHGmFMHZ1rG7javYJ9mVoStpb731qZmlKOb8py/qiwZ8cy3g3kefVhhISxqIKpMHDArlX14D3ky+ycl+VwukDnsgJbFvcz+rOIVceWjQvxKBJRMACqSoDh4p1BhicgHwS8Ke9nbSpBZn6Cb1+3810D3n71XLvRTxyL+tCVGIAXIa5FPjU203PsBFoDrXfTLHltCOJwL7aaayzHUyDOS2aRw1MN+JCBGMFRovXCAWRBMxM1SXJbh2lo6aN2QR/XFzryJPk1v4GpI91AESK7TcUCwfClN0sMT0zmsVn6aN98jvZtZ+lK3UYSgjEQPHmIYkBDCdJERitGKkpqb4bJIOBGV462Ng9GefY0xtZLa5hVKhJ/9ijClX8bhMszSR7H7nV1XLlcA8DJU+M8yP6kDqFMcmY5/42yWIOIUCw75iZDlB+/lJixEYL7a5RtHanPgjkgSPQeinrFCowXYbIIVRLm/+jGmFCCnrRjDPUnSb0RZDUwOxInAFbCrdMiK9/5rUdPD/H81m94d/5d5NtH+gAAAABJRU5ErkJggg=="
141
+ },
142
+ {
143
+ "path": "favicon/favicon-32.png",
144
+ "mimeType": "image/png",
145
+ "bytes": 1683,
146
+ "encoding": "base64",
147
+ "content": "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"
148
+ },
149
+ {
150
+ "path": "favicon/favicon.ico",
151
+ "mimeType": "image/x-icon",
152
+ "bytes": 31427,
153
+ "encoding": "base64",
154
+ "content": "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"
155
+ },
156
+ {
157
+ "path": "favicon/favicon.svg",
158
+ "mimeType": "image/svg+xml",
159
+ "bytes": 2079,
160
+ "encoding": "utf8",
161
+ "content": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 200 200\" width=\"200\" height=\"200\">\n<!-- Mukoko mark — Seed of Life, seven cells in the African Minerals palette with\n tanzanite at the core, on the deep-tanzanite ground. This is the SAME artwork\n as public/mukoko-appicon.png at every size: the favicon is no longer a\n mono-tanzanite reduction (owner decision 2026-09-01), so the tab icon matches\n the app icon and every other surface. The ground travels with the mark, so\n one file serves both light and dark browser themes.\n Never recolour the cells or reorder the ring. -->\n<rect x=\"0\" y=\"0\" width=\"200\" height=\"200\" rx=\"42\" ry=\"42\" fill=\"#1A0033\"/>\n<g transform=\"translate(100 100) scale(0.6685) translate(-100 -100)\">\n <polygon points=\"188.828,131.655 171.828,161.100 137.828,161.100 120.828,131.655 137.828,102.210 171.828,102.210\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/>\n <polygon points=\"134.000,163.310 117.000,192.755 83.000,192.755 66.000,163.310 83.000,133.865 117.000,133.865\" fill=\"#FFD740\" stroke=\"#FFD740\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/>\n <polygon points=\"79.172,131.655 62.172,161.100 28.172,161.100 11.172,131.655 28.172,102.210 62.172,102.210\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/>\n <polygon points=\"79.172,68.345 62.172,97.790 28.172,97.790 11.172,68.345 28.172,38.900 62.172,38.900\" fill=\"#FF8A65\" stroke=\"#FF8A65\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/>\n <polygon points=\"134.000,36.690 117.000,66.135 83.000,66.135 66.000,36.690 83.000,7.245 117.000,7.245\" fill=\"#3D5AFE\" stroke=\"#3D5AFE\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/>\n <polygon points=\"188.828,68.345 171.828,97.790 137.828,97.790 120.828,68.345 137.828,38.900 171.828,38.900\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/>\n <polygon points=\"134.000,100.000 117.000,129.445 83.000,129.445 66.000,100.000 83.000,70.555 117.000,70.555\" fill=\"#B388FF\" stroke=\"#B388FF\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/>\n</g>\n</svg>\n"
162
+ },
163
+ {
164
+ "path": "lockup/mukoko-lockup-dark.svg",
165
+ "mimeType": "image/svg+xml",
166
+ "bytes": 1601,
167
+ "encoding": "utf8",
168
+ "content": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 770 200\" width=\"770\" height=\"200\"><g transform=\"translate(0,0)\"><polygon points=\"188.828,131.655 171.828,161.100 137.828,161.100 120.828,131.655 137.828,102.210 171.828,102.210\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/>\n<polygon points=\"134.000,163.310 117.000,192.755 83.000,192.755 66.000,163.310 83.000,133.865 117.000,133.865\" fill=\"#FFD740\" stroke=\"#FFD740\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/>\n<polygon points=\"79.172,131.655 62.172,161.100 28.172,161.100 11.172,131.655 28.172,102.210 62.172,102.210\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/>\n<polygon points=\"79.172,68.345 62.172,97.790 28.172,97.790 11.172,68.345 28.172,38.900 62.172,38.900\" fill=\"#FF8A65\" stroke=\"#FF8A65\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/>\n<polygon points=\"134.000,36.690 117.000,66.135 83.000,66.135 66.000,36.690 83.000,7.245 117.000,7.245\" fill=\"#3D5AFE\" stroke=\"#3D5AFE\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/>\n<polygon points=\"188.828,68.345 171.828,97.790 137.828,97.790 120.828,68.345 137.828,38.900 171.828,38.900\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/>\n<polygon points=\"134.000,100.000 117.000,129.445 83.000,129.445 66.000,100.000 83.000,70.555 117.000,70.555\" fill=\"#B388FF\" stroke=\"#B388FF\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/></g><text x=\"225\" y=\"103\" font-family=\"Noto Serif, Georgia, serif\" font-weight=\"600\" font-size=\"118\" fill=\"#F5F5F4\" dominant-baseline=\"central\" letter-spacing=\"-2\">mukoko</text></svg>\n"
169
+ },
170
+ {
171
+ "path": "lockup/mukoko-lockup-light.svg",
172
+ "mimeType": "image/svg+xml",
173
+ "bytes": 1601,
174
+ "encoding": "utf8",
175
+ "content": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 770 200\" width=\"770\" height=\"200\"><g transform=\"translate(0,0)\"><polygon points=\"188.828,131.655 171.828,161.100 137.828,161.100 120.828,131.655 137.828,102.210 171.828,102.210\" fill=\"#0047AB\" stroke=\"#0047AB\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/>\n<polygon points=\"134.000,163.310 117.000,192.755 83.000,192.755 66.000,163.310 83.000,133.865 117.000,133.865\" fill=\"#5D4037\" stroke=\"#5D4037\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/>\n<polygon points=\"79.172,131.655 62.172,161.100 28.172,161.100 11.172,131.655 28.172,102.210 62.172,102.210\" fill=\"#004D40\" stroke=\"#004D40\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/>\n<polygon points=\"79.172,68.345 62.172,97.790 28.172,97.790 11.172,68.345 28.172,38.900 62.172,38.900\" fill=\"#BF5A36\" stroke=\"#BF5A36\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/>\n<polygon points=\"134.000,36.690 117.000,66.135 83.000,66.135 66.000,36.690 83.000,7.245 117.000,7.245\" fill=\"#283593\" stroke=\"#283593\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/>\n<polygon points=\"188.828,68.345 171.828,97.790 137.828,97.790 120.828,68.345 137.828,38.900 171.828,38.900\" fill=\"#A0522D\" stroke=\"#A0522D\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/>\n<polygon points=\"134.000,100.000 117.000,129.445 83.000,129.445 66.000,100.000 83.000,70.555 117.000,70.555\" fill=\"#4B0082\" stroke=\"#4B0082\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/></g><text x=\"225\" y=\"103\" font-family=\"Noto Serif, Georgia, serif\" font-weight=\"600\" font-size=\"118\" fill=\"#141413\" dominant-baseline=\"central\" letter-spacing=\"-2\">mukoko</text></svg>\n"
176
+ },
177
+ {
178
+ "path": "mark/mukoko-mark-full-dark.svg",
179
+ "mimeType": "image/svg+xml",
180
+ "bytes": 1394,
181
+ "encoding": "utf8",
182
+ "content": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 200 200\" width=\"200\" height=\"200\"><polygon points=\"188.828,131.655 171.828,161.100 137.828,161.100 120.828,131.655 137.828,102.210 171.828,102.210\" fill=\"#00B0FF\" stroke=\"#00B0FF\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/>\n<polygon points=\"134.000,163.310 117.000,192.755 83.000,192.755 66.000,163.310 83.000,133.865 117.000,133.865\" fill=\"#FFD740\" stroke=\"#FFD740\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/>\n<polygon points=\"79.172,131.655 62.172,161.100 28.172,161.100 11.172,131.655 28.172,102.210 62.172,102.210\" fill=\"#64FFDA\" stroke=\"#64FFDA\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/>\n<polygon points=\"79.172,68.345 62.172,97.790 28.172,97.790 11.172,68.345 28.172,38.900 62.172,38.900\" fill=\"#FF8A65\" stroke=\"#FF8A65\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/>\n<polygon points=\"134.000,36.690 117.000,66.135 83.000,66.135 66.000,36.690 83.000,7.245 117.000,7.245\" fill=\"#3D5AFE\" stroke=\"#3D5AFE\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/>\n<polygon points=\"188.828,68.345 171.828,97.790 137.828,97.790 120.828,68.345 137.828,38.900 171.828,38.900\" fill=\"#E1B07E\" stroke=\"#E1B07E\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/>\n<polygon points=\"134.000,100.000 117.000,129.445 83.000,129.445 66.000,100.000 83.000,70.555 117.000,70.555\" fill=\"#B388FF\" stroke=\"#B388FF\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/></svg>\n"
183
+ },
184
+ {
185
+ "path": "mark/mukoko-mark-full-light.svg",
186
+ "mimeType": "image/svg+xml",
187
+ "bytes": 1394,
188
+ "encoding": "utf8",
189
+ "content": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 200 200\" width=\"200\" height=\"200\"><polygon points=\"188.828,131.655 171.828,161.100 137.828,161.100 120.828,131.655 137.828,102.210 171.828,102.210\" fill=\"#0047AB\" stroke=\"#0047AB\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/>\n<polygon points=\"134.000,163.310 117.000,192.755 83.000,192.755 66.000,163.310 83.000,133.865 117.000,133.865\" fill=\"#5D4037\" stroke=\"#5D4037\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/>\n<polygon points=\"79.172,131.655 62.172,161.100 28.172,161.100 11.172,131.655 28.172,102.210 62.172,102.210\" fill=\"#004D40\" stroke=\"#004D40\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/>\n<polygon points=\"79.172,68.345 62.172,97.790 28.172,97.790 11.172,68.345 28.172,38.900 62.172,38.900\" fill=\"#BF5A36\" stroke=\"#BF5A36\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/>\n<polygon points=\"134.000,36.690 117.000,66.135 83.000,66.135 66.000,36.690 83.000,7.245 117.000,7.245\" fill=\"#283593\" stroke=\"#283593\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/>\n<polygon points=\"188.828,68.345 171.828,97.790 137.828,97.790 120.828,68.345 137.828,38.900 171.828,38.900\" fill=\"#A0522D\" stroke=\"#A0522D\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/>\n<polygon points=\"134.000,100.000 117.000,129.445 83.000,129.445 66.000,100.000 83.000,70.555 117.000,70.555\" fill=\"#4B0082\" stroke=\"#4B0082\" stroke-width=\"3.74\" stroke-linejoin=\"round\"/></svg>\n"
190
+ },
191
+ {
192
+ "path": "SOURCES.md",
193
+ "mimeType": "text/markdown",
194
+ "bytes": 3972,
195
+ "encoding": "utf8",
196
+ "content": "# mukoko-design: where each file comes from\n\nEvery file below is copied byte for byte, never redrawn. `scripts/mukoko-design.test.sh` (run by `pnpm --filter @nyuchi/mzizi-skills test`) fails when a file's SHA-256 stops matching this table, or when a file here is not listed.\n\n- **live**: `public/<file>` in [`mukoko-dev/mukoko-news`](https://github.com/mukoko-dev/mukoko-news) at `c7d17fa` (2026-11-01), the source of truth for the mark and the icons. Change it there first, then copy.\n- **history**: this skill's last version before 0.8.0 (agent-tools `4d2b905^`), carried over unchanged because no live surface ships it.\n\n| File | Source | SHA-256 |\n| -------------------------------------------------- | ----------------------------------------------------------- | ------------------------------------------------------------------ |\n| `app-icon/mukoko-appicon-paper.png` | live: `public/mukoko-appicon-paper.png` | `b468bd2edb18ea0306774fab5c62549b6104c4cb4ca78940b2c89924fac370b6` |\n| `app-icon/mukoko-appicon.png` | live: `public/mukoko-appicon.png` | `89a90682251b327a4af0a19134a1292d9a34f26637f8a14ff6f45d454d43bd4b` |\n| `backgrounds/honeycomb-grain-paper.svg` | history: `backgrounds/honeycomb-grain-paper.svg` | `369e5bc7e6d697b8da53ce42805f794bb86c7471e73c62e39a37d370ca76d777` |\n| `backgrounds/honeycomb-pattern-full.svg` | history: `backgrounds/honeycomb-pattern-full.svg` | `ace06772c4c27ced0c2acb9049af20f4aa7a906784f14e22ada3a0ac3baae35e` |\n| `backgrounds/honeycomb-splash-stone-1080x1920.png` | history: `backgrounds/honeycomb-splash-stone-1080x1920.png` | `e602806302f11a2e0656f894f0558ddb1f9a3f369c3e1dbb00e7282bb067a18a` |\n| `backgrounds/honeycomb-splash-stone.svg` | history: `backgrounds/honeycomb-splash-stone.svg` | `03fb4130caa4b9cf4446ac6490aeb1fba8849a7bf0a85c2213d6decbd708eafc` |\n| `backgrounds/honeycomb-tanzanite-header.svg` | history: `backgrounds/honeycomb-tanzanite-header.svg` | `6a7391e2311d894990614ab437298e6373a01abf80d6cb3b677007733b606d71` |\n| `favicon/apple-touch-icon.png` | live: `public/apple-touch-icon.png` | `45913f352bb9814731d8b7673362e772b333b77e6dee8503d92ed885374e1b8a` |\n| `favicon/favicon-16.png` | live: `public/favicon-16.png` | `bf47306ede458717f2aced0f2e8100d31416a4a52d0edcaa7904d30b40c6aa18` |\n| `favicon/favicon-32.png` | live: `public/favicon-32.png` | `f7f0e44db9fb572d22178650fbcc4f2c07b3dfdea0fc600f3ed7684112b4a07e` |\n| `favicon/favicon.ico` | live: `public/favicon.ico` | `5c84a6138d3b6ef0dda733e90c85ba1a432ce3d5ac0de4b9d05eaf7cebb2e116` |\n| `favicon/favicon.svg` | live: `public/favicon.svg` | `18661e7ed1e2cef2d1a47ebf869c3bde9bfc9aa65a4d8ea3381d0376c55627a1` |\n| `lockup/mukoko-lockup-dark.svg` | live: `public/mukoko-lockup-dark.svg` | `db28f5bb716875374d9925d7cadf7edf26e25a302816347d3e8a1a50b0bca773` |\n| `lockup/mukoko-lockup-light.svg` | live: `public/mukoko-lockup-light.svg` | `111a639c6631b8694f149732cf4a3bade5a6593257f96c020c0daa9fab526e0d` |\n| `mark/mukoko-mark-full-dark.svg` | live: `public/mukoko-mark-full-dark.svg` | `c3c533a3aba9ef64469a008aecd5a100a54dfac50bdbed882a125eb71022dc1c` |\n| `mark/mukoko-mark-full-light.svg` | live: `public/mukoko-mark-full-light.svg` | `49ec4f0a9b991714ec0a0962a37c27d83eaeac49ab56e86b609535b945b3892a` |\n"
197
+ }
198
+ ]
27
199
  },
28
200
  {
29
201
  "name": "mzizi-backend",
30
- "description": "A Mzizi backend service on Cloudflare Workers: where it stands today (every live Mzizi Worker is TypeScript; the language's backend service slice, RFC-0011, runs in process under mz contract and lowers with mz build to a local Rust + axum package, with no Workers target and nothing deployed), the live endpoint map (api.mzizi.dev, mcp.mzizi.dev, docs.mzizi.dev/mcp), a Rust Worker as a sans-IO core plus thin host (workers-rs, wrangler, cron, queues, bindings, no database client), an MCP server (Streamable HTTP, one factory with many entrypoints, a code-defined catalogue over data bundled at a pinned commit, federation, naming and annotations, npm + MCP Registry publish), the free-except-Fundi access rule, logging and deploy. Replaces cloudflare-worker-rust and mcp-server-cloudflare.",
31
- "body_mdx": "# Mzizi backend on Cloudflare Workers\n\nThis skill replaces two 0.7.0 skills: `cloudflare-worker-rust` (now \"A Rust Worker\") and\n`mcp-server-cloudflare` (now \"An MCP server\"). The rules they shared (access, logging, deploy)\nare stated once, at the end.\n\n## Where the backend stands today\n\n**Direction: Rust first, TypeScript second** (`mzizi-registry` →\n`content/doctrine/documentation-architecture-framework/`), and Mzizi's backend is meant, in\nthe end, to be built in the Mzizi language itself (`CHARTER.md` v0.4, §1). Neither is the\nstate today, and a skill that implied otherwise would mislead you:\n\n- **Every Worker Mzizi runs is TypeScript.** `api.mzizi.dev` is `mzizi-dev/mzizi-api-gateway`,\n a Hono Worker. `mzizi-dev/agent-tools` holds `mzizi-mcp` (mcp.mzizi.dev), `mzizi-fundi` and\n `bushtrade-mcp`, all TypeScript, because the MCP SDK, `hono` and `agents` are TypeScript.\n- **The Rust building blocks exist.** Mzizi Roots server components (the `mzizi-roots-server`\n crate: `mzizi-assurance`, `mzizi-fundi`, `mzizi-docs`, `mzizi-discovery`) are sans-IO cores\n meant to be mounted in a Worker. The `workers-rs` adapter crate (`mzizi-worker`) is planned\n and has not landed, so today the Worker writes its own few lines of adapter.\n- **The Mzizi language has one backend slice, and it serves nothing live.** A `service` with\n HTTP routes and handlers (`when`, `header`, `respond`) exists on the language's `main`\n (RFC-0011; `mzizi-dev/mzizi` at `62a0f32`). `mz check` checks it, `mz contract` runs it in\n process against its `example` and `ensure` clauses, and `mz build` lowers it to a local\n Rust + axum Cargo package that serves `127.0.0.1:$PORT`. That is all: no Workers,\n WebAssembly or Containers target, no deployment, no Workers bindings or storage, no request bodies,\n no state, and no expressions, functions, loops or modules in a handler. No component lowers.\n Its first job is the Phase 0 backend measurement (task B1, the `mzizi-be` arm), and no\n backend episode has run. Check `LANGUAGE-TRACKER.md` in the language repo before claiming\n any capability. \"A Mzizi service\" below shows the slice.\n\nSo: write a new production service's logic in Rust as a sans-IO core. Use TypeScript where\nthe work leans on the MCP SDK or `agents` (see \"An MCP server\" below). Port nothing that\nworks without a reason; when a service is ported, its existing tests and parity script are the\ncontract the port must meet.\n\n## The live endpoint map\n\nRead this before inventing a hostname. Each MCP has its own host, and the old umbrella\n`mcp.nyuchi.dev/{service}` path scheme is **not** how these are deployed:\n\n| Endpoint | Worker / source | Serves |\n| -------------------------- | ----------------------------------------- | --------------------------------------------------------------------------------------------------- |\n| `api.mzizi.dev` | `mzizi-api-gateway` (Hono, TypeScript) | The registry API: the registry's files at a pinned commit; no origin, no database |\n| `mcp.mzizi.dev/mcp` | `mzizi-mcp` (`mzizi-dev/agent-tools`) | The Mzizi registry, tokens, architecture, doctrine and skills (`mzizi_*`), plus the docs (`docs_*`) |\n| `mcp.mzizi.dev/mcp/signin` | the same Worker | The same MCP, answering 401 until you sign in: the URL for the Fundi tools |\n| `docs.mzizi.dev/mcp` | Mintlify (`mzizi-dev/mzizi-docs`) | The Mzizi docs; `mzizi-mcp` federates these as `docs_*` |\n| (Worker, no public route) | `bushtrade-mcp` (`mzizi-dev/agent-tools`) | Agentic commerce: task-driven UCP/AP2 verbs (Nyuchi) |\n| `docs.nyuchi.com/mcp` | `nyuchi-docs-mcp` (`nyuchi/nyuchi-docs`) | Nyuchi's own docs corpus, not Mzizi's |\n\n`design.nyuchi.com` is a 308 permanent redirect to `mzizi.dev`. Never reference it in new code\nor docs. `mzizi.dev/mcp` 308-redirects to `mcp.mzizi.dev/mcp` (method and body preserved), so\npoint new clients at `mcp.mzizi.dev/mcp` directly.\n\n**One MCP per surface.** Two endpoints over one corpus is two tool catalogues to keep in step,\ntwo access stories to explain, and a silent choice for every client author. That is why the\ndocs are federated into `mzizi-mcp` rather than listed as a second Mzizi MCP.\n\n## A Rust Worker\n\n### The shape: a sans-IO core and a thin host\n\nThe core owns routing and response shaping. The host owns I/O, bindings and secrets. This is\nthe shape of `n10-documentation/mzizi-docs-api.rs` in the registry, and it is what lets the\nsame core run in a Worker, in a container behind axum, and in a native unit test.\n\n```\nservice-name/\n├── src/\n│ ├── core.rs # routes, types, a Store trait — no `worker` import\n│ └── lib.rs # the Worker: reads bindings, calls the core, writes the response\n├── wrangler.toml\n└── Cargo.toml\n```\n\nThis example compiles against `worker` 0.8.7, natively and for `wasm32-unknown-unknown`:\n\n```toml\n[lib]\ncrate-type = [\"cdylib\", \"rlib\"]\n\n[dependencies]\nworker = \"0.8\"\n```\n\n```rust\n// src/core.rs\n//! The sans-IO core: typed request in, typed response out. No `worker` import,\n//! so it builds and tests natively and for wasm32 alike.\n\n/// Every route this service answers. An unhandled one is a compile error in `respond`.\n#[derive(Debug, PartialEq, Eq)]\npub enum Route {\n Health,\n Item(String),\n NotFound,\n}\n\n/// Parse a method and path into a route.\npub fn route(method: &str, path: &str) -> Route {\n match (method, path.trim_end_matches('/')) {\n (\"GET\", \"/health\") => Route::Health,\n (\"GET\", p) if p.starts_with(\"/v1/items/\") => Route::Item(p[\"/v1/items/\".len()..].to_string()),\n _ => Route::NotFound,\n }\n}\n\n/// What the core needs from the host, behind a trait so a test can pass an in-memory one.\npub trait Store {\n fn item(&self, id: &str) -> Option<String>;\n}\n\n/// Shape the answer: a status and a body. The host owns I/O, bindings and secrets.\npub fn respond(route: &Route, store: &dyn Store) -> (u16, String) {\n match route {\n Route::Health => (200, r#\"{\"ok\":true}\"#.to_string()),\n Route::Item(id) => match store.item(id) {\n Some(body) => (200, body),\n None => (404, r#\"{\"error\":\"not found\"}\"#.to_string()),\n },\n Route::NotFound => (404, r#\"{\"error\":\"no such route\"}\"#.to_string()),\n }\n}\n```\n\n```rust\n// src/lib.rs\nuse worker::*;\n\nmod core;\n\n/// A `Store` over data the Worker has already read from its bindings (KV, R2, D1).\nstruct Loaded(Option<String>);\n\nimpl core::Store for Loaded {\n fn item(&self, _id: &str) -> Option<String> {\n self.0.clone()\n }\n}\n\n#[event(fetch)]\nasync fn fetch(req: Request, env: Env, _ctx: Context) -> Result<Response> {\n let route = core::route(req.method().as_ref(), &req.path());\n // The host does the I/O the core asked for, then hands the result over.\n let loaded = match &route {\n core::Route::Item(id) => env.kv(\"ITEMS\")?.get(id).text().await?,\n _ => None,\n };\n let (status, body) = core::respond(&route, &Loaded(loaded));\n let headers = Headers::new();\n headers.set(\"content-type\", \"application/json\")?;\n Ok(Response::ok(body)?.with_status(status).with_headers(headers))\n}\n\n#[event(scheduled)]\nasync fn scheduled(_event: ScheduledEvent, _env: Env, _ctx: ScheduleContext) {\n console_log!(\"[example] scheduled run\");\n}\n```\n\nTest the core natively with an in-memory `Store`, and assert status codes, headers and bodies\nper route there. That is the contract a Rust server component carries. A Mzizi `service`\nstates the same facts as `example` and `ensure` clauses (below), but nothing lowers a Mzizi\nservice to a Worker, so a Rust Worker keeps its contract in its tests.\n\n### Project setup\n\n```bash\nnpm install -g wrangler\ncargo install worker-build\ncargo generate cloudflare/workers-rs\n```\n\n### wrangler.toml\n\n```toml\nname = \"mzizi-example-service\"\nmain = \"build/worker/shim.mjs\"\ncompatibility_date = \"2026-09-01\"\n\n[build]\ncommand = \"cargo install -q worker-build && worker-build --release\"\n\n[[kv_namespaces]]\nbinding = \"ITEMS\"\nid = \"<namespace id>\"\n\n[[triggers.crons]]\ncron = \"*/5 * * * *\"\n\n[[queues.consumers]]\nqueue = \"mzizi-example-signals\"\nmax_batch_size = 10\n```\n\nKeep `compatibility_date` current; a stale date silently pins you to old runtime behaviour.\nSecrets are set out of band with `wrangler secret put <NAME>` and never committed.\n\n### Storage\n\nA Mzizi service holds **no database client**. Its data is files bundled at build time (the way\n`api.mzizi.dev` and `mcp.mzizi.dev` serve the registry at a pinned commit) or Workers bindings:\nKV, R2, D1, Durable Objects. Put each behind a trait in the core so the core never imports\n`worker`. Only the Mzizi console (`app.mzizi.dev`, operated by Nyuchi) uses Supabase, and\nnothing else in the estate should talk to it.\n\n### Queue consumers\n\nA queue consumer needs the crate's `queue` feature:\n`worker = { version = \"0.8\", features = [\"queue\"] }`.\n\n```rust\n#[event(queue)]\npub async fn queue(batch: MessageBatch<String>, _env: Env, _ctx: Context) -> Result<()> {\n for message in batch.messages()? {\n // hand message.body() to the core, then acknowledge\n message.ack();\n }\n Ok(())\n}\n```\n\n## A Mzizi service (the language's backend slice)\n\nWrite one when the task is the language itself: a backend benchmark task, an example, or an\nexperiment with the slice. Do not use it for a live Mzizi service; nothing deploys it. The\nfull grammar, the runtime-owned behaviour and every `MZ08xx` code are in the `mzizi-language`\nskill (\"Services\"). A minimal service, which passes `mz check` and `mz contract`:\n\n```mz\n## Health and one item, with a JSON 404.\nservice items\n\n header \"x-service\" \"items\"\n\n record health\n field status: text\n end\n\n record problem\n field error: text\n end\n\n route health_check\n get \"/v1/health\"\n respond 200 json health status \"ok\"\n end\n\n route item\n get \"/v1/items/{name}\"\n when name in \"badge\" \"button\"\n respond 200 text \"{name}\"\n end\n respond 404 json problem error \"Not found\"\n end\n\n fallback\n respond 404 json problem error \"Not found\"\n end\n\n contract\n example get \"/v1/health\" body.status is \"ok\"\n example get \"/v1/items/card\" status is 404\n example options \"/v1/items/badge\" header \"allow\" is \"GET, HEAD, OPTIONS\"\n ensure header \"x-service\" is \"items\"\n end\n\nend service items\n```\n\nThe runtime answers `HEAD`, `OPTIONS`, `405` and the trailing-slash `308` itself, so a\nservice never writes them. The loop, with `mz` built from source (there is no release; see\n\"Getting `mz`\" in the `mzizi-language` skill):\n\n```bash\nmz check --agent items.mz # NDJSON; MZ08xx for routes and handlers\nmz fix items.mz # every exact fix\nmz contract --agent items.mz # runs the service in process; the summary adds contract_tested\nmz build items.mz --out ../target/mz-build/items\ncargo test --manifest-path ../target/mz-build/items/Cargo.toml # one test per example\nPORT=8787 cargo run --release --manifest-path ../target/mz-build/items/Cargo.toml\n```\n\nThe generated package depends on `axum` and `tokio` (pinned exactly), is its own workspace\nroot, and is never committed. Its runtime is one Rust function, the same routing algorithm\n`mz contract` evaluates.\n\n## An MCP server\n\n### Transport\n\nMCP over HTTP is **Streamable HTTP**, JSON-RPC 2.0:\n\n- `POST /mcp` — JSON-RPC requests\n- `GET /mcp` — SSE stream\n- `DELETE /mcp` — session cleanup\n- `OPTIONS /mcp` — CORS preflight\n\nA server exposes `tools/list` and `tools/call`, and optionally `resources/list` and\n`prompts/list`.\n\nUse `@modelcontextprotocol/sdk`. TypeScript is the right choice for an MCP server today,\nbecause the SDK, `hono` and `agents` are TypeScript-first; put any heavy logic in a Rust core\n(\"A Rust Worker\" above). Pin the SDK version deliberately: `agents` hard-pins\n`@modelcontextprotocol/sdk`, and letting your own declaration drift produces two incompatible\n`McpServer` classes in the type graph and a private-field mismatch at typecheck.\n\n### One factory, many entrypoints\n\nKeep the server definition free of any runtime binding, then wrap it per surface. This is what\nlets the same catalogue ship as a Worker, a generic fetch handler and a local stdio bin\n(`mzizi-mcp/src/`):\n\n```\nsrc/\n├── server.ts # createXMcpServer(deps) → McpServer ← the only place tools are defined\n├── http.ts # createXHttpHandler() — any fetch runtime\n├── worker.ts # Cloudflare Worker entry, bound to env\n└── stdio.ts # bin for local clients / the MCP Registry\n```\n\n### The catalogue is code; the data is bundled\n\n`mzizi-mcp` defines its tools in code (`src/tools.ts`) and reads its data from files bundled at\nbuild time: `scripts/generate-registry.mjs` fetches the registry at the exact commit in\n`registry.pin.json`, and `scripts/generate-skills.mjs` inlines `mzizi-skills/`. There is **no\ndatabase client, dependency, env var or secret** behind a read tool. To move the MCP to newer\nregistry content, change the pinned commit in a pull request; the diff is the review.\n\nThe gates are tests, not a live drift check:\n\n1. **A tool-surface suite** connects a real MCP `Client` to the factory over an in-memory\n transport and asserts the contract: the tool names and prefix, annotations, input and output\n schemas, and which tools need sign-in (`test/tool-surface.test.ts`, `free-tier.test.ts`).\n2. **A bundle suite** calls every tool against the real bundled data with the network disabled,\n and asserts that what a tool serves is byte-identical to the file it came from\n (`registry-bundle.test.ts`, `rust-first.test.ts`, `skills-bundle.test.ts`, `no-database.test.ts`).\n\n**Federating another MCP.** `mzizi-mcp` lists the docs MCP's tools under a `docs_` prefix and\nforwards each call, with a cached tool list and a clear tool error when the upstream fails\n(`src/docs-federation.ts`). Prefer that to copying another server's content.\n\n### Tool naming and annotations\n\nTools are `snake_case`, prefixed with the server (`mzizi_`), and named for the action:\n`mzizi_search`, `mzizi_get_component`, `mzizi_list_components`, `mzizi_get_tokens`,\n`mzizi_get_architecture`, `mzizi_get_doctrine`, `mzizi_get_skills`,\n`mzizi_check_accessibility`, `mzizi_report_issue`, `mzizi_fundi`, `mzizi_mcp_describe`. Read the\nlive list with `tools/list` rather than trusting a copy, this one included. Inputs take plain\nnames (`{ \"name\": \"button\" }`); the old `p_`-prefixed database parameters are gone.\n\nEvery tool carries a `title`, an `outputSchema`, and honest behaviour hints:\n\n- `readOnlyHint` — true only if the tool cannot mutate anything. An action that runs an audit\n or files a report is **not** read-only.\n- `destructiveHint` / `idempotentHint` / `openWorldHint` — set them deliberately; clients use\n them to decide what to auto-approve. A tool that reads only bundled data is\n `openWorldHint: false`.\n\nReturn `structuredContent` matching the declared `outputSchema`.\n\n### Static assets\n\nIf the Worker also serves `llms.txt`, `robots.txt` or `/.well-known/*` cards, put them behind an\n`[assets]` block so they resolve ahead of the OAuth handler; everything else falls through to\nthe server.\n\n### Instrumentation\n\nIf you report tool errors to an observability sink, do it fire-and-forget via\n`ctx.waitUntil`, so reporting never blocks or fails the response.\n\n### Publishing to npm and the MCP Registry\n\n`server.json` next to `package.json` is the source of truth, and `package.json#mcpName`\n**must** equal `server.json#name` or the registry refuses the publish. Registry names are\n`io.github.mzizi-dev/<server>`: the namespace is the GitHub owner of the repository the publish\nruns from, because `mcp-publisher login github-oidc` only authorises `io.github.<owner>/*`. The\nold `io.github.nyuchi/mzizi-mcp` entry is stale and no longer updated.\n\nRelease checklist:\n\n1. Bump the version everywhere it is stated: the constant the server reports in `serverInfo`\n (`MZIZI_MCP_VERSION` in `src/server.ts`), `package.json#version`, `server.json#version`,\n and `server.json#packages[0].version`. A mismatch here is the most common failed publish.\n2. Merge to `main`. `.github/workflows/publish-mzizi-mcp.yml` publishes to npm (skipped if the\n version is already there) and then runs `mcp-publisher login github-oidc` and\n `mcp-publisher publish`, treating \"this version already exists\" as success. OIDC means no\n registry secret. A merge that does not change the version is a no-op.\n\n## Access: free, except what acts as a person (every service)\n\nOwner decision, 2026-09-29: **the MCP server and the CLI are free, with no gate.** An anonymous\nsession can `initialize`, `tools/list` and call every tool except the Fundi ones. Gating starts\nat **Fundi**: `mzizi_fundi` and `mzizi_report_issue` act as a Mzizi console user.\n\nHow `mzizi-mcp` does it (`src/worker.ts`, `src/access.ts`):\n\n- A tokenless request to `/mcp` is routed around the OAuth provider, rate-limited per IP, and\n served with no user.\n- Any request with an `Authorization` header, and `/mcp/signin`, goes through\n `@cloudflare/workers-oauth-provider`, which validates the token and puts the WorkOS identity\n on `ctx.props`. A bad or expired token still gets the 401 that makes a client refresh.\n- The gated tools stay **listed** to an anonymous caller and answer with a tool error that\n starts `Sign-in required:` and says how to sign in. `access.ts` is the one list.\n\nWhen a person signs in, it is WorkOS Connect OAuth with PKCE (a public client, no secret). A\nmachine calling an internal service uses WorkOS M2M; only the Worker holds that secret, and it\nmints the token and proxies the call so a CLI never holds it. Auth happens **inline in the\nclient**, never by punting the user to a browser tab mid-task.\n\nValidate an inbound token against the WorkOS JWKS before any privileged work, and cache the\nJWKS; refetching per request is the classic latency bug. Return `401` for a missing or invalid\ntoken and `403` for a valid token without the required scope. Never collapse the two, or\ncallers cannot tell \"sign in\" from \"you can't do this\". Cron, queue and health routes are not\nuser-triggered and bypass the gate by design.\n\n## Logging (every service)\n\nPrefix every line with the service in brackets, as `mzizi-fundi` does with `[fundi]`, so it is\ngreppable across services:\n\n```rust\nconsole_log!(\"[example] cycle complete: {} records processed\", count);\nconsole_error!(\"[example] upstream error: {:?}\", e);\n```\n\nNever log a token, a secret, or a full request body.\n\n## Deploy (every service)\n\n```bash\nwrangler dev # local\nwrangler deploy # manual only; normally CI deploys\n```\n\nWire deploys to CI rather than a laptop, so what is live is what is merged. `mzizi-mcp` is\ndeployed by Cloudflare Workers Builds on every push to `main`, including its bundled registry\npin and skills. Run the test suites before you merge, and a live smoke pass of every read tool\n(`mzizi-mcp/scripts/integration.mjs`) after.",
32
- "source": "mzizi-dev/agent-tools/mzizi-skills/skills/mzizi-backend"
202
+ "category": "build",
203
+ "description": "A Mzizi backend service, on Cloudflare Workers today (containers and bare metal are decided, not built): where it stands today (every live Mzizi Worker is TypeScript; the language's backend service slice, RFC-0011, runs in process under mz contract and lowers with mz build to a local Rust + axum package, with no Workers target and nothing deployed), the live endpoint map (api.mzizi.dev, mcp.mzizi.dev, docs.mzizi.dev/mcp), a Rust Worker as a sans-IO core plus thin host (workers-rs, wrangler, cron, queues, bindings, no database client), an MCP server (Streamable HTTP, one factory with many entrypoints, a code-defined catalogue over data bundled at a pinned commit, federation, naming and annotations, npm + MCP Registry publish), the free-except-Fundi access rule, logging and deploy. Replaces cloudflare-worker-rust and mcp-server-cloudflare.",
204
+ "body_mdx": "# Mzizi backend\n\nThis skill replaces two 0.7.0 skills: `cloudflare-worker-rust` (now \"A Rust Worker\") and\n`mcp-server-cloudflare` (now \"An MCP server\"). The rules they shared (access, logging, deploy)\nare stated once, at the end.\n\n## Where the backend stands today\n\n**Direction: Rust first, TypeScript second** (`mzizi-registry` →\n`content/doctrine/documentation-architecture-framework/`), and Mzizi's backend is meant, in\nthe end, to be built in the Mzizi language itself (`CHARTER.md` v0.4, §1). Neither is the\nstate today, and a skill that implied otherwise would mislead you:\n\n- **Every Worker Mzizi runs is TypeScript.** `api.mzizi.dev` is `mzizi-dev/mzizi-api` (formerly\n `mzizi-api-gateway`), a Hono Worker. `mzizi-dev/agent-tools` holds `mzizi-mcp` (mcp.mzizi.dev), `mzizi-fundi` and\n `bushtrade-mcp`, all TypeScript, because the MCP SDK, `hono` and `agents` are TypeScript.\n- **The Rust building blocks exist.** Mzizi Roots server components (the `mzizi-roots-server`\n crate: `mzizi-assurance`, `mzizi-fundi`, `mzizi-docs`, `mzizi-discovery`) are sans-IO cores\n meant to be mounted in a Worker. The `workers-rs` adapter crate (`mzizi-worker`) is planned\n and has not landed, so today the Worker writes its own few lines of adapter.\n- **The Mzizi language has one backend slice, and it serves nothing live.** A `service` with\n HTTP routes and handlers (`when`, `header`, `respond`) exists on the language's `main`\n (RFC-0011; `mzizi-dev/mzizi` `main` at `cf3a44e`, 2026-11-01). `mz check` checks it, `mz contract` runs it in\n process against its `example` and `ensure` clauses, and `mz build` lowers it to a local\n Rust + axum Cargo package that serves `127.0.0.1:$PORT`. That is all: no Workers,\n WebAssembly or Containers target, no deployment, no Workers bindings or storage, no request bodies,\n no state, and no modules. The core language (functions, loops, collections, `result` with\n `try`) exists in a `program` (RFC-0013, run by `mz run`), not yet inside a handler. No\n component lowers.\n Its first job is the Phase 0 backend measurement (task B1, the `mzizi-be` arm), and no\n backend episode has run. Check `LANGUAGE-TRACKER.md` in the language repo before claiming\n any capability. \"A Mzizi service\" below shows the slice.\n\n## Three build targets (decided, not built)\n\nOwner direction, 2026-10-20: the Mzizi build-out covers three targets, not Workers alone.\n\n- **Cloudflare Workers** (`wasm32-unknown-unknown`) is the only target a Mzizi backend runs on\n today. The Rust Worker pattern below is the Rust route to it.\n- **Containers**, as a standard OCI image (built with Docker by default, run by any OCI runtime,\n for example on Fly machines), are designed and not built: the work waits for the Phase 0 gate.\n The language has no container image target today.\n- **Bare metal**, as a native Linux binary, is designed and not built, and waits for the Phase 0\n gate.\n\nThe language's RFC-0016 (`mzizi-dev/mzizi#123`) designs the three targets; the owner approved it\nas design only on 2026-10-21, and every build wave waits for the Phase 0 gate.\n\nBuilt today: every Rust crate builds and tests natively, and `mz build` emits a native axum\nservice (it binds `127.0.0.1` today) and a native program. There is no container image and no\nWorkers target in the language. `mzizi-data` and `mzizi-mongodb` have only a Workers socket\ntransport today; a native transport is designed and waits for the Phase 0 gate.\n\nA backend sits behind a trait with an adapter per side, so Cloudflare-hosted stores (D1, KV, R2,\nQueues) and Fly-hosted stores (MongoDB, the self-hosted Postgres ledger, Redpanda) are reachable\nfrom either target. Fly apps are not Johannesburg-only: stateless services are decided to run in\n`jnb`, `cdg` (Paris, with `mad` second) and `sin`, while stateful data services stay in `jnb` until\na replication design exists. These are routing decisions, and no latency figure is claimed.\n\nSo: write a new production service's logic in Rust as a sans-IO core. Use TypeScript where\nthe work leans on the MCP SDK or `agents` (see \"An MCP server\" below). Port nothing that\nworks without a reason; when a service is ported, its existing tests and parity script are the\ncontract the port must meet.\n\n## The live endpoint map\n\nRead this before inventing a hostname. Each MCP has its own host, and the old umbrella\n`mcp.nyuchi.dev/{service}` path scheme is **not** how these are deployed:\n\n| Endpoint | Worker / source | Serves |\n| -------------------------- | ---------------------------------------------------------- | --------------------------------------------------------------------------------------------------- |\n| `api.mzizi.dev` | `mzizi-api` (Worker `mzizi-api-gateway`, Hono, TypeScript) | The registry API: the registry's files at a pinned commit; no origin, no database |\n| `mcp.mzizi.dev/mcp` | `mzizi-mcp` (`mzizi-dev/agent-tools`) | The Mzizi registry, tokens, architecture, doctrine and skills (`mzizi_*`), plus the docs (`docs_*`) |\n| `mcp.mzizi.dev/mcp/signin` | the same Worker | The same MCP, answering 401 until you sign in: the URL for the Fundi tools |\n| `docs.mzizi.dev/mcp` | Mintlify (`mzizi-dev/mzizi-docs`) | The Mzizi docs; `mzizi-mcp` federates these as `docs_*` |\n| (Worker, no public route) | `bushtrade-mcp` (`mzizi-dev/agent-tools`) | Agentic commerce: task-driven UCP/AP2 verbs (Nyuchi) |\n| `docs.nyuchi.com/mcp` | `nyuchi-docs-mcp` (`nyuchi/nyuchi-docs`) | Nyuchi's own docs corpus, not Mzizi's |\n\n`design.nyuchi.com` is a 308 permanent redirect to `mzizi.dev`. Never reference it in new code\nor docs. `mzizi.dev/mcp` 308-redirects to `mcp.mzizi.dev/mcp` (method and body preserved), so\npoint new clients at `mcp.mzizi.dev/mcp` directly.\n\n**One MCP per surface.** Two endpoints over one corpus is two tool catalogues to keep in step,\ntwo access stories to explain, and a silent choice for every client author. That is why the\ndocs are federated into `mzizi-mcp` rather than listed as a second Mzizi MCP.\n\n## A Rust Worker\n\n### The shape: a sans-IO core and a thin host\n\nThe core owns routing and response shaping. The host owns I/O, bindings and secrets. This is\nthe shape of `n10-documentation/mzizi-docs-api.rs` in the registry, and it is what lets the\nsame core run in a Worker, in a container behind axum, and in a native unit test.\n\n```\nservice-name/\n├── src/\n│ ├── core.rs # routes, types, a Store trait — no `worker` import\n│ └── lib.rs # the Worker: reads bindings, calls the core, writes the response\n├── wrangler.toml\n└── Cargo.toml\n```\n\nThis example compiles against `worker` 0.8.7, natively and for `wasm32-unknown-unknown`:\n\n```toml\n[lib]\ncrate-type = [\"cdylib\", \"rlib\"]\n\n[dependencies]\nworker = \"0.8\"\n```\n\n```rust\n// src/core.rs\n//! The sans-IO core: typed request in, typed response out. No `worker` import,\n//! so it builds and tests natively and for wasm32 alike.\n\n/// Every route this service answers. An unhandled one is a compile error in `respond`.\n#[derive(Debug, PartialEq, Eq)]\npub enum Route {\n Health,\n Item(String),\n NotFound,\n}\n\n/// Parse a method and path into a route.\npub fn route(method: &str, path: &str) -> Route {\n match (method, path.trim_end_matches('/')) {\n (\"GET\", \"/health\") => Route::Health,\n (\"GET\", p) if p.starts_with(\"/v1/items/\") => Route::Item(p[\"/v1/items/\".len()..].to_string()),\n _ => Route::NotFound,\n }\n}\n\n/// What the core needs from the host, behind a trait so a test can pass an in-memory one.\npub trait Store {\n fn item(&self, id: &str) -> Option<String>;\n}\n\n/// Shape the answer: a status and a body. The host owns I/O, bindings and secrets.\npub fn respond(route: &Route, store: &dyn Store) -> (u16, String) {\n match route {\n Route::Health => (200, r#\"{\"ok\":true}\"#.to_string()),\n Route::Item(id) => match store.item(id) {\n Some(body) => (200, body),\n None => (404, r#\"{\"error\":\"not found\"}\"#.to_string()),\n },\n Route::NotFound => (404, r#\"{\"error\":\"no such route\"}\"#.to_string()),\n }\n}\n```\n\n```rust\n// src/lib.rs\nuse worker::*;\n\nmod core;\n\n/// A `Store` over data the Worker has already read from its bindings (KV, R2, D1).\nstruct Loaded(Option<String>);\n\nimpl core::Store for Loaded {\n fn item(&self, _id: &str) -> Option<String> {\n self.0.clone()\n }\n}\n\n#[event(fetch)]\nasync fn fetch(req: Request, env: Env, _ctx: Context) -> Result<Response> {\n let route = core::route(req.method().as_ref(), &req.path());\n // The host does the I/O the core asked for, then hands the result over.\n let loaded = match &route {\n core::Route::Item(id) => env.kv(\"ITEMS\")?.get(id).text().await?,\n _ => None,\n };\n let (status, body) = core::respond(&route, &Loaded(loaded));\n let headers = Headers::new();\n headers.set(\"content-type\", \"application/json\")?;\n Ok(Response::ok(body)?.with_status(status).with_headers(headers))\n}\n\n#[event(scheduled)]\nasync fn scheduled(_event: ScheduledEvent, _env: Env, _ctx: ScheduleContext) {\n console_log!(\"[example] scheduled run\");\n}\n```\n\nTest the core natively with an in-memory `Store`, and assert status codes, headers and bodies\nper route there. That is the contract a Rust server component carries. A Mzizi `service`\nstates the same facts as `example` and `ensure` clauses (below), but nothing lowers a Mzizi\nservice to a Worker, so a Rust Worker keeps its contract in its tests.\n\n### Project setup\n\n```bash\nnpm install -g wrangler\ncargo install worker-build\ncargo generate cloudflare/workers-rs\n```\n\n### wrangler.toml\n\n```toml\nname = \"mzizi-example-service\"\nmain = \"build/worker/shim.mjs\"\ncompatibility_date = \"2026-09-01\"\n\n[build]\ncommand = \"cargo install -q worker-build && worker-build --release\"\n\n[[kv_namespaces]]\nbinding = \"ITEMS\"\nid = \"<namespace id>\"\n\n[[triggers.crons]]\ncron = \"*/5 * * * *\"\n\n[[queues.consumers]]\nqueue = \"mzizi-example-signals\"\nmax_batch_size = 10\n```\n\nKeep `compatibility_date` current; a stale date silently pins you to old runtime behaviour.\nSecrets are set out of band with `wrangler secret put <NAME>` and never committed.\n\n### Storage\n\nA Mzizi service holds **no database client**. Its data is files bundled at build time (the way\n`api.mzizi.dev` and `mcp.mzizi.dev` serve the registry at a pinned commit) or Workers bindings:\nKV, R2, D1, Durable Objects. Put each behind a trait in the core so the core never imports\n`worker`. Only the Mzizi console (`app.mzizi.dev`, operated by Nyuchi) uses Supabase, and\nnothing else in the estate should talk to it. The console's rebuild is decided to move its store\nto Cloudflare D1, not Supabase (not built).\n\n**In review, not merged:** `mzizi-mongodb` and `mzizi-data` would give a service a MongoDB client\nand a data-layer client behind these same traits. Both are in review (open pull requests), so until\nthey merge, the statement above that a Mzizi service holds no database client stands.\n\n### Queue consumers\n\nA queue consumer needs the crate's `queue` feature:\n`worker = { version = \"0.8\", features = [\"queue\"] }`.\n\n```rust\n#[event(queue)]\npub async fn queue(batch: MessageBatch<String>, _env: Env, _ctx: Context) -> Result<()> {\n for message in batch.messages()? {\n // hand message.body() to the core, then acknowledge\n message.ack();\n }\n Ok(())\n}\n```\n\n## A Mzizi service (the language's backend slice)\n\nWrite one when the task is the language itself: a backend benchmark task, an example, or an\nexperiment with the slice. Do not use it for a live Mzizi service; nothing deploys it. The\nfull grammar, the runtime-owned behaviour and every `MZ08xx` code are in the `mzizi-language`\nskill (\"Services\"). A minimal service, which passes `mz check` and `mz contract`:\n\n```mz\n## Health and one item, with a JSON 404.\nservice items\n\n header \"x-service\" \"items\"\n\n record health\n field status: text\n end\n\n record problem\n field error: text\n end\n\n route health_check\n get \"/v1/health\"\n respond 200 json health status \"ok\"\n end\n\n route item\n get \"/v1/items/{name}\"\n when name in \"badge\" \"button\"\n respond 200 text \"{name}\"\n end\n respond 404 json problem error \"Not found\"\n end\n\n fallback\n respond 404 json problem error \"Not found\"\n end\n\n contract\n example get \"/v1/health\" body.status is \"ok\"\n example get \"/v1/items/card\" status is 404\n example options \"/v1/items/badge\" header \"allow\" is \"GET, HEAD, OPTIONS\"\n ensure header \"x-service\" is \"items\"\n end\n\nend service items\n```\n\nThe runtime answers `HEAD`, `OPTIONS`, `405` and the trailing-slash `308` itself, so a\nservice never writes them. The loop, with `mz` built from source (there is no release; see\n\"Getting `mz`\" in the `mzizi-language` skill):\n\n```bash\nmz check --agent items.mz # NDJSON; MZ08xx for routes and handlers\nmz fix items.mz # every exact fix\nmz contract --agent items.mz # runs the service in process; the summary adds contract_tested\nmz build items.mz --out ../target/mz-build/items\ncargo test --manifest-path ../target/mz-build/items/Cargo.toml # one test per example\nPORT=8787 cargo run --release --manifest-path ../target/mz-build/items/Cargo.toml\n```\n\nThe generated package depends on `axum` and `tokio` (pinned exactly), is its own workspace\nroot, and is never committed. Its runtime is one Rust function, the same routing algorithm\n`mz contract` evaluates.\n\n## An MCP server\n\n### Transport\n\nMCP over HTTP is **Streamable HTTP**, JSON-RPC 2.0:\n\n- `POST /mcp` — JSON-RPC requests\n- `GET /mcp` — SSE stream\n- `DELETE /mcp` — session cleanup\n- `OPTIONS /mcp` — CORS preflight\n\nA server exposes `tools/list` and `tools/call`, and optionally `resources/list` and\n`prompts/list`.\n\nUse `@modelcontextprotocol/sdk`. TypeScript is the right choice for an MCP server today,\nbecause the SDK, `hono` and `agents` are TypeScript-first; put any heavy logic in a Rust core\n(\"A Rust Worker\" above). Pin the SDK version deliberately: `agents` hard-pins\n`@modelcontextprotocol/sdk`, and letting your own declaration drift produces two incompatible\n`McpServer` classes in the type graph and a private-field mismatch at typecheck.\n\n### One factory, many entrypoints\n\nKeep the server definition free of any runtime binding, then wrap it per surface. This is what\nlets the same catalogue ship as a Worker, a generic fetch handler and a local stdio bin\n(`mzizi-mcp/src/`):\n\n```\nsrc/\n├── server.ts # createXMcpServer(deps) → McpServer ← the only place tools are defined\n├── http.ts # createXHttpHandler() — any fetch runtime\n├── worker.ts # Cloudflare Worker entry, bound to env\n└── stdio.ts # bin for local clients / the MCP Registry\n```\n\n### The catalogue is code; the data is bundled\n\n`mzizi-mcp` defines its tools in code (`src/tools.ts`) and reads its data from files bundled at\nbuild time: `scripts/generate-registry.mjs` fetches the registry at the exact commit in\n`registry.pin.json`, and `scripts/generate-skills.mjs` inlines `mzizi-skills/`. There is **no\ndatabase client, dependency, env var or secret** behind a read tool. To move the MCP to newer\nregistry content, change the pinned commit in a pull request; the diff is the review.\n\nThe gates are tests, not a live drift check:\n\n1. **A tool-surface suite** connects a real MCP `Client` to the factory over an in-memory\n transport and asserts the contract: the tool names and prefix, annotations, input and output\n schemas, and which tools need sign-in (`test/tool-surface.test.ts`, `free-tier.test.ts`).\n2. **A bundle suite** calls every tool against the real bundled data with the network disabled,\n and asserts that what a tool serves is byte-identical to the file it came from\n (`registry-bundle.test.ts`, `rust-first.test.ts`, `skills-bundle.test.ts`, `no-database.test.ts`).\n\n**Federating another MCP.** `mzizi-mcp` lists the docs MCP's tools under a `docs_` prefix and\nforwards each call, with a cached tool list and a clear tool error when the upstream fails\n(`src/docs-federation.ts`). Prefer that to copying another server's content.\n\n### Tool naming and annotations\n\nTools are `snake_case`, prefixed with the server (`mzizi_`), and named for the action:\n`mzizi_search`, `mzizi_get_component`, `mzizi_list_components`, `mzizi_get_tokens`,\n`mzizi_get_architecture`, `mzizi_get_doctrine`, `mzizi_get_skills`,\n`mzizi_check_accessibility`, `mzizi_report_issue`, `mzizi_fundi`, `mzizi_mcp_describe`. Read the\nlive list with `tools/list` rather than trusting a copy, this one included. Inputs take plain\nnames (`{ \"name\": \"button\" }`); the old `p_`-prefixed database parameters are gone.\n\nEvery tool carries a `title`, an `outputSchema`, and honest behaviour hints:\n\n- `readOnlyHint` — true only if the tool cannot mutate anything. An action that runs an audit\n or files a report is **not** read-only.\n- `destructiveHint` / `idempotentHint` / `openWorldHint` — set them deliberately; clients use\n them to decide what to auto-approve. A tool that reads only bundled data is\n `openWorldHint: false`.\n\nReturn `structuredContent` matching the declared `outputSchema`.\n\n### Static assets\n\nIf the Worker also serves `llms.txt`, `robots.txt` or `/.well-known/*` cards, put them behind an\n`[assets]` block so they resolve ahead of the OAuth handler; everything else falls through to\nthe server.\n\n### Instrumentation\n\nIf you report tool errors to an observability sink, do it fire-and-forget via\n`ctx.waitUntil`, so reporting never blocks or fails the response.\n\n### Publishing to npm and the MCP Registry\n\n`server.json` next to `package.json` is the source of truth, and `package.json#mcpName`\n**must** equal `server.json#name` or the registry refuses the publish. Registry names are\n`io.github.mzizi-dev/<server>`: the namespace is the GitHub owner of the repository the publish\nruns from, because `mcp-publisher login github-oidc` only authorises `io.github.<owner>/*`. The\nold `io.github.nyuchi/mzizi-mcp` entry is stale and no longer updated.\n\nRelease checklist:\n\n1. Bump the version everywhere it is stated: the constant the server reports in `serverInfo`\n (`MZIZI_MCP_VERSION` in `src/server.ts`), `package.json#version`, `server.json#version`,\n and `server.json#packages[0].version`. A mismatch here is the most common failed publish.\n2. Merge to `main`. `.github/workflows/publish-mzizi-mcp.yml` publishes to npm (skipped if the\n version is already there) and then runs `mcp-publisher login github-oidc` and\n `mcp-publisher publish`, treating \"this version already exists\" as success. OIDC means no\n registry secret. A merge that does not change the version is a no-op.\n\n## Access: free, except what acts as a person (every service)\n\nOwner decision, 2026-09-29: **the MCP server and the CLI are free, with no gate.** An anonymous\nsession can `initialize`, `tools/list` and call every tool except the Fundi ones. Gating starts\nat **Fundi**: `mzizi_fundi` and `mzizi_report_issue` act as a Mzizi console user.\n\nHow `mzizi-mcp` does it (`src/worker.ts`, `src/access.ts`):\n\n- A tokenless request to `/mcp` is routed around the OAuth provider, rate-limited per IP, and\n served with no user.\n- Any request with an `Authorization` header, and `/mcp/signin`, goes through\n `@cloudflare/workers-oauth-provider`, which validates the token and puts the WorkOS identity\n on `ctx.props`. A bad or expired token still gets the 401 that makes a client refresh.\n- The gated tools stay **listed** to an anonymous caller and answer with a tool error that\n starts `Sign-in required:` and says how to sign in. `access.ts` is the one list.\n\nWhen a person signs in, it is WorkOS Connect OAuth with PKCE (a public client, no secret). A\nmachine calling an internal service uses WorkOS M2M; only the Worker holds that secret, and it\nmints the token and proxies the call so a CLI never holds it. Auth happens **inline in the\nclient**, never by punting the user to a browser tab mid-task.\n\nValidate an inbound token against the WorkOS JWKS before any privileged work, and cache the\nJWKS; refetching per request is the classic latency bug. Return `401` for a missing or invalid\ntoken and `403` for a valid token without the required scope. Never collapse the two, or\ncallers cannot tell \"sign in\" from \"you can't do this\". Cron, queue and health routes are not\nuser-triggered and bypass the gate by design.\n\n## Logging (every service)\n\nPrefix every line with the service in brackets, as `mzizi-fundi` does with `[fundi]`, so it is\ngreppable across services:\n\n```rust\nconsole_log!(\"[example] cycle complete: {} records processed\", count);\nconsole_error!(\"[example] upstream error: {:?}\", e);\n```\n\nNever log a token, a secret, or a full request body.\n\n## Deploy (every service)\n\n```bash\nwrangler dev # local\nwrangler deploy # manual only; normally CI deploys\n```\n\nWire deploys to CI rather than a laptop, so what is live is what is merged. `mzizi-mcp` is\ndeployed by Cloudflare Workers Builds on every push to `main`, including its bundled registry\npin and skills. Run the test suites before you merge, and a live smoke pass of every read tool\n(`mzizi-mcp/scripts/integration.mjs`) after.",
205
+ "source": "mzizi-dev/agent-tools/mzizi-skills/skills/mzizi-backend",
206
+ "files": []
207
+ },
208
+ {
209
+ "name": "mzizi-architecture",
210
+ "category": "build",
211
+ "description": "Mzizi architecture in three parts, read before starting any app, site, console or page. Design: the DNA helix (8 nodes N1-N8, 4 rungs N9-N12, 6 strands) read live from api.mzizi.dev/v1/architecture or mzizi_get_architecture, and what each placement obliges (N1 alone defines values, N6 composes and implements nothing, N7 is one shell per app). App: the shell first. AppShell from @bundu/ui (Mzizi Dashboard Standard) for a signed-in app or console, DiscoverShell (Mzizi Discover Standard) for a public discover site, installed before the first page, with a check that it is present and wraps every page, then the Standards' page patterns and the five application layers (L1-L5, imports flow down). It records the gaps found upstream (no Rust AppShell, no marketing-site shell). System: Rust first and Astro as the default UI, Cloudflare Workers, the four API gateways, the registry's files as its data layer at a pinned commit, one owning service per domain database, the assurance model, free by default with sign-in only for what acts as a person, and failures becoming fundi issues; decided and built are kept apart. Restores the app-architecture half of ecosystem-app-setup that 0.8.0 folded away.",
212
+ "body_mdx": "# Mzizi architecture: design, app and system\n\nThree questions, in this order, before anything is built:\n\n1. **Design architecture.** Where on the helix does this belong, and what does that placement\n oblige it to do?\n2. **App architecture.** Which shell frames it? The shell is installed **first**, before the\n first page.\n3. **System architecture.** Which service owns the data, which gateway serves it, and what runs\n where?\n\nThe rule behind all three is **upstream first**. If the registry lacks a component, a shell or a\npattern that you need, or has one that is wrong, change it in `mzizi-dev/mzizi-registry`, its\ncontract in `contracts/` and its build in `@bundu/ui`. Keep a local copy only while that pull\nrequest is open, marked `TODO(mzizi): <PR URL>`. Never fork the shell or restyle it locally.\n\nThis skill describes registry `main` at v4.18.0 (`0d17818`, 2026-11-01), the Roots crates at\n0.7.0 and `@bundu/ui` 0.7.0. Counts move, so read the live sources below rather than this text.\n\n## Design architecture: the DNA helix\n\nThe design system is a double helix. Read it live, not from memory:\n\n```bash\ncurl -s https://api.mzizi.dev/v1/architecture # nodes, rungs, strands\ncurl -s https://api.mzizi.dev/v1/architecture/nodes/7 # one node, with its rules\n```\n\nOn the MCP, call `mzizi_get_architecture`, or `mzizi_get_architecture node=7` for one node. The\nnode number is uncapped, so never assume a range.\n\n**Eight nodes.** These are the backbone, and each owns one kind of thing:\n\n| Node | Name | Owns | Strand |\n| ---- | ---------------- | --------------------------------------------------------------- | -------------- |\n| N1 | Design tokens | the only node allowed to define CSS values | swappable |\n| N2 | Primitives | the smallest composable unit of UI | core-guarantee |\n| N3 | Brand components | primitives wrapped in Ubuntu, the only consumers of the harness | shipped |\n| N4 | Safety rails | input validation, output sanitisation, AI guardrails | core-guarantee |\n| N5 | Resilience | circuit breakers, retries, timeouts, fallback chains | core-guarantee |\n| N6 | Pages | composition of N2 and N3, implementing nothing | shipped |\n| N7 | Shell | the app chrome: header, footer, navigation, theme, mounted once | shipped |\n| N8 | Assurance | observability, health monitoring, SLO tracking | core-guarantee |\n\n**Four rungs.** These bridge both backbones: N9 Fundi (self-healing: it consumes N8 signals and\nfiles structured issues for people, and never auto-merges), N10 Documentation, N11 Discovery\n(SEO and AIO, preview images, structured data, agent-readiness) and N12 Skills (this bundle).\n\n**Six strands.** Four belong to the engineering backbone: `core-guarantee` (travels unchanged\nand cannot be turned off), `shipped` (in the box, but free to evolve), `swappable` (the only fork\nseams: tokens, icons and the framework) and `spine`. Two belong to the meaning backbone:\n`genetic-code` and `transcription` (\"Doctrine is data, not tribal knowledge\").\n\nWhat a placement obliges, from the nodes' own implementation rules:\n\n- **N1 only defines values.** No hex, `rgba()` or inline style outside N1. Everything else reads\n `var(--…)` or its platform equivalent.\n- **N6 composes and implements nothing.** A page imports from N2 and N3, never defines a\n primitive, and pulls a spinner or skeleton from N2 rather than inlining one. Pages render on\n the server by default (Astro, no client JavaScript).\n- **N7 is singular.** There is one shell per app. It is the only place that holds sticky\n positioning, backdrop blur and theme-provider wiring. It surfaces auth state and never\n implements auth logic. It is responsive from 320px up.\n- **N4, N5 and N8 are core guarantees.** You cannot configure accessibility, safety,\n resilience or observability away.\n\nDo not confuse the helix with the five application layers below. They are two models with two\nnumberings, so never quote a count from one while describing the other.\n\n## App architecture: the shell comes first\n\nThe failure this section exists to stop is apps built page by page with no shell installed. Each\none then hand-rolls its own header, nav and footer, drifts from every other app, and loses the\nno-JS, density, accessibility and brand-overlay guarantees the shell's contract carries.\n**Step one of any new app is the shell.** Step one of any new page in an existing app is to\nconfirm the page renders inside it.\n\n### 1. Pick the shell from the kind of surface\n\n| Surface | Shell | Standard | Contract |\n| ---------------------------------------------------- | ---------------------------------------- | -------------------------------------------------------------------------- | ----------------------------------- |\n| A signed-in app, console or admin surface | `@bundu/ui/app/AppShell.astro` | Mzizi Dashboard Standard (docs.mzizi.dev/patterns/dashboard-standard) | `contracts/app/app-shell` |\n| A public discover or browse site (the Mukoko family) | `@bundu/ui/discover/DiscoverShell.astro` | Mzizi Discover Standard (docs.mzizi.dev/patterns/discover-standard) | `contracts/discover/discover-shell` |\n| A marketing site | none yet: see \"Gaps\" below | the `site/` components (`Hero`, `Section`, `Container`, `MineralStrip`, …) | no shell contract |\n\nRead the shell's contract before you wire it. The props, slots, `noJs`, `density` and `theming`\nthere are the specification. On the MCP that is `mzizi_get_component app-shell`, and in the\npackage, `@bundu/ui/contracts/app/*`.\n\n### 2. Install it (Astro, the default)\n\n```bash\nnpm install @bundu/ui # 0.7.0 or later\n```\n\nImport the tokens and your brand's overlay (colour and mark only) in your global stylesheet, as\nthe `mzizi-design` skill says. Then describe the navigation as data and wrap **every**\nsigned-in page in one layout that mounts `AppShell`:\n\n```astro\n---\n// src/layouts/App.astro: the one layout every signed-in page uses\nimport AppShell from \"@bundu/ui/app/AppShell.astro\";\nimport { nav } from \"../nav\"; // navigation as data, not markup\nconst { title } = Astro.props;\n---\n<AppShell nav={nav} accent=\"gold\" footerLinks={[{ label: \"Status\", href: \"/status\" }]}>\n <slot />\n</AppShell>\n```\n\nA public discover page puts `DiscoverMeta` in `<head>` and `DiscoverShell` in `<body>`, then\n`DiscoverHero`. The Discover Standard page has the full order.\n\nThen build pages from the patterns, never from scratch. For a dashboard, that means\n`PageHeader` first, then `Toolbar` or `FilterBar`, then `StatTiles`, then content in `Card`,\n`DataTable`, `FormLayout`, `EmptyState` or `DetailPanel`. For discover pages, that means\n`DiscoverSection`, `ResultGrid`, `DetailHero` and `RelatedRail`.\n\n### 3. Check that the shell is there\n\nRun this before you add a page, and in review. An app passes when each line holds:\n\n```bash\n# The shell is a dependency.\ngrep -E '\"@bundu/ui\"' package.json\n# Exactly one layout mounts it.\ngrep -rlE 'AppShell|DiscoverShell' src/layouts\n# Every page uses that layout. List the pages that do not:\ngrep -rL -E 'layouts/(App|Discover)' src/pages --include='*.astro'\n# No page hand-rolls chrome the shell owns.\ngrep -rnE '<(header|nav|footer)[ >]' src/pages\n```\n\nAny page the third command prints, and any match from the fourth, is a page outside the shell.\nMove it into the layout. A shell that is missing entirely means step 2 was skipped, so install\nthe shell before anything else.\n\n### 4. Structure the app's own code: five layers, imports flow down\n\nThese layers are local to one application (docs.mzizi.dev/patterns/architecture). They are not\nthe helix:\n\n| Layer | What it holds |\n| ----- | ------------------------------------------------------------------------------------------------- |\n| L1 | Shared primitives, installed from the registry and never edited in place |\n| L2 | Domain composites built only from L1, the first layer that knows what the app is about |\n| L3 | Page sections that arrange L2. They arrange and do not implement |\n| L4 | Error boundaries and loading states around every L3 section, so one failure never blanks the page |\n| L5 | Routes: data fetching and composition, inside the shell. This is where the network lives |\n\nA component imports from the layer below, never sideways or upward.\n\n### 5. A React or Rust app\n\n- **React (Next.js) adopts through the registry's `.tsx` builds.** AppShell and DiscoverShell\n have `.tsx` siblings that implement the same contract:\n `npx shadcn@latest add https://api.mzizi.dev/v1/ui/app-shell`. Always give the full URL. A bare\n name installs shadcn's own component and reports success.\n- **Rust.** `mzizi-shell` (in `mzizi-roots`) carries N7 parts such as the bottom nav, footer,\n command palette, connectivity bar, theme provider, route guard and deep links. **It has no\n AppShell or DiscoverShell.** Both contracts have `rs: null`. A Rust or Astro-with-Roots app\n takes the shell from `@bundu/ui` and renders Roots components inside it. Do not write a Rust\n shell in an app. See the gaps below.\n\n### Gaps: report them upstream, do not paper over them\n\nThese were found in the registry at v4.18.0 and are tracked in mzizi-registry#589:\n\n- AppShell and DiscoverShell have no Rust build (`rs: null`), and `mzizi-shell` documents that\n `mzizi-header` and `mzizi-sidebar` wait on N2 ports.\n- No shell contract exists for marketing sites (`site/` has no `site-shell`). The N6 doctrine\n names a \"Site Standard\", but docs.mzizi.dev has no page for it.\n\nWhen you hit one of these, open or comment on the registry issue instead of building a local\nshell.\n\n## System architecture\n\nWhat runs where, and who owns what. **Decided** and **built** are different words. Say which one\napplies.\n\n- **Rust first, Astro for the UI.** Astro is the default web UI. Underneath, the code is Rust\n first and TypeScript second, and Mzizi's own surfaces have no third UI framework. Components\n are Mzizi Roots (Rust) where a Rust build exists and the React build otherwise, with React\n deprioritised. No Dioxus, Leptos or Yew in new work. The Roots crates still depend on Dioxus\n until the move to Mzizi's own `render(props)` finishes.\n- **Cloudflare Workers** run the services: `api.mzizi.dev` (`mzizi-dev/mzizi-api`, a Hono\n Worker), `mcp.mzizi.dev` (`mzizi-mcp`) and fundi. Containers and bare metal are decided as\n further targets and are not built. The `mzizi-backend` skill has the patterns.\n- **Four API gateways.** The Mzizi API (`api.mzizi.dev`, Hono, built), the Nyuchi API (B2B), the\n Mukoko API (consumer) and the Nyuchi Servers API (internal). It is decided that the last three\n are Rust. An app reads through its gateway and never opens a database connection of its own\n for a read the gateway serves. Add the endpoint to the gateway instead.\n- **The registry's files are its data layer.** `registry.json`, `components/`, `contracts/` and\n `content/doctrine/` are bundled into the API and the MCP at a pinned registry commit (the\n `x-mzizi-source` header and `catalogue.json` name it). Nothing is read from a database at\n request time. Only the console keeps state, and its move to Cloudflare D1 is decided, not\n built.\n- **One owner per domain.** Platform data lives in domain-separated databases (news,\n engagement, identity, entity, places, …). Each is written only by the service that owns it,\n and other services reference its records by id rather than copying them. Doctrine is data:\n read `mzizi_get_doctrine`, never a copy in a prompt.\n- **Trust is two things.** Assurance levels and attestations come from the one access decision\n in nyuchi-api `gateway/lib/assurance.py`. Read that decision rather than deriving your own,\n and draw them with the `--assurance-*` and `--attestation-*` roles in `mzizi-design`.\n- **Every surface is free by default.** Gate only what acts as a person: WorkOS sign-in, with\n 401 for a missing token and 403 for a token that lacks the scope.\n- **Failures become issues.** N8 signals feed fundi (N9), which files deduplicated GitHub\n issues for people and never merges a fix itself.\n\n## Checklist for a new app or page\n\n- [ ] Helix placement decided, and its node's rules read live.\n- [ ] Shell chosen from the surface table, its contract read, and `@bundu/ui` installed.\n- [ ] One layout mounts the shell, and every page uses it (the check in step 3 prints nothing).\n- [ ] Pages built from the Standard's patterns, with no hand-rolled header, nav or footer.\n- [ ] Tokens and brand overlay from `mzizi-design`. No local colour, radius, spacing or type.\n- [ ] Data read through the owning gateway. No new direct database read.\n- [ ] Anything missing or wrong in the registry raised upstream, with any local stopgap marked\n `TODO(mzizi): <PR URL>`.\n\n## See also\n\n- `mzizi-design`: tokens, brand overlays, Apple HIG and where Mzizi overrides it, and the 48px\n floor.\n- `mzizi-roots`: the components, Rust first. \"Starting an app\" covers project setup, and\n \"Contributing a component\" covers adding one upstream.\n- `mzizi-backend`: Workers and MCP servers.\n- `discoverability`: N11 in practice, covering OG images, structured data and agent-readiness.",
213
+ "source": "mzizi-dev/agent-tools/mzizi-skills/skills/mzizi-architecture",
214
+ "files": []
33
215
  },
34
216
  {
35
217
  "name": "discoverability",
218
+ "category": "build",
36
219
  "description": "SEO + AIO for the Mzizi ecosystem: how to guarantee machines can find and render a site — social/messaging link previews (OpenGraph), search engines, and AI agents. Covers the 'if the machine can't see it, it doesn't exist' convention, the brand-agnostic Mzizi hive OG-image template (dynamic per page: title + description + site icon), build-time OG images on static Astro (the standard), the rules for a surface already on Next.js (next >= 16.3.6, no request input in an ImageResponse), APCA-checked text colours, and a pre-ship checklist. Use when a shared link shows no preview or when adding a new route/site.",
37
220
  "body_mdx": "# Discoverability — SEO + AIO for the Mzizi ecosystem\n\n> **Covenant:** _If the machine can't see it, it doesn't exist._\n\nDiscoverability is the machine-facing surface of every Mzizi-ecosystem site — the\npart crawlers, social/messaging scrapers, and AI agents read. It is **cross-cutting**,\nnot a component you install: it is a genetic-code **convention** (\"every surface ships\na title, a description, a dynamic preview image, structured data, and an\nagent-readable index\") base-paired to the components that satisfy it (the OG template,\n`llms.txt`, JSON-LD helpers). A surface a machine can't parse may as well not exist —\nand a **missing social preview is the single biggest discoverability no-go**, because\nit's the first thing a human sees when a link is shared.\n\nAll values here are the current doctrine. The source of truth is the repo:\n`mzizi-dev/mzizi-registry` for doctrine and tokens, this package for the skills, served\nread-only at <https://api.mzizi.dev/v1> and by the MCP at `https://mcp.mzizi.dev/mcp`. There is\nno database behind any of it. Brand colour specifically is `palette.canonical.json` in this\npackage: 21 families, generated and gated, never retyped.\n\n## The number-one failure: a missing OG image\n\nThe most common — and most damaging — bug is a link that unfurls with **no preview\nimage at all**. The canonical cause is metadata that points at an image file that\ndoesn't exist:\n\n```ts\n// ❌ WRONG — points at a static file that isn't in /public, so every scraper 404s\nopenGraph: { images: [\"/og-image.png\"] }\ntwitter: { images: [\"/og-image.png\"] }\n```\n\nWorse, an explicit `images` array **overrides** a framework's dynamic OG route, so\nthe good image never gets a chance. **Rule: never hardcode `openGraph.images`.** Let\nthe framework's file-convention / endpoint serve a _generated_ image, and set an\nabsolute base URL so scrapers get an absolute URL.\n\n## The Mzizi \"hive\" OG card\n\nOne template, every route, every brand. The card is:\n\n- **Deep-night ground** (`#1B1A17`) with a faint flat-top **honeycomb hex lattice**\n (white at ~5% — texture, not noise) and a few solid **mineral accent cells**\n (cobalt / gold lead, plus tanzanite / malachite / copper for warmth).\n- The **site icon on top, above the title** (brand recognition first), then the\n title, an optional eyebrow, the SEO description, and the domain.\n- **Left-aligned** (reads better than centred at thumbnail size).\n- **Brand-agnostic:** the icon is a parameter, so the same template serves nyuchi\n (the bee), mukoko (the swarm), mzizi, shamwari — each with its own mark + domain.\n It picks up the _site's own icon_, never a hardcoded one.\n\n### Colours are APCA-checked\n\nOG text is read at thumbnail size, so contrast matters. Verified against the\n`#1B1A17` ground (APCA reverse polarity; design-system floor is **Lc 75 large /\nLc 90 body**):\n\n| Role | Hex | APCA Lc | Verdict |\n| -------------------------------- | --------- | ------- | ------- |\n| Title | `#F5F5F4` | 92 | ✓ body |\n| Secondary (eyebrow, description) | `#E5E3DE` | 81 | ✓ large |\n| Domain (gold) | `#FFD740` | 76 | ✓ large |\n\nDo **not** use dim greys like `#B2AFA8` (only Lc 50) for OG text — it looks fine on a\nmonitor and vanishes in a messaging thumbnail. Re-run APCA when changing any pair.\n\n## Implementation — Astro, static (the standard)\n\nNew surfaces are static Astro: mzizi.dev (`mzizi-dev/mzizi-site`) is one. A statically built\nsite generates its OG images **at build time**:\n\n1. A build-time image endpoint, `src/pages/og/[...slug].png.ts`, with `getStaticPaths()` over\n the site's pages or content collection. Render each page's title and description with\n **satori** to SVG, then rasterise with **sharp** to PNG.\n2. In the shared layout's `<head>`, set\n `<meta property=\"og:image\" content={new URL(`/og/${slug}.png`, Astro.site)} />` per page,\n plus `twitter:card` = `summary_large_image`. Set `site` in `astro.config.mjs` so every URL is\n absolute.\n3. Use the hive design: honeycomb, the site's icon, and the brand's colour (for mzizi.dev,\n hematite, a Heritage tone; see the constellation in `mzizi-design`).\n\nKeep the site's runtime dependency-light; satori and sharp are build-only. If the site renders\nMzizi Roots components, they arrive as static HTML from `dioxus-ssr` and change nothing here.\n\n**Docs on Mintlify** (docs.mzizi.dev) get their preview images from Mintlify. Check them with a\nscraper like any other surface; do not hand-wire `og:image` there.\n\n## A surface already on Next.js (App Router)\n\nDo not start a new surface on Next.js; the standard is the static Astro build above. There is\nno Next.js reference template to copy any more: `mzizi-registry` is not a Next.js app, and its\n`next/og` template (`lib/og/`) and OG routes were removed on 2026-10-02 over a critical RCE\nexposure (GHSA-vcvr-r3jv-pc5j, `next` >= 16.2.0 < 16.3.6): a route put the URL slug into a\nNode `ImageResponse`. Build the hive card from the design above. For a surface that is already\non Next.js:\n\n- **Require `next` >= 16.3.6** (the patched line). Check the lockfile, not only the range.\n- **Never put request input into an `ImageResponse`.** No route param, slug, search param,\n header or cookie goes into the image, as text or as a path. Look the slug up in the site's\n own content and render only that entry's own title and description; an unknown slug is a\n 404 (`notFound()`), never a fallback that echoes it.\n- **Generate the images at build time.** Give each dynamic segment's `opengraph-image.tsx`\n `generateStaticParams()` over the site's own content and `export const dynamicParams = false`,\n so no OG image renders per request and an unknown path is a 404.\n- **Set `metadataBase` and never `openGraph.images` / `twitter.images`** in the layout's\n `metadata`. The `opengraph-image.tsx` file convention supplies an absolute, hashed URL, and\n the Twitter card falls back to it.\n\n## Beyond the image — the rest of the convention\n\n- **Title + meta description** on every route (unique, page-specific).\n- **Structured data**: schema.org JSON-LD for the page's primary entity.\n- **`llms.txt`** at the site root — the machine-readable index for LLMs.\n- **`robots.txt` + `sitemap.xml`** — generated, not hand-maintained.\n- **Canonical URLs** absolute (a set `metadataBase` / `site`).\n- **Agent-readiness**: an MCP discovery card at `/.well-known/mcp.json` pointing at the MCP\n endpoint (mzizi.dev ships one for `https://mcp.mzizi.dev/mcp`).\n\n## Pre-ship checklist\n\n- [ ] Sharing the URL in Slack / WhatsApp / iMessage / X renders a preview **image**.\n- [ ] The OG image is **generated** (dynamic), carries the page's title + description + the site icon, and its URL is **absolute**.\n- [ ] No hardcoded `openGraph.images` / `twitter.images`.\n- [ ] OG text colours pass APCA (Lc ≥ 75 large / ≥ 90 body).\n- [ ] `metadataBase` / `site` is set; canonical URL is absolute.\n- [ ] Title + meta description are unique per route.\n- [ ] `llms.txt`, `robots.txt`, `sitemap.xml` present; JSON-LD on primary entities.\n- [ ] Validate the card in a scraper (e.g. opengraph.xyz) after deploy.\n\n_The whole helix is Mzizi — and discoverability is the convention that makes each\nsurface legible to the machines that carry it. Ndiri nekuti tiri._",
38
- "source": "mzizi-dev/agent-tools/mzizi-skills/skills/discoverability"
221
+ "source": "mzizi-dev/agent-tools/mzizi-skills/skills/discoverability",
222
+ "files": []
39
223
  },
40
224
  {
41
225
  "name": "digital-hygiene",
42
- "description": "Disk hygiene for agents, after a temp directory filled a host with 217 GB of leftover clones: check free disk before starting and refuse to fan out below 50 GB; clone only under $TMPDIR in a named folder per task; share build caches (CARGO_TARGET_DIR, the pnpm store, the npm cache); never commit build output; on close, audit uncommitted changes, stashes and branches on no remote, map each branch to its PR state (a squash merge means 'not on a remote' proves nothing), publish or report what is left, then delete the clone; a periodic sweep that prunes node_modules, target, .astro, .wrangler, .turbo and .next older than N minutes and deletes clean clones; the safety rules (no rm -rf on an unchecked variable, never ~/GitHub or another session's folders, never staging, report what was freed); and hygiene.sh, a portable dry-run-by-default script for check, audit, prune, close and sweep.",
43
- "body_mdx": "# Digital hygiene: leave the machine as you found it\n\n> **Covenant:** _A clone is borrowed space. Give it back when the work is done._\n\nOn 2026-10-05 an agent host ran out of disk. Its temp directory held **217 GB** in about\n**930 leftover agent clones**: roughly 92 GB of `node_modules` and 14 GB of Rust `target/`.\nNo agent had removed its clone when its work closed. When the disk filled, every agent on the\nmachine stopped mid-task, including the ones doing nothing wrong. Hygiene is not tidiness. It\nis what lets the next agent run at all, and Ubuntu applies here: what one agent leaves behind,\nevery other agent pays for.\n\nThis skill has four parts: what to do **before** you start, **while** you work, **on close**,\nand in the **periodic sweep**. The safety rules apply to all of them. The script `hygiene.sh`\nin this skill folder runs the checks, the audit and the prune for you.\n\n## Get the script\n\n`hygiene.sh` is portable bash (3.2+) for macOS and Linux. Every command is a **dry run**\nunless you pass `--apply`.\n\n| Where you are | Path |\n| ------------------------------- | ------------------------------------------------------------------------------------------------------------- |\n| `@nyuchi/mzizi-skills` from npm | `node_modules/@nyuchi/mzizi-skills/skills/digital-hygiene/hygiene.sh` |\n| The public `mzizi` plugin | `skills/digital-hygiene/hygiene.sh` in the plugin |\n| Only the MCP | `curl -fsSL https://unpkg.com/@nyuchi/mzizi-skills/skills/digital-hygiene/hygiene.sh -o \"$TMPDIR/hygiene.sh\"` |\n\n```bash\nH=\"$TMPDIR/hygiene.sh\" # or one of the paths above\nbash \"$H\" check # free disk; exits 1 below 50 GB\nbash \"$H\" audit # every clone under $TMPDIR: CLEAN, KEEP or ACTIVE\nbash \"$H\" prune # regenerable build folders it would remove\nbash \"$H\" close \"$TMPDIR/<task>/<repo>\" --apply # close your own clone\nbash \"$H\" sweep --exclude \"$TMPDIR/<your-task>\" # prune + delete clean idle clones (dry run)\n```\n\nOptions: `--root DIR` (default `$HYGIENE_ROOT`, else `$TMPDIR`), `--older-than MIN` (default\n120), `--min-gb N` (default 50), `--exclude PATH` (repeatable), `--apply`. `HYGIENE_GH=none`\nturns off PR lookups. Exit codes: `0` ok, `1` low disk or a refused path, `2` a clone was kept\nbecause it holds unpublished work.\n\n## Before you start\n\n1. **Check the disk.** Run `df -h /`, or `hygiene.sh check`. **Below 50 GB free, do not fan\n out.** Don't spawn sub-agents and don't start parallel clones or builds. Run a sweep first\n (see below), or report the low disk to your supervisor. A fan-out on a nearly full disk\n fails all at once, part-way through every branch.\n2. **Clone only under `$TMPDIR`, one named folder per task.** Use a fixed, readable name, for\n example `\"$TMPDIR/digital-hygiene/agent-tools\"`. Never clone into `~/GitHub`, which holds the\n owner's working copies, and never clone into a random or nameless folder. A named folder is\n what lets you, the sweep and the next session tell whose work it is.\n\n ```bash\n mkdir -p \"$TMPDIR/<task-name>\" && git clone https://github.com/<org>/<repo>.git \"$TMPDIR/<task-name>/<repo>\"\n ```\n\n3. **Share build caches; don't multiply them.** Each clone with its own caches costs gigabytes\n in every clone.\n - **Rust:** one `CARGO_TARGET_DIR` per machine or session, for example\n `export CARGO_TARGET_DIR=\"$TMPDIR/cargo-target\"`. Every clone then reuses one compiled\n dependency tree instead of building its own `target/`.\n - **pnpm:** the content-addressed store is shared by default. Keep it that way: never pass\n `--store-dir` into the clone, and don't use `node-linker=hoisted` copies when links will\n do.\n - **npm:** the cache (`~/.npm`) is shared. Use `npm ci --prefer-offline` and don't point\n `--cache` into the clone.\n - Install only what the task needs. `pnpm install --filter <pkg>...` installs one workspace\n package; a whole monorepo install for a docs fix is waste.\n\n## While you work\n\n- **Don't commit build output.** `node_modules/`, `target/`, `dist/`, `.astro/`, `.wrangler/`,\n `.turbo/`, `.next/` and `.vercel/output/` belong in `.gitignore`. If one shows up in\n `git status`, ignore it; don't add it.\n- **Delete what you made and no longer need.** That includes scratch builds, downloaded\n tarballs and one-off test clones, as soon as they have served their purpose.\n- **Check the disk again before anything large:** a release build, a full test matrix, or a\n second fan-out.\n\n## On close: when the PR is merged or abandoned\n\nClosing a clone is an audit first and a deletion second. **Never delete a clone you have not\naudited.** The audit asks one question: is there any work here that exists nowhere else?\n\n1. **Fetch**, so you judge against the remote as it is now: `git fetch --prune origin`.\n2. **Uncommitted changes:** `git status --porcelain`. Anything listed exists only here.\n3. **Stashes:** `git stash list`. A stash is never on a remote.\n4. **Local branches whose commits are on no remote:**\n\n ```bash\n git for-each-ref --format='%(refname:short)' refs/heads | while read -r b; do\n n=$(git rev-list --count \"$b\" --not --remotes)\n [ \"$n\" -gt 0 ] && echo \"$b: $n commit(s) on no remote\"\n done\n ```\n\n5. **Map each of those branches to its PR state.** Merged or closed counts as published:\n\n ```bash\n gh pr list -R <owner>/<repo> --head <branch> --state all --json number,state,title\n ```\n\n **A squash merge makes \"not on any remote\" meaningless as proof.** Squashing writes a new\n commit on the base branch, so the branch's own commits stay local-only even though the\n work shipped. Then the remote branch is deleted, and every squash-merged branch looks\n unpublished. So check in this order:\n - Is every commit on a remote? Then it is published.\n - Is there a PR from this branch that is `MERGED` or `CLOSED`? Then it is published (merged,\n or deliberately abandoned).\n - Does every unpublished commit's subject appear on a remote branch, as is or with the\n squash suffix `(#123)` appended? Then it is published.\n - Otherwise it is **unpublished**. This includes an `OPEN` PR whose branch is behind your\n local commits.\n\n6. **Publish or report anything genuinely unpublished.** Push the branch and open a PR (into\n `staging` where the repo has one), or report it to your supervisor with the branch name,\n the commit subjects and why it was not published. Don't delete work to make a clone\n \"clean\".\n7. **Delete the clone.** Delete it only after steps 1 to 6 come back clean, and then report\n what was freed.\n\n`hygiene.sh close <clone> --apply` runs steps 1 to 5 and 7. A clone nested inside yours,\nsuch as a gitignored cache clone, is deleted with it, so it is audited too: unpublished work\nthere keeps the whole clone. It exits `2`, and deletes\nnothing, when step 6 is needed.\n\n## The periodic sweep\n\nRun a sweep when `check` fails, before a large fan-out, and at the end of a long supervisor\nsession. It has two passes, and the dry run comes first:\n\n1. **Safe prune of regenerable folders.** These are `node_modules`, `target`, `.astro`,\n `.wrangler`, `.turbo` and `.next`, removed **only when older than N minutes** (default 120),\n so an agent mid-build is not hit. A sibling manifest has to prove what each folder is:\n `Cargo.toml` (or the cargo `CACHEDIR.TAG`) for `target`, `package.json` for `.next`,\n `.turbo` and `.astro`, and a `wrangler` config for `.wrangler`. A folder named `target` that\n holds notes is not a build cache. Pruning loses nothing, because the next install or build\n recreates the folder.\n2. **Audit report of the clones, then delete the clean ones.** Each clone gets one verdict:\n - `CLEAN`: nothing unpublished, idle. Deleted with `--apply`.\n - `KEEP`: unpublished work, with the reason. Never deleted: publish it or report it.\n - `ACTIVE`: a file changed inside the window. Another session is probably using it. Leave\n it.\n\n```bash\nbash hygiene.sh sweep --exclude \"$TMPDIR/<your-task>\" # read the report\nbash hygiene.sh sweep --exclude \"$TMPDIR/<your-task>\" --apply # then act on it\n```\n\nReport the result: what was freed, how many clones were deleted, and every `KEEP` with its\nreason.\n\n## Safety rules (all of the above)\n\n- **Never `rm -rf` a path built from an unchecked variable.** If `$DIR` is empty or unset,\n `rm -rf \"$DIR/\"*` deletes from `/`. Use fixed base paths and let `find … -prune` produce the\n paths. Check every path before you delete it: it is absolute, it is inside the root, it is not\n the root itself, `/` or `$HOME`, and it is not under `~/GitHub`. Then use\n `rm -rf -- \"$path\"`. `hygiene.sh` routes every deletion through that check.\n- **Never touch `~/GitHub` working copies, or another session's active folders, without\n asking.** The owner keeps live work in `~/GitHub`. The script refuses a root or a clone\n there. An `ACTIVE` clone, or one you did not create, is someone else's until they or your\n supervisor say otherwise. Use `--exclude` for your own live task folder.\n- **Never delete `staging`,** neither the branch on the remote nor a release PR's head branch.\n A clone is deleted locally; branches on the remote are the repository's business, not the\n sweep's.\n- **Dry run first, then `--apply`.** Read what would go before anything goes.\n- **Report what was freed,** in GB, with the number of folders and clones and every clone that\n was kept and why. \"Cleaned up\" is not a report.\n\n## Checklist\n\n- [ ] `df -h /` before starting; 50 GB free or more before any fan-out.\n- [ ] Cloned under `$TMPDIR/<task-name>/`, never `~/GitHub`.\n- [ ] `CARGO_TARGET_DIR` shared; pnpm store and npm cache not redirected into the clone.\n- [ ] No build output committed.\n- [ ] On close: fetched, then checked the status, the stashes, and the branches on no remote.\n PR state looked up per branch, because of squash merges.\n- [ ] Unpublished work pushed into a PR, or reported.\n- [ ] Clone deleted, and the amount freed reported.",
44
- "source": "mzizi-dev/agent-tools/mzizi-skills/skills/digital-hygiene"
226
+ "category": "dev",
227
+ "description": "Disk hygiene for agents, after a temp directory filled a host with 217 GB of leftover clones and a cloud session's 38 GB allowance ran short: check free disk before starting and refuse to fan out below 50 GB on a shared host; in a Claude Code cloud session (CLAUDE_CODE_REMOTE=true) the disk is a per-session allowance, so df's Avail is what counts, check defaults to 25% of used + available (or a --min-gb the session sets) and each concurrent heavy build needs 10 GB free; $TMPDIR may be unset, so write \"${TMPDIR:-/tmp}/...\"; clone only into a folder unique to the agent (${TMPDIR:-/tmp}/<task>-<repo>-<short-id>) or a git worktree with an owner marker in its git dir, and never touch a folder another agent made; review PRs in a throwaway detached worktree, never as pr<N> branches in a shared clone; check git status, the branch and its upstream before every commit; share build caches (CARGO_TARGET_DIR, the pnpm store, the npm cache), and run cargo clean -p <crate> before the final verification because a shared target dir can serve a stale test binary; never commit build output; on close, audit uncommitted changes, stashes and branches on no remote, map each branch to its PR state (a squash merge means 'not on a remote' proves nothing), publish or report what is left, then delete only your own clone or git worktree remove your own worktree; a periodic sweep that prunes node_modules, target, .astro, .wrangler, .turbo and .next and orphaned tool temp folders (Vitest/Vite module copies, npm pack folders, found by their contents) older than N minutes and deletes clean clones; the safety rules (no rm -rf on an unchecked variable, never ~/GitHub, claude-* temp, browser profiles or another session's folders, never staging, report what was freed); and hygiene.sh, a portable script for check, clone, worktree, audit, prune, tmp, close and sweep: clone and worktree make the unique folder and mark it with the agent id, prune, close and sweep never touch another agent's clone or worktree without --force-owner, audit lists merged pr<N> scratch branches as safe to delete, and deletion is a dry run unless given --apply.",
228
+ "body_mdx": "# Digital hygiene: leave the machine as you found it\n\n> **Covenant:** _A clone is borrowed space. Give it back when the work is done._\n\nOn 2026-10-05 an agent host ran out of disk. Its temp directory held **217 GB** in about\n**930 leftover agent clones**: roughly 92 GB of `node_modules` and 14 GB of Rust `target/`.\nNo agent had removed its clone when its work closed. When the disk filled, every agent on the\nmachine stopped mid-task, including the ones doing nothing wrong. Hygiene is not tidiness. It\nis what lets the next agent run at all, and Ubuntu applies here: what one agent leaves behind,\nevery other agent pays for.\n\nOn 2026-10-06 the other failure happened. Several agents on one release task cloned into one\nshared, readable folder, `$TMPDIR/rel1006`, and one of them ran `git checkout` in the others'\nclones. Their working trees moved under them mid-task. A readable folder name says what the task\nis; it does not say whose clone it is. So every clone now gets a folder that is unique to the\nagent that made it, and the script refuses to touch a clone another agent owns.\n\nOn 2026-10-07, in a Claude Code cloud session with a fixed disk allowance of about 38 GB, the\ngaps were different. The 50 GB rule could never be met, so agents either ignored it or stopped.\n`$TMPDIR` was unset, so a documented `\"$TMPDIR/<task>-…\"` meant `/<task>-…` at the filesystem\nroot. `/tmp` held 4.8 GB of litter that no clone audit sees: about 600 folders of Vitest module\ncopies that test runs never removed, a 472 MB stray clone and a 572 MB Node compile cache. A\nshared `CARGO_TARGET_DIR` served a stale test binary, so 38 tests ran instead of 42 and the run\nwas a false green. Code reviews fetched PR heads as `pr<N>` branches into shared clones, and the\nsession's stop hook then flagged already-merged work as unpushed. This skill now covers cloud\nsessions, worktrees, tool temp litter, the shared-target hazard and scratch review branches.\n\nThis skill has four parts: what to do **before** you start, **while** you work, **on close**,\nand in the **periodic sweep**. The safety rules apply to all of them. The script `hygiene.sh`\nin this skill folder runs the checks, the audit and the prune for you.\n\n## Get the script\n\n`hygiene.sh` is portable bash (3.2+) for macOS and Linux. Every command that deletes (`prune`,\n`tmp`, `close`, `sweep`) is a **dry run** unless you pass `--apply`; `close` and `sweep` still\nfetch first.\n`clone` and `worktree` always write: they make a clone or a worktree. `check` and `audit` only\nread.\n\n| Where you are | Path |\n| ------------------------------- | --------------------------------------------------------------------------------------------------------------------- |\n| `@nyuchi/mzizi-skills` from npm | `node_modules/@nyuchi/mzizi-skills/skills/digital-hygiene/hygiene.sh` |\n| The public `mzizi` plugin | `skills/digital-hygiene/hygiene.sh` in the plugin |\n| Only the MCP | `curl -fsSL https://unpkg.com/@nyuchi/mzizi-skills/skills/digital-hygiene/hygiene.sh -o \"${TMPDIR:-/tmp}/hygiene.sh\"` |\n\n```bash\nH=\"${TMPDIR:-/tmp}/hygiene.sh\" # or one of the paths above\nexport HYGIENE_AGENT_ID=\"$(od -An -N3 -tx1 /dev/urandom | tr -d ' \\n')\" # once per agent\nexport HYGIENE_ROOT=\"${TMPDIR:-/tmp}\" # name the root: --apply refuses a shared fallback root\nbash \"$H\" check # free disk; exits 1 below 50 GB (cloud: 25% of the allowance)\nD=\"$(bash \"$H\" clone <org>/<repo> --task <task>)\" # ${TMPDIR:-/tmp}/<task>-<repo>-<agent-id>\nW=\"$(bash \"$H\" worktree <clone> --task <task> --branch <b>)\" # or a worktree: …-<agent-id>-wt-<b>\n# (of your own marked clone; of a session's unmarked base clone with --shared)\nbash \"$H\" audit # every clone and worktree: CLEAN, KEEP or ACTIVE, with its owner\nbash \"$H\" prune # regenerable build folders it would remove\nbash \"$H\" tmp # orphaned tool temp folders in ${TMPDIR:-/tmp} it would remove\nbash \"$H\" close \"$D\" --apply # close your own clone (or worktree: git worktree remove)\nbash \"$H\" sweep --exclude \"$D\" # prune + tmp + delete clean idle clones (dry run)\n```\n\nOptions: `--root DIR` (default `$HYGIENE_ROOT`, else `$TMPDIR`, else `/tmp`; a deleting command\nrefuses that fallback unless only you can write in it, so name it), `--tmp DIR` (for\n`tmp`; default `$TMPDIR`, else `/tmp`), `--agent ID` (default `$HYGIENE_AGENT_ID`), `--task NAME`\nand `--branch B` (for `clone` and `worktree`), `--from REF` (where a new worktree branch or a\ndetached worktree starts), `--force-new` and `--shared` (see \"Worktrees\"), `--older-than MIN`\n(default 120),\n`--min-gb N` or `--min-pct P` (for `check`), `--exclude PATH` (repeatable), `--force-owner`,\n`--apply`. `clone` and `worktree` create a missing root with `mkdir -p` (the root only, never a\ntask folder), after the same checks as an existing root. PR lookups use `gh api` only, so Claude\nCode's built-in `gh` in a cloud session works; `HYGIENE_GH=none` turns them off. Exit codes: `0`\nok, `1` low disk, a refused path or a clone another agent owns (and from `close`, a clone left in\nplace only because a worktree of it, or of a clone inside it, is still checked out: close that\nworktree first), `2` a clone was kept because it holds unpublished work.\n\n**`$TMPDIR` can be unset**, as it is in a Claude Code cloud session. Then `\"$TMPDIR/x\"` is\n`/x`, at the filesystem root. Every command in this skill writes `\"${TMPDIR:-/tmp}\"`; write it\nthat way in your own commands too. `hygiene.sh` falls back to `/tmp` by itself, and `check`\nwarns when `$TMPDIR` is unset.\n\n## Cloud sessions (Claude Code on the web)\n\nA cloud session runs on a VM that Anthropic hosts, one per session, and the VM goes away when\nthe session ends. Nothing you leave there outlives the session. The risk is different: you fill\n**your own allowance** part-way through the work, and every agent in the session stops.\n\n- **How to tell.** Claude Code sets `CLAUDE_CODE_REMOTE=true` in a cloud session, and it is never\n `true` locally ([environment variables](https://code.claude.com/docs/en/env-vars)). The\n `CLAUDE_CODE_REMOTE_SESSION_ID` variable names the session. A Remote Control session is a local\n session that you steer from another device: it runs on your machine and follows the local\n rules.\n\n ```bash\n [ \"${CLAUDE_CODE_REMOTE:-}\" = true ] && echo \"cloud session\"\n ```\n\n- **The disk is a per-session allowance, so `df`'s \"Avail\" is what counts.** The filesystem is\n the host's. On 2026-10-07 `df -h /` showed a size of 252G with 29G used and 8.9G available,\n and the 252G meant nothing to the session. Used plus available, about 38 GB there, is the\n session's allowance. Anthropic documents about 30 GB of disk for hosted environments\n ([resource limits](https://code.claude.com/docs/en/cloud-environments#resource-limits)), so\n measure it; don't assume it.\n- **Thresholds.** The 50 GB rule can never be met in a cloud session. When\n `CLAUDE_CODE_REMOTE=true`, `hygiene.sh check` uses **25% of used + available** by default\n (about 9.5 GB of a 38 GB allowance), or the `--min-gb N` the session sets. It prints the\n allowance and how many heavy builds fit.\n- **Fan-out.** Allow **10 GB free for each concurrent heavy build**, such as a pnpm install\n with a build or test run, or a cargo build, **on top of the threshold**: the threshold is the\n floor the session keeps free, so builds may not spend it. `check` prints the room as\n (free − threshold) / 10 GB, rounded down. With 22 GB free over a 9.5 GB threshold, run one\n heavy build at a time; with room for 0, sweep first or run nothing heavy beside what runs.\n Agents that only read, review or write docs need no build budget. Check again before each\n wave of sub-agents, not only at the start.\n- **Where clones and worktrees go.** The session's repositories are usually cloned already (for\n example under `/workspace`). Make a `git worktree` of that clone per branch instead of a\n second clone: it shares the object store, so a worktree costs only its checkout. Keep every\n worktree, and any extra clone, under one root next to the clones and on the same disk:\n `export HYGIENE_ROOT=/workspace/wt`. Then `hygiene.sh worktree`, `clone`, `audit` and\n `sweep` all use it. The session's base clone has no owner marker, so add worktrees to it with\n `hygiene.sh worktree /workspace/<repo> --shared …`. The folder need not exist: `worktree` and `clone` create the root itself\n (`mkdir -p`, the root only), and `audit`, `prune` and `sweep` report a missing root as an\n error. By hand, `mkdir -p \"$HYGIENE_ROOT\"` once. Don't put clones in `/tmp`. Tools litter `/tmp`, and Claude Code keeps the\n session's own scratch there (`/tmp/claude-*`), which you must never touch.\n- **Give space back as you go.** Once your PR is open and CI is green, delete that worktree's\n `node_modules` (`hygiene.sh prune`, or by hand), which a reinstall regenerates. Run\n `hygiene.sh tmp` after test runs. If the allowance runs out anyway, free what you created\n first, then commit and push, and report that the session's disk is spent. A new session\n starts on a fresh machine.\n\n## Before you start\n\n1. **Check the disk.** Run `df -h /`, or `hygiene.sh check`. **On a shared host, do not fan out\n below 50 GB free.** In a cloud session, `check`'s threshold is 25% of the session's\n allowance, and you need 10 GB free above it per concurrent heavy build (see \"Cloud sessions\"). Below\n the threshold, don't spawn sub-agents and don't start parallel clones or builds. Run a sweep\n first (see below), or report the low disk to your supervisor. A fan-out on a nearly full\n disk fails all at once, part-way through every branch.\n2. **Clone only into a folder unique to you: `${TMPDIR:-/tmp}/<task>-<repo>-<short-id>`**, or a\n worktree (see \"Worktrees\" below). The\n short id is unique per agent, for example six random hex characters\n (`od -An -N3 -tx1 /dev/urandom | tr -d ' \\n'`). Set it once as `HYGIENE_AGENT_ID` and use\n it for every clone you make. Never clone into `~/GitHub`, which holds the owner's working\n copies. `hygiene.sh clone` does all of this: it creates the folder (and refuses one that\n already exists), clones into it, writes your agent id into `<clone>/.git/hygiene-owner` (inside\n `.git`, so `git clean -fdx` cannot remove it), and prints the path.\n\n ```bash\n D=\"$(bash \"$H\" clone <org>/<repo> --task <task-name>)\" # or by hand:\n D=\"${TMPDIR:-/tmp}/<task-name>-<repo>-$HYGIENE_AGENT_ID\"\n mkdir \"$D\" && git clone https://github.com/<org>/<repo>.git \"$D\" # mkdir, not mkdir -p\n printf '%s\\n' \"$HYGIENE_AGENT_ID\" >\"$D/.git/hygiene-owner\" # the marker: never skip it\n ```\n\n A clone with no marker has no owner the script can see, so another agent's sweep may\n delete it once it is clean and idle. A `git worktree` of your clone is owned by your clone's\n marker, unless it has its own marker in its git dir (`hygiene.sh worktree` writes one).\n - **Never cd into, check out, fetch into or modify a folder you did not create,** however\n its name reads and whoever's task it seems to be. A shared parent folder is fine\n (`${TMPDIR:-/tmp}/rel1006/` holding one clone per agent); a shared clone is not. If you need\n another agent's work, fetch its pushed branch into your own clone.\n - `mkdir` without `-p` is the claim: it fails when the folder exists, so you notice instead\n of moving into someone else's clone.\n\n3. **Share build caches; don't multiply them.** Each clone with its own caches costs gigabytes\n in every clone.\n - **Rust:** one `CARGO_TARGET_DIR` per machine or session, for example\n `export CARGO_TARGET_DIR=\"${TMPDIR:-/tmp}/cargo-target\"`. Every clone then reuses one\n compiled dependency tree instead of building its own `target/`.\n\n **The hazard: a shared target dir can run a stale test binary.** Cargo names a workspace\n crate's artifacts with a hash that leaves out where the workspace is on disk, so worktrees\n of one repository on different branches build to the same files. Its freshness check\n compares file times, so a binary that another worktree built from other source can look up\n to date. On 2026-10-07 an agent saw 38 tests run\n instead of 42, a false green, until `cargo clean -p <crate>`. So:\n - **Before the final verification run** of a crate you changed, run\n `cargo clean -p <crate>` (it removes only that crate's artifacts, and the dependency tree\n stays shared), then build and test. Check that the test count matches the tests you\n expect.\n - Or give a crate you edit its own target for the task:\n `CARGO_TARGET_DIR=\"$PWD/target\" cargo test -p <crate>`. Use the shared target for\n dependencies and for crates you only read. Prune the private `target/` when you close.\n\n - **pnpm:** the content-addressed store is shared by default. Keep it that way: never pass\n `--store-dir` into the clone, and don't use `node-linker=hoisted` copies when links will\n do.\n - **npm:** the cache (`~/.npm`) is shared. Use `npm ci --prefer-offline` and don't point\n `--cache` into the clone.\n - Install only what the task needs. `pnpm install --filter <pkg>...` installs one workspace\n package; a whole monorepo install for a docs fix is waste.\n\n### Worktrees: a first-class alternative to a clone\n\nA `git worktree` is a second checkout of a clone you already have. It shares the clone's object\nstore, so it costs only the checked-out files, and it is the right default when the repository\nis already on disk (a cloud session's `/workspace/<repo>`, or your own clone). The rules for\nclones apply to worktrees, plus three of their own:\n\n1. **Make it with an owner marker.** `hygiene.sh worktree <clone> --task <task> --branch <b>`\n claims `$HYGIENE_ROOT/<task>-<repo>-<agent-id>-wt-<b>` (`mkdir`, as for a clone; `/` in the\n branch becomes `-`, and a detached worktree ends in `-wt-<short sha>`). The `-wt-` suffix keeps\n it apart from your own clone for the same task. It adds the worktree, writes your agent id to\n its own git dir (`<clone>/.git/worktrees/<name>/hygiene-owner`), and prints the path.\n - `--branch <b>` checks out the local `<b>` when it exists. Otherwise, when `origin/<b>`\n exists, it creates `<b>` from `origin/<b>` and tracks it. Otherwise it creates `<b>` from\n `--from REF` (default: the clone's HEAD). Without `--branch` the worktree is detached at\n `--from` (or HEAD).\n - `--from` is never ignored. With a local `<b>`, the script refuses it, so drop `--from` or\n pick a new branch. With `origin/<b>` at another commit, it refuses too, unless you pass\n `--force-new`, which starts a new `<b>` from `--from` that tracks nothing.\n - Beside the marker it records the branch it created (close deletes it once it is\n published) and the commit the worktree started from (`hygiene-from`, marked `remote` when\n that commit was on the remote at that moment, for example a PR head just fetched into\n `FETCH_HEAD`).\n - If `git worktree add` fails part-way, or the marker cannot be written, the script runs\n `git worktree remove --force`, removes the folder and deletes the branch it created, then\n exits 1. It never leaves a registered worktree without a marker.\n\n By hand:\n\n ```bash\n W=\"$HYGIENE_ROOT/<task>-<repo>-$HYGIENE_AGENT_ID-wt-<branch>\"\n mkdir \"$W\" && git -C <clone> worktree add -b <branch> \"$W\" origin/staging\n printf '%s\\n' \"$HYGIENE_AGENT_ID\" >\"$(git -C \"$W\" rev-parse --absolute-git-dir)/hygiene-owner\"\n ```\n\n2. **Only from a clone that is yours or the session's.** Adding a worktree writes into the\n clone's `.git`, and closing it later runs `git worktree remove` and `git branch -D` there, so\n the clone passes the same checks as anything the script deletes under. The script refuses a\n clone under `~/GitHub` or on an `--exclude` path, a clone whose git data is there (it resolves\n the real git dir first), a clone whose marker names another agent, and a clone with no marker\n at all. A session's unmarked base clone (`/workspace/<repo>`) is\n shared by the session's agents: pass `--shared` to add worktrees to it, but never check out,\n commit in or fetch PR heads into the base checkout itself. `--shared` never lifts the other\n refusals.\n3. **Close it with `git worktree remove`, never `rm -rf`.** `rm -rf` leaves the worktree's\n entry under `<clone>/.git/worktrees/`, and its branch stays \"checked out\" there until\n `git worktree prune`. `hygiene.sh close <worktree> --apply` audits only what the worktree holds,\n which is its uncommitted changes and its checked-out branch. Stashes and the clone's other\n branches stay with the clone. If the audit is clean, the script runs\n `git worktree remove` and then deletes the branch it created. By hand:\n `git -C <clone> worktree remove <path>`, and `git -C <clone> worktree prune` after an\n accidental `rm`. A clone that still has worktrees checked out is `KEEP` in an audit, because\n deleting it would cut them off from their git data. `close` leaves it in place and exits `1`,\n not `2`, since nothing in it is unpublished. It names each worktree holding the clone, with\n its owner and whether it is locked: close your own worktrees first, and report one that is\n locked or another agent's instead of unlocking or removing it. A worktree that\n `git worktree remove` would refuse without `--force` (locked, holding a submodule, or with\n modified or untracked files) is never removed, and the dry run says so too.\n\n Before every git write (the fetch, `git worktree add` and `remove`, `git branch -D`) the\n script resolves the checkout's real git dir and common git dir and refuses `/`, your home and\n anything under `~/GitHub`. A worktree of a clone under `~/GitHub`, or a `--separate-git-dir`\n checkout whose git dir is there, is never fetched into, removed or deleted. An `--exclude`\n path also refuses writes to a clone's refs and config (the fetch, `git branch -D`), but not\n to a worktree's own entry under `<clone>/.git/worktrees/`: `sweep --exclude <your clone>`\n still removes that clone's finished worktrees, and keeps the branches they were on.\n\n## While you work\n\n- **Don't commit build output.** `node_modules/`, `target/`, `dist/`, `.astro/`, `.wrangler/`,\n `.turbo/`, `.next/` and `.vercel/output/` belong in `.gitignore`. If one shows up in\n `git status`, ignore it; don't add it.\n- **Delete what you made and no longer need.** That includes scratch builds, downloaded\n tarballs and one-off test clones, as soon as they have served their purpose.\n- **Check the disk again before anything large:** a release build, a full test matrix, or a\n second fan-out.\n- **Before every commit, check where you are.** Run `git status` and\n `git branch --show-current`, and confirm HEAD sits on your branch's upstream:\n\n ```bash\n git status && git branch --show-current\n git rev-parse --abbrev-ref '@{u}' # the upstream you expect, e.g. origin/feat/x\n git log --oneline '@{u}..HEAD' # only your own unpushed commits\n git log --oneline 'HEAD..@{u}' # empty, or pull first\n ```\n\n A branch you did not check out, a different upstream, or commits you did not write mean\n something else moved this clone. Stop and report it; don't commit on top.\n\n- **Review a PR in a throwaway worktree, never as a branch in a shared clone.** For a code\n review, `git fetch origin pull/<N>/head:pr<N>` in a shared clone leaves a `pr<N>` branch\n whose commits are on no remote branch. Stop hooks and audits then flag it as unpushed work\n long after the PR merged. Fetch the head without a branch, and check it out detached in a\n worktree of your own:\n\n ```bash\n git -C <clone> fetch origin \"pull/<N>/head\"\n R=\"$(bash \"$H\" worktree <clone> --task review-pr<N> --from FETCH_HEAD)\" # detached\n # ... review, build, test ...\n bash \"$H\" close \"$R\" --apply # git worktree remove\n ```\n\n `close` fetches first, which overwrites `FETCH_HEAD`, and each worktree keeps its own\n `FETCH_HEAD` in its git dir. So the script judges a review worktree by the commit it recorded\n at creation: published when it was fetched from the remote, or when its PR is merged or closed\n (a squash-merged or fork PR's head is on no remote branch), or while it is an open PR's head.\n\n `hygiene.sh audit` lists a `pr<N>` scratch branch (also `pr-<N>`, `pr/<N>` and\n `review/pr<N>`) as **safe to delete** when PR #N is merged or closed and the branch has nothing\n beyond the PR's head. It prints the `git branch -D` to run. A scratch branch with commits beyond\n the head is unpublished work, and the audit keeps it.\n\n- **Test runners leave temp folders.** Vitest 5.0.0 to 5.0.2 leave one folder per run in\n `${TMPDIR:-/tmp}`, and so does Vitest 4.x as Vite+ (`vite-plus`) runs it. It has a random 21-character name, holds only `client/` and `ssr/` module\n copies, and is 25 to 57 MB per run. Use Vitest 5.0.3 or later (Vite+ 1.1.0 or later), and run\n `hygiene.sh tmp` after a session of test runs: it finds the folders by their contents, whatever\n the version.\n\n## On close: when the PR is merged or abandoned\n\nClosing a clone is an audit first and a deletion second. **Never delete a clone you have not\naudited.** The audit asks one question: is there any work here that exists nowhere else?\n\n1. **Fetch**, so you judge against the remote as it is now: `git fetch --prune origin`. Even\n then, a remote-tracking ref is the clone's memory of the remote, not the remote: it outlives\n a branch deleted upstream whenever a fetch fails or never ran. Ask the remote itself\n (`git ls-remote origin`); a remote you cannot reach vouches for nothing.\n2. **Uncommitted changes:** `git status --porcelain --untracked-files=all --ignore-submodules=none`.\n Anything listed exists only here. Pass both options: `status.showUntrackedFiles=no` would hide\n untracked files, and `submodule.<name>.ignore` would hide a submodule moved off its commit.\n Status cannot see two more kinds of work: an edit to a file marked `--assume-unchanged` or\n `--skip-worktree` (`git ls-files -v`: a lowercase tag, or `S`), and **ignored files**\n (`git status --ignored`). An ignored `.env` or a folder of notes kept out of git is work;\n only build output (`node_modules`, `target`, `dist` and the like) is not.\n3. **Stashes:** `git stash list`. A stash is never on a remote.\n4. **Local refs whose commits are on no remote** — branches, and also tags, notes and\n remote-tracking refs (one whose branch was deleted upstream may be the only copy):\n\n ```bash\n git ls-remote origin | cut -f1 | sort -u | sed 's/^/^/' >/tmp/on-remote # what origin has now\n git for-each-ref --format='%(refname)' | while read -r r; do\n n=$(git rev-list --count --stdin \"$r\" </tmp/on-remote 2>/dev/null) || n=?\n [ \"$n\" = 0 ] || echo \"$r: $n commit(s) on no remote\"\n done\n ```\n\n (A commit the remote has that you have not fetched is not named here; `--stdin` skips\n nothing, so fetch first. A commit in `FETCH_HEAD` counts only when it came from the\n remote's own URL: `git fetch . <branch>` writes one too.)\n\n5. **Map each of those branches to its PR state.** Merged or closed counts as published:\n\n ```bash\n gh pr list -R <owner>/<repo> --head <branch> --state all --json number,state,title\n ```\n\n `hygiene.sh` asks `gh api repos/<owner>/<repo>/pulls?head=<owner>:<branch>`. That never finds\n a PR from a fork, so it then asks for the PRs associated with the branch's tip commit\n (`commits/<sha>/pulls`), and then scans the latest 100 PRs for one whose head ref is the\n branch and whose head commit is the tip or behind it. A tip that is an open PR's head is\n pushed, even when no remote-tracking ref has it.\n\n **A squash merge makes \"not on any remote\" meaningless as proof.** Squashing writes a new\n commit on the base branch, so the branch's own commits stay local-only even though the\n work shipped. Then the remote branch is deleted, and every squash-merged branch looks\n unpublished. So check in this order:\n - Is every commit on a remote? Then it is published.\n - Is there a PR from this branch that is `MERGED` or `CLOSED`, **and is the branch's tip that\n PR's head, or behind it**? Then it is published (merged, or deliberately abandoned). A\n commit made after the PR's head is not in the PR, whatever its state.\n - Is every unpublished commit already on a remote as **the same change**\n (`git patch-id --stable`, as `git cherry` compares; a rebase or a one-commit squash keeps\n the change)? Then it is published. A matching commit subject proves nothing: two\n different changes can carry one subject.\n - Otherwise it is **unpublished**. This includes an `OPEN` PR whose branch is behind your\n local commits.\n\n6. **Publish or report anything genuinely unpublished.** Push the branch and open a PR (into\n `staging` where the repo has one), or report it to your supervisor with the branch name,\n the commit subjects and why it was not published. Don't delete work to make a clone\n \"clean\".\n7. **Delete the clone, and only your own.** Delete it only after steps 1 to 6 come back\n clean, and then report what was freed. Never delete another agent's folder, even an empty\n one, even in a shared parent.\n\n`hygiene.sh close <clone> --apply` runs steps 1 to 5 and 7. It refuses, before it fetches or\nreads anything, a clone whose `.git/hygiene-owner` names another agent, or any marked clone when\nyou have given no agent id. A clone nested inside yours,\nsuch as a gitignored cache clone, is deleted with it, so it is audited too: unpublished work\nthere keeps the whole clone. It exits `2`, and deletes\nnothing, when step 6 is needed. A clone kept only because a worktree of it, or of a clone nested\nin it, is still checked out is not step 6: `close` exits `1` and says to close that worktree\nfirst. A submodule belongs to its parent, whatever the shape of its `.git` (a file pointing\ninto the parent's `.git/modules/`, or a folder, when `git submodule add` adopted a repository\nthat was already there). The script asks the parent: git's superproject, or a gitlink or\n`.gitmodules` path for it. It is audited as part of the parent, and `close` refuses it on its\nown.\n\n**Nothing goes with a folder unless everything in it may go.** Before a clone is deleted\n(`rm -rf`) or a worktree removed (`git worktree remove`, which also deletes everything inside\nit), the script finds every `.git` entry inside it, in gitignored folders, `node_modules` and\n`target` too, and gates each checkout the same way. Git has to read it as its own repository,\nits git dir has to be inside the folder, it may not be locked, and its own audit has to be clean\nand idle. A worktree of a clone outside the folder, such as a cache holding a\n`git worktree add` of `~/GitHub/live`, is never deleted with it: `git worktree remove` it\nagainst its own clone first, or report it. Another agent's clone inside it holds it the same\nway (`close` exits `1`: report it). Any refusal keeps the whole folder, with a reason that names\nthe checkout inside.\n\n- **A `.git` git does not read as its own** (a `.git` folder that lost its `HEAD`, a git dir that\n is gone) is kept for a human. Git skips such a folder and answers for the repository around\n it, so the script checks that the git dir git resolves is the checkout's own and that the\n checkout is its top level. `close` audits it and exits `2`, as `sweep` does.\n- **Git dirs not named `.git`** are gated too: a bare repository or mirror (`foo.git/`) and a\n deinit'd submodule's `.git/modules/<name>`. One goes only when it has no stash and every\n commit any of its refs or `HEAD` reaches is named by a remote it can reach (`git ls-remote`),\n never by its own remote-tracking refs. One with no reachable remote and any commit is kept:\n delete it by hand once you know it holds nothing of yours.\n- **A checkout found inside another runs nothing its config names.** A package that ships a\n `.git` in `node_modules`, a cache clone or a bare mirror has config anyone could have written,\n and `git ls-remote`, `git fetch` or even `git status` with it can run a command (an `ext::`\n remote URL, `core.sshCommand`, `remote.<name>.uploadpack`, `core.fsmonitor`, a filter). So the\n script never fetches into one, and asks its remotes only by URL (https or ssh, from an empty\n repository with every other protocol off), alongside what the clone around it was told by its\n own remotes. Any config key outside a short list of inert ones (`core.*` basics,\n `remote.*.url`/`fetch`, `branch.*`, `submodule.*.url`, …) keeps it unread, as `KEEP`\n (\"untrusted git config\"). Every git the script runs has `core.fsmonitor`, hooks, signature\n checks, the `ext`/`fd` transports and lazy fetches switched off, and no git runs on a scanned\n checkout at all until its config (and any `commondir`, which is followed, or refused for a\n bare git dir) has passed; a `core.worktree` pointing outside it or an\n `objects/info/alternates` keeps it. A `commondir` and a `.git` gitfile are\n read exactly as git reads them (the whole file, only a trailing `\\n`/`\\r`\n stripped); one with an embedded newline or CR, a NUL, or a byte outside\n printable ASCII is refused rather than parsed two ways, and a malformed\n `.git` file keeps its folder instead of being skipped. A registered submodule of your own clone is trusted while\n its config is inert.\n- **The dry run counts each byte once.** A sweep measures every checkout once before anything\n goes, and a checkout inside another is not counted again with the folder around it. The total\n is shown in exact KB, and it is what `--apply` frees.\n\n## The periodic sweep\n\nRun a sweep when `check` fails, before a large fan-out, and at the end of a long supervisor\nsession. It has three passes, and the dry run comes first:\n\n1. **Safe prune of regenerable folders.** These are `node_modules`, `target`, `.astro`,\n `.wrangler`, `.turbo` and `.next`, removed **only when older than N minutes** (default 120),\n so an agent mid-build is not hit. A sibling manifest has to prove what each folder is:\n `Cargo.toml` (or the cargo `CACHEDIR.TAG`) for `target`, `package.json` for `.next`,\n `.turbo` and `.astro`, and a `wrangler` config for `.wrangler`. A folder named `target` that\n holds notes is not a build cache. Pruning loses nothing, because the next install or build\n recreates the folder. A folder with a git checkout inside it (a `.git` anywhere in it) is\n skipped, since its checkout is not regenerable.\n2. **Orphaned tool temp folders** (`hygiene.sh tmp`, also run on its own) in `${TMPDIR:-/tmp}`\n (or `--tmp DIR`). A folder there is judged by its contents, not only its name, and only\n folders directly in the temp directory, owned by you and untouched for N minutes, are\n candidates:\n - **Vitest/Vite module copies:** a random name (16 to 32 letters, digits, `_` or `-`) holding\n only `client/` and/or `ssr/`. Each of those holds only files named by a 40-hex hash, and\n the files are Vite SSR module code.\n - **npm pack leftovers:** a `tmp.*` folder (from `mktemp -d`) holding only `*.tgz` files\n and/or an unpacked `package/` with a `package.json`.\n\n It never touches `claude-*` (Claude Code's temp and the session's scratchpad), browser\n profiles (`.org.chromium.*`, `*chrom*`, `puppeteer*`, `playwright*`, `*profile*`), symlinks,\n another user's folders, a folder with a git checkout inside it, or an `--exclude` path. It\n reports `node-compile-cache` (Node's\n shared compile cache) with its size and never removes it; delete it by hand when no `node`\n process runs. A stray clone in `/tmp` is a clone: `hygiene.sh audit --root /tmp` finds it.\n\n3. **Audit report of the clones and worktrees, then delete the clean ones.** Each gets one\n verdict:\n - `CLEAN`: nothing unpublished, idle. Deleted with `--apply`.\n - `KEEP`: unpublished work, with the reason. Never deleted: publish it or report it.\n - `ACTIVE`: a file changed inside the window. Another session is probably using it. Leave\n it.\n - `OTHER`: its `.git/hygiene-owner` names another agent. Not audited, not pruned, not deleted.\n\nThe sweep judges worktrees before clones. Removing a clean worktree frees its clone, which is\nthen judged without it (in a dry run, as if it were gone), so a clone is never reported as kept\nonly because the sweep had not reached its worktree yet. A clone held only by a worktree that is\nstill in use (active, or another agent's) is left in place and reported, but it is not counted\nas kept and does not make the sweep exit `2`. The dry run predicts `--apply` exactly: a worktree\nthat `git worktree remove` would refuse (locked, holding a submodule) is not counted as removed,\nso the clone it holds is not reported as deletable either. A submodule is never listed on its\nown; it goes only with its parent.\n\nA worktree is deleted with `git worktree remove`, never `rm -rf`. Prune, close and sweep leave\na clone or worktree another agent owns alone. A supervisor clearing up after\nagents that have finished passes `--force-owner`, which still deletes only `CLEAN`, idle\nclones and is still a dry run without `--apply`. A clone with no marker (made by hand, or\nbefore markers) is judged as before.\n\n```bash\nbash hygiene.sh sweep --exclude \"${TMPDIR:-/tmp}/<your-task>\" # read the report\nbash hygiene.sh sweep --exclude \"${TMPDIR:-/tmp}/<your-task>\" --apply # then act on it\n```\n\nReport the result: what was freed, how many clones were deleted, and every `KEEP` with its\nreason.\n\n## Safety rules (all of the above)\n\n- **Never `rm -rf` a path built from an unchecked variable.** If `$DIR` is empty or unset,\n `rm -rf \"$DIR/\"*` deletes from `/`. Use fixed base paths and let `find … -prune` produce the\n paths. Check every path before you delete it: it is absolute, it is inside the root, it is not\n the root itself, `/` or `$HOME`, and it is not under `~/GitHub`. Then use\n `rm -rf -- \"$path\"`. `hygiene.sh` routes every deletion through that check.\n- **Never touch `~/GitHub` working copies, `claude-*` temp folders, browser profiles, or another\n agent's folders.** The owner keeps live\n work in `~/GitHub`. The script refuses a root or a clone there. A clone you did not create\n is someone else's until they or your supervisor say otherwise: never cd into it, check it\n out, fetch into it, build in it or delete it. The script refuses a clone whose\n `.git/hygiene-owner` is not yours unless you pass `--force-owner`. Use `--exclude` for your own\n live clone.\n- **Never delete `staging`,** neither the branch on the remote nor a release PR's head branch.\n A clone is deleted locally; branches on the remote are the repository's business, not the\n sweep's.\n- **Delete only under a root you named, and never through a symlink.** In a temp folder other\n users can write in (`/tmp`, and often `$TMPDIR`), a path checked now and deleted later can be\n redirected: another user swaps a folder for a symlink in between. So `prune`, `close` and\n `sweep` with `--apply` refuse the fallback root unless it is a folder only you can write in;\n set `HYGIENE_ROOT` (or pass `--root`) to the folder your clones live in, which in a cloud\n session is `export HYGIENE_ROOT=\"${TMPDIR:-/tmp}\"`. Every deletion checks that each folder\n from the root down is a real folder you own, not a symlink, then deletes from inside the\n parent it entered with `cd -P` (agent-tools#279).\n- **Run nothing a repository's config names.** In a root other users can write in, a checkout\n is trusted only when `clone` or `worktree` marked it (`hygiene-owner`) and the marker, the\n checkout and its git dir are yours and writable by nobody else; anyone can plant a repository\n there, marker included. Trusted or not, no git runs in a checkout until every key in its\n config is inert (no `credential.helper`, `uploadpack`, `sshCommand`, `hooksPath` or filter)\n and its `hooks/` holds nothing but git's `*.sample` files: a checkout that fails is kept for\n a human. The remote calls reset\n `credential.helper` to your own helpers and turn the file transport off; set\n `HYGIENE_FILE_REMOTES=1` only for a local mirror you trust (agent-tools#279).\n- **Dry run first, then `--apply`.** Read what would go before anything goes.\n- **Report what was freed,** in GB, with the number of folders and clones and every clone that\n was kept and why. \"Cleaned up\" is not a report.\n\n## Checklist\n\n- [ ] `df -h /` before starting. On a shared host, 50 GB free or more before any fan-out. In a\n cloud session (`CLAUDE_CODE_REMOTE=true`), `hygiene.sh check` passes, and you have 10 GB\n free above its threshold per concurrent heavy build.\n- [ ] Every path is written `\"${TMPDIR:-/tmp}/…\"`, never a bare `\"$TMPDIR/…\"`.\n- [ ] Cloned into `${TMPDIR:-/tmp}/<task>-<repo>-<short-id>` (`hygiene.sh clone`), or a marked\n worktree (`hygiene.sh worktree`; in a cloud session under `HYGIENE_ROOT`), unique to you;\n never `~/GitHub`, never a folder another agent made.\n- [ ] PR reviews in a throwaway detached worktree, not `pr<N>` branches in a shared clone.\n- [ ] `cargo clean -p <crate>` before the final test run of a crate you changed, when\n `CARGO_TARGET_DIR` is shared.\n- [ ] `git status`, `git branch --show-current` and the upstream checked before every commit.\n- [ ] `CARGO_TARGET_DIR` shared; pnpm store and npm cache not redirected into the clone.\n- [ ] No build output committed.\n- [ ] On close: fetched, then checked the status, the stashes, and the branches on no remote.\n PR state looked up per branch, because of squash merges.\n- [ ] Unpublished work pushed into a PR, or reported.\n- [ ] Your own clone deleted, or your worktree removed with `git worktree remove`, nobody\n else's, and the amount freed reported.\n- [ ] `hygiene.sh tmp` run after test runs; orphaned tool temp folders removed.",
229
+ "source": "mzizi-dev/agent-tools/mzizi-skills/skills/digital-hygiene",
230
+ "files": [
231
+ {
232
+ "path": "hygiene.sh",
233
+ "mimeType": "text/x-shellscript",
234
+ "bytes": 117174,
235
+ "encoding": "utf8",
236
+ "content": "#!/usr/bin/env bash\n# hygiene.sh — disk hygiene for agent clones (the Mzizi `digital-hygiene` skill).\n#\n# Portable bash (3.2+, macOS and Linux). clone and worktree always write:\n# they make a clone or a worktree (and worktree writes into CLONE's .git).\n# prune, tmp, close and sweep are a DRY RUN unless you pass --apply (close\n# and sweep still fetch first, which writes only a clone's remote-tracking\n# refs and FETCH_HEAD). check and audit only read. What counts as published\n# is asked of each remote (git ls-remote), never read off remote-tracking\n# refs, so a remote that cannot be reached vouches for nothing. Nothing is deleted outside --root,\n# nothing under ~/GitHub is deleted or written to, nothing another agent owns\n# is touched, and nothing is deleted that has not passed the checks below.\n# No git it runs on a checkout found inside another (a package's .git, a\n# cache clone, a mirror) uses that checkout's config to fetch, ask a remote\n# or run a command (see \"trust\" below).\n#\n# hygiene.sh check [--min-gb N | --min-pct P] [--path P]\n# free disk; exit 1 below the threshold\n# (50 GB; in a cloud session 25% of the\n# session's allowance)\n# hygiene.sh clone REPO --task NAME [--branch B]\n# clone into $ROOT/<task>-<repo>-<agent-id>,\n# mark it as yours, print its path\n# hygiene.sh worktree CLONE --task NAME [--branch B] [--from REF] [--force-new] [--shared]\n# add a git worktree of CLONE at\n# $ROOT/<task>-<repo>-<agent-id>-wt-<branch>\n# (detached: -wt-<short sha>), mark it as\n# yours, print its path. CLONE is a clone\n# marked as yours (`clone`), or with\n# --shared a session's unmarked base clone;\n# never one under ~/GitHub or excluded\n# hygiene.sh audit [--root DIR] report every clone and worktree: CLEAN,\n# KEEP or ACTIVE, and scratch review\n# branches (pr<N>) that are safe to delete\n# hygiene.sh prune [--root DIR] [--apply] remove regenerable build folders\n# hygiene.sh tmp [--tmp DIR] [--apply] remove orphaned tool temp folders from\n# ${TMPDIR:-/tmp} (Vitest/Vite module\n# copies, npm pack folders)\n# hygiene.sh close CLONE [--apply] close one clone or worktree: audit it,\n# delete it if clean (a worktree with\n# `git worktree remove`)\n# hygiene.sh sweep [--root DIR] [--apply] prune and tmp, then close every clean,\n# idle clone\n#\n# REPO is <org>/<repo> (cloned from GitHub), a git URL, or a local path.\n#\n# Submodules: a submodule's checkout (its .git is a file pointing into the\n# parent's .git/modules/) belongs to its parent. It is audited with the parent\n# and deleted only with it, never listed, closed or deleted on its own.\n#\n# Deletion: a folder goes (rm -rf, or git worktree remove) only when every\n# checkout inside it, any .git entry in gitignored folders too, may go with\n# it: git reads it as its own, its git dir is inside the folder, not locked,\n# not another agent's, idle, nothing unpublished. So may every other git dir\n# in it (a bare mirror, a deinit'd submodule's .git/modules/<name>). A\n# worktree of a clone outside the folder is never deleted with it. prune and\n# tmp skip a folder with a checkout in it.\n#\n# Ownership: `clone` writes the agent id into <clone>/.git/hygiene-owner, and\n# `worktree` into the worktree's own git dir (<clone>/.git/worktrees/<name>/),\n# beside the branch it created (hygiene-branch) and the commit it started from\n# (hygiene-from), so close can judge a review worktree after a fetch.\n# prune, close and sweep never touch a clone or worktree whose\n# marker names another agent; pass --force-owner to override (a supervisor's\n# sweep). Clones with no marker are judged as before.\n#\n# Cloud sessions: when CLAUDE_CODE_REMOTE=true (Claude Code on the web), the\n# disk is a per-session allowance on a shared filesystem: df's Size is the\n# host's, and used + available is the session's. `check` then defaults to 25%\n# of that allowance instead of 50 GB, and says how many heavy builds fit\n# (10 GB each, counted in the free space above the threshold).\n#\n# clone and worktree create a missing root (mkdir -p of the root only, never\n# of a task folder), so `export HYGIENE_ROOT=/workspace/wt` is enough.\n#\n# Options:\n# --root DIR where the clones live (default: $HYGIENE_ROOT, else $TMPDIR, else /tmp)\n# --tmp DIR the temp directory `tmp` cleans (default: $TMPDIR, else /tmp)\n# --agent ID your agent id (default: $HYGIENE_AGENT_ID; `clone` makes one if unset)\n# --task NAME the task name in the folder name (clone, worktree)\n# --branch B the branch to check out (clone, worktree). worktree checks out a\n# local B, else bases B on origin/B and tracks it, else creates B\n# --from REF where a new worktree branch, or a detached worktree, starts\n# (default: the clone's HEAD). Refused when the local B exists, and\n# when origin/B exists at another commit (unless --force-new)\n# --force-new worktree: start a new B from --from although origin/B exists\n# (B then tracks nothing)\n# --shared worktree: CLONE may have no ownership marker (a session's shared\n# base clone, such as /workspace/<repo>). Never lifts the refusal of\n# a clone under ~/GitHub, an --exclude path, or another agent's clone\n# --min-gb N check: the free-space threshold in GB\n# --min-pct P check: the threshold as P% of used + available (default 25 when remote)\n# --older-than MIN leave anything touched in the last MIN minutes alone (default 120)\n# --exclude PATH never touch PATH (repeatable; e.g. your own live clone)\n# --force-owner act on clones another agent owns (still dry run without --apply)\n# --apply actually delete; without it, only report\n#\n# Environment:\n# HYGIENE_AGENT_ID your agent id: letters, digits, '.', '_' or '-'\n# HYGIENE_GH the gh binary to ask for PR state (default: gh; \"none\" skips PR lookups).\n# Only `gh api` is used, so Claude Code's built-in gh works too.\n# CLAUDE_CODE_REMOTE \"true\" in a Claude Code cloud session (set by Claude Code)\n#\n# Exit codes: 0 ok; 1 check failed (low disk), a refused path or clone, or bad\n# usage (close also exits 1 for a clone it leaves in place only because a\n# worktree of it, or of a clone inside it, is still checked out: close those\n# first); 2 a clone was kept because it holds unpublished work (close/sweep),\n# so a human or agent must look.\n\nset -u\nset -o pipefail\n# Read-only git: `git status` must not refresh the index, or the audit itself\n# would make every clone look recently active.\nexport GIT_OPTIONAL_LOCKS=0\n# No git this script runs may run a command a repository's config names\n# through these keys: no fsmonitor, no hooks, no signature check, no ext::\n# or fd:: transport. GIT_CONFIG_COUNT outranks every config file and reaches\n# every git that git starts (a submodule's status included). The keys a\n# scanned repository could still use to run something (filters, textconv,\n# includes, transports) are refused before any git runs there (config_safe).\n# The caller's own count, for git_user.\nHYG_GIT_COUNT0=\"${GIT_CONFIG_COUNT:-0}\"\ncase \"$HYG_GIT_COUNT0\" in '' | *[!0-9]*) HYG_GIT_COUNT0=0 ;; esac\nHYG_NO_LAZY0=\"${GIT_NO_LAZY_FETCH:-0}\"\nharden_git() {\n local n=\"${GIT_CONFIG_COUNT:-0}\" kv\n case \"$n\" in '' | *[!0-9]*) n=0 ;; esac\n # protocol.allow=never: no transport at all, unless a call names the\n # protocols it needs (remote_cache, safe_ls_remote) or is git_user.\n for kv in core.fsmonitor=false core.hooksPath=/dev/null log.showSignature=false \\\n protocol.allow=never protocol.ext.allow=never protocol.fd.allow=never; do\n export \"GIT_CONFIG_KEY_$n=${kv%%=*}\" \"GIT_CONFIG_VALUE_$n=${kv#*=}\"\n n=$((n + 1))\n done\n export GIT_CONFIG_COUNT=\"$n\"\n # A missing object is never fetched on demand (a promisor remote in a\n # partial clone's config would otherwise be a transport): git 2.44+.\n export GIT_NO_LAZY_FETCH=1\n}\nharden_git\n# The pins for every git this script runs that talks to a remote with a\n# checkout's own config (remote_cache, fetch_checkout), agent-tools#279:\n# - credential.helper is reset, then your own helpers (system and global\n# config, never a repository's) are added back, so a private remote still\n# authenticates and a helper a repository names never runs;\n# - the file transport is off: `git ls-remote /path` runs upload-pack in\n# another repository. HYGIENE_FILE_REMOTES=1 allows it for a local mirror\n# you trust (the tests' remotes are local paths).\nCRED_PINS=(-c credential.helper=)\nwhile IFS= read -r h; do\n [ -z \"$h\" ] || CRED_PINS+=(-c \"credential.helper=$h\")\ndone < <(cd / && unset GIT_DIR GIT_WORK_TREE && GIT_CEILING_DIRECTORIES=/ GIT_CONFIG_COUNT=0 \\\n git config --get-all credential.helper 2>/dev/null)\nif [ \"${HYGIENE_FILE_REMOTES:-0}\" = 1 ]; then FILE_PROTO=always; else FILE_PROTO=never; fi\n# git with the caller's own config, hooks included: only for writes to a\n# clone you own and name (`worktree add`, close's and sweep's fetch of a\n# trusted checkout), never on a git dir found by scanning.\ngit_user() { GIT_CONFIG_COUNT=\"$HYG_GIT_COUNT0\" GIT_NO_LAZY_FETCH=\"$HYG_NO_LAZY0\" git \"$@\"; }\n# cfg_file FILE ARGS...: `git config --file FILE ARGS...` as a plain file\n# read: run from /, with no repository to find (GIT_CEILING_DIRECTORIES),\n# no system or global config, and no include followed (--file follows none).\n# The one way this script reads a scanned git dir's config.\ncfg_file() {\n local f=\"$1\"\n shift\n (cd / && GIT_CEILING_DIRECTORIES=/ GIT_CONFIG_NOSYSTEM=1 GIT_CONFIG_GLOBAL=/dev/null \\\n git config --file \"$f\" \"$@\")\n}\n\nREGENERABLE=\"node_modules target .astro .wrangler .turbo .next\"\n# The ownership marker `clone` writes into every clone it makes, relative to\n# the clone. Inside .git, so `git clean -fdx` and `git stash --all` cannot\n# remove it and it never shows as a change.\nMARKER=\".git/hygiene-owner\"\n\ndie() {\n printf 'hygiene: %s\\n' \"$*\" >&2\n exit 1\n}\nsay() { printf '%s\\n' \"$*\"; }\nnote() { printf '%s\\n' \"$*\" >&2; }\nusage() { awk 'NR > 1 && /^#/ { sub(/^# ?/, \"\"); print; next } NR > 1 { exit }' \"$0\"; }\n\n# Absolute, symlink-resolved path of an existing directory, or empty.\nresolve_dir() {\n [ -d \"$1\" ] || return 1\n (cd \"$1\" 2>/dev/null && pwd -P)\n}\n\nMY_UID=\"$(id -u)\"\n# owned_dir DIR: DIR is a real folder (not a symlink) owned by you.\nowned_dir() {\n [ -d \"$1\" ] && [ ! -L \"$1\" ] || return 1\n [ -n \"$(find \"$1\" -maxdepth 0 -user \"$MY_UID\" -print 2>/dev/null)\" ]\n}\n# private_dir DIR: owned_dir, and no one else may write in it.\nprivate_dir() {\n owned_dir \"$1\" || return 1\n [ -z \"$(find \"$1\" -maxdepth 0 \\( -perm -0020 -o -perm -0002 \\) -print 2>/dev/null)\" ]\n}\n\n# safe_rm BASE DIR: rm -rf DIR, a folder inside BASE (a resolved root),\n# without following a symlink anyone swaps in (agent-tools#279). A path\n# checked and then deleted later is a race in a shared folder: another user\n# can replace a component with a symlink in between, and rm -rf on the path\n# would then delete wherever it points. So:\n# - every component below BASE, down to DIR itself, must be a real folder\n# owned by you, never a symlink;\n# - DIR must still resolve to itself;\n# - the delete runs from inside DIR's parent, entered with cd -P and\n# checked with pwd -P. The shell then holds the real folder, so a\n# component swapped after the check cannot redirect the delete, and\n# rm -rf on a symlink swapped in for DIR removes only the link.\nsafe_rm() {\n local base=\"$1\" d=\"$2\" rest part c parent name\n case \"$d\" in \"$base\"/?*) ;; *) note \"refusing to delete $d: not inside $base\"; return 1 ;; esac\n rest=\"${d#\"$base\"/}\"\n c=\"$base\"\n while [ -n \"$rest\" ]; do\n part=\"${rest%%/*}\"\n if [ \"$part\" = \"$rest\" ]; then rest=\"\"; else rest=\"${rest#*/}\"; fi\n case \"$part\" in '' | . | ..) note \"refusing to delete $d: not a plain path\"; return 1 ;; esac\n c=\"$c/$part\"\n owned_dir \"$c\" || { note \"refusing to delete $d: $c is a symlink or not your folder\"; return 1; }\n done\n [ \"$(resolve_dir \"$d\")\" = \"$d\" ] || { note \"refusing to delete $d: it no longer resolves to itself\"; return 1; }\n parent=\"${d%/*}\"\n name=\"${d##*/}\"\n (\n cd -P -- \"$parent\" 2>/dev/null || exit 1\n [ \"$(pwd -P)\" = \"$parent\" ] || exit 1\n [ -d \"$name\" ] && [ ! -L \"$name\" ] || exit 1\n rm -rf -- \"./$name\"\n ) || { note \"refusing to delete $d: its folder changed while it was checked\"; return 1; }\n}\n\nhuman_kb() {\n awk -v k=\"$1\" 'BEGIN {\n if (k >= 1048576) printf \"%.1f GB\", k / 1048576\n else if (k >= 1024) printf \"%.1f MB\", k / 1024\n else printf \"%d KB\", k }'\n}\n\nsize_kb() { du -sk \"$1\" 2>/dev/null | awk '{print $1+0}'; }\n\n# ---------------------------------------------------------------- arguments\nCMD=\"${1:-}\"\n[ -n \"$CMD\" ] && shift\nROOT_ARG=\"${HYGIENE_ROOT:-${TMPDIR:-/tmp}}\"\n# 1 when the root was named (HYGIENE_ROOT or --root), 0 when it is the\n# $TMPDIR or /tmp fallback (require_safe_root).\nROOT_EXPLICIT=0\n[ -z \"${HYGIENE_ROOT:-}\" ] || ROOT_EXPLICIT=1\nTMP_ARG=\"${TMPDIR:-/tmp}\"\nMIN_GB=\"\"\nMIN_PCT=\"\"\nFROM=\"\"\nFORCE_NEW=0\nCHECK_PATH=\"\"\nOLDER=120\nAPPLY=0\nEXCLUDES=\"\"\nTARGET=\"\"\nTASK=\"\"\nBRANCH=\"\"\nFORCE_OWNER=0\nSHARED=0\nMY_AGENT=\"${HYGIENE_AGENT_ID:-}\"\nGH=\"${HYGIENE_GH:-gh}\"\n\nwhile [ $# -gt 0 ]; do\n case \"$1\" in\n --root) ROOT_ARG=\"${2:?--root needs a directory}\"; ROOT_EXPLICIT=1; shift 2 ;;\n --min-gb) MIN_GB=\"${2:?--min-gb needs a number}\"; shift 2 ;;\n --min-pct) MIN_PCT=\"${2:?--min-pct needs a percentage}\"; shift 2 ;;\n --tmp) TMP_ARG=\"${2:?--tmp needs a directory}\"; shift 2 ;;\n --from) FROM=\"${2:?--from needs a ref}\"; shift 2 ;;\n --path) CHECK_PATH=\"${2:?--path needs a directory}\"; shift 2 ;;\n --older-than) OLDER=\"${2:?--older-than needs minutes}\"; shift 2 ;;\n --exclude)\n ex=\"$(resolve_dir \"${2:?--exclude needs a path}\")\" || ex=\"$2\"\n EXCLUDES=\"$EXCLUDES\n$ex\"\n shift 2 ;;\n --agent) MY_AGENT=\"${2:?--agent needs an id}\"; shift 2 ;;\n --task) TASK=\"${2:?--task needs a name}\"; shift 2 ;;\n --branch) BRANCH=\"${2:?--branch needs a branch}\"; shift 2 ;;\n --force-owner) FORCE_OWNER=1; shift ;;\n --force-new) FORCE_NEW=1; shift ;;\n --shared) SHARED=1; shift ;;\n --apply) APPLY=1; shift ;;\n -h|--help) usage; exit 0 ;;\n --*) die \"unknown option: $1\" ;;\n *) [ -z \"$TARGET\" ] || die \"unexpected argument: $1\"; TARGET=\"$1\"; shift ;;\n esac\ndone\n\ncase \"$MIN_GB\" in *[!0-9]*) die \"--min-gb must be a whole number\" ;; esac\ncase \"$MIN_PCT\" in *[!0-9]*) die \"--min-pct must be a whole number\" ;; esac\ncase \"$OLDER\" in ''|*[!0-9]*) die \"--older-than must be a whole number of minutes\" ;; esac\n# $((...)) reads a leading zero as octal (010 is 8, 08 is an error): make\n# every number decimal once, here, before any arithmetic.\n[ -z \"$MIN_GB\" ] || MIN_GB=$((10#$MIN_GB))\n[ -z \"$MIN_PCT\" ] || MIN_PCT=$((10#$MIN_PCT))\nOLDER=$((10#$OLDER))\n[ -z \"$MIN_PCT\" ] || [ \"$MIN_PCT\" -le 100 ] || die \"--min-pct must be 0 to 100\"\n\n# A name that is safe in a folder name: letters, digits, '.', '_', '-'; not\n# starting with '.' or '-'; at most 64 characters.\nvalid_name() {\n case \"$1\" in ''|.*|-*|*[!A-Za-z0-9._-]*) return 1 ;; esac\n [ \"${#1}\" -le 64 ]\n}\n[ -z \"$MY_AGENT\" ] || valid_name \"$MY_AGENT\" ||\n die \"agent id must be letters, digits, '.', '_' or '-' (at most 64): $MY_AGENT\"\n\n# ------------------------------------------------------------- safety gates\nHOME_REAL=\"$(resolve_dir \"${HOME:-/nonexistent}\" || true)\"\n\n# True when the resolved PATH is under ~/GitHub, the owner's live working\n# copies: nothing there is ever deleted or written to.\nunder_github() {\n [ -n \"$HOME_REAL\" ] || return 1\n case \"$1/\" in \"$HOME_REAL/GitHub/\"*) return 0 ;; esac\n return 1\n}\n\n# True when PATH is an --exclude path, inside one, or holds one.\nexcluded() {\n local p=\"$1\" ex\n [ -n \"$EXCLUDES\" ] || return 1\n while IFS= read -r ex; do\n [ -n \"$ex\" ] || continue\n case \"$p/\" in \"$ex/\"*) return 0 ;; esac\n case \"$ex/\" in \"$p/\"*) return 0 ;; esac\n done <<EOF\n$EXCLUDES\nEOF\n return 1\n}\n\n# Why the resolved PATH is never deleted or written to, or nothing: it is /,\n# your home, or under ~/GitHub. The one list behind validate_root and\n# untouchable_why.\nprotected_why() {\n if [ \"$1\" = / ]; then\n echo \"it is /\"\n elif [ -n \"$HOME_REAL\" ] && [ \"$1\" = \"$HOME_REAL\" ]; then\n echo \"it is your home directory\"\n elif under_github \"$1\"; then\n echo \"it is under ~/GitHub (working copies are never written to or deleted)\"\n fi\n}\n\n# Why the resolved PATH may not be touched, or nothing: protected_why, or an\n# --exclude path (or inside one, or holding one). The gate behind deletable,\n# git_dir_writable and worktree's CLONE.\nuntouchable_why() {\n local why\n why=\"$(protected_why \"$1\")\"\n [ -n \"$why\" ] || ! excluded \"$1\" || why=\"it is excluded (--exclude)\"\n printf '%s\\n' \"$why\"\n}\n\n# A path we may delete: absolute, inside ROOT, not ROOT itself, and not\n# untouchable. Every rm under the root goes through here first.\ndeletable() {\n local p=\"$1\"\n case \"$p\" in /*) ;; *) return 1 ;; esac\n [ \"$p\" != \"$ROOT\" ] || return 1\n case \"$p/\" in \"$ROOT\"/*) ;; *) return 1 ;; esac\n [ -z \"$(untouchable_why \"$p\")\" ]\n}\n\n# Die unless the directory named by the variable VAR may be a root that this\n# script deletes under: not /, not your home, not under ~/GitHub. LABEL\n# names it in the message (default: root). The one gate for --root and --tmp.\n# (A root may hold an --exclude path, so exclusion is not asked here.)\nvalidate_root() {\n local v=\"${!1}\" label=\"${2:-root}\" why\n [ -n \"$v\" ] || die \"no $label\"\n why=\"$(protected_why \"$v\")\"\n [ -z \"$why\" ] || die \"refusing to use $v as the $label: $why\"\n}\n\n# The resolved common git dir of the checkout at DIR (for a linked worktree,\n# its clone's .git), or fail. The one way close, sweep and worktree find it.\ncommon_git_dir() {\n local c\n c=\"$(git -C \"$1\" rev-parse --git-common-dir 2>/dev/null)\" || return 1\n [ -n \"$c\" ] || return 1\n case \"$c\" in /*) ;; *) c=\"$1/$c\" ;; esac\n resolve_dir \"$c\"\n}\n\n# Sets CK_GD and CK_CD to the resolved git dir and common git dir of the\n# checkout at DIR (the same dir for a clone; for a linked worktree, its own\n# entry under the clone's .git/worktrees/ and the clone's .git). Fails, with\n# both empty, when git cannot read them. A --separate-git-dir checkout or a\n# worktree keeps its git data away from the checkout, so the checkout's own\n# path proves nothing about where git writes.\nCK_GD=\"\"\nCK_CD=\"\"\ngit_dirs() {\n CK_GD=\"\"\n CK_CD=\"\"\n if CK_GD=\"$(git -C \"$1\" rev-parse --absolute-git-dir 2>/dev/null)\" && [ -n \"$CK_GD\" ] &&\n CK_GD=\"$(resolve_dir \"$CK_GD\")\" && CK_CD=\"$(common_git_dir \"$1\")\"; then\n return 0\n fi\n CK_GD=\"\"\n CK_CD=\"\"\n return 1\n}\n\n# True when git reads DIR as a repository of its own: the git dir it resolves\n# is DIR's own (the .git folder, or the git dir a .git file names) and DIR is\n# its top level. Git skips a .git folder it does not recognise (no HEAD, say)\n# and climbs to the repository around it, and then every answer it gives is\n# about that one: such a checkout is never judged, fetched into or deleted.\n# Sets CK_GD and CK_CD (git_dirs) when true.\nown_checkout() {\n local d=\"$1\" want top\n if [ -d \"$d/.git\" ]; then\n want=\"$(resolve_dir \"$d/.git\")\" || return 1\n else\n want=\"$(gitfile_dir \"$d\")\" || return 1\n [ -n \"$want\" ] && want=\"$(resolve_dir \"$want\")\" || return 1\n fi\n git_dirs \"$d\" || return 1\n [ \"$CK_GD\" = \"$want\" ] || return 1\n top=\"$(git -C \"$d\" rev-parse --show-toplevel 2>/dev/null)\" && top=\"$(resolve_dir \"$top\")\" && [ \"$top\" = \"$d\" ]\n}\n\n# git_dir_writable GITDIR [admin]: true when this script may write to the git\n# dir GITDIR (resolved first). Never /, your home, or under ~/GitHub. An\n# --exclude path also refuses ref and config writes (the fetch, branch -D,\n# worktree add); an \"admin\" write, the linked worktree's own entry under\n# <clone>/.git/worktrees/ that `git worktree remove` drops, is allowed there,\n# so a sweep that excludes your clone still removes its finished worktrees.\n# Asked before every git write. Sets GD_WHY when not.\nGD_WHY=\"\"\ngit_dir_writable() {\n local g why\n g=\"$(resolve_dir \"$1\")\" || { GD_WHY=\"its git dir $1 is missing\"; return 1; }\n if [ \"${2:-}\" = admin ]; then why=\"$(protected_why \"$g\")\"; else why=\"$(untouchable_why \"$g\")\"; fi\n [ -z \"$why\" ] || { GD_WHY=\"its git dir $g: $why\"; return 1; }\n GD_WHY=\"\"\n}\n\n# checkout_writable DIR [admin]: git_dir_writable for both of DIR's git dirs.\n# Returns 0 when writable, 1 when refused (GD_WHY says why), and 2 when git\n# cannot read them, which proves nothing either way: close then audits the\n# checkout, whose failed git status keeps it for a human.\ncheckout_writable() {\n git_dirs \"$1\" || { GD_WHY=\"git cannot read its git dir\"; return 2; }\n git_dir_writable \"$CK_GD\" \"${2:-}\" && git_dir_writable \"$CK_CD\" \"${2:-}\"\n}\n\n# Create a missing root, for clone and worktree. mkdir -p of the root itself\n# and never of a task folder (a task folder's mkdir is the claim). The path\n# the root would have is resolved through its nearest existing parent and\n# passes validate_root before anything is made.\nmake_root() {\n local want=\"$ROOT_ARG\" base rest=\"\" new_root\n case \"$want\" in /*) ;; *) want=\"$PWD/$want\" ;; esac\n while :; do\n case \"$want\" in /) break ;; */) want=\"${want%/}\" ;; *) break ;; esac\n done\n case \"$want/\" in */./*|*/../*) die \"refusing to create a root with . or .. in it: $ROOT_ARG\" ;; esac\n base=\"$want\"\n while [ ! -d \"$base\" ]; do\n [ ! -e \"$base\" ] && [ ! -L \"$base\" ] || die \"cannot create the root: $base exists and is not a directory\"\n rest=\"/${base##*/}$rest\"\n base=\"${base%/*}\"\n [ -n \"$base\" ] || base=/\n done\n new_root=\"$(resolve_dir \"$base\")\" || die \"cannot resolve $base\"\n new_root=\"${new_root%/}$rest\"\n validate_root new_root\n mkdir -p -- \"$new_root\" || die \"could not create the root $new_root\"\n note \"created the root $new_root\"\n}\n\n# Resolve and check ROOT. `set_root create` (clone, worktree) first creates\n# a missing root; every other command needs it to exist.\nset_root() {\n [ \"${1:-}\" != create ] || [ -d \"$ROOT_ARG\" ] || make_root\n ROOT=\"$(resolve_dir \"$ROOT_ARG\")\" || die \"root does not exist: $ROOT_ARG\"\n validate_root ROOT\n}\n\n# Before a command deletes (--apply): the root must be named (HYGIENE_ROOT or\n# --root), or be a folder only you can write in. The fallback root, $TMPDIR\n# or /tmp, is often shared (agent-tools#279), and deleting under a folder\n# another user can write in is how a swapped-in symlink redirects a delete.\nrequire_safe_root() {\n [ \"$APPLY\" -eq 1 ] || return 0\n [ \"$ROOT_EXPLICIT\" -eq 0 ] || return 0\n private_dir \"$ROOT\" && return 0\n die \"refusing to delete under $ROOT: it is the default root (\\$TMPDIR, else /tmp) and other users can write in it; set HYGIENE_ROOT or pass --root to name the folder your clones live in\"\n}\n\nrand_hex() {\n od -An -N3 -tx1 /dev/urandom 2>/dev/null | tr -d ' \\n'\n}\n\n# Set MY_AGENT when it is unset: six random hex characters, and agent_hint\n# then tells the caller to export it.\nAGENT_GENERATED=0\nensure_agent_id() {\n [ -z \"$MY_AGENT\" ] || return 0\n MY_AGENT=\"$(rand_hex)\"\n [ \"${#MY_AGENT}\" -eq 6 ] || die \"could not read /dev/urandom for an agent id; pass --agent\"\n AGENT_GENERATED=1\n}\n\nagent_hint() { # agent_hint <clone|worktree>\n [ \"$AGENT_GENERATED\" -eq 1 ] || return 0\n note \"your agent id is $MY_AGENT; export HYGIENE_AGENT_ID=$MY_AGENT so close and sweep know this $1 is yours\"\n}\n\n# ---------------------------------------------------------------- ownership\n# The marker file for the clone at DIR, if it has one. A worktree or\n# submodule has a .git *file* pointing at its git dir: a worktree is owned by\n# the marker of the clone it belongs to (its common dir).\nmarker_file() {\n local p=\"$1\" gd cd\n if [ -d \"$p/.git\" ]; then\n [ -f \"$p/$MARKER\" ] && printf '%s\\n' \"$p/$MARKER\"\n return 0\n fi\n # A malformed .git names no marker; the audit keeps that checkout.\n gd=\"$(gitfile_dir \"$p\")\" || return 0\n [ -n \"$gd\" ] || return 0\n if [ -f \"$gd/hygiene-owner\" ]; then\n printf '%s\\n' \"$gd/hygiene-owner\"\n elif [ -f \"$gd/commondir\" ]; then\n cd=\"$(git_one_line \"$gd/commondir\")\" || return 0\n case \"$cd\" in /*) ;; *) cd=\"$gd/$cd\" ;; esac\n [ -f \"$cd/hygiene-owner\" ] && printf '%s\\n' \"$cd/hygiene-owner\"\n fi\n return 0\n}\n\n# The agent id in a marker file (\"unknown\" for an empty one).\nmarker_id() {\n local id\n id=\"$(head -n 1 \"$1\" 2>/dev/null | tr -d '[:space:]')\"\n printf '%s\\n' \"${id:-unknown}\"\n}\n\n# git_one_line FILE: the value of a one-line pointer file (.git gitfile,\n# commondir) as git reads it, or exit status 2 when this script cannot be\n# sure it reads it the way git does.\n#\n# git (setup.c: read_gitfile_gently, get_common_dir_noenv) reads the whole\n# file into a C string and strips only a trailing run of \\n and \\r. So it\n# stops at the first NUL, keeps an embedded \\n or \\r, and keeps any other\n# byte. Shell tools disagree with that on exactly those bytes (bash drops a\n# NUL from $(...); awk's handling of NUL and of RS differs between mawk,\n# gawk, busybox and BSD awk), so the parse is made boring instead:\n# - any NUL: refused (compare the byte count with and without NULs);\n# - read with cat inside $(...; printf x), so no trailing byte is lost,\n# and strip only a trailing run of \\n and \\r, as git does;\n# - left empty, or any \\n or \\r left, or any byte outside printable ASCII\n# (0x20-0x7e, under LC_ALL=C): refused.\n# A refusal keeps the checkout (KEEP), which is the safe direction: a path\n# git uses for its own internals is plain ASCII in practice.\n#\n# Git itself is not asked to confirm the path: every git command that would\n# answer (rev-parse, git config with that dir as GIT_DIR) reads that dir's\n# config to do it, which is what this check exists to avoid.\ngit_one_line() {\n local f=\"$1\" n0 n1 v nl='\n' cr\n cr=\"$(printf '\\r')\"\n [ -f \"$f\" ] || return 2\n n0=\"$(LC_ALL=C wc -c <\"$f\" 2>/dev/null | tr -d ' ')\" || return 2\n n1=\"$(LC_ALL=C tr -d '\\000' <\"$f\" 2>/dev/null | LC_ALL=C wc -c | tr -d ' ')\" || return 2\n [ -n \"$n0\" ] && [ \"$n0\" = \"$n1\" ] || return 2\n v=\"$(LC_ALL=C cat -- \"$f\" 2>/dev/null && printf x)\" || return 2\n v=\"${v%x}\"\n while :; do\n case \"$v\" in\n *\"$nl\") v=\"${v%\"$nl\"}\" ;;\n *\"$cr\") v=\"${v%\"$cr\"}\" ;;\n *) break ;;\n esac\n done\n [ -n \"$v\" ] || return 2\n case \"$v\" in *\"$nl\"* | *\"$cr\"*) return 2 ;; esac\n # One line left: any byte outside space..tilde refuses.\n if printf '%s' \"$v\" | LC_ALL=C grep -q '[^ -~]'; then return 2; fi\n printf '%s\\n' \"$v\"\n}\n\n# The git dir that the .git file of DIR points at, made absolute. Read from\n# the file, not asked of git, so it works when that git dir is gone, and so\n# no git runs on DIR before its config is checked. Exit status:\n# 0 with the path: a .git file of exactly one `gitdir: <path>` line,\n# read the way git reads it (git_one_line);\n# 0 with nothing: DIR has no .git, or its .git is a folder;\n# 2 with nothing: a .git that is malformed: a file this script cannot be\n# sure git reads the same way, one with no `gitdir: ` line, or one that\n# is neither a folder nor a file (a broken link, a fifo).\n# Callers refuse on 2 (KEEP, \"a malformed .git file in ...\"); none may read\n# an empty result as \"nothing to check\".\ngitfile_dir() {\n local line gd\n if [ -d \"$1/.git\" ] || { [ ! -e \"$1/.git\" ] && [ ! -L \"$1/.git\" ]; }; then\n return 0\n fi\n [ -f \"$1/.git\" ] || return 2\n line=\"$(git_one_line \"$1/.git\")\" || return 2\n case \"$line\" in 'gitdir: '?*) gd=\"${line#gitdir: }\" ;; *) return 2 ;; esac\n case \"$gd\" in /*) ;; *) gd=\"$1/$gd\" ;; esac\n printf '%s\\n' \"$gd\"\n}\n\n# gitlinks DIR [PATH]: the gitlink (submodule) entries of DIR's index, under\n# PATH when given, as NUL-terminated \"160000 <sha> <stage>\\t<path>\" records.\n# Filtered before any bash loop reads them: newline and NUL are swapped\n# around the grep (tr maps each to the other), so every record is one line\n# for grep and a path with a newline still comes back whole.\ngitlinks() {\n if [ -n \"${2:-}\" ]; then\n git --literal-pathspecs -C \"$1\" ls-files -s -z -- \"$2\" 2>/dev/null\n else\n git -C \"$1\" ls-files -s -z 2>/dev/null\n fi | tr '\\n\\000' '\\000\\n' | grep -a '^160000 ' | tr '\\n\\000' '\\000\\n'\n}\n\n# True when REL is a submodule path of the work tree SP: a gitlink in its\n# index, or a submodule.<name>.path in its .gitmodules. Both are read\n# NUL-separated (a path git would quote, a name with spaces), and without a\n# pipe that a long .gitmodules could break with SIGPIPE.\ngitlink_in() {\n local sp=\"$1\" rel=\"$2\" rec nl='\n'\n while IFS= read -r -d '' rec; do\n [ \"${rec#*\t}\" != \"$rel\" ] || return 0\n done < <(gitlinks \"$sp\" \"$rel\")\n [ -f \"$sp/.gitmodules\" ] || return 1\n # -z: one \"<key>\\n<value>\" record per NUL.\n while IFS= read -r -d '' rec; do\n [ \"${rec#*\"$nl\"}\" != \"$rel\" ] || return 0\n done < <(cfg_file \"$sp/.gitmodules\" -z --get-regexp '^submodule\\..*\\.path$' 2>/dev/null)\n return 1\n}\n\n# The work tree of the parent that DIR is a submodule of, or nothing. Asked\n# of the parent, whatever the shape of DIR's .git: a file into the parent's\n# .git/modules/, or a folder (`git submodule add` of a repository already\n# there keeps its own .git). In order: git's own answer\n# (--show-superproject-working-tree); DIR as a gitlink or .gitmodules path\n# of the work tree around it; and, when its git dir is gone, a .git file\n# into a .git/modules/. A linked worktree is never a submodule.\nsubmodule_parent() {\n local d=\"$1\" gd sp=\"\" rel\n # A malformed .git is no submodule of anything: the audit keeps it.\n gd=\"$(gitfile_dir \"$d\")\" || return 0\n [ -z \"$gd\" ] || [ ! -f \"$gd/commondir\" ] || return 0\n # Git is asked only once DIR's config has passed (scan_ok); the work tree\n # around it is found by reading the folders, and asked (gitlink_in) only\n # once it has passed too.\n if scan_ok \"$d\"; then\n sp=\"$(git -C \"$d\" rev-parse --show-superproject-working-tree 2>/dev/null)\" || sp=\"\"\n fi\n if [ -z \"$sp\" ]; then\n sp=\"$(enclosing_checkout \"$d\")\"\n [ -z \"$sp\" ] || sp=\"$(resolve_dir \"$sp\")\" || sp=\"\"\n if [ -n \"$sp\" ]; then\n rel=\"${d#\"$sp\"/}\"\n [ \"$rel\" != \"$d\" ] && scan_ok \"$sp\" && gitlink_in \"$sp\" \"$rel\" || sp=\"\"\n fi\n fi\n if [ -z \"$sp\" ]; then\n case \"$gd\" in\n */.git/modules/*) sp=\"$(resolve_dir \"${gd%%/.git/modules/*}\")\" || sp=\"${gd%%/.git/modules/*}\" ;;\n */.git/worktrees/*/modules/*)\n sp=\"$(sed -n 1p \"${gd%/modules/*}/gitdir\" 2>/dev/null)\"\n sp=\"${sp%/.git}\"\n [ -n \"$sp\" ] || sp=\"${gd%/modules/*}\" ;;\n esac\n fi\n printf '%s\\n' \"$sp\"\n}\n\n# True when DIR is a submodule's checkout. Its parent owns it: it is audited\n# with the parent and deleted only with it. Answers are cached for the run\n# (list_clones asks for every checkout; removal asks again).\nis_submodule() {\n if grep -Fxq -- \"S\t$1\" \"$SUBMOD_CACHE\" 2>/dev/null; then return 0; fi\n if grep -Fxq -- \"N\t$1\" \"$SUBMOD_CACHE\" 2>/dev/null; then return 1; fi\n if [ -n \"$(submodule_parent \"$1\")\" ]; then\n printf 'S\\t%s\\n' \"$1\" >>\"$SUBMOD_CACHE\"\n return 0\n fi\n printf 'N\\t%s\\n' \"$1\" >>\"$SUBMOD_CACHE\"\n return 1\n}\n\n# The owner recorded by the nearest marker at or above DIR, inside ROOT; empty\n# when there is none (a clone made before markers, or by hand).\nowner_above() {\n local p=\"$1\" f\n while :; do\n case \"$p/\" in \"$ROOT\"/*) ;; *) return 0 ;; esac\n [ \"$p\" != \"$ROOT\" ] || return 0\n f=\"$(marker_file \"$p\")\"\n if [ -n \"$f\" ]; then\n marker_id \"$f\"\n return 0\n fi\n p=\"${p%/*}\"\n done\n}\n\n# True when we may act on something owned by OWNER: no owner, our own id, or\n# --force-owner.\nowner_ok() {\n [ -z \"$1\" ] && return 0\n [ \"$FORCE_OWNER\" -eq 1 ] && return 0\n [ -n \"$MY_AGENT\" ] && [ \"$1\" = \"$MY_AGENT\" ]\n}\n\n# True when a file under DIR (outside build folders) changed in the window.\n# Files, not folders: removing a build folder changes its parent's mtime.\n# During a sweep, a file in a .git folder in DIR newer than the sweep's start\n# is the sweep's own doing (its fetch; removing a worktree and its branch\n# rewrites the clone's .git/config and packed-refs), so it does not make the\n# clone active. A nested checkout's .git counts too: the sweep fetches into\n# it.\nSWEEP_SINCE=\"\"\nrecently_active() {\n local dir=\"$1\" hit\n local own=()\n [ \"$OLDER\" -gt 0 ] || return 1\n # During a sweep: skip (true, unprinted) the .git files the sweep changed.\n # find runs from inside DIR: a -path pattern built from DIR's name would\n # read [, * and ? in it as a pattern.\n [ -z \"$SWEEP_SINCE\" ] || own=(\\( -type f -path \"*/.git/*\" -newer \"$SWEEP_SINCE\" \\) -o)\n # ${own[@]+...}: bash 3.2 calls an empty array unbound under set -u.\n hit=\"$(cd \"$dir\" 2>/dev/null && find . \\( -name node_modules -o -name target -o -name .next -o -name .turbo \\) -prune \\\n -o ${own[@]+\"${own[@]}\"} -type f -mmin \"-$OLDER\" -print 2>/dev/null | head -n 1)\"\n [ -n \"$hit\" ]\n}\n\n# ------------------------------------------------------------------- check\n# A Claude Code cloud session (Claude Code on the web). Claude Code sets\n# CLAUDE_CODE_REMOTE=true there and never locally; a Remote Control session\n# runs on your own machine and is local.\nis_remote() { [ \"${CLAUDE_CODE_REMOTE:-}\" = true ]; }\n\n# Free space per heavy build (a pnpm install plus a build, or a cargo build)\n# when deciding how far to fan out in a cloud session.\nHEAVY_BUILD_KB=$((10 * 1048576))\n\ncmd_check() {\n local p line used_kb free_kb allowance_kb need_kb basis pct room\n p=\"${CHECK_PATH:-/}\"\n line=\"$(df -Pk \"$p\" 2>/dev/null | awk 'NR==2 {print $3+0, $4+0}')\"\n [ -n \"$line\" ] || die \"could not read free space for $p\"\n used_kb=\"${line% *}\"\n free_kb=\"${line#* }\"\n # used + available, not df's Size: in a cloud session the filesystem is the\n # host's and only used + available is this session's; anywhere, it leaves\n # out the blocks reserved for root.\n allowance_kb=$((used_kb + free_kb))\n if [ -n \"$MIN_GB\" ]; then\n need_kb=$((MIN_GB * 1048576))\n basis=\"$MIN_GB GB\"\n elif [ -n \"$MIN_PCT\" ] || is_remote; then\n pct=\"${MIN_PCT:-25}\"\n need_kb=$((allowance_kb * pct / 100))\n basis=\"$(human_kb \"$need_kb\"), ${pct}% of $(human_kb \"$allowance_kb\") used + available\"\n else\n need_kb=$((50 * 1048576))\n basis=\"50 GB\"\n fi\n if is_remote; then\n say \"cloud session (CLAUDE_CODE_REMOTE=true): this session's disk is about $(human_kb \"$allowance_kb\") (used + available); df's Size is the shared host's and does not count\"\n # Only the space above the threshold is spare: the threshold is the floor\n # the session must keep free, so a build may not spend it.\n room=$(((free_kb - need_kb) / HEAVY_BUILD_KB))\n [ \"$room\" -ge 0 ] || room=0\n say \"fan-out: room for $room concurrent heavy build(s) at 10 GB each, in the free space above the threshold\"\n fi\n # shellcheck disable=SC2016 # the $TMPDIR in the message is literal on purpose\n [ -n \"${TMPDIR:-}\" ] ||\n say 'warning: $TMPDIR is unset, so \"$TMPDIR/<name>\" is \"/<name>\" at the filesystem root; write \"${TMPDIR:-/tmp}/<name>\"'\n if [ \"$free_kb\" -lt \"$need_kb\" ]; then\n say \"LOW DISK: $(human_kb \"$free_kb\") free on $p (threshold $basis). Do not fan out; run a sweep first.\"\n return 1\n fi\n say \"ok: $(human_kb \"$free_kb\") free on $p (threshold $basis)\"\n}\n\n# ------------------------------------------------------------------- prune\ncmd_prune() {\n set_root\n require_safe_root\n total=0\n count=0\n # One walk. A matching folder is never descended into (-prune), so nothing\n # inside a node_modules is judged on its own, and a folder touched inside the\n # window is left alone (-mmin).\n names=\"\"\n for name in $REGENERABLE; do names=\"$names -o -name $name\"; done\n # shellcheck disable=SC2086 # $names is a fixed list of plain words\n find \"$ROOT\" -name .git -prune -o -type d \\( -false $names \\) -prune \\( -mmin \"+$OLDER\" -user \"$MY_UID\" -print -o -true \\) 2>/dev/null |\n while IFS= read -r d; do\n [ -n \"$d\" ] || continue\n parent=\"${d%/*}\"\n base=\"${d##*/}\"\n # Only folders a tool regenerates: a sibling manifest proves what they are.\n case \"$base\" in\n node_modules|.next|.turbo|.astro) [ -f \"$parent/package.json\" ] || [ \"$base\" = node_modules ] || continue ;;\n target) [ -f \"$parent/Cargo.toml\" ] || [ -f \"$d/CACHEDIR.TAG\" ] || continue ;;\n .wrangler) [ -f \"$parent/wrangler.toml\" ] || [ -f \"$parent/wrangler.jsonc\" ] || [ -f \"$parent/wrangler.json\" ] || continue ;;\n esac\n deletable \"$d\" || continue\n # Regenerable, unless a checkout sits inside it (a git dependency, a\n # clone someone made there): rm -rf would take its work with it.\n if [ -n \"$(find \"$d\" -name .git -print 2>/dev/null | head -n 1)\" ]; then\n say \"skip (holds a git checkout): $d\"\n continue\n fi\n owner=\"$(owner_above \"$parent\")\"\n owner_ok \"$owner\" || { say \"skip (owned by $owner): $d\"; continue; }\n recently_active \"$parent\" && { say \"skip (active): $d\"; continue; }\n kb=\"$(size_kb \"$d\")\"\n if [ \"$APPLY\" -eq 1 ]; then\n safe_rm \"$ROOT\" \"$d\" && say \"pruned $(human_kb \"$kb\"): $d\"\n else\n say \"would prune $(human_kb \"$kb\"): $d\"\n fi\n printf '%s\\t%s\\n' \"$kb\" \"$d\" >>\"$PRUNE_TALLY\"\n done\n total=\"$(awk '{s+=$1} END {print s+0}' \"$PRUNE_TALLY\")\"\n count=\"$(wc -l <\"$PRUNE_TALLY\" | tr -d ' ')\"\n if [ \"$APPLY\" -eq 1 ]; then\n say \"prune: freed $(human_kb \"$total\") in $count folder(s) under $ROOT\"\n else\n say \"prune (dry run): $(human_kb \"$total\") in $count folder(s) under $ROOT; re-run with --apply\"\n fi\n}\n\n# --------------------------------------------------------------------- tmp\n# Orphaned tool temp folders directly in the temp directory. A folder is\n# judged by what is in it, never by its name alone:\n#\n# vitest a random name (letters, digits, '_', '-'; 16 to 32 long) holding\n# only `client/` and/or `ssr/`, each holding only regular files named\n# by a 40-hex hash, the first of which is Vite SSR module code. These\n# are the module copies Vitest leaves behind on every run: seen with\n# Vitest 5.0.0-5.0.2, and with Vitest 4.x as Vite+ (vite-plus) runs\n# it. The test is by content, not by version, so any Vitest that\n# leaves the same shape is caught.\n# npmpack `tmp.*` (mktemp -d) holding only `*.tgz` files and/or an unpacked\n# `package/` with a package.json: a leftover `npm pack`.\n#\n# Never: a symlink, a folder owned by another user, anything touched inside\n# the window, claude-* (Claude Code's own temp, the session's scratchpad),\n# browser profiles, or an --exclude path.\n\n# The kind of tool litter at DIR (vitest or npmpack), or nothing.\ntmp_kind() {\n local d=\"$1\" b e sub first\n b=\"${d##*/}\"\n case \"$b\" in\n claude|claude-*|.org.chromium.*|*[Cc]hrom*|puppeteer*|playwright*|*firefox*|*profile*) return 0 ;;\n esac\n case \"$b\" in\n tmp.*)\n [ -n \"$(ls -A \"$d\" 2>/dev/null)\" ] || return 0\n for e in \"$d\"/* \"$d\"/.[!.]*; do\n [ -e \"$e\" ] || [ -L \"$e\" ] || continue\n [ ! -L \"$e\" ] || return 0\n case \"${e##*/}\" in\n *.tgz) [ -f \"$e\" ] || return 0 ;;\n package) [ -d \"$e\" ] && [ -f \"$e/package.json\" ] || return 0 ;;\n *) return 0 ;;\n esac\n done\n echo npmpack\n return 0 ;;\n esac\n [ \"${#b}\" -ge 16 ] && [ \"${#b}\" -le 32 ] || return 0\n case \"$b\" in *[!A-Za-z0-9_-]*) return 0 ;; esac\n sub=0\n for e in \"$d\"/* \"$d\"/.[!.]*; do\n [ -e \"$e\" ] || [ -L \"$e\" ] || continue\n case \"${e##*/}\" in client|ssr) ;; *) return 0 ;; esac\n [ -d \"$e\" ] && [ ! -L \"$e\" ] || return 0\n sub=$((sub + 1))\n done\n [ \"$sub\" -gt 0 ] || return 0\n # One walk: every entry under client/ and ssr/ must be a regular file named\n # by a sha1 (40 hex). Anything else prints a lone \"/\", which no path is.\n # The first file is kept, to check that it is Vite SSR module code.\n first=\"$(find \"$d\" -mindepth 2 \\( -type f -print \\) -o \\( -exec printf '/\\n' \\; \\) 2>/dev/null |\n awk -F/ '$0 == \"/\" || $NF !~ /^[0-9a-f]+$/ || length($NF) != 40 { bad = 1; exit }\n NR == 1 { first = $0 }\n END { if (!bad) print first }')\"\n [ -n \"$first\" ] && grep -q '__vite_ssr_' \"$first\" 2>/dev/null || return 0\n echo vitest\n}\n\n# True when DIR is a direct child of the temp root and not excluded.\ntmp_deletable() {\n local p=\"$1\"\n case \"$p\" in /*) ;; *) return 1 ;; esac\n [ \"${p%/*}\" = \"$TMPROOT\" ] || return 1\n [ \"$p\" != \"$TMPROOT\" ] && [ \"$p\" != \"/\" ] && [ \"$p\" != \"$HOME_REAL\" ] || return 1\n ! excluded \"$p\"\n}\n\ncmd_tmp() {\n local d kind kb total=0 count=0 uid ncc\n TMPROOT=\"$(resolve_dir \"$TMP_ARG\")\" || die \"temp directory does not exist: $TMP_ARG\"\n validate_root TMPROOT \"temp directory\"\n uid=\"$(id -u)\"\n # Direct children only; -mmin on the folder, then every file inside it.\n while IFS= read -r d; do\n [ -n \"$d\" ] || continue\n tmp_deletable \"$d\" || continue\n kind=\"$(tmp_kind \"$d\")\"\n [ -n \"$kind\" ] || continue\n if [ -n \"$(find \"$d\" -name .git -print 2>/dev/null | head -n 1)\" ]; then\n say \"skip (holds a git checkout): $d\"\n continue\n fi\n if [ \"$OLDER\" -gt 0 ] && [ -n \"$(find \"$d\" -mmin \"-$OLDER\" -print 2>/dev/null | head -n 1)\" ]; then\n say \"skip (active): $d\"\n continue\n fi\n kb=\"$(size_kb \"$d\")\"\n if [ \"$APPLY\" -eq 1 ]; then\n safe_rm \"$TMPROOT\" \"$d\" && say \"removed $(human_kb \"$kb\") ($kind): $d\"\n else\n say \"would remove $(human_kb \"$kb\") ($kind): $d\"\n fi\n total=$((total + kb))\n count=$((count + 1))\n done <<EOF\n$(find \"$TMPROOT\" -mindepth 1 -maxdepth 1 -type d -user \"$uid\" -print 2>/dev/null)\nEOF\n # Node's compile cache is shared and regenerable, but a running node may be\n # using it: report it, never remove it.\n ncc=\"$TMPROOT/node-compile-cache\"\n [ -d \"$ncc\" ] && [ ! -L \"$ncc\" ] &&\n say \"not touched: $(human_kb \"$(size_kb \"$ncc\")\") in $ncc (Node's shared compile cache; regenerable, remove it by hand when no node process runs)\"\n if [ \"$APPLY\" -eq 1 ]; then\n say \"tmp: freed $(human_kb \"$total\") in $count folder(s) under $TMPROOT\"\n else\n say \"tmp (dry run): $(human_kb \"$total\") in $count folder(s) under $TMPROOT; re-run with --apply\"\n fi\n}\n\n# --------------------------------------------------------- clone auditing\n# The GitHub owner/repo of a clone's origin, or empty.\n# origin_path DIR: origin's URL without its scheme and host (a folder name\n# is made from its last part; `worktree` checks it with valid_name).\norigin_path() {\n local url\n url=\"$(git -C \"$1\" remote get-url origin 2>/dev/null)\" || return 0\n printf '%s\\n' \"$url\" | sed -E 's#^(git@[^:]+:|ssh://git@[^/]+/|https?://([^@/]+@)?[^/]+/)##; s#\\.git$##'\n}\n\norigin_slug() {\n local slug\n slug=\"$(origin_path \"$1\")\"\n # The slug goes into `gh api` paths, and a scanned checkout's URL is\n # anyone's to write: path characters only (no ?, &, #, space or %), and\n # no .. segment.\n printf '%s\\n' \"$slug\" | grep -Eq '^[A-Za-z0-9._/-]+$' || return 0\n case \"/$slug/\" in */../* | */./*) return 0 ;; esac\n printf '%s\\n' \"$slug\"\n}\n\n# Only `gh api` is used: it works with the GitHub CLI and with Claude Code's\n# built-in gh in a cloud session, which has no other command.\ngh_ok() {\n [ \"$GH\" != \"none\" ] && [ -n \"$1\" ] || return 1\n command -v \"$GH\" >/dev/null 2>&1\n}\n\n# A branch name made safe for a query string.\nurl_q() { printf '%s' \"$1\" | sed -e 's/%/%25/g' -e 's/&/%26/g' -e 's/+/%2B/g' -e 's/#/%23/g' -e 's/ /%20/g'; }\n\n# The jq for a list of PRs: one \"<STATE> <head sha>\" line each.\nPR_JQ='.[] | \"\\(if .merged_at then \"MERGED\" else (.state | ascii_upcase) end) \\(.head.sha)\"'\n\n# \"<STATE> <head sha>\" for the PRs from BRANCH in SLUG's own repository.\npr_lines_head() {\n \"$GH\" api \"repos/$1/pulls?head=${1%%/*}:$(url_q \"$2\")&state=all&per_page=100\" --jq \"$PR_JQ\" 2>/dev/null\n}\n\n# \"<STATE> <head sha>\" for the PRs GitHub associates with commit SHA. This\n# finds a PR from a fork by its commit.\npr_lines_commit() {\n \"$GH\" api \"repos/$1/commits/$2/pulls?per_page=100\" --jq \"$PR_JQ\" 2>/dev/null\n}\n\n# \"<head ref><TAB><STATE><TAB><head sha>\" for SLUG's latest 100 PRs, fork PRs\n# included. Fetched once per repository per run.\npr_scan() {\n local slug=\"$1\"\n if ! grep -Fxq -- \"#$slug\" \"$SCAN_CACHE\" 2>/dev/null; then\n {\n printf '#%s\\n' \"$slug\"\n \"$GH\" api \"repos/$slug/pulls?state=all&per_page=100\" \\\n --jq '.[] | \"\\(.head.ref)\\t\\(if .merged_at then \"MERGED\" else (.state | ascii_upcase) end)\\t\\(.head.sha)\"' 2>/dev/null |\n awk -v s=\"$slug\" '{ print s \"\\t\" $0 }'\n } >>\"$SCAN_CACHE\"\n fi\n awk -F'\\t' -v s=\"$slug\" '$1 == s { print $2 \"\\t\" $3 \"\\t\" $4 }' \"$SCAN_CACHE\"\n}\n\n# The PR state of local branch BRANCH in clone REPO (GitHub repository\n# SLUG). Sets PR_ST to MERGED, CLOSED, OPEN, or empty (no PR, or no gh);\n# PR_ON_PR to 1 when the branch's tip is an open PR's head or behind it, so\n# it is pushed to that PR even where no remote-tracking ref has it (a fork);\n# and PR_PUB to 1 when the tip is a merged or closed PR's head or behind it.\n# A merged PR publishes the commits it had, never one made after its head.\n#\n# A fork PR is not found by head=<owner>:<branch>, so when that finds\n# nothing: the PRs associated with the tip commit, then the latest 100 PRs\n# whose head ref is BRANCH and whose head commit is the tip or behind it.\npr_state() {\n local repo=\"$1\" slug=\"$2\" branch=\"$3\" tip lines st sha\n PR_ST=\"\"\n PR_ON_PR=0\n PR_PUB=0\n gh_ok \"$slug\" || return 0\n tip=\"$(git -C \"$repo\" rev-parse -q --verify \"refs/heads/$branch^{commit}\" 2>/dev/null)\"\n lines=\"$(pr_lines_head \"$slug\" \"$branch\")\"\n [ -n \"$lines\" ] || [ -z \"$tip\" ] || lines=\"$(pr_lines_commit \"$slug\" \"$tip\")\"\n if [ -z \"$lines\" ] && [ -n \"$tip\" ]; then\n lines=\"$(pr_scan \"$slug\" | awk -F'\\t' -v b=\"$branch\" '$1 == b { print $2, $3 }' |\n while read -r st sha; do\n [ \"$sha\" = \"$tip\" ] || git -C \"$repo\" merge-base --is-ancestor \"$sha\" \"$tip\" 2>/dev/null || continue\n printf '%s %s\\n' \"$st\" \"$sha\"\n done)\"\n fi\n case \"$lines\" in\n *MERGED*) PR_ST=MERGED ;;\n *CLOSED*) PR_ST=CLOSED ;;\n *OPEN*) PR_ST=OPEN ;;\n esac\n [ -n \"$tip\" ] || return 0\n while read -r st sha; do\n [ -n \"$sha\" ] || continue\n if [ \"$sha\" = \"$tip\" ] || git -C \"$repo\" merge-base --is-ancestor \"$tip\" \"$sha\" 2>/dev/null; then\n case \"$st\" in\n OPEN) PR_ON_PR=1 ;;\n MERGED|CLOSED) PR_PUB=1 ;;\n esac\n fi\n done <<EOF\n$lines\nEOF\n}\n\n# True when commit SHA of SLUG is a published PR head: its PR is merged or\n# closed, or it is an open PR's current head.\ncommit_pr_published() {\n local slug=\"$1\" sha=\"$2\" lines\n gh_ok \"$slug\" || return 1\n lines=\"$(pr_lines_commit \"$slug\" \"$sha\")\"\n [ -n \"$lines\" ] || lines=\"$(pr_scan \"$slug\" | awk -F'\\t' -v s=\"$sha\" '$3 == s { print $2, $3 }')\"\n printf '%s\\n' \"$lines\" | awk -v s=\"$sha\" '\n $1 == \"MERGED\" || $1 == \"CLOSED\" || ($1 == \"OPEN\" && $2 == s) { found = 1 }\n END { exit !found }'\n}\n\n# The PR number a scratch review branch is named after (pr123, pr-123, pr/123,\n# review/pr123), or nothing.\nreview_pr() {\n printf '%s\\n' \"$1\" | sed -n -E 's#^(review/)?pr[-/]?([0-9]+)$#\\2#p'\n}\n\n# \"<STATE> <head sha>\" for PR number N, or nothing.\npr_by_number() {\n local slug=\"$1\" n=\"$2\"\n gh_ok \"$slug\" || return 0\n \"$GH\" api \"repos/$slug/pulls/$n\" \\\n --jq '\"\\(if .merged_at then \"MERGED\" else (.state | ascii_upcase) end) \\(.head.sha)\"' 2>/dev/null | head -n 1\n}\n\n# ------------------------------------------------------------- trust\n# Which git dirs this script lets run a network command with their own\n# config. A checkout found by scanning (inside another checkout, or inside a\n# build folder: a package that ships a .git in node_modules, a cache clone,\n# a bare mirror) has config anyone could have written, and `git ls-remote`\n# or `git fetch` with it runs whatever its remote URL (ext::), its\n# core.sshCommand or its insteadOf rewrite names. So:\n# - trusted: a checkout under ROOT that is in no other checkout and no\n# build folder (the clones and worktrees you made), or one outside ROOT\n# (a shared clone you named). Fetched into, and asked with ls-remote,\n# with its own config.\n# - untrusted: everything else. Never fetched into. Its config is read as\n# a file (config_safe), and any key outside a short list of inert ones\n# keeps it unread. Its remotes are asked only by URL, https or ssh,\n# from an empty repository with protocol and ssh pinned (safe_ls_remote),\n# plus what the trusted checkout around it was told by its remotes.\n#\n# checkout_trust DIR: sets TRUSTED (1 or 0) and TRUST_ANCHOR, the common git\n# dir of the outermost checkout under ROOT that DIR is inside (empty when\n# DIR is trusted, or when that checkout is itself in a build folder).\nTRUSTED=1\nTRUST_ANCHOR=\"\"\nin_build_folder() {\n local n\n for n in $REGENERABLE; do\n case \"/$1/\" in */\"$n\"/*) return 0 ;; esac\n done\n return 1\n}\n# marked_by_me DIR: the checkout at DIR carries an owner marker (marker_file)\n# that only you could have written: the marker is a regular file you own,\n# and the checkout, its git dir and the folder holding the marker are folders\n# you own that nobody else can write in. A marker alone proves nothing in a\n# shared root: anyone can write one into a repository they plant there.\nmarked_by_me() {\n local d=\"$1\" f gd\n f=\"$(marker_file \"$d\")\"\n [ -n \"$f\" ] && [ -f \"$f\" ] && [ ! -L \"$f\" ] || return 1\n [ -n \"$(find \"$f\" -maxdepth 0 -type f -user \"$MY_UID\" -print 2>/dev/null)\" ] || return 1\n private_dir \"$d\" || return 1\n private_dir \"$(dirname -- \"$f\")\" || return 1\n gd=\"$(git_dir_of \"$d\")\" && [ -n \"$gd\" ] || return 1\n gd=\"$(resolve_dir \"$gd\")\" || return 1\n private_dir \"$gd\"\n}\n\n# root_private: private_dir ROOT, asked once per run.\nROOT_PRIV=\"\"\nroot_private() {\n if [ -z \"$ROOT_PRIV\" ]; then\n if private_dir \"$ROOT\"; then ROOT_PRIV=1; else ROOT_PRIV=0; fi\n fi\n [ \"$ROOT_PRIV\" -eq 1 ]\n}\ncheckout_trust() {\n local d=\"$1\" p top=\"\"\n TRUSTED=1\n TRUST_ANCHOR=\"\"\n p=\"${d%/*}\"\n while [ -n \"$p\" ] && [ \"$p\" != \"$ROOT\" ]; do\n case \"$p/\" in \"$ROOT\"/*) ;; *) break ;; esac\n [ ! -e \"$p/.git\" ] || top=\"$p\"\n p=\"${p%/*}\"\n done\n case \"$d/\" in \"$ROOT\"/*) in_build_folder \"${d#\"$ROOT\"/}\" && TRUSTED=0 ;; esac\n [ -z \"$top\" ] || TRUSTED=0\n # In a root other users can write in ($TMPDIR or /tmp is often shared), a\n # checkout is trusted only when clone or worktree marked it (hygiene-owner,\n # marker_file): being a top-level folder there proves nothing, since anyone\n # can plant a repository whose config runs commands (agent-tools#279). In a\n # root only you can write in (private_dir), nobody else can have put it\n # there. Either way its config must still hold only inert keys before git\n # runs with it (remote_cache, fetch_checkout). Read from files: no git here.\n if [ \"$TRUSTED\" -eq 1 ] && ! root_private && ! marked_by_me \"$d\"; then\n TRUSTED=0\n fi\n if [ \"$TRUSTED\" -eq 0 ] && [ -n \"$top\" ] && ! in_build_folder \"${top#\"$ROOT\"/}\"; then\n TRUST_ANCHOR=\"$(common_git_dir \"$top\")\" || TRUST_ANCHOR=\"\"\n fi\n # A registered submodule of a trusted checkout (a gitlink or .gitmodules\n # path of it) is part of that checkout, its git dir made by git itself:\n # trusted while its config holds only inert keys (config_safe).\n # Decided from files alone: no git runs here.\n if [ \"$TRUSTED\" -eq 0 ] && [ -n \"$top\" ]; then\n local sp anchor=\"$TRUST_ANCHOR\" gd\n sp=\"$(enclosing_checkout \"$d\")\"\n gd=\"$(git_dir_of \"$d\")\"\n if [ -n \"$sp\" ] && [ -n \"$gd\" ] && submodule_by_files \"$sp\" \"$d\" \"$gd\"; then\n checkout_trust \"$sp\"\n if [ \"$TRUSTED\" -eq 1 ] && config_safe \"$gd\" \"$d\"; then\n TRUST_ANCHOR=\"\"\n return 0\n fi\n fi\n TRUSTED=0\n TRUST_ANCHOR=\"$anchor\"\n fi\n return 0\n}\n\n# The git dir of the checkout at DIR read from files: DIR/.git when it is a\n# folder, else the folder its .git file names; empty when there is none.\n# Exit status 2 when its .git is malformed (gitfile_dir).\ngit_dir_of() {\n if [ -d \"$1/.git\" ]; then printf '%s\\n' \"$1/.git\"; else gitfile_dir \"$1\"; fi\n}\n\n# The nearest folder above DIR with a .git in it (file or folder), read from\n# the folders; empty when there is none.\nenclosing_checkout() {\n local p=\"${1%/*}\"\n while [ -n \"$p\" ]; do\n [ ! -e \"$p/.git\" ] || { printf '%s\\n' \"$p\"; return 0; }\n p=\"${p%/*}\"\n done\n return 0\n}\n\n# submodule_by_files PARENT DIR GITDIR: true when DIR is a submodule of the\n# checkout at PARENT by its files: GITDIR is under PARENT's .git/modules/,\n# or DIR's path is a submodule path in PARENT's .gitmodules (cfg_file).\nsubmodule_by_files() {\n local sp=\"$1\" d=\"$2\" gd pg rec rel nl='\n'\n gd=\"$(resolve_dir \"$3\")\" || return 1\n pg=\"$(git_dir_of \"$sp\")\"\n [ -z \"$pg\" ] || pg=\"$(resolve_dir \"$pg\")\" || pg=\"\"\n if [ -n \"$pg\" ]; then\n case \"$gd/\" in \"$pg/modules/\"*) return 0 ;; esac\n fi\n rel=\"${d#\"$sp\"/}\"\n [ \"$rel\" != \"$d\" ] && [ -f \"$sp/.gitmodules\" ] || return 1\n while IFS= read -r -d '' rec; do\n [ \"${rec#*\"$nl\"}\" != \"$rel\" ] || return 0\n done < <(cfg_file \"$sp/.gitmodules\" -z --get-regexp '^submodule\\..*\\.path$' 2>/dev/null)\n return 1\n}\n\n# scan_ok DIR: true when git may run with the checkout at DIR as its\n# repository: it is trusted (checkout_trust), or its git dir (read from\n# files) and any commondir it names hold only inert config (config_safe).\n# Sets CFG_WHY when not.\nscan_ok() {\n local gd\n CFG_WHY=\"\"\n checkout_trust \"$1\"\n [ \"$TRUSTED\" -eq 0 ] || return 0\n gd=\"$(git_dir_of \"$1\")\" || { CFG_WHY=\"a malformed .git file in $1\"; return 1; }\n [ -n \"$gd\" ] && [ -d \"$gd\" ] || { CFG_WHY=\"no git dir to read at $1\"; return 1; }\n config_safe \"$gd\" \"$1\"\n}\n\n# True when KEY (as `git config --list` prints it) is inert: nothing any git\n# command this script runs would execute or fetch because of it.\nsafe_key() {\n case \"$1\" in\n core.repositoryformatversion | core.filemode | core.bare | core.logallrefupdates | \\\n core.ignorecase | core.precomposeunicode | core.symlinks | core.sparsecheckout | \\\n core.sparsecheckoutcone | core.autocrlf | core.eol | core.safecrlf | core.checkstat | \\\n core.trustctime | core.quotepath | core.abbrev | core.compression | \\\n core.loosecompression | core.splitindex | core.untrackedcache | core.commitgraph | \\\n core.multipackindex | core.preloadindex | core.longpaths | core.protectntfs | \\\n core.protecthfs) return 0 ;;\n remote.*.url | remote.*.pushurl | remote.*.fetch | remote.*.push | remote.*.tagopt | \\\n remote.*.prune | remote.*.prunetags | remote.*.mirror | \\\n remote.*.skipdefaultupdate | remote.*.skipfetchall) return 0 ;;\n branch.*.remote | branch.*.merge | branch.*.rebase | branch.*.pushremote | \\\n branch.*.description) return 0 ;;\n submodule.*.url | submodule.*.active | submodule.*.ignore | submodule.*.branch | \\\n submodule.active) return 0 ;;\n # Not extensions.partialclone: it makes a remote a promisor that git\n # fetches missing objects from (a transport).\n extensions.objectformat | extensions.worktreeconfig | extensions.refstorage | \\\n extensions.preciousobjects | extensions.noop) return 0 ;;\n diff.ignoresubmodules | diff.renames | diff.algorithm | status.* | color.* | advice.* | \\\n gc.* | pack.* | index.* | fetch.* | init.* | user.* | i18n.* | pull.* | \\\n push.default | maintenance.* | lfs.repositoryformatversion) return 0 ;;\n esac\n return 1\n}\n\n# config_safe GITDIR [CHECKOUT] [nocommon]: true when every config file of\n# GITDIR (config, config.worktree, a worktree's or a submodule's under it)\n# holds only inert keys (safe_key). Read as files (`git config --file`,\n# which follows no include): an include, a filter, a textconv, a transport\n# setting, a promisor or a hook path is a reason to run nothing there.\n# - commondir: git reads the config, refs and objects of the dir it names,\n# wherever that is. With \"nocommon\" (a bare git dir found by scanning)\n# any commondir refuses; otherwise the dir it names is checked too, and\n# a commondir there refuses.\n# - objects/info/alternates: objects from another dir; refused.\n# - core.worktree: points status, ls-files and attributes at another\n# tree. Allowed only when it resolves to CHECKOUT or a folder inside it\n# (a submodule's git dir names its own checkout); refused otherwise.\n# Sets CFG_WHY to the first refusal.\nCFG_WHY=\"\"\nconfig_safe() {\n local g=\"$1\" co=\"${2:-}\" mode=\"${3:-}\" f keys key cd wt base\n CFG_WHY=\"\"\n if [ -e \"$g/commondir\" ]; then\n [ \"$mode\" != nocommon ] || { CFG_WHY=\"a commondir file in $g\"; return 1; }\n # Parsed exactly as git does; a CR, an embedded newline or an empty\n # value is a shape a loose read would disagree with git on: refuse it.\n cd=\"$(git_one_line \"$g/commondir\")\" ||\n { CFG_WHY=\"a malformed commondir file in $g\"; return 1; }\n case \"$cd\" in /*) ;; *) cd=\"$g/$cd\" ;; esac\n cd=\"$(resolve_dir \"$cd\")\" || { CFG_WHY=\"a commondir file in $g naming no folder\"; return 1; }\n config_safe \"$cd\" \"$co\" nocommon || return 1\n fi\n if [ -s \"$g/objects/info/alternates\" ]; then\n CFG_WHY=\"$g/objects/info/alternates\"\n return 1\n fi\n # A hook git would run (anything in hooks/ but git's own *.sample files):\n # git_user commands run with the caller's config, so hooksPath alone does\n # not keep a planted hook from running (agent-tools#279).\n if [ -d \"$g/hooks\" ]; then\n local hook\n hook=\"$(find \"$g/hooks\" -mindepth 1 ! -name '*.sample' ! -type d -print 2>/dev/null | head -n 1)\"\n [ -z \"$hook\" ] || { CFG_WHY=\"a hook in $g/hooks: $hook\"; return 1; }\n fi\n while IFS= read -r f; do\n [ -n \"$f\" ] && [ -f \"$f\" ] || continue\n keys=\"$(cfg_file \"$f\" --name-only --list 2>/dev/null)\" ||\n { CFG_WHY=\"$f cannot be read\"; return 1; }\n while IFS= read -r key; do\n [ -n \"$key\" ] || continue\n if [ \"$key\" = core.worktree ]; then\n wt=\"$(cfg_file \"$f\" --get core.worktree 2>/dev/null)\"\n base=\"${f%/*}\"\n case \"$wt\" in /*) ;; *) wt=\"$base/$wt\" ;; esac\n wt=\"$(resolve_dir \"$wt\")\" || wt=\"\"\n if [ -n \"$co\" ] && [ -n \"$wt\" ]; then\n case \"$wt/\" in \"$co\"/*) continue ;; esac\n fi\n CFG_WHY=\"core.worktree in $f, outside the checkout\"\n return 1\n fi\n safe_key \"$key\" || { CFG_WHY=\"$key in $f\"; return 1; }\n done <<EOF\n$keys\nEOF\n done <<EOF\n$g/config\n$g/config.worktree\n$(find \"$g/modules\" \"$g/worktrees\" \\( -name config -o -name config.worktree \\) -type f 2>/dev/null)\nEOF\n return 0\n}\n\n# config_safe_tree DIR: config_safe for every git dir of DIR and of every\n# checkout inside it (git status recurses into submodules before the\n# checkouts inside are audited on their own). Sets CFG_WHY.\nconfig_safe_tree() {\n local d=\"$1\" g gd\n while IFS= read -r g; do\n [ -n \"$g\" ] || continue\n g=\"$d/${g#./}\"\n if [ -d \"$g\" ]; then\n gd=\"$g\"\n else\n # Fails closed: a .git that is not a well-formed gitfile is refused,\n # never skipped.\n gd=\"$(gitfile_dir \"${g%/.git}\")\" && [ -n \"$gd\" ] ||\n { CFG_WHY=\"a malformed .git file in ${g%/.git}\"; return 1; }\n fi\n # Its commondir, a linked worktree's clone, is checked with it.\n config_safe \"$gd\" \"$d\" || return 1\n done < <(cd \"$d\" 2>/dev/null && find . -name .git -print -prune 2>/dev/null)\n return 0\n}\n\n# True when URL is one this script may ask from a neutral repository: https\n# or ssh (ssh:// or user@host:path), no option-looking host or path, no\n# transport helper (ext::, fd::, anything with ::), no local path.\nurl_ok() {\n case \"$1\" in\n '' | -* | *::* | *[[:space:]]* | *@-* | *//-*) return 1 ;;\n https://?*) return 0 ;;\n ssh://?*) return 0 ;;\n esac\n printf '%s\\n' \"$1\" | grep -Eq '^[A-Za-z0-9._][A-Za-z0-9._-]*@[A-Za-z0-9.][A-Za-z0-9.-]*:[^:/-]'\n}\n\n# safe_ls_remote URL: `git ls-remote -- URL` from an empty repository made\n# for the run, with no system or global config (so no insteadOf, no\n# credential helper), only https and ssh allowed, ssh as plain ssh in batch\n# mode, and no prompt.\nSAFE_REPO=\"\"\nsafe_ls_remote() {\n url_ok \"$1\" || return 1\n if [ -z \"$SAFE_REPO\" ]; then\n SAFE_REPO=\"$REMOTE_DIR/neutral\"\n GIT_CONFIG_NOSYSTEM=1 GIT_CONFIG_GLOBAL=/dev/null git init -q --template= \"$SAFE_REPO\" >/dev/null 2>&1 ||\n { SAFE_REPO=\"\"; return 1; }\n fi\n (\n unset GIT_SSH GIT_SSH_COMMAND GIT_SSH_VARIANT GIT_ASKPASS SSH_ASKPASS GIT_PROXY_COMMAND GIT_DIR GIT_WORK_TREE\n GIT_CONFIG_NOSYSTEM=1 GIT_CONFIG_GLOBAL=/dev/null GIT_TERMINAL_PROMPT=0 \\\n git -C \"$SAFE_REPO\" -c protocol.allow=never -c protocol.https.allow=always \\\n -c protocol.ssh.allow=always -c core.sshCommand=\"ssh -o BatchMode=yes\" \\\n -c credential.helper= ls-remote -- \"$1\"\n )\n}\n\n# What counts as \"on a remote\" is asked of the remote itself, never read off\n# the clone's own refs: a remote-tracking ref outlives the branch it tracked\n# (deleted upstream, a fetch that failed or never ran), so it proves nothing.\n#\n# remote_cache GITDIR: the path prefix of this run's cache for the git dir\n# (a clone's common dir, or a bare git dir), built on first use by running\n# `git ls-remote` against each of its remotes:\n# <prefix>.shas every commit a reachable remote names (branch and tag\n# tips, peeled tags, and on GitHub refs/pull/*), that this\n# clone has locally\n# <prefix>.urls the fetch URL of each reachable remote (insteadOf applied,\n# a trailing / and .git dropped), for FETCH_HEAD\n# <prefix>.bad the remotes that could not be reached\n# A remote that cannot be reached vouches for nothing, so work that only it\n# would cover is kept. Never prompts: no terminal, ssh in batch mode.\nremote_cache() {\n local gd=\"$1\" f r url safe=1 co\n f=\"$REMOTE_DIR/$(printf '%s' \"$gd\" | cksum | tr ' ' '-')\"\n if [ ! -f \"$f.done\" ]; then\n : >\"$f.all\"\n : >\"$f.urls\"\n : >\"$f.bad\"\n # Trusted or not, no git runs with a config holding a key that could run\n # something (config_safe, agent-tools#279): its remotes then vouch for\n # nothing, so its work is kept.\n # A clone's git dir is <checkout>/.git: a submodule's core.worktree may\n # name a folder inside that checkout, as git writes it.\n # A submodule's git dir is <checkout>/.git/modules/<name>, and its\n # core.worktree names a folder inside that same checkout.\n case \"$gd\" in\n */.git/modules/*) co=\"${gd%%/.git/modules/*}\" ;;\n */.git) co=\"${gd%/.git}\" ;;\n *) co=\"\" ;;\n esac\n if ! config_safe \"$gd\" \"$co\"; then\n safe=0\n note \"not asking the remotes of $gd: $CFG_WHY\"\n fi\n while IFS= read -r r; do\n [ -n \"$r\" ] || continue\n # A remote named like an option is never passed to git.\n case \"$r\" in -*) printf '%s\\n' \"$r\" >>\"$f.bad\"; continue ;; esac\n if [ \"$safe\" -eq 1 ] && GIT_TERMINAL_PROMPT=0 GIT_SSH_COMMAND=\"${GIT_SSH_COMMAND:-ssh -o BatchMode=yes}\" \\\n git --git-dir=\"$gd\" -c protocol.file.allow=\"$FILE_PROTO\" -c protocol.https.allow=always \\\n -c protocol.http.allow=always -c protocol.ssh.allow=always -c protocol.git.allow=always \\\n -c \"remote.$r.uploadpack=git-upload-pack\" \"${CRED_PINS[@]}\" \\\n ls-remote -- \"$r\" >\"$f.ls\" 2>/dev/null; then\n awk '{ print $1 }' \"$f.ls\" >>\"$f.all\"\n url=\"$(git --git-dir=\"$gd\" ls-remote --get-url -- \"$r\" 2>/dev/null)\" && [ -n \"$url\" ] &&\n norm_url \"$url\" >>\"$f.urls\"\n else\n printf '%s\\n' \"$r\" >>\"$f.bad\"\n fi\n done <<EOF\n$(cfg_file \"$gd/config\" --get-regexp '^remote\\..*\\.url$' 2>/dev/null | awk '{ k = $1; sub(/^remote\\./, \"\", k); sub(/\\.url$/, \"\", k); print k }' | sort -u)\nEOF\n # Only what this clone holds as a commit can be named to rev-list.\n # No git at all with a config that failed config_safe, cat-file included.\n if [ \"$safe\" -eq 1 ]; then\n awk '/^[0-9a-f]+$/' \"$f.all\" | sort -u |\n git --git-dir=\"$gd\" cat-file --batch-check='%(objectname) %(objecttype)' 2>/dev/null |\n awk '$2 == \"commit\" { print $1 }' >\"$f.shas\"\n else\n : >\"$f.all\"\n : >\"$f.shas\"\n fi\n : >\"$f.done\"\n fi\n printf '%s\\n' \"$f\"\n}\n\n# untrusted_cache GITDIR ANCHOR: remote_cache's files for a git dir this\n# script found by scanning (checkout_trust). No git runs with its config\n# for a remote: what counts is what ANCHOR's remotes (the trusted checkout\n# around it) answered, and what each of its own remote URLs answers when\n# asked by URL alone (safe_ls_remote: https or ssh only). A URL that is\n# refused or does not answer goes in <prefix>.bad.\nuntrusted_cache() {\n local gd=\"$1\" anchor=\"$2\" f af key url\n f=\"$REMOTE_DIR/u$(printf '%s|%s' \"$gd\" \"$anchor\" | cksum | tr ' ' '-')\"\n if [ ! -f \"$f.done\" ]; then\n : >\"$f.all\"\n : >\"$f.urls\"\n : >\"$f.bad\"\n if [ -n \"$anchor\" ]; then\n af=\"$(remote_cache \"$anchor\")\"\n cat \"$af.all\" >>\"$f.all\"\n cat \"$af.urls\" >>\"$f.urls\"\n fi\n while IFS=' ' read -r key url; do\n [ -n \"$key\" ] || continue\n key=\"${key#remote.}\"\n key=\"${key%.url}\"\n if safe_ls_remote \"$url\" >\"$f.ls\" 2>/dev/null; then\n awk '{ print $1 }' \"$f.ls\" >>\"$f.all\"\n norm_url \"$url\" >>\"$f.urls\"\n else\n printf '%s\\n' \"$key\" >>\"$f.bad\"\n fi\n done <<EOF\n$(cfg_file \"$gd/config\" --get-regexp '^remote\\..*\\.url$' 2>/dev/null)\nEOF\n awk '/^[0-9a-f]+$/' \"$f.all\" | sort -u |\n git --git-dir=\"$gd\" cat-file --batch-check='%(objectname) %(objecttype)' 2>/dev/null |\n awk '$2 == \"commit\" { print $1 }' >\"$f.shas\"\n : >\"$f.done\"\n fi\n printf '%s\\n' \"$f\"\n}\n\n# cache_for DIR: the remote cache that judges the checkout at DIR: its own\n# remotes when it is trusted, else untrusted_cache (checkout_trust).\ncache_for() {\n local cd\n cd=\"$(common_git_dir \"$1\")\" || return 1\n checkout_trust \"$1\"\n if [ \"$TRUSTED\" -eq 1 ]; then\n remote_cache \"$cd\"\n else\n untrusted_cache \"$cd\" \"$TRUST_ANCHOR\"\n fi\n}\n\n# Forget GITDIR's cached remote state (after a fetch changed what it holds).\nremote_cache_drop() {\n rm -f -- \"$REMOTE_DIR/$(printf '%s' \"$1\" | cksum | tr ' ' '-')\".*\n}\n\n# A fetch URL without a trailing / or .git, as FETCH_HEAD records it.\nnorm_url() {\n local u=\"$1\"\n u=\"${u%/}\"\n u=\"${u%.git}\"\n printf '%s\\n' \"$u\"\n}\n\n# The remotes of the checkout at DIR that could not be reached, space-separated.\nunreachable_remotes() {\n local f\n f=\"$(cache_for \"$1\")\" || return 0\n tr '\\n' ' ' <\"$f.bad\" | sed 's/ *$//'\n}\n\n# The commits \"on a remote\" for the checkout at DIR, one SHA per line:\n# everything a reachable remote names (remote_cache); commits in DIR's\n# FETCH_HEAD fetched from one of those remotes' URLs (a clone fetched by SHA,\n# `git fetch origin <sha>`, as a pinned cache does, has no ref naming it;\n# a line from any other source, `git fetch . feat` included, proves\n# nothing); and the commit a worktree started from, when it is published\n# (from_published). FETCH_HEAD is found with --git-path: in a linked\n# worktree .git is a file, and each worktree has its own.\non_remote() {\n local fh f sha rest src\n f=\"$(cache_for \"$1\")\" || return 0\n cat \"$f.shas\"\n fh=\"$(git -C \"$1\" rev-parse --git-path FETCH_HEAD 2>/dev/null)\" || fh=\"\"\n case \"$fh\" in '' | /*) ;; *) fh=\"$1/$fh\" ;; esac\n if [ -n \"$fh\" ] && [ -f \"$fh\" ] && [ -s \"$f.urls\" ]; then\n # \"<sha>\\t[not-for-merge]\\t<what> of <url>\". Split by hand: tab is\n # whitespace to read, so IFS would fold the empty middle field away.\n while IFS= read -r rest; do\n sha=\"${rest%%\t*}\"\n rest=\"${rest#*\t}\"\n rest=\"${rest#*\t}\"\n case \"$sha\" in *[!0-9a-f]* | '') continue ;; esac\n [ \"${#sha}\" -ge 40 ] || continue\n # \"<what> of <url>\": the URL is what follows the last \" of \".\n src=\"$(norm_url \"${rest##* of }\")\"\n [ \"$src\" != \"$rest\" ] || continue\n grep -Fxq -- \"$src\" \"$f.urls\" || continue\n git -C \"$1\" cat-file -e \"$sha^{commit}\" 2>/dev/null && printf '%s\\n' \"$sha\"\n done <\"$fh\"\n fi\n from_published \"$1\"\n}\n\n# excl_file DIR: a new file of \"^<sha>\" lines, one per commit on_remote\n# names, for `git rev-list --stdin` (a list that may run to thousands of\n# refs/pull heads never goes on a command line). Prints its path.\nexcl_file() {\n local x\n x=\"$(mktemp \"$REMOTE_DIR/excl.XXXXXX\")\" || return 1\n on_remote \"$1\" | sort -u | sed 's/^/^/' >\"$x\"\n printf '%s\\n' \"$x\"\n}\n\n# unpublished_count DIR EXCL REV...: how many commits REV... reach that no\n# remote does, or empty when git cannot say (a missing object, say), which\n# callers keep.\nunpublished_count() {\n local repo=\"$1\" x=\"$2\" n\n shift 2\n n=\"$(git -C \"$repo\" rev-list --count --stdin \"$@\" <\"$x\" 2>/dev/null)\" || n=\"\"\n case \"$n\" in '' | *[!0-9]*) n=\"\" ;; esac\n printf '%s\\n' \"$n\"\n}\n# The commit that `worktree` recorded as a worktree's start (hygiene-from in\n# its git dir, \"<sha>\" or \"<sha> remote\"), when it is published. A review\n# worktree starts from FETCH_HEAD after `git fetch origin pull/<N>/head`, and\n# close's own fetch overwrites FETCH_HEAD, so the record is what proves it.\n# Published means: it was on the remote when the worktree was made\n# (\"remote\"), or its PR is merged or closed, or it is an open PR's head (a\n# squash-merged or fork PR head is on no remote branch).\nfrom_published() {\n local gd sha how\n gd=\"$(git -C \"$1\" rev-parse --absolute-git-dir 2>/dev/null)\" || return 0\n [ -f \"$gd/hygiene-from\" ] || return 0\n read -r sha how <\"$gd/hygiene-from\" || [ -n \"${sha:-}\" ] || return 0\n case \"$sha\" in '' | *[!0-9a-f]*) return 0 ;; esac\n git -C \"$1\" cat-file -e \"$sha^{commit}\" 2>/dev/null || return 0\n if [ \"${how:-}\" = remote ] || commit_pr_published \"$(origin_slug \"$1\")\" \"$sha\"; then\n printf '%s\\n' \"$sha\"\n fi\n}\n\n# patches_on_remote DIR EXCL TIP [NOT...]: true when every commit TIP reaches\n# that no remote does (and NOT... do not) is already on a remote as the same\n# change: an equal `git patch-id --stable` (a rebase or a one-commit squash\n# merge keeps the change, not the SHA). A matching subject proves nothing.\n# Merges and empty commits have no patch-id, so they are never matched, and\n# binary changes are compared in full (--binary), never as \"Binary files\n# differ\". The remote side is the commits a reachable remote names that TIP\n# does not reach, at most 20000 of them: past that, nothing is matched.\npatches_on_remote() {\n local repo=\"$1\" x=\"$2\" tip=\"$3\" cand pos want have\n shift 3\n cand=\"$(git -C \"$repo\" rev-list --stdin \"$tip\" \"$@\" <\"$x\" 2>/dev/null)\" || return 1\n [ -n \"$cand\" ] || return 0\n # A merge has no patch of its own to match.\n [ -z \"$(printf '%s\\n' \"$cand\" | git -C \"$repo\" rev-list --no-walk --merges --stdin 2>/dev/null)\" ] || return 1\n pos=\"$(mktemp \"$REMOTE_DIR/pos.XXXXXX\")\" || return 1\n sed 's/^\\^//' \"$x\" >\"$pos\"\n printf '^%s\\n' \"$tip\" >>\"$pos\"\n have=\"$(git -C \"$repo\" rev-list --no-merges --max-count=20000 --stdin <\"$pos\" 2>/dev/null)\" || have=\"\"\n rm -f -- \"$pos\"\n # Never `git log --stdin` an empty list: with no revision it shows HEAD.\n [ -n \"$have\" ] || return 1\n have=\"$(printf '%s\\n' \"$have\" |\n git -C \"$repo\" log --no-walk=unsorted --stdin -p --binary --no-textconv --no-ext-diff --format='commit %H' 2>/dev/null |\n git -C \"$repo\" patch-id --stable 2>/dev/null | awk '{ print $1 }' | sort -u)\"\n want=\"$(printf '%s\\n' \"$cand\" |\n git -C \"$repo\" log --no-walk=unsorted --stdin -p --binary --no-textconv --no-ext-diff --format='commit %H' 2>/dev/null |\n git -C \"$repo\" patch-id --stable 2>/dev/null)\"\n # Every candidate needs a patch-id (an empty commit has none) ...\n [ \"$(printf '%s\\n' \"$want\" | grep -c .)\" -eq \"$(printf '%s\\n' \"$cand\" | grep -c .)\" ] || return 1\n # ... and each must be on the remote side.\n printf '%s\\n' \"$want\" | awk '{ print $1 }' | while IFS= read -r p; do\n printf '%s\\n' \"$have\" | grep -Fxq -- \"$p\" || { echo missing; break; }\n done | grep -q missing && return 1\n return 0\n}\n\n# True when DIR is a linked worktree: its .git is a file pointing at a git dir\n# under another clone's .git/worktrees/ (a submodule's has no commondir).\nis_linked_worktree() {\n local gd\n [ -f \"$1/.git\" ] || return 1\n gd=\"$(git -C \"$1\" rev-parse --absolute-git-dir 2>/dev/null)\" || return 1\n [ -f \"$gd/commondir\" ]\n}\n\n# other_refs DIR EXCL: for a clone, every ref other than its branches, HEAD\n# and the stash (judged on their own): tags, notes, remote-tracking refs\n# (one whose branch is gone upstream holds commits nothing else may) and any\n# other namespace. Each one reaching a commit no remote names is a reason\n# (audit_clone's add). Deleting the clone deletes them all.\nother_refs() {\n local repo=\"$1\" x=\"$2\" ref n\n while IFS= read -r ref; do\n case \"$ref\" in '' | refs/heads/* | refs/stash) continue ;; esac\n n=\"$(unpublished_count \"$repo\" \"$x\" \"$ref\")\"\n if [ -z \"$n\" ]; then\n add \"$ref: git cannot list its commits\"\n elif [ \"$n\" -gt 0 ]; then\n add \"$ref: $n commit(s) on no remote\"\n fi\n done <<EOF\n$(git -C \"$repo\" for-each-ref --format='%(refname)' 2>/dev/null)\nEOF\n}\n\n# hidden_edits DIR: how many tracked files git status cannot see edited: an\n# entry marked --assume-unchanged (ls-files -v: a lowercase tag) or\n# --skip-worktree (S) whose file is in the work tree and differs from the\n# index. A skip-worktree file a sparse checkout left out is not there, and\n# is not counted. Empty when git cannot say.\nhidden_edits() {\n local repo=\"$1\" rec tag path n=0 idx cur\n while IFS= read -r -d '' rec; do\n tag=\"${rec%% *}\"\n path=\"${rec#* }\"\n case \"$tag\" in [a-z] | S) ;; *) continue ;; esac\n [ -e \"$repo/$path\" ] || [ -L \"$repo/$path\" ] || continue\n if [ -f \"$repo/$path\" ] && [ ! -L \"$repo/$path\" ]; then\n idx=\"$(git -C \"$repo\" rev-parse -q --verify \":$path\" 2>/dev/null)\" || idx=\"\"\n cur=\"$(git -C \"$repo\" hash-object --path=\"$path\" -- \"$repo/$path\" 2>/dev/null)\" || cur=\"\"\n [ -n \"$idx\" ] && [ \"$idx\" = \"$cur\" ] && continue\n fi\n n=$((n + 1))\n done < <(git -C \"$repo\" ls-files -v -z 2>/dev/null)\n printf '%s\\n' \"$n\"\n}\n\n# Build output an ignored path may be part of, by name: the regenerable\n# folders prune removes, and the usual output and cache folders and files.\n# An ignored file anywhere else (.env, notes kept out of git) is work.\nIGNORED_OK=\"$REGENERABLE dist build .svelte-kit .vite .parcel-cache .cache-loader coverage .nyc_output __pycache__ .pytest_cache .mypy_cache .ruff_cache .venv venv .tox .gradle .eslintcache .DS_Store\"\n\n# True when the relative PATH is build output: a component of it is named\n# in IGNORED_OK, or it ends in .tsbuildinfo, .pyc or .log.\nignored_ok() {\n local p=\"/$1/\" n\n case \"$p\" in *.tsbuildinfo/ | *.pyc/ | *.log/) return 0 ;; esac\n for n in $IGNORED_OK; do\n case \"$p\" in */\"$n\"/*) return 0 ;; esac\n done\n return 1\n}\n\n# ignored_work DIR: up to three ignored paths in DIR that are not build\n# output (ignored_ok), comma-separated; empty when there are none. An\n# ignored folder is looked into (git names it as a whole), skipping build\n# folders and any checkout inside it (deletion_gate audits those on their\n# own). A path git cannot list makes it \"(git status failed)\".\nignored_work() {\n local repo=\"$1\" rec path found=\"\" k=0 hit\n while IFS= read -r -d '' rec; do\n case \"$rec\" in '!! '*) ;; *) continue ;; esac\n path=\"${rec#!! }\"\n ignored_ok \"${path%/}\" && continue\n case \"$path\" in\n */)\n [ -d \"$repo/$path\" ] || continue\n # A checkout of its own: judged by deletion_gate, not here.\n [ ! -e \"$repo/$path.git\" ] || continue\n hit=\"$(ignored_in \"$repo/${path%/}\")\"\n [ -n \"$hit\" ] || continue\n path=\"${path}${hit#./}\" ;;\n esac\n found=\"${found:+$found, }$path\"\n k=$((k + 1))\n [ \"$k\" -lt 3 ] || break\n done < <(git -C \"$repo\" status --porcelain -z --ignored=matching --untracked-files=all 2>/dev/null ||\n printf '!! (git status failed)\\0')\n printf '%s\\n' \"$found\"\n}\n\n# The first file in the ignored folder DIR that is not build output, outside\n# any checkout inside it, relative to DIR (\"./x\"); empty when there is none.\n# Searched from inside DIR, so its name is never read as a pattern.\nignored_in() {\n local f names=\"\"\n for f in $IGNORED_OK; do names=\"$names -o -name $f\"; done\n # shellcheck disable=SC2086 # $names is a fixed list of plain words\n (cd \"$1\" 2>/dev/null && find . -type d \\( -false $names -o -exec sh -c 'test -e \"$1/.git\"' sh '{}' ';' \\) -prune \\\n -o \\( -type f -o -type l \\) ! -name '*.pyc' ! -name '*.log' ! -name '*.tsbuildinfo' ! -name .DS_Store -print 2>/dev/null) |\n head -n 1\n}\n\n# The checks of audit_clone, for a checkout git reads as its own. Runs in\n# audit_clone's scope: it reads and sets that function's locals (repo,\n# linked, top, status, reasons, safe, wtlist, ...) and calls its add and\n# add_wt.\naudit_checks() {\n # A status that fails (a worktree whose git dir is gone, a broken clone)\n # proves nothing, so it is never CLEAN. Every untracked file counts, and so\n # does every submodule change, whatever status.showUntrackedFiles,\n # submodule.<name>.ignore or diff.ignoreSubmodules say.\n if status=\"$(git -C \"$repo\" status --porcelain --untracked-files=all --ignore-submodules=none 2>/dev/null)\"; then\n dirty=\"$(printf '%s' \"$status\" | grep -c .)\"\n [ \"$dirty\" -eq 0 ] || add \"$dirty uncommitted change(s)\"\n else\n add \"git status failed (a broken clone, or a worktree whose clone is gone)\"\n fi\n # Read once: the worktrees below, and the scratch branches checked out.\n wtlist=\"$(git -C \"$repo\" worktree list --porcelain 2>/dev/null)\"\n # Deleting a clone cuts its linked worktrees off from their git data, so a\n # clone with a worktree still checked out is kept.\n if [ -d \"$repo/.git\" ]; then\n while IFS= read -r wt; do\n [ -n \"$wt\" ] && [ -d \"$wt\" ] || continue\n wtr=\"$(resolve_dir \"$wt\")\"\n [ \"$wtr\" != \"$repo\" ] || continue\n # Removed by this sweep already (or, in a dry run, it would be).\n ! in_swept \"$wtr\" || continue\n add_wt \"worktree $wt is still checked out (git worktree remove it first)\"\n HOLDERS=\"${HOLDERS}worktree\t$wt\n\"\n done <<EOF\n$(printf '%s\\n' \"$wtlist\" | sed -n 's/^worktree //p')\nEOF\n fi\n # Edits git status cannot see, and ignored files that are not build output.\n hidden=\"$(hidden_edits \"$repo\")\"\n [ \"$hidden\" = 0 ] || add \"${hidden:-some} tracked file(s) edited under --assume-unchanged or --skip-worktree (git status hides them)\"\n ignored=\"$(ignored_work \"$repo\")\"\n [ -z \"$ignored\" ] || add \"ignored file(s) that are not build output: $ignored\"\n # What a reachable remote names (on_remote), as \"^<sha>\" lines for\n # rev-list --stdin. A remote that cannot be reached vouches for nothing.\n excl=\"$(excl_file \"$repo\")\" || { add \"could not make a temp file to judge it\"; return 0; }\n unreach=\"$(unreachable_remotes \"$repo\")\"\n # A worktree shares its clone's stashes, branches, tags and other refs,\n # and removing it touches none of them: judge only what is checked out in\n # it.\n if [ \"$linked\" -eq 0 ]; then\n stashes=\"$(git -C \"$repo\" stash list 2>/dev/null | wc -l | tr -d ' ')\"\n [ \"$stashes\" -eq 0 ] || add \"$stashes stash(es)\"\n other_refs \"$repo\" \"$excl\"\n fi\n if git -C \"$repo\" rev-parse -q --verify HEAD >/dev/null 2>&1 &&\n ! git -C \"$repo\" symbolic-ref -q HEAD >/dev/null 2>&1; then\n n=\"$(unpublished_count \"$repo\" \"$excl\" HEAD)\"\n if [ -z \"$n\" ]; then\n add \"detached HEAD: git cannot list its commits\"\n elif [ \"$n\" -gt 0 ] && ! patches_on_remote \"$repo\" \"$excl\" HEAD; then\n add \"detached HEAD with $n commit(s) on no remote\"\n fi\n fi\n\n slug=\"$(origin_slug \"$repo\")\"\n if [ \"$linked\" -eq 1 ]; then\n branches=\"$(git -C \"$repo\" symbolic-ref -q --short HEAD 2>/dev/null)\"\n else\n branches=\"$(git -C \"$repo\" for-each-ref --format='%(refname:short)' refs/heads 2>/dev/null)\"\n fi\n while IFS= read -r b; do\n [ -n \"$b\" ] || continue\n n=\"$(unpublished_count \"$repo\" \"$excl\" \"refs/heads/$b\")\"\n [ -n \"$n\" ] || { add \"$b: git cannot list its commits\"; continue; }\n # A scratch review branch (`git fetch origin pull/<N>/head:pr<N>`): its\n # commits live on GitHub as the PR's head, not under refs/remotes. Up to\n # that head it is published; once the PR is merged or closed it is\n # scratch that is safe to delete.\n pr=\"$(review_pr \"$b\")\"\n rv=\"\"\n [ -z \"$pr\" ] || rv=\"$(pr_by_number \"$slug\" \"$pr\")\"\n if [ -n \"$rv\" ]; then\n head=\"${rv#* }\"\n tip=\"$(git -C \"$repo\" rev-parse -q --verify \"refs/heads/$b^{commit}\" 2>/dev/null)\"\n beyond=\"\"\n if [ \"$tip\" = \"$head\" ]; then\n beyond=0\n elif git -C \"$repo\" cat-file -e \"$head^{commit}\" 2>/dev/null; then\n beyond=\"$(unpublished_count \"$repo\" \"$excl\" \"refs/heads/$b\" \"^$head\")\"\n [ -n \"$beyond\" ] || beyond=1\n fi\n if [ \"$beyond\" = 0 ]; then\n case \"${rv%% *}\" in\n MERGED|CLOSED) safe=\"${safe}$b\t$pr\t${rv%% *}\n\" ;;\n esac\n continue\n elif [ -n \"$beyond\" ]; then\n patches_on_remote \"$repo\" \"$excl\" \"refs/heads/$b\" \"^$head\" ||\n add \"$b: $beyond commit(s) beyond PR #$pr's head, on no remote\"\n continue\n fi\n fi\n [ \"$n\" -gt 0 ] || continue # every commit is on a remote: published\n pr_state \"$repo\" \"$slug\" \"$b\"\n # Published by its merged or closed PR (a squash merge leaves the SHAs\n # local-only), but only up to that PR's head: never a commit made after.\n [ \"$PR_PUB\" -eq 0 ] || continue\n [ \"$PR_ON_PR\" -eq 0 ] || continue # its tip is on its open PR (a fork's head is under no remote ref)\n patches_on_remote \"$repo\" \"$excl\" \"refs/heads/$b\" && continue\n case \"$PR_ST\" in\n OPEN) add \"$b: $n commit(s) not pushed to its open PR\" ;;\n MERGED|CLOSED) add \"$b: $n commit(s) on no remote, some made after its $PR_ST PR's head\" ;;\n *) add \"$b: $n commit(s) on no remote and no PR\" ;;\n esac\n done <<EOF\n$branches\nEOF\n rm -f -- \"$excl\"\n # Say why nothing could vouch for the work above.\n [ \"$nwork\" -eq 0 ] || [ -z \"$unreach\" ] ||\n reasons=\"${reasons:+$reasons; }remote(s) not reachable, so nothing they hold counts: $unreach\"\n\n # Whether it may go with everything inside it (deletion_gate): only for\n # the checkout audited for removal; the checkouts inside it are found\n # there, all at once, and audited with AUDIT_DEPTH > 0.\n if [ \"$top\" -eq 1 ]; then\n AUDIT_DEPTH=1\n deletion_gate \"$repo\" \"$linked\"\n AUDIT_DEPTH=0\n fi\n\n}\n\n# Audit one clone or worktree. Prints one report line (and a line per scratch\n# review branch that is safe to delete) and sets VERDICT (CLEAN, KEEP, ACTIVE).\naudit_clone() {\n local repo=\"$1\" reasons status dirty stashes n slug branches b st kb active excl owner wt\n local hidden ignored unreach unsafe\n local linked=0 safe=\"\" pr rv head tip beyond nwork=0 wtr wtlist top=0\n # The checkout audited for removal (not one inside it): only it is gated.\n [ \"$AUDIT_DEPTH\" -gt 0 ] || top=1\n VERDICT=CLEAN\n reasons=\"\"\n # Before any git runs there: a checkout found inside another (or in a\n # build folder) must pass the config allowlist, read from files, with\n # every checkout inside it (git status recurses into submodules).\n unsafe=\"\"\n checkout_trust \"$repo\"\n # Trusted or not (agent-tools#279): every git dir in it must hold only\n # inert config before git status runs there.\n if ! scan_ok \"$repo\" || ! config_safe_tree \"$repo\"; then\n unsafe=\"$CFG_WHY\"\n fi\n [ -n \"$unsafe\" ] || ! is_linked_worktree \"$repo\" || linked=1\n # Judge activity before any git command touches the clone.\n active=0\n recently_active \"$repo\" && active=1\n # add: unpublished work here. add_wt: a worktree still needs this clone.\n add() { reasons=\"${reasons:+$reasons; }$1\"; VERDICT=KEEP; nwork=$((nwork + 1)); }\n add_wt() { reasons=\"${reasons:+$reasons; }$1\"; VERDICT=KEEP; }\n\n # Only a checkout git reads as its own is judged: anything else (a .git git\n # does not recognise, a git dir that is gone) is kept for a human.\n if [ -n \"$unsafe\" ]; then\n # Not one git command runs there: its config could make it run anything.\n add \"untrusted git config ($unsafe): a key, hook or path in it could run a command, so nothing is run there; inspect it by hand\"\n elif own_checkout \"$repo\"; then\n audit_checks\n else\n add \"git status failed: git cannot read $repo as its own repository (a .git it does not recognise, or a git dir that is gone)\"\n fi\n\n # What deleting it frees, each byte once (the checkouts inside it are not\n # measured on their own: the one being removed counts them).\n kb=0\n [ \"$top\" -eq 0 ] || kb=\"$(freeable_kb \"$repo\")\"\n if [ \"$VERDICT\" = CLEAN ] && [ \"$active\" -eq 1 ]; then\n VERDICT=ACTIVE\n reasons=\"changed in the last $OLDER min\"\n fi\n owner=\"$(owner_above \"$repo\")\"\n # KEEP_WORK: how many reasons are unpublished work, not worktrees in use.\n KEEP_WORK=\"$nwork\"\n # remove_clone deletes only the checkout that this audit gated.\n if [ \"$top\" -eq 1 ]; then\n GATE_OF=\"$repo\"\n GATE_LINKED=\"$linked\"\n fi\n printf '%-6s %10s %s%s%s\\n' \"$VERDICT\" \"$(human_kb \"$kb\")\" \"$repo\" \"${reasons:+ ($reasons)}\" \"${owner:+ [owner: $owner]}\"\n while IFS='\t' read -r b pr st; do\n [ -n \"$b\" ] || continue\n if printf '%s\\n' \"$wtlist\" | grep -Fxq \"branch refs/heads/$b\"; then\n say \" safe to delete: $b (scratch review branch, PR #$pr ${st}; checked out, so switch away or remove its worktree first)\"\n else\n say \" safe to delete: $b (scratch review branch, PR #$pr ${st}): git -C $repo branch -D $b\"\n fi\n done <<EOF\n$safe\nEOF\n CLONE_KB=\"$kb\"\n}\n\nlist_clones() {\n # Worktrees (a .git file) before clones (a .git folder), so sweep judges a\n # clone after it has removed the clone's worktrees. Within each, deepest\n # first, so a nested clone is judged before the one around it. A submodule\n # is not listed: its parent owns it (and audits it as a nested clone).\n find \"$ROOT\" \\( -name node_modules -o -name target \\) -prune -o -name .git -print 2>/dev/null |\n while IFS= read -r g; do\n d=\"${g%/.git}\"\n ! is_submodule \"$d\" || continue\n kind=1\n [ -d \"$g\" ] || kind=0\n printf '%s\\t%s\\t%s\\n' \"$kind\" \"$(printf '%s' \"$d\" | tr -cd '/' | wc -c | tr -d ' ')\" \"$d\"\n done | sort -k1,1n -k2,2rn | cut -f3-\n}\n\n# Remove a linked worktree the way git expects: `git worktree remove`, which\n# also drops its entry under the clone's .git/worktrees/ (an `rm -rf` leaves\n# that entry, and its branch stays \"checked out\" until `git worktree prune`).\n# A branch that `hygiene.sh worktree` created for it is deleted too: the audit\n# has just found it published.\n#\n# True when the checkout WT has a submodule checked out: a gitlink in its\n# index whose path holds a .git (file or folder). Read NUL-separated, so a\n# path git would quote (non-ASCII, quotes) still matches. The index, not\n# .gitmodules: git's own check reads the index, and a gitlink needs no\n# .gitmodules entry.\nhas_checked_out_gitlink() {\n local rec\n while IFS= read -r -d '' rec; do\n [ ! -e \"$1/${rec#*\t}/.git\" ] || return 0\n done < <(gitlinks \"$1\")\n return 1\n}\n\n# The one gate before any deletion. DIR goes by `git worktree remove` (a\n# linked worktree; LINKED is 1) or by rm -rf (anything else), and either\n# takes every file inside it, gitignored folders, node_modules and target\n# included. So DIR may go only when:\n# - its git dirs may be written to: a worktree's own entry and its clone's\n# .git are not /, your home or under ~/GitHub; a clone's git dir is\n# inside it (a --separate-git-dir elsewhere would be left behind);\n# - git would remove it without --force: not locked, no submodule in it;\n# - it is not a submodule (those go with their parent);\n# - and every checkout inside it (any .git entry, file or folder) passes\n# too: git can read it, its git dir is inside DIR (a worktree of a clone\n# outside DIR is never deleted with it: at most `git worktree remove` it\n# against its own clone, by hand), it is not locked, no other agent owns\n# it, and its own audit (status with every untracked file and submodule\n# change, stashes, branches) finds nothing unpublished.\n# Each refusal is a reason on the audit's line (add: unpublished work;\n# add_wt: held), naming the checkout inside. Called by audit_clone for the\n# checkout it audits, so audit, close and sweep all report it, and\n# remove_clone deletes only what this gate has just passed.\ndeletion_gate() {\n local dir=\"$1\" linked=\"$2\" g n own inner inner_work o why h gated=\"\" dgd=\"\" anchor=\"\" gd\n # What the bare git dirs inside are judged against: the remotes of DIR's\n # clone when DIR is trusted, else of the checkout around it.\n checkout_trust \"$dir\"\n if [ \"$TRUSTED\" -eq 1 ]; then\n anchor=\"$(common_git_dir \"$dir\")\" || anchor=\"\"\n else\n anchor=\"$TRUST_ANCHOR\"\n fi\n if git_dirs \"$dir\"; then\n dgd=\"$CK_GD\"\n if [ \"$linked\" -eq 1 ]; then\n { git_dir_writable \"$CK_GD\" admin && git_dir_writable \"$CK_CD\" admin; } || add_wt \"$GD_WHY\"\n [ ! -f \"$CK_GD/locked\" ] || add_wt \"locked: git worktree unlock it first\"\n if [ -d \"$CK_GD/modules\" ] || has_checked_out_gitlink \"$dir\"; then\n add_wt \"it holds a submodule, which git removes only with --force\"\n fi\n else\n case \"$CK_GD/\" in\n \"$dir\"/*) ;;\n *)\n why=\"$(protected_why \"$CK_GD\")\"\n add_wt \"its git dir $CK_GD is outside it${why:+ ($why)}; deleting the checkout would leave that git dir behind\" ;;\n esac\n fi\n fi # git cannot read it: the audit's failed git status keeps it\n if is_submodule \"$dir\"; then\n add_wt \"a submodule of $(submodule_parent \"$dir\"); it goes only with its parent\"\n fi\n while IFS= read -r g; do\n [ -n \"$g\" ] || continue\n # find ran from inside DIR (see below): \"./x/.git\" is DIR/x/.git.\n n=\"$dir/${g#./}\"\n n=\"${n%/.git}\"\n # Removed by this sweep already (or, in a dry run, it would be).\n ! in_swept \"$n\" || continue\n # Before any git runs there: a checkout inside DIR is untrusted unless\n # it is a registered submodule (checkout_trust), and its config, read\n # as a file, must be inert (config_safe: no commondir elsewhere, no\n # core.worktree outside it, no command-running key).\n if [ -d \"$n/.git\" ]; then\n gd=\"$n/.git\"\n elif ! gd=\"$(gitfile_dir \"$n\")\" || [ -z \"$gd\" ]; then\n # Fails closed: no git runs on it, and it is never skipped.\n add \"nested checkout $n: a malformed .git file in $n; nothing is run there\"\n continue\n fi\n if [ -d \"$gd\" ] && ! config_safe \"$gd\" \"$n\"; then\n add \"nested checkout $n: untrusted git config ($CFG_WHY); nothing is run there\"\n continue\n fi\n # Git skips a .git it does not recognise and answers for the repository\n # around it: such a checkout is kept, never judged by DIR's state.\n if ! own_checkout \"$n\"; then\n add \"git cannot read $n as its own repository (a .git it does not recognise, or a git dir that is gone)\"\n continue\n fi\n gated=\"$gated$CK_GD\n\"\n if [ -f \"$CK_GD/commondir\" ]; then\n case \"$CK_CD/\" in\n \"$dir\"/*) ;;\n *)\n add_wt \"nested worktree $n belongs to the clone at ${CK_CD%/.git}, outside it; git worktree remove it there, never with this folder\"\n HOLDERS=\"${HOLDERS}worktree\t$n\n\"\n continue ;;\n esac\n if [ -f \"$CK_GD/locked\" ]; then\n add_wt \"nested worktree $n is locked\"\n HOLDERS=\"${HOLDERS}worktree\t$n\n\"\n fi\n else\n case \"$CK_GD/\" in\n \"$dir\"/*) ;;\n *)\n add_wt \"nested checkout $n keeps its git dir $CK_GD outside it\"\n continue ;;\n esac\n fi\n # Deleting DIR deletes it too: never another agent's. That holds DIR, as\n # another agent's worktree does: report it.\n o=\"$(owner_above \"$n\")\"\n if ! owner_ok \"$o\"; then\n add_wt \"nested clone $n belongs to agent $o\"\n HOLDERS=\"${HOLDERS}checkout\t$n\n\"\n fi\n own=\"$VERDICT\"\n audit_clone \"$n\" >/dev/null\n inner=\"$VERDICT\"\n inner_work=\"$KEEP_WORK\"\n VERDICT=\"$own\"\n case \"$inner\" in\n KEEP)\n # The same split as for DIR: unpublished work, or only a worktree in use.\n if [ \"$inner_work\" -gt 0 ]; then\n add \"nested clone $n holds unpublished work\"\n else\n add_wt \"nested clone $n has a worktree checked out (close it first)\"\n fi ;;\n # DIR's own activity check skips node_modules, target, .next and .turbo.\n ACTIVE) add_wt \"nested checkout $n changed in the last $OLDER min\" ;;\n esac\n done < <(cd \"$dir\" 2>/dev/null && find . -path ./.git -prune -o -name .git -print -prune 2>/dev/null)\n # Git dirs not named .git: a bare repository or mirror (foo.git), or a\n # deinit'd submodule's <clone>/.git/modules/<name>. A folder with HEAD,\n # objects/ and refs/ that is not DIR's own git dir or a checkout's above.\n while IFS= read -r h; do\n g=\"${h%/HEAD}\"\n [ -d \"$g/objects\" ] && [ -d \"$g/refs\" ] || continue\n g=\"$(resolve_dir \"$g\")\" || continue\n [ \"$g\" != \"$dgd\" ] || continue\n ! printf '%s' \"$gated\" | grep -Fxq -- \"$g\" || continue\n ! in_swept \"$g\" || continue\n GATE_ANCHOR=\"$anchor\"\n gate_git_dir \"$g\"\n done < <(find \"$dir\" -name objects -prune -o -name HEAD -type f -print 2>/dev/null)\n}\n\n# The gate for a git dir with no checkout of its own (a bare repository, a\n# mirror, a deinit'd submodule's git dir): it goes only when git can read it,\n# it has no stash, and every commit any of its refs (branches, tags, notes,\n# remote-tracking refs) or HEAD reaches is named by one of its remotes,\n# asked with `git ls-remote` (remote_cache). A remote-tracking ref is not\n# asked: it may be stale. With no remote it can reach, any commit keeps it.\ngate_git_dir() {\n local g=\"$1\" n f x\n # Found by scanning: its config is untrusted (checkout_trust).\n if ! config_safe \"$g\" \"\" nocommon; then\n add \"git dir $g: untrusted git config ($CFG_WHY); nothing is run there\"\n return 0\n fi\n if ! git --git-dir=\"$g\" rev-parse --git-dir >/dev/null 2>&1; then\n add \"git dir $g: git cannot read it\"\n return 0\n fi\n if git --git-dir=\"$g\" rev-parse -q --verify refs/stash >/dev/null 2>&1; then\n add \"git dir $g holds a stash\"\n fi\n f=\"$(untrusted_cache \"$g\" \"$GATE_ANCHOR\")\"\n x=\"$(mktemp \"$REMOTE_DIR/excl.XXXXXX\")\" || { add \"git dir $g: could not make a temp file\"; return 0; }\n sed 's/^/^/' \"$f.shas\" >\"$x\"\n if git --git-dir=\"$g\" rev-parse -q --verify 'HEAD^{commit}' >/dev/null 2>&1; then\n n=\"$(git --git-dir=\"$g\" rev-list --count --stdin --all HEAD <\"$x\" 2>/dev/null)\" || n=\"\"\n else\n n=\"$(git --git-dir=\"$g\" rev-list --count --stdin --all <\"$x\" 2>/dev/null)\" || n=\"\"\n fi\n rm -f -- \"$x\"\n case \"$n\" in\n 0) ;;\n '' | *[!0-9]*) add \"git dir $g: git cannot list its commits\" ;;\n *) add \"git dir $g holds $n commit(s) no reachable remote names\" ;;\n esac\n return 0\n}\n\n# True when PATH is a checkout this run has removed (or, in a dry run, would\n# remove), or is inside one.\nin_swept() {\n [ -n \"$SWEPT_PATHS\" ] || return 1\n printf '%s\\n' \"$SWEPT_PATHS\" | awk -v p=\"$1\" 'length($0) && (p == $0 || index(p, $0 \"/\") == 1) { f = 1 } END { exit !f }'\n}\n\n# What deleting DIR frees, in KB, each byte once: its size when the sweep\n# began (or now), less what this run has already tallied inside it: the\n# checkouts removed before it and, in a dry run, the folders prune would\n# remove (with --apply they were gone before the sweep measured). The same\n# arithmetic in both modes, so the dry run's total is what --apply frees.\nfreeable_kb() {\n local d=\"$1\" kb inside\n kb=\"$(awk -F'\\t' -v p=\"$d\" '$2 == p { print $1; exit }' \"$PRESIZE\" 2>/dev/null)\"\n [ -n \"$kb\" ] || kb=\"$(size_kb \"$d\")\"\n inside=\"$(awk -F'\\t' -v p=\"$d/\" 'index($2, p) == 1 { s += $1 } END { print s + 0 }' \"$CLOSE_TALLY\")\"\n if [ \"$APPLY\" -eq 0 ]; then\n inside=$((inside + $(awk -F'\\t' -v p=\"$d/\" 'index($2, p) == 1 { s += $1 } END { print s + 0 }' \"$PRUNE_TALLY\")))\n fi\n kb=$((kb - inside))\n [ \"$kb\" -ge 0 ] || kb=0\n printf '%s\\n' \"$kb\"\n}\n\n# Remove the linked worktree WT with `git worktree remove` (deletion_gate has\n# passed it). Its branch goes too when `hygiene.sh worktree` made it, unless\n# the clone's refs may not be written (an --exclude'd clone keeps it).\nremove_worktree() {\n local wt=\"$1\" kb=\"$2\" gd common branch keepb=\"\"\n git_dirs \"$wt\" || { say \" not removing (git cannot read it): $wt\"; return 1; }\n gd=\"$CK_GD\"\n common=\"$CK_CD\"\n branch=\"\"\n [ -f \"$gd/hygiene-branch\" ] && branch=\"$(head -n 1 \"$gd/hygiene-branch\" | tr -d '[:space:]')\"\n [ \"$branch\" = \"$(git -C \"$wt\" symbolic-ref -q --short HEAD 2>/dev/null)\" ] || branch=\"\"\n if [ -n \"$branch\" ] && ! git_dir_writable \"$common\"; then keepb=\"$GD_WHY\"; fi\n if [ \"$APPLY\" -eq 1 ]; then\n git --git-dir=\"$common\" worktree remove -- \"$wt\" >/dev/null 2>&1 ||\n { say \" git worktree remove failed: $wt\"; return 1; }\n say \" removed worktree $(human_kb \"$kb\"): $wt\"\n if [ -n \"$keepb\" ]; then\n say \" kept its local branch $branch ($keepb)\"\n elif [ -n \"$branch\" ] && git --git-dir=\"$common\" branch -D -- \"$branch\" >/dev/null 2>&1; then\n say \" deleted its local branch $branch (published)\"\n fi\n else\n if [ -n \"$keepb\" ]; then\n say \" would remove worktree $(human_kb \"$kb\") (git worktree remove): $wt; would keep its local branch $branch ($keepb)\"\n else\n say \" would remove worktree $(human_kb \"$kb\") (git worktree remove): $wt${branch:+, and its local branch $branch}\"\n fi\n fi\n printf '%s\\t%s\\n' \"$kb\" \"$wt\" >>\"$CLOSE_TALLY\"\n}\n\nremove_clone() {\n local repo=\"$1\" kb=\"$2\" parent\n deletable \"$repo\" || { say \" not deleting (outside the root, under ~/GitHub, or excluded): $repo\"; return 1; }\n [ -e \"$repo/.git\" ] || { say \" not deleting (no .git): $repo\"; return 1; }\n # Only what the audit just gated (deletion_gate) and found CLEAN.\n [ \"$GATE_OF\" = \"$repo\" ] && [ \"$VERDICT\" = CLEAN ] ||\n { say \" not deleting (not audited clean just now): $repo\"; return 1; }\n if [ \"$GATE_LINKED\" -eq 1 ]; then\n remove_worktree \"$repo\" \"$kb\"\n return\n fi\n if [ \"$APPLY\" -eq 1 ]; then\n safe_rm \"$ROOT\" \"$repo\" || return 1\n say \" deleted $(human_kb \"$kb\"): $repo\"\n # Remove the task folder too when the clone was its last content.\n parent=\"${repo%/*}\"\n if [ \"$parent\" != \"$ROOT\" ] && deletable \"$parent\"; then\n rmdir -- \"$parent\" 2>/dev/null || true\n fi\n else\n say \" would delete $(human_kb \"$kb\"): $repo\"\n fi\n printf '%s\\t%s\\n' \"$kb\" \"$repo\" >>\"$CLOSE_TALLY\"\n}\n\n# Fetch origin into the checkout at DIR (close and sweep, before judging\n# it), pruning remote-tracking refs whose branch is gone, so the judgement\n# sees what origin has now. Never prompts. What counts as published is\n# still asked of each remote (remote_cache), fetched or not.\nfetch_checkout() {\n local rc=0\n # Your own config runs this fetch, so the checkout's must hold only inert\n # keys first, its clone's included (config_safe, agent-tools#279).\n if ! { [ -n \"$CK_GD\" ] && config_safe \"$CK_GD\" \"$1\" && config_safe \"$CK_CD\" \"$1\" &&\n config_safe_tree \"$1\"; }; then\n say \"not fetching $1: ${CFG_WHY:-git cannot read its git dir}\"\n return 1\n fi\n GIT_TERMINAL_PROMPT=0 GIT_SSH_COMMAND=\"${GIT_SSH_COMMAND:-ssh -o BatchMode=yes}\" \\\n git_user -C \"$1\" -c core.hooksPath=/dev/null -c core.fsmonitor=false -c gc.auto=0 \\\n -c maintenance.auto=false -c protocol.file.allow=\"$FILE_PROTO\" -c protocol.ext.allow=never \\\n -c protocol.fd.allow=never -c remote.origin.uploadpack=git-upload-pack \"${CRED_PINS[@]}\" \\\n fetch --quiet --prune origin 2>/dev/null || rc=1\n [ -z \"$CK_CD\" ] || remote_cache_drop \"$CK_CD\"\n return \"$rc\"\n}\n\ncmd_audit() {\n set_root\n say \"audit of clones under $ROOT\"\n clean=0 keep=0 active=0\n while IFS= read -r repo; do\n [ -n \"$repo\" ] || continue\n deletable \"$repo\" || continue\n audit_clone \"$repo\"\n case \"$VERDICT\" in CLEAN) clean=$((clean + 1)) ;; KEEP) keep=$((keep + 1)) ;; ACTIVE) active=$((active + 1)) ;; esac\n done <<EOF\n$(list_clones)\nEOF\n say \"audit: $clean clean, $keep keep (unpublished work), $active active\"\n}\n\ncmd_close() {\n [ -n \"$TARGET\" ] || die \"close needs a clone path\"\n repo=\"$(resolve_dir \"$TARGET\")\" || die \"no such clone: $TARGET\"\n [ -e \"$repo/.git\" ] || die \"not a git clone: $repo\"\n # Closing your own finished clone: the activity window does not apply.\n OLDER=0\n set_root\n require_safe_root\n deletable \"$repo\" || die \"refusing: $repo is outside $ROOT, under ~/GitHub, or excluded\"\n # Ownership before anything touches the clone, the fetch included.\n owner=\"$(owner_above \"$repo\")\"\n owner_ok \"$owner\" ||\n die \"refusing: $repo belongs to agent $owner (its $MARKER), not ${MY_AGENT:-you (no --agent or HYGIENE_AGENT_ID)}; pass --agent if it is yours, or --force-owner\"\n # Before the fetch too: a submodule is closed with its parent, and the fetch\n # writes into the checkout's git dirs (a worktree's clone, or a\n # --separate-git-dir), which must be writable.\n sp=\"$(submodule_parent \"$repo\")\"\n [ -z \"$sp\" ] || die \"refusing: $repo is a submodule of $sp; close its parent instead\"\n # Refuse only what is positively protected. A checkout git cannot read is\n # audited (its failed status keeps it, exit 2), and one whose refs are\n # excluded is judged without a fetch.\n HOLDERS=\"\"\n checkout_trust \"$repo\"\n if [ \"$TRUSTED\" -eq 0 ]; then\n say \"not fetching: $repo is unmarked in a root other users can write in, or is inside another checkout or a build folder, so its config is not trusted\"\n elif ! config_safe_tree \"$repo\"; then\n say \"not fetching $repo: $CFG_WHY\"\n elif ! own_checkout \"$repo\"; then\n say \"warning: git cannot read $repo as its own repository; not fetching\"\n else\n checkout_writable \"$repo\"\n case $? in\n 0) fetch_checkout \"$repo\" ||\n say \"warning: fetch failed; only what a remote answers for now (git ls-remote) counts as published\" ;;\n 1)\n why=\"$GD_WHY\"\n checkout_writable \"$repo\" admin || die \"refusing: $repo: $GD_WHY\"\n say \"not fetching ($why); only what a remote answers for now (git ls-remote) counts as published\" ;;\n *) say \"warning: git cannot read its git dir; not fetching\" ;;\n esac\n fi\n audit_clone \"$repo\"\n if [ \"$VERDICT\" = KEEP ]; then\n # Only unpublished work exits 2, the way sweep counts it. A clone held\n # only by a worktree in use is refused (exit 1): close the worktree first.\n if [ \"$KEEP_WORK\" -gt 0 ]; then\n say \"kept: publish the work above (push and open a PR) or report it, then close again\"\n return 2\n fi\n # Name each worktree that holds it, with its owner and lock state. One\n # that is locked or another agent's is not yours to close: report it.\n if [ -z \"$HOLDERS\" ]; then\n say \"not closed (see the reasons above): resolve them, or report them; this script never forces a removal\"\n return 1\n fi\n say \"not closed: worktrees of this clone, or checkouts inside it, are still checked out\"\n report=0\n while IFS='\t' read -r hk wt; do\n [ -n \"$wt\" ] || continue\n [ \"$hk\" = worktree ] || hk=\"nested checkout\"\n o=\"$(owner_above \"$wt\")\"\n lk=\"\"\n cw=\"\"\n if git_dirs \"$wt\"; then\n if [ -f \"$CK_GD/locked\" ]; then\n lk=\"$(tr '\\n' ' ' <\"$CK_GD/locked\" | sed 's/ *$//')\"\n lk=\"locked${lk:+: $lk}\"\n fi\n git_dir_writable \"$CK_CD\" admin || cw=\"its clone: $GD_WHY\"\n fi\n say \" held by $hk $wt (owner: ${o:-none}${lk:+; $lk}${cw:+; $cw})\"\n if [ -n \"$lk\" ] || [ -n \"$cw\" ] || ! owner_ok \"$o\"; then report=1; fi\n done <<EOF\n$HOLDERS\nEOF\n if [ \"$report\" -eq 1 ]; then\n say \"what holds it is locked, another agent's, or of a clone this script never writes to: report it to its owner or your supervisor; do not unlock or remove it yourself\"\n else\n say \"close its worktrees first (hygiene.sh close <worktree> --apply), then close this clone again\"\n fi\n return 1\n fi\n remove_clone \"$repo\" \"$CLONE_KB\" || return 1\n report_close\n}\n\n# ------------------------------------------------------------------- clone\ncmd_clone() {\n local src repo dir\n [ -n \"$TARGET\" ] || die \"clone needs a repository: <org>/<repo>, a git URL or a path\"\n [ -n \"$TASK\" ] || die \"clone needs --task NAME\"\n valid_name \"$TASK\" || die \"task name must be letters, digits, '.', '_' or '-' (at most 64): $TASK\"\n ensure_agent_id\n src=\"$TARGET\"\n # <org>/<repo> that is not a local path means GitHub.\n if [ ! -e \"$src\" ]; then\n case \"$src\" in\n */*/*|*:*) ;;\n [A-Za-z0-9]*/[A-Za-z0-9._-]*) src=\"https://github.com/${src%.git}.git\" ;;\n esac\n fi\n repo=\"${src%/}\"\n # A local path (\".\", \"repo/.git\") is named after the folder it resolves to.\n if [ -d \"$src\" ]; then\n repo=\"$(resolve_dir \"$src\")\" || die \"cannot resolve $src\"\n repo=\"${repo%/.git}\"\n fi\n repo=\"${repo##*/}\"\n repo=\"${repo##*:}\"\n repo=\"${repo%.git}\"\n repo=\"${repo#.}\" # .github -> github\n valid_name \"$repo\" || die \"cannot name a folder after $TARGET\"\n set_root create\n dir=\"$ROOT/$TASK-$repo-$MY_AGENT\"\n deletable \"$dir\" || die \"refusing: $dir is outside $ROOT, under ~/GitHub, or excluded\"\n # mkdir without -p is the claim: it fails if the folder exists, so two\n # agents can never share one.\n mkdir -- \"$dir\" 2>/dev/null ||\n die \"$dir already exists; never reuse a folder you did not create (pick another --agent if it is not yours)\"\n if ! git_user clone --quiet ${BRANCH:+--branch \"$BRANCH\"} -- \"$src\" \"$dir\" >&2; then\n rm -rf -- \"$dir\"\n die \"git clone of $src failed\"\n fi\n # An unmarked clone has no owner a sweep can see: never leave one behind.\n if ! { printf '%s\\n' \"$MY_AGENT\" >\"$dir/$MARKER\"; } 2>/dev/null; then\n rm -rf -- \"$dir\"\n die \"could not write $dir/$MARKER; the clone was removed again\"\n fi\n note \"cloned $src into $dir as agent $MY_AGENT\"\n agent_hint clone\n say \"$dir\"\n}\n\n# ---------------------------------------------------------------- worktree\n# Undo a worktree add that failed part-way, or whose records could not be\n# written: `git worktree remove --force` when git registered it, then the\n# folder this run claimed, then the branch this run created (and only that).\nundo_worktree() {\n local clone=\"$1\" dir=\"$2\" made_branch=\"$3\"\n if git -C \"$clone\" worktree list --porcelain 2>/dev/null | grep -Fxq -- \"worktree $dir\"; then\n git -C \"$clone\" worktree remove --force -- \"$dir\" >/dev/null 2>&1\n fi\n if [ -d \"$dir\" ] && deletable \"$dir\"; then\n rm -rf -- \"$dir\"\n fi\n if [ -n \"$made_branch\" ] && git -C \"$clone\" show-ref -q --verify \"refs/heads/$made_branch\"; then\n git -C \"$clone\" branch -D -- \"$made_branch\" >/dev/null 2>&1\n fi\n}\n\ncmd_worktree() {\n local clone repo dir gd owner how fromsha upsha slug made=\"\" start excl n rec why\n [ -n \"$TARGET\" ] || die \"worktree needs the clone to branch from\"\n [ -n \"$TASK\" ] || die \"worktree needs --task NAME\"\n valid_name \"$TASK\" || die \"task name must be letters, digits, '.', '_' or '-' (at most 64): $TASK\"\n clone=\"$(resolve_dir \"$TARGET\")\" || die \"no such clone: $TARGET\"\n [ -d \"$clone/.git\" ] || die \"not the main checkout of a clone (no .git folder): $clone\"\n own_checkout \"$clone\" || die \"git cannot read $clone as its own repository (a .git it does not recognise?)\"\n # Adding a worktree writes into the clone's .git, and close and sweep later\n # run `git worktree remove` and `git branch -D` there: the clone passes the\n # same gates as anything this script deletes under.\n why=\"$(untouchable_why \"$clone\")\"\n [ -z \"$why\" ] || die \"refusing: $clone: $why; make your own clone with hygiene.sh clone\"\n checkout_writable \"$clone\" || die \"refusing: $clone: $GD_WHY\"\n ensure_agent_id\n # Never another agent's clone, and an unmarked one only when you say it is\n # a session's shared base clone (--shared).\n owner=\"\"\n [ -f \"$clone/$MARKER\" ] && owner=\"$(marker_id \"$clone/$MARKER\")\"\n [ -n \"$owner\" ] || [ \"$SHARED\" -eq 1 ] ||\n die \"refusing: $clone has no ownership marker ($MARKER), so nothing shows it is yours; make your own clone with hygiene.sh clone, or pass --shared if it is the session's shared base clone\"\n owner_ok \"$owner\" || die \"refusing: $clone belongs to agent $owner (its $MARKER); fetch its branch into your own clone\"\n if [ -n \"$BRANCH\" ]; then\n git -C \"$clone\" check-ref-format --branch \"$BRANCH\" >/dev/null 2>&1 || die \"not a valid branch name: $BRANCH\"\n fi\n fromsha=\"\"\n if [ -n \"$FROM\" ]; then\n fromsha=\"$(git -C \"$clone\" rev-parse -q --verify \"$FROM^{commit}\" 2>/dev/null)\" ||\n die \"--from $FROM is not a commit in $clone\"\n fi\n # Which worktree to add. --from never silently loses to an existing branch.\n if [ -z \"$BRANCH\" ]; then\n how=detached\n elif git -C \"$clone\" show-ref -q --verify \"refs/heads/$BRANCH\"; then\n [ -z \"$FROM\" ] ||\n die \"branch $BRANCH already exists in $clone, so it would be checked out as it is and --from $FROM ignored; drop --from, or pick a new --branch\"\n how=existing\n elif git -C \"$clone\" show-ref -q --verify \"refs/remotes/origin/$BRANCH\"; then\n upsha=\"$(git -C \"$clone\" rev-parse \"refs/remotes/origin/$BRANCH^{commit}\")\"\n if [ -z \"$FROM\" ] || [ \"$fromsha\" = \"$upsha\" ]; then\n how=track\n elif [ \"$FORCE_NEW\" -eq 1 ]; then\n how=new\n else\n die \"origin/$BRANCH exists, so $BRANCH is based on it and tracks it, but --from $FROM is another commit; drop --from, or pass --force-new for a new $BRANCH from $FROM that tracks nothing\"\n fi\n else\n how=new\n fi\n # The folder: <task>-<repo>-<agent-id>-wt-<branch> (detached: the short\n # SHA). The -wt- suffix keeps it apart from your clone for the same task.\n repo=\"$(origin_path \"$clone\")\"\n repo=\"${repo##*/}\"\n [ -n \"$repo\" ] || repo=\"${clone##*/}\"\n repo=\"${repo#.}\"\n valid_name \"$repo\" || die \"cannot name a folder after $clone\"\n if [ -n \"$BRANCH\" ]; then\n slug=\"$BRANCH\"\n else\n slug=\"$(git -C \"$clone\" rev-parse --short=7 \"${fromsha:-HEAD}\" 2>/dev/null)\" || die \"$clone has no commit to start from\"\n fi\n slug=\"$(printf '%s' \"$slug\" | tr -c 'A-Za-z0-9._-' '-' | sed -e 's/^[.-]*//' | cut -c1-48)\"\n [ -n \"$slug\" ] || slug=\"head\"\n set_root create\n dir=\"$ROOT/$TASK-$repo-$MY_AGENT-wt-$slug\"\n deletable \"$dir\" || die \"refusing: $dir is outside $ROOT, under ~/GitHub, or excluded\"\n # The same claim as clone: mkdir fails if the folder exists. git worktree\n # add accepts the empty folder.\n mkdir -- \"$dir\" 2>/dev/null ||\n die \"$dir already exists; never reuse a folder you did not create (pass another --task, or close the worktree that is there)\"\n case \"$how\" in\n new | track) made=\"$BRANCH\" ;;\n esac\n case \"$how\" in\n detached) git_user -C \"$clone\" worktree add --quiet --detach -- \"$dir\" \"${fromsha:-HEAD}\" >&2 ;;\n existing) git_user -C \"$clone\" worktree add --quiet -- \"$dir\" \"$BRANCH\" >&2 ;;\n track) git_user -C \"$clone\" worktree add --quiet --track -b \"$BRANCH\" -- \"$dir\" \"origin/$BRANCH\" >&2 ;;\n new) git_user -C \"$clone\" worktree add --quiet --no-track -b \"$BRANCH\" -- \"$dir\" \"${fromsha:-HEAD}\" >&2 ;;\n esac || {\n undo_worktree \"$clone\" \"$dir\" \"$made\"\n die \"git worktree add in $clone failed; removed the partial worktree${made:+ and the branch $made}\"\n }\n # The records, before anything says the worktree is ready: the owner, the\n # branch made for it (close deletes it once published), and the commit it\n # started from, \"remote\" when that commit was on the remote just now (a PR\n # head in FETCH_HEAD), so close can judge it after its own fetch.\n rec=\"\"\n if [ \"$how\" = detached ] || [ \"$how\" = new ]; then\n start=\"$(git -C \"$dir\" rev-parse -q --verify HEAD 2>/dev/null)\"\n n=1\n if excl=\"$(excl_file \"$clone\")\"; then\n n=\"$(unpublished_count \"$clone\" \"$excl\" \"$start\")\"\n rm -f -- \"$excl\"\n fi\n rec=\"$start\"\n [ \"$n\" != 0 ] || rec=\"$start remote\"\n fi\n if ! gd=\"$(git -C \"$dir\" rev-parse --absolute-git-dir 2>/dev/null)\" ||\n ! { printf '%s\\n' \"$MY_AGENT\" >\"$gd/hygiene-owner\"; } 2>/dev/null ||\n ! { [ -z \"$made\" ] || printf '%s\\n' \"$made\" >\"$gd/hygiene-branch\"; } 2>/dev/null ||\n ! { [ -z \"$rec\" ] || printf '%s\\n' \"$rec\" >\"$gd/hygiene-from\"; } 2>/dev/null; then\n undo_worktree \"$clone\" \"$dir\" \"$made\"\n die \"could not write the owner marker in ${gd:-its git dir}; removed the worktree again${made:+ and the branch $made}\"\n fi\n note \"added a worktree of $clone at $dir as agent $MY_AGENT${BRANCH:+ on $BRANCH}\"\n agent_hint worktree\n say \"$dir\"\n}\n\ncmd_sweep() {\n cmd_prune\n cmd_tmp\n set_root\n require_safe_root\n say \"sweep of clones under $ROOT\"\n touch -- \"$SWEEP_STAMP\" && SWEEP_SINCE=\"$SWEEP_STAMP\"\n clones=\"$(list_clones)\"\n # As close does: fetch each of your checkouts first (never one this script\n # may not write to), so what is judged is what origin has now. Before the\n # sizes are taken, so the dry run measures what --apply will.\n while IFS= read -r repo; do\n [ -n \"$repo\" ] || continue\n deletable \"$repo\" || continue\n owner_ok \"$(owner_above \"$repo\")\" || continue\n checkout_trust \"$repo\"\n [ \"$TRUSTED\" -eq 1 ] || continue\n config_safe_tree \"$repo\" || continue\n own_checkout \"$repo\" || continue\n checkout_writable \"$repo\" || continue\n [ -z \"$(submodule_parent \"$repo\")\" ] || continue\n fetch_checkout \"$repo\" || say \"warning: fetch failed for $repo; only what a remote answers for now counts as published\"\n done <<EOF\n$clones\nEOF\n # Every checkout measured once, before anything goes (see freeable_kb).\n while IFS= read -r repo; do\n [ -z \"$repo\" ] || printf '%s\\t%s\\n' \"$(size_kb \"$repo\")\" \"$repo\"\n done >\"$PRESIZE\" <<EOF\n$clones\nEOF\n kept=0\n held=0\n others=0\n while IFS= read -r repo; do\n [ -n \"$repo\" ] || continue\n [ -d \"$repo\" ] || continue\n deletable \"$repo\" || continue\n owner=\"$(owner_above \"$repo\")\"\n if ! owner_ok \"$owner\"; then\n say \"OTHER $repo (owned by $owner; left alone)\"\n others=$((others + 1))\n continue\n fi\n audit_clone \"$repo\"\n case \"$VERDICT\" in\n CLEAN)\n # A worktree removed here (or, in a dry run, that would be) no longer\n # holds its clone: the clone, judged later, is judged without it.\n # A checkout removed here (or, in a dry run, that would be) no longer\n # holds, or counts inside, what is judged after it.\n if remove_clone \"$repo\" \"$CLONE_KB\"; then\n SWEPT_PATHS=\"$SWEPT_PATHS\n$repo\"\n fi ;;\n KEEP)\n # Only unpublished work counts as kept (and exit 2). A clone held by a\n # worktree still in use is not: that worktree is reported on its own.\n if [ \"$KEEP_WORK\" -gt 0 ]; then kept=$((kept + 1)); else held=$((held + 1)); fi ;;\n esac\n done <<EOF\n$clones\nEOF\n report_close\n [ \"$others\" -eq 0 ] || say \"sweep: $others clone(s) owned by other agents left alone; --force-owner includes them\"\n [ \"$held\" -eq 0 ] || say \"sweep: $held clone(s) left in place because worktrees of theirs are still checked out, or a checkout in them may not go (see the reasons above)\"\n [ \"$kept\" -eq 0 ] || { say \"sweep: $kept clone(s) kept with unpublished work; publish or report them\"; return 2; }\n}\n\nreport_close() {\n total=\"$(awk '{s+=$1} END {print s+0}' \"$CLOSE_TALLY\")\"\n count=\"$(wc -l <\"$CLOSE_TALLY\" | tr -d ' ')\"\n if [ \"$APPLY\" -eq 1 ]; then\n say \"freed $(human_kb \"$total\") from $count clone(s) ($total KB)\"\n else\n say \"dry run: $(human_kb \"$total\") in $count clone(s) would be freed ($total KB); re-run with --apply\"\n fi\n}\n\nPRUNE_TALLY=\"$(mktemp \"${TMPDIR:-/tmp}/hygiene-prune.XXXXXX\")\" || die \"mktemp failed\"\nCLOSE_TALLY=\"$(mktemp \"${TMPDIR:-/tmp}/hygiene-close.XXXXXX\")\" || die \"mktemp failed\"\nSCAN_CACHE=\"$(mktemp \"${TMPDIR:-/tmp}/hygiene-prs.XXXXXX\")\" || die \"mktemp failed\"\nSWEEP_STAMP=\"$(mktemp \"${TMPDIR:-/tmp}/hygiene-sweep.XXXXXX\")\" || die \"mktemp failed\"\nSUBMOD_CACHE=\"$(mktemp \"${TMPDIR:-/tmp}/hygiene-sub.XXXXXX\")\" || die \"mktemp failed\"\nPRESIZE=\"$(mktemp \"${TMPDIR:-/tmp}/hygiene-size.XXXXXX\")\" || die \"mktemp failed\"\n# What each remote answered this run (remote_cache), and rev-list inputs.\nREMOTE_DIR=\"$(mktemp -d \"${TMPDIR:-/tmp}/hygiene-remote.XXXXXX\")\" || die \"mktemp failed\"\ntrap 'rm -f -- \"$PRUNE_TALLY\" \"$CLOSE_TALLY\" \"$SCAN_CACHE\" \"$SWEEP_STAMP\" \"$SUBMOD_CACHE\" \"$PRESIZE\"; rm -rf -- \"$REMOTE_DIR\"' EXIT\n# Checkouts sweep has removed (or would remove), one path per line.\nSWEPT_PATHS=\"\"\nKEEP_WORK=0\nPR_ST=\"\"\nPR_ON_PR=0\nPR_PUB=0\n# The worktrees audit_clone found holding a clone (one path per line; close\n# names them). AUDIT_DEPTH: 0 outside an audit, so the audited checkout is\n# gated and the checkouts inside it are not gated again. GATE_OF and\n# GATE_LINKED: the checkout the last audit gated, and whether it is a linked\n# worktree (remove_clone deletes nothing else).\nHOLDERS=\"\"\nAUDIT_DEPTH=0\nGATE_OF=\"\"\nGATE_LINKED=0\nGATE_ANCHOR=\"\"\n\ncase \"$CMD\" in\n check) cmd_check ;;\n clone) cmd_clone ;;\n worktree) cmd_worktree ;;\n audit) cmd_audit ;;\n prune) cmd_prune ;;\n tmp) cmd_tmp ;;\n close) cmd_close ;;\n sweep) cmd_sweep ;;\n ''|-h|--help|help) usage ;;\n *) die \"unknown command: $CMD (check, clone, worktree, audit, prune, tmp, close, sweep)\" ;;\nesac\n"
237
+ }
238
+ ]
239
+ },
240
+ {
241
+ "name": "progress-report",
242
+ "category": "dev",
243
+ "description": "All dev work runs on a 10-minute progress-report loop. When dev work starts, schedule a report every 10 minutes (Claude Code: /loop 10m or CronCreate */10 * * * *, which dies with the session and expires after 7 days; without cron, report at each natural checkpoint). Measure, don't guess: 20-cell progress bars with a percentage and a one-line basis (plan steps from the plan doc or tracking issue, features done, code migrated as lines in the new tree against the old, and an Overall bar labelled estimate when it is not exact); per workstream, open PRs, the latest release, staging ahead of main, CI, a live HTTP check for deployed sites and published-vs-draft counts for content; one 'Since last report:' line; and 'Needs you:' as the last line (owner actions and decisions, or nothing). One line when nothing changed. Ticks are read-only: never publish, release, merge, delete or deploy from a tick without the owner's approval of that specific action. No secrets or PII. The loop stops when the work is done (a final report with the outcome) or when the owner says stop. Ships progress.sh, a portable read-only script: bar, pct, repo, lines, http.",
244
+ "body_mdx": "# Progress report: measured, every ten minutes\n\n> **Covenant:** _The owner should never have to ask \"where are we?\"_\n\nAll dev work runs on a 10-minute progress-report loop. The owner reads the reports to decide\nwhat to do next, so every number in them is measured, and every report ends with what the\nowner has to do. A report that guesses is worse than none, because it is believed.\n\nThis skill has four parts: **starting** the loop, **what a report holds**, **the rules for a\ntick**, and **stopping**. The script `progress.sh` in this skill folder renders the bars and\nreads the repo state for you.\n\n## Get the script\n\n`progress.sh` is portable bash (3.2+) for macOS and Linux. It is **read-only**: it reads git,\nthe GitHub API (through `gh`) and HTTP status codes, and never writes anything.\n\n| Where you are | Path |\n| ------------------------------- | ----------------------------------------------------------------------------------------------------------------------- |\n| `@nyuchi/mzizi-skills` from npm | `node_modules/@nyuchi/mzizi-skills/skills/progress-report/progress.sh` |\n| The public `mzizi` plugin | `skills/progress-report/progress.sh` in the plugin |\n| Only the MCP | `curl -fsSL https://unpkg.com/@nyuchi/mzizi-skills/skills/progress-report/progress.sh -o \"${TMPDIR:-/tmp}/progress.sh\"` |\n\n```bash\nP=\"${TMPDIR:-/tmp}/progress.sh\" # or one of the paths above\nbash \"$P\" bar 78 \"Plan steps\" \"7 of 9\" # Plan steps ████████████████░░░░ 78% 7 of 9\nbash \"$P\" pct 7 9 # 78\nbash \"$P\" repo mzizi-dev/agent-tools # open PRs, latest release, staging vs main, CI\nbash \"$P\" -C \"${TMPDIR:-/tmp}/task/app\" lines origin/staging app/ # lines under app/ at that ref\nbash \"$P\" http https://mcp.mzizi.dev/ https://mzizi.dev # status code per deployed site\n```\n\n`lines` counts the committed tree at a ref (`git grep -c ''`, binary files skipped), never the\nworking copy, so two reports on the same commit give the same number. `repo` reads only, every\npage of each list. Its CI line takes the newest run of each GitHub Actions workflow, the\nchecks of other apps, and the commit statuses (deploy integrations often post only a status)\non the default branch's head, and names what failed. A workflow whose newest run was\ncancelled is shown as cancelled (`; 1 cancelled: CI`), neither green nor red, because nothing\nfinished it; read that as \"not verified\", never as passing. `pct` and\n`bar` never round unfinished work up to 100%.\n\n## Starting the loop\n\nWhen dev work starts, schedule the report before you write any code:\n\n- **Claude Code:** `/loop 10m <report prompt>`, or CronCreate with `*/10 * * * *`. The cron\n lives in the session: it dies when the session ends and expires after 7 days, so a long build\n re-arms it in each new session.\n- **Surfaces without cron** (a chat, a CI job, an agent with no scheduler): report at each\n natural checkpoint instead, such as a PR opened, CI finished, a merge, a release, or a\n blocker.\n\nThe report prompt names the work and where its measures come from, for example:\n\n```text\nProgress report for the Toddle rebuild (nyuchi/toddle-enhancement-extension#41).\nBars: plan steps from the checklist in #41; features from the feature table in docs/plan.md;\ncode migrated = lines in app/ vs src/ at origin/staging. Workstreams: the repo, the Chrome Web\nStore listing. Use the progress-report skill. Read-only.\n```\n\nWrite the measures down once, in the tracking issue (see \"Track big work in GitHub issues\").\nThen every tick measures the same thing the same way.\n\n## What a report holds\n\n### 1. Progress bars\n\nEach bar is 20 cells of `█` and `░`, a percentage, and a **one-line basis**: what was counted.\nUse `progress.sh bar` so every bar has the same width and alignment. Typical bars:\n\n| Bar | Basis (measured) |\n| ------------- | ------------------------------------------------------------------------------------ |\n| Plan steps | Steps done of total, from the repo's plan doc or the tracking issue's checklist. |\n| Features done | Features shipped of the features listed in the plan. |\n| Code migrated | Lines in the new tree against the old (`progress.sh lines`), at the same ref. |\n| Overall | How it combines the others. Labelled `(estimate)` and shown as `~N%` when not exact. |\n\nOnly show a bar you can measure. If there is no checklist, say so and don't invent a\ndenominator. A bar never reads 100% for unfinished work: `progress.sh` keeps a cell empty\nuntil the count is complete.\n\n### 2. Per workstream\n\nFor each repo, service or content stream the work touches:\n\n- **Open PRs**, the **latest release or tag**, **staging ahead of main**, and **CI** on the\n default branch: `progress.sh repo <owner/repo>`.\n- **Deployed sites:** a live HTTP check (`progress.sh http <url>…`). Report the status code\n you got; don't call a site live without one.\n- **Content**, when the work includes it (Intercom articles, Sanity documents, store\n listings): the **published** count against the **draft** count, read from the source's API\n or MCP.\n\n### 3. Since last report\n\nOne line: what changed since the previous tick (a PR merged, CI went green, a bar moved from\n68% to 74%).\n\n### 4. Needs you\n\nThe **last line** of every report: `Needs you:` and the owner actions and decisions that block\nthe work, each one specific enough to act on. Write `Needs you: nothing` when nothing does.\n\n### When nothing changed\n\nIf nothing changed since the last tick, the whole report is one line, such as\n`10:40 no change since 10:30 (PR #212 CI still running). Needs you: nothing.`\n\n## Example\n\nThe Toddle rebuild format, partway through (the numbers are illustrative):\n\n```text\nProgress report 14:20 (Toddle rebuild, nyuchi/toddle-enhancement-extension#41)\n\nFeatures rebuilt (UI) ████████████████████ 100% every visible feature is React in app/\nPlan steps ████████████████░░░░ 78% 7 of 9\nCode in app/ ██████████████░░░░░░ 69% 16,090 app/ · 7,266 src/\n───────────────────────────────────────────────\nOverall (estimate) ███████████████░░░░░ ~75% plan steps, weighted by code moved\n\nnyuchi/toddle-enhancement-extension\n open PRs 2 (#58 settings panel, #59 remove src/)\n latest release v1.6.0 (2026-10-05)\n staging vs main 4 ahead, 0 behind\n CI on main green (9 checks)\nChrome Web Store 1.6.0 published, 1.7.0 draft staged\n\nSince last report: #57 merged; code in app/ 64% → 69%.\nNeeds you: approve the 1.7.0 store submission (staged, not submitted).\n```\n\n## Rules for a tick\n\n- **Ticks are read-only by default.** Never publish, release, merge, delete or deploy from a\n report tick unless the owner already approved that specific action. A report observes the\n work; it does not do it. Installing an approved test build is fine when the owner set that\n up.\n- **Measure, don't guess.** Every number comes from a command, an API or a file you read in\n this tick. If a read fails, say `?` and why, rather than reusing an old number.\n- **Privacy.** No secrets, tokens or credential status, and no personal information (names of\n members of the public, emails, phone numbers) in a report. Name a secret by its name, never\n its value.\n- **Short.** A report is read on a phone between other things. Bars, workstreams, one \"Since\n last report\" line, then \"Needs you\".\n\n## Stopping\n\nThe loop stops when:\n\n- **the work is done:** send one final report with the outcome (what merged, what is live and\n verified, what is left) and its \"Needs you\" line, then cancel the loop; or\n- **the owner says stop.**\n\nCancel the scheduled job (`CronDelete`, or end the `/loop`) so nothing keeps reporting on\nfinished work.\n\n## Checklist\n\n- [ ] The loop is scheduled (10 minutes) or, without cron, checkpoints are named.\n- [ ] Each bar has a measured basis; the Overall bar says `estimate` when it is one.\n- [ ] Each workstream shows PRs, release, staging vs main, CI, live HTTP, and content counts.\n- [ ] One \"Since last report:\" line, and \"Needs you:\" is the last line.\n- [ ] Nothing published, released, merged, deleted or deployed by a tick without approval.\n- [ ] No secrets, no PII.\n- [ ] A final report when the work is done, and the loop cancelled.",
245
+ "source": "mzizi-dev/agent-tools/mzizi-skills/skills/progress-report",
246
+ "files": [
247
+ {
248
+ "path": "progress.sh",
249
+ "mimeType": "text/x-shellscript",
250
+ "bytes": 12647,
251
+ "encoding": "utf8",
252
+ "content": "#!/usr/bin/env bash\n# progress.sh — measured progress for a report tick (the Mzizi `progress-report` skill).\n#\n# Portable bash (3.2+, macOS and Linux). READ-ONLY: it never writes to a repo,\n# a branch, a release, a registry or a deployment. It only reads git, the\n# GitHub API (through gh) and HTTP status codes.\n#\n# progress.sh bar PCT [LABEL [BASIS]] a 20-cell bar: LABEL ████████░░░░ 40% BASIS\n# progress.sh pct DONE TOTAL DONE/TOTAL as a whole percentage (0 when TOTAL is 0)\n# progress.sh repo OWNER/REPO open PRs, latest release, staging ahead of the\n# default branch, default-branch CI\n# progress.sh lines REF PATHSPEC... lines in the files under PATHSPEC at REF, run\n# inside a git clone (for \"code migrated\" bars)\n# progress.sh http URL... the HTTP status of each deployed site\n#\n# Options (before or after the command's arguments):\n# -C DIR run `lines` against the git clone at DIR (default: the current directory)\n# --width N bar cells (default 20)\n# --label-width N pad LABEL to N columns (default 24)\n#\n# Environment:\n# PROGRESS_GH the gh binary (default: gh)\n# PROGRESS_CURL the curl binary (default: curl)\n#\n# Exit codes: 0 ok; 1 bad usage or a failed read (the message says which).\n\nset -u\nset -o pipefail\n\ndie() {\n printf 'progress: %s\\n' \"$*\" >&2\n exit 1\n}\n\nGH=\"${PROGRESS_GH:-gh}\"\nCURL=\"${PROGRESS_CURL:-curl}\"\nWIDTH=20\nLABEL_WIDTH=24\nGIT_DIR_ARG=\".\"\n\n# Pull the options out wherever they sit (before or after the command), and keep\n# the command and its positional arguments in order.\nARGS=()\nwhile [ $# -gt 0 ]; do\n case \"$1\" in\n -C) GIT_DIR_ARG=\"${2:?-C needs a directory}\"; shift 2 ;;\n --width) WIDTH=\"${2:?--width needs a number}\"; shift 2 ;;\n --label-width) LABEL_WIDTH=\"${2:?--label-width needs a number}\"; shift 2 ;;\n -h|--help) sed -n '2,26p' \"$0\"; exit 0 ;;\n --) shift; while [ $# -gt 0 ]; do ARGS+=(\"$1\"); shift; done ;;\n *) ARGS+=(\"$1\"); shift ;;\n esac\ndone\nset -- ${ARGS[@]+\"${ARGS[@]}\"}\nCMD=\"${1:-}\"\n[ $# -gt 0 ] && shift\n\nis_uint() { case \"$1\" in ''|*[!0-9]*) return 1 ;; *) return 0 ;; esac; }\nif ! is_uint \"$WIDTH\" || [ \"$WIDTH\" -eq 0 ]; then die \"--width must be a whole number above 0\"; fi\nis_uint \"$LABEL_WIDTH\" || die \"--label-width must be a whole number\"\n\n# Round a percentage given as 75, 75.4, ~75 or 75% to a whole number in 0..100.\nnorm_pct() {\n local p=\"${1#\\~}\"\n p=\"${p%\\%}\"\n case \"$p\" in\n ''|*[!0-9.]*|*.*.*|.) return 1 ;;\n esac\n # Unfinished work never rounds up to 100 (99.6% is not done), and started\n # work never rounds down to 0 (0.4% has begun).\n awk -v p=\"$p\" 'BEGIN { r = int(p + 0.5); if (r > 100) r = 100\n if (p < 100 && r == 100) r = 99; if (p > 0 && r == 0) r = 1; print r }'\n}\n\n# ---------------------------------------------------------------- bar\ncmd_bar() {\n [ $# -ge 1 ] || die \"usage: progress.sh bar PCT [LABEL [BASIS]]\"\n local raw=\"$1\" label=\"${2:-}\" basis=\"${3:-}\" pct filled i cells=\"\" shown\n pct=\"$(norm_pct \"$raw\")\" || die \"bar: '$raw' is not a percentage\"\n filled=$(( (pct * WIDTH + 50) / 100 ))\n # Never an empty bar for started work, and never a full bar for unfinished\n # work. The second rule wins when the two collide (a one-cell bar).\n if [ \"$pct\" -gt 0 ] && [ \"$filled\" -eq 0 ]; then filled=1; fi\n if [ \"$pct\" -lt 100 ] && [ \"$filled\" -ge \"$WIDTH\" ]; then filled=$((WIDTH - 1)); fi\n i=0\n while [ \"$i\" -lt \"$WIDTH\" ]; do\n if [ \"$i\" -lt \"$filled\" ]; then cells=\"${cells}█\"; else cells=\"${cells}░\"; fi\n i=$((i + 1))\n done\n # An estimate keeps its \"~\" so the reader knows it is not a count.\n case \"$raw\" in \\~*) shown=\"~$pct%\" ;; *) shown=\"$pct%\" ;; esac\n if [ -n \"$label\" ]; then\n # Pad by characters, not bytes (printf's %-Ns counts bytes): count the\n # bytes that are not UTF-8 continuation bytes, in any locale. A wide\n # character (CJK, most emoji) still counts as one column, so keep labels\n # to Latin script.\n local chars pad\n chars=\"$(printf '%s' \"$label\" | LC_ALL=C tr -d '\\200-\\277' | wc -c | tr -d ' ')\"\n pad=$((LABEL_WIDTH - chars))\n [ \"$pad\" -lt 0 ] && pad=0\n printf '%s%*s%s %5s' \"$label\" \"$pad\" \"\" \"$cells\" \"$shown\"\n else\n printf '%s %5s' \"$cells\" \"$shown\"\n fi\n [ -n \"$basis\" ] && printf ' %s' \"$basis\"\n printf '\\n'\n}\n\n# ---------------------------------------------------------------- pct\ncmd_pct() {\n [ $# -eq 2 ] || die \"usage: progress.sh pct DONE TOTAL\"\n if ! is_uint \"$1\" || ! is_uint \"$2\"; then die \"pct: DONE and TOTAL must be whole numbers\"; fi\n if [ \"$2\" -eq 0 ]; then echo 0; return; fi\n # 999 of 1000 is 99 and 1 of 1000 is 1: only a finished count reads 100, and\n # only an untouched one reads 0.\n awk -v d=\"$1\" -v t=\"$2\" 'BEGIN { r = int(d * 100 / t + 0.5); if (r > 100) r = 100\n if (d < t && r == 100) r = 99; if (d > 0 && r == 0) r = 1; print r }'\n}\n\n# ---------------------------------------------------------------- repo\ncmd_repo() {\n [ $# -eq 1 ] || die \"usage: progress.sh repo OWNER/REPO\"\n local r=\"$1\" def prs rel ahead ci\n case \"$r\" in */*) ;; *) die \"repo: '$r' is not OWNER/REPO\" ;; esac\n command -v \"$GH\" >/dev/null 2>&1 || die \"repo: gh not found (set PROGRESS_GH)\"\n\n def=\"$(\"$GH\" api \"repos/$r\" --jq '.default_branch' 2>/dev/null)\" || die \"repo: cannot read $r\"\n [ -n \"$def\" ] || die \"repo: cannot read $r\"\n\n # --paginate, so a repo with more than 100 open PRs is counted in full.\n if prs=\"$(\"$GH\" api --paginate \"repos/$r/pulls?state=open&per_page=100\" --jq '.[].number' 2>/dev/null)\"; then\n prs=\"$(printf '%s' \"$prs\" | grep -c . || true)\"\n else\n prs=\"?\"\n fi\n\n rel=\"$(\"$GH\" api \"repos/$r/releases/latest\" --jq '.tag_name + \" (\" + (.published_at[0:10]) + \")\"' 2>/dev/null)\" || rel=\"\"\n if [ -z \"$rel\" ]; then\n # The REST tags list is sorted by name, not date, so ask for the newest tag.\n # shellcheck disable=SC2016 # $owner and $name are GraphQL variables\n rel=\"$(\"$GH\" api graphql -f owner=\"${r%%/*}\" -f name=\"${r#*/}\" -f query='\n query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) {\n refs(refPrefix: \"refs/tags/\", first: 1, orderBy: {field: TAG_COMMIT_DATE, direction: DESC}) {\n nodes { name } } } }' --jq '.data.repository.refs.nodes[0].name // empty' 2>/dev/null)\" || rel=\"\"\n [ -n \"$rel\" ] && rel=\"$rel (tag, no release)\"\n fi\n [ -n \"$rel\" ] || rel=\"none\"\n\n if [ \"$def\" = \"staging\" ]; then\n ahead=\"n/a (staging is the default branch)\"\n elif \"$GH\" api \"repos/$r/branches/staging\" --jq '.name' >/dev/null 2>&1; then\n ahead=\"$(\"$GH\" api \"repos/$r/compare/$def...staging\" --jq '\"\\(.ahead_by) ahead, \\(.behind_by) behind\"' 2>/dev/null)\" || ahead=\"?\"\n else\n ahead=\"no staging branch\"\n fi\n\n # Default-branch CI on the branch head, from three sources, every page of\n # each: GitHub Actions workflow runs (keyed by workflow file: display names\n # and job names need not be unique), check runs from other apps (keyed by app\n # and check name), and commit statuses (keyed by context; the older API that\n # deploy integrations such as Cloudflare and Vercel often use). One TSV line\n # per signal: kind, state (ok, failed, pending or cancelled), key, time, and\n # the name to show.\n local signals sha\n if sha=\"$(\"$GH\" api \"repos/$r/commits/$def\" --jq '.sha' 2>/dev/null)\" && [ -n \"$sha\" ] &&\n signals=\"$(\n {\n \"$GH\" api --paginate \"repos/$r/actions/runs?head_sha=$sha&per_page=100\" --jq '.workflow_runs[] |\n [ \"workflow\",\n (if .status != \"completed\" then \"pending\"\n elif .conclusion == \"cancelled\" then \"cancelled\"\n elif (.conclusion == \"skipped\" or .conclusion == \"neutral\") then \"skipped\"\n elif .conclusion == \"success\" then \"ok\"\n else \"failed\" end),\n .path, .created_at, .name ] | @tsv' &&\n \"$GH\" api --paginate \"repos/$r/commits/$sha/check-runs?per_page=100\" --jq '.check_runs[] |\n select(.app.slug != \"github-actions\") |\n [ \"app\",\n (if .status != \"completed\" then \"pending\"\n elif .conclusion == \"cancelled\" then \"cancelled\"\n elif (.conclusion == \"skipped\" or .conclusion == \"neutral\") then \"skipped\"\n elif .conclusion == \"success\" then \"ok\"\n else \"failed\" end),\n (.app.slug + \"/\" + .name), (.started_at // \"\"), .name ] | @tsv' &&\n \"$GH\" api --paginate \"repos/$r/commits/$sha/statuses?per_page=100\" --jq '.[] |\n [ \"status\",\n (if .state == \"success\" then \"ok\" elif .state == \"pending\" then \"pending\" else \"failed\" end),\n .context, .created_at, .context ] | @tsv'\n } 2>/dev/null\n )\"; then\n # Reruns, scheduled runs and new statuses pile up on one commit: only the\n # newest signal per key counts, so a stale failure that a later run fixed\n # does not turn CI red. When the newest run was cancelled, nothing finished\n # it: it is reported as cancelled, neither green nor red, and an older\n # result does not stand in for it. ISO times sort as text, newest first.\n ci=\"$(printf '%s\\n' \"$signals\" | sort -t \"$(printf '\\t')\" -k4,4r | awk -F'\\t' '\n function add(list, name) { return list (list ? \", \" : \"\") name }\n NF < 5 || $1 == \"\" { next }\n # A skipped or neutral run checked nothing, so it never replaces an older\n # result; a workflow with only skipped runs counts as passing.\n $2 == \"skipped\" { key = $1 SUBSEP $3; if (!(key in skipped)) { skipped[key] = 1; order[++k] = key } next }\n { key = $1 SUBSEP $3; if (seen[key]++) next }\n $2 == \"cancelled\" { c++; cn = add(cn, $5); next }\n { n++ }\n $2 == \"failed\" { f++; if (!(($5) in named)) { named[$5] = 1; fn = add(fn, $5) } }\n $2 == \"pending\" { p++ }\n END {\n for (i = 1; i <= k; i++) if (!(order[i] in seen)) n++\n extra = c ? sprintf(\"; %d cancelled: %s\", c, cn) : \"\"\n if (n == 0 && c == 0) print \"no checks\"\n else if (f) printf \"red (%d failed of %d: %s%s)\\n\", f, n, fn, extra\n else if (p) printf \"running (%d pending of %d%s)\\n\", p, n, extra\n else if (n == 0) printf \"cancelled (%d: %s)\\n\", c, cn\n else printf \"green (%d checks%s)\\n\", n, extra }')\"\n else\n ci=\"?\"\n fi\n\n printf '%s\\n' \"$r\"\n printf ' open PRs %s\\n' \"$prs\"\n printf ' latest release %s\\n' \"$rel\"\n printf ' staging vs %-4s %s\\n' \"$def\" \"$ahead\"\n printf ' CI on %-9s %s\\n' \"$def\" \"$ci\"\n}\n\n# ---------------------------------------------------------------- lines\ncmd_lines() {\n [ $# -ge 2 ] || die \"usage: progress.sh lines REF PATHSPEC...\"\n local ref=\"$1\" total\n shift\n git -C \"$GIT_DIR_ARG\" rev-parse --git-dir >/dev/null 2>&1 || die \"lines: $GIT_DIR_ARG is not a git clone\"\n git -C \"$GIT_DIR_ARG\" rev-parse --verify --quiet \"$ref^{commit}\" >/dev/null || die \"lines: no such ref '$ref'\"\n # `git grep -c ''` counts every line of every text file in the tree at REF,\n # without checking anything out. -I skips binary files. No match is 0, not an error.\n local counts rc=0 err\n err=\"$(mktemp \"${TMPDIR:-/tmp}/progress-lines.XXXXXX\")\" || die \"lines: cannot make a temp file\"\n counts=\"$(git -C \"$GIT_DIR_ARG\" grep -I -c '' \"$ref\" -- \"$@\" 2>\"$err\")\" || rc=$?\n # Exit 1 is \"no file matched\" (a real 0); anything above is git refusing the\n # pathspec or the ref, and a bar built on it would look measured but not be.\n if [ \"$rc\" -gt 1 ]; then\n printf 'progress: lines: git grep failed: %s\\n' \"$(head -n 1 \"$err\")\" >&2\n rm -f -- \"$err\"\n exit 1\n fi\n rm -f -- \"$err\"\n total=\"$(printf '%s\\n' \"$counts\" | awk -F: 'NF { n += $NF } END { print n + 0 }')\"\n printf '%s\\n' \"$total\"\n}\n\n# ---------------------------------------------------------------- http\ncmd_http() {\n [ $# -ge 1 ] || die \"usage: progress.sh http URL...\"\n command -v \"$CURL\" >/dev/null 2>&1 || die \"http: curl not found (set PROGRESS_CURL)\"\n local u code\n for u in \"$@\"; do\n case \"$u\" in http://*|https://*) ;; *) die \"http: '$u' is not an http(s) URL\" ;; esac\n code=\"$(\"$CURL\" -s -o /dev/null -L --max-time 15 -w '%{http_code}' \"$u\" 2>/dev/null)\" || code=\"${code:-000}\"\n [ -n \"$code\" ] || code=\"000\"\n printf '%s %s\\n' \"$code\" \"$u\"\n done\n # A down site is a fact for the report, not a script failure.\n return 0\n}\n\ncase \"$CMD\" in\n bar) cmd_bar \"$@\" ;;\n pct) cmd_pct \"$@\" ;;\n repo) cmd_repo \"$@\" ;;\n lines) cmd_lines \"$@\" ;;\n http) cmd_http \"$@\" ;;\n ''|-h|--help|help) sed -n '2,26p' \"$0\" ;;\n *) die \"unknown command: $CMD (bar, pct, repo, lines, http)\" ;;\nesac\n"
253
+ }
254
+ ]
45
255
  }
46
256
  ];
47
257
  /** Bundle version, from mzizi-skills/index.json. */
48
- export const SKILLS_VERSION = "0.9.0";
258
+ export const SKILLS_VERSION = "0.15.0";
49
259
  //# sourceMappingURL=skills.js.map