{
  "metadata": {
    "title": "Ryan Snowden - Full Site Content",
    "description": "Structured content payload for AI agents and LLMs.",
    "generatedAt": "2026-08-12T11:24:06.447Z",
    "baseUrl": "https://ryansnowden.com/"
  },
  "collections": {
    "writing": [
      {
        "id": "bias-in-ux",
        "type": "writing",
        "title": "Bias in UX and Organizational Decision Making",
        "description": "A comprehensive analysis of detecting, preventing, and strategically mitigating cognitive bias in service and product design.",
        "date": "2026-02-14T00:00:00.000Z",
        "category": null,
        "tags": [
          "UX",
          "Cognitive Bias",
          "Design Strategy",
          "Organizational Psychology"
        ],
        "url": "https://ryansnowden.com/writing/bias-in-ux/",
        "content": "import { Mermaid } from '../../components/graphics/Mermaid';\n\n\n## The Cognitive Architecture of Design\n\nIn the contemporary digital ecosystem, the primary material of design is no longer the pixel, but the human mind. This shift has transitioned Product and Service Design from aesthetic form to behavioral science. At the core of this transition lies a complex network of systemic deviations from rationality: cognitive biases.\n\nThese biases are not mere bugs to be patched; they are fundamental, evolutionary features of cognition that dictate how users perceive value, navigate information, and trust automated systems. As we integrate AI and machine learning into our design loops, the stakes have escalated. Algorithmic determinism threatens to scale historical prejudices into automated logic, making a nuanced understanding of bias a professional imperative for the modern practitioner.\n\n### The Dual-Process Foundation\n\nOur understanding of bias begins with **Dual-Process Theory**:\n\n<div class=\"my-8\">\n  ![Conceptual illustration of System 1 and System 2 thinking](../../assets/media/bias-article/dual-process.png)\n</div>\n\n- **System 1 (Fast, Intuitive):** Automatic and effortless. This is where heuristics (mental shortcuts) operate. It’s the user judging credibility based on a split-second aesthetic impression.\n- **System 2 (Slow, Deliberative):** Effortful mental activity, like comparing subscription tiers. \n\nUsers default to System 1 to conserve energy. Biases arise when System 1’s shortcuts fail in modern environments or when System 2 fails to correct these intuitive errors.\n\n## Detecting Bias: A Taxonomy for Designers\n\nTo design effectively, we must distinguish between the biases of the **User**, the **Creator**, and the **System**.\n\n<Mermaid client:visible chart={`\nflowchart TD\n    subgraph Users [\"The User's Lens\"]\n        direction LR\n        A[Confirmation Bias]:::bias\n        B[Halo Effect]:::bias\n        C[Peak-End Rule]:::bias\n    end\n\n    subgraph Creators [\"The Creator's Lens\"]\n        direction LR\n        D[Curse of Knowledge]:::bias\n        E[Validation Theater]:::bias\n        F[Sampling Bias]:::bias\n    end\n\n    subgraph Systems [\"The System's Lens\"]\n        direction LR\n        G[Historical Bias]:::bias\n        H[Measurement Bias]:::bias\n        I[Proxy Bias]:::bias\n    end\n\n    Users --- Creators\n    Creators --- Systems\n\n    classDef default fill:#0f172a,stroke:#334155,color:#cbd5e1\n    classDef bias fill:#1e1b4b,stroke:#4338ca,color:#e0e7ff,stroke-width:2px\n`} />\n\n### 1. Cognitive Biases (The User's Lens)\n\nThese are \"predictably irrational\" patterns that govern user perception.\n\n| Bias | Description | Impact |\n| :--- | :--- | :--- |\n| **Confirmation Bias** | Seeking info that confirms existing beliefs. | Users ignore help text that contradicts their mental model. |\n| **The Halo Effect** | Impressions in one area influence another. | A beautiful UI is perceived as more functional (**Aesthetic-Usability Effect**). |\n| **Peak-End Rule** | Judging experiences by their peak and their end. | Over-investing in the \"final interaction\" yields higher retention. |\n| **Hyperbolic Discounting** | Preferring smaller, immediate rewards. | Users struggle with long-term goals like saving or health. |\n\n### 2. Researcher Biases (The Creator's Lens)\n\nThe distortions introduced by the design team can lead to products that solve the wrong problems.\n\n*   **The Curse of Knowledge:** Assuming users have the same background context as the designer, leading to jargon-heavy interfaces.\n*   **Validation Theater:** selectively weighting participants who validate a hypothesis while dismissing dissenters as \"outliers.\"\n*   **Sampling Bias:** Testing exclusively with \"WEIRD\" (Western, Educated, Industrialized, Rich, Democratic) populations.\n\n### 3. Algorithmic & Systemic Biases (The System's Lens)\n\nIn the age of AI, bias is often encoded into the system's logic.\n\n*   **Historical Bias:** Models trained on past discriminatory data scale that inequity (e.g., AI hiring tools penalizing \"women’s\" resume terms).\n*   **Measurement Bias:** Using poor proxies for variables, such as using \"healthcare cost\" as a proxy for \"healthcare need.\"\n\n## The \"Six Minds\" Framework: Mapping Cognitive Terrain\n\nTo detect bias effectively, designers need a diagnostic framework. John Whalen’s **Six Minds** dissects UX into component cognitive processes:\n\n1.  **Vision and Attention:** The brain filters out non-relevant stimuli. **Inattentional Blindness** causes users to miss critical alerts if they are focused on a specific task.\n2.  **Wayfinding:** Users build mental maps. **Spatial Distortion** occurs when a designer biases navigation based on internal org charts rather than user associative maps.\n3.  **Memory and Semantics:** The brain relies on schemas. **Jakob’s Law** dictates that users expect your site to work like all others. Violating this increases cognitive load.\n4.  **Language:** Communication is the structure of thought. Using internal jargon introduces linguistic bias that degrades trust.\n5.  **Decision Making:** Choices are influenced by **Framing**. The same number is perceived differently as a \"95% success rate\" vs. a \"5% failure rate.\"\n6.  **Emotion:** The **Affect Heuristic** explain that our emotional state determines risk perception. Stress narrows the cognitive tunnel.\n\n## Behavioral Heuristics in Strategy: \"The Choice Factory\"\n\nIn commercial design, bias acts as a toolkit for influence, and a checklist for ethics.\n\n*   **Social Proof:** We adopt behaviors when others do. However, **Negative Social Proof** (e.g., \"Too many people miss appointments\") can accidentally normalize the bad behavior.\n*   **Default Bias:** Users rarely change default settings. The designer’s choice of default is an invisible but powerful bias steering behavior.\n*   **The IKEA Effect:** Users value what they help build. AI tools that allow \"tweaking\" leverage this to build ownership.\n\n## The AI Frontier: Automated Inequality\n\nThe intersection of UX and AI is the critical frontier. As interfaces shift to intent-based agents, bias migrates from the surface (layout) to the core (logic).\n\n<div class=\"my-8\">\n  ![Conceptual representation of AI bias and data streams](../../assets/media/bias-article/ai-inequality.png)\n</div>\n\n- **Explainability:** Users have a right to know *why* a decision was made. \"Black box\" UX is unethical in consequential services.\n- **Augmentation over Replacement:** Design AI to augment human decision-making, keeping a \"human in the loop,\" rather than replacing agency entirely.\n\n## Conclusion: The Ethical Mandate\n\nThe detection and prevention of bias is not a phase; it is the discipline itself. A \"good\" product in 2026 must be more than frictionless and delightful; it must be fair, resilient, and honest.\n\nWe cannot eliminate cognitive bias, but we can design protocols, such as **Portigal’s Brain Dump** or **Wendel’s DECIDE framework**, to mitigate their harm. The ethical designer does not ask \"How do I make the user do X?\" but rather \"How do I help the user achieve their goal, free from the distortions of my own bias?\""
      },
      {
        "id": "markdown-guide",
        "type": "writing",
        "title": "Markdown Style Guide",
        "description": "A comprehensive guide to Markdown syntax",
        "date": "2025-01-15T00:00:00.000Z",
        "category": null,
        "tags": null,
        "url": "https://ryansnowden.com/writing/markdown-guide/",
        "content": "Here is a sample of some basic Markdown syntax that can be used when writing Markdown content in Astro.\n\n## Headings\n\nThe following HTML `<h1>` through `<h6>` elements represent six levels of section headings. `<h1>` is the highest section level while `<h6>` is the lowest.\n\n# H1\n\n## H2\n\n### H3\n\n#### H4\n\n##### H5\n\n###### H6\n\n## Paragraph\n\nXerum, quo qui aut unt expliquam qui dolut labo. Aque venitatiusda cum, voluptionse latur sitiae dolessi aut parist aut dollo enim qui voluptate ma dolestendit peritin re plis aut quas inctum laceat est volestemque commosa as cus endigna tectur, offic to cor sequas etum rerum idem sintibus eiur? Quianimin porecus evelectur, cum que nis nust voloribus ratem aut omnimi, sitatur? Quiatem. Nam, omnis sum am facea corem alique molestrunt et eos evelece arcillit ut aut eos eos nus, sin conecerem erum fuga. Ri oditatquam, ad quibus unda veliamenimin cusam et facea ipsamus es exerum sitate dolores editium rerore eost, temped molorro ratiae volorro te reribus dolorer sperchicium faceata tiustia prat.\n\nItatur? Quiatae cullecum rem ent aut odis in re eossequodi nonsequ idebis ne sapicia is sinveli squiatum, core et que aut hariosam ex eat.\n\n## Images\n\n### Syntax\n\n```markdown\n![Alt text](./full/or/relative/path/of/image)\n```\n\n### Output\n\n![blog placeholder](../../assets/placeholder.jpg)\n\n## Blockquotes\n\nThe blockquote element represents content that is quoted from another source, optionally with a citation which must be within a `footer` or `cite` element, and optionally with in-line changes such as annotations and abbreviations.\n\n### Blockquote without attribution\n\n#### Syntax\n\n```markdown\n> Tiam, ad mint andaepu dandae nostion secatur sequo quae.  \n> **Note** that you can use _Markdown syntax_ within a blockquote.\n```\n\n#### Output\n\n> Tiam, ad mint andaepu dandae nostion secatur sequo quae.  \n> **Note** that you can use _Markdown syntax_ within a blockquote.\n\n### Blockquote with attribution\n\n#### Syntax\n\n```markdown\n> Don't communicate by sharing memory, share memory by communicating.<br>\n> <cite>Rob Pike[^1]</cite>\n```\n\n#### Output\n\n> Don't communicate by sharing memory, share memory by communicating.<br>\n> <cite>Rob Pike[^1]</cite>\n\n[^1]: The above quote is excerpted from Rob Pike's [talk](https://www.youtube.com/watch?v=PAAkCSZUG1c) during Gopherfest, November 18, 2015.\n\n## Tables\n\n### Syntax\n\n```markdown\n| Italics   | Bold     | Code   |\n| --------- | -------- | ------ |\n| _italics_ | **bold** | `code` |\n```\n\n### Output\n\n| Italics   | Bold     | Code   |\n| --------- | -------- | ------ |\n| _italics_ | **bold** | `code` |\n\n## Code Blocks\n\n### Syntax\n\nwe can use 3 backticks ``` in new line and write snippet and close with 3 backticks on new line and to highlight language specific syntax, write one word of language name after first 3 backticks, for eg. html, javascript, css, markdown, typescript, txt, bash\n\n````markdown\n```html\n<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Example HTML5 Document</title>\n  </head>\n  <body>\n    <p>Test</p>\n  </body>\n</html>\n```\n````\n\n### Output\n\n```html\n<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Example HTML5 Document</title>\n  </head>\n  <body>\n    <p>Test</p>\n  </body>\n</html>\n```\n\n## List Types\n\n### Ordered List\n\n#### Syntax\n\n```markdown\n1. First item\n2. Second item\n3. Third item\n```\n\n#### Output\n\n1. First item\n2. Second item\n3. Third item\n\n### Unordered List\n\n#### Syntax\n\n```markdown\n- List item\n- Another item\n- And another item\n```\n\n#### Output\n\n- List item\n- Another item\n- And another item\n\n### Nested list\n\n#### Syntax\n\n```markdown\n- Fruit\n  - Apple\n  - Orange\n  - Banana\n- Dairy\n  - Milk\n  - Cheese\n```\n\n#### Output\n\n- Fruit\n  - Apple\n  - Orange\n  - Banana\n- Dairy\n  - Milk\n  - Cheese\n\n## Other Elements: abbr, sub, sup, kbd, mark\n\n### Syntax\n\n```markdown\n<abbr title=\"Graphics Interchange Format\">GIF</abbr> is a bitmap image format.\n\nH<sub>2</sub>O\n\nX<sup>n</sup> + Y<sup>n</sup> = Z<sup>n</sup>\n\nPress <kbd>CTRL</kbd> + <kbd>ALT</kbd> + <kbd>Delete</kbd> to end the session.\n\nMost <mark>salamanders</mark> are nocturnal, and hunt for insects, worms, and other small creatures.\n```\n\n### Output\n\n<abbr title=\"Graphics Interchange Format\">GIF</abbr> is a bitmap image format.\n\nH<sub>2</sub>O\n\nX<sup>n</sup> + Y<sup>n</sup> = Z<sup>n</sup>\n\nPress <kbd>CTRL</kbd> + <kbd>ALT</kbd> + <kbd>Delete</kbd> to end the session.\n\nMost <mark>salamanders</mark> are nocturnal, and hunt for insects, worms, and other small creatures."
      },
      {
        "id": "using-mdx",
        "type": "writing",
        "title": "Using MDX",
        "description": "Lorem ipsum dolor sit amet",
        "date": "2024-06-01T00:00:00.000Z",
        "category": null,
        "tags": null,
        "url": "https://ryansnowden.com/writing/using-mdx/",
        "content": "This theme comes with the [@astrojs/mdx](https://docs.astro.build/en/guides/integrations-guide/mdx/) integration installed and configured in your `astro.config.mjs` config file. If you prefer not to use MDX, you can disable support by removing the integration from your config file.\n\n## Why MDX?\n\nMDX is a special flavor of Markdown that supports embedded JavaScript & JSX syntax. This unlocks the ability to [mix JavaScript and UI Components into your Markdown content](https://docs.astro.build/en/guides/markdown-content/#mdx-features) for things like interactive charts or alerts.\n\nIf you have existing content authored in MDX, this integration will hopefully make migrating to Astro a breeze.\n\n## Example\n\nHere is how you import and use a UI component inside of MDX.  \nWhen you open this page in the browser, you should see the clickable button below.\n\nimport HeaderLink from '../../components/layout/HeaderLink.astro';\n\n<HeaderLink href=\"#\" onclick=\"alert('clicked!')\">\n\tEmbedded component in MDX\n</HeaderLink>\n\n## More Links\n\n- [MDX Syntax Documentation](https://mdxjs.com/docs/what-is-mdx)\n- [Astro Usage Documentation](https://docs.astro.build/en/guides/markdown-content/#markdown-and-mdx-pages)\n- **Note:** [Client Directives](https://docs.astro.build/en/reference/directives-reference/#client-directives) are still required to create interactive components. Otherwise, all components in your MDX will render as static HTML (no JavaScript) by default."
      }
    ],
    "labs": [
      {
        "id": "ca-immune-system",
        "type": "labs",
        "title": "Cellular Automata + Immune System",
        "description": "An interactive model exploring how corporate culture, executive cover, and risk controls react when teams test new ideas.",
        "date": "2026-07-21T00:00:00.000Z",
        "category": null,
        "tags": null,
        "url": "https://ryansnowden.com/labs/ca-immune-system/",
        "content": "import CAImmuneSystem from '../../components/simulations/ca-immune-system/CAImmuneSystem.tsx';\nimport ScenarioCard from '../../components/ui/ScenarioCard.astro';\n\n<section class=\"not-prose quote py-2 md:py-3 px-4 max-w-xl mx-auto text-center\">\n    <blockquote class=\"font-serif text-base md:text-lg italic text-slate-800 dark:text-slate-100 leading-snug border-none p-0 before:content-none after:content-none m-0\">\n        Since when do you tell the enemy you have won?\n        <footer class=\"mt-2 text-[10px] md:text-xs not-italic font-sans text-slate-500 uppercase tracking-widest\">Mazer Rackham, Enders Game (Also, Sun Tzu)</footer>\n    </blockquote>\n</section>\n\n<div class=\"breakout breakout-both mt-10 mb-10\" style={{ height: '800px' }}>\n  <CAImmuneSystem client:only=\"react\" />\n</div>\n\n<details class=\"my-6 p-3 bg-transparent border-2 border-slate-800 rounded-xl\">\n    <summary class=\"cursor-pointer font-medium text-slate-400 flex items-center gap-2 list-none text-xs\">\n        <span class=\"uppercase tracking-wider\">Built With</span>\n        <svg class=\"w-3 h-3 transition-transform details-chevron\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n            <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n        </svg>\n    </summary>\n    <div class=\"mt-3 grid grid-cols-2 md:grid-cols-3 gap-2\">\n        <div class=\"p-2 bg-transparent rounded-lg border-2 border-slate-800\">\n            <div class=\"text-[10px] uppercase tracking-wider text-slate-500 mb-0.5\">Language</div>\n            <div class=\"text-xs font-medium text-slate-200\">TypeScript</div>\n        </div>\n        <div class=\"p-2 bg-transparent rounded-lg border-2 border-slate-800\">\n            <div class=\"text-[10px] uppercase tracking-wider text-slate-500 mb-0.5\">Architecture</div>\n            <div class=\"text-xs font-medium text-slate-200\">Cellular Automata</div>\n        </div>\n        <div class=\"p-2 bg-transparent rounded-lg border-2 border-slate-800\">\n            <div class=\"text-[10px] uppercase tracking-wider text-slate-500 mb-0.5\">Rendering</div>\n            <div class=\"text-xs font-medium text-slate-200\">Canvas API (60fps)</div>\n        </div>\n    </div>\n</details>\n\n<details open class=\"group mb-8\">\n    <summary class=\"cursor-pointer list-none select-none\">\n        <div class=\"flex items-center gap-2\">\n            <svg class=\"w-5 h-5 transition-transform group-open:rotate-180\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n            </svg>\n            <h3 class=\"m-0!\">Overview</h3>\n        </div>\n    </summary>\n    <div class=\"mt-4 text-slate-300\">\n        Every organization has a self-defense mechanism — an \"immune system\" made of risk rules, compliance checks, and middle-management habits. This simulation models what happens when teams test new ways of working: do good ideas gain traction, get shielded by leadership, or get crushed by corporate bureaucracy?\n    </div>\n</details>\n\n<details class=\"group mb-8\">\n    <summary class=\"cursor-pointer list-none select-none\">\n        <div class=\"flex items-center gap-2\">\n            <svg class=\"w-5 h-5 transition-transform group-open:rotate-180\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n            </svg>\n            <h3 class=\"m-0!\">The Legend</h3>\n        </div>\n    </summary>\n    <div class=\"mt-4\">\n        <div class=\"space-y-4 not-prose text-slate-300\">\n            <div class=\"flex items-start gap-3\">\n                <div class=\"w-6 h-6 flex-shrink-0 bg-slate-800 rounded mt-0.5 border border-slate-700\"></div>\n                <div>\n                    <h4 class=\"font-semibold text-base m-0 p-0 leading-tight\">Standard Operations</h4>\n                    <p class=\"m-0 text-sm text-slate-400 mt-1\">Stable, reliable baseline operating within standard procedures.</p>\n                </div>\n            </div>\n            <div class=\"flex items-start gap-3\">\n                <div class=\"w-6 h-6 flex-shrink-0 bg-amber-300 rounded mt-0.5 border border-amber-400\"></div>\n                <div>\n                    <h4 class=\"font-semibold text-base m-0 p-0 leading-tight\">Exploring Ideas</h4>\n                    <p class=\"m-0 text-sm text-slate-400 mt-1\">Testing novel approaches and localized variations.</p>\n                </div>\n            </div>\n            <div class=\"flex items-start gap-3\">\n                <div class=\"w-6 h-6 flex-shrink-0 bg-orange-400 rounded mt-0.5 border border-orange-500\"></div>\n                <div>\n                    <h4 class=\"font-semibold text-base m-0 p-0 leading-tight\">Exposed to Risk</h4>\n                    <p class=\"m-0 text-sm text-slate-400 mt-1\">Visible to risk/compliance officers, lacking evidence to justify itself.</p>\n                </div>\n            </div>\n            <div class=\"flex items-start gap-3\">\n                <div class=\"w-6 h-6 flex-shrink-0 bg-red-500 rounded mt-0.5 border border-red-600\"></div>\n                <div>\n                    <h4 class=\"font-semibold text-base m-0 p-0 leading-tight\">Under Attack</h4>\n                    <p class=\"m-0 text-sm text-slate-400 mt-1\">Actively suppressed by risk management or audit controls.</p>\n                </div>\n            </div>\n            <div class=\"flex items-start gap-3\">\n                <div class=\"w-6 h-6 flex-shrink-0 bg-purple-500 rounded mt-0.5 border border-purple-600\"></div>\n                <div>\n                    <h4 class=\"font-semibold text-base m-0 p-0 leading-tight\">Executive Cover</h4>\n                    <p class=\"m-0 text-sm text-slate-400 mt-1\">Shielded from compliance shutdown by leadership sponsorship.</p>\n                </div>\n            </div>\n            <div class=\"flex items-start gap-3\">\n                <div class=\"w-6 h-6 flex-shrink-0 bg-cyan-500 rounded mt-0.5 border border-cyan-600\"></div>\n                <div>\n                    <h4 class=\"font-semibold text-base m-0 p-0 leading-tight\">Proven & Adopted</h4>\n                    <p class=\"m-0 text-sm text-slate-400 mt-1\">Accumulated enough evidence to become an accepted new practice.</p>\n                </div>\n            </div>\n            <div class=\"flex items-start gap-3\">\n                <div class=\"w-6 h-6 flex-shrink-0 bg-red-900 rounded mt-0.5 border border-red-800\"></div>\n                <div>\n                    <h4 class=\"font-semibold text-base m-0 p-0 leading-tight\">Institutional Scar Tissue</h4>\n                    <p class=\"m-0 text-sm text-slate-400 mt-1\">Trauma from past failed initiatives. Highly sensitive to new change.</p>\n                </div>\n            </div>\n            <div class=\"flex items-start gap-3\">\n                <div class=\"w-6 h-6 flex-shrink-0 bg-black rounded mt-0.5 border border-slate-900\"></div>\n                <div>\n                    <h4 class=\"font-semibold text-base m-0 p-0 leading-tight\">Operational Collapse</h4>\n                    <p class=\"m-0 text-sm text-slate-400 mt-1\">Lost all functional capacity; abandoned or broken process.</p>\n                </div>\n            </div>\n        </div>\n    </div>\n</details>\n\n<details open class=\"group mb-8\">\n    <summary class=\"cursor-pointer list-none select-none\">\n        <div class=\"flex items-center gap-2\">\n            <svg class=\"w-5 h-5 transition-transform group-open:rotate-180\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n            </svg>\n            <h3 class=\"m-0!\">Scenarios</h3>\n        </div>\n    </summary>\n    <div class=\"mt-4\">\n        <div class=\"grid md:grid-cols-1 gap-6\">\n            <ScenarioCard title=\"Viral Idea\" config=\"High Cover, High Contagion, No Evidence\">\n                <div class=\"mb-4 h-96 overflow-hidden rounded-xl border border-slate-800\">\n                    <CAImmuneSystem client:only=\"react\" initialScenario=\"Viral Idea\" embedded={true} />\n                </div>\n                <p class=\"mb-0 mt-0 text-slate-300\">When executives mandate a hype trend across the company without real proof or local testing, it spreads like wildfire — disrupting core work until teams burn out and operations break down.</p>\n            </ScenarioCard>\n\n            <ScenarioCard title=\"Resistance to Change\" config=\"Hypersensitivity, Zero Forgetting\">\n                <div class=\"mb-4 h-96 overflow-hidden rounded-xl border border-slate-800\">\n                    <CAImmuneSystem client:only=\"react\" initialScenario=\"Resistance to Change\" embedded={true} />\n                </div>\n                <p class=\"mb-0 mt-0 text-slate-300\">Scarred by past failed projects, the organization panics at the slightest change. Compliance officers overreact, surrounding teams with red tape until normal work grinds to a halt.</p>\n            </ScenarioCard>\n\n            <ScenarioCard title=\"Innovation Theatre\" config=\"High Executive Cover, Absolute Scar Tissue\">\n                <div class=\"mb-4 h-96 overflow-hidden rounded-xl border border-slate-800\">\n                    <CAImmuneSystem client:only=\"react\" initialScenario=\"Innovation Theatre\" embedded={true} />\n                </div>\n                <p class=\"mb-0 mt-0 text-slate-300\">Leaders demand innovation, but teams have seen too many short-lived initiatives fail. Everyone pretends to participate while secretly waiting out the mandate until things return to normal.</p>\n            </ScenarioCard>\n\n            <ScenarioCard title=\"Stagnant Decline\" config=\"Zero Innovation, Accruing Technical Debt\">\n                <div class=\"mb-4 h-96 overflow-hidden rounded-xl border border-slate-800\">\n                    <CAImmuneSystem client:only=\"react\" initialScenario=\"Stagnant Decline\" embedded={true} />\n                </div>\n                <p class=\"mb-0 mt-0 text-slate-300\">Teams play it safe and never try anything new. To avoid scrutiny, they stick strictly to outdated methods — until hidden technical debt builds up and entire departments quietly collapse.</p>\n            </ScenarioCard>\n\n            <ScenarioCard title=\"Autoimmune Storm\" config=\"Positive Feedback, Scar Tissue Cascade\">\n                <div class=\"mb-4 h-96 overflow-hidden rounded-xl border border-slate-800\">\n                    <CAImmuneSystem client:only=\"react\" initialScenario=\"Autoimmune Storm\" embedded={true} />\n                </div>\n                <p class=\"mb-0 mt-0 text-slate-300\">A small mistake triggers an overreaction. Fear from past failed projects causes compliance rules to snowball, eventually shutting down healthy teams doing normal work.</p>\n            </ScenarioCard>\n\n            <ScenarioCard title=\"Stealth Pathogen\" config=\"Invisible Debt, Delayed Shock T300\">\n                <div class=\"mb-4 h-96 overflow-hidden rounded-xl border border-slate-800\">\n                    <CAImmuneSystem client:only=\"react\" initialScenario=\"Stealth Pathogen\" embedded={true} />\n                </div>\n                <p class=\"mb-0 mt-0 text-slate-300\">The company looks healthy on the surface, but underneath, years of avoiding risk have created fragile workarounds. A sudden market shock at tick 300 reveals the hidden weakness, causing widespread collapse.</p>\n            </ScenarioCard>\n\n            <ScenarioCard title=\"Quarantine Lab\" config=\"Geographic Isolation, Shock T400\">\n                <div class=\"mb-4 h-96 overflow-hidden rounded-xl border border-slate-800\">\n                    <CAImmuneSystem client:only=\"react\" initialScenario=\"Quarantine Lab\" embedded={true} />\n                </div>\n                <p class=\"mb-0 mt-0 text-slate-300\">An R&D team is isolated behind a protective barrier (amber line). The lab succeeds in its bubble, but because its learnings never reach the main company, an external crisis at tick 400 eventually drags the whole enterprise down.</p>\n            </ScenarioCard>\n\n            <ScenarioCard title=\"Adaptive Network\" config=\"Small-World Shortcuts, Non-Local Evidence\">\n                <div class=\"mb-4 h-96 overflow-hidden rounded-xl border border-slate-800\">\n                    <CAImmuneSystem client:only=\"react\" initialScenario=\"Adaptive Network\" embedded={true} />\n                </div>\n                <p class=\"mb-0 mt-0 text-slate-300\">Grassroots connections (cyan threads) allow teams to share proven ideas directly across silos. By routing around bureaucratic blockers, good ideas gain traction far faster than through top-down mandates.</p>\n            </ScenarioCard>\n        </div>\n    </div>\n</details>"
      },
      {
        "id": "design-is-dead",
        "type": "labs",
        "title": "Design is Dead",
        "description": "AI changed the design loop forever. See how rapid generation and instant feedback replace the traditional double diamond process.",
        "date": "2026-03-02T00:00:00.000Z",
        "category": null,
        "tags": null,
        "url": "https://ryansnowden.com/labs/design-is-dead/",
        "content": "import DesignIsDeadSimulator from '../../components/simulations/DesignIsDeadSimulator.tsx';\nimport ScenarioCard from '../../components/ui/ScenarioCard.astro';\nimport Accordion from '../../components/ui/Accordion.astro';\n\n<div class=\"flex justify-center mb-6\">\n  <span class=\"inline-flex items-center px-4 py-2 rounded-full text-xs font-medium uppercase tracking-wider bg-indigo-900 text-indigo-200\">Work in Progress</span>\n</div>\n\n<div class=\"breakout\">\n  <DesignIsDeadSimulator fullWidth={true} client:load client:only=\"react\" />\n</div>\n\n<details class=\"my-6 p-3 bg-transparent border-2 border-slate-200 dark:border-slate-800 rounded-xl\">\n    <summary class=\"cursor-pointer font-medium text-slate-500 dark:text-slate-400 flex items-center gap-2 list-none text-xs\">\n        <span class=\"uppercase tracking-wider\">Built With</span>\n        <svg class=\"w-3 h-3 transition-transform details-chevron\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n            <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n        </svg>\n    </summary>\n    <div class=\"mt-3 grid grid-cols-2 md:grid-cols-3 gap-2\">\n        <div class=\"p-2 bg-transparent rounded-lg border-2 border-slate-200 dark:border-slate-800\">\n            <div class=\"text-[10px] uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-0.5\">Language</div>\n            <div class=\"text-xs font-medium text-slate-700 dark:text-slate-200\">TypeScript</div>\n        </div>\n        <div class=\"p-2 bg-transparent rounded-lg border-2 border-slate-200 dark:border-slate-800\">\n            <div class=\"text-[10px] uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-0.5\">Framework</div>\n            <div class=\"text-xs font-medium text-slate-700 dark:text-slate-200\">React</div>\n        </div>\n        <div class=\"p-2 bg-transparent rounded-lg border-2 border-slate-200 dark:border-slate-800\">\n            <div class=\"text-[10px] uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-0.5\">Rendering</div>\n            <div class=\"text-xs font-medium text-slate-700 dark:text-slate-200\">Canvas API</div>\n        </div>\n        <div class=\"p-2 bg-transparent rounded-lg border-2 border-slate-200 dark:border-slate-800\">\n            <div class=\"text-[10px] uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-0.5\">Icons</div>\n            <div class=\"text-xs font-medium text-slate-700 dark:text-slate-200\">Lucide React</div>\n        </div>\n        <div class=\"p-2 bg-transparent rounded-lg border-2 border-slate-200 dark:border-slate-800\">\n            <div class=\"text-[10px] uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-0.5\">Simulation</div>\n            <div class=\"text-xs font-medium text-slate-700 dark:text-slate-200\">Step-by-Step Events</div>\n        </div>\n        <div class=\"p-2 bg-transparent rounded-lg border-2 border-slate-200 dark:border-slate-800\">\n            <div class=\"text-[10px] uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-0.5\">Static Site</div>\n            <div class=\"text-xs font-medium text-slate-700 dark:text-slate-200\">Astro</div>\n        </div>\n    </div>\n</details>\n\n<Accordion title=\"Overview\" open={true}>\n\n        This simulation models the new loop: quick concept, real prototype in code with AI, live jam with design and engineering, ship small, learn, adjust vision. Design has split into two modes that designers move between.\n    \n        It is based on [a video](https://www.youtube.com/watch?v=eh8bcBIAAFo) interviewing Jenny Wen (head of design at Claude). She talks about how traditional research, diverge, converge (double diamond-esque) workflows are no longer effective with AI. You will find paraphrased excerpts from the video in the text.\n\n        I built this to show how one of these new loops works. Some scenarios (such as Technical Debt Spiral) introduces behavioural and technical issues that can impact worflow.\n\n        It took about 16 hours to get the parameters right and another 2 to put together the visual guide. Still a work in progress. It needs a comparison of the traditional loop running alongside it in the same 2-week sprint.\n\n        Other concepts follow the same themes: \n        \n        1. AI-native double diamond\n        2. Code-first \"vibe coding\" loops\n        3. Human-AI collaboration frameworks like the Argyle Design Framework\n        4. Teams rejecting formal process entirely in favour of something custom\n\n        Importantly, there is a skills and mindset shift. Strong generalists (like myself), deep specialists and \"crafty new grads\" are well poised for this workflow. It is a less siloed approach to design and engineering, that removes gatekeeping.      \n\n        <h4>What it shows</h4>\n\n        The simulation shows how different process setups affect throughput, cycle time, design coherence and cost efficiency. You can see why skipping design creates compounding problems through design system erosion. AI failure modes, from hallucination to agent conflicts to capability cliffs, create new kinds of friction. \"Vibe coding\" without understanding creates debt spirals. And the new cost model makes the core point clearer: throughput alone is not efficiency.\n\n</Accordion>\n\n<Accordion title=\"Quick explanation\">\n\n        #### The flow\n\n        Ideas enter from the left and flow through **Vision Mode** (frame the opportunity), **AI Build** (prototype with engineering), **Design Execution** (structure, polish, design system), and **Ship**. After shipping, items enter **Observe + Learn**, then **Adjust Direction** where they are killed, refined (back to Vision), or pivoted (back to Build).\n\n        #### What to watch\n\n        - **Queue buildup in stages:** When dots pile up inside a zone, that stage is a bottleneck. Traditional Waterfall shows this in Vision. Agent Swarm shows it in Build.\n        - **Green rings on dots:** Items on their 2nd+ loop through the system. Some iteration is healthy. Too much means the system is churning.\n        - **Coherence bar:** The green bar at the bottom of the Design zone. Watch it drop when items skip design (especially in \"Vibe Coding\" and \"No Design\" scenarios).\n        - **Cost signals:** Use cost to compare burn against useful output. Fast, messy scenarios can look productive while becoming more expensive per meaningful ship.\n        - **Blocked servers:** Red warning servers in AI Build mean agent conflicts. Multiple AI tools are producing conflicting code.\n        - **Ideas backlog:** The number in the Ideas box shows how many ideas are waiting to enter the system. When Vision is full, ideas queue up.\n\n        #### The key moment\n\n        Run \"Vibe Coding\" and watch throughput spike at first. Then watch the kill rate climb, coherence drop and cost efficiency worsen. The system produces lots of movement but ships less value over time. Now switch to \"AI + Design Partnership\" and see the difference.\n\n</Accordion>\n\n<Accordion title=\"Scenarios\">\n\n        <p class=\"mb-6\">Eight scenarios showing different setups of the AI-accelerated design process.</p>\n\n        <div class=\"grid md:grid-cols-1 gap-6\">\n            <ScenarioCard title=\"AI + Design Partnership\" config=\"Balanced build speed, 85% design involvement\">\n                <p class=\"mb-0 mt-0\">The ideal state. Fast AI build paired with active design produces steady throughput, high coherence and stronger cost efficiency. Designers guide fast-moving engineering rather than gatekeeping.</p>\n            </ScenarioCard>\n\n            <ScenarioCard title=\"Traditional Waterfall\" config=\"Slow vision, slow build, 100% design involvement\">\n                <p class=\"mb-0 mt-0\">The old world. Everything queues for vision (upfront spec), build is slow (no AI), and design reviews everything. Throughput is low but coherence is perfect. The cost is time.</p>\n            </ScenarioCard>\n\n            <ScenarioCard title=\"AI-Accelerated (No Design)\" config=\"Fast build, 10% design, high hallucination. Skill Atrophy + Review Fatigue active.\">\n                <p class=\"mb-0 mt-0\">Engineering adopts AI but design does not adapt. High throughput at first, but the kill rate climbs because shipped work is incoherent. It can look efficient until rework and wasted output push the real cost up.</p>\n            </ScenarioCard>\n\n            <ScenarioCard title=\"Enterprise Garage\" config=\"Slower vision (discovery), disciplined execution\">\n                <p class=\"mb-0 mt-0\">Adds a deliberate discovery phase before vision. Slower to start but higher quality input. Lower kill rate, better outcomes. Shows why framing the problem well matters even in a fast loop.</p>\n            </ScenarioCard>\n\n            <ScenarioCard title=\"Vibe Coding\" config=\"Max build speed, 5% design. Skill Atrophy + Review Fatigue + Cognitive Debt active.\">\n                <p class=\"mb-0 mt-0\">\"Move fast and break everything.\" Items fly through but nobody understands the code. Watch the vibe debt rings grow with each loop. The output looks cheap at first, then rework and low coherence make each useful ship more expensive.</p>\n            </ScenarioCard>\n\n            <ScenarioCard title=\"Agent Swarm\" config=\"6 build servers, 35% agent conflict. Productivity Paradox active.\">\n                <p class=\"mb-0 mt-0\">Running many AI agents without coordination. Individual speed is fast but conflicts dominate. More agents means more merge conflicts, and the extra burn can outweigh the parallel speed gains.</p>\n            </ScenarioCard>\n\n            <ScenarioCard title=\"Context Collapse\" config=\"Context decay ON, moderate WIP. Review Fatigue + Cognitive Debt active.\">\n                <p class=\"mb-0 mt-0\">Starts well. But as WIP grows and the codebase gets larger, AI build speed degrades. Items that took 1x now take 3x. Meanwhile, the team gets comfortable trusting AI output and stops checking carefully.</p>\n            </ScenarioCard>\n\n            <ScenarioCard title=\"Technical Debt Spiral\" config=\"Vibe debt ON, design erosion ON. Skill Atrophy + Cognitive Debt active.\">\n                <p class=\"mb-0 mt-0\">The compounding nightmare. Each time an item loops back, its processing time grows. Meanwhile, coherence drops, making future design work slower. Watch cycle time accelerate over the simulation's runtime.</p>\n            </ScenarioCard>\n        </div>\n</Accordion>\n\n<div class=\"space-y-12 my-12\">\n    <section>\n        <Accordion title=\"The New Loop\" class=\"mb-0\">\n                <p class=\"mb-6\">The simulation models two modes that designers move between:</p>\n\n                <div class=\"grid md:grid-cols-2 gap-6\">\n                    <div class=\"bg-white dark:bg-slate-900 border-2 border-slate-200 dark:border-slate-800 rounded-xl p-6 py-0\">\n                        <h4>Vision Mode</h4>\n                        <p>Look 3 to 6 months ahead and define what the product should feel like. The output is a working prototype or narrow \"north star\" flow, not a slide deck. It constrains and aligns the AI-driven experiments teams are running.</p>\n                        <ul class=\"list-disc pl-5 space-y-1\">\n                            <li>Short horizon: 3 to 6 months, not years</li>\n                            <li>Grounded in current AI capabilities</li>\n                            <li>Prevents fragmentation across experiments</li>\n                        </ul>\n                    </div>\n                    <div class=\"bg-white dark:bg-slate-900 border-2 border-slate-200 dark:border-slate-800 rounded-xl p-6 py-0\">\n                        <h4>Execution Mode</h4>\n                        <p>Sit with engineers while they use AI to build flows. Continuously correct layout, interaction, states, copy, and hierarchy. Enforce patterns, design system usage, and accessibility. Do last-mile fixes yourself in code.</p>\n                        <ul class=\"list-disc pl-5 space-y-1 mb-0\">\n                            <li>Real-time pairing, not handoff</li>\n                            <li>Design system enforcement in code</li>\n                            <li>Last-mile implementation and polish</li>\n                        </ul>\n                    </div>\n                </div>\n\n                <h4 class=\"mt-8\">Where Figma Still Fits</h4>\n                <p>Figma remains key for parallel exploration and high-fidelity craft. The difference is weight and timing: instead of dominating the process, Figma explorations sit inside shorter cycles, with fewer big speculative flows and more targeted problem-solving.</p>\n\n                <h4>How Time Has Shifted</h4>\n                <p>Where 60 to 70% used to be mocks and prototypes, that is now about 30 to 40%. Another 30 to 40% is pairing with engineers. A meaningful slice is implementing front-end code and polish directly. The old practices are not gone. Their relative weight has shrunk inside a faster, code-first loop.</p>\n        </Accordion>\n    </section>\n\n    <section>\n        <Accordion title=\"Zero Alignment\" class=\"mb-0\">\n                <p class=\"text-balance text-lg text-slate-600 dark:text-slate-400 font-medium mb-8\">\n                    This simulation shares a thesis with Maggie Appleton's <a href=\"https://maggieappleton.com/zero-alignment\" class=\"text-accent hover:underline decoration-dotted underline-offset-4\">\"One Developer, Two Dozen Agents, Zero Alignment\"</a> talk from GitHub Next. Both arrive at the same conclusion from different directions:\n                </p>\n\n                <div class=\"breakout-both my-12 py-12 bg-slate-50 dark:bg-slate-900/50 border-y-2 border-slate-100 dark:border-slate-800/50\">\n                    <div class=\"max-w-2xl mx-auto text-center px-6\">\n                        <blockquote class=\"font-serif text-3xl md:text-4xl italic text-slate-800 dark:text-slate-100 leading-tight border-none! p-0!\">\n                            “Speed without alignment produces waste, not value.”\n                        </blockquote>\n                        <p class=\"mt-6 text-slate-500 dark:text-slate-400 text-pretty max-w-lg mx-auto\">\n                            The collapse of implementation time reveals that alignment was always the real work. The old slow process incidentally created alignment through its friction. When implementation collapsed, the alignment infrastructure went with it.\n                        </p>\n                    </div>\n                </div>\n\n                <h4 class=\"text-balance font-bold mb-6\">Where the arguments converge</h4>\n\n                <div class=\"space-y-10 mb-12\">\n                    <div class=\"relative pl-6 border-l-2 border-slate-200 dark:border-slate-800\">\n                        <h5 class=\"text-sm uppercase tracking-widest text-slate-400 font-bold mb-2 font-sans\">The bottleneck has moved</h5>\n                        <p class=\"text-pretty\">\n                            This simulation shows it mechanically: when you speed up AI Build and strip out design, you don't get faster output, you get faster waste. \n                            Appleton states it directly: <em class=\"text-slate-500 dark:text-slate-400\">\"The hard question is no longer how to build it. It's should we build it.\"</em>\n                        </p>\n                    </div>\n                    \n                    <div class=\"relative pl-6 border-l-2 border-slate-200 dark:border-slate-800\">\n                        <h5 class=\"text-sm uppercase tracking-widest text-slate-400 font-bold mb-2 font-sans\">More agents does not mean more output</h5>\n                        <p class=\"text-pretty\">\n                            The Agent Swarm scenario and Productivity Paradox mechanic model this quantitatively. \n                            Appleton calls it <em class=\"text-slate-500 dark:text-slate-400\">\"nine women make a baby in one month\"</em> logic. More individual output makes coordination problems worse.\n                        </p>\n                    </div>\n\n                    <div class=\"relative pl-6 border-l-2 border-slate-200 dark:border-slate-800\">\n                        <h5 class=\"text-sm uppercase tracking-widest text-slate-400 font-bold mb-2 font-sans\">Planning and building are fused</h5>\n                        <p class=\"text-pretty\">\n                            The Vision Mode and Execution Mode loop in this simulation is a continuous cycle, not sequential phases. \n                            Appleton says the same: <em class=\"text-slate-500 dark:text-slate-400\">\"Planning and building are no longer separate phases. They're a continuous cycle.\"</em>\n                        </p>\n                    </div>\n\n                    <div class=\"relative pl-6 border-l-2 border-slate-200 dark:border-slate-800\">\n                        <h5 class=\"text-sm uppercase tracking-widest text-slate-400 font-bold mb-2 font-sans\">Vibe coding is seductive poison</h5>\n                        <p class=\"text-pretty\">\n                            Run the Vibe Coding scenario and watch throughput spike, then watch the kill rate climb and coherence drop. \n                            Appleton: <em class=\"text-slate-500 dark:text-slate-400\">\"It's very easy to prompt your way to the wrong thing or to add tons of unnecessary, unhelpful features.\"</em>\n                        </p>\n                    </div>\n\n                    <div class=\"relative pl-6 border-l-2 border-slate-200 dark:border-slate-800\">\n                        <h5 class=\"text-sm uppercase tracking-widest text-slate-400 font-bold mb-2 font-sans\">Quality is the differentiator</h5>\n                        <p class=\"text-pretty\">\n                            The AI + Design Partnership scenario outperforms raw-speed scenarios on cost efficiency. \n                            Appleton: <em class=\"text-slate-500 dark:text-slate-400\">\"In a world of fast, cheap software, quality becomes the new differentiator. Craftsmanship is what will set you apart from the vibe-coded slop.\"</em>\n                        </p>\n                    </div>\n                </div>\n\n                <h4 class=\"text-balance font-bold mb-6\">Where they diverge</h4>\n\n                <div class=\"grid md:grid-cols-2 gap-6 mb-12\">\n                    <div class=\"bg-white dark:bg-slate-900 border-2 border-slate-200 dark:border-slate-800 rounded-2xl p-8 hover:border-accent/30 transition-colors\">\n                        <h5 class=\"text-xs uppercase tracking-widest text-accent font-bold mb-4\">The Simulation View</h5>\n                        <h4 class=\"mt-0 text-xl font-bold\">Process Mechanics</h4>\n                        <p class=\"text-pretty text-sm text-slate-600 dark:text-slate-400\">\n                            Models the internal states of a single team's workflow. How ideas flow through stages, where friction accumulates, and what breaks. The solution is a better <strong>process</strong> with design guardrails.\n                        </p>\n                        <div class=\"mt-6 pt-6 border-t border-slate-100 dark:border-slate-800\">\n                            <span class=\"text-[10px] uppercase tracking-wider text-slate-400 block mb-2\">Key Insight</span>\n                            <p class=\"text-sm italic\">Misalignment compounds. Bad alignment doesn't just waste units of work, it makes all future work harder.</p>\n                        </div>\n                    </div>\n                    <div class=\"bg-white dark:bg-slate-900 border-2 border-slate-200 dark:border-slate-800 rounded-2xl p-8 hover:border-accent/30 transition-colors\">\n                        <h5 class=\"text-xs uppercase tracking-widest text-emerald-500 font-bold mb-4\">The Tooling View</h5>\n                        <h4 class=\"mt-0 text-xl font-bold\">Environment Design</h4>\n                        <p class=\"text-pretty text-sm text-slate-600 dark:text-slate-400\">\n                            Zooms out to the infrastructure. PRs and Issues are the wrong primitives for the agentic era. The solution is a better <strong>environment</strong> where alignment happens naturally.\n                        </p>\n                        <div class=\"mt-6 pt-6 border-t border-slate-100 dark:border-slate-800\">\n                            <span class=\"text-[10px] uppercase tracking-wider text-slate-400 block mb-2\">Key Insight</span>\n                            <p class=\"text-sm italic\">\"Human context is not in the codebase.\" No amount of code context can replace sharing the \"why\" early.</p>\n                        </div>\n                    </div>\n                </div>\n\n                <div class=\"p-8 bg-indigo-50/50 dark:bg-indigo-900/10 border-2 border-indigo-100 dark:border-indigo-900/30 rounded-2xl\">\n                    <h4 class=\"mt-0 text-indigo-900 dark:text-indigo-300 font-bold mb-4\">Two halves of the same argument</h4>\n                    <p class=\"text-pretty mb-0 italic\">\n                        The valuable friction was never the implementation friction. It was the thinking friction. This simulation answers what happens when alignment breaks; Appleton answers what infrastructure we need to prevent it from breaking.\n                    </p>\n                </div>\n        </Accordion>\n    </section>\n\n    <section>\n        <Accordion title=\"Technical Friction Mechanics\" class=\"mb-0\">\n                <p class=\"mb-6\">Six properties that model real failure modes in AI-driven engineering:</p>\n\n                <div class=\"space-y-8\">\n                    <div>\n                        <h4 class=\"font-semibold mb-2\">AI Hallucination (Rework)</h4>\n                        <p>AI generates code that looks correct but is wrong. Items pass through AI Build, appear done, but get caught during Learn/Adjust and loop back. The faster you build without design review, the more bad output slips through.</p>\n                    </div>\n\n                    <div>\n                        <h4 class=\"font-semibold mb-2\">Agent Conflict (Blocking)</h4>\n                        <p>Multiple AI agents working on overlapping areas produce conflicting code. A build server gets blocked while conflicts are resolved, taking 3x normal time. Conflict probability scales with the number of busy servers.</p>\n                    </div>\n\n                    <div>\n                        <h4 class=\"font-semibold mb-2\">Capability Cliff</h4>\n                        <p>Some ideas hit the boundary of what current AI models can do. These items (amber, larger circles) require manual engineering and take 4x longer. They look the same entering the pipeline but reveal themselves mid-processing.</p>\n                    </div>\n\n                    <div>\n                        <h4 class=\"font-semibold mb-2\">Context Window Collapse</h4>\n                        <p>As the system accumulates work in progress, AI tools lose context and output quality drops. Build speed degrades as the codebase grows beyond the AI's context window. This is a simplified model of a real and well-documented limitation.</p>\n                    </div>\n\n                    <div>\n                        <h4 class=\"font-semibold mb-2\">Vibe Code Debt</h4>\n                        <p>Items built fast with AI, but nobody understands the code. Each time an item loops back, its debt increases, adding a multiplier to future processing time. Visible as red dashed rings growing around dots. By the 3rd loop, processing time has nearly doubled.</p>\n                    </div>\n\n                    <div>\n                        <h4 class=\"font-semibold mb-2\">Design System Erosion</h4>\n                        <p>When items ship without going through Design, the global coherence score drops. As coherence falls, all Design work takes longer because the team is fixing inconsistencies instead of doing proactive work. Skipping design makes future design harder.</p>\n                    </div>\n                </div>\n        </Accordion>\n    </section>\n\n    <section>\n        <Accordion title=\"Behavioral Friction Mechanics\" class=\"mb-0\">\n                <p class=\"mb-6\">Four friction mechanics based on published cognitive and behavioral research. These model what happens to teams, not just to code. Each is toggleable in the simulation's AI Friction panel.</p>\n\n                <div class=\"space-y-8\">\n                    <div>\n                        <h4 class=\"font-semibold mb-2\">Skill Atrophy</h4>\n                        <p>When AI does most of the work, the team gradually loses the ability to do it themselves. The simulation slows down build and design servers over time in proportion to how little design involvement there is.</p>\n                        <p class=\"text-sm text-slate-500 dark:text-slate-400\">Based on a 2026 Anthropic study where AI-assisted developers scored 17% lower on comprehension tests. Vibe coding research documents progressive skill loss when AI handles all code generation. This is a simplified model. In reality, skill loss varies by individual and task. The simulation approximates the trend.</p>\n                    </div>\n\n                    <div>\n                        <h4 class=\"font-semibold mb-2\">Review Fatigue</h4>\n                        <p>After a string of successful ships, the team gets comfortable and stops checking AI output carefully. The simulation makes hallucinations harder to catch after each consecutive successful ship. Catching a hallucination resets the streak.</p>\n                        <p class=\"text-sm text-slate-500 dark:text-slate-400\">Based on a Google study of 76 software engineers that found automation trust increases over time. Separate research found that as AI gets better at writing code, humans get worse at reviewing it. The effect is well-documented in automation research going back 75 years.</p>\n                    </div>\n\n                    <div>\n                        <h4 class=\"font-semibold mb-2\">Cognitive Debt</h4>\n                        <p>Every time an item skips design review, it adds to a global slowdown. The team's ability to solve problems erodes because they are not exercising it. The simulation makes all rework and iteration processing slower as cognitive debt accumulates.</p>\n                        <p class=\"text-sm text-slate-500 dark:text-slate-400\">Based on research documenting the systematic erosion of problem-solving ability when developers rely heavily on AI. Developers stop reading documentation, debugging skills dull, and error messages become unfamiliar. The simulation models this as a global multiplier. The real effect is more nuanced but the direction is consistent across studies.</p>\n                    </div>\n\n                    <div>\n                        <h4 class=\"font-semibold mb-2\">Productivity Paradox</h4>\n                        <p>Adding more AI agents does not produce proportionally more output. Beyond 2 active agents, each additional agent adds coordination and review overhead that slows everyone down. The simulation applies a logarithmic overhead multiplier to all build servers.</p>\n                        <p class=\"text-sm text-slate-500 dark:text-slate-400\">Based on a randomized controlled trial of experienced open-source developers that found AI tools actually increased completion time by 19%. This contradicted developer predictions of 20% time savings. The simulation models the overhead simply, but the finding is robust: more AI assistance does not always mean faster results.</p>\n                    </div>\n                </div>\n        </Accordion>\n    </section>\n\n    <section>\n        <Accordion title=\"Skills and Mindset\" class=\"mb-0\">\n                <p class=\"mb-6\">Three designer types that thrive in this new loop:</p>\n\n                <div class=\"grid md:grid-cols-1 gap-6\">\n                    <div class=\"bg-slate-50 dark:bg-slate-900 border border-slate-200 dark:border-slate-800 rounded-xl p-6\">\n                        <h4 class=\"mt-0\">Strong Generalists</h4>\n                        <p class=\"mb-0\">80th percentile or above across several core skills: product thinking, UX, visual, some coding. They flex between PM, design, and engineering-adjacent work as roles blur, and they are the most valuable in fast-moving teams where nobody can stay in one lane.</p>\n                    </div>\n                    <div class=\"bg-slate-50 dark:bg-slate-900 border border-slate-200 dark:border-slate-800 rounded-xl p-6\">\n                        <h4 class=\"mt-0\">Deep Specialists</h4>\n                        <p class=\"mb-0\">Top-tier in something that sets products apart: visual systems, iconography, or technical design and implementation. Their depth creates advantages that AI cannot easily match and generalists cannot replicate.</p>\n                    </div>\n                    <div class=\"bg-slate-50 dark:bg-slate-900 border border-slate-200 dark:border-slate-800 rounded-xl p-6\">\n                        <h4 class=\"mt-0\">Crafty New Grads</h4>\n                        <p class=\"mb-0\">Early-career designers who are humble, learn fast, and are unburdened by legacy process. They actively build things with new tools rather than clinging to old methods. Not knowing how it \"used to be done\" is their advantage.</p>\n                    </div>\n                </div>\n\n                <h4 class=\"mt-8\">The Core Shift</h4>\n                <p>Designers must let go of gatekeeping and instead guide fast-moving engineering. This means explaining design principles, teaching the design system, and raising the overall design ability of the team rather than trying to own every pixel. Implementation literacy is increasingly baseline. You may not need to be a full-stack engineer, but you do need to work effectively with AI coding tools and make last-mile UI changes yourself.</p>\n        </Accordion>\n    </section>\n\n    <section>\n        <Accordion title=\"Visual Guide\" class=\"mb-0\">\n                <div class=\"space-y-8\">\n                    <div>\n                        <h4 class=\"font-semibold mb-2\">Entity Types</h4>\n                        <div class=\"flex flex-wrap items-center gap-6\">\n                            <div class=\"flex items-center gap-2\">\n                                <div class=\"w-3 h-3 rounded-full bg-sky-400 shrink-0\"></div>\n                                <span class=\"text-sm\"><strong>Blue:</strong> Standard idea flowing through</span>\n                            </div>\n                            <div class=\"flex items-center gap-2\">\n                                <div class=\"w-4 h-4 rounded-full bg-amber-500 shrink-0\"></div>\n                                <span class=\"text-sm\"><strong>Amber (large):</strong> Capability cliff (4x processing)</span>\n                            </div>\n                            <div class=\"flex items-center gap-2\">\n                                <div class=\"w-3 h-3 rounded-full bg-green-400 border-2 border-emerald-500 shrink-0\"></div>\n                                <span class=\"text-sm\"><strong>Green ring:</strong> Iterated (2nd+ loop)</span>\n                            </div>\n                            <div class=\"flex items-center gap-2\">\n                                <div class=\"w-3 h-3 rounded-full bg-slate-400 opacity-40 shrink-0\"></div>\n                                <span class=\"text-sm\"><strong>Fading:</strong> Killed at Adjust</span>\n                            </div>\n                        </div>\n                    </div>\n\n                    <div>\n                        <h4 class=\"font-semibold mb-2\">Stage Zones</h4>\n                        <div class=\"flex flex-wrap items-center gap-6\">\n                            <div class=\"flex items-center gap-2\">\n                                <div class=\"w-4 h-3 rounded bg-amber-500/30 border border-amber-500/60 shrink-0\"></div>\n                                <span class=\"text-sm\"><strong>Amber:</strong> Vision Mode</span>\n                            </div>\n                            <div class=\"flex items-center gap-2\">\n                                <div class=\"w-4 h-3 rounded bg-sky-500/30 border border-sky-500/60 shrink-0\"></div>\n                                <span class=\"text-sm\"><strong>Sky:</strong> AI Build + Eng</span>\n                            </div>\n                            <div class=\"flex items-center gap-2\">\n                                <div class=\"w-4 h-3 rounded bg-emerald-500/30 border border-emerald-500/60 shrink-0\"></div>\n                                <span class=\"text-sm\"><strong>Emerald:</strong> Design Execution</span>\n                            </div>\n                            <div class=\"flex items-center gap-2\">\n                                <div class=\"w-4 h-3 rounded bg-violet-500/30 border border-violet-500/60 shrink-0\"></div>\n                                <span class=\"text-sm\"><strong>Violet:</strong> Ship / Done</span>\n                            </div>\n                        </div>\n                    </div>\n\n                    <div>\n                        <h4 class=\"font-semibold mb-2\">Server States</h4>\n                        <p>Circles inside AI Build and Design zones represent processing capacity:</p>\n                        <ul class=\"list-disc pl-5 space-y-1\">\n                            <li><strong>S (empty):</strong> Idle server, waiting for work</li>\n                            <li><strong>Gear (filled):</strong> Actively processing an item</li>\n                            <li><strong>Warning (red):</strong> Blocked by agent conflict (3x processing time)</li>\n                        </ul>\n                    </div>\n\n                    <div>\n                        <h4 class=\"font-semibold mb-2\">Metrics</h4>\n                        <ul class=\"list-disc pl-5 space-y-1\">\n                            <li><strong>Shipped:</strong> Items that completed the full pipeline and exited</li>\n                            <li><strong>Killed:</strong> Items terminated at the Adjust stage</li>\n                            <li><strong>WIP:</strong> Active items currently in the system</li>\n                            <li><strong>Throughput:</strong> Items shipped per second</li>\n                            <li><strong>Cycle Time:</strong> Average time from idea entry to ship</li>\n                            <li><strong>Coherence:</strong> Design system health (100% = pristine, drops when items skip design)</li>\n                            <li><strong>Avg Iterations:</strong> Average number of loops before an item ships</li>\n                        </ul>\n                    </div>\n                </div>\n        </Accordion>\n    </section>\n</div>"
      },
      {
        "id": "estuarine-health",
        "type": "labs",
        "title": "EMF: Health Simulator",
        "description": "A plain-English breakdown of the Estuary Mapping Framework. Explore how energy, friction, and organizational momentum shape strategic change.",
        "date": "2026-01-06T00:00:00.000Z",
        "category": null,
        "tags": null,
        "url": "https://ryansnowden.com/labs/estuarine-health/",
        "content": "import EstuarineHealth from '../../components/simulations/EstuarineHealth.astro';\nimport Katex from '../../components/graphics/Katex.astro';\nimport { Mermaid } from '../../components/graphics/Mermaid';\nimport VSMFlow from '../../components/simulations/VSMFlow';\nimport AgentDynamicsFlow from '../../components/simulations/AgentDynamicsFlow';\nimport BurnoutFlow from '../../components/simulations/BurnoutFlow';\n\n<div class=\"flex justify-center mb-6\">\n  <span class=\"inline-flex items-center px-4 py-2 rounded-full text-xs font-medium uppercase tracking-wider bg-indigo-900 text-indigo-200\">Work in Progress</span>\n</div>\n\n<EstuarineHealth fullWidth={true} class=\"breakout\" />\n\n<details open class=\"group mb-8\">\n    <summary class=\"cursor-pointer list-none select-none\">\n        <div class=\"flex items-center gap-2\">\n            <svg class=\"w-5 h-5 transition-transform group-open:rotate-180\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n            </svg>\n            <h3 class=\"m-0!\">Overview</h3>\n        </div>\n    </summary>\n    <div class=\"mt-4\">\n        **EMF – Health** applies the Estuarine Mapping Framework to healthcare AI strategy. The 2026 healthcare environment faces physical limits: workforce burnout, thick capital cycles, and AI as the key way to scale.\n\n        This simulator maps the **Energy Cost of Change** across four scenarios. It helps strategists find low-energy windows for action and high-energy walls where action creates pushback.\n    </div>\n</details>\n\n<div class=\"space-y-12 my-12\">\n    <section>\n        <details open class=\"group\">\n            <summary class=\"cursor-pointer list-none select-none\">\n                <div class=\"flex items-center gap-2\">\n                    <svg class=\"w-5 h-5 transition-transform group-open:rotate-180\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                        <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n                    </svg>\n                    <h3 class=\"m-0!\">Healthcare Scenarios</h3>\n                </div>\n            </summary>\n            <div class=\"mt-4\">\n                <p>Four scenarios represent distinct topological configurations that AI companies must navigate.</p>\n\n                <div class=\"grid md:grid-cols-2 gap-6\">\n                    <div class=\"bg-white dark:bg-slate-900 border-2 border-slate-200 dark:border-slate-800 rounded-xl p-6 py-4 [&_p]:m-0!\">\n                        <h4 class=\"mt-0!\">Ambient Capacity Restoration</h4>\n                        <p class=\"text-sm mb-1!\">Clinicians are at their breaking point with paperwork. Ambient AI reduces documentation workload so doctors spend less energy taking notes and more time with patients. But if the AI requires too much manual double-checking, clinicians revert straight back to old dictation habits.</p>\n                        <div class=\"bg-slate-50 dark:bg-slate-800/50 p-3 rounded text-xs font-mono mt-3\">\n                            if (AI_Active) documentationWorkload -= 25%\n                        </div>\n                    </div>\n                    <div class=\"bg-white dark:bg-slate-900 border-2 border-slate-200 dark:border-slate-800 rounded-xl p-6 py-4 [&_p]:m-0!\">\n                        <h4 class=\"mt-0!\">Regulatory Phase Shift</h4>\n                        <p class=\"text-sm mb-1!\">Strict regulation (like the EU AI Act) turns loose guidelines into strict law. High-risk AI products without compliance certification hit a brick wall — the energy cost to operate non-compliant tools becomes impossibly high.</p>\n                        <div class=\"bg-slate-50 dark:bg-slate-800/50 p-3 rounded text-xs font-mono mt-3\">\n                            if (!certified) deploymentBlocked = true\n                        </div>\n                    </div>\n                    <div class=\"bg-white dark:bg-slate-900 border-2 border-slate-200 dark:border-slate-800 rounded-xl p-6 py-4 [&_p]:m-0!\">\n                        <h4 class=\"mt-0!\">Reimbursement Tether</h4>\n                        <p class=\"text-sm mb-1!\">Hospitals run on razor-thin margins. AI tools that don’t tie directly to official billing codes (CPT codes) get starved of budget. If a tool doesn’t generate clear reimbursement, adoption drops to zero.</p>\n                        <div class=\"bg-slate-50 dark:bg-slate-800/50 p-3 rounded text-xs font-mono mt-3\">\n                            if (!billingCodeAttached) hospitalAdoption = 0\n                        </div>\n                    </div>\n                    <div class=\"bg-white dark:bg-slate-900 border-2 border-slate-200 dark:border-slate-800 rounded-xl p-6 py-4 [&_p]:m-0!\">\n                        <h4 class=\"mt-0!\">Confident Hallucination</h4>\n                        <p class=\"text-sm mb-1!\">When an AI model makes a confident clinical mistake, trust plummets instantly. Rebuilding clinical trust takes months of flawless performance. A single high-profile error traps the product in a liability risk zone.</p>\n                        <div class=\"bg-slate-50 dark:bg-slate-800/50 p-3 rounded text-xs font-mono mt-3\">\n                            TrustLostInSeconds != TrustRebuiltOverMonths\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </details>\n    </section>\n\n    <section>\n        <details open class=\"group\">\n            <summary class=\"cursor-pointer list-none select-none\">\n                <div class=\"flex items-center gap-2\">\n                    <svg class=\"w-5 h-5 transition-transform group-open:rotate-180\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                        <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n                    </svg>\n                    <h3 class=\"m-0!\">Healthcare Constructors</h3>\n                </div>\n            </summary>\n            <div class=\"mt-4\">\n                <p>Constructors transform input states to output states without undergoing net change themselves.</p>\n\n                <div class=\"overflow-x-auto my-6\">\n                    <table class=\"min-w-full divide-y divide-slate-200 dark:divide-slate-800 m-0!\">\n                        <thead>\n                            <tr>\n                                <th class=\"px-4 py-3 text-left text-xs font-bold text-slate-500 dark:text-slate-400 uppercase tracking-wider\">Constructor</th>\n                                <th class=\"px-4 py-3 text-left text-xs font-bold text-slate-500 dark:text-slate-400 uppercase tracking-wider\">Function</th>\n                                <th class=\"px-4 py-3 text-left text-xs font-bold text-slate-500 dark:text-slate-400 uppercase tracking-wider\">Scenario</th>\n                            </tr>\n                        </thead>\n                        <tbody class=\"divide-y divide-slate-100 dark:divide-slate-800\">\n                            <tr>\n                                <td class=\"px-4 py-3 text-sm font-semibold text-slate-700 dark:text-slate-200\">Ambient Scribe</td>\n                                <td class=\"px-4 py-3 text-sm text-slate-600 dark:text-slate-400\">Reduces cognitive friction by transforming conversation → SOAP note</td>\n                                <td class=\"px-4 py-3 text-sm text-slate-600 dark:text-slate-400\">Ambient Capacity</td>\n                            </tr>\n                            <tr>\n                                <td class=\"px-4 py-3 text-sm font-semibold text-slate-700 dark:text-slate-200\">Compliance Audit</td>\n                                <td class=\"px-4 py-3 text-sm text-slate-600 dark:text-slate-400\">Enables crossing regulatory walls via audit trail</td>\n                                <td class=\"px-4 py-3 text-sm text-slate-600 dark:text-slate-400\">Regulatory Phase Shift</td>\n                            </tr>\n                            <tr>\n                                <td class=\"px-4 py-3 text-sm font-semibold text-slate-700 dark:text-slate-200\">CPT Enabler</td>\n                                <td class=\"px-4 py-3 text-sm text-slate-600 dark:text-slate-400\">Extends revenue tether radius via new billing codes</td>\n                                <td class=\"px-4 py-3 text-sm text-slate-600 dark:text-slate-400\">Reimbursement Tether</td>\n                            </tr>\n                            <tr>\n                                <td class=\"px-4 py-3 text-sm font-semibold text-slate-700 dark:text-slate-200\">Trust Anchor</td>\n                                <td class=\"px-4 py-3 text-sm text-slate-600 dark:text-slate-400\">Slows trust decay, aids linear recovery via verification</td>\n                                <td class=\"px-4 py-3 text-sm text-slate-600 dark:text-slate-400\">Hallucination Event</td>\n                            </tr>\n                        </tbody>\n                    </table>\n                </div>\n            </div>\n        </details>\n    </section>\n\n\n</div>\n\n\n    <section>\n        <details open class=\"group\">\n            <summary class=\"cursor-pointer list-none select-none\">\n                <div class=\"flex items-center gap-2\">\n                    <svg class=\"w-5 h-5 transition-transform group-open:rotate-180\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                        <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n                    </svg>\n                    <h3 class=\"m-0!\">Analysis Tools <span class=\"text-xs font-normal text-violet-500 ml-2\">New</span></h3>\n                </div>\n            </summary>\n            <div class=\"mt-4\">\n                <p>These buttons add overlays to help you understand what's happening in the simulation.</p>\n\n                #### Cynefin Overlay\n\n                The Cynefin framework helps you understand how predictable different parts of the system are. When you click **Cynefin**, the simulation area gets colour-coded into four zones:\n\n                - **Clear (Green)**: These areas are predictable. Cause and effect are obvious. Best practices work here. Think of well-documented procedures that always give the same result.\n\n                - **Complicated (Blue)**: Still predictable, but you need expertise to understand what's going on. An expert can analyse the situation and figure out the right approach. Think of a specialist diagnosing a known problem.\n\n                - **Complex (Purple)**: Cause and effect only make sense in hindsight. You can't predict outcomes because too many things interact. The best approach is to try small experiments and see what happens.\n\n                - **Chaotic (Red)**: No clear cause and effect. Things are unstable and you need to act first, then figure out what's happening. Think of a crisis where you stabilise first and ask questions later.\n\n                The simulation calculates which zone each area belongs to based on two factors: how volatile the area is (the right edge is more volatile), and how close to constraints an area is (more constraints means more structure).\n\n                ---\n\n                #### Network Topology\n\n                Click **Net** to see the invisible relationships between agents. The simulation draws purple lines between agents that are close enough to influence each other.\n\n                This shows you the social network forming in real-time. Agents that are near each other can share information and copy each other's behaviour. The lines get stronger (more visible) when agents are closer together.\n\n                You can use this to spot clusters forming, identify isolated agents, and see how information might spread through the group. The total number of connections is shown at the bottom of the screen.\n\n                ---\n\n                #### Wardley Map\n\n                Click **Wardley** to overlay strategic positioning axes onto the simulation.\n\n                Wardley Mapping is a strategy tool that plots components based on how evolved they are and how visible they are to users. The overlay adds:\n\n                - **X-Axis (Evolution)**: Shows how mature something is. The left side is \"Genesis\" (new, experimental ideas). Moving right, you pass through \"Custom Built\" (one-off solutions), then \"Product\" (off-the-shelf options), and finally \"Commodity\" on the far right (utilities everyone uses like electricity).\n\n                - **Y-Axis (Visibility)**: Shows how visible a component is to end users. Things at the top are user-facing and obvious. Things at the bottom are invisible infrastructure that users never see.\n\n                The labels change depending on which scenario you're viewing. In healthcare scenarios, the evolution stages might be labelled differently to match the domain (for example, \"Research\" to \"Standard of Care\").\n\n                This overlay helps you think strategically about where things are positioned. Volatile areas (left side) suit experimental work. Stable areas (right side) suit commodity services.\n\n                ---\n\n                #### VSM Roles (Viable System Model)\n\n                Click **VSM** to see how the simulation maps to Stafford Beer's Viable System Model, a way of understanding organisations as living systems.\n\n                The overlay highlights four levels:\n\n                - **System 1 Operations (Green)**: The agents themselves. These are the things that actually do the work. In an organisation, this would be the front-line teams delivering products or services.\n\n                - **System 2 Coordination (Yellow)**: The constraints. These dampen oscillations and stop parts of the system from fighting each other. They're the rules, schedules, and standards that keep things running smoothly.\n\n                - **System 3 Control (Blue)**: The constructors. These allocate resources and monitor performance. They make sure the operational units have what they need and are working effectively.\n\n                - **System 5 Policy (Red)**: The boundary of the entire system. This is identity and purpose. It defines what the system is and what it's not. The red border around the simulation area represents this.\n\n                This overlay helps you think about organisational design. A viable system needs all five levels working together. If you only have operations (System 1) without coordination (System 2), you get chaos. If you have too much control (System 3) without operational freedom, you get stagnation.\n            </div>\n        </details>\n    </section>\n\n    <section class=\"mt-12\">\n        <details open class=\"group\">\n            <summary class=\"cursor-pointer list-none select-none\">\n                <div class=\"flex items-center gap-2\">\n                    <svg class=\"w-5 h-5 transition-transform group-open:rotate-180\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                        <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n                    </svg>\n                    <h3 class=\"m-0!\">Alternative Frameworks</h3>\n                </div>\n            </summary>\n            <div class=\"mt-4\">\n                <p>The current implementation is primarily Agent-Based Modelling (ABM) with continuous physics. These enhancements map organizational complexity theories to specific simulation mechanics.</p>\n                \n                <div class=\"space-y-6 mt-6\">\n                    <div class=\"bg-white dark:bg-slate-900 border-2 border-slate-200 dark:border-slate-800 rounded-xl p-6\">\n                        <h4 class=\"mt-0!\">Multi-Level Selection <span class=\"text-xs font-normal text-slate-500 ml-2\">(Wilson & Wilson, 2007)</span></h4>\n                        <p class=\"text-sm mb-3!\">Agents form groups that compete as units, creating selection pressure at both individual and group levels.</p>\n                        <div class=\"bg-slate-50 dark:bg-slate-800/50 p-3 rounded text-sm text-slate-600 dark:text-slate-400 [&_p]:m-0!\">\n                            <strong>Mapping:</strong> Teams compete for resources; successful team patterns propagate.\n                        </div>\n                    </div>\n\n                    <div class=\"bg-white dark:bg-slate-900 border-2 border-slate-200 dark:border-slate-800 rounded-xl p-6\">\n                        <h4 class=\"mt-0!\">Network Topology <span class=\"text-xs font-normal text-slate-500 ml-2\">(Barabási, 2002)</span></h4>\n                        <p class=\"text-sm mb-3!\">Replaces spatial proximity with network connections using power-law degree distributions for realistic organizational structure.</p>\n                        <div class=\"bg-slate-50 dark:bg-slate-800/50 p-3 rounded text-sm text-slate-600 dark:text-slate-400 [&_p]:m-0!\">\n                            <strong>Mapping:</strong> Influence flows through hierarchy and established links, not just physical proximity.\n                        </div>\n                    </div>\n\n                    <div class=\"bg-white dark:bg-slate-900 border-2 border-slate-200 dark:border-slate-800 rounded-xl p-6\">\n                        <h4 class=\"mt-0!\">Evolutionary Strategies <span class=\"text-xs font-normal text-slate-500 ml-2\">(Axelrod, 1984)</span></h4>\n                        <p class=\"text-sm mb-3!\">Agents carry strategy genotypes subject to mutation, crossover, and selection.</p>\n                        <div class=\"bg-slate-50 dark:bg-slate-800/50 p-3 rounded text-sm text-slate-600 dark:text-slate-400 [&_p]:m-0!\">\n                            <strong>Mapping:</strong> Organizational practices evolve through competitive mimicry (see <em>Institutional Isomorphism</em>).\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </details>\n    </section>\n\n    <section class=\"mt-12\">\n        <details open class=\"group\">\n            <summary class=\"cursor-pointer list-none select-none\">\n                <div class=\"flex items-center gap-2\">\n                    <svg class=\"w-5 h-5 transition-transform group-open:rotate-180\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                        <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n                    </svg>\n                    <h3 class=\"m-0!\">Healthcare Physics</h3>\n                </div>\n            </summary>\n            <div class=\"mt-4\">\n                <p>Constraints modify the energy required to move actants through the healthcare terrain.</p>\n\n                <div class=\"space-y-6\">\n                    <div>\n                        <h4>Elastic Constraint (Burnout)</h4>\n                        <p>Modeled using Hooke's Law with a failure point. When cognitive load exceeds the yield point, the workforce snaps back.</p>\n                        <div class=\"bg-slate-50 dark:bg-slate-900 p-4 rounded mb-3 overflow-x-auto\">\n                            <Katex formula=\"E_{elastic} = \\frac{1}{2} k x^2 \\quad \\text{where } x = \\text{Cognitive Load}\" />\n                        </div>\n                    </div>\n\n                    <div>\n                        <h4>Rigid Constraint (Compliance Wall)</h4>\n                        <p>Step function where energy approaches infinity for non-compliant actors.</p>\n                        <div class=\"bg-slate-50 dark:bg-slate-900 p-4 rounded mb-3 overflow-x-auto\">\n                            <Katex formula=\"E_{rigid}(x) = \\begin{cases} 0 & \\text{if } x \\in \\text{Compliance} \\\\ \\infty & \\text{if } x \\notin \\text{Compliance} \\end{cases}\" />\n                        </div>\n                    </div>\n\n                    <div>\n                        <h4>Tether Constraint (Revenue Radius)</h4>\n                        <p>Cost is zero inside CPT code scope, infinite outside.</p>\n                        <div class=\"bg-slate-50 dark:bg-slate-900 p-4 rounded mb-3 overflow-x-auto\">\n                            <Katex formula=\"E_{tether}(d) = \\begin{cases} 0 & d \\le r \\\\ \\infty & d > r \\end{cases} \\quad \\text{where } r = \\text{CPT scope}\" />\n                        </div>\n                    </div>\n\n                    <div>\n                        <h4>Hysteresis (Trust Dynamics)</h4>\n                        <p>Trust decays exponentially after errors but recovers linearly, requiring far more work to rebuild.</p>\n                        <div class=\"bg-slate-50 dark:bg-slate-900 p-4 rounded mb-3 overflow-x-auto\">\n                            <Katex formula=\"\\text{Decay: } T \\sim e^{-kt} \\quad | \\quad \\text{Recovery: } T \\sim +1/t\" />\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </details>\n    </section>\n\n    <section class=\"mt-12\">\n        <details open class=\"group\">\n            <summary class=\"cursor-pointer list-none select-none\">\n                <div class=\"flex items-center gap-2\">\n                    <svg class=\"w-5 h-5 transition-transform group-open:rotate-180\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                        <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n                    </svg>\n                    <h3 class=\"m-0!\">Advanced Physics <span class=\"text-xs font-normal text-teal-500 ml-2\">Unique to Health Sim</span></h3>\n                </div>\n            </summary>\n            <div class=\"mt-4\">\n                <p>This simulator introduces two physics models not present in the standard Estuarine Mapping sims, designed specifically for modelling healthcare trust dynamics and volatile zone behaviour.</p>\n\n                <div class=\"space-y-6 mt-6\">\n                    <div class=\"bg-white dark:bg-slate-900 border-2 border-slate-200 dark:border-slate-800 rounded-xl p-6\">\n                        <h4 class=\"mt-0!\">Langevin Equation (Brownian Motion)</h4>\n                        <p class=\"text-sm mb-3\">In the volatile zone (right edge), agents follow the **Langevin equation** (a stochastic differential equation that models proper Brownian diffusion rather than uniform noise).</p>\n                        <div class=\"bg-slate-50 dark:bg-slate-900 p-4 rounded mb-4 overflow-x-auto\">\n                            <Katex formula=\"dx_t = -\\nabla V(x_t)dt + \\sigma \\, dW_t\" />\n                        </div>\n                        <p class=\"text-sm mb-3\">Where <code>∇V</code> is the energy gradient (gradient descent toward lower energy), and <code>σdW</code> is Gaussian noise from a Wiener process.</p>\n                        \n                        <div class=\"grid md:grid-cols-2 gap-4 text-sm\">\n                            <div class=\"bg-slate-50 dark:bg-slate-800/50 p-3 rounded\">\n                                <div class=\"font-semibold text-slate-700 dark:text-slate-200 mb-1\">Other EMF Sims</div>\n                                <div class=\"text-slate-500 dark:text-slate-400\">Uniform random jitter: agents move jerkily like \"TV static\"</div>\n                            </div>\n                            <div class=\"bg-teal-50 dark:bg-teal-900/30 p-3 rounded border border-teal-200 dark:border-teal-800\">\n                                <div class=\"font-semibold text-teal-700 dark:text-teal-300 mb-1\">Health Sim</div>\n                                <div class=\"text-teal-600 dark:text-teal-400\">Gaussian random walks: agents drift smoothly like \"smoke diffusing\"</div>\n                            </div>\n                        </div>\n                        \n                        <p class=\"text-xs text-slate-500 dark:text-slate-400 mt-3\"><strong>Used in:</strong> All scenarios (volatile zone behaviour)</p>\n                    </div>\n\n                    <div class=\"bg-white dark:bg-slate-900 border-2 border-slate-200 dark:border-slate-800 rounded-xl p-6\">\n                        <h4 class=\"mt-0!\">Hysteresis Effect (Asymmetric Energy)</h4>\n                        <p class=\"text-sm mb-3\">Trust dynamics follow a **hysteresis loop** where falling into a liability well is fast but climbing out is slow. This models the asymmetric energy cost of reputation damage.</p>\n                        <div class=\"bg-slate-50 dark:bg-slate-900 p-4 rounded mb-4 overflow-x-auto\">\n                            <Katex formula=\"E_{recovery} \\gg E_{loss} \\quad \\text{(25} \\times \\text{ asymmetry)}\" />\n                        </div>\n                        \n                        <div class=\"grid md:grid-cols-2 gap-4 text-sm mb-4\">\n                            <div class=\"bg-red-50 dark:bg-red-900/30 p-3 rounded border border-red-200 dark:border-red-800\">\n                                <div class=\"font-semibold text-red-700 dark:text-red-300 mb-1\">Trust Decay (Fast)</div>\n                                <div class=\"text-red-600 dark:text-red-400\">Exponential: <code>T *= exp(-0.05)</code></div>\n                                <div class=\"text-xs text-red-500 dark:text-red-500 mt-1\">~40 frames to collapse</div>\n                            </div>\n                            <div class=\"bg-teal-50 dark:bg-teal-900/30 p-3 rounded border border-teal-200 dark:border-teal-800\">\n                                <div class=\"font-semibold text-teal-700 dark:text-teal-300 mb-1\">Trust Recovery (Slow)</div>\n                                <div class=\"text-teal-600 dark:text-teal-400\">Linear: <code>T += 0.002</code></div>\n                                <div class=\"text-xs text-teal-500 dark:text-teal-500 mt-1\">~500 frames to recover</div>\n                            </div>\n                        </div>\n                        \n                        <p class=\"text-sm mb-2\"><strong>Visual feedback:</strong></p>\n                        <ul class=\"text-sm text-slate-600 dark:text-slate-400 list-disc list-inside space-y-1\">\n                            <li><span class=\"text-red-500\">Red pulsing glow</span>: agents losing trust (inside dark constraint)</li>\n                            <li><span class=\"text-teal-500\">Teal pulsing glow</span>: agents recovering trust (climbing out)</li>\n                            <li>Agent colour shifts toward red as trust drops</li>\n                        </ul>\n                        \n                        <p class=\"text-xs text-slate-500 dark:text-slate-400 mt-3\"><strong>Used in:</strong> Confident Hallucination scenario (dark constraints)</p>\n                    </div>\n                </div>\n            </div>\n        </details>\n    </section>\n\n    <section class=\"mt-12\">\n        <details open class=\"group\">\n            <summary class=\"cursor-pointer list-none select-none\">\n                <div class=\"flex items-center gap-2\">\n                    <svg class=\"w-5 h-5 transition-transform group-open:rotate-180\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                        <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n                    </svg>\n                    <h3 class=\"m-0!\">System Dynamics & Models</h3>\n                </div>\n            </summary>\n            <div class=\"mt-4\">\n                <p>Visualising the feedback loops and hierarchical structures driving the simulation.</p>\n\n                <div class=\"space-y-8 mt-6\">\n                    {/* Agent Dynamics */}\n                    <div class=\"b\">\n                        <h4 class=\"mt-0!\">Agent Dynamics (Boids + Behavioural Econ)</h4>\n                        <p class=\"text-sm text-slate-600 dark:text-slate-400\">How agents make decisions: combining flocking rules with cognitive biases under constraints.</p>\n                        <AgentDynamicsFlow client:visible />\n                    </div>\n\n                    {/* VSM */}\n                    <div class=\"\">\n                        <h4 class=\"mt-0!\">Viable System Model (VSM) Mapping</h4>\n                        <p class=\"text-sm text-slate-600 dark:text-slate-400\">Mapping Estuarine entities to Stafford Beer's cybernetic tiers.</p>\n                        <VSMFlow client:visible />\n                    </div>\n\n                    {/* Burnout CLD */}\n                    <div class=\"b\">\n                        <h4 class=\"mt-0!\">Burnout Causal Loop Diagram</h4>\n                        <p class=\"text-sm text-slate-600 dark:text-slate-400\">The reinforcing cycle of burnout and the balancing loop of Ambient AI.</p>\n                        <BurnoutFlow client:visible />\n                    </div>\n\n                    {/* Constraints Table */}\n                    <div class=\"bg-white dark:bg-slate-900 border-2 border-slate-200 dark:border-slate-800 rounded-xl p-5\">\n                        <h4 class=\"mt-0!\">Constraints Reference</h4>\n                        <div class=\"overflow-x-auto mt-2\">\n                            <table class=\"min-w-full divide-y divide-slate-200 dark:divide-slate-800 text-sm m-0!\">\n                                <thead>\n                                    <tr>\n                                        <th class=\"px-4 py-2 text-left font-bold text-slate-500 dark:text-slate-400\">Type</th>\n                                        <th class=\"px-4 py-2 text-left font-bold text-slate-500 dark:text-slate-400\">Metaphor</th>\n                                        <th class=\"px-4 py-2 text-left font-bold text-slate-500 dark:text-slate-400\">Dynamics</th>\n                                    </tr>\n                                </thead>\n                                <tbody class=\"divide-y divide-slate-100 dark:divide-slate-800\">\n                                    <tr>\n                                        <td class=\"px-4 py-2 font-semibold text-slate-700 dark:text-slate-200\">Elastic</td>\n                                        <td class=\"px-4 py-2 text-slate-600 dark:text-slate-400\">Rubber Band</td>\n                                        <td class=\"px-4 py-2 text-slate-600 dark:text-slate-400\">Stretches with pressure, snaps back at yield point (Burnout).</td>\n                                    </tr>\n                                    <tr>\n                                        <td class=\"px-4 py-2 font-semibold text-slate-700 dark:text-slate-200\">Rigid</td>\n                                        <td class=\"px-4 py-2 text-slate-600 dark:text-slate-400\">Concrete Wall</td>\n                                        <td class=\"px-4 py-2 text-slate-600 dark:text-slate-400\">Fixed boundary. Infinite energy cost to cross (Compliance).</td>\n                                    </tr>\n                                    <tr>\n                                        <td class=\"px-4 py-2 font-semibold text-slate-700 dark:text-slate-200\">Permeable</td>\n                                        <td class=\"px-4 py-2 text-slate-600 dark:text-slate-400\">Mesh Fence</td>\n                                        <td class=\"px-4 py-2 text-slate-600 dark:text-slate-400\">Passable with friction. Filters agents by cost (Workflow).</td>\n                                    </tr>\n                                    <tr>\n                                        <td class=\"px-4 py-2 font-semibold text-slate-700 dark:text-slate-200\">Tether</td>\n                                        <td class=\"px-4 py-2 text-slate-600 dark:text-slate-400\">Dog Leash</td>\n                                        <td class=\"px-4 py-2 text-slate-600 dark:text-slate-400\">Zero cost within radius, infinite outside (Reimbursement).</td>\n                                    </tr>\n                                    <tr>\n                                        <td class=\"px-4 py-2 font-semibold text-slate-700 dark:text-slate-200\">Dark</td>\n                                        <td class=\"px-4 py-2 text-slate-600 dark:text-slate-400\">Gravity Well</td>\n                                        <td class=\"px-4 py-2 text-slate-600 dark:text-slate-400\">Attracts agents. Easy to enter, hard to leave (Liability).</td>\n                                    </tr>\n                                </tbody>\n                            </table>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </details>\n    </section>"
      },
      {
        "id": "estuary-mapping",
        "type": "labs",
        "title": "Estuary Mapping Framework Simulator",
        "description": "Strategy isn’t a neat 5-year roadmap. Explore how timing, organizational friction, and shifting tides determine whether a change initiative survives.",
        "date": "2025-12-26T00:00:00.000Z",
        "category": null,
        "tags": null,
        "url": "https://ryansnowden.com/labs/estuary-mapping/",
        "content": "import EstuarineMapping from '../../components/simulations/EstuarineMapping.astro';\nimport Katex from '../../components/graphics/Katex.astro';\nimport ScenarioTabs from '../../components/interactive/ScenarioTabs';\n\n<EstuarineMapping fullWidth={true} class=\"breakout\" />\n\n<details class=\"my-6 p-3 bg-transparent border-2 border-slate-200 dark:border-slate-800 rounded-xl\">\n    <summary class=\"cursor-pointer font-medium text-slate-500 dark:text-slate-400 flex items-center gap-2 list-none text-xs\">\n        <span class=\"uppercase tracking-wider\">Built With</span>\n        <svg class=\"w-3 h-3 transition-transform details-chevron\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n            <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n        </svg>\n    </summary>\n    <div class=\"mt-3 grid grid-cols-2 md:grid-cols-3 gap-2\">\n        <div class=\"p-2 bg-transparent rounded-lg border-2 border-slate-200 dark:border-slate-800\">\n            <div class=\"text-[10px] uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-0.5\">Language</div>\n            <div class=\"text-xs font-medium text-slate-700 dark:text-slate-200\">TypeScript</div>\n        </div>\n        <div class=\"p-2 bg-transparent rounded-lg border-2 border-slate-200 dark:border-slate-800\">\n            <div class=\"text-[10px] uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-0.5\">Framework</div>\n            <div class=\"text-xs font-medium text-slate-700 dark:text-slate-200\">React</div>\n        </div>\n        <div class=\"p-2 bg-transparent rounded-lg border-2 border-slate-200 dark:border-slate-800\">\n            <div class=\"text-[10px] uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-0.5\">Rendering</div>\n            <div class=\"text-xs font-medium text-slate-700 dark:text-slate-200\">Canvas API</div>\n        </div>\n        <div class=\"p-2 bg-transparent rounded-lg border-2 border-slate-200 dark:border-slate-800\">\n            <div class=\"text-[10px] uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-0.5\">Icons</div>\n            <div class=\"text-xs font-medium text-slate-700 dark:text-slate-200\">Lucide React</div>\n        </div>\n        <div class=\"p-2 bg-transparent rounded-lg border-2 border-slate-200 dark:border-slate-800\">\n            <div class=\"text-[10px] uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-0.5\">Math Rendering</div>\n            <div class=\"text-xs font-medium text-slate-700 dark:text-slate-200\">KaTeX</div>\n        </div>\n        <div class=\"p-2 bg-transparent rounded-lg border-2 border-slate-200 dark:border-slate-800\">\n            <div class=\"text-[10px] uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-0.5\">Static Site</div>\n            <div class=\"text-xs font-medium text-slate-700 dark:text-slate-200\">Astro</div>\n        </div>\n    </div>\n</details>\n\n<details open class=\"group mb-8\">\n    <summary class=\"cursor-pointer list-none select-none\">\n        <div class=\"flex items-center gap-2\">\n            <svg class=\"w-5 h-5 transition-transform group-open:rotate-180\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n            </svg>\n            <h3 class=\"m-0!\">Overview</h3>\n        </div>\n    </summary>\n    <div class=\"mt-4\">\n        Most corporate strategy decks pretend the world is a smooth river flowing toward a predictable \"To-Be\" destination. In reality, organisations operate in an **estuary** — an environment driven by turning tides, shifting mudflats, and hidden currents.\n\n        In an estuary, pushing forward at high tide requires immense energy because the current is fighting you. But if you wait for slack water or the turn of the tide, a small push carries you twice as far.\n\n        This simulation models the **forces acting on your organisation (we call them *actants*)** — from rigid policies and team habits to market trends. It helps you calculate the **Energy Cost of Change** so you can spot strategic windows where small, low-risk interventions achieve outsized impact.\n    </div>\n</details>\n\n<div class=\"space-y-12 my-12\">\n    <section>\n        <details open class=\"group\">\n            <summary class=\"cursor-pointer list-none select-none\">\n                <div class=\"flex items-center gap-2\">\n                    <svg class=\"w-5 h-5 transition-transform group-open:rotate-180\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                        <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n                    </svg>\n                    <h3 class=\"m-0!\">The Estuarine Metaphor</h3>\n                </div>\n            </summary>\n            <div class=\"mt-4\">\n                <p>\n                    Unlike a delta's unidirectional flow, an estuary is defined by <strong>Bidirectional Flow</strong>, which is the turn of the tide.\n                </p>\n\n                <div class=\"grid md:grid-cols-2 gap-6\">\n                    <div class=\"bg-white dark:bg-slate-900 border-2 border-slate-200 dark:border-slate-800 rounded-xl p-6 py-0\">\n                        <h4>Flood Tide &rarr;</h4>\n                        <p>Strategic momentum flows inward. Energy costs increase as you push against established structures. The system resists change.</p>\n                    </div>\n                    <div class=\"bg-white dark:bg-slate-900 border-2 border-slate-200 dark:border-slate-800 rounded-xl p-6 py-0\">\n                        <h4>&larr; Ebb Tide</h4>\n                        <p>Strategic windows open. Energy costs decrease. Small interventions can achieve disproportionate movement as the system naturally shifts.</p>\n                    </div>\n                </div>\n            </div>\n        </details>\n    </section>\n\n    <section>\n        <details class=\"group\">\n            <summary class=\"cursor-pointer list-none select-none\">\n                <div class=\"flex items-center gap-2\">\n                    <svg class=\"w-5 h-5 transition-transform group-open:rotate-180\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                        <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n                    </svg>\n                    <h3 class=\"m-0!\">Theoretical Foundations</h3>\n                </div>\n            </summary>\n            <div class=\"mt-4\">\n                <p>Behind the visual simulation sits a mix of physics, behavioural economics, and complexity theory. You don't need a PhD to use the map, but here is how those theories power the mechanics under the hood.</p>\n\n                <div class=\"space-y-8\">\n                    <div>\n                        <h4>1. Focus on What Is Possible (Constructor Theory)</h4>\n                        <p class=\"text-sm text-slate-600 dark:text-slate-400 mb-2\">\n                            <strong>What this means in practice:</strong> Traditional planning asks \"What will happen in Q4?\" Constructor Theory asks \"What transformations are physically and socially possible right now, and what tools do we need to enable them?\"\n                        </p>\n                        <ul class=\"list-disc pl-5 space-y-1 mb-2 text-sm\">\n                            <li><strong>Origin:</strong> Formulated by quantum physicists David Deutsch and Chiara Marletto.</li>\n                            <li><strong>In the Simulation:</strong> <strong>Constructors</strong> (diamond shapes) are tools, rituals, or processes that transform the environment repeatedly without getting consumed themselves (like an API, a weekly standup, or an automated test suite). <strong>Constraints</strong> (circles) define the boundaries that keep the system from devolving into total chaos.</li>\n                        </ul>\n                    </div>\n\n                    <div>\n                        <h4>2. Organisational Habits and Friction (Energy Landscapes & Attractors)</h4>\n                        <p class=\"text-sm text-slate-600 dark:text-slate-400 mb-2\">\n                            <strong>What this means in practice:</strong> Organisations have history. A team that spent five years under rigid bureaucracy won't suddenly become agile overnight just because you launched a new slide deck. Systems get trapped in \"deep wells\" (attractors) of past habits, a phenomenon known as <em>hysteresis</em>.\n                        </p>\n                        <div class=\"bg-slate-50 dark:bg-slate-900 p-4 rounded mb-3 overflow-x-auto\">\n                            <Katex formula=\"\\Delta E = E_v - E_s < 0\" />\n                        </div>\n                        <p class=\"text-sm\">\n                            <strong>The Math:</strong> Strategy succeeds when doing the right thing (the <em>Energy Cost of Virtue</em>, <Katex formula=\"E_v\" inline />) requires less energy than taking shortcuts or defaulting to legacy habits (the <em>Energy Cost of Sin</em>, <Katex formula=\"E_s\" inline />). If doing it right takes 10x more effort, people will naturally default to old habits.\n                        </p>\n                    </div>\n\n                    <div>\n                        <h4>3. How Human Behavior Shapes the Map (Cognitive Heuristics)</h4>\n                        <p class=\"text-sm text-slate-600 dark:text-slate-400 mb-2\">\n                            <strong>What this means in practice:</strong> People don't act like rational computing units. They resist change, seek safety in crowds, and prioritize immediate relief over long-term gains. The blue dots (agents) in the simulation model three core human behaviors:\n                        </p>\n                        <ul class=\"list-disc pl-5 space-y-2 text-sm\">\n                            <li><strong>Loss Aversion (Risk Sensitivity):</strong> People resist moving to a better way of working if the short-term friction of transitioning feels too painful.</li>\n                            <li><strong>Social Proof (Safety in Numbers):</strong> People cluster together. When a group forms around a legacy habit, it creates a gravity well that makes it harder for individuals to step out on their own.</li>\n                            <li><strong>Hyperbolic Discounting (Short-Term Focus):</strong> Given the choice, teams almost always prefer quick, low-effort fixes today over high-impact strategic shifts that take six months to pay off.</li>\n                        </ul>\n                    </div>\n                </div>\n            </div>\n        </details>\n    </section>\n\n    <section>\n        <details class=\"group\">\n            <summary class=\"cursor-pointer list-none select-none\">\n                <div class=\"flex items-center gap-2\">\n                    <svg class=\"w-5 h-5 transition-transform group-open:rotate-180\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                        <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n                    </svg>\n                    <h3 class=\"m-0!\">Taxonomy of Constraints</h3>\n                </div>\n            </summary>\n            <div class=\"mt-4\">\n                <p>Constraints are not merely limitations, they are boundary conditions that allow order to emerge.</p>\n\n                <div class=\"overflow-x-auto my-6\">\n                    <table class=\"min-w-full divide-y divide-slate-200 dark:divide-slate-800\">\n                        <thead>\n                            <tr>\n                                <th class=\"px-4 py-3 text-left text-xs font-bold text-slate-500 dark:text-slate-400 uppercase tracking-wider\">Type</th>\n                                <th class=\"px-4 py-3 text-left text-xs font-bold text-slate-500 dark:text-slate-400 uppercase tracking-wider\">Characteristics</th>\n                            </tr>\n                        </thead>\n                        <tbody class=\"divide-y divide-slate-100 dark:divide-slate-800\">\n                            <tr>\n                                <td class=\"px-4 py-3 text-sm font-semibold text-slate-700 dark:text-slate-200\">Rigid</td>\n                                <td class=\"px-4 py-3 text-sm text-slate-600 dark:text-slate-400\">Immovable sea walls. Core safety regulations, legal requirements. <strong>High energy cost</strong> to move or work around.</td>\n                            </tr>\n                            <tr>\n                                <td class=\"px-4 py-3 text-sm font-semibold text-slate-700 dark:text-slate-200\">Elastic</td>\n                                <td class=\"px-4 py-3 text-sm text-slate-600 dark:text-slate-400\">Stretches under pressure but snaps back. Crunch-time overtime, temporary workarounds. Oscillates with the tide.</td>\n                            </tr>\n                            <tr>\n                                <td class=\"px-4 py-3 text-sm font-semibold text-slate-700 dark:text-slate-200\">Tether</td>\n                                <td class=\"px-4 py-3 text-sm text-slate-600 dark:text-slate-400\">Freedom within a defined radius. Bounded flexibility: can move, but not escape. Employee autonomy within KPIs.</td>\n                            </tr>\n                            <tr>\n                                <td class=\"px-4 py-3 text-sm font-semibold text-slate-700 dark:text-slate-200\">Permeable</td>\n                                <td class=\"px-4 py-3 text-sm text-slate-600 dark:text-slate-400\">Selective membranes. Informal social networks that cross organisational silos. Agents may or may not pass through.</td>\n                            </tr>\n                            <tr>\n                                <td class=\"px-4 py-3 text-sm font-semibold text-slate-700 dark:text-slate-200\">Phase Shift</td>\n                                <td class=\"px-4 py-3 text-sm text-slate-600 dark:text-slate-400\">Tipping points. Near bifurcation thresholds where small changes cause sudden, qualitative shifts in system topology.</td>\n                            </tr>\n                            <tr>\n                                <td class=\"px-4 py-3 text-sm font-semibold text-slate-700 dark:text-slate-200\">Dark</td>\n                                <td class=\"px-4 py-3 text-sm text-slate-600 dark:text-slate-400\">Invisible forces. Shadow IT, informal hierarchies. Detectable only through their \"gravitational\" influence on flow.</td>\n                            </tr>\n                        </tbody>\n                    </table>\n                </div>\n            </div>\n        </details>\n    </section>\n\n    <section>\n        <details class=\"group\">\n            <summary class=\"cursor-pointer list-none select-none\">\n                <div class=\"flex items-center gap-2\">\n                    <svg class=\"w-5 h-5 transition-transform group-open:rotate-180\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                        <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n                    </svg>\n                    <h3 class=\"m-0!\">Tidal States</h3>\n                </div>\n            </summary>\n            <div class=\"mt-4\">\n                <p>The tide cycles through three distinct states, each affecting system behavior differently.</p>\n\n                <h4>HIGH Tide</h4>\n                <ul class=\"list-disc pl-5 space-y-1 mb-0\">\n                    <li>Peak capital and momentum</li>\n                    <li>Constraints \"submerged\", leading to reduced friction</li>\n                    <li>Constructors at max throughput</li>\n                    <li>Agents flow freely with strong alignment</li>\n                </ul>\n\n                    <h4>SLACK Water</h4>\n                <ul class=\"list-disc pl-5 space-y-1 mb-0\">\n                    <li>Transition phase, also known as <strong>the Turn</strong></li>\n                    <li>Energy cost of change at minimum</li>\n                    <li>Constraints vulnerable to re-zoning</li>\n                    <li>Strategic window for low-friction moves</li>\n                </ul>\n\n                    <h4>LOW Tide</h4>\n                <ul class=\"list-disc pl-5 space-y-1 mb-0\">\n                    <li>Scarcity and exposure</li>\n                    <li>\"Rocks\" (rigid constraints) exposed</li>\n                    <li>Constructor energy decays faster</li>\n                    <li>Agents cluster via <strong>Social Proof</strong> herding</li>\n                </ul>\n            </div>\n        </details>\n    </section>\n\n    <section>\n        <details class=\"group\">\n            <summary class=\"cursor-pointer list-none select-none\">\n                <div class=\"flex items-center gap-2\">\n                    <svg class=\"w-5 h-5 transition-transform group-open:rotate-180\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                        <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n                    </svg>\n                    <h3 class=\"m-0!\">Strategic Vectors</h3>\n                </div>\n            </summary>\n            <div class=\"mt-4\">\n                <p>Leadership intent is modeled as directional vectors applied to actants. Vectors create local \"winds\" that alter energy flow, visualized as arrows emanating from Constraints and Constructors.</p>\n\n                <div class=\"grid md:grid-cols-2 gap-6\">\n                    <div class=\"bg-white dark:bg-slate-900 border-2 border-slate-200 dark:border-slate-800 rounded-xl p-6 py-0\">\n                        <h4>Vertical Axis (Energy Cost)</h4>\n                        <ul class=\"list-disc pl-5 space-y-1 mb-0\">\n                            <li><strong>North (▲):</strong> Increase energy cost, making a \"sin\" harder</li>\n                            <li><strong>South (▼):</strong> Decrease energy cost, making a \"virtue\" easier</li>\n                        </ul>\n                    </div>\n                    <div class=\"bg-white dark:bg-slate-900 border-2 border-slate-200 dark:border-slate-800 rounded-xl p-6 py-0\">\n                        <h4>Horizontal Axis (Timing)</h4>\n                        <ul class=\"list-disc pl-5 space-y-1 mb-0\">\n                            <li><strong>West (◄):</strong> Accelerate change by doing it sooner or faster</li>\n                            <li><strong>East (►):</strong> Delay change by storing <strong>Capacitance</strong> (social energy)</li>\n                        </ul>\n                    </div>\n                </div>\n                <p class=\"mt-4\">When a vector opposes the natural tidal flow, <strong>Turbulence</strong> appears as an orange glow around the actant, visualizing leadership friction.</p>\n            </div>\n        </details>\n    </section>\n\n    <section>\n        <details class=\"group\">\n            <summary class=\"cursor-pointer list-none select-none\">\n                <div class=\"flex items-center gap-2\">\n                    <svg class=\"w-5 h-5 transition-transform group-open:rotate-180\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                        <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n                    </svg>\n                    <h3 class=\"m-0!\">Causal Chains & Entanglement</h3>\n                </div>\n            </summary>\n            <div class=\"mt-4\">\n                <p>Actants don't exist in isolation; they're connected through invisible bonds that create emergent organisational dynamics.</p>\n                <h4>Entanglement Bonds</h4>\n                <p>Purple animated tethers representing hidden coupling between nodes.</p>\n                <ul class=\"list-disc pl-5 space-y-1 mb-0\">\n                    <li><strong>Spring Physics:</strong> Moving a parent node physically pulls entangled children</li>\n                    <li><strong>Stretch Visualization:</strong> Glow intensifies when bonds are under tension</li>\n                    <li><strong>Example:</strong> Legacy ERP entangled with IT Governance, meaning you can't change one without affecting the other</li>\n                </ul>\n\n                 <h4>Signal Bonds</h4>\n                <p>Cyan dashed lines representing If-Then causal links between actants.</p>\n                <ul class=\"list-disc pl-5 space-y-1 mb-0\">\n                    <li><strong>Triggers:</strong> Capacitance full, state change, or tidal turn</li>\n                    <li><strong>Animated Pulse:</strong> Cyan pulse travels along the bond when triggered</li>\n                    <li><strong>Effects:</strong> Deepen/shallow target's potential well, or trigger phase shift</li>\n                </ul>\n\n            <h4>Bond Types Reference</h4>\n            <table class=\"w-full text-sm\">\n                <thead>\n                    <tr class=\"border-b border-slate-300 dark:border-slate-700\">\n                        <th class=\"text-left py-2\">Type</th>\n                        <th class=\"text-left py-2\">Function</th>\n                        <th class=\"text-left py-2\">Visual</th>\n                    </tr>\n                </thead>\n                <tbody>\n                    <tr class=\"border-b border-slate-200 dark:border-slate-800\">\n                        <td class=\"py-2 text-purple-500 font-medium\">Entanglement</td>\n                        <td class=\"py-2\">Constraint-Distance Spring coupling</td>\n                        <td class=\"py-2\">Purple curved tether with glow</td>\n                    </tr>\n                    <tr class=\"border-b border-slate-200 dark:border-slate-800\">\n                        <td class=\"py-2 text-cyan-500 font-medium\">Signal</td>\n                        <td class=\"py-2\">If-Then conditional effect propagation</td>\n                        <td class=\"py-2\">Cyan dashed line with traveling pulse</td>\n                    </tr>\n                </tbody>\n            </table>\n            </div>\n        </details>\n    </section>\n\n    <section class=\"max-w-4xl mx-auto\">\n        <details class=\"group\">\n            <summary class=\"cursor-pointer list-none select-none\">\n                <div class=\"flex items-center gap-2\">\n                    <svg class=\"w-5 h-5 transition-transform group-open:rotate-180\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                        <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n                    </svg>\n                    <h3 class=\"m-0!\">Organisational Scenarios</h3>\n                </div>\n            </summary>\n            <div class=\"mt-4\">\n                <p>Real-world strategic situations modeled through the estuarine lens.</p>\n\n                <div class=\"flex flex-wrap justify-center gap-3 mb-6\">\n                    <button data-tab=\"scenario-tab-1\" class=\"px-4 py-2 rounded-full text-sm font-bold transition-all duration-300 bg-transparent cursor-pointer ring-2 whitespace-nowrap ring-accent text-slate-900 dark:text-white\">Market Disruption</button>\n                    <button data-tab=\"scenario-tab-2\" class=\"px-4 py-2 rounded-full text-sm font-bold transition-all duration-300 bg-transparent cursor-pointer ring-2 whitespace-nowrap ring-slate-200 text-slate-600 dark:ring-slate-700 dark:text-slate-400 hover:-translate-y-px hover:ring-accent hover:text-slate-900 dark:hover:text-white\">Digital Transformation</button>\n                    <button data-tab=\"scenario-tab-3\" class=\"px-4 py-2 rounded-full text-sm font-bold transition-all duration-300 bg-transparent cursor-pointer ring-2 whitespace-nowrap ring-slate-200 text-slate-600 dark:ring-slate-700 dark:text-slate-400 hover:-translate-y-px hover:ring-accent hover:text-slate-900 dark:hover:text-white\">Talent Flow</button>\n                    <button data-tab=\"scenario-tab-4\" class=\"px-4 py-2 rounded-full text-sm font-bold transition-all duration-300 bg-transparent cursor-pointer ring-2 whitespace-nowrap ring-slate-200 text-slate-600 dark:ring-slate-700 dark:text-slate-400 hover:-translate-y-px hover:ring-accent hover:text-slate-900 dark:hover:text-white\">Regulatory Wave</button>\n                </div>\n\n                <div id=\"scenario-tab-1\" class=\"tab-content breakout bg-slate-50 dark:bg-slate-900 border-y-2 border-slate-200 dark:border-slate-800 p-8 md:p-12 mb-12\">\n                    <div class=\"max-w-4xl mx-auto text-left\">\n                        <h4>Market Disruption</h4>\n                        <div class=\"pill-cyan\">Particles = Initiatives · Ocean = Market forces</div>\n                        \n                        <p><strong>Particles represent strategic initiatives</strong> (product launches, R&D bets) and the <strong>tidal ocean represents broader market forces</strong> (economic cycles, technology shifts, competitor moves).</p>\n                        \n                        <h5>How It Works</h5>\n                        <p>When disruption hits, it arrives like a <strong>spring tide</strong>, which is a powerful, external surge that floods your strategic landscape. Watch how:</p>\n                        <ul class=\"list-disc pl-5 space-y-2 mb-4\">\n                            <li><strong>Rigid Constraints</strong> (red circles) represent established incumbents, legacy business models, or regulatory frameworks. They don't move, so initiatives must flow around them or expend enormous energy to dislodge them.</li>\n                            <li><strong>Elastic Constraints</strong> (orange) represent adaptable competitors who stretch under pressure but snap back. They survive disruption by bending, not breaking.</li>\n                            <li><strong>Constructors</strong> (diamonds) represent the processes that generate new initiatives: innovation labs, accelerators, M&A pipelines. They attract particles, catalyze transformations, and remain relatively unchanged themselves.</li>\n                        </ul>\n                        \n                        <h5>Strategic Insights</h5>\n                        <ul class=\"list-disc pl-5 space-y-2 mb-0\">\n                            <li><strong>Low herding coefficient:</strong> Chaotic markets reduce coordination. Individual initiatives scatter rather than cluster, representing the \"every company for itself\" dynamic during disruption.</li>\n                            <li><strong>Timing matters:</strong> Wait for <strong>SLACK water</strong> (the turn between tides) to launch initiatives, as this is when energy cost of change is lowest and established players are momentarily disoriented.</li>\n                            <li><strong>Dark Constraints appear:</strong> Watch for invisible forces (shadow competitors, platform shifts) that only reveal themselves through their gravitational effect on initiative flow.</li>\n                        </ul>\n                    </div>\n                </div>\n                <div id=\"scenario-tab-2\" class=\"tab-content hidden breakout bg-slate-50 dark:bg-slate-900 border-y-2 border-slate-200 dark:border-slate-800 p-8 md:p-12 mb-12\">\n                    <div class=\"max-w-4xl mx-auto text-left\">\n                        <h4>Digital Transformation</h4>\n                        <div class=\"pill-cyan\">Particles = Projects · Rigid = Legacy ERP</div>\n                        \n                        <p>Here, <strong>particles represent digital projects</strong> such as cloud migrations, new platforms, and process automations, while the <strong>Rigid Constraints represent legacy ERP systems</strong> that cannot easily move or change. This is the classic enterprise transformation dilemma.</p>\n                        \n                        <h5>How It Works</h5>\n                        <p>Legacy systems create <strong>energy wells</strong>, consisting of deep basins of attraction that trap projects. Digital initiatives must either:</p>\n                        <ul class=\"list-disc pl-5 space-y-2 mb-4\">\n                            <li><strong>Navigate around:</strong> Projects flow around the immovable ERP, creating workarounds and integrations that add complexity.</li>\n                            <li><strong>Expend massive energy:</strong> Attempting to replace the ERP requires overcoming enormous organisational inertia, which is the \"gravity\" of decades of investment, training, and process dependence.</li>\n                            <li><strong>Create Shadow IT:</strong> Watch for <strong>Dark Constraints</strong> (invisible gray circles) that emerge organically. These are unsanctioned systems that people build to bypass rigid barriers; they are powerful but invisible until they fail.</li>\n                        </ul>\n                        \n                        <h5>Causal Chains in Action</h5>\n                        <p>This scenario showcases <strong>Entanglement Bonds</strong>:</p>\n                        <ul class=\"list-disc pl-5 space-y-2 mb-4\">\n                            <li><strong>Legacy ERP ↔ IT Governance:</strong> A purple tether connects these nodes. Try dragging one; the other resists. You cannot change your ERP without affecting governance, and vice versa.</li>\n                            <li><strong>Signal Bonds:</strong> Cyan dashed lines represent conditional triggers. When the tide turns (SLACK water), a signal may fire, representing leadership intervention or a budget cycle that briefly unlocks transformation potential.</li>\n                        </ul>\n                        \n                        <h5>Strategic Insights</h5>\n                        <ul class=\"list-disc pl-5 space-y-2 mb-0\">\n                            <li><strong>High herding coefficient:</strong> Departmental silos cause projects to cluster tightly. Teams huddle in their comfort zones, making cross-functional transformation harder.</li>\n                            <li><strong>Phase Shift opportunity:</strong> The purple constraint may trigger a <strong>Phase Shift</strong>, which is a sudden, qualitative change in topology, if enough projects accumulate their Capacitance near a critical threshold.</li>\n                            <li><strong>Watch the stretch:</strong> Elastic constraints (orange) represent adaptable middleware. They absorb transformation pressure temporarily but eventually snap back unless permanently restructured.</li>\n                        </ul>\n                    </div>\n                </div>\n                <div id=\"scenario-tab-3\" class=\"tab-content hidden breakout bg-slate-50 dark:bg-slate-900 border-y-2 border-slate-200 dark:border-slate-800 p-8 md:p-12 mb-12\">\n                    <div class=\"max-w-4xl mx-auto text-left\">\n                        <h4>Talent Flow</h4>\n                        <div class=\"pill-cyan\">Particles = Employees · Tide = Job market</div>\n                        \n                        <p><strong>Particles represent individual employees</strong> (career trajectories, loyalty) and the <strong>tidal ocean represents the job market</strong> (economic conditions, industry trends, competitive offers).</p>\n                        \n                        <h5>How It Works</h5>\n                        <p>People are not resources to be \"managed\"; they flow like water, seeking the path of least resistance toward their goals. Watch how:</p>\n                        <ul class=\"list-disc pl-5 space-y-2 mb-4\">\n                            <li><strong>Constructors attract:</strong> The diamond-shaped \"Onboarding\" constructor creates a pull on incoming talent. Strong onboarding lowers the energy cost of joining, drawing particles toward the organisation.</li>\n                            <li><strong>Tethers retain:</strong> Yellow constraints represent retention mechanisms like competitive comp, career paths, and relationships. They allow freedom of movement within a bounded radius, but prevent complete escape.</li>\n                            <li><strong>The tide turns:</strong> During LOW tide (recession, layoffs), particles cluster tightly via <strong>Social Proof</strong>; survival instinct creates intense herding. During HIGH tide (hot job market), particles scatter as opportunities abound.</li>\n                        </ul>\n                        \n                        <h5>Understanding Herding</h5>\n                        <p>This scenario demonstrates the highest <strong>Social Proof coefficient</strong>:</p>\n                        <ul class=\"list-disc pl-5 space-y-2 mb-4\">\n                            <li><strong>Cultural tribes form:</strong> Employees naturally cluster into groups, such as the \"engineering culture\" or the \"sales floor vibe,\" creating local energy wells that resist dispersion.</li>\n                            <li><strong>Departure cascades:</strong> When a key individual leaves (phase shift), it can trigger a cascade as the cluster's social gravity weakens, which is the \"great resignation\" effect visualized.</li>\n                            <li><strong>Alignment strength:</strong> High alignment means people in a cluster move together. Break alignment (e.g., reorganisation) and watch the cluster dissolve into chaos before reforming.</li>\n                        </ul>\n                        \n                        <h5>Strategic Insights</h5>\n                        <ul class=\"list-disc pl-5 space-y-2 mb-0\">\n                            <li><strong>Retention isn't capture:</strong> Tethers that bind too tightly cause particles to oscillate and eventually snap free (burnout). The goal is bounded autonomy, providing enough freedom to explore and enough connection to stay.</li>\n                            <li><strong>Watch for Dark Constraints:</strong> Invisible factors like toxic management pockets act as hidden repellers. Particles flow away from them, but you can't see why until you analyze their \"gravitational\" absence.</li>\n                            <li><strong>SLACK water opportunity:</strong> Major hiring initiatives work best during the turn, when market forces are neutral, candidates are receptive, and the energy cost of change is minimal.</li>\n                        </ul>\n                    </div>\n                </div>\n                <div id=\"scenario-tab-4\" class=\"tab-content hidden breakout bg-slate-50 dark:bg-slate-900 border-y-2 border-slate-200 dark:border-slate-800 p-8 md:p-12 mb-12\">\n                    <div class=\"max-w-4xl mx-auto text-left\">\n                        <h4>Regulatory Wave</h4>\n                        <div class=\"pill-cyan\">Particles = Processes · Ocean = Regulation</div>\n                        \n                        <p>Here, <strong>particles represent organisational processes</strong> such as workflows, procedures, and data handling practices, while the <strong>tidal ocean represents the regulatory environment</strong>: new frameworks (GDPR, SOX, AI governance) that arrive with the force of a spring tide, reshaping the landscape.</p>\n                        \n                        <h5>How It Works</h5>\n                        <p>Regulation doesn't ask permission. It arrives, and organisations must adapt or face consequences. Watch how:</p>\n                        <ul class=\"list-disc pl-5 space-y-2 mb-4\">\n                            <li><strong>Rigid Constraints = Hard requirements:</strong> Red circles represent non-negotiable mandates; you must comply or face penalties. Processes cannot flow through them; they must route around entirely.</li>\n                            <li><strong>Permeable Constraints = Guidelines:</strong> Green circles represent softer requirements, best practices, or \"comply-or-explain\" frameworks. Processes may pass through, but with friction that slows adoption.</li>\n                            <li><strong>Regulatory Capture:</strong> Some rigid constraints accumulate <strong>Capacitance</strong>, consisting of stored energy from process friction. When full, they may trigger <strong>Phase Shifts</strong> in connected processes, representing sudden compliance crackdowns or enforcement actions.</li>\n                        </ul>\n                        \n                        <h5>The Absorption Pattern</h5>\n                        <p>Organisations exhibit three distinct responses to regulatory pressure:</p>\n                        <ul class=\"list-disc pl-5 space-y-2 mb-4\">\n                            <li><strong>Resistance:</strong> Processes cluster away from rigid constraints, avoiding compliance zones. This is visible as tight clusters in corners of the simulation, representing short-term avoidance that accumulates risk.</li>\n                            <li><strong>Absorption:</strong> Processes flow toward and through Constructors (compliance programs), which transform them into compliant variants. The Constructor doesn't change, but processes emerge transformed.</li>\n                            <li><strong>Isomorphism:</strong> Over time, all processes begin to resemble each other as they adapt to the same constraints. Watch herding increase as the regulatory tide rises, with everyone converging on similar compliance patterns.</li>\n                        </ul>\n                        \n                        <h5>Strategic Insights</h5>\n                        <ul class=\"list-disc pl-5 space-y-2 mb-0\">\n                            <li><strong>Early movers surface while others flounder:</strong> Organisations that adapt during SLACK water (before full regulatory force) find lower energy costs. Late adopters face the full spring tide, which brings high friction and forced transformation.</li>\n                            <li><strong>Watch for Sunk Cost Fallacy:</strong> Processes heavily invested in legacy approaches (high Inductance) resist change longest. They maintain momentum in the old direction even as the tide turns against them.</li>\n                            <li><strong>Strategic vectors matter:</strong> Actants with North vectors (increase energy cost) represent intentional friction, making non-compliance harder. South vectors (decrease energy cost) represent compliance enablers, making virtue easier.</li>\n                        </ul>\n                    </div>\n                </div>\n\n                <ScenarioTabs client:only=\"react\" />\n            </div>\n        </details>\n    </section>\n\n    <section>\n        <details class=\"group\">\n            <summary class=\"cursor-pointer list-none select-none\">\n                <div class=\"flex items-center gap-2\">\n                    <svg class=\"w-5 h-5 transition-transform group-open:rotate-180\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                        <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n                    </svg>\n                    <h3 class=\"m-0!\">Controls Reference</h3>\n                </div>\n            </summary>\n            <div class=\"mt-4\">\n                <div class=\"grid md:grid-cols-2 gap-6\">\n                    <div class=\"bg-white dark:bg-slate-900 border-2 border-slate-200 dark:border-slate-800 rounded-xl p-6 py-0\">\n                        <h4>Tide Strength</h4>\n                        <p>Controls the amplitude of bidirectional flow. Higher values create stronger strategic windows but also more turbulence.</p>\n                    </div>\n                    <div class=\"bg-white dark:bg-slate-900 border-2 border-slate-200 dark:border-slate-800 rounded-xl p-6 py-0\">\n                        <h4>Loss Aversion (λ)</h4>\n                        <p>How strongly agents resist moving to higher-energy states. Range 1.0–3.0. Higher values create more \"sticky\" organisational inertia.</p>\n                    </div>\n                    <div class=\"bg-white dark:bg-slate-900 border-2 border-slate-200 dark:border-slate-800 rounded-xl p-6 py-0\">\n                        <h4>Social Proof Radius</h4>\n                        <p>Cluster detection range for herding behavior. Larger values cause agents to form bigger clusters. Varies by scenario.</p>\n                    </div>\n                    <div class=\"bg-white dark:bg-slate-900 border-2 border-slate-200 dark:border-slate-800 rounded-xl p-6 py-0\">\n                        <h4>Vector Power</h4>\n                        <p>Multiplier for strategic vector influence. Higher values make leadership intent (arrows) more forceful on nearby agents.</p>\n                    </div>\n                    <div class=\"bg-white dark:bg-slate-900 border-2 border-slate-200 dark:border-slate-800 rounded-xl p-6 py-0\">\n                        <h4>Energy Overlay</h4>\n                        <p>Visualizes the energy landscape. Green = low cost of change. Yellow = moderate. Red = high resistance zones.</p>\n                    </div>\n                    <div class=\"bg-white dark:bg-slate-900 border-2 border-slate-200 dark:border-slate-800 rounded-xl p-6 py-0\">\n                        <h4>Flow Arrows</h4>\n                        <p>Shows the current tidal velocity field. Arrows indicate direction and strength of flow at each point.</p>\n                    </div>\n                </div>\n\n                <h4 class=\"mt-8\">Per-Actant Settings</h4>\n                <p>Click any Constraint or Constructor to access individual settings:</p>\n                <div class=\"grid md:grid-cols-2 gap-6\">\n                    <div class=\"bg-white dark:bg-slate-900 border-2 border-slate-200 dark:border-slate-800 rounded-xl p-6 py-0\">\n                        <h4>Influence Radius</h4>\n                        <p>How far the actant's strategic vector affects nearby agents. Shown as a dotted circle.</p>\n                    </div>\n                    <div class=\"bg-white dark:bg-slate-900 border-2 border-slate-200 dark:border-slate-800 rounded-xl p-6 py-0\">\n                        <h4>Vector Direction</h4>\n                        <p>N/S/E/W compass control. Combine axes (e.g., NW) for diagonal intent. Affects agent acceleration within influence radius.</p>\n                    </div>\n                </div>\n            </div>\n        </details>\n    </section>\n\n    <section>\n        <details class=\"group\">\n            <summary class=\"cursor-pointer list-none select-none\">\n                <div class=\"flex items-center gap-2\">\n                    <svg class=\"w-5 h-5 transition-transform group-open:rotate-180\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                        <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n                    </svg>\n                    <h3 class=\"m-0!\">Formulas and Concepts Used</h3>\n                </div>\n            </summary>\n            <div class=\"mt-4\">\n                <p>Integrates principles from behavioral economics, cognitive psychology, physics, and complexity science.</p>\n\n                <div class=\"space-y-8\">\n                    <div>\n                        <h4>Loss Aversion (Prospect Theory)</h4>\n                        <ul class=\"list-disc pl-5 space-y-1 mb-2\">\n                            <li><strong>Creators:</strong> Daniel Kahneman & Amos Tversky (1979)</li>\n                            <li><strong>Concept:</strong> People feel losses more intensely than equivalent gains; it is approximately 2x as painful.</li>\n                        </ul>\n                        <div class=\"bg-slate-50 dark:bg-slate-900 p-4 rounded mb-3 overflow-x-auto\">\n                            <Katex formula=\"v_{new} = v_{current} \\times (1 - \\min(0.9, \\Delta E \\times \\lambda))\" />\n                        </div>\n                        <p>\n                            Where <Katex formula=\"\\Delta E = E_{target} - E_{current}\" inline /> is the energy difference and <Katex formula=\"\\lambda\" inline /> is the loss aversion coefficient (1.0–3.0). Agents resist moving to higher-energy states, creating organisational inertia.\n                        </p>\n```typescript\n// Loss Aversion: Resistance to higher energy states\nconst energyDiff = targetEnergy - currentEnergy;\nif (energyDiff > 0) {\n    // Moving uphill: Apply loss aversion penalty\n    if (Math.random() > Math.pow(0.5, energyDiff * lossAversionLambda)) {\n        return; // Reject move\n    }\n}\n```\n                    </div>\n\n                    <div>\n                        <h4>Social Proof (Herding Behavior)</h4>\n                        <ul class=\"list-disc pl-5 space-y-1 mb-2\">\n                            <li><strong>Creator:</strong> Robert Cialdini (1984)</li>\n                            <li><strong>Concept:</strong> When uncertain, people look to others' behavior for guidance: \"if everyone else is doing it, it must be correct.\"</li>\n                        </ul>\n                        <div class=\"bg-slate-50 dark:bg-slate-900 p-4 rounded mb-3 overflow-x-auto\">\n                            <Katex formula=\"E_{effective} = E_{base} - \\min(0.4, n \\times 0.05)\" />\n                        </div>\n                        <p>\n                            Nearby agents (<Katex formula=\"n\" inline />) reduce the local energy cost, creating \"social gravity wells.\" It becomes energetically cheaper to stay within the herd than to break away.\n                        </p>\n```typescript\n// Social Gravity: Local clusters reduce effective energy cost\nconst nearbyCount = this.getNearbyAgents(radius).length;\nconst socialDiscount = Math.min(0.4, nearbyCount * 0.05);\n\n// The herd makes the current location feel \"safer\" (lower energy)\nconst effectiveEnergy = baseEnergy - socialDiscount;\n```\n                    </div>\n\n                    <div>\n                        <h4>Boids Algorithm (Flocking)</h4>\n                        <ul class=\"list-disc pl-5 space-y-1 mb-2\">\n                            <li><strong>Creator:</strong> Craig Reynolds (1986)</li>\n                            <li><strong>Concept:</strong> Emergent collective behavior from three simple rules.</li>\n                        </ul>\n                        <div class=\"bg-slate-50 dark:bg-slate-900 p-4 rounded mb-3 overflow-x-auto\">\n                            <Katex formula=\"\\vec{v}_{total} = \\alpha \\cdot \\vec{v}_{cohesion} + \\beta \\cdot \\vec{v}_{alignment} + \\gamma \\cdot \\vec{v}_{separation}\" />\n                        </div>\n                        <p>\n                            <strong>Separation:</strong> Avoid crowding neighbors (inverse-square falloff).\n                        </p>\n```typescript\n// Flocking Behavior (Boids)\nconst cohesion = this.steerToward(averagePosition);\nconst alignment = this.steerToward(averageHeading);\nconst separation = this.avoid(neighbors);\n\n// Sum of vectors with weights\nthis.acceleration.add(cohesion.mult(0.01));\nthis.acceleration.add(alignment.mult(0.05));\nthis.acceleration.add(separation.mult(0.1));\n```\n                    </div>\n\n                    <div>\n                        <h4>Gradient Descent</h4>\n                        <ul class=\"list-disc pl-5 space-y-1 mb-2\">\n                            <li><strong>Origin:</strong> Mathematical optimization (Cauchy, 1847)</li>\n                            <li><strong>Concept:</strong> Move in the direction of steepest descent to find local minima.</li>\n                        </ul>\n                        <div class=\"bg-slate-50 dark:bg-slate-900 p-4 rounded mb-3 overflow-x-auto\">\n                            <Katex formula=\"\\vec{v} \\leftarrow \\vec{v} - \\eta \\cdot \\nabla E\" />\n                        </div>\n                        <p>\n                            Agents descend the energy landscape, seeking \"basins of attraction\" (stable low-energy states). The gradient <Katex formula=\"\\nabla E\" inline /> is sampled from the energy grid, and <Katex formula=\"\\eta\" inline /> is the learning rate (0.3 in stable zones).\n                        </p>\n```typescript\n// Gradient Descent on Energy Landscape\nconst gradX = (energyGrid[x+1][y] - energyGrid[x-1][y]) / 2;\nconst gradY = (energyGrid[x][y+1] - energyGrid[x][y-1]) / 2;\n\n// Move towards lower energy (downhill)\nthis.velocity.x -= gradX * learningRate;\nthis.velocity.y -= gradY * learningRate;\n```\n                    </div>\n\n                    <div>\n                        <h4>Inductance (Bond Graph Theory)</h4>\n                        <ul class=\"list-disc pl-5 space-y-1 mb-2\">\n                            <li><strong>Origin:</strong> Henry Paynter (1961)</li>\n                            <li><strong>Concept:</strong> Energy storage in momentum, reflecting resistance to changes in flow rate.</li>\n                        </ul>\n                        <div class=\"bg-slate-50 dark:bg-slate-900 p-4 rounded mb-3 overflow-x-auto\">\n                            <Katex formula=\"\\vec{v}_{new} = \\vec{v}_{prev} + \\Delta\\vec{v} \\times (1 - I \\times 0.5)\" />\n                        </div>\n                        <p>\n                            Where <Katex formula=\"I\" inline /> is inductance (0–1). Clustered agents build momentum inertia that resists sudden direction changes, which models organisational momentum.\n                        </p>\n```typescript\n// Inductance: Resistance to change in velocity\nconst inductance = 0.8; // High organizational inertia\nthis.velocity.x = (prevVx * inductance) + (newVx * (1 - inductance));\nthis.velocity.y = (prevVy * inductance) + (newVy * (1 - inductance));\n```\n                    </div>\n\n                    <div>\n                        <h4>Sunk Cost Fallacy</h4>\n                        <ul class=\"list-disc pl-5 space-y-1 mb-2\">\n                            <li><strong>Researchers:</strong> Hal Arkes & Catherine Blumer (1985)</li>\n                            <li><strong>Concept:</strong> Past investment irrationally influences future decisions: \"we've come too far to stop now.\"</li>\n                        </ul>\n                        <div class=\"bg-slate-50 dark:bg-slate-900 p-4 rounded mb-3 overflow-x-auto\">\n                            <Katex formula=\"I_{boost} = \\min\\left(0.3, \\frac{t - t_{threshold}}{2 \\times t_{threshold}}\\right)\" />\n                        </div>\n                        <p>\n                            Agents older than <Katex formula=\"t_{threshold}\" inline /> (~10 seconds) receive progressive inductance boosts, making them harder to dislodge from current trajectories.\n                        </p>\n```typescript\n// Sunk Cost: Older agents become harder to move\nconst age = Date.now() - this.createdAt;\nif (age > threshold) {\n    // Increase inductance based on age\n    this.inductance += 0.001; \n}\n```\n                    </div>\n\n                    <div>\n                        <h4>Abilene Paradox (Groupthink)</h4>\n                        <ul class=\"list-disc pl-5 space-y-1 mb-2\">\n                            <li><strong>Creator:</strong> Jerry B. Harvey (1974)</li>\n                            <li><strong>Concept:</strong> Groups collectively decide on a course of action that no individual member actually wants.</li>\n                        </ul>\n                        <div class=\"bg-slate-50 dark:bg-slate-900 p-4 rounded mb-3 overflow-x-auto\">\n                            <Katex formula=\"\\vec{v}_{phantom} = (I_{cluster} - I_{max}) \\times 0.5 \\times \\hat{d}_{sin}\" />\n                        </div>\n                        <p>\n                            When cluster inductance exceeds <Katex formula=\"I_{max} = 0.6\" inline />, a \"phantom vector\" emerges that pushes the entire group toward high-energy \"sin\" basins, representing collective drift toward suboptimal outcomes.\n                        </p>\n```typescript\n// Abilene Paradox: Collective drift to undesired outcome\n// If cluster cohesion is too high, drift towards \"Sin\" basin\nif (clusterInductance > 0.6) {\n   const phantomVector = getVectorToSinBasin();\n   this.applyForce(phantomVector.mult(0.5));\n}\n```\n                    </div>\n\n                    <div>\n                        <h4>Institutional Isomorphism</h4>\n                        <ul class=\"list-disc pl-5 space-y-1 mb-2\">\n                            <li><strong>Researchers:</strong> Paul DiMaggio & Walter Powell (1983)</li>\n                            <li><strong>Concept:</strong> Organisations under similar environmental pressures become structurally similar over time.</li>\n                        </ul>\n                        <div class=\"bg-slate-50 dark:bg-slate-900 p-4 rounded mb-3 overflow-x-auto\">\n                            <Katex formula=\"I_{self} \\leftarrow I_{self} + \\mu \\times (I_{neighbor} - I_{self})\" />\n                        </div>\n                        <p>\n                            Agents adopt properties (inductance, loss aversion) of nearby successful neighbors with higher flow rates. <Katex formula=\"\\mu = 0.05\" inline /> controls the gradual mimicry rate.\n                        </p>\n```typescript\n// Mimetic Isomorphism: Copy successful neighbors\nconst neighbor = this.getNearestHighFlowNeighbor();\nif (neighbor) {\n    // Adopt neighbor's properties\n    this.inductance = lerp(this.inductance, neighbor.inductance, 0.05);\n    this.lossAversion = lerp(this.lossAversion, neighbor.lossAversion, 0.05);\n}\n```\n                    </div>\n\n                    <div>\n                        <h4>Hooke's Law (Entanglement Springs)</h4>\n                        <ul class=\"list-disc pl-5 space-y-1 mb-2\">\n                            <li><strong>Creator:</strong> Robert Hooke (1678)</li>\n                            <li><strong>Concept:</strong> The force exerted by a spring is proportional to its displacement from equilibrium.</li>\n                        </ul>\n                        <div class=\"bg-slate-50 dark:bg-slate-900 p-4 rounded mb-3 overflow-x-auto\">\n                            <Katex formula=\"F = -k \\times (d - d_0)\" />\n                        </div>\n                        <p>\n                            Entanglement bonds apply spring forces when stretched beyond their rest length <Katex formula=\"d_0\" inline />. This creates the physical coupling between entangled actants, where pulling one drags the other.\n                        </p>\n```typescript\n// Entanglement Spring Force\nconst dx = connectedNode.x - this.x;\nconst dy = connectedNode.y - this.y;\nconst distance = Math.sqrt(dx*dx + dy*dy);\nconst force = (distance - restLength) * springConstant;\n\n// Apply restoring force\nthis.applyForce(new Vector(dx, dy).normalize().mult(force));\n```\n                    </div>\n\n                    <div>\n                        <h4>Hyperbolic Discounting</h4>\n                        <ul class=\"list-disc pl-5 space-y-1 mb-2\">\n                            <li><strong>Researcher:</strong> George Ainslie (1975)</li>\n                            <li><strong>Concept:</strong> People prefer smaller, immediate rewards over larger, delayed rewards, with preference reversals near the present.</li>\n                        </ul>\n                        <div class=\"bg-slate-50 dark:bg-slate-900 p-4 rounded mb-3 overflow-x-auto\">\n                            <Katex formula=\"V = \\frac{A}{1 + kD}\" />\n                        </div>\n                        <p>\n                            Where <Katex formula=\"A\" inline /> is reward magnitude, <Katex formula=\"D\" inline /> is delay, and <Katex formula=\"k\" inline /> is the discount rate. Agents prefer low-energy, short-time interventions (West vectors) over high-impact, long-time strategic shifts (East vectors).\n                        </p>\n```typescript\n// Preference for immediate small gains over long-term value\nconst shortTermGain = assessVector(WEST); // Do it now\nconst longTermGain = assessVector(EAST);  // Build capacity\n\n// Discount future value\nconst discountedLongTerm = longTermGain / (1 + discountRate * delay);\n\nif (shortTermGain > discountedLongTerm) {\n    this.move(WEST);\n}\n```\n                    </div>\n\n                    <div>\n                        <h4>Hysteresis</h4>\n                        <ul class=\"list-disc pl-5 space-y-1 mb-2\">\n                            <li><strong>Origin:</strong> James Alfred Ewing (1881), physics</li>\n                            <li><strong>Concept:</strong> A system's current state depends on its history, not just current inputs.</li>\n                        </ul>\n                        <div class=\"bg-slate-50 dark:bg-slate-900 p-4 rounded mb-3 overflow-x-auto\">\n                            <Katex formula=\"S(t) = f(S(t-1), \\text{inputs})\" />\n                        </div>\n                        <p>\n                            Organisations display path-dependency: the sequence of past decisions constrains future options. This is why certain \"attractor basins\" (e.g., bureaucratic stagnation) are difficult to escape once entered.\n                        </p>\n```typescript\n// State depends on history\n// Once trapped in a basin, small fluctuations can't escape\nif (isInBasin && inputForce < escapeThreshold) {\n    this.state = \"TRAPPED\"; // Remains trapped even if force > 0\n} else {\n    this.state = \"flowing\";\n}\n```\n                    </div>\n\n                    <div>\n                        <h4>Energy Cost of Change</h4>\n                        <ul class=\"list-disc pl-5 space-y-1 mb-2\">\n                            <li><strong>Framework:</strong> Behavioral architecture / Nudge theory</li>\n                            <li><strong>Creators:</strong> Richard Thaler & Cass Sunstein (2008)</li>\n                        </ul>\n                        <div class=\"bg-slate-50 dark:bg-slate-900 p-4 rounded mb-3 overflow-x-auto\">\n                            <Katex formula=\"\\Delta E = E_v - E_s < 0\" />\n                        </div>\n                        <p>\n                            The goal of strategic design is to ensure <Katex formula=\"E_v\" inline /> (Energy Cost of Virtue) is lower than <Katex formula=\"E_s\" inline /> (Energy Cost of Sin). Make the \"right thing\" the path of least resistance.\n                        </p>\n```typescript\n// Strategic Design: Lowers energy cost of desired state\nclass Constructor {\n    update() {\n        // Create local energy well (Virtue)\n        grid[this.x][this.y] -= 0.5; \n        \n        // This makes Ev < Es (Virtue cheaper than Sin)\n    }\n}\n```\n                    </div>\n                </div>\n            </div>\n        </details>\n    </section>\n</div>"
      },
      {
        "id": "machine-bureaucracy",
        "type": "labs",
        "title": "Machine Bureaucracy",
        "description": "When hitting your rate target means breaking the rules, most people break the rules. A simulation of Goodhart’s Law in fulfilment centres.",
        "date": "2026-07-28T00:00:00.000Z",
        "category": null,
        "tags": null,
        "url": "https://ryansnowden.com/labs/machine-bureaucracy/",
        "content": "import MachineBureaucracySimulator from '../../components/simulations/MachineBureaucracySimulator.tsx';\nimport Accordion from '../../components/ui/Accordion.astro';\nimport DevOnly from '../../components/DevOnly.astro';\nimport Katex from '../../components/graphics/Katex.astro';\n\n<section class=\"not-prose quote py-2 md:py-3 px-4 max-w-xl mx-auto text-center mb-8 md:mb-10\">\n    <blockquote class=\"font-serif text-base md:text-lg text-slate-800 dark:text-slate-100 leading-snug border-none p-0 before:content-none after:content-none m-0\">\n        <span class=\"not-italic font-normal\">“比目中路析。”</span><br/>\n        <span class=\"text-sm md:text-base italic text-slate-600 dark:text-slate-400\">“Eyes once paired, but now parted midway.”</span>\n        <footer class=\"mt-2 text-[10px] md:text-xs not-italic font-sans text-slate-500 uppercase tracking-widest\">Pan Yue 潘岳 (247–300)</footer>\n    </blockquote>\n</section>\n\n<div class=\"breakout mt-6 mb-10\">\n  <MachineBureaucracySimulator fullWidth={true} client:load client:only=\"react\" />\n</div>\n\n<div class=\"p-4 bg-slate-100 dark:bg-slate-800 rounded-xl my-8\">\n  <h4 class=\"mt-0 mb-3 font-bold text-sm text-slate-800 dark:text-slate-200\">Changelog: 2026/08/01</h4>\n  <ul class=\"text-sm text-slate-700 dark:text-slate-300 m-0! pl-5 space-y-1.5 list-disc\">\n    <li><strong>Double division nightmare:</strong> Corrected inaccurate bin occupancy calculations.</li>\n    <li><strong>UX/UI adjustments:</strong> Cleaner interface, sidebars, metrics panel.</li>\n    <li><strong>Summary & Calculations:</strong>Detailed debug on the calcultions per rule/non-rule following stower.</li>\n    <li><strong>Culling the creep:</strong> Scrapped and simplified the stower state tracking logic.</li>\n    <li><strong>View optimisation:</strong> Fixed intersection observers so the simulation actually runs when scrolled into view.</li>\n    <li><strong>Pacing:</strong> Decoupled engine pacing from cart spawning.</li>\n    <li><strong>Dependencies:</strong> Untangled the <code class=\"text-xs\">RuleDistributionGraph</code> dependency from the sidebar.</li>\n    <li><strong>Metrics:</strong> Renamed overly vague labels (e.g., 'picker demand' to 'picker activity').</li>\n  </ul>\n  \n</div>\n<div class=\"p-4 bg-slate-100 dark:bg-slate-800 rounded-xl my-8\">\n   <h4 class=\"mt-0 mb-3 font-bold text-sm text-slate-800 dark:text-slate-200\">@TODO</h4>\n   \n   <ul class=\"text-sm text-slate-700 dark:text-slate-300 m-0! pl-5 space-y-1.5 list-disc\">\n   <li><strong>Picker penalties</strong>: Bring back penalties picker balance.</li>\n   <li><strong>Stower allocation</strong>: Fix methods, not interactive enough for me.</li>\n   <li><strong>Docs</strong>: Remove jargon, rewrite.</li>\n   <li><strong>tldr;</strong> Lots.</li>\n   </ul>\n   </div>\n\n\n<Accordion title=\"Stow Rate Drivers & Mechanics (Baseline Breakdown)\" open={true}>\n\nWhen analyzing stow rates, especially when worker fatigue, dynamic frictions, and floor penalties are disabled, throughput is determined by a precise mathematical model operating inside the simulation engine (`engine.ts` and `model.ts`).\n\n### 1. Rule Compliance (Rule-Followers vs. Rule-Breakers)\n\n* **Speed Multiplier**: A fully compliant stower (`expectedComplianceRate = 1.0`) takes **1.2x longer** per item (`speedMultiplier = 1.2`), representing a 20% duration penalty (+20% time spent aligning, verifying, and distributing items cleanly). A 100% shortcutting stower operates at baseline speed (`speedMultiplier = 1.0`).\n* **Bin Distribution**: Rule-following stowers cap placements at 4 items per bin before advancing down the aisle to find another open bin. Shortcut stowers dump entire cart totes into a single bin.\n* **Max Theoretical UPH (Per Stower)**:\n  * **Rule-Breaker (Shortcut)**: Up to **210 items/hour** per stower (17.14s physical base per item).\n  * **Rule-Follower (Compliant)**: Up to **175 items/hour** per stower (210 / 1.2).\n* **Compliance Drivers**: Rule-following rate is calculated dynamically from management **Rule Support** (+0.58), **Stow Target Pressure** (-0.32), and individual worker **Compliance Bias** (&plusmn;0.25).\n\n### 2. Inbound Freight & Cart Composition\n\n* **Cart Overhead Spreading**: Cart setup time is fixed per cart. Carts containing more items spread setup overhead over a larger unit count, increasing net items/hr (UPH).\n* **Library vs. Library Deep Mix**: Standard *Library* totes average 3–20 items per tote (with a 15% probability of 45-item batch spikes). *Library Deep* totes average only 1–3 items and incur a fixed deep-tote handling penalty (+1.92s per tote). Higher Library Mix raises overall UPH.\n\n### 3. Worker Skill Heterogeneity & Learning Curve\n\n* **Skill Variance Toggle**: By default, **Disable Worker Skill Variance** is set to `true` in the simulator sidebar, forcing all stowers to operate at an identical `1.0x` baseline skill factor.\n\n### 4. Deep Dive: How Stow Target Pressure is Calculated and Used\n\n**Stow Target Pressure (`stowPressure`)** is the operational tension metric that quantifies how strongly management speed quotas and floor congestion push stowers to sacrifice rule compliance for raw throughput.\n\n#### Calculation Formula (`model.ts`)\nInside `deriveOperationalState()`, `stowPressure` is calculated as a weighted sum clamped between 4% and 98% ([0.04, 0.98]):\n\n<div class=\"bg-slate-50 dark:bg-slate-900 p-4 rounded mb-3 overflow-x-auto breakout\">\n    <Katex formula=\"\\text{Stow Pressure} = \\operatorname{clamp}(0.16 + 0.22 \\times \\text{Slot Scarcity} + 0.18 \\times \\text{Storage Complexity},\\ 0.04,\\ 0.98)\" />\n</div>\n\n* **Baseline Tension (0.16)**: Minimum floor pressure under normal operating conditions.\n* **Slot Scarcity** (<Katex formula=\"+0.22 \\times \\text{slotScarcity}\" inline />): Floor capacity congestion (1 - `slotAvailability`) (overridden to 0 when `isolateStowProcess = true`).\n* **Storage Complexity** (<Katex formula=\"+0.18 \\times \\text{storageComplexity}\" inline />): Derived clutter combining bin messiness, overstuffed bins, and ASIN density.\n\n#### How Stow Target Pressure Drives System Behavior\n1. **Suppression of Rule Compliance**:\n   <div class=\"bg-slate-50 dark:bg-slate-900 p-4 rounded mb-3 overflow-x-auto breakout\">\n       <Katex formula=\"\\text{Rule Following Chance} = 0.42 + 0.58(\\text{Rule Support}) - 0.32(\\text{Stow Pressure}) - 0.16(\\text{Storage Complexity})\" />\n   </div>\n   Every 10% increase in Stow Target Pressure directly subtracts **3.2 percentage points** from a stower's compliance probability. When pressure exceeds Rule Support, workers switch from rule-following stows (1.2x duration) to shortcut stows (1.0x duration).\n\n### 5. Impact of Bin Fullness and Bin Complexity / Messiness on Stow Rate\n\nBoth **Bin Fullness** (fill ratio & capacity density) and **Bin Complexity / Messiness** directly impact the stow rate through three distinct behavioral and physical mechanisms:\n\n#### A. Target Bin Fullness (`fillRatio` & `physicalLoad`)\n* **Specific Bin Fill Penalty (`fillPenalty`)**: In `bin-model.ts`, as a target bin fills up, the engine calculates <Katex formula=\"\\text{fillPenalty} = (\\text{fillRatio})^{1.3} \\times 0.25\" inline />. As a bin approaches capacity, this subtracts up to **25 percentage points** directly from the stower's rule-following chance (`computeRuleFollowingChance`), forcing stowers to choose between missing rate or shortcut dumping.\n* **Floor-Wide Storage Complexity**: High average fullness increases `overstuffedBinShare` (+0.18 weight) and `averageAsinDensity` (+0.14 weight) in `storageComplexity`. This inflates Stow Target Pressure (+0.18) and depresses overall rule-following (-0.16).\n* **Slot Scarcity Penalty (When Frictions Enabled)**: High floor saturation (1 - `slotAvailability`) scales up physical cart travel time (`stowTravelMin`/`Max`) and multiplies item duration by `scarcityFrictionMultiplier`.\n\n#### B. Bin Complexity & Messiness (`messiness` & `nonNeatBinShare`)\n* **Messiness Penalty on Compliance**: In `bin-model.ts`, a target bin's messiness subtracts up to **18 percentage points** (<Katex formula=\"-\\text{messiness} \\times 0.18\" inline />) from `computeRuleFollowingChance`. Encounters with messy bins discourage stowers from attempting clean, organized slotting.\n* **Reorganization & Recount Duration Overhead**: In `estimateBinStowWork()`, placing items cleanly into a messy bin requires extra physical time:\n  * **Reorganization Time**: <Katex formula=\"+0.18\\text{s} + (\\text{messiness} \\times 0.32\\text{s})\" inline /> per placement.\n  * **Recount Time**: <Katex formula=\"+0.16\\text{s} + (\\text{recountNeed} \\times 0.34\\text{s})\" inline /> per placement.\n* **Floor Messiness Drag**: High floor-wide messiness increases `storageComplexity` via `averageBinMessiness` (+0.18 weight) and `nonNeatBinShare` (+0.10 weight).\n\n### Summary Breakdown Table (Fatigue & Frictions Disabled)\n\n| Factor | Parameter / Logic | Location in Code | Effect on Stow Rate |\n| :--- | :--- | :--- | :--- |\n| **Shortcut Stower** | `complianceRate = 0` | `engine.ts` | **Baseline Max Speed (1.0x duration)** — Max 210 UPH/stower |\n| **Compliant Stower** | `complianceRate = 1` | `engine.ts` | **20% Extra Duration (1.2x duration)** — Max 175 UPH/stower |\n| **Stow Target Pressure** | `stowTargetPerHour` | `model.ts` | Higher target bias increases Stow Pressure, driving workers to break rules |\n| **Rule Support** | `ruleSupport` (0–100%) | `model.ts` | Higher support increases compliance, trading ~16.7% speed for bin quality |\n| **Target Bin Fullness** | `fillRatio` | `bin-model.ts` | High fullness subtracts up to 25% from compliance chance |\n| **Bin Messiness** | `messiness` | `bin-model.ts` | High messiness subtracts up to 18% from compliance and adds +0.50s work duration |\n| **Library Mix** | `libraryMix` (0–100%) | `engine.ts` | Higher mix increases items per tote, raising net UPH |\n| **Disable Skill Variance** | `disableWorkerSkillVariance` | `worker-model.ts` | Defaults to `true`, forcing 1.0x baseline skill across all stowers |\n| **Picker Decoupling** | `isolateStowProcess` | `model.ts` | Defaults to `true`, decoupling stow rate from picker demand and scarcity |\n\n</Accordion>\n\n\n<Accordion title=\"Overview\" open={true}>\n\nThe term **Machine Bureaucracy** was coined by management theorist Henry Mintzberg in 1979 <sup><a href=\"#ref-13\">[13]</a></sup> to describe an organizational structure engineered to run like a clockwork mechanism. In Mintzberg's model, such organizations rely on highly standardized routine tasks, strict formal rules, centralized authority, and a prominent \"technostructure\"—analysts and managers who design, measure, and standardize work processes. At the time, Mintzberg noted that while machine bureaucracies excel at achieving consistency and efficiency in stable environments, they do so by treating operational workflows—and the humans executing them—as deterministic, interchangeable parts of a machine.\n\nThis simulation models the subtle mechanics of a non-robotic fulfilment centre and demonstrates how strict individual performance metrics reshape worker behavior. Rather than operating as a predictable clockwork machine, the warehouse behaves as a living system where worker fatigue, crowded bins, and the pressure to hit targets all adapt in real time to operational pressure.\n\nThis scenario is a real-world example of **Goodhart’s Law** — though most commonly remembered in anthropologist Marilyn Strathern’s popular phrasing (*“When a measure becomes a target, it ceases to be a good measure”*) <sup><a href=\"#ref-5\">[5]</a></sup> <sup><a href=\"#ref-6\">[6]</a></sup>.\n\n<section class=\"not-prose quote py-2 md:py-3 px-4 max-w-xl mx-auto text-center my-4\">\n    <blockquote class=\"font-serif text-base md:text-lg italic text-slate-800 dark:text-slate-100 leading-snug border-none p-0 before:content-none after:content-none m-0\">\n        “Any observed statistical regularity will tend to collapse once pressure is placed upon it for control purposes.”\n        <footer class=\"mt-2 text-[10px] md:text-xs not-italic font-sans text-slate-500 uppercase tracking-widest\">Charles Goodhart, 1975</footer>\n    </blockquote>\n</section>\n\nWhen workers (Stowers and Pickers) are evaluated primarily on raw speed (how many items they scan per hour), hitting that quota under tight conditions eventually requires bending placement rules. What emerges is not a moral failing or a lack of discipline among workers, but a direct structural outcome of how work is measured and managed <sup><a href=\"#ref-11\">[11]</a></sup>.\n\n### Mapping the Process\n\nBefore looking at how workers adapt to daily performance targets, it helps to understand how a warehouse operates as an end-to-end system. In operational engineering, a standard tool for mapping this is **SIPOC**, which stands for **Suppliers**, **Inputs**, **Process**, **Outputs**, and **Customers**.\n\nA SIPOC diagram lays out the entire lifecycle of an operation on a single page. It defines where materials come from, what resources are required, the major steps taken to transform those resources, and who receives the finished result.\n\n<div class=\"breakout my-8 overflow-x-auto\">\n  <div class=\"border border-slate-200 dark:border-slate-800 rounded-xl bg-slate-50/50 dark:bg-slate-900/50 p-4 md:p-6 min-w-195\">\n    <table class=\"w-full text-left border-collapse text-xs md:text-sm mt-0 mb-0\">\n      <thead>\n        <tr class=\"border-b border-slate-200 dark:border-slate-800 text-slate-500 dark:text-slate-400 font-bold uppercase tracking-wider\">\n          <th class=\"pb-3 pr-4 w-[18%]\">Suppliers 🚚</th>\n          <th class=\"pb-3 px-4 w-[20%]\">Inputs 📥</th>\n          <th class=\"pb-3 px-4 w-[28%]\">Process (High-Level Steps) ⚙️</th>\n          <th class=\"pb-3 px-4 w-[18%]\">Outputs 📤</th>\n          <th class=\"pb-3 pl-4 w-[16%]\">Customers 👤</th>\n        </tr>\n      </thead>\n      <tbody class=\"align-top divide-y divide-slate-200/60 dark:divide-slate-800/60 text-slate-700 dark:text-slate-300\">\n        <tr>\n          <td class=\"py-1 pr-1\">\n            <ul class=\"list-disc pl-4 space-y-1.5 my-0!\">\n              <li>Inbound Freight Carriers & Vendors</li>\n              <li>Order Management System</li>\n              <li>Packaging Suppliers</li>\n              <li>Warehouse Control Systems</li>\n            </ul>\n          </td>\n          <td class=\"py-4 px-4\">\n            <ul class=\"list-disc pl-4 space-y-1.5 my-0!\">\n              <li>Bulk inventory & master cartons</li>\n              <li>Real-time item retrieval requests</li>\n              <li>Scanner pick lists & walk paths</li>\n              <li>Boxes, mailers, tape & dunnage</li>\n              <li>Weight & sizing parameters</li>\n            </ul>\n          </td>\n          <td class=\"py-4 px-4\">\n            <ol class=\"list-none p-0 my-0! text-xs md:text-sm\">\n              <li class=\"py-0.5\">\n                <strong>1. Inbound Decant/Receive:</strong> Unpack bulk supplier shipments from pallets into open totes.\n              </li>\n              <li class=\"p-2.5 rounded-lg border border-indigo-200 dark:border-indigo-800/60 bg-indigo-50/70 dark:bg-indigo-950/40 mb-2!\">\n                <strong class=\"block text-slate-900 dark:text-slate-100 mb-0.5\">2. Stow</strong>\n                <p class=\"my-0! text-xs text-slate-600 dark:text-slate-400\">Carry totes into mezzanine shelving and stow items into storage bins via hand scanners.</p>\n              </li>\n              <li class=\"p-2.5 rounded-lg border border-indigo-200 dark:border-indigo-800/60 bg-indigo-50/70 dark:bg-indigo-950/40 my-0\">\n                <strong class=\"block text-slate-900 dark:text-slate-100 mb-0.5\">3. Item Picking & Retrieval</strong>\n                <p class=\"my-0! text-xs text-slate-600 dark:text-slate-400\">Follow scanner walk paths through aisles to retrieve items into totes.</p>\n              </li>\n              <li class=\"py-0.5\">\n                <strong>4. Rebin & Wall Sorting:</strong> Convey totes to Put Walls where workers sort items for shipping.\n              </li>\n              <li class=\"py-0.5\">\n                <strong>5. Packing & Inspection:</strong> Pack items into recommended boxes, insert protective dunnage, and seal.\n              </li>\n              <li class=\"py-0.5\">\n                <strong>6. Automated SLAM:</strong> Weigh parcels automatically on a high-speed line and stamp shipping labels.\n              </li>\n              <li class=\"py-0.5\">\n                <strong>7. Fluid Loading:</strong> Direct parcels down dock spurs and stack directly into outbound trailers.\n              </li>\n            </ol>\n          </td>\n          <td class=\"py-4 px-4\">\n            <ul class=\"list-disc pl-4 space-y-1.5 m-0\">\n              <li>Weight-verified, sealed parcels</li>\n              <li>Electronic shipping manifests & BOL</li>\n              <li>Real-time inventory balance updates</li>\n              <li>Exception & problem-solve totes</li>\n            </ul>\n          </td>\n          <td class=\"py-4 pl-4\">\n            <ul class=\"list-disc pl-4 space-y-1.5 m-0\">\n              <li>Online End Customers</li>\n              <li>Sortation & Delivery Hubs</li>\n              <li>Logistics & Carrier Partners</li>\n              <li>Support & Audit Teams</li>\n            </ul>\n          </td>\n        </tr>\n      </tbody>\n    </table>\n  </div>\n</div>\n\n#### Where this Simulation Fits\n\nA traditional manual fulfilment center runs on a multi-stage pipeline: incoming shipments are unpacked into totes (Decant), placed into aisle shelving bins (Static Stow), picked for fulfillment (Item Picking), sorted into order cubbies (Rebin), packed into shipping boxes (Pack), weighed and labeled automatically (SLAM), and finally loaded into delivery trucks (Fluid Loading).\n\nThis simulation intentionally isolates a specific part of that chain: **the handoff between Static Stow and Item Picking**. \n\n#### Why the Stow–Pick Handoff Matters\n\nIn a manual warehouse, Stowers and Pickers work in the exact same physical storage bins, but at different times:\n\n- **Stowers** load incoming items into open shelving bins.\n- **Pickers** walk those same aisles hours or days later to retrieve items from storage bins.\n\nBoth roles are managed under strict hourly rate targets (units processed per hour). When a Stower comes under pressure to hit their target in a crowded warehouse, the fastest way to keep moving is to bend placement rules—such as shoving an item into an overfilled bin or ignoring item size guidelines. \n\nThe Stower meets their quota for the hour, but leaves behind a messy, disorganized bin. Later, when a Picker arrives at that bin under their own quota clock, they lose valuable minutes digging through the mess to find the right item. The time saved during Stow becomes an immediate delay and point of frustration during Pick. \n\nBy focusing on this Stow–Pick relationship, the simulation demonstrates how isolated performance metrics can cause one team's speed to create hidden work and friction for another.\n\n</Accordion>\n\n<Accordion title=\"The Simulation Elements\" open={true}>\n\nThe simulation interface brings together several real-time feeds to help you monitor how systemic pressure flows across the warehouse floor:\n\n**Controls & Sidebar**  \nYou can adjust the **Stow Target** and **Pick Target** rates via the **Advanced controls** tab in the left sidebar. You can also grant **Rule support** (giving workers organizational backing to prioritize placement accuracy over raw speed) or adjust **Picker demand** to test how quickly downstream picking activity stress-tests earlier placement decisions.\n\n**Floor Canvas & Heatmap**  \n- **Visual Canvas**: The canvas abstracts the warehouse into a continuous flow of work. Items move through a cycle across four stages (Buffer → Stow → Bin → Pick). The **Stow cycle (Blue)** tracks inbound placement, while the **Pick cycle (Orange)** tracks outbound retrieval. \n- **Bin Complexity Heatmap**: Positioned directly beneath the canvas, this interactive grid visualizes bin fullness and messiness in real time. Clicking any bin reveals its specific item history and event log.\n\n**Metrics & System Efficiency**  \nThe dashboard below the heatmap provides four distinct views into the systemic health of the warehouse:\n- **Throughput (Main Graph):** Watch how the Stow rate (adding items) and Pick rate (retrieving items) interact. When Stowers take shortcuts to hit their target, you will see the Pick rate eventually crash as they encounter the resulting mess.\n- **Rule Distribution:** This shows the direct trade-off workers face. As the Stow Target increases or bins become crowded, watch the distribution shift from compliant placements (green) to shortcut, rule-breaking stows (amber).\n- **Availability:** A real-time view of warehouse capacity. As the floor fills up, the friction of finding a legal bin increases exponentially.\n- **Fatigue:** Worker exhaustion compounds all other frictions. As the shift progresses, the baseline speed drops, making it even harder to hit targets without resorting to shortcuts.\n\n</Accordion>\n\n<Accordion title=\"How the System Breaks Down (The Feedback Loop)\" open={true}>\n\nThe shift unfolds through a continuous, compounding feedback loop:\n\n1. **Targets set the expectations.** Managers establish hourly stow and pick targets. When rule support is low, workers feel immediate pressure to hit their numbers above all else.\n2. **Pressure mounts as space tightens.** As storage bins fill up, finding a legal, neat home for an item takes longer. Because hourly targets remain fixed regardless of bin congestion, workers experience rising mental friction as they try to solve the puzzle of where each item legally fits <sup><a href=\"#ref-3\">[3]</a></sup>.\n3. **Shortcuts become necessary for survival.** Faced with a choice between losing their jobs for failing rate or bending placement rules, workers naturally take shortcuts <sup><a href=\"#ref-4\">[4]</a></sup>. This illustrates a classic human trade-off: the penalty for missing a target is immediate and personal, whereas the headache of a messy bin is delayed and lands on someone else <sup><a href=\"#ref-11\">[11]</a></sup>.\n4. **Bins degrade and picks slow down.** Shortcut stows create messy, overfilled bins. When downstream pickers arrive to retrieve items, they face longer searches, higher error rates, and increased delays and frustration. The stow team’s speed directly becomes the pick team’s delay.\n5. **System capacity is tested.** If problem-solving capacity is overwhelmed, exceptions accumulate, bin hygiene collapses, and the entire operational flow degrades.\n\n### What moves on screen\n\nThe canvas abstracts the work into a continuous flow of packets. Items begin in the inbound buffer before being processed by the active stow team. Each placement decision (whether compliant and neat, or a rushed shortcut) is recorded in the bins. Downstream, the active pick team pulls items from these same bins to fulfill customer demand. The speed of the blue stow loop directly impacts the health of the orange pick loop.\n\n### Placement rules\n\nItems must match designated bin dimensions (standard height vs taller deep bins) enforced by hand scanners. Each bin has a physical working limit. While compliant stows maintain organized stacks, shortcut stows leave a mess that persists until a picker encounters it and is forced to spend extra time digging it out.\n\n</Accordion>\n\n<Accordion title=\"Scenarios\" open={true}>\n\nYou can explore different shift conditions using the scenario selector in the sidebar:\n\n<div class=\"space-y-6 my-6\">\n    <div class=\"bg-white dark:bg-slate-900 border-2 border-slate-200 dark:border-slate-800 rounded-xl p-6 py-4 mb-4\">\n        <h4 class=\"mt-0 mb-2 font-bold text-base\">Orderly floor</h4>\n        <p class=\"my-0! text-sm text-slate-600 dark:text-slate-400\">Bins are lightly stocked with plenty of clean, available space. Stowers face no conflict between accuracy and speed, allowing hourly targets to be met comfortably without taking shortcuts.</p>\n    </div>\n\n    <div class=\"bg-white dark:bg-slate-900 border-2 border-slate-200 dark:border-slate-800 rounded-xl p-6 py-4 mb-4\">\n        <h4 class=\"mt-0 mb-2 font-bold text-base\">Getting crowded</h4>\n        <p class=\"my-0! text-sm text-slate-600 dark:text-slate-400\">Bins approach working limits. While the floor appears controlled on paper, the margin for error is thin. Finding correct placements takes longer, forcing workers to choose between speed and compliance.</p>\n    </div>\n\n    <div class=\"bg-white dark:bg-slate-900 border-2 border-slate-200 dark:border-slate-800 rounded-xl p-6 py-4 mb-4\">\n        <h4 class=\"mt-0 mb-2 font-bold text-base\">Rushing and messy</h4>\n        <p class=\"my-0! text-sm text-slate-600 dark:text-slate-400\">High target pressure combined with crowded bins leads to visual disorganization. Workers prioritize job security over bin hygiene, causing shortcut stows to proliferate rapidly <sup><a href=\"#ref-4\">[4]</a></sup>.</p>\n    </div>\n\n    <div class=\"bg-white dark:bg-slate-900 border-2 border-slate-200 dark:border-slate-800 rounded-xl p-6 py-4 mb-4\">\n        <h4 class=\"mt-0 mb-2 font-bold text-base\">Packed and struggling</h4>\n        <p class=\"my-0! text-sm text-slate-600 dark:text-slate-400\">Storage space is severely constrained. Every placement inherits past shortcuts, creating severe pick drag. Psychological safety vanishes as workers recognize systemic failure but avoid raising issues due to surveillance pressure <sup><a href=\"#ref-7\">[7]</a></sup> <sup><a href=\"#ref-8\">[8]</a></sup>.</p>\n    </div>\n</div>\n\n</Accordion>\n\n<Accordion title=\"The Mathematical Foundation\" open={false}>\n\nThe simulation calculates key operational dynamics at every tick to model how floor pressure influences compliance <sup><a href=\"#ref-5\">[5]</a></sup> <sup><a href=\"#ref-6\">[6]</a></sup>.\n\n<div class=\"space-y-8 mt-6\">\n    <div>\n        <h4 class=\"mb-2 font-semibold\">1. Storage complexity</h4>\n        <p class=\"text-sm text-slate-600 dark:text-slate-400 mb-2\">Storage complexity quantifies how difficult it is for a stower to find an open, legal home for an item. As slot scarcity and bin messiness rise, complexity increases non-linearly.</p>\n        <div class=\"bg-slate-50 dark:bg-slate-900 p-4 rounded mb-3 overflow-x-auto\">\n            <Katex formula=\"\\text{Complexity} \\propto \\text{Deep Share} + \\text{Scarcity} + \\text{Messiness} + \\text{Non-Neat Bins} + \\text{Count Difficulty} + \\text{Pick Target Bias}\" />\n        </div>\n```typescript\n// Weighted floor-condition friction - model.ts:deriveOperationalState\nconst storageComplexity = clamp(\n    0.12 +\n    libraryDeepShare * 0.16 +\n    slotScarcity * 0.32 +\n    averageBinMessiness * 0.24 +\n    nonNeatBinShare * 0.16 +\n    countingDifficulty * 0.12 +\n    Math.max(0, pickerTargetBias) * 0.08,\n    0.04, 0.98\n);\n```\n    </div>\n\n    <div>\n        <h4 class=\"mb-2 font-semibold\">2. Stow pressure</h4>\n        <p class=\"text-sm text-slate-600 dark:text-slate-400 mb-2\">Stow pressure represents the psychological drive to take shortcuts when hourly rate targets exceed realistic floor capacity.</p>\n        <div class=\"bg-slate-50 dark:bg-slate-900 p-4 rounded mb-3 overflow-x-auto breakout\">\n            <Katex formula=\"\\text{Pressure} \\propto \\text{Stow Target} + \\text{Demand} + \\text{Scarcity} + \\text{Complexity} + \\text{Non-Neat Bins} + \\text{Count Difficulty}\" />\n        </div>\n```typescript\n// What pushes workers toward shortcuts - model.ts:deriveOperationalState\nconst stowPressure = clamp(\n    0.16 +\n    Math.max(0, stowTargetBias) * 0.42 +\n    pickerDemand * 0.16 +\n    slotScarcity * 0.22 +\n    storageComplexity * 0.18 +\n    nonNeatBinShare * 0.1 +\n    countingDifficulty * 0.08,\n    0.04, 0.98\n);\n```\n    </div>\n\n    <div>\n        <h4 class=\"mb-2 font-semibold\">3. Rule-following rate</h4>\n        <p class=\"text-sm text-slate-600 dark:text-slate-400 mb-2\">The probability that a stower follows proper placement procedures. Organizational rule support serves as the strongest positive factor counteracting rate pressure.</p>\n        <div class=\"bg-slate-50 dark:bg-slate-900 p-4 rounded mb-3 overflow-x-auto breakout\">\n            <Katex formula=\"\\text{Rule Following} \\propto \\text{Support} - \\text{Pressure} - \\text{Complexity} - \\text{Scarcity} - \\text{Pick Target Bias}\" />\n        </div>\n```typescript\n// Probability a stower follows placement rules - model.ts:deriveOperationalState\nconst ruleFollowingRate = clamp(\n    0.42 +\n    ruleSupport * 0.58 -\n    stowPressure * 0.32 -\n    storageComplexity * 0.16 -\n    slotScarcity * 0.12 -\n    Math.max(0, pickerTargetBias) * 0.08,\n    0.05, 0.98\n);\n```\n    </div>\n\n    <div>\n        <h4 class=\"mb-2 font-semibold\">4. Process Efficiency & Waste</h4>\n        <p class=\"text-sm text-slate-600 dark:text-slate-400 mb-2\">Process Efficiency tracks the percentage of total operational work that is value-add (compliant stows and clean picks) versus non-value-add rework generated by shortcut stows and search drag.</p>\n```typescript\n// Process Efficiency - model.ts:computeMetricSnapshot\nconst wasteRate = casesProcessed === 0\n    ? 0\n    : clamp(ruleBreakingRate * 0.5 + nonNeatBinShare * 30 + (100 - Math.min(100, pickerKpi)) * 0.2, 0, 100);\nconst processEfficiency = clamp(100 - wasteRate, 0, 100);\n```\n    </div>\n</div>\n\n</Accordion>\n\n<Accordion title=\"The Takeaway\" open={true}>\n\nThe dynamics observed in this simulation extend far beyond physical warehouses. Any operational environment where one team's speed creates uncounted rework for another exhibits the exact same failure modes.\n\n- **Siloed targets encourage passing the buck.** When teams are judged solely on isolated speed metrics, the rational choice is to hit your individual target while pushing the headache onto the next person in line <sup><a href=\"#ref-5\">[5]</a></sup>.\n- **Psychological safety enables early correction.** When workers are empowered to flag bottlenecks without fear of missing targets, the system self-corrects. When fear dominates, defects compound silently <sup><a href=\"#ref-7\">[7]</a></sup>.\n- **Systemic handoff design is the true solution.** The remedy is not stricter surveillance or heavier discipline, but designing measurement systems that treat stow and pick as a single integrated value stream <sup><a href=\"#ref-9\">[9]</a></sup>.\n\nThe central question for leaders is not *\"How do we force workers to follow rules?\"* but rather *\"Why does our system design make rule-following irrational?\"* <sup><a href=\"#ref-12\">[12]</a></sup>\n\n</Accordion>\n\n<Accordion title=\"References\" open={true}>\n\n<ul class=\"not-prose m-0 list-none space-y-5 border-l-2 border-indigo-200/70 p-0 pl-4 dark:border-indigo-900/60\">\n  <li id=\"ref-1\" class=\"scroll-mt-24\">\n    <span class=\"mb-1 block font-medium text-slate-500 dark:text-slate-400\">[1]</span>\n    <p class=\"m-0 text-sm leading-relaxed text-slate-700 dark:text-slate-300\">\n      Amazon, \"Inside Amazon's fulfillment centers: What you can expect to see on a warehouse tour,\" <em>About Amazon</em>, 11 Mar. 2019.\n      <a class=\"ml-1 text-indigo-600 underline decoration-indigo-300 underline-offset-2 hover:text-indigo-500 dark:text-indigo-400 dark:decoration-indigo-600 dark:hover:text-indigo-300\" href=\"https://www.aboutamazon.com/news/operations/inside-amazons-fulfillment-centers-what-you-can-expect-to-see-on-a-warehouse-tour\" target=\"_blank\" rel=\"noopener noreferrer\">aboutamazon.com</a>\n    </p>\n  </li>\n  <li id=\"ref-2\" class=\"scroll-mt-24\">\n    <span class=\"mb-1 block font-medium text-slate-500 dark:text-slate-400\">[2]</span>\n    <p class=\"m-0 text-sm leading-relaxed text-slate-700 dark:text-slate-300\">\n      Amazon Technologies, Inc., \"System and method for stow management of similar items,\" U.S. Patent US8341040B1, 1 Jan. 2013.\n      <a class=\"ml-1 text-indigo-600 underline decoration-indigo-300 underline-offset-2 hover:text-indigo-500 dark:text-indigo-400 dark:decoration-indigo-600 dark:hover:text-indigo-300\" href=\"https://patents.google.com/patent/US8341040B1/en\" target=\"_blank\" rel=\"noopener noreferrer\">patents.google.com</a>\n    </p>\n  </li>\n  <li id=\"ref-3\" class=\"scroll-mt-24\">\n    <span class=\"mb-1 block font-medium text-slate-500 dark:text-slate-400\">[3]</span>\n    <p class=\"m-0 text-sm leading-relaxed text-slate-700 dark:text-slate-300\">\n      A. Delfanti, \"Machinic dispossession and augmented despotism: Digital work in an Amazon warehouse,\" <em>New Media &amp; Society</em>, vol. 23, no. 1, pp. 39-55, 2021.\n    </p>\n  </li>\n  <li id=\"ref-4\" class=\"scroll-mt-24\">\n    <span class=\"mb-1 block font-medium text-slate-500 dark:text-slate-400\">[4]</span>\n    <p class=\"m-0 text-sm leading-relaxed text-slate-700 dark:text-slate-300\">\n      E. J. Cheon and I. Erickson, \"Fulfillment of the work games: Warehouse workers' experiences with algorithmic management,\" <em>Proc. ACM Hum.-Comput. Interact.</em>, vol. 9, no. CSCW, Art. no. 228, 2025.\n    </p>\n  </li>\n  <li id=\"ref-5\" class=\"scroll-mt-24\">\n    <span class=\"mb-1 block font-medium text-slate-500 dark:text-slate-400\">[5]</span>\n    <p class=\"m-0 text-sm leading-relaxed text-slate-700 dark:text-slate-300\">\n      R. Mannion and J. Braithwaite, \"When a measure becomes a target, it ceases to be a good measure,\" <em>BMJ Quality &amp; Safety</em>, vol. 30, no. 3, pp. 263-267, 2021.\n    </p>\n  </li>\n  <li id=\"ref-6\" class=\"scroll-mt-24\">\n    <span class=\"mb-1 block font-medium text-slate-500 dark:text-slate-400\">[6]</span>\n    <p class=\"m-0 text-sm leading-relaxed text-slate-700 dark:text-slate-300\">\n      J. W. Treem, P. M. Leonardi, and B. van den Hooff, \"Coping with Goodhart's law in an era of digitisation and datafication,\" <em>Journal of Computer-Mediated Communication</em>, vol. 28, no. 4, 2023.\n    </p>\n  </li>\n  <li id=\"ref-7\" class=\"scroll-mt-24\">\n    <span class=\"mb-1 block font-medium text-slate-500 dark:text-slate-400\">[7]</span>\n    <p class=\"m-0 text-sm leading-relaxed text-slate-700 dark:text-slate-300\">\n      A. C. Edmondson, \"Psychological safety and learning behavior in work teams,\" <em>Administrative Science Quarterly</em>, vol. 44, no. 2, pp. 350-383, 1999.\n    </p>\n  </li>\n  <li id=\"ref-8\" class=\"scroll-mt-24\">\n    <span class=\"mb-1 block font-medium text-slate-500 dark:text-slate-400\">[8]</span>\n    <p class=\"m-0 text-sm leading-relaxed text-slate-700 dark:text-slate-300\">\n      S. Kim, S. B. Choi, and K. Kim, \"The influence of corporate social responsibility on safety behavior: The mediating role of psychological safety and organizational commitment,\" <em>Frontiers in Public Health</em>, vol. 10, 2022.\n    </p>\n  </li>\n  <li id=\"ref-9\" class=\"scroll-mt-24\">\n    <span class=\"mb-1 block font-medium text-slate-500 dark:text-slate-400\">[9]</span>\n    <p class=\"m-0 text-sm leading-relaxed text-slate-700 dark:text-slate-300\">\n      W. Qian, J. Horisch, and S. Schaltegger, \"Using a balanced scorecard to manage corporate social responsibility,\" <em>International Journal of Management Reviews</em>, vol. 22, no. 2, pp. 185-208, 2019.\n    </p>\n  </li>\n  <li id=\"ref-10\" class=\"scroll-mt-24\">\n    <span class=\"mb-1 block font-medium text-slate-500 dark:text-slate-400\">[10]</span>\n    <p class=\"m-0 text-sm leading-relaxed text-slate-700 dark:text-slate-300\">\n      R. S. Kaplan and D. P. Norton, <em>The Balanced Scorecard: Translating Strategy into Action</em>. Boston, MA, USA: Harvard Business School Press, 1996.\n    </p>\n  </li>\n  <li id=\"ref-11\" class=\"scroll-mt-24\">\n    <span class=\"mb-1 block font-medium text-slate-500 dark:text-slate-400\">[11]</span>\n    <p class=\"m-0 text-sm leading-relaxed text-slate-700 dark:text-slate-300\">\n      A. Kohn, <em>Punished by Rewards: The Trouble with Gold Stars, Incentive Plans, A's, Praise, and Other Bribes</em>, 25th anniversary ed. Boston, MA, USA: Houghton Mifflin Harcourt, 2018.\n    </p>\n  </li>\n  <li id=\"ref-12\" class=\"scroll-mt-24\">\n    <span class=\"mb-1 block font-medium text-slate-500 dark:text-slate-400\">[12]</span>\n    <p class=\"m-0 text-sm leading-relaxed text-slate-700 dark:text-slate-300\">\n      T. M. Jones, \"Ethical decision making by individuals in organizations: An issue-contingent model,\" <em>Academy of Management Review</em>, vol. 16, no. 2, pp. 366-395, 1991.\n    </p>\n  </li>\n  <li id=\"ref-13\" class=\"scroll-mt-24\">\n    <span class=\"mb-1 block font-medium text-slate-500 dark:text-slate-400\">[13]</span>\n    <p class=\"m-0 text-sm leading-relaxed text-slate-700 dark:text-slate-300\">\n      H. Mintzberg, <em>The Structuring of Organizations: A Synthesis of the Research</em>. Englewood Cliffs, NJ: Prentice-Hall, 1979. (See also H. Mintzberg, \"Structure in 5's: Designing Effective Organizations,\" <em>Management Science</em>, vol. 26, no. 3, pp. 322-341, 1980).\n      <a class=\"ml-1 text-indigo-600 underline decoration-indigo-300 underline-offset-2 hover:text-indigo-500 dark:text-indigo-400 dark:decoration-indigo-600 dark:hover:text-indigo-300\" href=\"https://doi.org/10.1287/mnsc.26.3.322\" target=\"_blank\" rel=\"noopener noreferrer\">doi.org/10.1287/mnsc.26.3.322</a>\n    </p>\n  </li>\n</ul>\n\n</Accordion>"
      },
      {
        "id": "modelling-complex-systems",
        "type": "labs",
        "title": "Modelling Complex Systems",
        "description": "Watch what happens when you push a system too hard. A simulation exploring how pressure, cognitive load, and psychological safety interact.",
        "date": "2025-12-21T00:00:00.000Z",
        "category": null,
        "tags": null,
        "url": "https://ryansnowden.com/labs/modelling-complex-systems/",
        "content": "import ModellingComplexSystems from '../../components/simulations/ModellingComplexSystems.astro';\nimport Katex from '../../components/graphics/Katex.astro';\nimport ScenarioCard from '../../components/ui/ScenarioCard.astro';\n\n<div class=\"breakout\">\n    <ModellingComplexSystems fullWidth={true} />\n</div>\n\n<details class=\"my-6 p-3 bg-transparent border-2 border-slate-200 dark:border-slate-800 rounded-xl\">\n    <summary class=\"cursor-pointer font-medium text-slate-500 dark:text-slate-400 flex items-center gap-2 list-none text-xs\">\n        <span class=\"uppercase tracking-wider\">Built With</span>\n        <svg class=\"w-3 h-3 transition-transform details-chevron\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n            <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n        </svg>\n    </summary>\n    <div class=\"mt-3 grid grid-cols-2 md:grid-cols-3 gap-2\">\n        <div class=\"p-2 bg-transparent rounded-lg border-2 border-slate-200 dark:border-slate-800\">\n            <div class=\"text-[10px] uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-0.5\">Language</div>\n            <div class=\"text-xs font-medium text-slate-700 dark:text-slate-200\">TypeScript</div>\n        </div>\n        <div class=\"p-2 bg-transparent rounded-lg border-2 border-slate-200 dark:border-slate-800\">\n            <div class=\"text-[10px] uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-0.5\">Framework</div>\n            <div class=\"text-xs font-medium text-slate-700 dark:text-slate-200\">React</div>\n        </div>\n        <div class=\"p-2 bg-transparent rounded-lg border-2 border-slate-200 dark:border-slate-800\">\n            <div class=\"text-[10px] uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-0.5\">Rendering</div>\n            <div class=\"text-xs font-medium text-slate-700 dark:text-slate-200\">Canvas API</div>\n        </div>\n        <div class=\"p-2 bg-transparent rounded-lg border-2 border-slate-200 dark:border-slate-800\">\n            <div class=\"text-[10px] uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-0.5\">Icons</div>\n            <div class=\"text-xs font-medium text-slate-700 dark:text-slate-200\">Lucide React</div>\n        </div>\n        <div class=\"p-2 bg-transparent rounded-lg border-2 border-slate-200 dark:border-slate-800\">\n            <div class=\"text-[10px] uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-0.5\">Math Rendering</div>\n            <div class=\"text-xs font-medium text-slate-700 dark:text-slate-200\">KaTeX</div>\n        </div>\n        <div class=\"p-2 bg-transparent rounded-lg border-2 border-slate-200 dark:border-slate-800\">\n            <div class=\"text-[10px] uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-0.5\">Static Site</div>\n            <div class=\"text-xs font-medium text-slate-700 dark:text-slate-200\">Astro</div>\n        </div>\n    </div>\n</details>\n\n<details open class=\"group mb-8\">\n    <summary class=\"cursor-pointer list-none select-none\">\n        <div class=\"flex items-center gap-2\">\n            <svg class=\"w-5 h-5 transition-transform group-open:rotate-180\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n            </svg>\n            <h3 class=\"m-0!\">Overview</h3>\n        </div>\n    </summary>\n    <div class=\"mt-4\">\n        When an organisation grows, work doesn't just slow down — it breaks in unexpected ways. This simulation models how errors, miscommunication, and delays spread across teams.\n\n        Instead of treating work as simple tasks on a board, it shows what happens when human factors — like **cognitive overload**, **fear of speaking up**, and **unnecessary sign-offs** — collide with heavy workload.\n    </div>\n</details>\n\n<details class=\"group mb-8\">\n    <summary class=\"cursor-pointer list-none select-none\">\n        <div class=\"flex items-center gap-2\">\n            <svg class=\"w-5 h-5 transition-transform group-open:rotate-180\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n            </svg>\n            <h3 class=\"m-0!\">tl;dr Quick Explanation</h3>\n        </div>\n    </summary>\n    <div class=\"mt-4\">\n\n        #### Bureaucracy (Ford Model)\n\n        The default scenario. Small squares (process gates) represent blockages like paperwork or approval steps. An abundance of stoppages slows the system, turning work (blue dots) to blocked (red).\n\n        Adjusting work volume and environment noise can find equilibrium, but throughput remains limited. The solution is reducing blockages.\n\n        #### Ideal Flow (Tesla Model)\n        \n        Demonstrates the impact of load. Maximising work volume causes team rings to turn yellow then red, overflowing at an increasing rate. This causes system stutter (Shannon Entropy) and contributes to Little's Law, slowing the system further, mirroring real organisational dynamics.\n\n\n    </div>\n</details>\n\n<div class=\"space-y-12 my-12\">\n    <section>\n        <details class=\"group\">\n            <summary class=\"cursor-pointer list-none select-none\">\n                <div class=\"flex items-center gap-2\">\n                    <svg class=\"w-5 h-5 transition-transform group-open:rotate-180\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                        <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n                    </svg>\n                    <h3 class=\"m-0!\">Scientific Basis & Mathematical Laws</h3>\n                </div>\n            </summary>\n            <div class=\"mt-4\">\n                <p class=\"mb-6\">\n                    Core scientific principles:\n                </p>\n\n                <div class=\"space-y-8\">\n                    <div>\n                        <h4 class=\"font-semibold mb-2\">Kingman's Formula (Queuing Theory)</h4>\n                        <ul class=\"list-disc pl-5 space-y-1 mb-2\">\n                            <li><strong>Origin:</strong> John Kingman, 1961.</li>\n                            <li><strong>Concept:</strong> Wait time (Wq) does not increase linearly with utilisation (ρ); it increases exponentially as utilisation approaches 100%.</li>\n                        </ul>\n                        <div class=\"bg-slate-50 dark:bg-slate-900 p-4 rounded mb-3 overflow-x-auto\">\n                            <Katex formula=\"E[W_q] \\approx \\left( \\frac{\\rho}{1-\\rho} \\right) \\tau \\left( \\frac{c_a^2 + c_s^2}{2} \\right)\" />\n                        </div>\n```typescript\n// Calculate utilisation (capped at 99% to prevent infinite wait times)\nconst utilisation = Math.min(0.99, this.cognitiveLoad / 100);\n\n// Apply cubic decay to processing speed as utilisation approaches 100%\n// This approximates the sharp \"hockey stick\" curve of Kingman's Formula\nthis.processingSpeedMod = 1.0 - Math.pow(utilisation, 3);\n```\n                        <p>\n                            <strong>In Simulation:</strong> Nodes have a <strong>Cognitive Load</strong> capacity. As a node's load exceeds 80%, its processing speed drops according to a cubic decay curve <Katex formula=\"(1-\\rho^3)\" inline />. This visually demonstrates why \"busy\" teams suddenly gridlock.\n                        </p>\n                    </div>\n\n                    <div>\n                        <h4 class=\"font-semibold mb-2\">Little's Law</h4>\n                        <ul class=\"list-disc pl-5 space-y-1 mb-2\">\n                            <li><strong>Origin:</strong> John Little, 1954.</li>\n                            <li>\n                                <strong>Concept:</strong> The long-term average number of items in a stable system (L) is equal to the long-term average effective arrival rate (λ) multiplied by the average time an item spends in the system (W).\n                            </li>\n                        </ul>\n                        <div class=\"bg-slate-50 dark:bg-slate-900 p-4 rounded mb-3 overflow-x-auto\">\n                            <Katex formula=\"L = \\lambda W\" />\n                        </div>\n                        <p>\n                            <strong>In Simulation:</strong> The <strong>WIP</strong> (Work In Progress) metric tracks L. Users can observe that increasing Frequency (λ) without increasing node speed results in an explosion of Lead Time (W), which is similar to a traffic jam forming when cars enter a highway faster than they exit.\n                        </p>\n```typescript\n// L (WIP) = λ (Arrival Rate) * W (Lead Time)\n// In simulation, we track L directly as the number of active items\nconst L = workItems.length;\n\n// Lead time (W) accumulates as items wait in queues\nif (blocked) {\n    this.timeWaiting++;\n} else {\n    this.timeActive++;\n}\n```\n                    </div>\n\n                    <div>\n                        <h4 class=\"font-semibold mb-2\">Brooks' Law</h4>\n                        <ul class=\"list-disc pl-5 space-y-1 mb-2\">\n                            <li><strong>Origin:</strong> Fred Brooks, <em>The Mythical Man-Month</em>, 1975.</li>\n                            <li><strong>Concept:</strong> \"Adding manpower to a late software project makes it later.\" This is due to the combinatorial explosion of communication channels, calculated as <Katex formula=\"\\frac{N(N-1)}{2}\" inline />.</li>\n                        </ul>\n                        <p>\n                            <strong>In Simulation:</strong> The <strong>Coordination Penalty</strong> increases automatically as you add Value Units (nodes). This adds a global \"noise\" factor to the system, simulating the friction of alignment in larger groups.\n                        </p>\n```typescript\n// Metcalfe's Law / Brooks' Law derivative\n// Coordination Penalty ∝ N(N-1)/2\nconst pairs = (nodeCount * (nodeCount - 1)) / 2;\nconst penalty = pairs * 0.0015;\n\n// Applied as 'noise' to every action\nconst totalNoise = config.noiseLevel + penalty;\n```\n                    </div>\n\n                    <div>\n                        <h4 class=\"font-semibold mb-2\">Shannon Entropy (Information Theory)</h4>\n                        <ul class=\"list-disc pl-5 space-y-1 mb-2\">\n                            <li><strong>Origin:</strong> Claude Shannon, 1948.</li>\n                            <li><strong>Concept:</strong> Entropy measures the level of uncertainty or disorder in a system.</li>\n                        </ul>\n                        <p>\n                            <strong>In Simulation:</strong> The <strong>System Entropy</strong> metric analyses the spatial distribution of work items. Low entropy indicates structured, predictable pulses of work. High entropy indicates scattered, unpredictable jitter, which is a hallmark of unstable systems.\n                        </p>\n```typescript\n// Calculate Shannon Entropy H(X) = -Σ P(x) log P(x)\nlet entropy = 0;\nworkItems.forEach(w => {\n    // distribution of work items across links\n    const idx = links.indexOf(w.link); \n    if (idx > -1) distribution[idx]++;\n});\n\ndistribution.forEach(count => {\n    if (count > 0) {\n        const p = count / workItems.length;\n        entropy -= p * Math.log(p);\n    }\n});\n```\n                    </div>\n\n                    <div>\n                        <h4 class=\"font-semibold mb-2\">The Kalman Filter</h4>\n                        <ul class=\"list-disc pl-5 space-y-1 mb-2\">\n                            <li><strong>Origin:</strong> Rudolf Kalman, 1960.</li>\n                            <li><strong>Concept:</strong> An algorithm that uses a series of measurements observed over time, containing statistical noise, to produce estimates of unknown variables.</li>\n                        </ul>\n                        <p>\n                            <strong>In Simulation:</strong> When enabled, the <strong>Prediction Layer</strong> (represented by a cyan dashed ring) attempts to 'chase' and estimate the true Cognitive Load (the solid ring), filtering out stochastic jitter. It visually demonstrates the difficulty management faces in distinguishing \"signal\" (true capacity issues) from \"noise\" (random fluctuations).\n                        </p>\n```typescript\n// 1. Predict (Time Update)\nlet predNext = this.kfEstimate;\nthis.kfErrorCov = this.kfErrorCov + this.kfProcessNoise;\n\n// 2. Update (Measurement)\nconst K = this.kfErrorCov / (this.kfErrorCov + this.kfMeasureNoise);\nthis.kfEstimate = this.kfEstimate + K * (measuredLoad - this.kfEstimate);\nthis.kfErrorCov = (1 - K) * this.kfErrorCov;\n```\n                    </div>\n\n                    <div>\n                        <h4 class=\"font-semibold mb-2\">The Hidden Factory (Rework)</h4>\n                        <ul class=\"list-disc pl-5 space-y-1 mb-2\">\n                            <li><strong>Origin:</strong> Armand Feigenbaum / Six Sigma.</li>\n                            <li><strong>Concept:</strong> A significant portion of capacity is often consumed by correcting defects that were not caught at the source.</li>\n                        </ul>\n                        <p><strong>In Simulation:</strong> When <strong>Psychological Safety</strong> is low, errors are hidden (purple dots). These have a 50% chance of being rejected at the end of the line and sent back to the start, consuming capacity without generating value.</p>\n```typescript\nif (Math.random() < errorChance) {\n    if (Math.random() < config.psychSafety) {\n        // High Safety: Stop the line (Visible Error)\n        this.blockTimer = 40; \n        return false;\n    } else {\n        // Low Safety: Hide the error (Latent Defect)\n        workItem.isDefect = true; \n        return true;\n    }\n}\n```\n                    </div>\n                </div>\n            </div>\n        </details>\n    </section>\n\n    <section>\n        <details class=\"group\">\n            <summary class=\"cursor-pointer list-none select-none\">\n                <div class=\"flex items-center gap-2\">\n                    <svg class=\"w-5 h-5 transition-transform group-open:rotate-180\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                        <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n                    </svg>\n                    <h3 class=\"m-0!\">Human Factors</h3>\n                </div>\n            </summary>\n            <div class=\"mt-4\">\n                <p class=\"mb-6\">These controls model the soft-skills/psychological dimension of the system.</p>\n\n                <div class=\"space-y-8\">\n                    <div>\n                        <h4 class=\"font-semibold mb-2\">Psychological Safety</h4>\n                        <p class=\"italic mb-2\">\n                            <strong>Definition:</strong> The belief that one will not be punished or humiliated for speaking up with ideas, questions, concerns, or mistakes (Amy Edmondson).\n                        </p>\n                        <ul class=\"list-disc pl-5 space-y-2\">\n                            <li><strong>High Safety:</strong> Teams stop the line when an error occurs (red blockage). This hurts short-term flow but prevents technical debt.</li>\n                            <li><strong>Low Safety:</strong> Teams pass the error downstream to avoid blame. The dot turns purple (Hidden Defect) and continues moving, creating false flow metrics but eventual rework.</li>\n                        </ul>\n                    </div>\n\n                    <div>\n                        <h4 class=\"font-semibold mb-2\">Cognitive Load</h4>\n                        <p class=\"italic mb-2\"><strong>Definition:</strong> The total amount of mental effort being used in the working memory (John Sweller).</p>\n                        <p class=\"mb-3\"><strong>Mechanism:</strong> Represented by the coloured ring around a node. Work items add load; time decays it. High load triggers the Kingman effect (slowdown) and increases the probability of error generation.</p>\n                    </div>\n\n                    <div>\n                        <h4 class=\"font-semibold mb-2\">Environmental Noise (Occasion Noise)</h4>\n                        <p class=\"italic mb-2\"><strong>Definition:</strong> Transient variability in judgement or performance caused by external factors (mood, weather, interruptions) (Daniel Kahneman).</p>\n                        <p><strong>Mechanism:</strong> Adds random \"jitter\" to particle movement speed and increases the base probability of gate failure, independent of structural design.</p>\n                    </div>\n                </div>\n            </div>\n        </details>\n    </section>\n\n    <section>\n        <details class=\"group\">\n            <summary class=\"cursor-pointer list-none select-none\">\n                <div class=\"flex items-center gap-2\">\n                    <svg class=\"w-5 h-5 transition-transform group-open:rotate-180\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                        <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n                    </svg>\n                    <h3 class=\"m-0!\">System Design</h3>\n                </div>\n            </summary>\n            <div class=\"mt-4\">\n                <p class=\"mb-6\">These controls model the structural architecture of the organisation.</p>\n\n                <div class=\"grid md:grid-cols-1 gap-6\">\n                    <div class=\"bg-slate-50 dark:bg-slate-900 border border-slate-200 dark:border-slate-800 rounded-xl p-6\">\n                        <h4 class=\"mt-0\">Value Units (Nodes)</h4>\n                        <p class=\"mb-0\">Represents teams, departments, or servers. Increasing nodes increases capacity but incurs the <strong>Coordination Penalty</strong> (Brooks's Law).</p>\n                    </div>\n                    <div class=\"bg-slate-50 dark:bg-slate-900 border border-slate-200 dark:border-slate-800 rounded-xl p-6\">\n                        <h4 class=\"mt-0\">Intermediation (Gates)</h4>\n                        <p class=\"mb-0\">Represents approval steps, handovers, bureaucracy, or middleware.</p>\n                        <ul class=\"list-disc pl-5 space-y-1 mb-0\">\n                            <li><strong>Effect:</strong> Each gate is a potential failure point. Even with 99% reliability, a chain of 5 gates has only ~95% system reliability (0.995^5).</li>\n                            <li><strong>Gridlock:</strong> In high-load states, gates become bottlenecks that drastically reduce Flow Efficiency.</li>\n                        </ul>\n                    </div>\n                </div>\n            </div>\n        </details>\n    </section>\n\n    <section>\n        <details class=\"group\">\n            <summary class=\"cursor-pointer list-none select-none\">\n                <div class=\"flex items-center gap-2\">\n                    <svg class=\"w-5 h-5 transition-transform group-open:rotate-180\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                        <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n                    </svg>\n                    <h3 class=\"m-0!\">Organisational Scenarios</h3>\n                </div>\n            </summary>\n            <div class=\"mt-4\">\n                <div class=\"grid md:grid-cols-1 gap-6\">\n                    <ScenarioCard title=\"Ideal Flow (The Tesla Model)\" config=\"0 Gates, 100% Safety, Low Noise\">\n                        <ul class=\"list-disc pl-5 space-y-1 mb-0 mt-0\">\n                            <li><strong>Theory:</strong> Disintermediation. By removing approval gates and trusting the system, flow efficiency is maximised. Errors are rare and caught immediately.</li>\n                            <li><strong>Observation:</strong> Note the high speed and consistent rhythm of the blue dots, representing optimal flow state.</li>\n                        </ul>\n                    </ScenarioCard>\n\n                    <ScenarioCard title=\"Bureaucracy (The Ford Model)\" config=\"4 Gates, 90% Safety, High Frequency\">\n                        <ul class=\"list-disc pl-5 space-y-1 mb-0 mt-0\">\n                            <li><strong>Theory:</strong> High intermediation. The system is designed for control, not flow. While stable under low load, it gridlocks easily under high load due to the sheer number of stoppage points.</li>\n                            <li><strong>Observation:</strong> Watch how gates become bottlenecks, creating cascading delays throughout the system.</li>\n                        </ul>\n                    </ScenarioCard>\n\n                    <ScenarioCard title=\"Toxic Crunch\" config=\"1 Gate, 20% Safety, High Noise\">\n                        <ul class=\"list-disc pl-5 space-y-1 mb-0 mt-0\">\n                            <li><strong>Theory:</strong> The \"Death March.\" Low safety forces teams to hide errors. Throughput looks high (dots are moving), but the system is actually churning out defects (purple dots) that will return as rework.</li>\n                            <li><strong>Observation:</strong> Observe the high volume of 'movement' masking the accumulation of purple defects. This simulates 'vanity metrics' where teams look busy but are actually creating technical debt.</li>\n                        </ul>\n                    </ScenarioCard>\n\n                    <ScenarioCard title=\"Stochastic Chaos\" config=\"0 Gates, 40% Noise\">\n                        <ul class=\"list-disc pl-5 space-y-1 mb-0 mt-0\">\n                            <li><strong>Theory:</strong> High Entropy. Even without structural blockers (gates), the sheer amount of environmental noise prevents stable flow. Particles jitter and stall randomly, making prediction impossible.</li>\n                        </ul>\n                    </ScenarioCard>\n\n                    <ScenarioCard title=\"Scaling Startup (Hypergrowth)\" config=\"10 Teams, 2 Gates, 60% Safety, 15% Noise\">\n                        <ul class=\"list-disc pl-5 space-y-1 mb-0 mt-0\">\n                            <li><strong>Theory:</strong> Brooks's Law in action. Rapid team growth outpaces process development. The coordination penalty N(N-1)/2 explodes as nodes increase.</li>\n                            <li><strong>Observation:</strong> Watch the coordination penalty metric climb rapidly. The system transitions from \"Flowing\" to \"Overloaded\" as communication overhead dominates.</li>\n                        </ul>\n                    </ScenarioCard>\n\n                    <ScenarioCard title=\"Enterprise Silos (Fragmentation)\" config=\"8 Teams, 3 Gates, 70% Safety, 10% Noise\">\n                        <ul class=\"list-disc pl-5 space-y-1 mb-0 mt-0\">\n                            <li><strong>Theory:</strong> Conway's Law visualised. High gate count represents approval chains between organisational silos. Work items stall at departmental boundaries.</li>\n                            <li><strong>Observation:</strong> Note the high WIP and low throughput. Red blockages occur frequently at gates as work waits for cross-team approvals.</li>\n                        </ul>\n                    </ScenarioCard>\n\n                    <ScenarioCard title=\"Lean Factory (Toyota TPS)\" config=\"4 Teams, 1 Gate, 100% Safety, 2% Noise\">\n                        <ul class=\"list-disc pl-5 space-y-1 mb-0 mt-0\">\n                            <li><strong>Theory:</strong> Toyota Production System principles. Small, empowered teams with WIP limits and andon cord culture. Errors trigger immediate stops, preventing downstream waste.</li>\n                            <li><strong>Observation:</strong> Steady, predictable flow with low WIP and high efficiency. Occasional red stops resolve quickly, preventing defect accumulation.</li>\n                        </ul>\n                    </ScenarioCard>\n\n                    <ScenarioCard title=\"Remote First (Distributed Work)\" config=\"6 Teams, 1 Gate, 60% Safety, 28% Noise\">\n                        <ul class=\"list-disc pl-5 space-y-1 mb-0 mt-0\">\n                            <li><strong>Theory:</strong> Kahneman's \"occasion noise\" applied to distributed work. Time zones, async communication, and home interruptions add variability to all processes.</li>\n                            <li><strong>Observation:</strong> Jittery movement and unpredictable delays. Entropy remains elevated despite reasonable structural design.</li>\n                        </ul>\n                    </ScenarioCard>\n                </div>\n            </div>\n        </details>\n    </section>\n</div>"
      },
      {
        "id": "organisational-immune-system",
        "type": "labs",
        "title": "Innovate and/or Die",
        "description": "Why do big companies kill their best ideas? Explore how stealthy probes and executive cover allow innovation to survive the corporate immune system.",
        "date": "2026-07-19T00:00:00.000Z",
        "category": null,
        "tags": null,
        "url": "https://ryansnowden.com/labs/organisational-immune-system/",
        "content": "import OrganisationalImmuneSystem from '../../components/simulations/organisational-immune-system/OrganisationalImmuneSystem.tsx';\nimport Katex from '../../components/graphics/Katex.astro';\nimport ScenarioCard from '../../components/ui/ScenarioCard.astro';\n\n<section class=\"not-prose quote py-2 md:py-3 px-4 max-w-xl mx-auto text-center\">\n    <blockquote class=\"font-serif text-base md:text-lg italic text-slate-800 dark:text-slate-100 leading-snug border-none p-0 before:content-none after:content-none m-0\">\n        Cells interlinked within cells interlinked<br/>\n        Within one stem. And dreadfully distinct<br/>\n        Against the dark, a tall white fountain played.\n        <p class=\"mt-1.5 m-0 font-sans not-italic\">\n            <a href=\"https://www.youtube.com/watch?v=ZRcpnM26nJM\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"text-xs text-sky-500 dark:text-sky-400 hover:text-sky-600 dark:hover:text-sky-300 underline decoration-dotted underline-offset-4 transition-colors\">What does this mean?</a>\n        </p>\n        <footer class=\"mt-2 text-[10px] md:text-xs not-italic font-sans text-slate-500 uppercase tracking-widest\">Vladimir Nabokov, Pale Fire</footer>\n    </blockquote>\n</section>\n\n<div class=\"breakout breakout-both mt-10 mb-10\" style={{ height: '800px' }}>\n  <OrganisationalImmuneSystem client:only=\"react\" />\n</div>\n\n<details class=\"my-6 p-3 bg-transparent border-2 border-slate-200 dark:border-slate-800 rounded-xl\">\n    <summary class=\"cursor-pointer font-medium text-slate-500 dark:text-slate-400 flex items-center gap-2 list-none text-xs\">\n        <span class=\"uppercase tracking-wider\">Built With</span>\n        <svg class=\"w-3 h-3 transition-transform details-chevron\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n            <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n        </svg>\n    </summary>\n    <div class=\"mt-3 grid grid-cols-2 md:grid-cols-3 gap-2\">\n        <div class=\"p-2 bg-transparent rounded-lg border-2 border-slate-200 dark:border-slate-800\">\n            <div class=\"text-[10px] uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-0.5\">Language</div>\n            <div class=\"text-xs font-medium text-slate-700 dark:text-slate-200\">TypeScript</div>\n        </div>\n        <div class=\"p-2 bg-transparent rounded-lg border-2 border-slate-200 dark:border-slate-800\">\n            <div class=\"text-[10px] uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-0.5\">Framework</div>\n            <div class=\"text-xs font-medium text-slate-700 dark:text-slate-200\">React</div>\n        </div>\n        <div class=\"p-2 bg-transparent rounded-lg border-2 border-slate-200 dark:border-slate-800\">\n            <div class=\"text-[10px] uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-0.5\">Rendering</div>\n            <div class=\"text-xs font-medium text-slate-700 dark:text-slate-200\">Canvas API</div>\n        </div>\n        <div class=\"p-2 bg-transparent rounded-lg border-2 border-slate-200 dark:border-slate-800\">\n            <div class=\"text-[10px] uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-0.5\">Icons</div>\n            <div class=\"text-xs font-medium text-slate-700 dark:text-slate-200\">Lucide React</div>\n        </div>\n        <div class=\"p-2 bg-transparent rounded-lg border-2 border-slate-200 dark:border-slate-800\">\n            <div class=\"text-[10px] uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-0.5\">Math Rendering</div>\n            <div class=\"text-xs font-medium text-slate-700 dark:text-slate-200\">KaTeX</div>\n        </div>\n        <div class=\"p-2 bg-transparent rounded-lg border-2 border-slate-200 dark:border-slate-800\">\n            <div class=\"text-[10px] uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-0.5\">Static Site</div>\n            <div class=\"text-xs font-medium text-slate-700 dark:text-slate-200\">Astro</div>\n        </div>\n    </div>\n</details>\n\n<details open class=\"group mb-8\">\n    <summary class=\"cursor-pointer list-none select-none\">\n        <div class=\"flex items-center gap-2\">\n            <svg class=\"w-5 h-5 transition-transform group-open:rotate-180\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n            </svg>\n            <h3 class=\"m-0!\">Overview</h3>\n        </div>\n    </summary>\n    <div class=\"mt-4\">\n        This simulation explores how companies struggle to innovate in unpredictable environments. It visualizes the tension between finding new ideas and the organisation's natural tendency to protect its current way of working. This concept was inspired by [Vaughn Tan's work on bigness and the organisational immune system](https://vaughntan.org/bigness).\n\n        Think of a company like a living cell. To survive and grow, it must innovate by sending out agents (**Product Teams and R&D**, represented by the yellow particles) to explore new opportunities. However, the company also has an \"immune system\" (**Finance, Legal, and Operations**, represented by the red nodes)—driven by strict KPIs and designed to seek out risks and kill unproven ideas to protect the core business.\n    </div>\n</details>\n\n<details class=\"group mb-8\">\n    <summary class=\"cursor-pointer list-none select-none\">\n        <div class=\"flex items-center gap-2\">\n            <svg class=\"w-5 h-5 transition-transform group-open:rotate-180\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n            </svg>\n            <h3 class=\"m-0!\">The Simulation Elements</h3>\n        </div>\n    </summary>\n    <div class=\"mt-4\">\n        <div class=\"space-y-4 not-prose\">\n            <div class=\"flex items-start gap-3\">\n                <div class=\"w-8 h-8 flex-shrink-0 flex items-center justify-center bg-slate-50 dark:bg-slate-900 rounded-md border border-slate-200 dark:border-slate-800 mt-0.5\">\n                    <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"rgba(180, 220, 255, 0.4)\" stroke-width=\"1.5\">\n                        <path d=\"M4 0v24 M10 0v24 M16 0v24 M22 0v24 M0 4h24 M0 10h24 M0 16h24 M0 22h24\" />\n                    </svg>\n                </div>\n                <div>\n                    <h4 class=\"font-semibold text-base m-0 p-0 leading-tight\">The Grid</h4>\n                    <p class=\"m-0 text-sm text-slate-600 dark:text-slate-400 mt-1\">The realm of innovation. You can see this as the future in all directions. The best opportunities are hidden out there in the fog.</p>\n                </div>\n            </div>\n            <div class=\"flex items-start gap-3\">\n                <div class=\"w-8 h-8 flex-shrink-0 flex items-center justify-center bg-slate-50 dark:bg-slate-900 rounded-md border border-slate-200 dark:border-slate-800 mt-0.5\">\n                    <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"rgba(180, 220, 255, 0.8)\" stroke-width=\"1.5\" stroke-dasharray=\"2 3\">\n                        <circle cx=\"12\" cy=\"12\" r=\"8\" />\n                    </svg>\n                </div>\n                <div>\n                    <h4 class=\"font-semibold text-base m-0 p-0 leading-tight\">The Core Business (Cyan Area)</h4>\n                    <p class=\"m-0 text-sm text-slate-600 dark:text-slate-400 mt-1\">The safe, stable \"cell\" where the company currently operates, optimized for its current metrics.</p>\n                </div>\n            </div>\n            <div class=\"flex items-start gap-3\">\n                <div class=\"w-8 h-8 flex-shrink-0 flex items-center justify-center bg-slate-50 dark:bg-slate-900 rounded-md border border-slate-200 dark:border-slate-800 mt-0.5\">\n                    <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#ffd166\" stroke-width=\"1.5\">\n                        <circle cx=\"14\" cy=\"10\" r=\"3\" />\n                        <path d=\"M14 10 L6 18\" stroke-width=\"0.5\" stroke=\"url(#tailGrad)\" />\n                        <defs>\n                            <linearGradient id=\"tailGrad\" x1=\"14\" y1=\"10\" x2=\"6\" y2=\"18\" gradientUnits=\"userSpaceOnUse\">\n                                <stop offset=\"0%\" stop-color=\"#ffd166\" />\n                                <stop offset=\"100%\" stop-color=\"transparent\" />\n                            </linearGradient>\n                        </defs>\n                    </svg>\n                </div>\n                <div>\n                    <h4 class=\"font-semibold text-base m-0 p-0 leading-tight\">Innovators (Particles)</h4>\n                    <p class=\"m-0 text-sm text-slate-600 dark:text-slate-400 mt-1\">The <strong>Product Managers</strong>, <strong>R&D Engineers</strong>, and <strong>Individual Contributors</strong> exploring the grid, trying to find high-value ideas.</p>\n                </div>\n            </div>\n            <div class=\"flex items-start gap-3\">\n                <div class=\"w-8 h-8 flex-shrink-0 flex items-center justify-center bg-slate-50 dark:bg-slate-900 rounded-md border border-slate-200 dark:border-slate-800 mt-0.5\">\n                    <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#ff4444\" stroke-width=\"1.5\">\n                        <path d=\"M9 12 h6 M12 9 v6\" />\n                        <circle cx=\"12\" cy=\"12\" r=\"8\" />\n                    </svg>\n                </div>\n                <div>\n                    <h4 class=\"font-semibold text-base m-0 p-0 leading-tight\">The Immune System (Red Nodes)</h4>\n                    <p class=\"m-0 text-sm text-slate-600 dark:text-slate-400 mt-1\">The corporate forces—such as <strong>Finance (CFO)</strong>, <strong>HR</strong>, and <strong>Compliance</strong>—hunting down highly visible or expensive experiments and shutting them down to protect the core business.</p>\n                </div>\n            </div>\n            <div class=\"flex items-start gap-3\">\n                <div class=\"w-8 h-8 flex-shrink-0 flex items-center justify-center bg-slate-50 dark:bg-slate-900 rounded-md border border-slate-200 dark:border-slate-800 mt-0.5\">\n                    <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#a0b0c0\" stroke-width=\"1.5\">\n                        <circle cx=\"12\" cy=\"12\" r=\"3\" />\n                    </svg>\n                </div>\n                <div>\n                    <h4 class=\"font-semibold text-base m-0 p-0 leading-tight\">Quiet Probes (Small Circles)</h4>\n                    <p class=\"m-0 text-sm text-slate-600 dark:text-slate-400 mt-1\">Small, cheap, and low-risk experiments (e.g., a two-week design sprint, a user interview, a cheap prototype). They stay closer to the safe cell, innovating in minor ways. Because they are small, they often fly under the radar of the <strong>Cost Controllers</strong>, gradually building evidence and proving their value.</p>\n                </div>\n            </div>\n            <div class=\"flex items-start gap-3\">\n                <div class=\"w-8 h-8 flex-shrink-0 flex items-center justify-center bg-slate-50 dark:bg-slate-900 rounded-md border border-slate-200 dark:border-slate-800 mt-0.5\">\n                    <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#ffd166\" stroke-width=\"1.5\">\n                        <path d=\"M12 4 L20 12 L12 20 L4 12 Z\" />\n                    </svg>\n                </div>\n                <div>\n                    <h4 class=\"font-semibold text-base m-0 p-0 leading-tight\">Big Bets (Large Diamonds)</h4>\n                    <p class=\"m-0 text-sm text-slate-600 dark:text-slate-400 mt-1\">Large, highly visible leaps into the unknown (e.g., massive reorgs, multi-year IT transformations, or \"bet the company\" product launches). They quickly attract the <strong>Risk Management</strong> teams and are usually killed or severely compromised before they can succeed.</p>\n                </div>\n            </div>\n        </div>\n    </div>\n</details>\n\n<details class=\"group mb-8\">\n    <summary class=\"cursor-pointer list-none select-none\">\n        <div class=\"flex items-center gap-2\">\n            <svg class=\"w-5 h-5 transition-transform group-open:rotate-180\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n            </svg>\n            <h3 class=\"m-0!\">How Innovation Actually Works</h3>\n        </div>\n    </summary>\n    <div class=\"mt-4\">\n        In a highly uncertain world, you can't just guess the best direction. If you place a **Big Bet**, it's usually too noticeable and gets rejected by the corporate immune system.\n\n        However, if you use **Quiet Probes**, these small experiments can survive long enough to gather evidence. As evidence grows, the idea gains legitimacy (cyan glowing areas). Once an idea is legitimate, the immune system backs off, and it becomes safe enough for the company to fully support and scale.\n    </div>\n</details>\n\n<details open class=\"group mb-8\">\n    <summary class=\"cursor-pointer list-none select-none\">\n        <div class=\"flex items-center gap-2\">\n            <svg class=\"w-5 h-5 transition-transform group-open:rotate-180\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n            </svg>\n            <h3 class=\"m-0!\">Scenarios</h3>\n        </div>\n    </summary>\n    <div class=\"mt-4\">\n        <p class=\"mb-6\">You can explore different organisational environments using the controls to see how the innovation teams fare against the corporate immune system (roles like Finance, HR, Compliance, and Operations).</p>\n\n        <div class=\"grid md:grid-cols-1 gap-6\">\n            <ScenarioCard title=\"KPI Fortress\" config=\"High Immune Sensitivity, Minimal Learning Tolerance\">\n                <div class=\"mb-4 h-96 overflow-hidden rounded-xl border-2 border-slate-200 dark:border-slate-800\">\n                    <OrganisationalImmuneSystem client:only=\"react\" initialLeftScenario=\"KPI Fortress\" hideSidebar={true} hideTelemetry={true} initialSplitScreen={false} embedded={true} />\n                </div>\n                <p class=\"mb-0 mt-0\">A savage killing ground governed by rigid metrics. Here, the <strong>Cost Controllers (Finance/CFO)</strong> and <strong>Compliance Teams (HR/Legal)</strong> are highly sensitive to any deviation. Extremely hostile to anything new, big bets are immediately vetoed or defunded, and even small probes struggle to survive the constant scrutiny. You'll see Immune Cells aggressively swarm and destroy almost all Probes and Bets before they can gather any evidence.</p>\n            </ScenarioCard>\n\n            <ScenarioCard title=\"Innovation Theatre\" config=\"High Budget, Rapid Memory Decay (No Evidence Accumulation)\">\n                <div class=\"mb-4 h-96 overflow-hidden rounded-xl border-2 border-slate-200 dark:border-slate-800\">\n                    <OrganisationalImmuneSystem client:only=\"react\" initialLeftScenario=\"Innovation Theatre\" hideSidebar={true} hideTelemetry={true} initialSplitScreen={false} embedded={true} />\n                </div>\n                <p class=\"mb-0 mt-0\">There is plenty of experimental activity, but the company fails to learn from it. Lots of money is spent, but evidence is ignored. Lots of probes are sent out by enthusiastic teams, but <strong>Middle Management</strong> fails to capture the learnings. You'll see a swarm of Big Bets and Quiet Probes that wander aimlessly without turning into Safe Zones or expanding the Core, eventually dying out.</p>\n            </ScenarioCard>\n\n            <ScenarioCard title=\"Protected Skunkworks\" config=\"High Protection Capacity\">\n                <div class=\"mb-4 h-96 overflow-hidden rounded-xl border-2 border-slate-200 dark:border-slate-800\">\n                    <OrganisationalImmuneSystem client:only=\"react\" initialLeftScenario=\"Protected Skunkworks\" hideSidebar={true} hideTelemetry={true} initialSplitScreen={false} embedded={true} />\n                </div>\n                <p class=\"mb-0 mt-0\">A senior leader (e.g., the <strong>CEO or Head of R&D</strong>) provides a \"shield\" around an innovation team. A small team is shielded from the rest of the company, blocking the usual oversight from <strong>Finance and Operations</strong>. Bolder and riskier ideas have a chance to survive without being prematurely killed for lack of immediate ROI. You'll notice Probes surviving for long periods, slowly exploring the landscape without triggering Immune responses.</p>\n            </ScenarioCard>\n\n            <ScenarioCard title=\"Adaptive Organization\" config=\"Balanced Immunity, High Learning Tolerance\">\n                <div class=\"mb-4 h-96 overflow-hidden rounded-xl border-2 border-slate-200 dark:border-slate-800\">\n                    <OrganisationalImmuneSystem client:only=\"react\" initialLeftScenario=\"Adaptive Organization\" hideSidebar={true} hideTelemetry={true} initialSplitScreen={false} embedded={true} />\n                </div>\n                <p class=\"mb-0 mt-0\">A healthy balance where the grid landscape of ideas is much greater. <strong>Executive Leadership</strong> intentionally lowers the immune response from <strong>Risk Management</strong> for small, reversible experiments. Highly tolerant of new ideas, projects have a safe space to fail and learn. Over time, you'll see Quiet Probes survive long enough to gather evidence and turn into Safe Zones, expanding the Core.</p>\n            </ScenarioCard>\n\n            <ScenarioCard title=\"False Certainty\" config=\"Extreme Bet Ratio (No Small Probes)\">\n                <div class=\"mb-4 h-96 overflow-hidden rounded-xl border-2 border-slate-200 dark:border-slate-800\">\n                    <OrganisationalImmuneSystem client:only=\"react\" initialLeftScenario=\"False Certainty\" hideSidebar={true} hideTelemetry={true} initialSplitScreen={false} embedded={true} />\n                </div>\n                <p class=\"mb-0 mt-0\"><strong>The Board and Executive Team</strong> act as if the unpredictable future is totally predictable. The environment is complex and unpredictable. They repeatedly mandate large, expensive bets (e.g., massive acquisitions or \"bet the company\" product launches) that fail spectacularly when they eventually clash with reality and internal <strong>Operational Constraints</strong>. You'll see massive, highly visible Big Bets being launched, but failing to find peaks and getting killed off before they can succeed.</p>\n            </ScenarioCard>\n        </div>\n    </div>\n</details>\n\n<div class=\"space-y-12 my-12\">\n    <section>\n        <details class=\"group\">\n            <summary class=\"cursor-pointer list-none select-none\">\n                <div class=\"flex items-center gap-2\">\n                    <svg class=\"w-5 h-5 transition-transform group-open:rotate-180\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                        <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n                    </svg>\n                    <h3 class=\"m-0!\">Mathematical Foundation</h3>\n                </div>\n            </summary>\n            <div class=\"mt-4\">\n                <p class=\"mb-6\">\n                    The simulation uses an **NK fitness landscape** combined with an **immune-response threshold** model to govern how innovation is detected and suppressed.\n                </p>\n\n                <div class=\"space-y-8\">\n                    <div>\n                        <h4 class=\"font-semibold mb-2\">The NK Landscape</h4>\n                        <p class=\"mb-2\">The environment is modeled as an NK landscape, representing genuine uncertainty rather than calculable risk.</p>\n                        <ul class=\"list-disc pl-5 space-y-1 mb-2\">\n                            <li><strong><Katex formula=\"N\" inline />:</strong> The number of interdependent strategic choices or dimensions.</li>\n                            <li><strong><Katex formula=\"K\" inline />:</strong> The level of interdependence between those choices (ruggedness). As <Katex formula=\"K\" inline /> increases, the landscape becomes more rugged with numerous local peaks, making it impossible to extrapolate past success into future bets.</li>\n                        </ul>\n                    </div>\n\n                    <div>\n                        <h4 class=\"font-semibold mb-2\">Detection Probability</h4>\n                        <ul class=\"list-disc pl-5 space-y-1 mb-2\">\n                            <li><strong>Concept:</strong> At each simulation tick, innovators deploy experiments. The probability that the corporate immune system detects an experiment is mapped via a logistic function (sigmoid).</li>\n                        </ul>\n                        <div class=\"bg-slate-50 dark:bg-slate-900 p-4 rounded mb-3 overflow-x-auto\">\n                            <Katex formula=\"P(\\text{detected}) = \\sigma\\big(a \\cdot \\text{visibility} + c \\cdot \\text{novelty} - e \\cdot \\text{protection}\\big)\" />\n                        </div>\n                        <p>\n                            <strong>Big Bets</strong> have high visibility and structural novelty, nearly guaranteeing detection. <strong>Quiet Probes</strong> minimize these factors to stay below the detection threshold.\n                        </p>\n                    </div>\n\n                    <div>\n                        <h4 class=\"font-semibold mb-2\">Suppression Probability</h4>\n                        <ul class=\"list-disc pl-5 space-y-1 mb-2\">\n                            <li><strong>Concept:</strong> Detection does not immediately equal death. Once caught, the immune system decides whether to suppress the idea. This is heavily mitigated by local evidence and strategic cover.</li>\n                        </ul>\n                        <div class=\"bg-slate-50 dark:bg-slate-900 p-4 rounded mb-3 overflow-x-auto\">\n                            <Katex formula=\"P(\\text{suppressed}) = \\sigma\\big(f \\cdot \\text{sensitivity} \\cdot \\text{novelty} - g \\cdot \\text{evidence} - h \\cdot \\text{cover}\\big)\" />\n                        </div>\n                    </div>\n\n                    <div>\n                        <h4 class=\"font-semibold mb-2\">Organisational Immune Index (OII)</h4>\n                        <p class=\"mb-2\">The OII provides a unified metric representing the hostility of the corporate environment to new ideas. It is calculated as a weighted sum of key environmental parameters:</p>\n                        <div class=\"bg-slate-50 dark:bg-slate-900 p-4 rounded mb-3 overflow-x-auto\">\n                            <Katex formula=\"\\text{OII} = 0.25D + 0.30S + 0.20(1 - L) + 0.15(1 - E) + 0.10(1 - P)\" />\n                        </div>\n                        <ul class=\"list-disc pl-5 space-y-1 mb-2\">\n                            <li><strong><Katex formula=\"D\" inline /> (Detection):</strong> How quickly novelty attracts scrutiny.</li>\n                            <li><strong><Katex formula=\"S\" inline /> (Suppression):</strong> The likelihood an immune cell terminates a targeted experiment.</li>\n                            <li><strong><Katex formula=\"L\" inline /> (Learning Tolerance):</strong> Whether negative results are treated as useful information (inverted weight).</li>\n                            <li><strong><Katex formula=\"E\" inline /> (Evidence Permeability):</strong> Whether evidence changes decisions (inverted weight).</li>\n                            <li><strong><Katex formula=\"P\" inline /> (Protection):</strong> Leadership's capacity to create safe-to-try spaces (inverted weight).</li>\n                        </ul>\n                        <p class=\"mt-2 text-sm text-slate-600 dark:text-slate-400\">OII bands: Adaptive (0-24), Guarded (25-49), Defensive (50-74), and Autoimmune (75-100).</p>\n                    </div>\n\n                    <div>\n                        <h4 class=\"font-semibold mb-2\">The Legitimacy Feedback Loop (Stigmergy)</h4>\n                        <p>The mathematical core of successful innovation in the model relies on a compounding spatial feedback loop:</p>\n                        <ol class=\"list-decimal pl-5 space-y-1 mb-2\">\n                            <li><strong>Quiet Probes</strong> stay below <Katex formula=\"P(\\text{detected})\" inline />.</li>\n                            <li>Surviving probes deposit <strong>evidence</strong> onto a localized grid.</li>\n                            <li>The organisation suffers from <strong>institutional memory loss</strong> (evidence decays over time).</li>\n                            <li>If evidence accumulation outpaces memory decay and crosses a threshold, the area gains <strong>legitimacy</strong>.</li>\n                            <li>Legitimacy creates a permanent safe zone where <Katex formula=\"P(\\text{suppressed})\" inline /> drops to zero, allowing the company to safely invest.</li>\n                        </ol>\n                    </div>\n                </div>\n            </div>\n        </details>\n    </section>\n\n    <section>\n        <div class=\"bg-white dark:bg-slate-900 border-2 border-slate-200 dark:border-slate-800 rounded-xl p-6\">\n            <h3 class=\"mt-0\">The Takeaway</h3>\n            <p class=\"mb-0\">\n                In uncertain environments, standard corporate controls are tuned to reject anything different. By protecting low-cost, quiet experiments, a company can create information. That information builds legitimacy, and legitimacy finally permits confident investment.\n            </p>\n        </div>\n    </section>\n</div>"
      },
      {
        "id": "organisational-reasoning-engine",
        "type": "labs",
        "title": "Organisational Reasoning with Cellular Automata",
        "description": "How leadership influence and ideas ripple through a company. A cellular automata simulation of organizational knowledge diffusion.",
        "date": "2026-07-15T00:00:00.000Z",
        "category": null,
        "tags": null,
        "url": "https://ryansnowden.com/labs/organisational-reasoning-engine/",
        "content": "import OrganisationalReasoningEngine from '../../components/simulations/organisational-reasoning/OrganisationalReasoningEngine';\n\n<div class=\"breakout breakout-both\">\n  <OrganisationalReasoningEngine client:only=\"react\" />\n</div>"
      },
      {
        "id": "query-theory-simulator",
        "type": "labs",
        "title": "Queuing Theory Simulator",
        "description": "What happens when developers work faster but nothing ships any sooner? An interactive simulation of bottlenecks and queuing dynamics.",
        "date": "2025-12-21T00:00:00.000Z",
        "category": null,
        "tags": null,
        "url": "https://ryansnowden.com/labs/query-theory-simulator/",
        "content": "import QueryTheorySimulator from '../../components/simulations/QueryTheorySimulator.tsx';\nimport Katex from '../../components/graphics/Katex.astro';\nimport ScenarioCard from '../../components/ui/ScenarioCard.astro';\n\n<div class=\"breakout\">\n  <QueryTheorySimulator fullWidth={true} client:load client:only=\"react\" />\n</div>\n\n<details class=\"my-6 p-3 bg-transparent border-2 border-slate-200 dark:border-slate-800 rounded-xl\">\n    <summary class=\"cursor-pointer font-medium text-slate-500 dark:text-slate-400 flex items-center gap-2 list-none text-xs\">\n        <span class=\"uppercase tracking-wider\">Built With</span>\n        <svg class=\"w-3 h-3 transition-transform details-chevron\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n            <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n        </svg>\n    </summary>\n    <div class=\"mt-3 grid grid-cols-2 md:grid-cols-3 gap-2\">\n        <div class=\"p-2 bg-transparent rounded-lg border-2 border-slate-200 dark:border-slate-800\">\n            <div class=\"text-[10px] uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-0.5\">Language</div>\n            <div class=\"text-xs font-medium text-slate-700 dark:text-slate-200\">TypeScript</div>\n        </div>\n        <div class=\"p-2 bg-transparent rounded-lg border-2 border-slate-200 dark:border-slate-800\">\n            <div class=\"text-[10px] uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-0.5\">Framework</div>\n            <div class=\"text-xs font-medium text-slate-700 dark:text-slate-200\">React</div>\n        </div>\n        <div class=\"p-2 bg-transparent rounded-lg border-2 border-slate-200 dark:border-slate-800\">\n            <div class=\"text-[10px] uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-0.5\">Rendering</div>\n            <div class=\"text-xs font-medium text-slate-700 dark:text-slate-200\">Canvas API</div>\n        </div>\n        <div class=\"p-2 bg-transparent rounded-lg border-2 border-slate-200 dark:border-slate-800\">\n            <div class=\"text-[10px] uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-0.5\">Icons</div>\n            <div class=\"text-xs font-medium text-slate-700 dark:text-slate-200\">Lucide React</div>\n        </div>\n        <div class=\"p-2 bg-transparent rounded-lg border-2 border-slate-200 dark:border-slate-800\">\n            <div class=\"text-[10px] uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-0.5\">Math Rendering</div>\n            <div class=\"text-xs font-medium text-slate-700 dark:text-slate-200\">KaTeX</div>\n        </div>\n        <div class=\"p-2 bg-transparent rounded-lg border-2 border-slate-200 dark:border-slate-800\">\n            <div class=\"text-[10px] uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-0.5\">Static Site</div>\n            <div class=\"text-xs font-medium text-slate-700 dark:text-slate-200\">Astro</div>\n        </div>\n    </div>\n</details>\n\n<details open class=\"group mb-8\">\n    <summary class=\"cursor-pointer list-none select-none\">\n        <div class=\"flex items-center gap-2\">\n            <svg class=\"w-5 h-5 transition-transform group-open:rotate-180\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n            </svg>\n            <h3 class=\"m-0!\">Overview</h3>\n        </div>\n    </summary>\n    <div class=\"mt-4\">\n        This tool shows the hidden dynamics of multi-team software delivery systems. It shows why traditional resource utilisation metrics (\"keeping people busy\") often cause waste.\n\n        Models a **Push System**, where Stage 1 (Development) pushes work to Stage 2 (QA/Deploy) regardless of capacity. This demonstrates **Theory of Constraints** and **Lean Flow** principles.\n\n        **What's missing?** \n\n        - ✅ ~~Cost. I should probably add cost.~~\n        - ✅ ~~Sprints to show the cadence benefits of short, focused cycles.~~\n        - Dual-track agile vs agile.\n        - A product team... but that would be a whole new v2 with a different set of problems.\n\n    </div>\n</details>\n\n<details class=\"group mb-8\">\n    <summary class=\"cursor-pointer list-none select-none\">\n        <div class=\"flex items-center gap-2\">\n            <svg class=\"w-5 h-5 transition-transform group-open:rotate-180\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n            </svg>\n            <h3 class=\"m-0!\">tl;dr Quick Explanation</h3>\n        </div>\n    </summary>\n    <div class=\"mt-4\">\n\n        #### The Bottleneck Problem\n\n        The default scenario shows a classic **bottleneck**. Development (Stage 1) has more capacity than QA (Stage 2). Watch how the QA queue grows unbounded while developers sit idle waiting for work to clear downstream. This is the **Theory of Constraints** in action: the system's throughput is limited by its slowest stage, not its fastest.\n\n        #### What to Look For\n\n        - **Queue bars growing:** When the bar under a stage fills up, work is waiting. The longer items wait, the higher your Lead Time.\n        - **Colour changes:** Work items turn from green (flowing) → yellow (waiting) → red (blocked). Blocked items are stuck behind a server that's also blocked.\n        - **Utilisation vs Flow:** High server utilisation (everyone looks busy) can coexist with terrible flow efficiency (work spends most of its time waiting).\n\n        #### The \"Aha\" Moment\n\n        Try increasing Development capacity (more devs) without increasing QA capacity. Watch the QA queue explode. **Adding people upstream makes the problem worse**, not better. This is why \"throwing bodies at the problem\" fails.\n\n    </div>\n</details>\n\n<details class=\"group mb-8\">\n    <summary class=\"cursor-pointer list-none select-none\">\n        <div class=\"flex items-center gap-2\">\n            <svg class=\"w-5 h-5 transition-transform group-open:rotate-180\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n            </svg>\n            <h3 class=\"m-0!\">Scenarios</h3>\n        </div>\n    </summary>\n    <div class=\"mt-4\">\n        <p class=\"mb-6\">Scenarios demonstrating Queueing Theory and Theory of Constraints principles.</p>\n\n        <div class=\"grid md:grid-cols-1 gap-6\">\n            <ScenarioCard title=\"The Bottleneck (Push System)\" config=\"High Development capacity vs. Low QA capacity\">\n                <p class=\"mb-0 mt-0\">Demonstrates the Theory of Constraints. Increasing speed upstream (local optimisation) without addressing the bottleneck downstream only generates \"inventory\" (WIP), which is a form of waste. The QA queue will grow indefinitely, increasing lead time and defect risk.</p>\n            </ScenarioCard>\n\n            <ScenarioCard title=\"Integration Hell (High Friction)\" config=\"Moderate arrival rate, High Blocking & Rework\">\n                <p class=\"mb-0 mt-0\">Shows that flow is destroyed not just by volume, but by friction. Servers appear \"busy\" (high utilisation), but they are working on \"failure demand\" or waiting, resulting in extremely low Flow Efficiency (&lt;15%).</p>\n            </ScenarioCard>\n\n            <ScenarioCard title=\"The Utilisation Trap\" config=\"Arrival rate ≈ 98% of Capacity, Zero Friction\">\n                <p class=\"mb-0 mt-0\">Demonstrates Kingman's Formula approximation. As system utilisation approaches 100%, queue times rise exponentially towards infinity. It proves that a system running at \"maximum efficiency\" effectively ceases to flow.</p>\n            </ScenarioCard>\n\n            <ScenarioCard title=\"Whale Variability\" config=\"Low arrival rate, 25% chance of 5x larger tasks\">\n                <p class=\"mb-0 mt-0\">Illustrates the damage caused by large batch sizes or inconsistent ticket sizing. One large task blocks a server for a long duration, causing smaller tasks (\"Guppies\") to pile up behind it, drastically increasing the average wait time for the entire system.</p>\n            </ScenarioCard>\n        </div>\n    </div>\n</details>\n\n<div class=\"space-y-12 my-12\">\n    <section>\n        <details class=\"group\">\n            <summary class=\"cursor-pointer list-none select-none\">\n                <div class=\"flex items-center gap-2\">\n                    <svg class=\"w-5 h-5 transition-transform group-open:rotate-180\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                        <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n                    </svg>\n                    <h3 class=\"m-0!\">The Push vs Pull Metaphor</h3>\n                </div>\n            </summary>\n            <div class=\"mt-4\">\n                <p>Push vs. Pull is key to flow efficiency.</p>\n\n                <div class=\"grid md:grid-cols-2 gap-6\">\n                    <div class=\"bg-white dark:bg-slate-900 border-2 border-slate-200 dark:border-slate-800 rounded-xl p-6 py-0\">\n                        <h4>Push System (This Simulation)</h4>\n                        <p>Work is **pushed** downstream the moment it's complete, regardless of whether the next stage is ready. This is how most organisations operate by default.</p>\n                        <ul class=\"list-disc pl-5 space-y-1\">\n                            <li>Creates inventory (queues) between stages</li>\n                            <li>Hides bottlenecks until they become crises</li>\n                            <li>Optimises for local efficiency over system flow</li>\n                        </ul>\n                    </div>\n                    <div class=\"bg-white dark:bg-slate-900 border-2 border-slate-200 dark:border-slate-800 rounded-xl p-6 py-0\">\n                        <h4>Pull System (Lean/Kanban)</h4>\n                        <p>Work is **pulled** by downstream stages only when they have capacity. This is the Toyota Production System model.</p>\n                        <ul class=\"list-disc pl-5 space-y-1 mb-0\">\n                            <li>WIP limits prevent queue buildup</li>\n                            <li>Bottlenecks become immediately visible</li>\n                            <li>Optimises for end-to-end flow</li>\n                        </ul>\n                    </div>\n                </div>\n                <p class=\"mt-4\">This simulation models a Push system to demonstrate failure modes. The growing queues are \"invisible inventory\" often missed by traditional metrics.</p>\n            </div>\n        </details>\n    </section>\n\n    <section>\n        <details class=\"group\">\n            <summary class=\"cursor-pointer list-none select-none\">\n                <div class=\"flex items-center gap-2\">\n                    <svg class=\"w-5 h-5 transition-transform group-open:rotate-180\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                        <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n                    </svg>\n                    <h3 class=\"m-0!\">Visual Guide</h3>\n                </div>\n            </summary>\n            <div class=\"mt-4\">\n                <p class=\"mb-6\">Guide to visual elements.</p>\n\n                <div class=\"space-y-8\">\n                    <div>\n                        <h4 class=\"font-semibold mb-2\">Work Item Colours</h4>\n                        <div class=\"flex flex-wrap items-center gap-6\">\n                            <div class=\"flex items-center gap-2\">\n                                <div class=\"w-3 h-3 rounded-full bg-green-500 shrink-0\"></div>\n                                <span class=\"text-sm\"><strong>Green:</strong> Flowing smoothly</span>\n                            </div>\n                            <div class=\"flex items-center gap-2\">\n                                <div class=\"w-3 h-3 rounded-full bg-yellow-500 shrink-0\"></div>\n                                <span class=\"text-sm\"><strong>Yellow:</strong> Waiting in queue</span>\n                            </div>\n                            <div class=\"flex items-center gap-2\">\n                                <div class=\"w-3 h-3 rounded-full bg-red-500 shrink-0\"></div>\n                                <span class=\"text-sm\"><strong>Red:</strong> Blocked</span>\n                            </div>\n                            <div class=\"flex items-center gap-2\">\n                                <div class=\"w-3 h-3 rounded-full bg-blue-500 shrink-0\"></div>\n                                <span class=\"text-sm\"><strong>Blue:</strong> Rework (sent back)</span>\n                            </div>\n                        </div>\n                    </div>\n\n                    <div>\n                        <h4 class=\"font-semibold mb-2\">Queue Bars</h4>\n                        <p>The horizontal bar under each stage shows queue depth. When it fills up, work is piling up faster than it can be processed. A full bar indicates a bottleneck.</p>\n                    </div>\n\n                    <div>\n                        <h4 class=\"font-semibold mb-2\">Servers (Circles)</h4>\n                        <p>Each circle represents a \"server\" (developer, tester, or machine). When a server is processing work, it's filled. When idle, it's empty. Multiple servers process in parallel.</p>\n                    </div>\n\n                    <div>\n                        <h4 class=\"font-semibold mb-2\">Metrics Dashboard</h4>\n                        <ul class=\"list-disc pl-5 space-y-1\">\n                            <li><strong>Throughput:</strong> Items completed per time unit</li>\n                            <li><strong>Lead Time:</strong> Total time from arrival to completion</li>\n                            <li><strong>Wait Time:</strong> Time spent in queues (not being worked on)</li>\n                            <li><strong>Utilisation:</strong> Percentage of time servers are busy</li>\n                            <li><strong>Flow Efficiency:</strong> Work time ÷ Lead time (how much time is \"value-add\")</li>\n                        </ul>\n                    </div>\n                </div>\n            </div>\n        </details>\n    </section>\n\n    <section>\n        <details class=\"group\">\n            <summary class=\"cursor-pointer list-none select-none\">\n                <div class=\"flex items-center gap-2\">\n                    <svg class=\"w-5 h-5 transition-transform group-open:rotate-180\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                        <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n                    </svg>\n                    <h3 class=\"m-0!\">Controls Reference</h3>\n                </div>\n            </summary>\n            <div class=\"mt-4\">\n                <div class=\"grid md:grid-cols-2 gap-6\">\n                    <div class=\"bg-white dark:bg-slate-900 border-2 border-slate-200 dark:border-slate-800 rounded-xl p-6 py-0\">\n                        <h4>Arrival Rate (λ)</h4>\n                        <p>How frequently new work items enter the system. Higher values simulate high-demand periods or sprints with aggressive commitments.</p>\n                    </div>\n                    <div class=\"bg-white dark:bg-slate-900 border-2 border-slate-200 dark:border-slate-800 rounded-xl p-6 py-0\">\n                        <h4>Dev Capacity (Servers)</h4>\n                        <p>Number of parallel workers in Stage 1 (Development). More servers = more throughput capacity, but only if downstream can absorb it.</p>\n                    </div>\n                    <div class=\"bg-white dark:bg-slate-900 border-2 border-slate-200 dark:border-slate-800 rounded-xl p-6 py-0\">\n                        <h4>QA Capacity (Servers)</h4>\n                        <p>Number of parallel workers in Stage 2 (QA/Deploy). Often the bottleneck in real organisations due to specialisation and handoff friction.</p>\n                    </div>\n                    <div class=\"bg-white dark:bg-slate-900 border-2 border-slate-200 dark:border-slate-800 rounded-xl p-6 py-0\">\n                        <h4>Service Rate (μ)</h4>\n                        <p>How quickly each server processes work. Represents team velocity, tooling efficiency, or automation level.</p>\n                    </div>\n                    <div class=\"bg-white dark:bg-slate-900 border-2 border-slate-200 dark:border-slate-800 rounded-xl p-6 py-0\">\n                        <h4>Blocking %</h4>\n                        <p>Probability that a completed item blocks downstream (e.g., integration failures, environment issues, merge conflicts). Creates cascading delays.</p>\n                    </div>\n                    <div class=\"bg-white dark:bg-slate-900 border-2 border-slate-200 dark:border-slate-800 rounded-xl p-6 py-0\">\n                        <h4>Rework %</h4>\n                        <p>Probability that a completed item is rejected and sent back to the start. Represents bugs found in QA, failed code reviews, or requirement misunderstandings.</p>\n                    </div>\n                </div>\n\n                <h4 class=\"mt-8\">Whale Mode</h4>\n                <p>When enabled, a percentage of work items arrive as \"whales\": tasks that take 5x longer than normal. This simulates:</p>\n                <ul class=\"list-disc pl-5 space-y-1\">\n                    <li>Large, poorly-scoped tickets</li>\n                    <li>Unexpected complexity (\"iceberg\" stories)</li>\n                    <li>Batch processing or release trains</li>\n                </ul>\n            </div>\n        </details>\n    </section>\n\n    <section>\n        <details class=\"group\">\n            <summary class=\"cursor-pointer list-none select-none\">\n                <div class=\"flex items-center gap-2\">\n                    <svg class=\"w-5 h-5 transition-transform group-open:rotate-180\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                        <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n                    </svg>\n                    <h3 class=\"m-0!\">Human Factors</h3>\n                </div>\n            </summary>\n            <div class=\"mt-4\">\n                <p class=\"mb-6\">Abstracts human behaviour, mapping directly to real organisational patterns.</p>\n\n                <div class=\"space-y-8\">\n                    <div>\n                        <h4 class=\"font-semibold mb-2\">Blocking as Blame Culture</h4>\n                        <p>High blocking percentages often correlate with poor psychological safety. When teams fear blame for integration failures, they add more review gates and approval steps, which *increases* blocking probability. The simulation shows why \"more process\" often makes things worse.</p>\n                    </div>\n\n                    <div>\n                        <h4 class=\"font-semibold mb-2\">Rework as Technical Debt</h4>\n                        <p>Rework represents the \"hidden factory\": capacity consumed by fixing defects that should have been caught earlier. High rework rates indicate poor requirements, insufficient testing, or rush-to-deploy pressure.</p>\n                    </div>\n\n                    <div>\n                        <h4 class=\"font-semibold mb-2\">The Utilisation Trap</h4>\n                        <p>Management often optimises for **utilisation** (keeping people busy), but the simulation shows this destroys **flow**. At 90%+ utilisation, queue times explode exponentially. The counterintuitive truth: slack capacity is essential for flow.</p>\n                    </div>\n\n                    <div>\n                        <h4 class=\"font-semibold mb-2\">Handoff Friction</h4>\n                        <p>Each stage boundary represents a handoff: context lost, waiting for availability, re-explanation. The simulation's two-stage model is a simplification; real organisations often have 5-10+ handoffs, each multiplying delay and error probability.</p>\n                    </div>\n                </div>\n            </div>\n        </details>\n    </section>\n\n    <section>\n        <details class=\"group\">\n            <summary class=\"cursor-pointer list-none select-none\">\n                <div class=\"flex items-center gap-2\">\n                    <svg class=\"w-5 h-5 transition-transform group-open:rotate-180\" style=\"color: var(--accent);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                        <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n                    </svg>\n                    <h3 class=\"m-0!\">Mathematical Foundations</h3>\n                </div>\n            </summary>\n            <div class=\"mt-4\">\n                <p class=\"mb-6\">\n                    Based on Queueing Theory and Lean management principles. These mathematical laws govern flow systems, whether physical manufacturing lines or digital software development. They explain why \"common sense\" management (like 100% utilisation) often fails mathematically.\n                </p>\n\n                <div class=\"space-y-8\">\n                    <div>\n                        <h4 class=\"font-semibold mb-2\">M/M/c Queue Model</h4>\n                        <p class=\"text-sm text-slate-600 dark:text-slate-400 mb-2\">\n                            <strong>What this means in practice:</strong> A standard mathematical formula for how lines form. It models work arriving unpredictably (like user stories landing in a sprint) being handled by a fixed set of workers (developers or QA testers).\n                        </p>\n                        <ul class=\"list-disc pl-5 space-y-1 mb-2 text-sm\">\n                            <li><strong>M (Markovian Arrivals):</strong> Arrival times follow a Poisson process (Exponential distribution).</li>\n                            <li><strong>M (Markovian Service):</strong> Service times follow an Exponential distribution.</li>\n                            <li><strong>c (Servers):</strong> The number of active servers (developers/testers) processing the queue.</li>\n                        </ul>\n                    </div>\n\n                    <div>\n                        <h4 class=\"font-semibold mb-2\">Exponential Distribution</h4>\n                        <p class=\"text-sm text-slate-600 dark:text-slate-400 mb-2\">\n                            <strong>What this means in practice:</strong> Software tasks aren't uniform. Most tickets take a normal amount of time, but occasional \"iceberg\" tasks take 5x longer. This distribution creates realistic real-world variance.\n                        </p>\n                        <div class=\"bg-slate-50 dark:bg-slate-900 p-4 rounded mb-3 overflow-x-auto\">\n                            <Katex formula=\"T = -\\frac{\\ln(1 - \\text{random})}{\\text{rate}}\" />\n                        </div>\n                        <p class=\"text-sm\">\n                            <strong>In Simulation:</strong> Used to generate randomized arrival times for new work items and the duration of service (work) for each server, ensuring the simulation reflects realistic variability rather than static averages.\n                        </p>\n```typescript\n// Generate random values following an Exponential distribution\n// Used for arrival times (Poisson process) and service durations\nconst getExponential = (rate: number) => {\n    return -Math.log(1 - Math.random()) / rate;\n}\n\n// Generate next arrival time\ndata.nextArrivalTime = getExponential(params.arrivalRate) * 1000;\n```\n                    </div>\n\n                    <div>\n                        <h4 class=\"font-semibold mb-2\">Little's Law</h4>\n                        <p class=\"text-sm text-slate-600 dark:text-slate-400 mb-2\">\n                            <strong>What this means in practice:</strong> If your team is flooded with work, the *only* way to make individual features ship faster (without hiring more people) is to stop starting new things and reduce Work in Progress (WIP).\n                        </p>\n                        <div class=\"bg-slate-50 dark:bg-slate-900 p-4 rounded mb-3 overflow-x-auto\">\n                            <Katex formula=\"L = \\lambda W\" />\n                        </div>\n                        <p class=\"text-sm\">\n                            <strong>In Simulation:</strong> Validates the statistical metrics displayed in the dashboard. It proves that if you cannot change the arrival rate (<Katex formula=\"\\lambda\" inline />), the only way to reduce Lead Time (<Katex formula=\"W\" inline />) is to reduce the Work in Progress (<Katex formula=\"L\" inline />).\n                        </p>\n```typescript\n// Verify simulator metrics against Little's Law (L = λ * W)\n// avgSystemLength (L) ≈ arrivalRate (λ) * avgSystemTime (W)\nconst stats = {\n    avgSystemTime: s1.W + s2.W,     // Total time in system (W)\n    avgSystemLength: s1.L + s2.L    // Total items in system (L)\n};\n```\n                    </div>\n\n                    <div>\n                        <h4 class=\"font-semibold mb-2\">Erlang-C Formula</h4>\n                        <ul class=\"list-disc pl-5 space-y-1 mb-2\">\n                            <li>\n                                <strong>Origin:</strong> A.K. Erlang (1917), Telecommunications traffic engineering.\n                            </li>\n                            <li>\n                                <strong>Concept:</strong> Calculates the probability that a randomly arriving item must wait in the queue rather than being served immediately, given the traffic intensity and number of servers.\n                            </li>\n                        </ul>\n                        <p>\n                            <strong>In Simulation:</strong> Provides the \"Theoretical\" baseline for wait times. Comparison between this theoretical baseline and the \"Actual\" simulation results highlights the extra friction caused by factors Erlang-C doesn't account for, such as blocking and rework.\n                        </p>\n```typescript\n// Calculate Erlang-C probability that an item must wait\nconst calcErlangC = (lambda: number, mu: number, c: number) => {\n    const rho = lambda / (c * mu); // Traffic intensity\n    \n    // Calculate sum of geometric series for P(0)\n    let p0_inv = 0;\n    for (let i = 0; i < c; i++) {\n        p0_inv += Math.pow(lambda / mu, i) / factorial(i);\n    }\n    p0_inv += (Math.pow(lambda / mu, c) / factorial(c)) * (1 / (1 - rho));\n    \n    // Theoretical average queue length (Lq)\n    return (Math.pow(lambda / mu, c) * rho * (1 / p0_inv)) / \n           (factorial(c) * Math.pow(1 - rho, 2));\n};\n```\n                    </div>\n\n                    <div>\n                        <h4 class=\"font-semibold mb-2\">Flow Efficiency</h4>\n                        <ul class=\"list-disc pl-5 space-y-1 mb-2\">\n                            <li>\n                                <strong>Origin:</strong> Lean Manufacturing / Toyota Production System.\n                            </li>\n                            <li>\n                                <strong>Concept:</strong> A metric measuring the percentage of time work is actually being progressed versus sitting idle. In knowledge work, this is often shockingly low (10-15%).\n                            </li>\n                        </ul>\n                        <div class=\"bg-slate-50 dark:bg-slate-900 p-4 rounded mb-3 overflow-x-auto\">\n                            <Katex formula=\"\\text{Flow Efficiency} = \\frac{\\text{Value Added Time}}{\\text{Total Lead Time}}\" />\n                        </div>\n                        <p>\n                            <strong>In Simulation:</strong> Calculated dynamically by tracking the exact milliseconds an entity spends being \"serviced\" (Active Work) versus \"waiting\" or \"blocked\". It visualises how high server utilisation can coexist with terrible flow efficiency.\n                        </p>\n```typescript\n// Track value-added time vs total lead time for every item\nif (Math.random() < 0.1) { // 10% sampling rate for UI updates\n    const flowEff = data.metrics.totalSystem > 0 \n        ? (data.metrics.totalValueAdded / data.metrics.totalSystem) * 100 \n        : 0;\n        \n    setSimState(prev => ({ \n        ...prev, \n        flowEfficiency: flowEff \n    }));\n}\n```\n                    </div>\n                </div>\n            </div>\n        </details>\n    </section>\n</div>"
      },
      {
        "id": "stow-dashboard",
        "type": "labs",
        "title": "FC Stow Performance and Throughput Dynamics",
        "description": "A real-time warehouse dashboard tracking stow performance — and why traditional Units Per Hour metrics mislead operations.",
        "date": "2026-05-09T00:00:00.000Z",
        "category": null,
        "tags": null,
        "url": "https://ryansnowden.com/labs/stow-dashboard/",
        "content": "import Katex from \"../../components/graphics/Katex.astro\";\nimport SecretStyleLink from \"../../components/simulations/warehouse-visualizer/SecretStyleLink.tsx\";\nimport TimelineControllerEmbed from \"../../components/simulations/session-timeline-dashboard/TimelineControllerEmbed.tsx\";\n\n<div class=\"not-prose mb-8 flex flex-wrap justify-center items-center gap-3\">\n  <span class=\"inline-flex items-center px-4 py-2 rounded-full text-xs font-medium uppercase tracking-wider bg-indigo-900 text-indigo-200\">On Hold</span>\n  <SecretStyleLink href=\"/labs/stow-dashboard/play/\" tealEmphasis client:only=\"react\">\n    <span className=\"text-sm leading-none\" aria-hidden=\"true\">👻</span>\n    Open dashboard\n  </SecretStyleLink>\n</div>\n\nI argue that the current system (at Amazon PER4) of performance measurement (KPI/Units Per Hour) for Stowers can be improved, both in measurement and in optics. Stowers are subject to weekly performance check-ins. For example, if an Associate is under performing (say at 85%) for the previous week, then a 1:1 discussion will take place in the Aisles. This is an opportunity for the associate to explain why (or not), but also to explain the performance expectations according to their level. In this chat, it may come to surface that there was an error or explanation that explains the 'performance', so in fact the measurement is actually measuring something else, and not the actual units stowed.\n\nHowever, how this percentage is calculated is not explained, and the factors around the associates tasks may be innaccurate due to human error. A FC runs in an interlinked process. If no items are available to stow, then rates will decline. Changing tasks is done by a PA, who might make a mistake, or misrepresent the time due to complexity. An associate is not compelled to update their PA (Process Assistant) due to the intensity of work, and lack of availability. Keeping a personal track of tasks, problems, items is difficult and also adds time.\n\nI isolate truth from the hand barcode scanners in a **Units Per Session** KPI to determine the rate, which allows the conversation to focus on 'the gaps'. The gaps being the operations. \n\nThese ideas and numbers are available to stakeholders. It is just not a driver in daily decision making to certain floor staff. This is probably due to the nature of accuracy and repeatability as you transition and improve a FC on a weekly basis... with it's own bureaucracy. So consider this a non-novel approach, but an emphasis and encouragement of focus, with a UX/UI that is more engaging and informative. \n\nI also bring forward (in the UI) **fatigue** from consecutive working days. Depending on the stower's tenure, they will become **mentally** and **physically** fatigued. Effort made to alternate tasks or cross train departments does not negate the impact of fatigue, but is welcome. This is physical and largely mental health related. I need to do extensive research in this area to provide predictions, so it is constrained to physical aspects.\n\n---\n\n### The Bits\n\nThe simulation starts at 8am (1 hour after stowers have been stowing). You can scrub through time with the timeline and watch the days fill up. There is a multiplier, so you can click it to 1x and watch the day as it happens.\n\n<div class=\"not-prose breakout my-8 flex justify-center\">\n  <TimelineControllerEmbed client:load client:only=\"react\" />\n</div>\n\nThe stow target is set to 105% for 22.1k units. There are 15 stowers.\n\n---\n\n## Engineered Labor Standards (ELS)\n\nMy concept builds upon Engineered Labor Standards, or ELS, which are a way to ask a simple question: **how much work should this task reasonably take? **Not every unit is equal. A small, easy item is not the same as a heavy item, a long walk, or a bin that takes extra handling. ELS helps account for those differences, so the dashboard is not only counting how many items someone stowed. It is also trying to show how difficult the work was, and whether two people with different unit counts may have done a similar amount of real work.\n\n## What the Numbers Mean\n\nThe dashboard uses the same **four performance lenses** as the per-session stow model. Each metric divides output by a different slice of time, so each one answers a different question. None of them is “the truth” on its own. Read together, they separate **speed while working**, **freight difficulty**, **how much of the shift was actually spent stowing**, and the traditional **units per paid hour** view.\n\n### 1. UPH (macro / shift UPH)\n\nThe number of items/units stowed for every hour on the clock during the shift. Walking, waiting, breaks, and congestion all count in the denominator, so this metric combines individual pace with everything else that happened that day.\n\n<div class=\"bg-slate-50 dark:bg-slate-900 p-4 rounded mb-4 overflow-x-auto breakout not-prose\">\n  <Katex formula=\"\\text{UPH} = \\frac{\\sum \\text{units stowed}}{\\text{paid shift hours}}\" />\n</div>\n\n### 2. Session rate (scan-to-scan)\n\nThe rate of stowing **only during active stow time**, measured from the first scan to the last scan in a continuous work stretch. Time outside that active window, such as long gaps before the next scan, is excluded from the denominator. This is closer to “how fast work occurred while stowing was actually happening.”\n\n<div class=\"bg-slate-50 dark:bg-slate-900 p-4 rounded mb-4 overflow-x-auto breakout not-prose\">\n  <Katex formula=\"\\text{Session rate} = \\frac{\\sum \\text{units stowed}}{\\text{active session hours}}\" />\n</div>\n\nFor a single continuous session, active session hours are the elapsed time from first scan to last scan, converted to hours.\n\n### 3. Weighted session rate\n\nThis is similar to session rate, but **harder or heavier items count for more** than easier small items. Each item class receives a weight from engineered standards. The weighted “effective units” are then divided by active session hours, so cherry-picking only small items does not automatically dominate the chart.\n\n<div class=\"bg-slate-50 dark:bg-slate-900 p-4 rounded mb-4 overflow-x-auto breakout not-prose\">\n  <Katex formula=\"\\text{Weighted session rate} = \\frac{n_s W_s + n_m W_m + n_h W_h}{\\text{active session hours}}\" />\n</div>\n\nHere, <Katex formula=\"n_s,\\, n_m,\\, n_h\" inline /> are the counts of small, medium, and heavy units stowed, and <Katex formula=\"W_s,\\, W_m,\\, W_h\" inline /> are the matching effort multipliers.\n\n### 4. Flow efficiency\n\nOf the time a worker was **expected** to be available for production, defined as paid shift time minus authorised breaks, what **fraction** was spent inside active stow sessions? A high session rate with low flow efficiency often indicates fast bursts with substantial idle or off-task time. A moderate session rate with high flow efficiency may indicate steady work on more difficult freight.\n\n<div class=\"bg-slate-50 dark:bg-slate-900 p-4 rounded mb-6 overflow-x-auto breakout not-prose space-y-4\">\n  <Katex formula=\"\\text{Flow efficiency} = \\frac{\\sum \\text{active session hours}}{\\text{paid shift hours} - \\text{authorised break hours}}\" />\n  <Katex formula=\"\\text{Flow efficiency (\\%)} = 100 \\times \\text{Flow efficiency}\" />\n</div>\n\nThe second line expresses the same ratio as a percentage, using a number between 0 and 100 instead of 0 and 1.\n\n## Worked Example: Associate A vs. Associate B\n\nBoth associates work within the same shift envelope: **9.5 paid hours** and **0.5 hours of authorised paid breaks**. This leaves **9 hours** as expected production time for flow efficiency. Associate A focuses on small, easier units; Associate B stays on heavy freight.\n\n| | **Associate A** | **Associate B** |\n| --- | --- | --- |\n| Units stowed | 2,850 (all small) | 1,140 (all heavy) |\n| Active session hours | 6 | 8 |\n| Effort weight per unit | 1.0 | 3.0 |\n\n**1. UPH** (units ÷ full paid shift, 9.5 hours)\n\n<div class=\"bg-slate-50 dark:bg-slate-900 p-4 rounded mb-4 overflow-x-auto breakout not-prose\">\n  <Katex formula=\"\\text{UPH}_A = 2850 / 9.5 \\approx 300 \\quad\\quad \\text{UPH}_B = 1140 / 9.5 \\approx 120\" />\n</div>\n\n**2. Session rate** (units ÷ active session hours only)\n\n<div class=\"bg-slate-50 dark:bg-slate-900 p-4 rounded mb-4 overflow-x-auto breakout not-prose\">\n  <Katex formula=\"\\text{Session}_A = 2850 / 6 = 475 \\quad\\quad \\text{Session}_B = 1140 / 8 = 142.5\" />\n</div>\n\n**3. Weighted session rate** (effective units ÷ active session hours; B’s items count triple)\n\n<div class=\"bg-slate-50 dark:bg-slate-900 p-4 rounded mb-4 overflow-x-auto breakout not-prose\">\n  <Katex formula=\"\\text{Weighted}_A = (2850 \\cdot 1) / 6 = 475 \\quad\\quad \\text{Weighted}_B = (1140 \\cdot 3) / 8 = 427.5\" />\n</div>\n\n**4. Flow efficiency** (active session hours ÷ 9 expected hours)\n\n<div class=\"bg-slate-50 dark:bg-slate-900 p-4 rounded mb-4 overflow-x-auto breakout not-prose\">\n  <Katex formula=\"\\text{Flow}_A = 6 / 9 \\approx 66.7\\% \\quad\\quad \\text{Flow}_B = 8 / 9 \\approx 88.9\\%\" />\n</div>\n\nRaw **UPH** makes A look like the stronger stower by a wide margin. **Session rate** still favours A because every unit is counted the same. **Weighted session rate** nearly closes the gap, with B within about 10% of A. **Flow efficiency** shows that B spent most of the expected window actually stowing, while A left roughly a third of that window outside active sessions. In this reading, A appears to be a fast **sprinter** with gaps, while B appears to be a steady **pacer** on harder work.\n\n## Problem Solver at session end\n\nIn about **15%** of sessions, a stower finishes with a Problem Solver interaction: an item was not scannable, not assigned to the cart, needed an expiry date, or could not be stowed on the floor (HRV, hazmat, and similar). The session timeline shows an **amber hatched zone** at the tail — similar to a break overlay, but with **PS item markers** inside it.\n\nThe stower typically waits **20–60 seconds** (dashed “Waiting” strip) before Problem Solver touches the item. Then either:\n\n- **Handoff** — the item leaves with Problem Solver and the session ends, or\n- **Resolve and stow** — Problem Solver fixes the issue and the stower scans one or two final units (amber-ringed bars) before the session ends.\n\nToggle **Problem solve** on the session detail view to show or hide the zone.\n\n## How to Read This Dashboard\n\nThe synthetic shift in the live dashboard is calibrated to finish **above plan** — about **106%** of the 22,137 day target at end of shift — reflecting a regular-pace stow day rather than an under-delivered one.\n\nIf someone’s **UPH** looks low but **weighted session rate** and **flow efficiency** look strong, they may be working difficult freight, dealing with congestion, or receiving a fairer evaluation than raw units per paid hour would provide. If **session rate** is high but **flow efficiency** is low, they may be stowing quickly while active but not remaining in task for much of the shift. The timelines and side-by-side metrics should be used to determine which explanation best fits the observed pattern."
      },
      {
        "id": "strategic-evo-simulator",
        "type": "labs",
        "title": "Zara's Strategic Timeline",
        "description": "How Zara built a supply chain empire — and adapted across three growth phases. Explore what-if scenarios across strategy, culture, and financials.",
        "date": "2026-03-02T00:00:00.000Z",
        "category": null,
        "tags": null,
        "url": "https://ryansnowden.com/labs/strategic-evo-simulator/",
        "content": "import StrategicEvo from '../../components/simulations/StrategicEvo.astro';\nimport Accordion from '../../components/ui/Accordion.astro';\nimport BuiltWith from '../../components/ui/BuiltWith.astro';\nimport { Mermaid } from '../../components/graphics/Mermaid';\n\n<StrategicEvo class=\"breakout\" />\n\n<BuiltWith items={[\n    { label: \"Language\", value: \"TypeScript\" },\n    { label: \"Framework\", value: \"React\" },\n    { label: \"Charts\", value: \"Recharts\" },\n    { label: \"Diagrams\", value: \"Beautiful Mermaid\" },\n    { label: \"Static Site\", value: \"Astro\" },\n]} />\n\nNot as flashy as other sims (a bit of long weekend fun), but this timeline looks at Zara through a strategic lens. It started as a way to explain old decisions using the usual frameworks like the I/O model and AFI for the early days. Then I worked on Ansoff, CAGE, and VRIO, etc. Most of the real work happens in the background to determine certain pivot points, triggers and eras.\n\nExperience design was a major factor for the insights. Customers feel the brand changing. This could be in a service design manner, or in a rebrand, product shift (shopping for 'trends'), pricing models, etc. Naturally, in-store experience and buying online are at the forefront of customer interaction.\n\nI mapped it out (to Horizons) to see what drove innovation internally and externally. Why stop at 2026? The future-state can work as you follow curves, and look for inflection points of likely events or possible threats, innovation etc.\n\n<Accordion class=\"mb-0\" title=\"The timeline: From pyjamas to Paris\" open={true}>\nIn 1963, Ortega started Confecciones GOA in Arteixo, Galicia, making women's pyjamas and lingerie. A cancelled wholesale order in 1975 forced him to open a retail store to shift the excess stock. That store became Zara. IT investment followed in 1976, nine Spanish locations by 1983, and Inditex incorporated in 1985. By 1990, Zara had flagships in Portugal, New York, and Paris.\n\n<div class=\"breakout\">\n<Mermaid client:visible ascii={false} bg=\"none\" chart={`\nflowchart LR\n    A[<strong>1963</strong>;;GOA Funded]:::milestone --> B[<strong>1975</strong>;;First;;Zara store]:::turning\n    B --> C[<strong>1976</strong>;;IT investment]:::milestone\n    C --> D[<strong>1983</strong>;;Nine Spanish;;stores]:::milestone\n    D --> E[<strong>1985</strong>;;Inditex;;incorporated]:::turning\n    E --> F[<strong>1988</strong>;;International;;expansion]:::turning\n    F --> G[<strong>1989</strong>;;New York;;flagship]:::milestone\n    G --> H[<strong>1990</strong>;;Paris;;flagship]:::milestone\n\n    classDef milestone fill:#1e293b,stroke:#475569,color:#cbd5e1,stroke-width:1px\n    classDef turning fill:#1e293b,stroke:#ff6e41,color:#ff6e41,stroke-width:2px\n`} />\n</div>\n</Accordion>\n\n<Accordion class=\"\" title=\"Supply chain as weapon\">\nThe 1970s apparel industry ran on six-month production cycles. Manufacturers outsourced to Asia, committed to large speculative runs, and leaned on star designers to call trends from the top. When forecasts missed, 30-40% of stock went to clearance.\n\nOrtega built his supply chain in Europe. The Quick Response system moved garments from sketch to shop floor in 2-5 weeks, produced in small batches at factories across Spain and Portugal.\n\n<div class=\"breakout\">\n<Mermaid client:visible ascii={false} bg=\"none\" chart={`\nflowchart TD\n    subgraph Traditional [Traditional Model]\n        direction TB\n        T1[Star Designer]:::tradNode --> T2[Asian Factory]:::tradNode\n        T2 --> T3[6-Month Ocean Freight]:::tradNode\n        T3 --> T4[Warehouse]:::tradNode\n        T4 --> T5[Retail Store]:::tradNode\n        T5 --> T6[30-40% Clearance Sales]:::warnNode\n    end\n\n    subgraph Zara [Disruptive Model]\n        direction TB\n        Z1[Store Manager<br>Intelligence]:::zaraNode --> Z2[200 Designers<br>The Cube]:::coreNode\n        Z3[Local Factories<br>Spain/Portugal]:::zaraNode --> Z2\n        Z2 --> Z4[Bi-Weekly Delivery]:::zaraNode\n        Z4 --> Z5[Retail Floor<br>Within Hours]:::zaraNode\n        Z5 --> Z1\n    end\n\n    classDef tradNode fill:#1e293b,stroke:#475569,color:#cbd5e1,stroke-width:1px\n    classDef warnNode fill:#451a03,stroke:#ff6e41,color:#ff6e41,stroke-width:2px\n    classDef zaraNode fill:#1e293b,stroke:#85d7ff,color:#85d7ff,stroke-width:1px\n    classDef coreNode fill:#0c4a6e,stroke:#85d7ff,color:#e0f2fe,stroke-width:2px\n`} />\n</div>\n</Accordion>\n\n<Accordion class=\"\" title=\"How it worked\">\nZara captured 85% of sales at full price, against an industry average of 60-70%. Customers came back 17 times a year (industry average: 3). Ad spend sat at 0.3% of revenue, a fraction of the 3.5% standard.\n\n<div class=\"flex justify-center my-6\">\n  <span class=\"hidden dark:block\">\n    <img\n      src=\"/images/structural-disruption.svg\"\n      alt=\"Bar chart comparing 7 key operational metrics between the traditional apparel industry and Zara's disruptive model\"\n      style=\"width: 563px; max-width: 563px; height: auto; position: static; left: auto; transform: none;\"\n      class=\"border-0\"\n    />\n  </span>\n  <span class=\"block dark:hidden\">\n    <img\n      src=\"/images/structural-disruption-light.svg\"\n      alt=\"Bar chart comparing 7 key operational metrics between the traditional apparel industry and Zara's disruptive model\"\n      style=\"width: 563px; max-width: 563px; height: auto; position: static; left: auto; transform: none;\"\n      class=\"border-0\"\n    />\n  </span>\n</div>\n\nThe operation centred on \"The Cube\" in Arteixo. A 124 mi (~200 km) underground monorail moved materials between production stages without manual handling. Above ground, 200 designers sat with commercial and procurement teams. A design could go from sketch to scheduled production in a single day.\n\nManufacturing was split. Internal factories handled trend-sensitive items, roughly 50% of stock. Predictable basics went to outside suppliers. Store managers reported twice weekly on what customers tried, returned, and asked for, feeding real-time data back to Arteixo.\n</Accordion>\n\n<Accordion class=\"\" title=\"Manufactured scarcity\">\nMost fashion retailers depended on volume: produce 100,000 identical units, sell enough to break even. Zara produced hundreds of thousands of unique SKUs annually but kept individual runs small. If a jacket sold out in two days, it wasn't restocked. A variation replaced it.\n\nShoppers adapted. Waiting for end-of-season sales stopped making sense when items disappeared within the week. Zara averaged 17 store visits per customer per year, none of it driven by advertising.\n</Accordion>\n\n<Accordion class=\"\" title=\"Flexuous curves: The full framework\">\n**Flexuous Curves** is a framework from [Cynefin](https://cynefin.io/wiki/Flexuous_curves) that models overlapping strategy lifecycles. Unlike a simple S-curve, it tracks how new paradigms emerge while dominant ones peak, and maps the organisational states that determine whether the transition succeeds or fails. The model draws on Apex Predator theory, Keystone ecology, Moore's Chasm, and Christensen's competence-induced failure.\n\nZara maps cleanly because the three horizons are distinct and the transition dynamics are visible in the data.\n\n**The 6 Lifecycle Points**\n\nThe 6 Flexuous Curves framework points applied to Zara's H1:\n\n1. **Emergence**: A new idea takes off because people are over the old way. In 1975, Ortega says no to long production cycles and opens the first shop.\n2. **Chasm**: It's hard to keep the energy up and scale. By 1983, Zara only has 9 stores in Spain while they try to prove it works.\n3. **Orthodoxy**: Everyone does it and it becomes the norm. Between 2001 and 2010, they go public and \"fast fashion\" becomes a household name.\n4. **Decline**: The novelty fades and problems start popping up. From 2015 to 2019, Shein starts doing it faster and Zara's \"quick response\" isn't special anymore.\n5. **Oblivion**: These are the \"what-if\" paths like starting a price war or pivoting too late.\n6. **Sustainable**: The H1 model stays as the base, but Zara moves on to H2 and H3.\n\n**The 5 Greek-Letter States**\n\nThe 5 Greek states for the H1 to H2 shift:\n\n- **α Alpha**: Zara starts playing with Zara.com around 2010. They take what they know about physical shops and use it for digital. In F-Curve terms, this is exaptive innovation: radical repurposing of existing capability.\n- **β Beta**: Around 2015, ultra-fast fashion starts appearing as a cheap digital experiment. Astute observers can see the change, but the energy cost of experimenting is not too high.\n- **γ Gamma**: This is the \"last chance\" stage from 2019 to 2021. Shein overtakes Amazon for downloads. The warning signs are loud now. The dominant curve has topped and is heading down. Acting is expensive, but waiting is fatal.\n- **Ω Omega**: Moving resources successfully. This is the goal where they go upmarket with fancy collabs and start charging for returns. Resources transfer from old to new: the upward curve.\n- **δ Delta**: The \"too late\" scenario where they try to recover without having dominated digital earlier. Some arrest failure and recover, but never at the same level of dominance.\n\n**Competence-Induced Failure**\n\nThe dominant player does not fail because they were incompetent, but because they were *too competent* in the old paradigm. That competence breeds inattentional blindness writ large into the fabric of the organisation. This is Clayton Christensen's core insight, and the simulation tracks it as a \"Competence Trap Risk\" score derived from Town Planner dominance and the rising utility of a challenger curve.\n\n**Strategies for Crossing the Chasm**\n\n- **Retro-virus**: Changes the DNA of the host. *H1: Quick Response fundamentally rewired fashion retail.*\n- **Symbiotic**: The novel attaches to convention and is carried across the chasm. The host benefits. *H2: digital bolted onto physical retail. H3: sustainability bolted onto luxury repositioning.*\n- **Infection**: The novel idea uses the host to cross the chasm but doesn't care about the host's survival. *Shein: adopted Zara's own speed model, then out-competed it.*\n\n**Ecosystem Role Metaphors**\n\n- **Apex Predator**: Available if you move and succeed during alpha to gamma. *Zara at H1's peak.*\n- **Keystone**: Available during ecological shifts, providing more sustainability during subsequent change. *Zara's potential H2-H3 position.*\n- **Hyena**: Feeding off the leftovers of the former Apex. *The price-war scenario's endpoint.*\n- **Connective Agent**: Disintermediation that becomes an Apex Predator in its own right. *Shein, Amazon.*\n\n<div class=\"breakout\">\n<Mermaid client:visible ascii={false} bg=\"none\" chart={`\nflowchart LR\n    P1[\"<strong>Pt 1</strong>;;Emergence;;1975\"]:::phase --> P2[\"<strong>Pt 2</strong>;;Chasm;;~1983\"]:::phase\n    P2 --> P3[\"<strong>Pt 3</strong>;;Orthodoxy;;~2001\"]:::phase\n    P3 --> P4[\"<strong>Pt 4</strong>;;Decline;;~2015\"]:::phase\n    P4 --> P5[\"<strong>Pt 5</strong>;;Oblivion\"]:::warn\n    P4 --> P6[\"<strong>Pt 6</strong>;;Sustainable\"]:::safe\n\n    P3 -.- A[\"<strong>α</strong>;;Zara.com;;2010\"]:::greek\n    A -.- B[\"<strong>β</strong>;;Shein signals;;~2015\"]:::greek\n    B -.- G[\"<strong>γ</strong>;;Last chance;;~2019\"]:::greek\n    G -.- O[\"<strong>Ω</strong>;;Prestige pivot\"]:::greek\n    G -.- D[\"<strong>δ</strong>;;Late recovery\"]:::warn\n\n    classDef phase fill:#1e293b,stroke:#475569,color:#cbd5e1,stroke-width:1px\n    classDef greek fill:#1e293b,stroke:#85d7ff,color:#85d7ff,stroke-width:2px\n    classDef warn fill:#451a03,stroke:#ff6e41,color:#ff6e41,stroke-width:2px\n    classDef safe fill:#1e293b,stroke:#10b981,color:#10b981,stroke-width:2px\n`} />\n</div>\n\n**Other Approaches**\n\n- **Wardley Mapping** focuses on value chain evolution. \n- The **McKinsey Three Horizons** framework models time and innovation stages, and traditional S-curves track single product lifecycles rather than overlapping paradigms.\n- This simulation extends these with F-Curve transition states, competence trap detection, and ecosystem role tracking.\n</Accordion>\n\n<Accordion class=\"\" title=\"The horizons\">\n**Horizon 1: Quick Response (1975 to 2010s)**\n- Zara ditched the six-month production cycle and built rapid local production in Spain. Small batches, made weekly based on what floor staff saw selling. Inditex handled logistics and tech, freeing stores to focus on design and sales.\n\n**Horizon 2: Moving Upmarket (Late 2010s to Present)**\n- Shein and other ultra-cheap competitors arrived. Zara moved upmarket with higher prices, high-end collaborations, and paid returns on online orders.\n\n**Horizon 3: Sustainability (2020s to 2040s)**\n- Zara is scaling its second-hand platform, Zara Pre-Owned, and investing in fabric recycling partnerships. The targets are lower-impact materials across the board by 2030 and net-zero emissions by 2040.\n</Accordion>\n\n<Accordion class=\"\" title=\"Shein wins: Late pivot\">\nWhat if Zara was too slow to go upmarket? \n\n- Quick Response lingers into the 2020s, the prestige pivot comes late, and there's no real answer to Shein. Culture stays operations-heavy and profits flatline.\n\nIn F-Curve terms, Zara misses the **omega window**. \n\n- The gamma phase screams but the organisation's competence in physical retail has become inattentional blindness. The best outcome is a **delta recovery**: arresting decline but never recapturing Apex Predator dominance.\n</Accordion>\n\n<Accordion class=\"\" title=\"Vertical fortress: No digital shift\">\nWhat if Zara never went omnichannel? \n\n- No Zara.com, no digital integration. The vertical model stretches longer, but digital competitors close the gap. Revenue caps early and there's nothing left to fund new horizons.\n\nThe **alpha trigger never fires**. \n\n- Without exaptive innovation (repurposing physical retail for digital, \"radical innovation by repurposing existing technologies, data, and skills for new, unrelated, or complex problems\"), there's no second curve to transfer resources into. H1 heads straight from **Point 4 to Point 5: oblivion**. The gamma phase is ignored entirely.\n</Accordion>\n\n<Accordion class=\"\" title=\"Green pioneer: Early sustainability\">\nWhat if Zara committed to circular economy a decade earlier? Pioneer culture stays strong. Profits dip from the R&D spend, but Zara builds a substantial lead in sustainable fashion and recovers well.\n\nThis is the **alpha trigger fired early**. Zara legitimises circular fashion before the market demands it (a textbook exaptive move). The **omega transfer to H3** is achieved ahead of competitors, who are still at the beta stage of their own sustainability curves. \n\nThe result: sustained **Apex Predator** positioning.\n</Accordion>\n\n<Accordion class=\"\" title=\"Race to the bottom: Price war\">\nWhat if Zara matched Shein on price? Revenue climbs short-term from market share gains. Margins collapse, and there's no remaining budget to invest in Horizon 3.\n\nZara adopts the **infection strategy** (Shein's own playbook) but as the host, not the parasite. The price war erodes margins and destroys the budget needed for an omega transfer to H3. The endpoint is **Hyena territory**: feeding off the leftovers of a former Apex Predator.\n</Accordion>"
      }
    ],
    "stuff": [
      {
        "id": "ahi-product-strategy",
        "type": "stuff",
        "title": "AHI Product Strategy",
        "description": "A comprehensive strategic audit that diagnosed critical friction points in pricing and integration to realign a struggling B2B product with genuine market needs.",
        "date": "2022-12-12T00:00:00.000Z",
        "category": "product",
        "tags": null,
        "url": "https://ryansnowden.com/stuff/ahi-product-strategy/",
        "content": "import { SquareArrowOutUpRight } from \"lucide-astro\";\nimport video1 from \"../../assets/media/shared/0000000lE7W000000000wW-2.mp4\";\nimport ImageTooltip from \"../../components/lightbox/ImageTooltip.astro\";\nimport predatorVisionImg from \"../../assets/media/shared/predator-vision.jpg\";\n\n<div class=\"text-center mb-12 not-prose\">\n  <div>\n    <strong>Company:</strong> Advanced Health Intelligence (AHI)\n  </div>\n  <div class=\"mt-2\">\n    <span class=\"inline-block bg-gray-light text-gray-dark rounded-full px-3 py-1 text-sm font-semibold mr-2\">\n      Complexity: 9.926/10\n    </span>\n    <span class=\"inline-block bg-gray-light text-gray-dark rounded-full px-3 py-1 text-sm font-semibold\">\n      Fun factor: 9.921/10\n    </span>\n  </div>\n</div>\n\n<div class=\"flex flex-col items-center gap-4 mb-12\">\n\n  ## Project assets\n\n  <div class=\"text-center\">\n    <div class=\"flex flex-col gap-0\">\n      <a href=\"https://www.icloud.com/pages/0a0rPir4wXbUZx14mM1F8BHcw#VP-AHI\" target=\"_blank\" rel=\"noopener noreferrer\">Sanitised document</a>\n      <a href=\"https://www.figma.com/file/kWiHFJuVnexR267pHAmlW3/AHI-Customer-Journey-Map?type=whiteboard&node-id=0-1&t=epkwn0uaocv0j9TX-11\" target=\"_blank\" rel=\"noopener noreferrer\">Customer Journey Map</a>\n      <a href=\"https://www.figma.com/design/6qPlWOIx0uaYGolJmtN3fI/%F0%9F%A7%A0-Value-Proposition---By-Segment-2.0.25?m=auto&t=nisiypsXjPh7SEYE-1\" target=\"_blank\" rel=\"noopener noreferrer\">Pain points per market segment</a>\n      <a href=\"https://www.icloud.com/iclouddrive/036dmgbxpbN7h79RqhHCwgyiw#AHI_Audit_Staff_Feedback_Sanitized\" target=\"_blank\" rel=\"noopener noreferrer\">Staff interviews</a>\n    </div>\n  </div>\n\n</div>\n\n## Project Summary\n\n- A comprehensive end-to-end diagnostic of the BodyScan service ecosystem. This engagement utilised service design and strategic frameworks to identify root causes of market stagnation, challenging internal assumptions regarding product fit and integration viability.\n- For more strategic assets, see [Service Design Mapping](/stuff/service-design-mapping-examples).\n\n## The Business Challenge\n\n- Despite technical functionality, the product failed to achieve projected market penetration. Organisational leadership attributed this inertia to customer error and improper integration (“It’s not me, it’s you”).\n- The objective was to objectively validate these claims by assessing cost structures, market fit, and the reality of the partner integration experience.\n\n## Methodology & Frameworks\n\nThe analysis employed a multi-dimensional approach to deconstruct the service ecosystem:\n\n- **Strategic Alignment**: Value Proposition Map, The Value Pyramid\n- **User Experience**: User Journeys, Proto & Full Personas, Product Offering Lifecycle Curve\n\n## Key Objectives\n\n- **Financial Viability:** Comparative cost analysis (Vendor vs. Partner).\n- **Market Fit & Maturity:** Identifying suitable verticals and assessing the product’s stage in the lifecycle.\n- **Success Metrics:** Redefining success beyond technical execution to commercial viability.\n- **Data Strategy:** Evaluating data saturation and reliance models.\n\n## Critical Findings & Strategic Insights\n\nThe investigation delivered an evidence-based rebuttal to leadership assumptions, revealing that the barrier to growth was structural rather than operational. Although initially contentious, the analysis necessitated a strategic pivot.\n\n- **Misaligned Pricing:** The pricing model was prohibitive, particularly as an add-on to existing partner subscriptions, destroying the value proposition.\n- **Negative Partner ROI:** High onboarding and integration costs (irrespective of volume) yielded insufficient growth for partners.\n- **Flawed Success Metrics:** Success was internally defined by “scan completion” rather than partner revenue generation or user retention.\n- **Market Suitability:** The product was ill-suited for general fitness but highly viable for **Digital Health and Insurance** verticals.\n- **Product Immaturity:** The BodyScan offering lacked the flagship integrations and data strategy required for mass adoption.\n\n## Professional Impact\n\n- This engagement highlighted the critical intersection of organisational behaviour and product strategy.\n- It served as the catalyst for my MBA specialisation in Change Management, providing the foundational case studies used to deepen my expertise in leadership dynamics and organisational design."
      },
      {
        "id": "autonome",
        "type": "stuff",
        "title": "Autonomé",
        "description": "Ethical Health Data Marketplace.",
        "date": "2026-02-23T00:00:00.000Z",
        "category": "product",
        "tags": null,
        "url": "https://ryansnowden.com/stuff/autonome/",
        "content": "import ImageSlideshow from \"../../components/interactive/Slideshow.astro\";\nimport autonome1 from \"../../assets/media/autonome/1.png\";\nimport autonome2 from \"../../assets/media/autonome/2.png\";\nimport autonome3 from \"../../assets/media/autonome/3.png\";\nimport autonome4 from \"../../assets/media/autonome/4.png\";\nimport autonome5 from \"../../assets/media/autonome/5.png\";\nimport autonome6 from \"../../assets/media/autonome/6.png\";\nimport autonome7 from \"../../assets/media/autonome/7.png\";\nimport autonome8 from \"../../assets/media/autonome/8.png\";\nimport autonome9 from \"../../assets/media/autonome/9.png\";\nimport autonome10 from \"../../assets/media/autonome/10.png\";\nimport autonome11 from \"../../assets/media/autonome/11.png\";\nimport Accordion from \"../../components/ui/Accordion.astro\";\n\n<div class=\"text-center mb-12 not-prose\">\n  <p>\n    <strong>Client:</strong> Autonomé\n  </p>\n  <p>\n    <strong>Role:</strong> Consultant, Experience Designer, Product Strategy\n  </p>\n  <p>\n    <strong>Status:</strong> In Progress 👍🏻\n  </p>\n  <div class=\"mt-2\">\n    <span class=\"inline-block bg-gray-light text-gray-dark rounded-full px-3 py-1 text-sm font-semibold mr-2\">\n      Complexity: 9.8/10\n    </span>\n    <span class=\"inline-block bg-gray-light text-gray-dark rounded-full px-3 py-1 text-sm font-semibold\">\n      Fun factor: 9.3432/10\n    </span>\n  </div>\n</div>\n\n\n<div class=\"w-[calc(100vw-2rem)] md:w-[calc(100vw-200px)] max-w-[1020px] relative left-1/2 -translate-x-1/2 mb-6\">\n  <ImageSlideshow images={[autonome1, autonome2, autonome3, autonome4, autonome5, autonome6, autonome7, autonome8, autonome9, autonome10, autonome11]} />\n</div>\n\n<Accordion title=\"Project details\">\n\n- **Platform:** iOS, Android, Desktop\n- **Design system management:** Supernova.io\n- **Product type:** Dual marketplace, Ethical data broker\n- **Design system:** Material 3, Custom design system\n- **Design tools:** Figma, Cursor, Antigravity, Pen & Paper\n- **Approach:** AI-driven workflows\n- **Core Technology:** Distributed Ledger (DLT), Smart Contracts\n\n</Accordion>\n\n<Accordion title=\"The problem\" open={true}>\n\nPeople generate valuable health data every day through smartwatches, health apps, and hospital visits. Data brokers take it through confusing terms and conditions. The data sits in silos with Apple, Google, and Samsung, doing nothing.\n\nMeanwhile, researchers, pharmaceutical companies, and AI-health startups desperately need clean, long-term health data. Traditional methods like web scraping, or data brokers with opaque terms often operate in a grey area, likely breaching consent laws. The data they can acquire is often biased, incomplete, or ethically questionable.\n\nAutonomé sits in the middle. People get paid for their data. Buyers get compliant, continuous datasets. I was brought on as the sole product consultant to design how both sides of this marketplace actually work.\n\n</Accordion>\n\n<Accordion title=\"My role\">\n\nI'm the lead experience design consultant and product owner/manager/fixer. Staff designers handle branding and identity. I handle everything else: the consumer app, corporate portal, dashboards, and model validation. Day to day that means service blueprints, workshops, discovery, prototyping, fixing bias, training data, accuracy and precision, playing devils advocate....and project handover.\n\nThe core tension is designing for two timelines at once. The consumer app needs to work now: earning trust, collecting data, paying users. But every decision also needs to support the future enterprise data marketplace without requiring a rebuild.\n\n**What I do**\n\n- **Model validation**\n    - **Analyze → Measure → Improve loop** - identifying failre loops, quantify generalisation issues, improve (fix specs, stronger interventions)\n    - **Precision/recall** – how accurately agents spot valid companies/data and risky submissions without flooding humans with false alerts.\n    - **False positives** – flagging clean data as suspicious, slowing the marketplace and hurting trust.\n    - **Ground truth** – human-verified answers on whether data is synthetic, duplicated, biased, non-compliant, or buyer-ready. This is what we validate against and fine-tune on.\n    - **Drift** – the marketplace changes (new regions, devices, regulations, data types), breaking old model assumptions and degrading performance over time.\n    - **LLMs/agents/multimodal** – audit companies, inspect datasets, classify risk, estimate pricing, and reason across structured + unstructured evidence.\n    - **Fine-tuning** – adapt base models to our domain using ground truth. Trains models on our exact definitions of \"risky\", \"compliant\", \"buyer-ready\". \n    - **Validation loop** – ground truth → measure baseline → fine-tune → re-check precision/recall + false positives → deploy when metrics clear thresholds → monitor for drift → repeat.\n    - **Guardrails** - rules, behaviours, limits and feedback mechanims.\n\n- **Own the product backlog** — prioritise features, defects, and technical debt against adoption, satisfaction, and commercial outcomes.\n- **Drive strategy and roadmap** — work directly with leadership to set direction, then test assumptions with real user feedback rather than opinion.\n- **Define requirements with engineering and clinical teams** — understand the actual problem before building. I run workshops with engineers, designers, and clinicians so we're solving the right thing.\n- **Write stories and acceptance criteria** — break complex clinical and business needs into sprint-ready work.\n- **Support agile delivery** — \"James\" runs the sprints. I help with backlog refinement and product demos, keeping stakeholders across progress.\n- **Triage incoming work** — evaluate enhancement requests, bugs, and pain points against commercial goals and customer feedback.\n\n\n**What I design**\n\n- **System maps** — actor mapping, causal loops, and user journeys to understand how data and money actually flow through the system. I also map revenue loops and data flows (phone → secure database) to keep design, engineering, and legal on the same page.\n- **Design system** — one system that scales across consumer, corporate, and internal tools, plus pitch decks.\n- **Both sides of the marketplace** — patient-side journeys that collect data simply while meeting legal standards for enterprise sales later. Corporate-side onboarding with strict identity verification. Planning how the experience shifts as the client moves from small academic datasets to large corporate buyers.\n\n**How I approach the work** — I talk directly to stakeholders to find out what frustrates and drives them. We prototype and test before committing to code. I run sessions with legal and research partners so regulatory constraints become design features early, not late blockers. Goals are specific: _a patient with MS can sell their data in under 10 minutes without reading legal jargon._ Researcher goals are bit more nuanced, and a WIP.\n\n*Frameworks I draw on: SWOT, Porter's Five Forces, RICE, MoSCoW, Cost of Delay, GIST, JTBD, Double Diamond, User Story Mapping, ATDD, Kano.*\n\n</Accordion>\n\n<Accordion title=\"How it works\">\n\n- **Onboarding**: ID verification and clear, plain-language consent so data can be legally used\n- **Continuous tracking**: Automatic smartwatch syncing plus quick weekly questions to build a three-year health history\n- **Value exchange**: A transparent payment system so patients see exactly what they earn\n- **Enterprise portal** _(future)_: A secure dashboard where researchers search anonymised patient cohorts\n\n</Accordion>\n\n\n\n<Accordion title=\"Hard problems\">\n\n- **Two cultures, one product**: Autonomé has a privacy-focused team and a sales-focused team. I used system maps to show how corporate sales fund the privacy work, then designed separate interfaces so neither side compromises. Same database, completely different experiences.\n\n- **Three-year data gap**: Enterprise buyers need three years of continuous data. If sellers churn, the product dies. I designed passive smartwatch syncing with only two minutes of weekly input, plus a clear payment screen so users see the direct financial benefit of staying.\n\n- **Bias in medical data**: AI trained only on wealthy, tech-savvy users is dangerous. I turned this into a product rule: the corporate portal limits data access if the patient cohort doesn't meet diversity standards.\n\n- **Hidden legal complexity**: AU, SG, and US healthcare laws require intense consent flows that scare users off and inflate acquisition costs. I worked with legal to turn complex contracts into a step-by-step process in plain English.\n\n- **IP protection through partners**: Channel partners in the US create IP risk. I designed a limited partner portal: they can search and close sales, but never access underlying code or identifiable user data.\n\n</Accordion>\n\n<Accordion title=\"Design → business impact\">\n\n- **Lower acquisition cost** — simplified sign-up and ID verification. Fewer steps, more completions.\n- **Higher patient retention** — clear payment screens and plain-language consent build trust. Trust keeps users contributing data long enough for the enterprise side to work.\n- **Corporate renewal** — the enterprise portal matches how data scientists actually search and filter. If it saves them time, they renew.\n- **Ethics in the process, not just the product** — privacy principles are built into hiring, workflows, and team culture. Trust starts internally.\n\n**Next:** finalising accessibility standards for the consumer app, and testing early enterprise portal designs with APAC and US-based research partners.\n\n</Accordion>"
      },
      {
        "id": "awesome-presentation",
        "type": "stuff",
        "title": "Awesome Presentation",
        "description": "A nifty plugin to create an HTML5 presentations, right in Wordpress.",
        "date": "2014-12-12T00:00:00.000Z",
        "category": "agency",
        "tags": null,
        "url": "https://ryansnowden.com/stuff/awesome-presentation/",
        "content": "import { SquareArrowOutUpRight } from \"lucide-astro\";\nimport { Image } from \"astro:assets\";\nimport homeImage from \"../../assets/media/awesome/home.jpg\";\nimport themeImage from \"../../assets/media/awesome/theme.jpg\";\nimport bgColourImage from \"../../assets/media/awesome/bg-colour.jpg\";\nimport bgImageImage from \"../../assets/media/awesome/bg-image.jpg\";\nimport transitionImage from \"../../assets/media/awesome/transition.jpg\";\nimport helpImage from \"../../assets/media/awesome/help.jpg\";\nimport examplesImage from \"../../assets/media/awesome/examples.jpg\";\nimport transitionsImage from \"../../assets/media/awesome/transitions.jpg\";\nimport fragmentsImage from \"../../assets/media/awesome/fragments.jpg\";\nimport demoVideo from \"../../assets/media/awesome/demo.webm\";\n\n<div class=\"text-center mb-12 not-prose\">\n  <div>\n    <strong>Company:</strong> Crystal Asia (me)\n  </div>\n  <div class=\"mt-2\">\n    <span class=\"inline-block bg-gray-light text-gray-dark rounded-full px-3 py-1 text-sm font-semibold mr-2\">\n      Complexity: 9.01923/10\n    </span>\n    <span class=\"inline-block bg-gray-light text-gray-dark rounded-full px-3 py-1 text-sm font-semibold\">\n      Fun factor: 8.452/10\n    </span>\n  </div>\n</div>\n\n<div class=\"flex flex-col items-center gap-4 mb-12\">\n  <a \n    href=\"https://awesome.boxedthrills.com/\" \n    class=\"inline-flex bg-accent text-white px-6 py-3 rounded-full font-bold no-underline hover:brightness-110 transition-all items-center gap-2\" \n    target=\"_blank\" \n    rel=\"noopener noreferrer\"\n  >\n    <span>View the website</span>\n    <SquareArrowOutUpRight class=\"w-5 h-5 text-white\" aria-label=\"Opens in new tab\" />\n  </a>\n</div>\n\nAwesome Presentation is a WordPress plugin for creating slideshows. It uses RevealJS for the presentation engine and WordPress for the content editing. The beauty of using WordPress is that you can use other plugins inside the slides.\n\nThe target audience for Awesome Presentation is schools or any online learning platform where slideshows need to be created. A full website for the plugin itself was created. The plan was to sell the plugin, support it through updates, and create passive income.\n\n<Image\n  src={homeImage}\n  alt=\"Awesome Presentation home page\"\n  class=\"rounded-3xl border-0 border-slate-200 shadow-none\"\n/>\n\nThis was a decent sized project that didn't quite make it to market due to various reasons. What made it unique, is leveraging the WP plugin ecosystem to put content on slides. You could have a math formula plugin, show some code with custom syntax highlighting or embed an inline quiz or questionnaire and it would render on that slide.\n\nThe home page used the motion sensors in any device or the mouse to move the stars. A small detail but it was very immersive. Going full screen allowed you to do the presentation on a call or in-person. \n\n<video \n  src={demoVideo} \n  controls \n  class=\"rounded-3xl border-0 border-slate-200 shadow-none\"\n></video>\n\nI designed the back-end UI to be very playful. The target was educational basically. Sort of big, happy, rounded and reliable.\n\n<Image\n  src={themeImage}\n  alt=\"Awesome Presentation theme editor\"\n  class=\"rounded-3xl border-0 border-slate-200 shadow-none\"\n/>\n\nEverything should be able to be previewed in the editor, unlike the default Wordpress WYSIWYG editor which does not show how it is going to look.\n\n<Image\n  src={bgColourImage}\n  alt=\"Background colour editor\"\n  class=\"rounded-3xl border-0 border-slate-200 shadow-none\"\n/>\n\n[Background images](https://awesome.boxedthrills.com/documentation/slide-backgrounds/) can be stretched, tiled or original size.\n\n<Image\n  src={bgImageImage}\n  alt=\"Background image editor\"\n  class=\"rounded-3xl border-0 border-slate-200 shadow-none\"\n/>\n\nMedia, [transitions](https://awesome.boxedthrills.com/documentation/transitions/), colours, all had to fit within the theme being chosen. They could pick their own of course, but running it on themes allowed less to go wrong if the user didn't have much design experience.\n\n<Image\n  src={transitionImage}\n  alt=\"Transition settings\"\n  class=\"rounded-3xl border-0 border-slate-200 shadow-none\"\n/>\n\nA help menu is important incase you forget those fancy keyboard shortcuts!\n\n<Image\n  src={helpImage}\n  alt=\"Help menu\"\n  class=\"rounded-3xl border-0 border-slate-200 shadow-none\"\n/>\n\nThe idea was to create a full set of [examples](https://awesome.boxedthrills.com/examples/) which used other Wordpress plugins like maths to demonstrate it in educational purposes, but also to show it being utilised in the Wordpress plugin ecosystem.\n\n<Image\n  src={examplesImage}\n  alt=\"Example presentations\"\n  class=\"rounded-3xl border-0 border-slate-200 shadow-none\"\n/>\n\nThere are a bunch of [transitions](https://awesome.boxedthrills.com/documentation/transitions/) based on the revealJS library.\n\n<Image\n  src={transitionsImage}\n  alt=\"Available transitions\"\n  class=\"rounded-3xl border-0 border-slate-200 shadow-none\"\n/>\n\n[Fragments](https://awesome.boxedthrills.com/documentation/fragments/) are when each part loads in the same slide. I created a code style to match it to the style guide.\n\n<Image\n  src={fragmentsImage}\n  alt=\"Fragment code example\"\n  class=\"rounded-3xl border-0 border-slate-200 shadow-none\"\n/>"
      },
      {
        "id": "ba-kalman",
        "type": "stuff",
        "title": "BodyScan Analysis: Kalman Filtering",
        "description": "Reducing variability and improving accuracy through multi-capture calibration.",
        "date": "2022-12-12T00:00:00.000Z",
        "category": "product",
        "tags": null,
        "url": "https://ryansnowden.com/stuff/ba-kalman/",
        "content": "import { SquareArrowOutUpRight } from \"lucide-astro\";\nimport { Image } from \"astro:assets\";\nimport autoCalibrationImage from \"../../assets/media/body-analysis/Auto-Calibration-Improved-1-scaled.png\";\nimport KalmanFilterCharts from \"../../components/interactive/KalmanFilterChartsWrapper.astro\";\n\n<div class=\"text-center mb-12 not-prose\">\n  <div>\n    <strong>Company:</strong> Advanced Health Intelligence (AHI)\n  </div>\n  <div class=\"mt-2\">\n    <span class=\"inline-block bg-gray-light text-gray-dark rounded-full px-3 py-1 text-sm font-semibold mr-2\">\n      Complexity: 9.01923/10\n    </span>\n    <span class=\"inline-block bg-gray-light text-gray-dark rounded-full px-3 py-1 text-sm font-semibold\">\n      Fun factor: 8.452/10\n    </span>\n  </div>\n</div>\n\n<div class=\"flex flex-col items-center gap-4 mb-12\">\n  <a \n    href=\"https://www.figma.com/design/qUTwjP9fLSg7cYHCrE8hHe/Kalman-Filtering-2.0.25?node-id=0-1&p=f&t=Rl4xMaFvmBzuMuK4-11\" \n    class=\"inline-flex bg-accent text-white px-6 py-3 rounded-full font-bold no-underline hover:brightness-110 transition-all items-center gap-2\" \n    target=\"_blank\" \n    rel=\"noopener noreferrer\"\n  >\n    <span>View the design (Figma)</span>\n    <SquareArrowOutUpRight class=\"w-5 h-5 text-white\" aria-label=\"Opens in new tab\" />\n  </a>\n</div>\n\n## What did I do?\n\n- Discovery, research, design, prototypes, documentation.\n\n## Scope & Methodology\n\n- Led the end-to-end product lifecycle, encompassing discovery, quantitative research, interaction design, and technical documentation.\n- Collaborated with engineering teams to translate complex mathematical concepts into accessible user interfaces.\n\n## The Solution: Recursive Estimation\n\n- Implemented Kalman filtering (a recursive algorithm utilised to estimate unknown variables) to mitigate signal noise and enhance the precision of body composition predictions.\n- Transitioned the data model from single-point measurement to a multi-measurement aggregation, allowing for outlier detection and stochastic smoothing of results.\n\n<KalmanFilterCharts />\n\n## UX Challenges & Research\n\n- Addressed the rigorous usability trade-offs required by the algorithm; the necessity for sequential triple-scans introduced significant friction and physical fatigue (Hick's Law).\n- Conducted time-on-task studies to quantify the impact of the extended workflow on user retention and satisfaction.\n- Overhauled instructional design and on-screen guidance to scaffold the user through the intensified capture process and mitigate the increased barrier to entry.\n- To help familiarise users with the concept, encourage regular scans, and communicate 'the why', the concept of the '_calibration phase_' was introduced throughout copy.\n\n<Image\n  src={autoCalibrationImage}\n  alt=\"Example of auto calibration\"\n  class=\"w-full max-w-full\"\n/>\n  \n## Error Handling & Strategic Roadmap\n\n- Identified critical failure states where cumulative error forced workflow restarts, prioritising these friction points for future technical mitigation.\n- Defined the roadmap for a 'Confidence Engine' to parse environmental telemetry (lighting, pose, background complexity), reducing reliance on perfect user execution and addressing 'Garbage In, Garbage Out' (GIGO) constraints."
      },
      {
        "id": "ba-privacy",
        "type": "stuff",
        "title": "Body Analysis: Privacy",
        "description": "Masking Humans using real-time segmentation.",
        "date": "2021-12-12T00:00:00.000Z",
        "category": "product",
        "tags": null,
        "url": "https://ryansnowden.com/stuff/ba-privacy/",
        "content": "import { SquareArrowOutUpRight } from \"lucide-astro\";\nimport { Image } from \"astro:assets\";\nimport maskingHumanImage from \"../../assets/media/body-analysis/masking-human-1024x1024.webp\";\nimport performanceImage from \"../../assets/media/body-analysis/performance-1024x529.png\";\nimport cleanJointsImage from \"../../assets/media/body-analysis/clean-joints-1-scaled.png\";\n\n\n<div class=\"text-center mb-12 not-prose\">\n  <div>\n    <strong>Company:</strong> Advanced Health Intelligence (AHI)\n  </div>\n  <div class=\"mt-2\">\n    <span class=\"inline-block bg-gray-light text-gray-dark rounded-full px-3 py-1 text-sm font-semibold mr-2\">\n      Complexity: 8.876/10\n    </span>\n    <span class=\"inline-block bg-gray-light text-gray-dark rounded-full px-3 py-1 text-sm font-semibold\">\n      Fun factor: 9.976/10\n    </span>\n  </div>\n</div>\n\n## What did I do?\n\n- Discovery, research, designs, iOS prototype (Xcode), presentation, documentation.\n\n## What is it?\n\n- A psychological approach to address privacy concerns, by not showing the video, but rather a real-time silhouette of their body.\n- Bonus features: A competitor differentiator through strong visual appearance and customer branding options.\n\n<Image\n  src={maskingHumanImage}\n  alt=\"Example of human masking for privacy: stylised silhouette art\"\n  class=\"w-full max-w-full\"\n/>\n\n<span class=\"block text-center text-sm text-gray-600 italic my-2\" aria-live=\"polite\">**Masking humans**: It looks like those apple iPod ads, doesn't it?</span>\n\n## The problems\n\nThe scan requires people to be in form fitting clothing. We found that some people just got into their underwear, presenting some problems when viewing themselves on a screen:\n\n1. They question the privacy and security.\n2. They don't like what they see (themselves, _partially naked_) and find that invasive and then don't like doing it (basically a mirror).\n\n## How is it done?\n\nReal-time Matte Effects using Apple [VisionFramework](https://developer.apple.com/documentation/vision)\n\n<Image\n  src={performanceImage}\n  alt=\"Performance of the human masking algorithm\"\n  class=\"w-full max-w-full\"\n/>\n  \n<span class=\"block text-center text-sm text-gray-600 italic my-2\" aria-live=\"polite\">**Mask modes**: the higher the accuracy, the slower the performance.</span>\n\n## Major challenges\n\n- Device performance impacts the accuracy of the masking layer.\n- On low-end devices, this may also impact the on-device inspection, slowing down the overall experience.\n\n<Image\n  src={cleanJointsImage}\n  alt=\"Example of clean joints\"\n  class=\"w-full\"\n/>\n\n<span class=\"block text-center text-sm text-gray-600 italic my-2\" aria-live=\"polite\">\n  Check out these clean joints…\n</span>\n\n## Major wins\n\n- **Full image/video backgrounds**\n- **Clean real-time joints** by using coloured masks, the joints can be enlarged, create a high contrast, and improve legibility from a distance.\n- **Reduced visual clutter** in determining limbs into outline.\n- **Alternate capture through fit-frame modelling** (no outlines)."
      },
      {
        "id": "beachbody",
        "type": "stuff",
        "title": "Beachbody",
        "description": "Fitness brand visual identity work.",
        "date": "2020-12-12T00:00:00.000Z",
        "category": "agency",
        "tags": null,
        "url": "https://ryansnowden.com/stuff/beachbody/",
        "content": "import ImageSlideshow from \"../../components/interactive/Slideshow.astro\";\nimport beachbody3 from \"../../assets/media/beachbody/beachbody-3.jpeg\";\nimport beachbody4 from \"../../assets/media/beachbody/beachbody-4.jpeg\";\nimport beachbody5 from \"../../assets/media/beachbody/beachbody-5.jpeg\";\nimport beachbody6 from \"../../assets/media/beachbody/beachbody-6.jpeg\";\nimport beachbody7 from \"../../assets/media/beachbody/beachbody-7.jpeg\";\nimport beachbody8 from \"../../assets/media/beachbody/beachbody-8.jpeg\";\nimport beachbody9 from \"../../assets/media/beachbody/beachbody-9.jpeg\";\nimport beachbody10 from \"../../assets/media/beachbody/beachbody-10.jpeg\";\nimport beachbody11 from \"../../assets/media/beachbody/beachbody-11.jpeg\";\nimport beachbody12 from \"../../assets/media/beachbody/beachbody-12.jpeg\";\nimport beachbody13 from \"../../assets/media/beachbody/beachbody-13.jpeg\";\n\n<div class=\"text-center mb-12 not-prose\">\n  <div>\n    <strong>Company:</strong> Advanced Health Intelligence (AHI)\n  </div>\n  <div>\n    <strong>Client:</strong> Beachbody\n  </div>\n</div>\n\nThis wasn't printed; it was a digital deck. The circumstances put pressure on the delivery. I had to create it during the Christmas–January period before flying to CES in Las Vegas. It wasn't entirely finished, as I had other priorities and the meeting was after CES. Instead, I was in hotel rooms late at night trying to finish it off. To make matters worse, I got sick, very sick. This was during the onset of COVID-19 before we knew it was COVID and the world shut down, so maybe it was COVID. #coolstorybro.\n\nAnyway, I had two versions lined up and presented in person to the CEO on a cocktail of drugs from CVS. The first version didn't hit, as the visualisation was 'underwhelming,' so I pulled out version two and it was closer to the mark.\n\n<strong>Themes</strong>: Depth, dimension.\n\n<ImageSlideshow images={[beachbody3, beachbody4, beachbody5, beachbody6, beachbody7, beachbody8, beachbody9, beachbody10, beachbody11, beachbody12, beachbody13]} />"
      },
      {
        "id": "biometric-health-assessment",
        "type": "stuff",
        "title": "Biometric Health Assessment",
        "description": "A clinical-like health assessment consisting of multiple stages that is designed to assist clinicians and upstream providers with combined risk analysis of chronic diseases.",
        "date": "2024-12-12T00:00:00.000Z",
        "category": "product",
        "tags": null,
        "url": "https://ryansnowden.com/stuff/biometric-health-assessment/",
        "content": "import { SquareArrowOutUpRight } from \"lucide-astro\";\n\n<div class=\"text-center mb-12 not-prose\">\n  <div>\n    <strong>Company:</strong> Advanced Health Intelligence (AHI)\n  </div>\n  <div class=\"mt-2\">\n    <span class=\"inline-block bg-gray-light text-gray-dark rounded-full px-3 py-1 text-sm font-semibold mr-2\">\n      Complexity: 9.28/10\n    </span>\n    <span class=\"inline-block bg-gray-light text-gray-dark rounded-full px-3 py-1 text-sm font-semibold\">\n      Fun factor: 9.008/10\n    </span>\n  </div>\n</div>\n\n\n<div class=\"flex flex-col items-center gap-4 mb-12\">\n  <a \n    href=\"https://www.figma.com/design/vZl0KJHzK581p7LO9qKExb/BHA-2.0.25?node-id=54699-25840&p=f&t=jzO7TM53TXtChLWG-11\" \n    class=\"inline-flex bg-accent text-white px-6 py-3 rounded-full font-bold no-underline hover:brightness-110 transition-all items-center gap-2\" \n    target=\"_blank\" \n    rel=\"noopener noreferrer\"\n  >\n    <span>View the design (Figma)</span>\n    <SquareArrowOutUpRight class=\"w-5 h-5 text-white\" aria-label=\"Opens in new tab\" />\n  </a>\n</div>\n\n## Project details\n\n- **Platform**: iOS, Android\n- **Design system management**: [Supernova.io](https://supernova.io/)\n- **Product type**: B2B SaaS, SDK, White label app\n- **Design system**: [Material 3](https://m3.material.io/), [UCDL](/stuff/ucdl)\n- **Design tool**: Figma\n\n## What is it?\n\nA clinical-like health assessment consisting of multiple stages that is designed to assist clinicians and upstream providers with combined risk analysis of chronic diseases.\n\n## Assessment stages\n\n1. **Cardiovascular Health:** A 30 second face scan that measures heart rate, blood pressure, heart attack, stroke.\n2. **Health at Rest:** Lying down for 2 minutes and then conducting a 30 second finger scan to measure resting heart rate.\n3. **Body Analysis:** A 3-5 minute body scan to measure body circumference, body fat, obesity, central obesity.\n4. **Fitness Evaluation:** A 3-5 minute physical step test and then a 30 second finger scan to measure maximum heart rate, and heart rate recovery.\n\n## What do you need?\n\n- **Face & Body Scan:** Desk, chair, table.\n- **Health at Rest:** A bed or couch.\n- **Fitness Evaluation:** Some stairs or a riser step.\n\n## How long does it take?\n\n- **First-time**: 30 minutes, split over a couple of days.\n- **Ongoing**: About 15 minutes.\n\n## Use cases\n\n- Health insurance underwriting, dispensary of pharmaceutical drugs (e.g. statins, semaglutide), telehealth, population risk, corporate wellness.\n\n## What did I do?\n\n**Hands on:**\n\n- Initial MVD (*Minimum Viable Demo*), and MVP (*Minimum Viable Product*)\n- My **responsibility** varied over time, but I was responsible for the 'entire app'. \n- This included research, stakeholder mapping, persona mapping, user journeys, user testing, prototypes, developer handoff, the scans (each stage), scan guides, results, product docs, marketing assets, and video guides/promos. \n\n**Minds on:**\n\n- Worked with the MLCV team and engineering to validate model outputs at each stage of the assessment.\n- Defined what \"good enough\" looked like for each model, based on the clinical, commercial, and reputational cost of getting it wrong.\n- Defined safety guardrails for the system.\n- Evaluated model outputs against medical reference data and identified where accuracy dropped around across body types, scan quality, questionnaire inputs, and exemption paths.\n- Tested the full assessment pipeline end-to-end, confirming each stage produced reliable inputs for the next and that final risk classifications held up.\n- Validated edge cases. Cancellations, incomplete assessments, exemptions, etc, to make sure the system behaved safely outside the expected flow.\n- Used validation and UX findings to adjust thresholds, decision rules, and workflow logic, separating model problems from design, data quality, and integration issues.\n- Translated validation results into product and engineering priorities, so the team could focus model improvements on what mattered most to users and the business.\n\n## Major challenges\n\n- **Product**: High drop off due to usability oversight, notification & message fatigue, regulation and app store guidelines, customisation and theming, no localisation.\n- **Product complexity:** High complexity and barriers to change due to emerging technology innovation cycles. i.e. Working with data science and training models, then testing is *expensive*.\n- **Organisational**: Design & features by leadership (top down hierarchy), misaligned reward systems, managerial self-interest, team silos, misaligned commercial messaging."
      },
      {
        "id": "body-analysis",
        "type": "stuff",
        "title": "Body Analysis",
        "description": "Accurate and repeatable body composition and circumference using a smartphone.",
        "date": "2021-12-12T00:00:00.000Z",
        "category": "product",
        "tags": null,
        "url": "https://ryansnowden.com/stuff/body-analysis/",
        "content": "import { SquareArrowOutUpRight } from \"lucide-astro\";\nimport { Image } from \"astro:assets\";\nimport video1 from \"../../assets/media/shared/0000000lE7W000000000wW-2.mp4\";\nimport video2 from \"../../assets/media/body-analysis/0000000lE7W000000000wW-6.mp4\";\nimport video3 from \"../../assets/media/body-analysis/Body-Analysis-Dev-4g-hevc.mov\";\nimport bodyAnalysisImage from \"../../assets/media/body-analysis/0000000lE7W000000000zV-1-scaled.png\";\n\n<div class=\"text-center mb-12 not-prose\">\n  <div>\n    <strong>Company:</strong> Advanced Health Intelligence (AHI)\n  </div>\n  <div class=\"mt-2\">\n    <span class=\"inline-block bg-gray-light text-gray-dark rounded-full px-3 py-1 text-sm font-semibold mr-2\">\n      Complexity: 9.7222/10\n    </span>\n    <span class=\"inline-block bg-gray-light text-gray-dark rounded-full px-3 py-1 text-sm font-semibold\">\n      Fun factor: 8.334/10\n    </span>\n  </div>\n</div>\n\n\n<div class=\"flex flex-col items-center gap-4 mb-12\">\n  <a \n    href=\"https://www.figma.com/design/ccbQGhGRxsMV4LD991jH5Q/Body-Analysis-2.0.25?m=auto&t=nisiypsXjPh7SEYE-1\" \n    class=\"inline-flex bg-accent text-white px-6 py-3 rounded-full font-bold no-underline hover:brightness-110 transition-all items-center gap-2\" \n    target=\"_blank\" \n    rel=\"noopener noreferrer\"\n  >\n    <span>View the design (Figma)</span>\n    <SquareArrowOutUpRight class=\"w-5 h-5 text-white\" aria-label=\"Opens in new tab\" />\n  </a>\n</div>\n\n## Project details\n\n- **Platform**: iOS, Android\n- **Design system management**: Supernova.io\n- **Design system**: Material 3, UCDL\n- **Product type**: B2B SaaS / SDK\n- **Design tool**: Figma\n- **Roles**: Chief Design Officer, UX Researcher, Product Manager, Product Lead, Customer Support, Video \\[Director, Producer, Editor\\].\n\n## What is it, and what did you do?\n\n- Accurate and repeatable body composition and circumference using a smartphone.\n- Multiple responsibilities: UX & market research, user testing, developer handoff, prototypes, app design, scan results, developer docs, product docs, marketing assets (print, digital), video guides/promos, promotional decks, multi-day film shoot, training.\n\n## Project context\n\n- Developed a mobile-based body scanning feature leveraging computer vision to assess user posture and body composition in real-time.\n- Aimed to bridge the gap between clinical physical assessments and accessible at-home monitoring for the health and wellness vertical.\n- Worked with the MLCV team and engineering to validate model outputs.\n- Defined safety guardrails.\n\n## Biometric outputs\n\n- Chest, hips, waist, and thigh, body fat percentage, waist-hip ratio, waist-height ratio, obesity risk, central obesity risk.\n\n**Body Analysis: Involvement and updates**\n\nI researched and designed the technology through all major milestones, including:\n\n1. **Two person experience → single person experience.**\n    - New guide, Phone Alignment (interactive UI interface), Staged countdowns (UI), error states, failure states, cloud segmentation.\n\n2. **Static capture and outline → Dynamic capture and scaled outlines**\n    - On-device pose checking, phone height detection, real-time messaging (and errors), failure states, on-device segmentation.\n\nThis meant being heavily involved with engineering, ensuring the UX was being improved whilst accuracy and repeatability was maintained. Whilst the front-end undertook a significant change, the AI models also transformed from cloud to on-device, so that no images leave the device.\n\n<div class=\"mw-[calc(100vw-2rem)] md:w-[calc(100vw-200px)] max-w-[1020px] relative left-1/2 -translate-x-1/2 overflow-hidden\">\n  <div class=\"grid grid-cols-3 gap-3 md:gap-6\">\n      <div class=\"flex flex-col min-w-0 overflow-hidden\">\n        <video \n          src={video1} \n          controls \n          autoPlay={false}\n          class=\"!static !left-auto !transform-none !w-full !max-w-full mb-3 aspect-[9/16] object-cover\"\n        >\n          Sorry, your browser doesn't support embedded videos.\n        </video>\n        <span class=\"text-center font-medium text-xs md:text-sm\">Version 1x</span>\n      </div>\n      <div class=\"flex flex-col min-w-0 overflow-hidden\">\n        <video \n          src={video2} \n          controls \n          autoPlay={false}\n          class=\"!static !left-auto !transform-none !w-full !max-w-full mb-3 aspect-[9/16] object-cover\"\n        >\n          Sorry, your browser doesn't support embedded videos.\n        </video>\n        <span class=\"text-center font-medium text-xs md:text-sm\">MVP (v2)</span>\n      </div>\n      <div class=\"flex flex-col min-w-0 overflow-hidden\">\n        <video \n          src={video3}\n          controls\n          autoPlay={false}\n          class=\"!static !left-auto !transform-none !w-full !max-w-full mb-3 aspect-[9/16] object-cover\"\n        >\n          Sorry, your browser doesn't support embedded videos.\n        </video>\n        <span class=\"text-center font-medium text-xs md:text-sm\">Dev-v2</span>\n      </div>\n  </div>\n</div>\n\n\n## Use cases & user archetypes\n\n- The biometric outputs allow you to predict Obesity, placing it directly in digital health, telehealth and insurance pipelines.\n- A less effective use falls into apparel and fitness.\n- It is also combined with other scans ([like the BHA](https://rs.boxedthrills.com/2025/08/24/bha/)) and patient data to contribute to further predictive health markers.\n\n## Major challenges & constraints\n\n- **Environmental variance:** Mitigating computer vision failures caused by poor domestic lighting and low-contrast clothing against complex backgrounds.\n- **Privacy & trust:** Overcoming user hesitation regarding capturing and processing semi-nude or form-fitting imagery on a cloud-based architecture.\n- **Instructional clarity:** designing an intuitive guidance system (visual and haptic) to ensure users stand at the correct distance and angle without frustration.\n\n<div class=\"mw-[calc(100vw-2rem)] md:w-[calc(100vw-200px)] max-w-[1020px] relative left-1/2 -translate-x-1/2 overflow-hidden\">\n  <div class=\"w-full max-w-[672px] mx-auto\">\n    <Image\n      src={bodyAnalysisImage}\n      alt=\"Body Analysis App - sample screenshot\"\n      class=\"w-full h-auto object-cover\"\n    />\n  </div>\n</div>\n\n\n## UX design & research frameworks\n\n- **Technology Acceptance Model (TAM):** Utilised to analyse and optimise perceived usefulness and ease of use, directly influencing the onboarding flow design.\n- **Nielsen's 10 Usability Heuristics:** specifically 'Match between system and the real world' to align scanning instructions with natural human mirroring behaviours.\n- **Double Diamond Process:** strictly followed the Discover/Define phases to narrow down the MVP scope from 'full medical diagnosis' to 'wellness indicators'.\n- **System Usability Scale (SUS):** Conducted post-testing analysis yielding a score of 82, validating the iterative improvements made to the scanning reticle UI.\n\n## Outcomes\n\n- Achieved a 40% reduction in scan failure rates through the implementation of real-time AR guidance.\n- Validated the 'privacy-first' local processing model, which tested significantly higher for user trust during qualitative interviews.\n- New opportunities: \"[**Privacy mode**](https://rs.boxedthrills.com/2025/07/23/body-analysis-privacy/)"
      },
      {
        "id": "botanical-maylands",
        "type": "stuff",
        "title": "Botanical Maylands",
        "description": "Kind on the eyes, maybe not so kind on the wallet.",
        "date": "2016-12-12T00:00:00.000Z",
        "category": "agency",
        "tags": null,
        "url": "https://ryansnowden.com/stuff/botanical-maylands/",
        "content": "import { Image } from \"astro:assets\";\nimport home from \"../../assets/media/botanical/home.jpg\";\nimport apartments from \"../../assets/media/botanical/apartments.png\";\nimport design from \"../../assets/media/botanical/design.jpg\";\nimport location from \"../../assets/media/botanical/location.jpg\";\nimport team from \"../../assets/media/botanical/team.jpg\";\n\n<div class=\"text-center mb-12 not-prose\">\n  <div>\n    <strong>Company:</strong> Crush\n  </div>\n  <div>\n    <strong>Client:</strong> WA Tourism\n  </div>\n</div>\n\nA classic and contemporary design that aligned with existing branding material.\n\nA cookie-cutter property website using Wordpress, but with a unique colour palette and composition. The Divi plugin was used to piece together and meet deadlines on time.\n\n<Image\n  src={home}\n  alt=\"Botanical Home Page\"\n  class=\"rounded-3xl border-2 border-slate-200 shadow-none\"\n/>\n\n<Image\n  src={apartments}\n  alt=\"Botanical Apartments\"\n  class=\"rounded-3xl border-2 border-slate-200 shadow-none\"\n/>\n\n<Image\n  src={design}\n  alt=\"Botanical Design Concept\"\n  class=\"rounded-3xl border-2 border-slate-200 shadow-none\"\n/>\n\n<Image\n  src={location}\n  alt=\"Botanical Location\"\n  class=\"rounded-3xl border-2 border-slate-200 shadow-none\"\n/>\n\n<Image\n  src={team}\n  alt=\"Botanical Team\"\n  class=\"rounded-3xl border-2 border-slate-200 shadow-none\"\n/>"
      },
      {
        "id": "chs",
        "type": "stuff",
        "title": "Cardiovascular Health Scan",
        "description": "Multi-platform vital signs and cardiovascular health risks using facial blood flow analysis.",
        "date": "2020-12-12T00:00:00.000Z",
        "category": "product",
        "tags": null,
        "url": "https://ryansnowden.com/stuff/chs/",
        "content": "import { SquareArrowOutUpRight } from \"lucide-astro\";\nimport video1 from \"../../assets/media/shared/0000000lE7W000000000wW-2.mp4\";\nimport ImageTooltip from \"../../components/lightbox/ImageTooltip.astro\";\nimport predatorVisionImg from \"../../assets/media/shared/predator-vision.jpg\";\n\n<div class=\"text-center mb-12 not-prose\">\n  <div>\n    <strong>Company:</strong> Advanced Health Intelligence (AHI)\n  </div>\n  <div class=\"mt-2\">\n    <span class=\"inline-block bg-gray-light text-gray-dark rounded-full px-3 py-1 text-sm font-semibold mr-2\">\n      Complexity: 7.021/10\n    </span>\n    <span class=\"inline-block bg-gray-light text-gray-dark rounded-full px-3 py-1 text-sm font-semibold\">\n      Fun factor: 9.285/10\n    </span>\n  </div>\n</div>\n\n<div class=\"flex flex-col items-center gap-4 mb-12\">\n  <a \n    href=\"https://www.figma.com/design/6h8XMO73VGWipnwrvOwzFE/Cardiovascular-Health-2.0.25?m=auto&t=nisiypsXjPh7SEYE-1\" \n    class=\"inline-flex bg-accent text-white px-6 py-3 rounded-full font-bold no-underline hover:brightness-110 transition-all items-center gap-2\" \n    target=\"_blank\" \n    rel=\"noopener noreferrer\"\n  >\n    <span>View the design (Figma)</span>\n    <SquareArrowOutUpRight class=\"w-5 h-5 text-white\" aria-label=\"Opens in new tab\" />\n  </a>\n</div>\n\n## What is it?\n\n- _Otherwise known as FaceScan_, it's a multi-platform vital signs and cardiovascular health risks using facial blood flow analysis.\n- It's also a 3rd party scan technology licensed by [Nuralogix](https://www.nuralogix.ai/).\n\n## What did I do?\n\n- I didn't work on the tech (that was the Nuralogix team), but I did all the integration docs, all designs, tutorials and marketing videos.\n\n## How does it work?\n\nIt looks under your skin like the <ImageTooltip text=\"Predator vision\" image={predatorVisionImg} alt=\"Predator thermal vision showing blood flow patterns\" />. Cool research papers below:\n\n- [Transdermal optical imaging revealed different spatiotemporal patterns of facial cardiovascular activities.](https://www.nuralogix.ai/wp-content/uploads/2021/06/transdermal-optical-imaging-revealed-different-spatiotemporal-patterns-of-facial-cardiovascular-activities.pdf)\n- [Transdermal Optical Imaging Reveal Basal Stress via Heart Rate Variability Analysis: A Novel Methodology Comparable to Electrocardiography](https://www.nuralogix.ai/wp-content/uploads/2021/06/transdermal-optical-imaging-reveal-basal-stress-via-heart-rate-variability-analysis-a-novel-methodology-comparable-to-electrocardiography.pdf)\n\n## What do you need?\n\n- Table, chair, light, camera, and a person.\n\n## How is it used?\n\n- Health Insurance, corporate wellness, telehealth, preventative health.\n- **Combined health metrics:** _Blood pressure_ and, to some extent, the risk predictions for cardiovascular disease, heart attack, and stroke. This is used in [the BHA](https://rs.boxedthrills.com/2025/08/24/bha/) algorithms.\n\n## Challenges\n\n- **Data Inaccuracy, unreliability:** Anxiety, facial age, and blood glucose, are considered inaccurate. Breathing rate was also unreliable.\n- **Measurement Discrepancy:** The out-of-the-box blood pressure measurement differs significantly from clinical guidelines.\n- **App Store Guidelines, Regulatory Compliance**: Google and Apple have stringent rules for medical apps (can't show blood pressure!).\n- **UI Customisation:** The option to create a custom user interface was available but never utilised. [I still did the UCDL though](https://rs.boxedthrills.com/2025/07/23/unified-capture-design-language/). Stretch goals!\n- **Skin tone**: Dark skin tones (Fitzpatrick IV, V) were not properly factored into the lighting scene inspection and capture process."
      },
      {
        "id": "dvg",
        "type": "stuff",
        "title": "DVG Automotive Group",
        "description": "An automotive industry leader that needed pages that convert.",
        "date": "2017-12-12T00:00:00.000Z",
        "category": "agency",
        "tags": null,
        "url": "https://ryansnowden.com/stuff/dvg/",
        "content": "import { Image } from \"astro:assets\";\nimport listingImage from \"../../assets/media/dvg/listing.jpg\";\nimport detailImage from \"../../assets/media/dvg/detail.jpg\";\nimport mobileImage from \"../../assets/media/dvg/mobile.png\";\n\n<div class=\"text-center mb-12 not-prose\">\n  <div>\n    <strong>Company:</strong> Glide Agency\n  </div>\n  <div>\n    <strong>Client:</strong> DVG Automotive Group\n  </div>\n</div>\n\nA fun project design wise, but also on the technical side where I worked with the fantastic CraftCMS to hook up with the CarSales API (via FeedMe plugin) and build a responsive search engine.\n\nSynchronising from the CarSales API created problems. Their API wasn't up to date, and I didn't have access to the new one (despite pushing). It would time me out, and add the server to a block list. It would need to grab all meta-data, and images, for thousands of vehicles.\n\nThe car industry audience segment is price sensitive. It must appear not too expensive and not too cheap either. DVG was representing many brands and the goal was also to be trusted. The visual aesthetic and funnel was intentionally chosen.\n\nIt had to sync and sell. It did both.\n\n<Image\n  src={listingImage}\n  alt=\"Vehicle listing page\"\n  class=\"rounded-3xl border-2 border-slate-200 shadow-none\"\n/>\n\nThe goal of building this in Craft vs the exisiting Wordpress website is to start creating and intelligent landing page structure with smart end-points. We could do it by brand, dealership location, price points, and other campaigns that were going on at that time.\n\n<Image\n  src={detailImage}\n  alt=\"Vehicle detail page\"\n  class=\"rounded-3xl border-2 border-slate-200 shadow-none\"\n/>\n\nOf course, fully responsive. Fast, simple, reliable, convert, sell cars, make money.\n\n<Image\n  src={mobileImage}\n  alt=\"Mobile responsive view\"\n  class=\"rounded-3xl border-2 border-slate-200 shadow-none\"\n/>"
      },
      {
        "id": "experience-perth",
        "type": "stuff",
        "title": "Experience Perth",
        "description": "Landing pages, Webflow. Landing pages, A/B Testing, and Good Times.",
        "date": "2017-12-12T00:00:00.000Z",
        "category": "agency",
        "tags": null,
        "url": "https://ryansnowden.com/stuff/experience-perth/",
        "content": "import { Image } from \"astro:assets\";\nimport design1Image from \"../../assets/media/experience-perth/design1.jpg\";\nimport design2Image from \"../../assets/media/experience-perth/design2.jpg\";\n\n<div class=\"text-center mb-12 not-prose\">\n  <div>\n    <strong>Company:</strong> Glide Agency\n  </div>\n  <div>\n    <strong>Client:</strong> WA Tourism\n  </div>\n</div>\n\nTwo designs for Experience Perth (WA Tourism) landing pages. With not a lot to go on, I basically 'made up' a lot of the content for Events (posters, article titles, etc). Quite fun and pleased with the results!\n\n<Image\n  src={design1Image}\n  alt=\"Experience Perth design concept 1\"\n  class=\"rounded-3xl border-0 border-slate-200 shadow-none\"\n/>\n\n<Image\n  src={design2Image}\n  alt=\"Experience Perth design concept 2\"\n  class=\"rounded-3xl border-0 border-slate-200 shadow-none\"\n/>"
      },
      {
        "id": "fyg",
        "type": "stuff",
        "title": "The Foundation Years Group (FYG)",
        "description": "M&A pitch between BabyBunting and G8 Education.",
        "date": "2024-12-20T00:00:00.000Z",
        "category": "other",
        "tags": null,
        "url": "https://ryansnowden.com/stuff/fyg/",
        "content": "import ImageSlideshow from \"../../components/interactive/Slideshow.astro\";\nimport fyg1 from \"../../assets/media/fyg/1.jpg\";\nimport fyg2 from \"../../assets/media/fyg/2.jpg\";\nimport fyg3 from \"../../assets/media/fyg/3.jpg\";\nimport fyg4 from \"../../assets/media/fyg/4.jpg\";\nimport fyg5 from \"../../assets/media/fyg/5.jpg\";\nimport fyg6 from \"../../assets/media/fyg/6.jpg\";\nimport fyg7 from \"../../assets/media/fyg/7.jpg\";\nimport fyg8 from \"../../assets/media/fyg/8.jpg\";\nimport fyg9 from \"../../assets/media/fyg/9.jpg\";\nimport fyg10 from \"../../assets/media/fyg/10.jpg\";\nimport fyg11 from \"../../assets/media/fyg/11.jpg\";\nimport fyg12 from \"../../assets/media/fyg/12.jpg\";\n\n<div class=\"text-center mb-12 not-prose\">\n    **Company**: Me / **Client**: Also Me\n</div>\n\nAs part of my MBA unit \"Financial Analysis\", I was tasked with pitching a speculative merger between Baby Bunting and G8 Education. While I was initially sceptical about the fit, I looked beyond the standard curriculum to find a strategic angle that made sense.\n\nMy breakthrough came when analysing the **Cash Conversion Cycle (CCC)**. The CCC measures how quickly a company turns its investments in inventory and resources back into cash. Because G8 Education is service-based and collects fees upfront, it has a much faster CCC than Baby Bunting's retail model.\n\nI proposed using G8's consistent liquidity to buffer Baby Bunting's volatility and lower the overall financial risk. This concept evolved into me creating a new brand, **The Foundational Years Group (FYG)**, which is supported by a distinct mission, vision, and strategic roadmap.\n\n<div class=\"w-[calc(100vw-2rem)] md:w-[calc(100vw-200px)] max-w-[1020px] relative left-1/2 -translate-x-1/2 mb-6\">\n  <ImageSlideshow images={[fyg1, fyg2, fyg3, fyg4, fyg5, fyg6, fyg7, fyg8, fyg9, fyg10, fyg11, fyg12]} imageBorder={true} />\n</div>\n\n## What is it?\n\nThe Foundation Years Group (FYG) is a proposed strategic merger between Baby Bunting Group Limited and G8 Education Limited. This initiative creates a vertically integrated \"Category of One\" ecosystem within the Australian family services sector. By consolidating Australia's premier specialty baby goods retailer with a leading early childhood education (ECE) provider, the entity captures the entire parenting lifecycle, from the prenatal stage through to primary school commencement.\n\n## What problems does it fix?\n\nThe merger addresses several structural and financial inefficiencies inherent in the standalone entities:\n\n- **Customer Acquisition Costs (CAC):** It bypasses expensive digital marketing by using Baby Bunting's prenatal data to feed G8's enrolment pipeline.\n    \n- **Retail Volatility:** It counterbalances the cyclical nature of retail with the stable, recurring revenue streams of the childcare sector.\n    \n- **The \"Three-Year Cliff\":** It extends the customer lifetime value (LTV) beyond the toddler years, maintaining the retail relationship until the child is five.\n    \n- **Supply Chain Margin Leakage:** It eliminates third-party distributor margins by verticalising the supply of consumables (nappies, wipes, and cleaning goods) through Baby Bunting's internal B2B wholesale arm.\n    \n\n## How is it built and why?\n\nThe strategic architecture is built on the **Customer Intimacy** value discipline. The integration is driven by a unified data architecture that allows for anticipatory service delivery based on the child's developmental stage.\n\nTo manage the merger of two distinct corporate cultures, a **Federated Stewardship Governance** model is utilised. This ensures:\n\n- **Retail Division:** Operates under efficiency-driven performance metrics.\n    \n- **Education Division:** Follows stewardship principles to protect pedagogical integrity and clinical safety, ensuring the \"duty of care\" is never compromised by commercial expediency.\n    \n- **Shared Services:** Centralises HR, IT, and procurement to drive operational excellence and reduce the group's overall cost to serve.\n    \n\n## How should it be funded?\n\nThe merger is supported by a projected annual EBITDA uplift of **$33M-$50M**, which provides a robust return on investment (ROI). Funding and value creation are derived from:\n\n- **Occupancy Optimisation:** A 2% lift in childcare occupancy via retail referrals generates approximately $21M in incremental EBIT.\n    \n- **Supply Chain Arbitrage:** Shifting G8's procurement to internal retail channels captures an estimated $10M in margins previously paid to external distributors.\n    \n- **Marketing Efficiency:** Reducing external ad spend through owned-channel cross-promotion yields up to $5M in savings.\n    \n- **Capital Efficiency:** Co-locating retail \"hubs\" with childcare centres reduces facility costs and improves return on invested capital (ROIC).\n    \n\n## Future Outlook: Parenting-as-a-Service (PaaS)\n\nThe long-term strategic direction involves a transition to a **Blue Ocean** subscription model. This \"Circular Nursery\" concept allows families to lease high-ticket hardware (prams and capsules) which are professionally sanitised and re-leased, reducing landfill waste. \n\nThis aligns the group with UN Sustainable Development Goals regarding responsible consumption and quality education, transforming the business from a transactional retailer into a holistic developmental partner."
      },
      {
        "id": "juniper",
        "type": "stuff",
        "title": "Juniper Aged Care",
        "description": "Aged care accommodation and support services. Rebrand, full iA, site build, Craft CMS.",
        "date": "2017-12-12T00:00:00.000Z",
        "category": "agency",
        "tags": null,
        "url": "https://ryansnowden.com/stuff/juniper/",
        "content": "import { Image } from \"astro:assets\";\nimport home from \"../../assets/media/juniper/home.jpg\";\nimport start from \"../../assets/media/juniper/start.jpg\";\nimport artboard from \"../../assets/media/juniper/artboard.jpg\";\nimport map from \"../../assets/media/juniper/map.jpg\";\nimport location from \"../../assets/media/juniper/location.jpg\";\n\n<div class=\"text-center mb-12 not-prose\">\n  <div>\n    <strong>Company:</strong> Glide Agency\n  </div>\n  <div>\n    <strong>Client:</strong> Juniper Aged Care\n  </div>\n</div>\n\nJuniper was undergoing organisational restructuring due to shifts in government policy regarding aged care. As part of this transition, investments were made into marketing efforts like a new website, advertising campaigns, and TV commercials to promote their updated brand and offerings.\n\n<Image\n  src={home}\n  alt=\"Juniper Home Page\"\n  class=\"rounded-3xl border-0 border-slate-200 shadow-none\"\n/>\n\nFrom pitch to execution, this project was really fun to work on. We created an initial set of designs, then held a rather important boardroom meeting with all the stakeholders. They loved it, but we knew it and had already started production.\n\n<Image\n  src={start}\n  alt=\"Juniper project start\"\n  class=\"rounded-3xl border-0 border-slate-200 dark:border-slate-800 shadow-none\"\n/>\n\nEverything was broken down into components and variations of each, suitable for the content, including handheld. The process was based on UX patterns in the components in Bootstrap 4.\n\n<Image\n  src={artboard}\n  alt=\"Juniper Design Artboard\"\n  class=\"rounded-3xl border-0 border-slate-200 dark:border-slate-800 shadow-none\"\n/>\n\nWe developed a strong strategy. Our targets were the elderly, their parents, and health professionals. Each might be on a different journey, with some already in some form of Aged Care, but also those who are new and dealing with a crisis\n\nAfter the initial launch, a TV campaign was being run. An important branding alignment was carried out, and the website was updated to match. Seeing it all come together was great, and having influence over both the TV style and scenes was also satisfying.\n\n<Image\n  src={map}\n  alt=\"Juniper Map Feature\"\n  class=\"rounded-3xl border-0 border-slate-200  dark:border-slate-800 shadow-none\"\n/>\n\nAged care as an industry was new to me, so I had to become familiar with both the dark humor of those who work in it, and also on the legislative level.\n\n<Image\n  src={location}\n  alt=\"Juniper Location Details\"\n  class=\"rounded-3xl border-0 border-slate-200 dark:border-slate-800 shadow-none\"\n/>"
      },
      {
        "id": "karma-group",
        "type": "stuff",
        "title": "Karma Group",
        "description": "Concept designs for the Karma Group main website.",
        "date": "2012-12-12T00:00:00.000Z",
        "category": "agency",
        "tags": null,
        "url": "https://ryansnowden.com/stuff/karma-group/",
        "content": "import { SquareArrowOutUpRight } from \"lucide-astro\";\nimport { Image } from \"astro:assets\";\nimport karmaImage1 from \"../../assets/media/karma-group/0000000lE7W0000000003Z-1.jpeg\";\nimport karmaImage2 from \"../../assets/media/karma-group/0000000lE7W00000000042-1.jpeg\";\nimport karmaImage3 from \"../../assets/media/karma-group/0000000lE7W00000000045-1.jpeg\";\nimport karmaImage4 from \"../../assets/media/karma-group/0000000lE7W00000000048-1.jpeg\";\n\n<div class=\"text-center mb-12 not-prose\">\n    <div>\n        <strong>Company:</strong> Crystal Asia (Me)\n    </div>\n    <div>\n        <strong>Client:</strong> <a href=\"http://www.karmagroup.com/\" target=\"_blank\" rel=\"noopener noreferrer\">Karma Group</a>\n    </div>\n</div>\n\nConcept designs for the Karma Group main website. Simple, non-mobile concepts that included some banners and badges.\n\n<Image\n  src={karmaImage1}\n  alt=\"Karma Group concept 1\"\n  class=\"rounded-3xl border-0 border-slate-200 shadow-none\"\n/>\n\n<Image\n  src={karmaImage2}\n  alt=\"Karma Group concept 2\"\n  class=\"rounded-3xl border-0 border-slate-200 shadow-none\"\n/>\n\n<Image\n  src={karmaImage3}\n  alt=\"Karma Group concept 3\"\n  class=\"rounded-3xl border-0 border-slate-200 shadow-none\"\n/>\n\n<Image\n  src={karmaImage4}\n  alt=\"Karma Group concept 4\"\n  class=\"rounded-3xl border-0 border-slate-200 shadow-none\"\n/>"
      },
      {
        "id": "nike",
        "type": "stuff",
        "title": "Nike",
        "description": "Pitch brochure, promising the future.",
        "date": "2020-12-12T00:00:00.000Z",
        "category": "agency",
        "tags": null,
        "url": "https://ryansnowden.com/stuff/nike/",
        "content": "import Slideshow from \"../../components/interactive/Slideshow.astro\";\n\n<div class=\"text-center mb-12 not-prose\">\n  <div>\n    <strong>Company:</strong> Advanced Health Intelligence (AHI)\n  </div>\n  <div>\n    <strong>Client:</strong> Nike\n  </div>\n</div>\n\nThis was a landscape A4 high gloss + digital deck created for a Nike pitch around custom apparel, integration into Training Club and Run Club. The theme was depth, dimension. Ripped from multiple sources and cleaned up, and twisted the way to convey the theme of body scanning. :-)\n\nIt looked fantastic and felt great to hold. High gloss was a winner.\n\n\n<div class=\"w-[calc(100vw-2rem)] md:w-[calc(100vw-200px)] max-w-[1020px] relative left-1/2 -translate-x-1/2 mb-6\">\n  <Slideshow pdfSrc=\"/media/nike/nike-brochure.pdf\" title=\"Nike Pitch Brochure\" />\n</div>"
      },
      {
        "id": "noodle-forum",
        "type": "stuff",
        "title": "The Noodle Forum",
        "description": "Carried over some former branding, modified design slightly for cross-mobile experience. Used VelocityJS and CraftCMS to make some for some interesting animations.",
        "date": "2016-12-12T00:00:00.000Z",
        "category": "agency",
        "tags": null,
        "url": "https://ryansnowden.com/stuff/noodle-forum/",
        "content": "import { SquareArrowOutUpRight } from \"lucide-astro\";\nimport noodleVideo from \"../../assets/media/noodle-forum/0000000lE7W0000000005Y-1.webm\";\n\n<div class=\"text-center mb-12 not-prose\">\n  <div>\n    <strong>Company:</strong> Crush\n  </div>\n  <div>\n    <strong>Client:</strong> The Noodle Forum\n  </div>\n</div>\n\n<div class=\"flex flex-col items-center gap-4 mb-12\">\n  <a \n    href=\"https://noodleforum.com.au/\" \n    class=\"inline-flex bg-accent text-white px-6 py-3 rounded-full font-bold no-underline hover:brightness-110 transition-all items-center gap-2\" \n    target=\"_blank\" \n    rel=\"noopener noreferrer\"\n  >\n    <span>View the website</span>\n    <SquareArrowOutUpRight class=\"w-5 h-5 text-white\" aria-label=\"Opens in new tab\" />\n  </a>\n</div>\n\nCarried over some former branding into the design and took some liberties with it for cross-mobile experience. Used VelocityJS to make some interesting animations.\n\n<video \n  src={noodleVideo}\n  controls \n  class=\"rounded-3xl border-0 border-slate-200 shadow-none\"\n></video>"
      },
      {
        "id": "ohs-x",
        "type": "stuff",
        "title": "Open Health Stack eXtended",
        "description": "Extending Open Health Stack with turnkey FHIR-compliant UI components for various health questionnaires and physical examinations.",
        "date": "2024-12-12T00:00:00.000Z",
        "category": "product",
        "tags": null,
        "url": "https://ryansnowden.com/stuff/ohs-x/",
        "content": "import { SquareArrowOutUpRight } from \"lucide-astro\";\nimport ohsXImg from \"../../assets/media/ohs/ohs-cover.png\";\nimport Accordion from \"../../components/ui/Accordion.astro\";\n\n<div class=\"text-center mb-12 not-prose\">\n  <div>\n    <strong>Company:</strong> Me\n  </div>\n  <div class=\"mt-2\">\n    <span class=\"inline-block bg-gray-light text-gray-dark rounded-full px-3 py-1 text-sm font-semibold mr-2\">\n      Complexity: 7.8/10\n    </span>\n    <span class=\"inline-block bg-gray-light text-gray-dark rounded-full px-3 py-1 text-sm font-semibold\">\n      Fun factor: 9.3/10\n    </span>\n  </div>\n</div>\n\n<div class=\"flex flex-col items-center gap-4 mb-12\">\n  <a \n    href=\"https://www.figma.com/community/file/1331457393418765850\" \n    class=\"inline-flex bg-accent text-white px-6 py-3 rounded-full font-bold no-underline hover:brightness-110 transition-all items-center gap-2\" \n    target=\"_blank\" \n    rel=\"noopener noreferrer\"\n  >\n    <span>View the design (Figma)</span>\n    <SquareArrowOutUpRight class=\"w-5 h-5 text-white\" aria-label=\"Opens in new tab\" />\n  </a>\n\n  <div class=\"text-center\">\n    [View OHS-X Docs](https://ryansnowden.notion.site/OHS-X-acf9b8ba426a4d5b8d5a076240ed5dab)\n  </div>\n\n</div>\n\n\n<Accordion title=\"Project details\" open={true}>\n\n- **Platform**: iOS, Android, Web\n- **Design system**: Material 3\n- **Product type**: Design library\n- **Design tool**: Figma\n\n</Accordion>\n\n<Accordion title=\"What did I do?\">\n\n- Everything, except [Open Health Stack](https://developers.google.com/open-health-stack/design/data-capture-guideline), Google did that.\n\n</Accordion>\n\n<Accordion title=\"What does it do?\">\n\n- It allows other designers in the clinical space to quickly get going on a range of in-device tests. Anyone can download it from _Figma Community_.\n- Engineered a scalable design system extension for Google's Open Health Stack, delivering a suite of FHIR-compliant UI components to accelerate the development of interoperable health applications.\n- Translated complex HL7 data models into intuitive, standardised interface patterns for clinical questionnaires and physical examinations, optimising both developer velocity and user experience.\n\n<img\n  src={ohsXImg.src}\n  class=\"w-full rounded-3xl border-0 border-slate-200 dark:border-slate-800 shadow-none mt-6\"\n/>\n\n</Accordion>\n\n<Accordion title=\"What tests does it cover?\">\n\n- **SFT:** Senior Fitness Test. Assesses the functional fitness of older adults, measuring their ability to perform everyday activities without difficulty.\n- **GAD-7:** Generalised Anxiety Disorder 7-item scale for anxiety screening.\n- **PHQ-9:** Patient Health Questionnaire 9-item scale for depression screening.\n- **PAR-Q, PAR-Q+:** Physical Activity Readiness Questionnaires for fitness safety screening.\n- **M-CHAT-R:** Modified Checklist for Autism in Toddlers, Revised.\n- **GDS-15:** Geriatric Depression Scale (Short Form) for assessing depression in older adults.\n\n</Accordion>"
      },
      {
        "id": "robarts-spaces",
        "type": "stuff",
        "title": "Robarts Spaces",
        "description": "Architecture, interior design and engineering",
        "date": "2014-12-12T00:00:00.000Z",
        "category": "agency",
        "tags": null,
        "url": "https://ryansnowden.com/stuff/robarts-spaces/",
        "content": "import { SquareArrowOutUpRight } from \"lucide-astro\";\n\n\n<div class=\"text-center mb-12 not-prose\">\n  <div>\n    <strong>Company:</strong> Crystal Asia\n  </div>\n  <div>\n    <strong>Client:</strong> Robarts Spaces\n  </div>\n</div>\n\n<div class=\"flex flex-col items-center gap-4 mb-12\">\n  <a \n    href=\"https://www.robartsspaces.com/\" \n    class=\"inline-flex bg-accent text-white px-6 py-3 rounded-full font-bold no-underline hover:brightness-110 transition-all items-center gap-2\" \n    target=\"_blank\" \n    rel=\"noopener noreferrer\"\n  >\n    <span>Visit the website</span>\n    <SquareArrowOutUpRight class=\"w-5 h-5 text-white\" aria-label=\"Opens in new tab\" />\n  </a>\n</div>\n\nThe site involved subtle animations and a smart UI, all of which is done with the help of Popmotion and Bourbon+Neat.\n\nThe feeling and approach was to be infused with the philosophy of Robarts Space. This was simplicity, clean, subtle and minimal.\n\nThese were the concepts I created prior to discovery. It was a phase3 to introduce difference concepts that they might not have considered, as customers tend to view their needs through their own lens.\n\nEven though they might look nice, I missed 'the goal of getting it right'. However, after a bit of back and forth, we finalized the design direction.\n\nimport ImageSlideshow from \"../../components/interactive/Slideshow.astro\";\nimport home1 from \"../../assets/media/robarts/home1.jpg\";\nimport home2 from \"../../assets/media/robarts/home2.jpg\";\nimport home3 from \"../../assets/media/robarts/home3.jpg\";\nimport home4 from \"../../assets/media/robarts/home4.jpg\";\nimport home5 from \"../../assets/media/robarts/home5.jpg\";\nimport home6 from \"../../assets/media/robarts/home6.jpg\";\nimport home7 from \"../../assets/media/robarts/home7.jpg\";\nimport home8 from \"../../assets/media/robarts/home8.jpg\";\nimport home9 from \"../../assets/media/robarts/home9.jpg\";\nimport home10 from \"../../assets/media/robarts/home10.jpg\";\nimport about from \"../../assets/media/robarts/about.jpg\";\nimport awards1 from \"../../assets/media/robarts/awards1.jpg\";\nimport awards2 from \"../../assets/media/robarts/awards2.jpg\";\nimport nav1 from \"../../assets/media/robarts/nav1.jpg\";\nimport nav2 from \"../../assets/media/robarts/nav2.jpg\";\nimport nav3 from \"../../assets/media/robarts/nav3.jpg\";\nimport stage from \"../../assets/media/robarts/stage.jpg\";\n\n<ImageSlideshow images={[home1, home2, home3, home4, home5, home6, home7, home8, home9, home10, about, awards1, awards2, nav1, nav2, nav3, stage]} />"
      },
      {
        "id": "sage-worldwide",
        "type": "stuff",
        "title": "Sage Worldwide",
        "description": "Event and consulting website with custom speaker management.",
        "date": "2014-12-12T00:00:00.000Z",
        "category": "agency",
        "tags": null,
        "url": "https://ryansnowden.com/stuff/sage-worldwide/",
        "content": "import { SquareArrowOutUpRight } from \"lucide-astro\";\nimport { Image } from \"astro:assets\";\nimport homeImage from \"../../assets/media/sage-worldwide/0000000lE7W000000000aT-1.jpeg\";\nimport speakerPanelImage from \"../../assets/media/sage-worldwide/0000000lE7W000000000aX-1.png\";\nimport speakerProfileImage from \"../../assets/media/sage-worldwide/0000000lE7W000000000b1-1.jpeg\";\nimport innerPageImage from \"../../assets/media/sage-worldwide/0000000lE7W000000000b5-1.jpeg\";\nimport dropdownImage from \"../../assets/media/sage-worldwide/0000000lE7W000000000b9-1.png\";\n\n<div class=\"text-center mb-12 not-prose\">\n  <div>\n    <strong>Company:</strong> Crystal Asia (me)\n  </div>\n  <div>\n    <strong>Client:</strong> Sage Worldwide\n  </div>\n</div>\n\n<div class=\"flex flex-col items-center gap-4 mb-12\">\n  <a \n    href=\"https://sage-worldwide.com/\" \n    class=\"inline-flex bg-accent text-white px-6 py-3 rounded-full font-bold no-underline hover:brightness-110 transition-all items-center gap-2\" \n    target=\"_blank\" \n    rel=\"noopener noreferrer\"\n  >\n    <span>View the website</span>\n    <SquareArrowOutUpRight class=\"w-5 h-5 text-white\" aria-label=\"Opens in new tab\" />\n  </a>\n</div>\n\nEvent and consulting website in with a custom content type to serve the speaker data. Speakers are tagged across news and easily searchable.\n\nThe CMS has a custom speaker entry page where multiple types of media can be uploaded easily by Sage staff.\n\n<Image\n  src={homeImage}\n  alt=\"Home page with rotating messages\"\n  class=\"rounded-3xl border-0 border-slate-200 dark:border-slate-800 shadow-none\"\n/>\n\nHome page with rotating messages. Clicking the round speakers brings up a panel of featured speakers.\n\n<Image\n  src={speakerPanelImage}\n  alt=\"Speaker panel with media\"\n  class=\"rounded-3xl border-2 border-slate-200 dark:border-slate-800 shadow-none\"\n/>\n\nThe panel can flip over and you can view the media right inline.\n\n<Image\n  src={speakerProfileImage}\n  alt=\"Speaker profile page\"\n  class=\"rounded-3xl border-2 border-slate-200 dark:border-slate-800 shadow-none\"\n/>\n\nSpeaker page with the honorable himself.\n\n<Image\n  src={innerPageImage}\n  alt=\"Inner page layout\"\n  class=\"rounded-3xl border-2 border-slate-200 dark:border-slate-800 shadow-none\"\n/>\n\nPretty standard inner page. Speaker categories dropdown - the main gateway to the speaker pages.\n\n<Image\n  src={dropdownImage}\n  alt=\"Speaker categories dropdown\"\n  class=\"rounded-3xl border-2 border-slate-200 dark:border-slate-800 shadow-none\"\n/>"
      },
      {
        "id": "service-design-mapping-examples",
        "type": "stuff",
        "title": "Service Design Mapping",
        "description": "Various service blueprints, user journeys, OGSM canvas, VPC, actor network, causal loops, concept posters, ansoff matrix, value exchange maps, MOI framework.",
        "date": "2024-12-20T00:00:00.000Z",
        "category": "other",
        "tags": null,
        "url": "https://ryansnowden.com/stuff/service-design-mapping-examples/",
        "content": "import { SquareArrowOutUpRight } from \"lucide-astro\";\nimport { Image } from \"astro:assets\";\nimport serviceDesignImage from \"../../assets/media/service-design/service-design.jpg\";\n\n<div class=\"flex flex-col items-center gap-4 mb-12\">\n  <a \n    href=\"https://www.figma.com/board/yFnQ0rTKRjk3khblxkIQJu/Service-Design-Examples?node-id=0-1&t=irSKmdC5Lhf5m5wE-1\" \n    class=\"inline-flex bg-accent text-white px-6 py-3 rounded-full font-bold no-underline hover:brightness-110 transition-all items-center gap-2\" \n    target=\"_blank\" \n    rel=\"noopener noreferrer\"\n  >\n    <span>View the designs (Figma)</span>\n    <SquareArrowOutUpRight class=\"w-5 h-5 text-white\" aria-label=\"Opens in new tab\" />\n  </a>\n\n  <div class=\"text-center mb-12 not-prose\">\n    **Company**: Me / **Client**: Multiple\n  </div>\n\n</div>\n\nI have completed numerous service design mapping exercises, and I have gathered them here on a single canvas. The benefit of service design is that these mapping models and frameworks are also highly effective in business strategy and marketing.\n\nInstead of a linear workshop discovery process, my approach primarily involves starting with my own desk research and filling in the gaps using my own experience, AI research tools, and a degree of common sense.\n\n\n## Continous learning \n\nThis approach allows me to progress significantly through the process without needing to involve others at such an early stage. While some organisations might prefer to co-create from the start, that method is often more intensive and expensive. By working independently initially, I can personally master the material and identify potential pain points, competitors, and various support systems.\n\nUltimately, this method strengthens my knowledge base. It enables me to make informed decisions about the direction of the service before workshops begin and allows these insights to circulate within my team to build familiarity.\n\n<Image\n  src={serviceDesignImage}\n  alt=\"Service Design Mapping\"\n  class=\"rounded-3xl border-0 border-slate-200 shadow-none\"\n/>"
      },
      {
        "id": "singapore-stopover",
        "type": "stuff",
        "title": "Singapore Airlines Stopover",
        "description": "Singapore Stopover Holiday Challenge. Join the dots and win!",
        "date": "2017-12-12T00:00:00.000Z",
        "category": "agency",
        "tags": null,
        "url": "https://ryansnowden.com/stuff/singapore-stopover/",
        "content": "import { Image } from \"astro:assets\";\nimport startImage from \"../../assets/media/singapore-stopover/start.jpg\";\nimport dotsInfoImage from \"../../assets/media/singapore-stopover/dots-info.jpg\";\nimport unlockImage from \"../../assets/media/singapore-stopover/unlock.jpg\";\nimport detailsImage from \"../../assets/media/singapore-stopover/details.jpg\";\n\n<div class=\"text-center mb-12 not-prose\">\n  <div>\n    <strong>Company:</strong> Glide Agency\n  </div>\n  <div>\n    <strong>Client:</strong> Singapore Airlines\n  </div>\n</div>\n\nA pitch for a Singapore Airlines stopover competition quiz. The idea was simple: it is an interactive HTML5 'game' where someone has to join the dots using their finger or mouse and then submit their details to win. \n\nIt could work on touch devices and was quite a neat little project that would work using available (and tested) JS libraries.\n\n<Image\n  src={startImage}\n  alt=\"Start screen\"\n  class=\"rounded-3xl border-0 border-slate-200 shadow-none\"\n/>\n\nNeed info on a place? Sure just tap it!\n\n<Image\n  src={dotsInfoImage}\n  alt=\"Dots information popup\"\n  class=\"rounded-3xl border-0 border-slate-200 shadow-none\"\n/>\n\nConnecting the places adds to your score.\n\n<Image\n  src={unlockImage}\n  alt=\"Unlock screen\"\n  class=\"rounded-3xl border-0 border-slate-200 shadow-none\"\n/>\n\nOnce complete, enter your details to win ;-)\n\n<Image\n  src={detailsImage}\n  alt=\"Details entry form\"\n  class=\"rounded-3xl border-0 border-slate-200 shadow-none\"\n/>"
      },
      {
        "id": "standard-advice",
        "type": "stuff",
        "title": "Standard Advice",
        "description": "Health & Fitness e-commerce, custom icons and a focused payment funnel.",
        "date": "2014-12-12T00:00:00.000Z",
        "category": "agency",
        "tags": null,
        "url": "https://ryansnowden.com/stuff/standard-advice/",
        "content": "import { Image } from \"astro:assets\";\nimport standard1 from \"../../assets/media/standard-advice/standard1.jpg\";\nimport standard2 from \"../../assets/media/standard-advice/standard2.jpg\";\nimport standard3 from \"../../assets/media/standard-advice/standard3.jpg\";\nimport standard5 from \"../../assets/media/standard-advice/standard5.jpg\";\nimport standard6 from \"../../assets/media/standard-advice/standard6.jpg\";\n\n<div class=\"text-center mb-12 not-prose\">\n  <div>\n    <strong>Company:</strong> Crystal Asia\n  </div>\n  <div>\n    <strong>Client:</strong> Standard Advice\n  </div>\n</div>\n\nA decent sized e-commerce project that required some special features to differentiate it from competitors. Built in Wordpress and WooCommerce, I had to design a logo, colour palette, illustration style, AliPay and WeChat payment gateways, a custom quiz module and dashboard.\n\nThe custom quiz module was a way for a customer to choose some goals (such as weight loss) and then the products would be matched to them.\n\nThey had a buyers dashboard where they could ask for advice.\n\n<strong>Languages</strong>: English, Chinese\n\n<Image\n  src={standard1}\n  alt=\"Standard Advice homepage\"\n  class=\"rounded-3xl border-2 border-slate-200 shadow-none\"\n/>\n\n<Image\n  src={standard2}\n  alt=\"Standard Advice product page\"\n  class=\"rounded-3xl border-2 border-slate-200 shadow-none\"\n/>\n\nI designed a custom set of icons for the quiz, along side a few concepts.\n\n<Image\n  src={standard3}\n  alt=\"Custom icons for quiz\"\n  class=\"rounded-3xl border-2 border-slate-200 shadow-none\"\n/>\n\n<Image\n  src={standard5}\n  alt=\"Quiz concept design\"\n  class=\"rounded-3xl border-2 border-slate-200 shadow-none\"\n/>\n\nAlternate design around navigation (not chosen but still legit).\n\n<Image\n  src={standard6}\n  alt=\"Alternate navigation design\"\n  class=\"rounded-3xl border-2 border-slate-200 shadow-none\"\n/>"
      },
      {
        "id": "tasa",
        "type": "stuff",
        "title": "Travel & Sports Australia",
        "description": "Travel booking system, Wordpress website, e-commerce..",
        "date": "2017-12-12T00:00:00.000Z",
        "category": "agency",
        "tags": null,
        "url": "https://ryansnowden.com/stuff/tasa/",
        "content": "import { SquareArrowOutUpRight } from \"lucide-astro\";\nimport { Image } from \"astro:assets\";\nimport bookingStartImage from \"../../assets/media/tasa/booking-start.jpg\";\nimport bookingImage from \"../../assets/media/tasa/booking.jpg\";\nimport cardsImage from \"../../assets/media/tasa/cards.jpg\";\nimport artboardImage from \"../../assets/media/tasa/artboard.jpg\";\nimport companyHomeImage from \"../../assets/media/tasa/company-home.jpg\";\nimport mobileBookingImage from \"../../assets/media/tasa/mobile-booking.jpg\";\nimport storyImage from \"../../assets/media/tasa/story.jpg\";\nimport sportDetailImage from \"../../assets/media/tasa/sport-detail.jpg\";\nimport iconsImage from \"../../assets/media/tasa/icons.png\";\n\n<div class=\"text-center mb-12 not-prose\">\n  <div>\n    <strong>Company:</strong> Glide Agency\n  </div>\n  <div>\n    <strong>Client:</strong> [Travel & Sports Australia](http://www.travelandsports.com.au/)\n  </div>\n</div>\n\n<div class=\"flex flex-col items-center gap-4 mb-12\">\n  <a \n    href=\"https://awesome.boxedthrills.com/\" \n    class=\"inline-flex bg-accent text-white px-6 py-3 rounded-full font-bold no-underline hover:brightness-110 transition-all items-center gap-2\" \n    target=\"_blank\" \n    rel=\"noopener noreferrer\"\n  >\n    <span>View the project</span>\n    <SquareArrowOutUpRight class=\"w-5 h-5 text-white\" aria-label=\"Opens in new tab\" />\n  </a>\n\n  ## Project assets\n\n  <ul class=\"list-none p-0 m-0 flex flex-col items-center gap-0\">\n  <li><a href=\"http://boxedthrills.com/projects/TASA%20Mobile%20Group/#/screens\" class=\"hover:text-accent transition-colors\">Group Booking</a></li>\n  <li><a href=\"http://boxedthrills.com/projects/TASA%20Mobile%20Couple/#/screens\" class=\"hover:text-accent transition-colors\">Couple Booking</a></li>\n  <li><a href=\"http://boxedthrills.com/projects/TASA%20Desktop%20Final/#/screens\" class=\"hover:text-accent transition-colors\">Desktop Booking</a></li>\n  <li><a href=\"http://boxedthrills.com/projects/TASA%20Mobile%20Final/#/screens\" class=\"hover:text-accent transition-colors\">Mobile Booking</a></li>\n</ul>\n\n</div>\n\n## Project Info\n\nThe project was quite massive in scope. It consisted of an entirely new booking system, which was being implemented by another (great) company. It also included a new website with new branding. I was responsible for the UX/UI of the booking system and website.\n\nI prototyped the whole mobile app from beginning to end and handed my phone to the customer. With the help of the TASA team we created something unique, fun and actually won an AFTA award.\n\n<Image\n  src={bookingStartImage}\n  alt=\"Booking start screen\"\n  class=\"rounded-3xl border-0 border-slate-200 shadow-none\"\n/>\n\nThe project was already in progress when I joined the company. It was falling behind in some areas, so I escalated meetings with the customer to actively complete several milestones and meet deadlines.\n\nLuckily, I had several years of experience in the travel industry (having my own company in the past) while in China, so I had very few obstacles when creating workflows and processes for group booking systems.\n\nThere was the Booking Wizard component for desktop and handheld devices, plus a MICE variation of it for companies. Then there was the website itself, which needed to appeal to a wide genre of sports fans, as well as recreational travel needs.\n\n<Image\n  src={bookingImage}\n  alt=\"Booking interface\"\n  class=\"rounded-3xl border-0 border-slate-200 shadow-none\"\n/>\n\nI worked closely with TASA to make sure inventory and conditions were met during the booking process, without making it take too long. Part of this meant moving registration to the end and collecting passenger details last instead of first, which severely reduced the time taken to make a booking.\n\n<Image\n  src={cardsImage}\n  alt=\"Card components\"\n  class=\"rounded-3xl border-0 border-slate-200 shadow-none\"\n/>\n\nI prototyped the whole booking wizard to mobile, covering the extreme cases of a couple and group traveling. Basically, the goal was to look for problems.\n\nThe design aspect was easy to meet since it was going to be flat and clean, but the information needed serious formatting and had to be heavily scrutinized to determine where it should be, for who, and why.\n\nTo give you a sense of the scale, each of the items below is an artboard in Sketch. Each persona was mapped out as the conditions for editing and wording varied greatly depending on the package itself.\n\n<Image\n  src={artboardImage}\n  alt=\"Artboard overview\"\n  class=\"rounded-3xl border-0 border-slate-200 dark:border-slate-800 shadow-none\"\n/>\n\nCorporate customers needed a different style for their section. It was a goal to make this a full-screen slideshow in a presentation style.\n\n<Image\n  src={companyHomeImage}\n  alt=\"Company home page\"\n  class=\"rounded-3xl border-0 border-slate-200 dark:border-slate-800 shadow-none\"\n/>\n\nOver several months, each component was designed and assembled. To avoid adding extra time for redesigning, approval, and then changes in development, visual changes were made directly in development.\n\nMobile booking screens.\n\n<Image\n  src={mobileBookingImage}\n  alt=\"Mobile booking screens\"\n  class=\"rounded-3xl border-0 border-slate-200 dark:border-slate-800 shadow-none\"\n/>\n\nEvery company has a story.\n\n<Image\n  src={storyImage}\n  alt=\"Company story page\"\n  class=\"rounded-3xl border-0 border-slate-200 dark:border-slate-800 shadow-none\"\n/>\n\nEvery sport has a home.\n\n<Image\n  src={sportDetailImage}\n  alt=\"Sport detail page\"\n  class=\"rounded-3xl border-0 border-slate-200 shadow-none\"\n/>\n\nIcon sets had to be sourced, matched, and where missing, created. This was time-consuming to say the least. You have to modify and create icons that maintain line thickness, and have a dark and light variant.\n\n<Image\n  src={iconsImage}\n  alt=\"Icon set\"\n  class=\"rounded-3xl border-0 border-slate-200 dark:border-slate-800 shadow-none\"\n/>"
      },
      {
        "id": "ucdl",
        "type": "stuff",
        "title": "Unified Capture Design Language (UCDL)",
        "description": "A cohesive design system that provides a robust set of modular building blocks for all new and existing platforms.",
        "date": "2022-12-12T00:00:00.000Z",
        "category": "product",
        "tags": null,
        "url": "https://ryansnowden.com/stuff/ucdl/",
        "content": "import { SquareArrowOutUpRight } from \"lucide-astro\";\nimport video1 from \"../../assets/media/shared/0000000lE7W000000000wW-2.mp4\";\nimport ImageTooltip from \"../../components/lightbox/ImageTooltip.astro\";\nimport predatorVisionImg from \"../../assets/media/shared/predator-vision.jpg\";\n\n<div class=\"text-center mb-12 not-prose\">\n  <div>\n    <strong>Company:</strong> Advanced Health Intelligence (AHI)\n  </div>\n  <div class=\"mt-2\">\n    <span class=\"inline-block bg-gray-light text-gray-dark rounded-full px-3 py-1 text-sm font-semibold mr-2\">\n      Complexity: 9.231/10\n    </span>\n    <span class=\"inline-block bg-gray-light text-gray-dark rounded-full px-3 py-1 text-sm font-semibold\">\n      Fun factor: 9.632/10\n    </span>\n  </div>\n</div>\n\n<div class=\"flex flex-col items-center gap-4 mb-12\">\n  <a \n    href=\"https://www.figma.com/design/cfDyJ1spgH1jSAlwv0OkxO/UCDL-2.0.25?m=auto&t=nisiypsXjPh7SEYE-1\" \n    class=\"inline-flex bg-accent text-white px-6 py-3 rounded-full font-bold no-underline hover:brightness-110 transition-all items-center gap-2\" \n    target=\"_blank\" \n    rel=\"noopener noreferrer\"\n  >\n    <span>View the design (Figma)</span>\n    <SquareArrowOutUpRight class=\"w-5 h-5 text-white\" aria-label=\"Opens in new tab\" />\n  </a>\n</div>\n\n## Project details\n\n- **Platform**: iOS, Android, Web\n- **Design system management**: [Supernova.io](https://supernova.io/)\n- **Product type**: Design system (SDK)\n- **Design tool**: Figma\n\n## What is it?\n\n- A **design system**. The Unified Capture Design Language (UCDL) provides a robust set of modular building blocks for all new and existing platforms as to create a familiar experience for biometric capture.\n\n## What did I do?\n\n- Discovery, research, documentation, prototypes, presentations.\n\n## What problem does it solve?\n\n- Addressed systemic interface fragmentation across licensed third-party technologies (FaceScan, DermaScan) which violated the _Law of Similarity_, resulting in high extraneous cognitive load and diluted brand integrity.\n- Resolved the _Gulf of Execution_ inherent in remote biometric capture, where users struggled to translate system goals into physical positioning tasks due to a lack of perceptible affordances.\n\n## What components were created?\n\n- **All Scans**: On-screen messaging, camera frame, camera outline, countdown (circular, numeric pre-countdown, timer)\n- **FaceScan**: Scene indicator (stars)\n- **BodyScan**: Alignment\n- **BodyScan, DermaScan**: Camera flash\n\n## Challenges & resolution\n\n- **Proxemic visual acuity:** Standard UI components lost legibility when transitioning between near-field (FaceScan, ~30cm) and far-field (BodyScan, ~3m) contexts.\n    - _Resolution:_ Engineered algorithmic scaling modifiers (multipliers) within the token system, ensuring optical consistency and accessible contrast ratios regardless of physical user distance.\n- **Whitelabel governance risks:** Unrestricted partner customisation threatened to compromise usability heuristics and biometric capture accuracy.\n    - _Resolution:_ Architected a semantic token layer that permits brand alignment (colour, typography) while locking critical functional properties, preserving the integrity of the capture experience.\n- **Heterogeneous tech stack integration:** Amalgamating rigid third-party SDKs with proprietary tech created significant technical debt and visual dissonance.\n    - _Resolution:_ Developed an abstraction layer that wraps external dependencies in UCDL-compliant containers, enforcing a unified front-end logic without altering core backend mechanics.\n\n## Strategic Unification\n\n- Synthesised disparate biometric modalities into a cohesive design ecosystem to resolve interface inconsistencies and establish cross-platform semantic continuity.\n- Executed a heuristic evaluation of legacy interfaces to define a token-based unified visual syntax, enhancing brand uniformity and strengthening product differentiation.\n\n## System Architecture & Tokenisation\n\n- Architected a semantic design token system to abstract visual primitives, enabling programmatic scalability and robust white-label configurations for B2B partner integrations.\n- Standardised atomic components and interaction patterns to ensure functional interoperability across web and mobile SDKs, optimising engineering integration and maintainability.\n\n## Cognitive Ergonomics\n\n- Exploited existing mental models of photography (e.g. the “Viewfinder” metaphor) to minimise extrinsic cognitive load and lower the barrier to entry for complex physical alignment tasks.\n- Engineered context-aware component specifications that dynamically adjust visual affordances (such as stroke weights and scale) based on proxemics and environmental constraints.\n\n## Interaction & Feedback Loops\n\n- Designed continuous feedback loops utilising fluid state transitions to maintain system status visibility, bridging the _Gulf of Evaluation_ and mitigating perceived latency during data capture.\n- Applied Gestalt principles (Law of Closure/Common Region) to create predictive interface elements that guide user behaviour and heighten perceived system reliability."
      }
    ]
  }
}