@mseep/open-computer-use 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.coderabbit.yaml +25 -0
- package/.dockerignore +95 -0
- package/.env.example +137 -0
- package/.githooks/pre-commit +68 -0
- package/.github/CODEOWNERS +125 -0
- package/.github/ISSUE_TEMPLATE/adr-proposal.md +41 -0
- package/.github/ISSUE_TEMPLATE/bug-report.md +49 -0
- package/.github/ISSUE_TEMPLATE/component-proposal.md +38 -0
- package/.github/ISSUE_TEMPLATE/config.yml +15 -0
- package/.github/ISSUE_TEMPLATE/dependency-proposal.md +59 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +15 -0
- package/.github/ISSUE_TEMPLATE/nfr-proposal.md +44 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +15 -0
- package/.github/codeql/codeql-config.yml +11 -0
- package/.github/codeql/extensions/security-models/python-sanitizers.model.yml +17 -0
- package/.github/codeql/extensions/security-models/qlpack.yml +7 -0
- package/.github/dependabot.yml +23 -0
- package/.github/security-exceptions.yml +23 -0
- package/.github/workflows/build.yml +420 -0
- package/.github/workflows/codeql.yml +33 -0
- package/.github/workflows/contracts-lint.yml +90 -0
- package/.github/workflows/docs-lint.yml +151 -0
- package/.github/workflows/helm.yml +131 -0
- package/.github/workflows/identity-lint.yml +30 -0
- package/.github/workflows/release-chart.yml +177 -0
- package/.github/workflows/release.yml +95 -0
- package/.github/workflows/security.yml +332 -0
- package/.github/workflows/stale.yml +31 -0
- package/.github/workflows/supply-chain.yml +242 -0
- package/.gitleaks.toml +53 -0
- package/.markdownlint.yaml +51 -0
- package/.semgrepignore +85 -0
- package/.vale/styles/Architecture/ap13-data-class-substrate.yml +12 -0
- package/.vale/styles/Architecture/banned-phrases.yml +23 -0
- package/.vale/styles/Architecture/banned-vocab.yml +23 -0
- package/.vale/styles/Architecture/marketing-tone.yml +19 -0
- package/.vale.ini +18 -0
- package/CHANGELOG.md +411 -0
- package/CLAUDE.md +218 -0
- package/CONTRIBUTING.md +82 -0
- package/Dockerfile +676 -0
- package/LICENSE +98 -0
- package/LICENSE-APACHE +202 -0
- package/LICENSE-MIT +21 -0
- package/NOTICE +36 -0
- package/README.md +516 -0
- package/SECURITY.md +45 -0
- package/THIRD-PARTY-LICENSES.md +14 -0
- package/apt-packages.txt +108 -0
- package/computer-use-server/.dockerignore +13 -0
- package/computer-use-server/Dockerfile +44 -0
- package/computer-use-server/README.md +84 -0
- package/computer-use-server/app.py +1544 -0
- package/computer-use-server/bin/list-subagent-models +449 -0
- package/computer-use-server/cli-defaults/README.md +31 -0
- package/computer-use-server/cli-defaults/codex.json +7 -0
- package/computer-use-server/cli-defaults/opencode.json +18 -0
- package/computer-use-server/cli_adapters/__init__.py +46 -0
- package/computer-use-server/cli_adapters/claude.py +163 -0
- package/computer-use-server/cli_adapters/codex.py +163 -0
- package/computer-use-server/cli_adapters/opencode.py +169 -0
- package/computer-use-server/cli_adapters/result.py +34 -0
- package/computer-use-server/cli_runtime.py +316 -0
- package/computer-use-server/context_vars.py +24 -0
- package/computer-use-server/docker_manager.py +1100 -0
- package/computer-use-server/docs_html.py +12 -0
- package/computer-use-server/mcp_resources.py +170 -0
- package/computer-use-server/mcp_tools.py +1430 -0
- package/computer-use-server/requirements.txt +17 -0
- package/computer-use-server/security.py +50 -0
- package/computer-use-server/skill_manager.py +664 -0
- package/computer-use-server/static/browser-viewer.js +445 -0
- package/computer-use-server/static/chart.umd.js +14 -0
- package/computer-use-server/static/docs.html +203 -0
- package/computer-use-server/static/github-dark.min.css +10 -0
- package/computer-use-server/static/github.min.css +10 -0
- package/computer-use-server/static/highlight.min.js +1213 -0
- package/computer-use-server/static/highlightjs-line-numbers.min.js +1 -0
- package/computer-use-server/static/icons.js +74 -0
- package/computer-use-server/static/jszip.min.js +13 -0
- package/computer-use-server/static/katex/auto-render.min.js +1 -0
- package/computer-use-server/static/katex/fonts/KaTeX_AMS-Regular.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_AMS-Regular.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_AMS-Regular.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Fraktur-Bold.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Fraktur-Regular.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Main-Bold.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Main-Bold.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Main-Bold.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Main-BoldItalic.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Main-Italic.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Main-Italic.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Main-Italic.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Main-Regular.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Main-Regular.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Main-Regular.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Math-BoldItalic.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Math-Italic.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Math-Italic.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Math-Italic.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Bold.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Italic.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Regular.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Script-Regular.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Script-Regular.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Script-Regular.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Size1-Regular.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Size1-Regular.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Size1-Regular.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Size2-Regular.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Size2-Regular.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Size2-Regular.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Size3-Regular.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Size3-Regular.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Size3-Regular.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Size4-Regular.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Size4-Regular.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Size4-Regular.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Typewriter-Regular.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
- package/computer-use-server/static/katex/katex.min.css +1 -0
- package/computer-use-server/static/katex/katex.min.js +1 -0
- package/computer-use-server/static/locale.js +242 -0
- package/computer-use-server/static/mammoth.browser.min.js +21 -0
- package/computer-use-server/static/marked.min.js +6 -0
- package/computer-use-server/static/mermaid.min.js +2811 -0
- package/computer-use-server/static/pdf.min.js +22 -0
- package/computer-use-server/static/pdf.worker.min.js +22 -0
- package/computer-use-server/static/pptxviewjs.min.js +1 -0
- package/computer-use-server/static/preact-htm.min.js +1 -0
- package/computer-use-server/static/preview.css +1030 -0
- package/computer-use-server/static/preview.js +1522 -0
- package/computer-use-server/static/xlsx.full.min.js +22 -0
- package/computer-use-server/static/xterm-addon-fit.min.js +2 -0
- package/computer-use-server/static/xterm-addon-web-links.min.js +2 -0
- package/computer-use-server/static/xterm.css +218 -0
- package/computer-use-server/static/xterm.min.js +2 -0
- package/computer-use-server/system_prompt.py +761 -0
- package/computer-use-server/uploads.py +82 -0
- package/contracts/README.md +53 -0
- package/contracts/audit/audit-fanin.asyncapi.yaml +407 -0
- package/contracts/exec/exec-channel.schema.json +240 -0
- package/contracts/mcp/2025-06-18/ocu-constraints.schema.json +178 -0
- package/contracts/storage/file-artifact-api.schema.json +390 -0
- package/contracts/storage/file-ops.schema.json +217 -0
- package/contracts/storage/mount-config.schema.json +197 -0
- package/cron/Dockerfile +15 -0
- package/cron/cleanup-quick.sh +21 -0
- package/cron/cleanup.sh +127 -0
- package/data/outputs/.gitkeep +0 -0
- package/data/uploads/.gitkeep +0 -0
- package/docker-compose.test.yml +54 -0
- package/docker-compose.webui.yml +77 -0
- package/docker-compose.yml +96 -0
- package/docs/CLOUD.md +29 -0
- package/docs/COMPARISON.md +128 -0
- package/docs/DOCKER.md +469 -0
- package/docs/DYNAMIC-SKILLS.md +77 -0
- package/docs/FEATURES.md +100 -0
- package/docs/INSTALL.md +111 -0
- package/docs/KNOWN-BUGS.md +86 -0
- package/docs/MCP.md +320 -0
- package/docs/SCREENSHOTS.md +39 -0
- package/docs/SKILLS-USER-GUIDE.md +86 -0
- package/docs/SKILLS.md +483 -0
- package/docs/TERMINAL-TAB.md +56 -0
- package/docs/architecture/02-trust-boundaries.md +224 -0
- package/docs/architecture/03-c4-context.md +61 -0
- package/docs/architecture/04-bounded-contexts.md +119 -0
- package/docs/architecture/05-c4-container.md +88 -0
- package/docs/architecture/06-threat-model.md +172 -0
- package/docs/architecture/08-contracts.md +105 -0
- package/docs/architecture/MANIFESTO.md +38 -0
- package/docs/architecture/PROCESS.md +64 -0
- package/docs/architecture/README.md +37 -0
- package/docs/architecture/adr/0000-template.md +65 -0
- package/docs/architecture/adr/0001-layer-0-gate-legacy-exclusion.md +75 -0
- package/docs/architecture/adr/0002-session-view-descriptor.md +57 -0
- package/docs/architecture/adr/0003-sandbox-runtime-tier-ladder.md +63 -0
- package/docs/architecture/adr/0004-operator-authentication-substrate.md +63 -0
- package/docs/architecture/adr/0005-egress-credential-delivery-envoy-sds.md +62 -0
- package/docs/architecture/adr/0006-egress-forward-proxy-substrate.md +65 -0
- package/docs/architecture/adr/0007-egress-auth-mechanism.md +72 -0
- package/docs/architecture/adr/0008-session-egress-attribution.md +59 -0
- package/docs/architecture/adr/0009-audit-pipeline-pluggable-by-contract.md +76 -0
- package/docs/architecture/adr/0010-storage-backend-pluggable-adapter.md +60 -0
- package/docs/architecture/adr/0011-storage-egress-lane.md +67 -0
- package/docs/architecture/adr/0012-implementation-language.md +67 -0
- package/docs/architecture/adr/0020-sandbox-image-provisioning.md +82 -0
- package/docs/architecture/adr/README.md +53 -0
- package/docs/architecture/compliance/.gitkeep +0 -0
- package/docs/architecture/components/00-overview.md +42 -0
- package/docs/architecture/components/0000-template.md +50 -0
- package/docs/architecture/components/01-mcp-gateway.md +80 -0
- package/docs/architecture/components/02-control-operator-api.md +80 -0
- package/docs/architecture/components/04-storage-broker.md +104 -0
- package/docs/architecture/components/05-session-sandbox.md +93 -0
- package/docs/architecture/components/06-egress-trust-edge.md +95 -0
- package/docs/architecture/components/07-audit-pipeline.md +110 -0
- package/docs/architecture/diagrams/.gitkeep +0 -0
- package/docs/architecture/diagrams/02-trust-boundaries.mmd +111 -0
- package/docs/architecture/diagrams/06-threat-model.mmd +41 -0
- package/docs/architecture/diagrams/08-contracts.mmd +47 -0
- package/docs/architecture/diagrams/c4-container.mmd +59 -0
- package/docs/architecture/diagrams/c4-context.mmd +46 -0
- package/docs/architecture/glossary.md +172 -0
- package/docs/architecture/manifesto/.gitkeep +0 -0
- package/docs/architecture/manifesto/01-audience-and-buyer.md +57 -0
- package/docs/architecture/manifesto/02-nfrs.md +325 -0
- package/docs/architecture/manifesto/03-non-negotiables.md +35 -0
- package/docs/architecture/manifesto/04-non-goals.md +23 -0
- package/docs/architecture/manifesto/05-licensing-posture.md +61 -0
- package/docs/architecture/manifesto/06-starter-mode-policy.md +49 -0
- package/docs/architecture/manifesto/07-governance.md +60 -0
- package/docs/architecture/primitives-backlog.md +51 -0
- package/docs/architecture.svg +117 -0
- package/docs/claude-code-gateway.md +173 -0
- package/docs/cli-config-templates.md +240 -0
- package/docs/data-flow.svg +72 -0
- package/docs/demo-landing-page.gif +0 -0
- package/docs/demo-qwen-trending.gif +0 -0
- package/docs/dynamic-skills.svg +77 -0
- package/docs/file-flow.svg +126 -0
- package/docs/future-architecture/README.md +152 -0
- package/docs/future-architecture/adr/0001-control-plane-language-go.md +80 -0
- package/docs/future-architecture/adr/0002-guest-agent-language-go.md +84 -0
- package/docs/future-architecture/adr/0003-docker-poc-first-then-k8s.md +37 -0
- package/docs/future-architecture/adr/0004-pluggable-runtime-via-runtimeclass.md +34 -0
- package/docs/future-architecture/adr/0005-mcp-as-control-plane-gateway.md +34 -0
- package/docs/future-architecture/adr/0006-no-agpl-no-bsl-dependencies.md +41 -0
- package/docs/future-architecture/adr/0007-superseded-by-future-architecture.md +37 -0
- package/docs/future-architecture/adr/0008-internal-grpc-external-rest-mcp.md +106 -0
- package/docs/future-architecture/adr/0009-external-protocol-dialects.md +94 -0
- package/docs/future-architecture/adr/0010-lambda-as-inspiration-not-runtime.md +86 -0
- package/docs/future-architecture/adr/0011-kata-as-first-class-dind-runtime.md +84 -0
- package/docs/future-architecture/antipatterns.md +552 -0
- package/docs/future-architecture/architecture/01-layers.md +109 -0
- package/docs/future-architecture/architecture/02-layer4-control-plane.md +122 -0
- package/docs/future-architecture/architecture/03-layer3-providers.md +174 -0
- package/docs/future-architecture/architecture/04-layer2-runtimes.md +114 -0
- package/docs/future-architecture/architecture/04b-credential-broker.md +153 -0
- package/docs/future-architecture/architecture/05-layer1-guest-agent.md +138 -0
- package/docs/future-architecture/architecture/06-storage.md +134 -0
- package/docs/future-architecture/architecture/07-security.md +194 -0
- package/docs/future-architecture/architecture/08-networking.md +149 -0
- package/docs/future-architecture/architecture/09-templates.md +122 -0
- package/docs/future-architecture/architecture/10-observability.md +121 -0
- package/docs/future-architecture/design-notes.md +72 -0
- package/docs/future-architecture/gaps.md +281 -0
- package/docs/future-architecture/phase-template.md +123 -0
- package/docs/future-architecture/references.md +225 -0
- package/docs/future-architecture/research/01-kata-containers.md +100 -0
- package/docs/future-architecture/research/02-e2b-infra.md +133 -0
- package/docs/future-architecture/research/03-coder.md +115 -0
- package/docs/future-architecture/research/04-cloud-hypervisor.md +99 -0
- package/docs/future-architecture/research/05-firecracker.md +114 -0
- package/docs/future-architecture/research/06-agent-sandbox.md +142 -0
- package/docs/future-architecture/research/07-chromedp.md +78 -0
- package/docs/future-architecture/research/08-microsandbox.md +78 -0
- package/docs/future-architecture/research/09-agentbox.md +135 -0
- package/docs/future-architecture/research/10-sysbox.md +100 -0
- package/docs/future-architecture/research/11-firecracker-containerd.md +93 -0
- package/docs/future-architecture/research/12-docker-socket-proxy.md +59 -0
- package/docs/future-architecture/research/14-e2b-desktop-and-surf.md +107 -0
- package/docs/future-architecture/research/18-open-webui-terminals-observed.md +135 -0
- package/docs/future-architecture/research/bank-buyer.md +96 -0
- package/docs/future-architecture/research/enthusiast-audience.md +106 -0
- package/docs/future-architecture/research/proof-uipath-anthropic-2026-05.md +76 -0
- package/docs/future-architecture/research/widemoat-thesis-advisor.md +124 -0
- package/docs/future-architecture/roadmap.md +438 -0
- package/docs/kata-runtime.md +267 -0
- package/docs/kubernetes.md +86 -0
- package/docs/logo.png +0 -0
- package/docs/multi-cli.md +161 -0
- package/docs/openwebui-filter.md +134 -0
- package/docs/roadmap/implementation-roadmap.md +104 -0
- package/docs/sandbox-contents.svg +229 -0
- package/docs/screenshots/01-create-document.png +0 -0
- package/docs/screenshots/02-file-preview.png +0 -0
- package/docs/screenshots/03-browser-viewer.png +0 -0
- package/docs/screenshots/04-sub-agent-terminal.png +0 -0
- package/docs/screenshots/05-chat-overview.png +0 -0
- package/docs/screenshots/06-sub-agent-dashboard.png +0 -0
- package/docs/screenshots/07-frontend-design-skill.png +0 -0
- package/docs/screenshots/08-pptx-skill.png +0 -0
- package/docs/screenshots/09-skill-creator.png +0 -0
- package/docs/screenshots/10-data-chart.png +0 -0
- package/docs/shared-browser.svg +102 -0
- package/docs/system-prompt.md +113 -0
- package/docs/terminal-flow.svg +69 -0
- package/examples/helm/README.md +20 -0
- package/examples/helm/standalone/values.yaml +49 -0
- package/examples/helm/with-open-webui/README.md +99 -0
- package/examples/helm/with-open-webui/values-computer-use.yaml +32 -0
- package/examples/helm/with-open-webui/values-open-webui.yaml +67 -0
- package/fonts/NotoEmoji-Regular.ttf +0 -0
- package/helm/computer-use-server/.helmignore +17 -0
- package/helm/computer-use-server/Chart.yaml +32 -0
- package/helm/computer-use-server/README.md +211 -0
- package/helm/computer-use-server/templates/NOTES.txt +66 -0
- package/helm/computer-use-server/templates/_helpers.tpl +115 -0
- package/helm/computer-use-server/templates/configmap-dind-init.yaml +82 -0
- package/helm/computer-use-server/templates/configmap.yaml +18 -0
- package/helm/computer-use-server/templates/deployment.yaml +248 -0
- package/helm/computer-use-server/templates/ingress.yaml +38 -0
- package/helm/computer-use-server/templates/networkpolicy.yaml +50 -0
- package/helm/computer-use-server/templates/pdb.yaml +16 -0
- package/helm/computer-use-server/templates/pvc-data.yaml +20 -0
- package/helm/computer-use-server/templates/pvc-skills-cache.yaml +20 -0
- package/helm/computer-use-server/templates/pvc-user-data.yaml +20 -0
- package/helm/computer-use-server/templates/pvc-var-lib-docker.yaml +27 -0
- package/helm/computer-use-server/templates/secret.yaml +23 -0
- package/helm/computer-use-server/templates/service.yaml +22 -0
- package/helm/computer-use-server/templates/serviceaccount.yaml +15 -0
- package/helm/computer-use-server/templates/tests/test-health.yaml +23 -0
- package/helm/computer-use-server/values.schema.json +183 -0
- package/helm/computer-use-server/values.yaml +297 -0
- package/lychee.toml +36 -0
- package/openwebui/Dockerfile +52 -0
- package/openwebui/README.md +38 -0
- package/openwebui/functions/README.md +48 -0
- package/openwebui/functions/computer_link_filter.py +487 -0
- package/openwebui/init.sh +305 -0
- package/openwebui/patches/README.md +44 -0
- package/openwebui/patches/fix_artifacts_auto_show.py +441 -0
- package/openwebui/patches/fix_attached_files_position.py +87 -0
- package/openwebui/patches/fix_large_tool_args.py +156 -0
- package/openwebui/patches/fix_large_tool_results.py +289 -0
- package/openwebui/patches/fix_preview_url_detection.py +230 -0
- package/openwebui/patches/fix_skip_embedding_chat_files.py +229 -0
- package/openwebui/patches/fix_skip_rag_files_native_fc.py +100 -0
- package/openwebui/patches/fix_tool_loop_errors.py +510 -0
- package/package.json +39 -0
- package/requirements.txt +112 -0
- package/scripts/check-config.sh +141 -0
- package/scripts/docs-lint/ai-slop-detector.sh +202 -0
- package/scripts/docs-lint/architecture-tree-whitelist.sh +131 -0
- package/scripts/docs-lint/ascii-diagram-detector.sh +58 -0
- package/scripts/docs-lint/front-matter-validator.sh +97 -0
- package/scripts/docs-lint/gitignored-ref-detector.sh +122 -0
- package/scripts/docs-lint/identity-email-detector.sh +48 -0
- package/scripts/docs-lint/test-linters.sh +354 -0
- package/scripts/docs-lint/wc-budget.sh +61 -0
- package/scripts/githooks/pre-push +75 -0
- package/server.json +13 -0
- package/settings-wrapper/Dockerfile +9 -0
- package/settings-wrapper/README.md +119 -0
- package/settings-wrapper/app.py +113 -0
- package/settings-wrapper/requirements.txt +2 -0
- package/settings-wrapper/skills.json +25 -0
- package/skills/README.md +46 -0
- package/skills/examples/algorithmic-art/SKILL.md +405 -0
- package/skills/examples/algorithmic-art/templates/generator_template.js +223 -0
- package/skills/examples/algorithmic-art/templates/viewer.html +601 -0
- package/skills/examples/artifacts-builder/SKILL.md +74 -0
- package/skills/examples/artifacts-builder/scripts/bundle-artifact.sh +54 -0
- package/skills/examples/artifacts-builder/scripts/init-artifact.sh +322 -0
- package/skills/examples/artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- package/skills/examples/canvas-design/LICENSE.txt +202 -0
- package/skills/examples/canvas-design/SKILL.md +130 -0
- package/skills/examples/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/skills/examples/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/skills/examples/copy-editing/SKILL.md +447 -0
- package/skills/examples/copy-editing/evals/evals.json +89 -0
- package/skills/examples/copy-editing/references/plain-english-alternatives.md +394 -0
- package/skills/examples/internal-comms/LICENSE.txt +202 -0
- package/skills/examples/internal-comms/SKILL.md +32 -0
- package/skills/examples/internal-comms/examples/3p-updates.md +47 -0
- package/skills/examples/internal-comms/examples/company-newsletter.md +65 -0
- package/skills/examples/internal-comms/examples/faq-answers.md +30 -0
- package/skills/examples/internal-comms/examples/general-comms.md +16 -0
- package/skills/examples/mcp-builder/SKILL.md +328 -0
- package/skills/examples/mcp-builder/reference/evaluation.md +602 -0
- package/skills/examples/mcp-builder/reference/mcp_best_practices.md +915 -0
- package/skills/examples/mcp-builder/reference/node_mcp_server.md +916 -0
- package/skills/examples/mcp-builder/reference/python_mcp_server.md +752 -0
- package/skills/examples/mcp-builder/scripts/connections.py +151 -0
- package/skills/examples/mcp-builder/scripts/evaluation.py +373 -0
- package/skills/examples/mcp-builder/scripts/example_evaluation.xml +22 -0
- package/skills/examples/mcp-builder/scripts/requirements.txt +2 -0
- package/skills/examples/product-marketing-context/SKILL.md +241 -0
- package/skills/examples/product-marketing-context/evals/evals.json +85 -0
- package/skills/examples/single-cell-rna-qc/SKILL.md +175 -0
- package/skills/examples/single-cell-rna-qc/references/scverse_qc_guidelines.md +186 -0
- package/skills/examples/single-cell-rna-qc/scripts/qc_analysis.py +232 -0
- package/skills/examples/single-cell-rna-qc/scripts/qc_core.py +233 -0
- package/skills/examples/single-cell-rna-qc/scripts/qc_plotting.py +235 -0
- package/skills/examples/skill-creator/SKILL.md +355 -0
- package/skills/examples/skill-creator/references/output-patterns.md +82 -0
- package/skills/examples/skill-creator/references/workflows.md +28 -0
- package/skills/examples/skill-creator/scripts/init_skill.py +303 -0
- package/skills/examples/skill-creator/scripts/package_skill.py +110 -0
- package/skills/examples/skill-creator/scripts/quick_validate.py +95 -0
- package/skills/examples/slack-gif-creator/SKILL.md +254 -0
- package/skills/examples/slack-gif-creator/core/easing.py +234 -0
- package/skills/examples/slack-gif-creator/core/frame_composer.py +176 -0
- package/skills/examples/slack-gif-creator/core/gif_builder.py +269 -0
- package/skills/examples/slack-gif-creator/core/validators.py +136 -0
- package/skills/examples/slack-gif-creator/requirements.txt +4 -0
- package/skills/examples/social-content/SKILL.md +278 -0
- package/skills/examples/social-content/evals/evals.json +92 -0
- package/skills/examples/social-content/references/platforms.md +170 -0
- package/skills/examples/social-content/references/post-templates.md +177 -0
- package/skills/examples/social-content/references/reverse-engineering.md +195 -0
- package/skills/examples/theme-factory/SKILL.md +59 -0
- package/skills/examples/theme-factory/theme-showcase.pdf +0 -0
- package/skills/examples/theme-factory/themes/arctic-frost.md +19 -0
- package/skills/examples/theme-factory/themes/botanical-garden.md +19 -0
- package/skills/examples/theme-factory/themes/desert-rose.md +19 -0
- package/skills/examples/theme-factory/themes/forest-canopy.md +19 -0
- package/skills/examples/theme-factory/themes/golden-hour.md +19 -0
- package/skills/examples/theme-factory/themes/midnight-galaxy.md +19 -0
- package/skills/examples/theme-factory/themes/modern-minimalist.md +19 -0
- package/skills/examples/theme-factory/themes/ocean-depths.md +19 -0
- package/skills/examples/theme-factory/themes/sunset-boulevard.md +19 -0
- package/skills/examples/theme-factory/themes/tech-innovation.md +19 -0
- package/skills/examples/web-artifacts-builder/LICENSE.txt +202 -0
- package/skills/examples/web-artifacts-builder/SKILL.md +74 -0
- package/skills/examples/web-artifacts-builder/scripts/bundle-artifact.sh +54 -0
- package/skills/examples/web-artifacts-builder/scripts/init-artifact.sh +322 -0
- package/skills/examples/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- package/skills/examples/writing-skills/SKILL.md +655 -0
- package/skills/examples/writing-skills/anthropic-best-practices.md +1150 -0
- package/skills/examples/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
- package/skills/examples/writing-skills/graphviz-conventions.dot +172 -0
- package/skills/examples/writing-skills/persuasion-principles.md +187 -0
- package/skills/examples/writing-skills/render-graphs.js +168 -0
- package/skills/examples/writing-skills/testing-skills-with-subagents.md +384 -0
- package/skills/public/describe-image/SKILL.md +105 -0
- package/skills/public/describe-image/scripts/describe.py +389 -0
- package/skills/public/doc-coauthoring/SKILL.md +375 -0
- package/skills/public/docx/LICENSE.txt +30 -0
- package/skills/public/docx/SKILL.md +199 -0
- package/skills/public/docx/docx-js.md +350 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/skills/public/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/skills/public/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/skills/public/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/skills/public/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/skills/public/docx/ooxml/schemas/mce/mc.xsd +75 -0
- package/skills/public/docx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
- package/skills/public/docx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
- package/skills/public/docx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
- package/skills/public/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/skills/public/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/skills/public/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/skills/public/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/skills/public/docx/ooxml/scripts/pack.py +159 -0
- package/skills/public/docx/ooxml/scripts/unpack.py +29 -0
- package/skills/public/docx/ooxml/scripts/validate.py +69 -0
- package/skills/public/docx/ooxml/scripts/validation/__init__.py +15 -0
- package/skills/public/docx/ooxml/scripts/validation/base.py +951 -0
- package/skills/public/docx/ooxml/scripts/validation/docx.py +274 -0
- package/skills/public/docx/ooxml/scripts/validation/pptx.py +315 -0
- package/skills/public/docx/ooxml/scripts/validation/redlining.py +279 -0
- package/skills/public/docx/ooxml.md +632 -0
- package/skills/public/docx/scripts/__init__.py +1 -0
- package/skills/public/docx/scripts/document.py +1292 -0
- package/skills/public/docx/scripts/templates/comments.xml +3 -0
- package/skills/public/docx/scripts/templates/commentsExtended.xml +3 -0
- package/skills/public/docx/scripts/templates/commentsExtensible.xml +3 -0
- package/skills/public/docx/scripts/templates/commentsIds.xml +3 -0
- package/skills/public/docx/scripts/templates/people.xml +3 -0
- package/skills/public/docx/scripts/utilities.py +374 -0
- package/skills/public/file-reading/LICENSE.txt +30 -0
- package/skills/public/file-reading/SKILL.md +350 -0
- package/skills/public/frontend-design/LICENSE.txt +177 -0
- package/skills/public/frontend-design/SKILL.md +42 -0
- package/skills/public/gitlab-explorer/SKILL.md +174 -0
- package/skills/public/gitlab-explorer/references/git-commands.md +323 -0
- package/skills/public/gitlab-explorer/references/glab-commands.md +282 -0
- package/skills/public/gitlab-explorer/scripts/check_gitlab_auth.sh +109 -0
- package/skills/public/pdf/FORMS.md +205 -0
- package/skills/public/pdf/REFERENCE.md +612 -0
- package/skills/public/pdf/SKILL.md +364 -0
- package/skills/public/pdf/scripts/check_bounding_boxes.py +70 -0
- package/skills/public/pdf/scripts/check_bounding_boxes_test.py +226 -0
- package/skills/public/pdf/scripts/check_fillable_fields.py +12 -0
- package/skills/public/pdf/scripts/convert_pdf_to_images.py +35 -0
- package/skills/public/pdf/scripts/create_validation_image.py +41 -0
- package/skills/public/pdf/scripts/extract_form_field_info.py +152 -0
- package/skills/public/pdf/scripts/fill_fillable_fields.py +114 -0
- package/skills/public/pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
- package/skills/public/pdf-reading/LICENSE.txt +30 -0
- package/skills/public/pdf-reading/REFERENCE.md +196 -0
- package/skills/public/pdf-reading/SKILL.md +305 -0
- package/skills/public/playwright-cli/SKILL.md +278 -0
- package/skills/public/playwright-cli/references/request-mocking.md +87 -0
- package/skills/public/playwright-cli/references/running-code.md +232 -0
- package/skills/public/playwright-cli/references/session-management.md +169 -0
- package/skills/public/playwright-cli/references/storage-state.md +275 -0
- package/skills/public/playwright-cli/references/test-generation.md +88 -0
- package/skills/public/playwright-cli/references/tracing.md +139 -0
- package/skills/public/playwright-cli/references/video-recording.md +43 -0
- package/skills/public/pptx/LICENSE.txt +30 -0
- package/skills/public/pptx/SKILL.md +484 -0
- package/skills/public/pptx/css.md +335 -0
- package/skills/public/pptx/html2pptx.md +893 -0
- package/skills/public/pptx/html2pptx.tgz +0 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/skills/public/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/skills/public/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/skills/public/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/skills/public/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/skills/public/pptx/ooxml/schemas/mce/mc.xsd +75 -0
- package/skills/public/pptx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
- package/skills/public/pptx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
- package/skills/public/pptx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
- package/skills/public/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/skills/public/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/skills/public/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/skills/public/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/skills/public/pptx/ooxml/scripts/pack.py +159 -0
- package/skills/public/pptx/ooxml/scripts/unpack.py +29 -0
- package/skills/public/pptx/ooxml/scripts/validate.py +69 -0
- package/skills/public/pptx/ooxml/scripts/validation/__init__.py +15 -0
- package/skills/public/pptx/ooxml/scripts/validation/base.py +951 -0
- package/skills/public/pptx/ooxml/scripts/validation/docx.py +274 -0
- package/skills/public/pptx/ooxml/scripts/validation/pptx.py +315 -0
- package/skills/public/pptx/ooxml/scripts/validation/redlining.py +279 -0
- package/skills/public/pptx/ooxml.md +427 -0
- package/skills/public/pptx/scripts/inventory.py +1020 -0
- package/skills/public/pptx/scripts/rearrange.py +231 -0
- package/skills/public/pptx/scripts/replace.py +385 -0
- package/skills/public/pptx/scripts/thumbnail.py +450 -0
- package/skills/public/skill-creator/SKILL.md +356 -0
- package/skills/public/skill-creator/references/output-patterns.md +82 -0
- package/skills/public/skill-creator/references/workflows.md +28 -0
- package/skills/public/skill-creator/scripts/init_skill.py +303 -0
- package/skills/public/skill-creator/scripts/package_skill.py +110 -0
- package/skills/public/skill-creator/scripts/quick_validate.py +95 -0
- package/skills/public/sub-agent/SKILL.md +186 -0
- package/skills/public/sub-agent/references/security-review.md +153 -0
- package/skills/public/sub-agent/references/usage.md +207 -0
- package/skills/public/sub-agent/scripts/list_subagent_models.sh +22 -0
- package/skills/public/test-driven-development/SKILL.md +371 -0
- package/skills/public/test-driven-development/testing-anti-patterns.md +299 -0
- package/skills/public/webapp-testing/LICENSE.txt +202 -0
- package/skills/public/webapp-testing/SKILL.md +96 -0
- package/skills/public/webapp-testing/examples/console_logging.py +35 -0
- package/skills/public/webapp-testing/examples/element_discovery.py +40 -0
- package/skills/public/webapp-testing/examples/static_html_automation.py +33 -0
- package/skills/public/webapp-testing/scripts/with_server.py +106 -0
- package/skills/public/xlsx/LICENSE.txt +30 -0
- package/skills/public/xlsx/SKILL.md +316 -0
- package/skills/public/xlsx/preview_data.py +93 -0
- package/skills/public/xlsx/recalc.py +178 -0
- package/tests/README.md +42 -0
- package/tests/fixtures/cli/claude_v0.9.2.0_argv.json +46 -0
- package/tests/fixtures/cli/claude_v0.9.2.0_stdout.json +32 -0
- package/tests/fixtures/cli/codex_run.jsonl +4 -0
- package/tests/fixtures/cli/opencode_run.jsonl +6 -0
- package/tests/integration/README.md +56 -0
- package/tests/integration/conftest.py +280 -0
- package/tests/integration/pytest.ini +13 -0
- package/tests/integration/test_mcp_auth.py +85 -0
- package/tests/integration/test_mcp_tools.py +101 -0
- package/tests/integration/test_workspace_lifecycle.py +125 -0
- package/tests/orchestrator/mock_llm_server.py +343 -0
- package/tests/orchestrator/test_cli_adapters.py +566 -0
- package/tests/orchestrator/test_cli_adapters_live.py +527 -0
- package/tests/orchestrator/test_cli_runtime.py +451 -0
- package/tests/orchestrator/test_docker_manager.py +302 -0
- package/tests/orchestrator/test_dynamic_instructions.py +69 -0
- package/tests/orchestrator/test_mcp_resources.py +140 -0
- package/tests/orchestrator/test_mcp_tools.py +224 -0
- package/tests/orchestrator/test_passthrough_isolation.py +201 -0
- package/tests/orchestrator/test_readme_in_container.py +76 -0
- package/tests/orchestrator/test_render_cache.py +84 -0
- package/tests/orchestrator/test_runtime_cli_endpoint.py +108 -0
- package/tests/orchestrator/test_single_user_mode.py +212 -0
- package/tests/orchestrator/test_startup_warnings.py +123 -0
- package/tests/orchestrator/test_sub_agent_dispatch.py +327 -0
- package/tests/orchestrator/test_subagent_claude_compat.py +367 -0
- package/tests/orchestrator/test_system_prompt_endpoint.py +191 -0
- package/tests/orchestrator/test_tool_descriptions.py +52 -0
- package/tests/orchestrator/test_view_image.py +201 -0
- package/tests/patches/conftest.py +30 -0
- package/tests/patches/fixtures/__init__.py +10 -0
- package/tests/patches/fixtures/middleware_v0.9.1.py +5057 -0
- package/tests/patches/fixtures/middleware_v0.9.2.py +5120 -0
- package/tests/patches/fixtures/retrieval_v0.9.1.py +2684 -0
- package/tests/patches/fixtures/retrieval_v0.9.2.py +2700 -0
- package/tests/patches/test_fix_attached_files_position.py +118 -0
- package/tests/patches/test_fix_large_tool_args.py +130 -0
- package/tests/patches/test_fix_large_tool_results.py +531 -0
- package/tests/patches/test_fix_skip_embedding_chat_files.py +160 -0
- package/tests/patches/test_fix_skip_rag_files_native_fc.py +120 -0
- package/tests/patches/test_fix_tool_loop_errors.py +128 -0
- package/tests/security/test_path_traversal_app.py +132 -0
- package/tests/security/test_path_traversal_docker.py +36 -0
- package/tests/security/test_path_traversal_settings.py +87 -0
- package/tests/security/test_safe_path_util.py +166 -0
- package/tests/security/test_xss_preview.py +46 -0
- package/tests/test-default-model-resolution.py +136 -0
- package/tests/test-docker-image.sh +358 -0
- package/tests/test-list-subagent-models.sh +421 -0
- package/tests/test-mcp-endpoint-live.sh +92 -0
- package/tests/test-mcp-native-surface.sh +213 -0
- package/tests/test-no-cyrillic.sh +135 -0
- package/tests/test-opencode-error-mapping.py +130 -0
- package/tests/test-pr88-skills.sh +305 -0
- package/tests/test-project-structure.sh +202 -0
- package/tests/test-single-user-mode.sh +269 -0
- package/tests/test-skill-no-hardcoded-models.sh +65 -0
- package/tests/test-subagent-cli-surface.py +137 -0
- package/tests/test-subagent-runtime.sh +109 -0
- package/tests/test_codex_toml_converter.py +204 -0
- package/tests/test_default_resolver_no_legacy_global.py +159 -0
- package/tests/test_filter.py +648 -0
- package/tests/test_init_sh_unchanged.sh +49 -0
- package/tests/test_opencode_alias_map_drop.py +144 -0
- package/tests/test_requirements.py +91 -0
- package/tests/test_subagent_docstring.py +193 -0
- package/tests/test_tools.py +34 -0
- package/vendor/extract-text/README.md +46 -0
- package/vendor/extract-text/extract-text +0 -0
|
@@ -0,0 +1,552 @@
|
|
|
1
|
+
<!-- SPDX-License-Identifier: FSL-1.1-Apache-2.0 -->
|
|
2
|
+
<!-- Copyright (c) 2025 Open Computer Use Contributors -->
|
|
3
|
+
|
|
4
|
+
# 16 — Antipatterns by phase (operational decision log)
|
|
5
|
+
|
|
6
|
+
> Source: internal antipattern notes + footgun sections in `research/01-12` + production-gap notes.
|
|
7
|
+
>
|
|
8
|
+
> **This is a decision log, not a generic survey.** Each entry filtered for our stack (k8s + Kata + Cloud Hypervisor + Rust agent ([ADR-0002](./adr/0002-guest-agent-language-go.md)) + Go control plane ([ADR-0001](./adr/0001-control-plane-language-go.md)) + Computer Use + connect-go L4↔L3 RPC). Antipatterns that don't apply to our chosen stack are dropped explicitly. Each kept antipattern carries **our choice** in addition to "don't do this".
|
|
9
|
+
>
|
|
10
|
+
> Use this doc when planning a phase: before you write code for Phase N, scan the entries tagged `Phase N` here. Reviewers reject PRs that reintroduce documented antipatterns without an ADR.
|
|
11
|
+
|
|
12
|
+
## Format
|
|
13
|
+
|
|
14
|
+
Each entry has:
|
|
15
|
+
- **Antipattern** — what NOT to do.
|
|
16
|
+
- **Source** — internal antipattern note or `research/NN-*.md` section.
|
|
17
|
+
- **Failure mode** — what breaks in production.
|
|
18
|
+
- **Our choice** — locked decision for our stack.
|
|
19
|
+
- **First-bites phase(s)** — where it would FIRST appear if we slip.
|
|
20
|
+
- **Detection** — how a reviewer catches it.
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Section A — Excluded as not applicable to our stack
|
|
25
|
+
|
|
26
|
+
Listed so future contributors don't waste time rediscovering generic warnings that don't apply to us. Each carries the reason it's excluded.
|
|
27
|
+
|
|
28
|
+
| Antipattern | Source | Why excluded |
|
|
29
|
+
|---|---|---|
|
|
30
|
+
| Mounting `/var/run/docker.sock` into sandbox | internal note | We don't ship Docker in prod — only containerd under Kata ([ADR-0003](../adr/0003-docker-poc-first-then-k8s.md)). Compose PoC removes DinD by Phase 5. |
|
|
31
|
+
| Mounting host `/var/lib/docker` | internal note | Same as above. |
|
|
32
|
+
| Maintaining both Compose AND Helm | internal note | Compose stays as PoC only; Helm is the prod artifact ([ADR-0003](../adr/0003-docker-poc-first-then-k8s.md)). |
|
|
33
|
+
| Using gVisor for browser-heavy workloads | internal note | We chose Kata+CH for browser; gVisor only for non-browser code-exec tier (Phase 7, experimental). |
|
|
34
|
+
| Single global runtime for all workloads | internal note | One cluster = one runtime today (kata-ch). Multi-tier templates per-tenant arrive in Phase 9 — record as a Phase-9-research item. |
|
|
35
|
+
| Building 7 GiB sandbox images | internal note | Implementation discipline, not an architectural choice; tracked in image-build CI not here. |
|
|
36
|
+
| Using `kubectl exec` to inject session config | internal note | We have L1 agent with connect-go `Configure` RPC. `kubectl exec` is never used for session injection. |
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Section B — Antipatterns we WILL hit if we slip
|
|
41
|
+
|
|
42
|
+
Ordered by phase where they FIRST become possible.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
### A1 — `rm`-the-binary is not security by itself
|
|
47
|
+
|
|
48
|
+
- **Source.** Internal antipattern note. Linux keeps the inode alive: with root inside the sandbox, `cp /proc/1/exe /tmp/extracted_binary` recovers the agent binary.
|
|
49
|
+
- **Failure.** Compromised root in sandbox copies our agent out of `/proc/1/exe` and reverses it.
|
|
50
|
+
- **Our choice — defense in depth, not single layer.**
|
|
51
|
+
- `memfd_create` so the binary never touches a real FS path.
|
|
52
|
+
- `hidepid=2` on `/proc` mount inside sandbox.
|
|
53
|
+
- `PR_SET_DUMPABLE=0` on agent PID 1.
|
|
54
|
+
- Non-root inside sandbox where the runtime allows (Kata is fine).
|
|
55
|
+
- Separate PID namespace (Kata gives this for free).
|
|
56
|
+
- **Phase.** 7 (Rust agent) — implement all four together; do not ship the agent rewrite without them.
|
|
57
|
+
- **Detection.** PR-review checklist for Phase 7. CI test asserts `cat /proc/1/exe` from inside a built sandbox returns nothing.
|
|
58
|
+
|
|
59
|
+
### A2 — Service per pod / Service per session
|
|
60
|
+
|
|
61
|
+
- **Source.** Internal antipattern note.
|
|
62
|
+
- **Failure.** N services × M sessions → kube-apiserver melts; endpoints controller stalls; iptables/IPVS rules churn.
|
|
63
|
+
- **Our choice — one headless Service per pool, app-layer routing in control plane.**
|
|
64
|
+
- One headless Service per warm pool, pod DNS via stable name.
|
|
65
|
+
- L4 reads `session_id → pod_IP` from Valkey (KV) and forwards directly. No per-session k8s Service.
|
|
66
|
+
- **Phase.** 5 (`KubernetesProvider`) — wire this in from day one; never go through a per-session Service even for "quick prototype".
|
|
67
|
+
- **Detection.** Grep Helm templates and provider code for `kind: Service` inside any session-creation path. Should not exist outside the pool-level Service.
|
|
68
|
+
|
|
69
|
+
### A3 — Cluster autoscaler without overprovisioning
|
|
70
|
+
|
|
71
|
+
- **Source.** Internal antipattern note.
|
|
72
|
+
- **Failure.** Cold start dominated by 2–5 min node provisioning; spike of new sessions → users see "creating sandbox…" for minutes; SLO violation.
|
|
73
|
+
- **Our choice — overprovisioning pause-pods with `priorityClassName`.**
|
|
74
|
+
- Pause-pods at lower priority occupy headroom on each node group.
|
|
75
|
+
- Real sandboxes evict pause-pods instantly → no cold-node wait.
|
|
76
|
+
- Cluster autoscaler still scales pause-pod ReplicaSet up so headroom is restored.
|
|
77
|
+
- **Phase.** 5 (k8s deployment shape) — ship pause-pods in the Helm chart as opt-in `overprovisioning.enabled`, default off; flip on in Phase 9 when kata bare-metal pool lands and cold-start cost matters.
|
|
78
|
+
- **Detection.** Look for `priorityClassName: system-cluster-critical` or `overprovisioning` in Helm values; alert on `cluster_autoscaler_unschedulable_pods_count` spikes.
|
|
79
|
+
|
|
80
|
+
### A4 — Session affinity via k8s `sessionAffinity: ClientIP`
|
|
81
|
+
|
|
82
|
+
- **Source.** Internal antipattern note.
|
|
83
|
+
- **Failure.** Under corporate NAT / mobile carriers all traffic shares one IP → all sessions pin to one pod → that pod overloaded, others idle. Capacity adds don't help latency.
|
|
84
|
+
- **Our choice — application-layer routing only.**
|
|
85
|
+
- L4 looks up `session_id → pod_IP` in Valkey on every request.
|
|
86
|
+
- Forward HTTP directly to pod IP.
|
|
87
|
+
- **Never** `Service.spec.sessionAffinity: ClientIP` in any chart.
|
|
88
|
+
- **Phase.** 6 (Go control plane) — implement at the gateway layer.
|
|
89
|
+
- **Detection.** Grep all Helm templates and k8s manifests for `sessionAffinity`; default value is `None`, we never set anything else.
|
|
90
|
+
|
|
91
|
+
### A5 — Pod IP caching without TTL or invalidation
|
|
92
|
+
|
|
93
|
+
- **Source.** Internal antipattern note.
|
|
94
|
+
- **Failure.** Pod dies → IP reassigned to another tenant → traffic for session X lands in tenant Y's pod → tenant data crosses tenants.
|
|
95
|
+
- **Our choice — TTL + watch-driven invalidation.**
|
|
96
|
+
- Valkey entries TTL 60 s.
|
|
97
|
+
- L4 runs a k8s Informer `watch` on sandbox pods.
|
|
98
|
+
- On `Pod Deleted` / `Pod Failed` event → invalidate entry by name.
|
|
99
|
+
- Routing fetches fresh IP from Informer cache, not stale Valkey.
|
|
100
|
+
- **Phase.** 5 (KubernetesProvider event subscription) + Phase 6 (KV semantics in L4).
|
|
101
|
+
- **Detection.** Code review: any cache write of `pod_IP` must be followed by a delete-on-event path. Integration test: kill a pod mid-session, confirm next request 404s with "session lost" (not "wrong pod served it").
|
|
102
|
+
|
|
103
|
+
### A6 — `kubectl exec` to inject env into running Chromium (or any tool)
|
|
104
|
+
|
|
105
|
+
- **Source.** Internal antipattern note.
|
|
106
|
+
- **Failure.** Env mutation after process start does not affect already-spawned process; you set `HTTP_PROXY=...` and Chromium still bypasses the egress proxy because it cached env at start.
|
|
107
|
+
- **Our choice — Chromium starts AFTER `Configure`.**
|
|
108
|
+
- Pool member = warm with pre-loaded Chrome dependencies, **but Chrome not running**.
|
|
109
|
+
- On session assign: L4 calls `Agent.Configure(ctx)` → agent receives env/secrets/JWT → agent starts Chrome with the right env in one step.
|
|
110
|
+
- We never mutate env on a running process.
|
|
111
|
+
- **Phase.** 7 (Rust agent) — `Configure` must complete before any tool RPC accepted.
|
|
112
|
+
- **Detection.** Agent state machine has `unconfigured | configured | running`. RPCs other than `Configure` return `FailedPrecondition` in `unconfigured`. Test asserts.
|
|
113
|
+
|
|
114
|
+
### A7 — Trust agent for authentication
|
|
115
|
+
|
|
116
|
+
- **Source.** Internal antipattern note.
|
|
117
|
+
- **Failure.** If L1 is owned, in-process auth check is bypassable anyway. False sense of security. Key rotation forces sandbox restart.
|
|
118
|
+
- **Our choice — auth in L4 only.**
|
|
119
|
+
- L1 trusts whoever can reach its connect-go port.
|
|
120
|
+
- Network policy + Kata isolation ensures only L4 can.
|
|
121
|
+
- Agent does NOT validate JWTs.
|
|
122
|
+
- **Counter-pattern note (industry-observed):** some designs add public-key JWT verification at L1 as defense-in-depth. We revisit if we ever expose L1 over TCP at scale; for vsock/localhost it stays "trust the network".
|
|
123
|
+
- **Phase.** 7 (Rust agent design).
|
|
124
|
+
- **Detection.** Grep `jwt.Parse`, `jwt.Verify` in agent code — should not exist.
|
|
125
|
+
|
|
126
|
+
### A8 — Long-lived egress tokens (e.g. 30 days)
|
|
127
|
+
|
|
128
|
+
- **Source.** Internal antipattern note.
|
|
129
|
+
- **Failure.** Mid-session compromise → attacker has 30-day exfil window. Rotating signing key invalidates all live tokens at once.
|
|
130
|
+
- **Our choice — per-session JWT, lifetime = session-max (4 h).**
|
|
131
|
+
- L4 mints on `CreateSession`.
|
|
132
|
+
- Egress proxy validates signature + `exp` + `allowed_hosts` on every request.
|
|
133
|
+
- Key rotation ≤ 90 d with overlap window (`kid` header).
|
|
134
|
+
- Refresh endpoint for sessions > 4 h ([`research/09-agentbox.md`](./09-agentbox.md) §6).
|
|
135
|
+
- **Phase.** 4 (broker) + Phase 8 (egress proxy).
|
|
136
|
+
- **Detection.** Audit log lists JWT `exp` per session; alert on `exp > now + 4h`. Code review: signing function clamps `exp` to session-max.
|
|
137
|
+
|
|
138
|
+
### A9 — Persistent sandbox state by default
|
|
139
|
+
|
|
140
|
+
- **Source.** Internal antipattern note.
|
|
141
|
+
- **Failure.** Disk bloat; compliance liability (GDPR/HIPAA — old PII on disk); compromised sandbox reads prior tenant's data.
|
|
142
|
+
- **Our choice — ephemeral by default, no persistent sandbox-workspace tier.**
|
|
143
|
+
- Computer Use sessions are hours, not days.
|
|
144
|
+
- "Continue yesterday's session" is served by **Tier 4 (S3 with `filesystem_id` token auth)**, not by a persistent Tier 3 workspace. The next VM re-binds to the same `filesystem_id` prefix — the user's files reappear without any persistent workspace volume.
|
|
145
|
+
- **No PVC for the session workspace tier in any template.** Locked — see [A37](#a37--pvc-for-sandbox-session-workspace).
|
|
146
|
+
- **Encryption still applies to the persistent user-data tier (Tier 4).** Moving continuity to Tier 4 does not retire the encryption requirement — the `filesystem_id`-keyed S3 prefix carries the same obligation. See [A34](#a34--no-per-session-encryption-for-persistent-data).
|
|
147
|
+
- **Phase.** 3 (storage MVP) + ongoing.
|
|
148
|
+
- **Detection.** Helm chart's default `SandboxTemplate.persistence: ephemeral`. Validate at admission.
|
|
149
|
+
|
|
150
|
+
### A10 — Embedding secrets in sandbox images
|
|
151
|
+
|
|
152
|
+
- **Source.** Internal antipattern note.
|
|
153
|
+
- **Failure.** Image registry compromise → all secrets ever shipped leaked. Rotation requires rebuild.
|
|
154
|
+
- **Our choice — secrets only via `Agent.Configure` RPC.**
|
|
155
|
+
- Image is stateless.
|
|
156
|
+
- L4 broker mints scoped tokens per session, delivered via `Configure(ctx)`.
|
|
157
|
+
- Image-build CI rejects PRs that add `ENV ANTHROPIC_API_KEY=…` etc.
|
|
158
|
+
- **Phase.** 4 (broker) — but the discipline starts at Phase 1 image hygiene.
|
|
159
|
+
- **Detection.** `grep -E '(API_KEY|TOKEN|SECRET)=.+' Dockerfile`. CI gate.
|
|
160
|
+
|
|
161
|
+
### A11 — Builds without reproducibility
|
|
162
|
+
|
|
163
|
+
- **Source.** Internal antipattern note.
|
|
164
|
+
- **Failure.** Two builds of the same source produce different images → can't verify supply-chain → cosign signature on wrong artifact passes admission.
|
|
165
|
+
- **Our choice — pinned versions + `SOURCE_DATE_EPOCH` + cosign + verify at admission.**
|
|
166
|
+
- Phase 1: pin every `apt`/`pip`/`npm` version in `Dockerfile`.
|
|
167
|
+
- Phase 5: cosign-sign images in release CI; deploy by `@sha256:`.
|
|
168
|
+
- Phase 5: admission controller verifies signature (`sigstore-policy-controller` or `connaisseur`).
|
|
169
|
+
- **Phase.** 1 (pin), 5 (sign + verify).
|
|
170
|
+
- **Detection.** Build twice in CI, assert image digests match. Admission rejects unsigned images in test cluster.
|
|
171
|
+
|
|
172
|
+
### A12 — Warm pool without bounds
|
|
173
|
+
|
|
174
|
+
- **Source.** Internal antipattern note (warm-pool patterns).
|
|
175
|
+
- **Failure.** Unbounded pool → cluster OOM. No `maxAge` → stale members carry leaked state.
|
|
176
|
+
- **Our choice — `min/target/max + refillRate + maxAge`.**
|
|
177
|
+
- Defaults: `minSize=5, targetSize=20, maxSize=50, refillRate=3/s, maxAge=30m`.
|
|
178
|
+
- All four are knobs in `SandboxTemplate`.
|
|
179
|
+
- Pool controller smooths target against recent demand (EWMA over 5 min).
|
|
180
|
+
- **Phase.** 2 (skeleton, `minSize=0`) → Phase 5 (real defaults).
|
|
181
|
+
- **Detection.** Template admission rejects `maxSize` unset or `maxAge > 1h`.
|
|
182
|
+
|
|
183
|
+
### A13 — No idle timeout
|
|
184
|
+
|
|
185
|
+
- **Source.** Internal antipattern note.
|
|
186
|
+
- **Failure.** Sandbox runs forever after user closes browser → wasted RAM/CPU at scale.
|
|
187
|
+
- **Our choice — multi-tier cascade.**
|
|
188
|
+
- User session idle (no `/mcp` calls): 10 min → L4 sends `Agent.Shutdown`.
|
|
189
|
+
- Sandbox no-agent-requests: 30 min → L3 force-stops.
|
|
190
|
+
- Max session lifetime: 4 h → L4 terminates.
|
|
191
|
+
- Agent self-shutdown safety net: 2 h since last `Configure` → agent exits.
|
|
192
|
+
- Pool member age: 30 min unleased → recycled.
|
|
193
|
+
- **Phase.** 2 (skeleton in pool-manager), Phase 6 (full cascade in L4).
|
|
194
|
+
- **Detection.** Metrics: histogram of session-lifetime; alert if p99 > 4 h.
|
|
195
|
+
|
|
196
|
+
### A14 — Logging user output verbatim
|
|
197
|
+
|
|
198
|
+
- **Source.** Internal antipattern note.
|
|
199
|
+
- **Failure.** Stdout from agent contains user secrets (printed API keys, file contents) → logs become a credential-harvest target → SOC2/PCI audit fails.
|
|
200
|
+
- **Our choice — structured metadata only.**
|
|
201
|
+
- Log: `{session_id, tool, exit_code, duration_ms, stdout_bytes, stderr_bytes}`.
|
|
202
|
+
- Never: stdout/stderr verbatim, env values, file contents, HTTP bodies through egress proxy.
|
|
203
|
+
- Optional "verbose" pipeline (off by default) for debugging, behind stricter RBAC, separate retention.
|
|
204
|
+
- **Phase.** 6 (L4 emission) + Phase 8 (audit pipeline).
|
|
205
|
+
- **Detection.** Schema validation on audit-log writes; forbidden fields rejected. Code review for `logger.info(f"stdout: {output}")` patterns.
|
|
206
|
+
|
|
207
|
+
### A15 — `SIGKILL` without grace period
|
|
208
|
+
|
|
209
|
+
- **Source.** Internal antipattern note.
|
|
210
|
+
- **Failure.** Chrome / Python killed mid-write → temp files, sockets, pipes left over → next session inherits stale state.
|
|
211
|
+
- **Our choice — `terminationGracePeriodSeconds: 30` + cooperative shutdown.**
|
|
212
|
+
- L4 sends `Agent.Shutdown` RPC → agent drops page caches → `SIGTERM` to children → waits 5 s → `SIGKILL` survivors → exits.
|
|
213
|
+
- k8s grace period 30 s gives agent time.
|
|
214
|
+
- WS clients receive shutdown frame to flush.
|
|
215
|
+
- **Phase.** 7 (agent shutdown RPC) + Phase 5 (Helm `terminationGracePeriodSeconds`).
|
|
216
|
+
- **Detection.** Test: send `Shutdown` to an agent running `sleep 60`; verify exit within 10 s with clean tmp dir.
|
|
217
|
+
|
|
218
|
+
### A16 — `restartPolicy: Always` for sandbox
|
|
219
|
+
|
|
220
|
+
- **Source.** Internal antipattern note.
|
|
221
|
+
- **Failure.** Sandbox is a session, not a service. Auto-restart on crash → session resurrects with stale state, mid-tool-call → user sees inexplicable behavior.
|
|
222
|
+
- **Our choice — `restartPolicy: Never`.**
|
|
223
|
+
- On crash → L3 emits event → L4 invalidates session → user notified.
|
|
224
|
+
- Pool members never auto-restart; the controller spawns fresh members instead.
|
|
225
|
+
- **Phase.** 5 (Helm template) — default and not overridable.
|
|
226
|
+
- **Detection.** Admission webhook rejects `restartPolicy != Never` in any sandbox-labeled pod.
|
|
227
|
+
|
|
228
|
+
### A17 — Treat sandboxes as cattle indiscriminately
|
|
229
|
+
|
|
230
|
+
- **Source.** Internal antipattern note.
|
|
231
|
+
- **Failure.** Replacing an in-use sandbox mid-session = losing the user's work.
|
|
232
|
+
- **Our choice — pool members = cattle; assigned sandboxes = pets.**
|
|
233
|
+
- Pre-assignment: replaceable, recycled freely.
|
|
234
|
+
- Post-assignment (leased to session): immutable identity, never auto-replaced.
|
|
235
|
+
- This is exactly the agent-sandbox CRD model — adopt as-is ([`research/06-agent-sandbox.md`](./research/06-agent-sandbox.md)).
|
|
236
|
+
- **Phase.** 5 (k8s provider semantics).
|
|
237
|
+
- **Detection.** Pool controller code paths: `evictable` filter must check lease state.
|
|
238
|
+
|
|
239
|
+
### A18 — "Build yet another platform"
|
|
240
|
+
|
|
241
|
+
- **Source.** Internal antipattern note + our own scope discipline.
|
|
242
|
+
- **Failure.** We end up maintaining an inferior k8s operator + inferior egress proxy + inferior hypervisor instead of building Computer Use product.
|
|
243
|
+
- **Our choice — adopt + integrate, don't reinvent.**
|
|
244
|
+
- **Orchestration:** `agent-sandbox` CRDs ([`research/06-agent-sandbox.md`](./research/06-agent-sandbox.md)).
|
|
245
|
+
- **Runtime:** Kata + Cloud Hypervisor as-is.
|
|
246
|
+
- **Egress proxy:** start with agentbox Python ([`research/09-agentbox.md`](./research/09-agentbox.md)), fork-and-port to Go in Phase 8 only when scale demands.
|
|
247
|
+
- **Agent:** ours (Go per [ADR-0002](../adr/0002-guest-agent-language-go.md)).
|
|
248
|
+
- **Control plane:** ours (Go per [ADR-0001](../adr/0001-control-plane-language-go.md)) — this is the differentiator.
|
|
249
|
+
- **Phase.** All — referenced in each phase's "Depends on" sections.
|
|
250
|
+
- **Detection.** Any PR adding `internal/operator/` or `internal/hypervisor/` triggers ADR-required gate.
|
|
251
|
+
|
|
252
|
+
### A19 — Premature cold-start optimization
|
|
253
|
+
|
|
254
|
+
- **Source.** Internal operations note.
|
|
255
|
+
- **Failure.** Spending months on CH snapshot/restore before knowing if warm pool alone solves cold start → engineering capacity wasted.
|
|
256
|
+
- **Our choice — measure first.**
|
|
257
|
+
- Phase 5: warm pool with `minSize=5`. Measure p99 session-create.
|
|
258
|
+
- Phase 10: snapshot/restore only if measured p99 still misses SLO.
|
|
259
|
+
- Do not implement snapshotting in Phases 6–9.
|
|
260
|
+
- **Phase.** 10 gated on Phase-5-onwards measurements.
|
|
261
|
+
- **Detection.** Phase 10 spec must cite p99 numbers from production showing warm pool insufficient.
|
|
262
|
+
|
|
263
|
+
### A20 — `cache=always` in virtio-fs at density
|
|
264
|
+
|
|
265
|
+
- **Source.** [`research/04-cloud-hypervisor.md`](./04-cloud-hypervisor.md) §3, §9.
|
|
266
|
+
- **Failure.** Host page cache multiplies per VM → 100 VMs × shared dir = 100× the RAM. Thrashing, OOM.
|
|
267
|
+
- **Our choice — `cache=never` for untrusted-tier templates.** `cache=always` only for low-density single-tenant trusted templates with explicit memory budget.
|
|
268
|
+
- **Phase.** 9 (Kata templates) — virtiofsd args baked into template defaults.
|
|
269
|
+
- **Detection.** Admission webhook rejects `kata-*` template if `cache=always` is set without `template.tier=trusted`.
|
|
270
|
+
|
|
271
|
+
### A21 — Skipping seccomp in production
|
|
272
|
+
|
|
273
|
+
- **Source.** [`research/04-cloud-hypervisor.md`](./04-cloud-hypervisor.md) §9, [`research/05-firecracker.md`](./05-firecracker.md) §6.
|
|
274
|
+
- **Failure.** Hypervisor escapes that seccomp would have blocked become host compromises.
|
|
275
|
+
- **Our choice — seccomp ON by default, `--seccomp log` only for debug, never `--seccomp false` in prod.**
|
|
276
|
+
- **Phase.** 9 (Kata templates).
|
|
277
|
+
- **Detection.** Helm values reject `--seccomp false`. Runtime audit: alert on syscall denials from VMM threads.
|
|
278
|
+
|
|
279
|
+
### A22 — GPU passthrough on snapshottable templates
|
|
280
|
+
|
|
281
|
+
- **Source.** [`research/04-cloud-hypervisor.md`](./04-cloud-hypervisor.md) §6.
|
|
282
|
+
- **Failure.** VFIO devices break CH snapshot. Template silently fails to snapshot; pause/resume loses state.
|
|
283
|
+
- **Our choice — no GPU on any snapshottable template.** If a future template needs GPU, mark it `snapshot: disabled` explicitly.
|
|
284
|
+
- **Phase.** 10 (snapshot/restore).
|
|
285
|
+
- **Detection.** Admission webhook rejects `snapshot.enabled && devices[*].vfio`.
|
|
286
|
+
|
|
287
|
+
### A23 — Landlock hotplug paths not pre-declared
|
|
288
|
+
|
|
289
|
+
- **Source.** [`research/04-cloud-hypervisor.md`](./04-cloud-hypervisor.md) §9.
|
|
290
|
+
- **Failure.** Hot-add disk denied by Landlock at runtime → silent failure.
|
|
291
|
+
- **Our choice — pre-declare all possible mount paths in `--landlock-rules`** at VM creation. Phase-9 templates carry a `hotplug_paths` field.
|
|
292
|
+
- **Phase.** 9.
|
|
293
|
+
- **Detection.** Template validation: `hotplug_paths` must include any path referenced by `mounts[*]`.
|
|
294
|
+
|
|
295
|
+
### A24 — Hostname allowlist without DNS-rebinding defense
|
|
296
|
+
|
|
297
|
+
- **Source.** [`research/09-agentbox.md`](./09-agentbox.md) §9 + internal egress patterns.
|
|
298
|
+
- **Failure.** Allowlist `api.example.com`; attacker controls DNS; resolves to internal IP → SSRF.
|
|
299
|
+
- **Our choice — proxy resolves DNS itself, pins to public IP ranges only.**
|
|
300
|
+
- Egress proxy uses a known recursive resolver, not the sandbox's resolv.conf.
|
|
301
|
+
- Resolved IP checked against RFC1918 blocklist before connect.
|
|
302
|
+
- Per-session JWT also carries `allowed_hosts`, but DNS resolution is proxy-owned.
|
|
303
|
+
- **Phase.** 8 (egress proxy implementation).
|
|
304
|
+
- **Detection.** Proxy unit tests for DNS rebinding cases (low-TTL host that flips IP between resolutions).
|
|
305
|
+
|
|
306
|
+
### A25 — HTTP body / response logging through egress proxy
|
|
307
|
+
|
|
308
|
+
- **Source.** Internal security note ("Do not log").
|
|
309
|
+
- **Failure.** Bodies contain secrets (API responses with tokens, downloaded files). Audit pipeline = secrets store.
|
|
310
|
+
- **Our choice — egress proxy logs metadata only.** `{ts, session_id, target_host, port, verdict, bytes_out, bytes_in, latency_ms, jwt_id}`. Never bodies, never headers beyond Host/User-Agent.
|
|
311
|
+
- **Phase.** 8.
|
|
312
|
+
- **Detection.** Proxy code review: response handler must not pass body to logger. Audit schema validates field set.
|
|
313
|
+
|
|
314
|
+
### A26 — Logging environment variable values
|
|
315
|
+
|
|
316
|
+
- **Source.** Internal security note ("Do not log").
|
|
317
|
+
- **Failure.** Diagnostic log dumps `os.environ` → secrets leak.
|
|
318
|
+
- **Our choice — log env keys only, never values.** If a debug log needs a value, it goes through the sensitive-log pipeline with RBAC.
|
|
319
|
+
- **Phase.** 6, 7.
|
|
320
|
+
- **Detection.** Code review for `repr(env)` / `f"{os.environ}"`.
|
|
321
|
+
|
|
322
|
+
### A27 — Single global agent binary (no versioning)
|
|
323
|
+
|
|
324
|
+
- **Source.** Inferred from `research/02-e2b-infra.md` §12 (version-gated metrics) + internal operations notes.
|
|
325
|
+
- **Failure.** Updating the agent binary forces all sandboxes to upgrade simultaneously. Rollback impossible without rebuilding the world.
|
|
326
|
+
- **Our choice — agent version baked in image tag; per-template image digest.** L4 metrics + control queries the agent's version on `Configure`; can keep multiple agent versions in production simultaneously (one per template).
|
|
327
|
+
- **Phase.** 7.
|
|
328
|
+
- **Detection.** `Agent.Health` response includes `agent_version`. L4 logs agent_version alongside session_id.
|
|
329
|
+
|
|
330
|
+
### A28 — `RuntimeClass` baked globally (no per-template override)
|
|
331
|
+
|
|
332
|
+
- **Source.** [`research/06-agent-sandbox.md`](./06-agent-sandbox.md) §3, §9.
|
|
333
|
+
- **Failure.** Want to add gVisor as experimental tier or kata-fc for free trial — requires changing default; affects everyone.
|
|
334
|
+
- **Our choice — `runtime_class` is a `SandboxTemplate` field, not a deployment default.** Default = kata-ch; templates can override.
|
|
335
|
+
- **Phase.** 9 (multi-template) — already aligned in [`architecture/09-templates.md`](../architecture/09-templates.md).
|
|
336
|
+
- **Detection.** Helm chart has no `runtimeClassName` outside template specs. Provider passes `template.runtime_class`.
|
|
337
|
+
|
|
338
|
+
### A29 — No template smoke test in deployment
|
|
339
|
+
|
|
340
|
+
- **Source.** Internal operations notes + general.
|
|
341
|
+
- **Failure.** New template version ships, all sessions assigned to it fail because of a typo.
|
|
342
|
+
- **Our choice — every template ships with a smoke test job that spawns it once, runs a tiny exec (`echo ok`), tears down.** Helm post-install hook runs it; rollout blocked on failure.
|
|
343
|
+
- **Phase.** 5 (Helm) + every template change.
|
|
344
|
+
- **Detection.** Template PR-required: matching `smoke_test:` block.
|
|
345
|
+
|
|
346
|
+
### A30 — Implicit assumptions about kernel version
|
|
347
|
+
|
|
348
|
+
- **Source.** [`research/10-sysbox.md`](./10-sysbox.md) §7 (CVE table requires kernel ≥ 5.16).
|
|
349
|
+
- **Failure.** Helm chart deploys on RHEL 8 (kernel 4.18) → sysbox vulnerable to CVE-2022-0185 → escape.
|
|
350
|
+
- **Our choice — Helm pre-install hook validates node kernels.**
|
|
351
|
+
- Required: kernel ≥ 5.16 on all sysbox nodes; ≥ 5.5 for vsock; KVM available on Kata nodes.
|
|
352
|
+
- Mismatch → install fails with explanatory error.
|
|
353
|
+
- **Phase.** 5.
|
|
354
|
+
- **Detection.** Hook script in chart; CI matrix on multiple kernel versions.
|
|
355
|
+
|
|
356
|
+
### A31 — Wildcard allowed-hosts (`*.com`)
|
|
357
|
+
|
|
358
|
+
- **Source.** Industry-observed egress-allowlist failure mode (internal design note).
|
|
359
|
+
- **Failure.** Operator sets `*.com` "for convenience" → effectively allows any host → egress proxy useless.
|
|
360
|
+
- **Our choice — JWT validator rejects patterns that match more than two label-segments wildcards (`*.*.com` etc) and rejects suffix-only TLD matches (`*.com`, `*.org`, `*.io`).**
|
|
361
|
+
- **Phase.** 8.
|
|
362
|
+
- **Detection.** Proxy unit test for each rejection class; admission rejects templates with overly broad `egress_baseline`.
|
|
363
|
+
|
|
364
|
+
### A32 — No timeout on CONNECT tunnels
|
|
365
|
+
|
|
366
|
+
- **Source.** [`research/09-agentbox.md`](./09-agentbox.md) §3, §10.
|
|
367
|
+
- **Failure.** Slow upstream → tunnel goroutine pinned forever → resource exhaustion at egress proxy.
|
|
368
|
+
- **Our choice — read/write timeouts on every tunnel; default 5 min idle, 1 h total.**
|
|
369
|
+
- **Phase.** 8.
|
|
370
|
+
- **Detection.** Proxy config required: `tunnel_idle_timeout` + `tunnel_max_lifetime`. Reject if unset.
|
|
371
|
+
|
|
372
|
+
### A33 — No key rotation for egress JWT signing key
|
|
373
|
+
|
|
374
|
+
- **Source.** [`research/09-agentbox.md`](./09-agentbox.md) §8.
|
|
375
|
+
- **Failure.** Key compromise = forge any session's egress JWT until manual rotation.
|
|
376
|
+
- **Our choice — RS256/ES256 with `kid` header; rotate ≤ 90 d via secret broker; overlap window 24 h.**
|
|
377
|
+
- Old + new public keys both accepted during overlap; signer uses new.
|
|
378
|
+
- Egress proxy fetches public-key set on startup + every 1 h.
|
|
379
|
+
- **Phase.** 4 (broker) + Phase 8 (egress proxy).
|
|
380
|
+
- **Detection.** Broker metric: time-since-last-rotation; alert at 80 d.
|
|
381
|
+
|
|
382
|
+
### A34 — No per-session encryption for persistent data
|
|
383
|
+
|
|
384
|
+
- **Source.** Internal security notes.
|
|
385
|
+
- **Failure.** Persistent PVC reused across tenants without scrubbing → data crosses.
|
|
386
|
+
- **Our choice — if persistence enabled, KMS-backed per-session key; data encrypted at rest; key destroyed on session end.**
|
|
387
|
+
- **Phase.** 10 (HA + persistence).
|
|
388
|
+
- **Detection.** Template admission: `persistence != ephemeral` requires `encryption.kms_key_id` field.
|
|
389
|
+
|
|
390
|
+
### A35 — Seccomp filter too permissive (e.g. allows `ptrace`)
|
|
391
|
+
|
|
392
|
+
- **Source.** [`research/05-firecracker.md`](./05-firecracker.md) §6.
|
|
393
|
+
- **Failure.** Compromised agent ptraces host processes if seccomp lets it.
|
|
394
|
+
- **Our choice — per-thread allowlists, segmented by role; ptrace, `process_vm_readv/writev`, `kcmp` all denied unless explicitly justified.** Test fixture asserts denial.
|
|
395
|
+
- **Phase.** 7 (agent seccomp profile) + Phase 9 (CH seccomp).
|
|
396
|
+
- **Detection.** Profile diff requires ADR for any new syscall added to allowlist.
|
|
397
|
+
|
|
398
|
+
### A36 — Session affinity cache not invalidated on pod restart
|
|
399
|
+
|
|
400
|
+
- **Source.** Same as A5 but generalized — pods can restart even without delete (OOM-kill, liveness fail).
|
|
401
|
+
- **Failure.** Pod restarts with new IP, Valkey holds old IP, session calls timeout for `TTL` window.
|
|
402
|
+
- **Our choice — Informer watches pod **status**, not just lifecycle events.** Any phase change → invalidate. Validate via integration test that asserts restarted-pod scenario.
|
|
403
|
+
- **Phase.** 6 (L4 KV management).
|
|
404
|
+
- **Detection.** Integration test from A5.
|
|
405
|
+
|
|
406
|
+
### A37 — PVC for sandbox session workspace
|
|
407
|
+
|
|
408
|
+
- **Source.** Internal design note. Pattern: serve the per-session home directory from a per-VM CoW snapshot (qcow2 backing / dm-thin / ZFS clone) of a golden rootfs — **not** from a per-session PVC.
|
|
409
|
+
- **Failure.**
|
|
410
|
+
- **Cross-tenant leak (security).** A reused PVC that isn't scrubbed exactly right between sessions = previous tenant's data to the next one. The scrub step is operationally fragile; CoW snapshots eliminate the failure mode by design (delta is discarded, golden image is the only shared state and it is read-only).
|
|
411
|
+
- **Reset isn't free.** Wiping a 10 GiB PVC before a session lease takes seconds-to-minutes; discarding a qcow2 delta is constant-time.
|
|
412
|
+
- **Claim controller drag.** Per-session PVC create/delete melts the apiserver at high session churn ([A2](#a2--service-per-pod--service-per-session)-class failure). CoW snapshots are a storage-layer concern, no k8s object on the create path.
|
|
413
|
+
- **No multi-region story.** PVCs are AZ-pinned (RWO). The CoW-rootfs + S3-FUSE pattern is location-agnostic: the next VM can spawn in a different region and re-bind to the same `filesystem_id` prefix.
|
|
414
|
+
- **Wrong primitive shape.** "Continue yesterday's session" is a **Tier 4** concern (the user's *data*), not a Tier 3 concern (the agent's *runtime fs*). The PVC tries to solve the wrong problem.
|
|
415
|
+
- **Our choice — Tier 3 is always ephemeral; CoW snapshot is the implementation.**
|
|
416
|
+
- **No PVC for the session workspace tier in any template.** Helm admission rejects `persistence != ephemeral` on Tier 3.
|
|
417
|
+
- **Phase 9 (Kata / FC):** Tier 3 = CoW snapshot of golden rootfs via `qcow2` backing files / `dm-thin` snapshots / ZFS `clone`.
|
|
418
|
+
- **Phase 5 (sysbox / runc):** Tier 3 = tmpfs or overlayfs over the image layer.
|
|
419
|
+
- **Persistence for the user, when needed,** is served by Tier 4 (S3 + FUSE) with `filesystem_id` session-token auth — the next VM re-binds to the same prefix.
|
|
420
|
+
- PVC remains the right primitive for **classical platform workloads** (PostgreSQL, Redis, Prometheus, etcd) — none of which our sandbox runtime hosts. This antipattern is scoped to the sandbox session workspace tier specifically.
|
|
421
|
+
- **Phase.** 3 (storage MVP) — admission rule lands here. 9 (Kata templates) — CoW backend wires in.
|
|
422
|
+
- **Detection.**
|
|
423
|
+
- Grep every Helm template / `SandboxTemplate` for `kind: PersistentVolumeClaim` inside a sandbox spec — should not exist outside platform-services charts.
|
|
424
|
+
- Admission webhook: `SandboxTemplate.mounts[type=workspace].persistence` must be `ephemeral`; any other value rejected with a link to this entry.
|
|
425
|
+
- Integration test: spawn → write file → terminate → spawn fresh → assert file absent (clean reset). No scrub step in the provisioning path.
|
|
426
|
+
|
|
427
|
+
---
|
|
428
|
+
|
|
429
|
+
## Section C — Antipatterns specific to OUR stack
|
|
430
|
+
|
|
431
|
+
These came up while filtering and do not appear in the inherited list because they're consequences of our connect-go / Kata / multi-replica choices.
|
|
432
|
+
|
|
433
|
+
### C1 — Not using vsock when available
|
|
434
|
+
|
|
435
|
+
- **Failure.** TCP-only L1 transport works on runc/sysbox but loses the IP-exhaustion + zero-network-stack-overhead benefits of vsock on Kata. Also blocks "single binary across all runtimes" claim.
|
|
436
|
+
- **Our choice — vsock primary, TCP fallback. Runtime auto-detect.**
|
|
437
|
+
- Agent boot: `if /dev/vsock exists → bind AF_VSOCK; else TCP 0.0.0.0:port`.
|
|
438
|
+
- Same binary across all runtimes.
|
|
439
|
+
- **Phase.** 7.
|
|
440
|
+
- **Detection.** Agent integration test on both transports.
|
|
441
|
+
|
|
442
|
+
### C2 — Kata pods scheduled to control-plane node pool
|
|
443
|
+
|
|
444
|
+
- **Failure.** Kata needs bare-metal + KVM. Putting Kata pods on cloud-managed VM nodes either fails (no KVM) or silently falls back to runc (no isolation).
|
|
445
|
+
- **Our choice — dedicated bare-metal node pool with taints + `nodeSelector`.**
|
|
446
|
+
- Pool taint: `runtime=kata:NoSchedule`.
|
|
447
|
+
- Kata templates carry matching toleration + `nodeSelector: runtime=kata`.
|
|
448
|
+
- Control plane / Valkey / egress proxy stay on regular nodes.
|
|
449
|
+
- **Phase.** 9.
|
|
450
|
+
- **Detection.** Helm chart pre-install validates that a node pool with the right label/taint exists. Admission rejects kata templates if no matching node found.
|
|
451
|
+
|
|
452
|
+
### C3 — Bidi gRPC streaming for everything
|
|
453
|
+
|
|
454
|
+
- **Failure.** Bidi streaming is the most complex shape; using it where unary or server-stream would do bloats client code, complicates retries, and obscures observability.
|
|
455
|
+
- **Our choice — 4 RPC shapes by semantic.**
|
|
456
|
+
- **Unary** — `Configure`, `Health`, `Stop`.
|
|
457
|
+
- **Server-stream** — `Exec` (output), `Events` (lifecycle).
|
|
458
|
+
- **Client-stream** — `Upload`.
|
|
459
|
+
- **Bidi** — only `CDP` and `Screencast` (genuinely bidirectional).
|
|
460
|
+
- **Phase.** 6 (.proto authoring) + Phase 7 (agent service).
|
|
461
|
+
- **Detection.** `.proto` review: bidi without justification = blocked.
|
|
462
|
+
|
|
463
|
+
### C4 — Long-lived subscribe stream agent → orchestrator
|
|
464
|
+
|
|
465
|
+
- **Failure.** Agent holds a long-lived stream from L3 → L3 reconnects on every L3 pod restart → cascading reconnect storms when L3 rolls.
|
|
466
|
+
- **Our choice — push model: L3 → agent.**
|
|
467
|
+
- L3 calls `Agent.Exec` / `Agent.Configure` per request.
|
|
468
|
+
- Lifecycle events flow agent → L3 only on demand (`Events` stream pulled by L3 watcher).
|
|
469
|
+
- No agent-initiated persistent connection to L3.
|
|
470
|
+
- **Phase.** 7.
|
|
471
|
+
- **Detection.** Agent code review: no `connect.NewClient(...).LifecycleEvents(ctx)` loop running at boot.
|
|
472
|
+
|
|
473
|
+
### C5 — Single-replica L4 control plane
|
|
474
|
+
|
|
475
|
+
- **Failure.** L4 dies → entire fleet undeployable; rolling deploy needs downtime; HA impossible.
|
|
476
|
+
- **Our choice — min 3 replicas + k8s `Lease`-based leader election.**
|
|
477
|
+
- Leader handles lifecycle reconcile (pool refill, GC).
|
|
478
|
+
- Followers serve user-facing MCP / REST / WS.
|
|
479
|
+
- Leader election via `coordination.k8s.io/Lease`.
|
|
480
|
+
- **Phase.** 6 (Go control plane HA from day one) — non-negotiable.
|
|
481
|
+
- **Detection.** Helm chart default `replicas: 3`; lower triggers warning. Integration test kills leader, verifies failover < 10 s.
|
|
482
|
+
|
|
483
|
+
### C6 — Lifecycle reconcile decisions made by every replica
|
|
484
|
+
|
|
485
|
+
- **Failure.** Every L4 replica tries to spawn pool members → races, duplicate pods, quota exhaustion.
|
|
486
|
+
- **Our choice — leader-only reconcile.**
|
|
487
|
+
- Pool refill, GC, secret rotation, audit-log compaction = leader-only.
|
|
488
|
+
- User request handling = any replica.
|
|
489
|
+
- **Phase.** 6.
|
|
490
|
+
- **Detection.** Code review: any controller-loop code path must guard on `if !leader { return }`.
|
|
491
|
+
|
|
492
|
+
### C7 — One runtime baked into config
|
|
493
|
+
|
|
494
|
+
- **Failure.** Wedged to kata-clh forever; can't add kata-fc for fast cold start or sysbox for internal trusted tier without re-arch.
|
|
495
|
+
- **Our choice — `RuntimeClass` is template-level config, never baked.**
|
|
496
|
+
- Already covered by [A28](#a28--runtimeclass-baked-globally-no-per-template-override) but worth restating: this is the "default" we lock in Phase 9, not the only option.
|
|
497
|
+
- **Phase.** 9 onwards.
|
|
498
|
+
- **Detection.** Same as A28.
|
|
499
|
+
|
|
500
|
+
### C8 — Connect-go service without buf-lint in CI
|
|
501
|
+
|
|
502
|
+
- **Failure.** `.proto` files drift unchecked, breaking changes ship to production, clients break in mysterious ways.
|
|
503
|
+
- **Our choice — `buf lint` + `buf breaking` in CI from Phase 6 onward.**
|
|
504
|
+
- `buf lint` blocks malformed `.proto`.
|
|
505
|
+
- `buf breaking` blocks wire-incompatible changes against the previously-released branch.
|
|
506
|
+
- **Phase.** 6.
|
|
507
|
+
- **Detection.** CI job presence; PR check status.
|
|
508
|
+
|
|
509
|
+
### C9 — Translating MCP into multiple internal RPC shapes
|
|
510
|
+
|
|
511
|
+
- **Failure.** L4 has 3 different ways to translate `tools/call` → fan-out to L3 → debugging nightmare, MCP semantics partially leak into L3.
|
|
512
|
+
- **Our choice — single `ToolCall` RPC in `Agent` service; L4 gateway is a thin translator.**
|
|
513
|
+
- MCP `tools/call` → exactly one `Agent.ToolCall(name, args)` server-stream.
|
|
514
|
+
- L3 just forwards; no MCP awareness in L3 or L1.
|
|
515
|
+
- **Phase.** 6 + 7.
|
|
516
|
+
- **Detection.** Grep L1/L3 code for `mcp`, `tools/call`, `jsonrpc`: should not appear.
|
|
517
|
+
|
|
518
|
+
### C10 — Treating connect-go HTTP/JSON fallback as production transport
|
|
519
|
+
|
|
520
|
+
- **Failure.** Operators (or us) use the `curl` debug path against the production endpoint at scale → slow, unbatched, no streaming → look like real production traffic patterns and skew metrics.
|
|
521
|
+
- **Our choice — HTTP/JSON is debug-only.** Production clients use gRPC or Connect framing.
|
|
522
|
+
- **Phase.** 6.
|
|
523
|
+
- **Detection.** Metrics segment by transport; alert if HTTP/JSON volume > 5% of gRPC volume.
|
|
524
|
+
|
|
525
|
+
---
|
|
526
|
+
|
|
527
|
+
## Phase index
|
|
528
|
+
|
|
529
|
+
Quick lookup: when planning Phase N, scan these entries.
|
|
530
|
+
|
|
531
|
+
| Phase | Antipatterns to guard against |
|
|
532
|
+
|---|---|
|
|
533
|
+
| 0.5 (docs polish) | A18 (don't build yet another platform — record decisions, don't reimplement) |
|
|
534
|
+
| 1 (provider interface) | A10, A11 (start image hygiene + reproducibility) |
|
|
535
|
+
| 2 (HTTP pool sidecar) | A12 (warm pool bounds), A13 (idle timeout skeleton) |
|
|
536
|
+
| 3 (S3 + squashfs) | A9 (ephemeral by default), A10 (no secrets in image), A34 (encryption if persistence), **A37 (no PVC for sandbox session workspace)** |
|
|
537
|
+
| 4 (secret broker) | A8 (per-session JWT), A33 (signing key rotation) |
|
|
538
|
+
| 5 (Helm + K8sProvider) | A2 (no per-session Service), A3 (overprovisioning), A5/A36 (pod IP cache + watch), A11 (cosign verify), A12 (warm pool real), A15 (graceful shutdown), A16 (`restartPolicy: Never`), A17 (cattle/pets), A29 (smoke tests), A30 (kernel version validation), **A37 (no PVC for sandbox session workspace — admission rule)** |
|
|
539
|
+
| 6 (Go control plane) | A4 (no ClientIP affinity), A5/A36 (informer-driven cache), A8 (mint JWT), A14 (audit metadata only), A26 (no env values in logs), C5 (3 replicas), C6 (leader-only reconcile), C8 (buf-lint), C9 (single ToolCall), C10 (HTTP/JSON debug-only) |
|
|
540
|
+
| 7 (Rust guest agent) | A1 (defense in depth, all 4 layers), A6 (Configure-before-Chrome), A7 (no auth in agent), A15 (cooperative Shutdown RPC), A27 (versioned agent), A35 (tight seccomp), C1 (vsock auto-detect), C3 (4 RPC shapes), C4 (push model) |
|
|
541
|
+
| 8 (egress proxy + audit) | A8 (token lifetime), A14/A25/A26 (log discipline), A24 (DNS rebinding), A31 (wildcard rejection), A32 (CONNECT timeouts), A33 (key rotation overlap) |
|
|
542
|
+
| 9 (Kata + CH) | A20 (`cache=never`), A21 (seccomp ON), A23 (Landlock pre-declare), A28 (template-level RuntimeClass), **A37 (CoW snapshot backend for Tier 3, not PVC)**, C2 (dedicated node pool), C7 (don't bake runtime) |
|
|
543
|
+
| 10 (snapshot/HA) | A19 (measure first), A22 (no GPU on snapshottable), A34 (KMS per session), and the post-restore hardening triad (CRNG reseed, `init_on_free=1`, `CAP_SYS_RESOURCE` drop) |
|
|
544
|
+
|
|
545
|
+
---
|
|
546
|
+
|
|
547
|
+
## How to use this doc
|
|
548
|
+
|
|
549
|
+
1. **At start of every phase.** Read the phase row in the index above. Each entry is a PR-review checkpoint.
|
|
550
|
+
2. **At PR review.** If your PR could trip any listed antipattern → reference it in the PR description with how you avoided it.
|
|
551
|
+
3. **When you find a NEW one.** Add an entry here in the same shape (source, failure, our choice, phase, detection). Don't squirrel away in `research/NN-*.md` skip-notes — those exist for context; this doc is the operational truth.
|
|
552
|
+
4. **When excluding one.** Add to Section A with a one-line reason. Future contributors deserve to see why generic advice doesn't apply.
|