From 90734d29c1cd84102c8ae9b00498ee6c26ff21ad Mon Sep 17 00:00:00 2001 From: NB Date: Mon, 31 Aug 2026 11:26:53 +0000 Subject: [PATCH 1/2] docs(docket skill): document F5/Shape WAF and point to real-Safari actor Cook County Clerk's F5/Shape WAF blocks CDP-driven/headless browser automation regardless of origin IP - confirmed blocked: Cloudflare Browser Rendering, Apify datacenter+residential Playwright, and curl with a realistic UA (even the bare homepage, from a cloud VM and a home network alike). mcp__claude-in-chrome__* drives the same DevTools Protocol class of automation; not directly tested against this portal but flagged as likely blocked given the pattern. Points to chittyentity/actors/chittyactor-cook-county-docket (rewritten same day) as the preferred, verified-working method: a real AppleScript- driven Safari GUI session on chittymini-01. Kept the claude-in-chrome workflow as a documented fallback, renumbered steps accordingly, and corrected the case-number format note (no dashes - 20261701287, not 2024-D-007847). Version bump 1.0.0 -> 1.0.1 so the installed plugin cache actually picks this up (in-place source edits without a version bump don't reach machines - see chittymarket PR #57 / fleet-capability-drift.sh). Includes regenerated codex-skills projection + dispatch-state (caught by the repo's own pre-commit drift check). Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_016RuqeURZ1b7NB74U2nqqSS --- canonical/.dispatch-state/skills/docket.json | 6 +- canonical/skills/docket.md | 55 ++++++++++++++++--- .../chittyos-legal/.claude-plugin/plugin.json | 2 +- .../codex-skills/docket/SKILL.md | 55 ++++++++++++++++--- plugins/chittyos-legal/skills/docket/SKILL.md | 55 ++++++++++++++++--- 5 files changed, 142 insertions(+), 31 deletions(-) diff --git a/canonical/.dispatch-state/skills/docket.json b/canonical/.dispatch-state/skills/docket.json index b400d2d..c32f2cb 100644 --- a/canonical/.dispatch-state/skills/docket.json +++ b/canonical/.dispatch-state/skills/docket.json @@ -1,7 +1,7 @@ { - "canonical_sha": "f9347bec540c2ba29bbb3eee38c5f4e85ce2257e", + "canonical_sha": "93c0f8c81edf27a1e31afcb67239152a6ec29250", "targets": { - "claude-code": "803111bcb7aebebd0dc3e68cca383742ee815101", - "codex": "803111bcb7aebebd0dc3e68cca383742ee815101" + "claude-code": "0d26fd940cb79a1c72a5d7163c41eeb22e66b5bc", + "codex": "0d26fd940cb79a1c72a5d7163c41eeb22e66b5bc" } } \ No newline at end of file diff --git a/canonical/skills/docket.md b/canonical/skills/docket.md index f9347be..93c0f8c 100644 --- a/canonical/skills/docket.md +++ b/canonical/skills/docket.md @@ -89,7 +89,36 @@ Pull live docket and update that case's master timeline CSV with new entries. 2. Resolve against the case registry (chittyrouter `CASE_BY_NUMBER` / `CASE_BY_SLUG` or chittyevidence-db `evidence_cases`). 3. If not found: stop, report "unknown case" to caller. Do not fall back. -### Step 2: Load Browser Tools +### Step 2: WAF blocker — read this before choosing a method + +Cook County Clerk's F5/Shape WAF is confirmed (2026-08-31, CFDXN-176/CFDXN-178) to reject +CDP-driven and headless browser automation, and plain HTTP requests, regardless of origin IP: +Cloudflare Browser Rendering (chittyscrape), Apify datacenter Playwright, Apify residential-IP +Playwright, and plain `curl` with a realistic browser User-Agent (even against the bare +homepage) were all blocked identically — from both a cloud datacenter VM and a home-network IP. +The block fingerprints the automation channel itself (CDP artifacts / TLS handshake), not IP +reputation. `mcp__claude-in-chrome__*` drives Chrome via the same DevTools Protocol class of +automation that's confirmed blocked in every other tested form — it has not been directly +tested against this specific portal, but treat it as likely blocked given the pattern, and +prefer the method below unless/until it's confirmed otherwise. + +**Preferred method — real Safari GUI, verified working:** use +`chittyentity/actors/chittyactor-cook-county-docket` (rewritten 2026-08-31). This drives a +genuine, logged-in Safari session via AppleScript (`osascript`/`do JavaScript`) on +`chittymini-01` — the only method confirmed to load the actual search results instead of an F5 +"Request Rejected" page. It requires one-time, console-only permission grants on that specific +Mac (see the actor's `CLAUDE.md`) and cannot run in Docker, on Apify's cloud, or on any headless +Linux node. Invoke it via `python3 main.py ` on `chittymini-01` +directly, or dispatch the Nomad job (`cook-county-docket.nomad.hcl`, parameterized, node-pinned) +from a calling `chittyagent-*` worker. Case-number format for this portal has no dashes +(`20261701287`, not `2024-D-007847`) — confirm the exact format against a case you already know +the answer for before trusting a new one. + +The remaining steps below (claude-in-chrome-based) are kept as a documented fallback only, for +use if the real-Safari actor is unavailable and you want to attempt the CDP path anyway — expect +it to likely hit the same WAF block based on the pattern above. + +### Step 3: Load Browser Tools (fallback path only — see Step 2) ``` ToolSearch: select:mcp__claude-in-chrome__tabs_context_mcp ToolSearch: select:mcp__claude-in-chrome__tabs_create_mcp @@ -99,22 +128,25 @@ ToolSearch: select:mcp__claude-in-chrome__computer ToolSearch: select:mcp__claude-in-chrome__javascript_tool ``` -### Step 3: Navigate to Case Search +### Step 4: Navigate to Case Search (fallback path only) 1. Get tab context: `mcp__claude-in-chrome__tabs_context_mcp` (createIfEmpty: true) 2. Create new tab: `mcp__claude-in-chrome__tabs_create_mcp` 3. Navigate to: `https://casesearch.cookcountyclerkofcourt.org/CivilCaseSearchAPI.aspx` -### Step 4: Search for Case -The site is ASP.NET WebForms. **Do NOT use JavaScript to set form values** — they get cleared on postback. Use direct interaction: +### Step 5: Search for Case (fallback path only) +The site is ASP.NET WebForms. **Do NOT use JavaScript to set form values across a postback +boundary** — they get cleared. (The real-Safari actor works around this by setting every field +and clicking submit inside a single `do JavaScript` call, which does not cross a postback.) Use +direct interaction: 1. **Select Division** per the resolved case (e.g. "Domestic Relations / Child Support" = value "4") 2. **Ensure "Search by Case Number" radio** is selected (first radio button) 3. **Click into the case number text input** (triple_click to select any existing text) -4. **Type case number**: Use `computer` type action with `` from the resolved case (e.g. `2024D007847` for arias-v-bianchi) +4. **Type case number**: Use `computer` type action with `` from the resolved case — no dashes (e.g. `20261701287`, not `2024-D-007847`) 5. **Click "Start New Search"** button (type="submit") 6. **Wait 3-4 seconds** for page load -### Step 5: Read Docket Results +### Step 6: Read Docket Results (fallback path only) Use `read_page` with: - `filter: "all"` - `depth: 10` @@ -133,13 +165,18 @@ Event Desc: [description] Comments: [optional comments] ``` -### Step 6: Parse Results +(The real-Safari actor extracts the same fields more reliably via structured DOM table queries +instead of flattened accessibility-tree text — see its `TABLES_JS` — because multi-line cells, +e.g. a defendant name that wraps across lines, collapse ambiguously in flattened text but stay +unambiguous per-cell in the DOM.) + +### Step 7: Parse Results (fallback path only) Extract from the accessibility tree: 1. **Next court date** from "Future Court Activity" section 2. **All case activities** with date, event description, and comments 3. Compare against the case's master timeline CSV to identify NEW entries -### Step 7: Update Master Timeline (if `/docket update`) +### Step 8: Update Master Timeline (if `/docket update`) **CSV Format** (7 columns): ```csv Date,Event,Entity,Document Title,Description,Evidence Source (file),Link @@ -158,7 +195,7 @@ Date,Event,Entity,Document Title,Description,Evidence Source (file),Link **Append** new entries to the CSV in chronological order. Do NOT duplicate existing entries. -### Step 8: Report +### Step 9: Report Output a formatted summary: ```markdown diff --git a/plugins/chittyos-legal/.claude-plugin/plugin.json b/plugins/chittyos-legal/.claude-plugin/plugin.json index a2c7c2a..47b6bd4 100644 --- a/plugins/chittyos-legal/.claude-plugin/plugin.json +++ b/plugins/chittyos-legal/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "chittyos-legal", - "version": "1.0.0", + "version": "1.0.1", "description": "Legal case management — evidence fact governance, dispute tracking, court docket monitoring, and evidence collection pipeline", "author": { "name": "ChittyOS", diff --git a/plugins/chittyos-legal/codex-skills/docket/SKILL.md b/plugins/chittyos-legal/codex-skills/docket/SKILL.md index 803111b..0d26fd9 100644 --- a/plugins/chittyos-legal/codex-skills/docket/SKILL.md +++ b/plugins/chittyos-legal/codex-skills/docket/SKILL.md @@ -81,7 +81,36 @@ Pull live docket and update that case's master timeline CSV with new entries. 2. Resolve against the case registry (chittyrouter `CASE_BY_NUMBER` / `CASE_BY_SLUG` or chittyevidence-db `evidence_cases`). 3. If not found: stop, report "unknown case" to caller. Do not fall back. -### Step 2: Load Browser Tools +### Step 2: WAF blocker — read this before choosing a method + +Cook County Clerk's F5/Shape WAF is confirmed (2026-08-31, CFDXN-176/CFDXN-178) to reject +CDP-driven and headless browser automation, and plain HTTP requests, regardless of origin IP: +Cloudflare Browser Rendering (chittyscrape), Apify datacenter Playwright, Apify residential-IP +Playwright, and plain `curl` with a realistic browser User-Agent (even against the bare +homepage) were all blocked identically — from both a cloud datacenter VM and a home-network IP. +The block fingerprints the automation channel itself (CDP artifacts / TLS handshake), not IP +reputation. `mcp__claude-in-chrome__*` drives Chrome via the same DevTools Protocol class of +automation that's confirmed blocked in every other tested form — it has not been directly +tested against this specific portal, but treat it as likely blocked given the pattern, and +prefer the method below unless/until it's confirmed otherwise. + +**Preferred method — real Safari GUI, verified working:** use +`chittyentity/actors/chittyactor-cook-county-docket` (rewritten 2026-08-31). This drives a +genuine, logged-in Safari session via AppleScript (`osascript`/`do JavaScript`) on +`chittymini-01` — the only method confirmed to load the actual search results instead of an F5 +"Request Rejected" page. It requires one-time, console-only permission grants on that specific +Mac (see the actor's `CLAUDE.md`) and cannot run in Docker, on Apify's cloud, or on any headless +Linux node. Invoke it via `python3 main.py ` on `chittymini-01` +directly, or dispatch the Nomad job (`cook-county-docket.nomad.hcl`, parameterized, node-pinned) +from a calling `chittyagent-*` worker. Case-number format for this portal has no dashes +(`20261701287`, not `2024-D-007847`) — confirm the exact format against a case you already know +the answer for before trusting a new one. + +The remaining steps below (claude-in-chrome-based) are kept as a documented fallback only, for +use if the real-Safari actor is unavailable and you want to attempt the CDP path anyway — expect +it to likely hit the same WAF block based on the pattern above. + +### Step 3: Load Browser Tools (fallback path only — see Step 2) ``` ToolSearch: select:mcp__claude-in-chrome__tabs_context_mcp ToolSearch: select:mcp__claude-in-chrome__tabs_create_mcp @@ -91,22 +120,25 @@ ToolSearch: select:mcp__claude-in-chrome__computer ToolSearch: select:mcp__claude-in-chrome__javascript_tool ``` -### Step 3: Navigate to Case Search +### Step 4: Navigate to Case Search (fallback path only) 1. Get tab context: `mcp__claude-in-chrome__tabs_context_mcp` (createIfEmpty: true) 2. Create new tab: `mcp__claude-in-chrome__tabs_create_mcp` 3. Navigate to: `https://casesearch.cookcountyclerkofcourt.org/CivilCaseSearchAPI.aspx` -### Step 4: Search for Case -The site is ASP.NET WebForms. **Do NOT use JavaScript to set form values** — they get cleared on postback. Use direct interaction: +### Step 5: Search for Case (fallback path only) +The site is ASP.NET WebForms. **Do NOT use JavaScript to set form values across a postback +boundary** — they get cleared. (The real-Safari actor works around this by setting every field +and clicking submit inside a single `do JavaScript` call, which does not cross a postback.) Use +direct interaction: 1. **Select Division** per the resolved case (e.g. "Domestic Relations / Child Support" = value "4") 2. **Ensure "Search by Case Number" radio** is selected (first radio button) 3. **Click into the case number text input** (triple_click to select any existing text) -4. **Type case number**: Use `computer` type action with `` from the resolved case (e.g. `2024D007847` for arias-v-bianchi) +4. **Type case number**: Use `computer` type action with `` from the resolved case — no dashes (e.g. `20261701287`, not `2024-D-007847`) 5. **Click "Start New Search"** button (type="submit") 6. **Wait 3-4 seconds** for page load -### Step 5: Read Docket Results +### Step 6: Read Docket Results (fallback path only) Use `read_page` with: - `filter: "all"` - `depth: 10` @@ -125,13 +157,18 @@ Event Desc: [description] Comments: [optional comments] ``` -### Step 6: Parse Results +(The real-Safari actor extracts the same fields more reliably via structured DOM table queries +instead of flattened accessibility-tree text — see its `TABLES_JS` — because multi-line cells, +e.g. a defendant name that wraps across lines, collapse ambiguously in flattened text but stay +unambiguous per-cell in the DOM.) + +### Step 7: Parse Results (fallback path only) Extract from the accessibility tree: 1. **Next court date** from "Future Court Activity" section 2. **All case activities** with date, event description, and comments 3. Compare against the case's master timeline CSV to identify NEW entries -### Step 7: Update Master Timeline (if `/docket update`) +### Step 8: Update Master Timeline (if `/docket update`) **CSV Format** (7 columns): ```csv Date,Event,Entity,Document Title,Description,Evidence Source (file),Link @@ -150,7 +187,7 @@ Date,Event,Entity,Document Title,Description,Evidence Source (file),Link **Append** new entries to the CSV in chronological order. Do NOT duplicate existing entries. -### Step 8: Report +### Step 9: Report Output a formatted summary: ```markdown diff --git a/plugins/chittyos-legal/skills/docket/SKILL.md b/plugins/chittyos-legal/skills/docket/SKILL.md index 803111b..0d26fd9 100644 --- a/plugins/chittyos-legal/skills/docket/SKILL.md +++ b/plugins/chittyos-legal/skills/docket/SKILL.md @@ -81,7 +81,36 @@ Pull live docket and update that case's master timeline CSV with new entries. 2. Resolve against the case registry (chittyrouter `CASE_BY_NUMBER` / `CASE_BY_SLUG` or chittyevidence-db `evidence_cases`). 3. If not found: stop, report "unknown case" to caller. Do not fall back. -### Step 2: Load Browser Tools +### Step 2: WAF blocker — read this before choosing a method + +Cook County Clerk's F5/Shape WAF is confirmed (2026-08-31, CFDXN-176/CFDXN-178) to reject +CDP-driven and headless browser automation, and plain HTTP requests, regardless of origin IP: +Cloudflare Browser Rendering (chittyscrape), Apify datacenter Playwright, Apify residential-IP +Playwright, and plain `curl` with a realistic browser User-Agent (even against the bare +homepage) were all blocked identically — from both a cloud datacenter VM and a home-network IP. +The block fingerprints the automation channel itself (CDP artifacts / TLS handshake), not IP +reputation. `mcp__claude-in-chrome__*` drives Chrome via the same DevTools Protocol class of +automation that's confirmed blocked in every other tested form — it has not been directly +tested against this specific portal, but treat it as likely blocked given the pattern, and +prefer the method below unless/until it's confirmed otherwise. + +**Preferred method — real Safari GUI, verified working:** use +`chittyentity/actors/chittyactor-cook-county-docket` (rewritten 2026-08-31). This drives a +genuine, logged-in Safari session via AppleScript (`osascript`/`do JavaScript`) on +`chittymini-01` — the only method confirmed to load the actual search results instead of an F5 +"Request Rejected" page. It requires one-time, console-only permission grants on that specific +Mac (see the actor's `CLAUDE.md`) and cannot run in Docker, on Apify's cloud, or on any headless +Linux node. Invoke it via `python3 main.py ` on `chittymini-01` +directly, or dispatch the Nomad job (`cook-county-docket.nomad.hcl`, parameterized, node-pinned) +from a calling `chittyagent-*` worker. Case-number format for this portal has no dashes +(`20261701287`, not `2024-D-007847`) — confirm the exact format against a case you already know +the answer for before trusting a new one. + +The remaining steps below (claude-in-chrome-based) are kept as a documented fallback only, for +use if the real-Safari actor is unavailable and you want to attempt the CDP path anyway — expect +it to likely hit the same WAF block based on the pattern above. + +### Step 3: Load Browser Tools (fallback path only — see Step 2) ``` ToolSearch: select:mcp__claude-in-chrome__tabs_context_mcp ToolSearch: select:mcp__claude-in-chrome__tabs_create_mcp @@ -91,22 +120,25 @@ ToolSearch: select:mcp__claude-in-chrome__computer ToolSearch: select:mcp__claude-in-chrome__javascript_tool ``` -### Step 3: Navigate to Case Search +### Step 4: Navigate to Case Search (fallback path only) 1. Get tab context: `mcp__claude-in-chrome__tabs_context_mcp` (createIfEmpty: true) 2. Create new tab: `mcp__claude-in-chrome__tabs_create_mcp` 3. Navigate to: `https://casesearch.cookcountyclerkofcourt.org/CivilCaseSearchAPI.aspx` -### Step 4: Search for Case -The site is ASP.NET WebForms. **Do NOT use JavaScript to set form values** — they get cleared on postback. Use direct interaction: +### Step 5: Search for Case (fallback path only) +The site is ASP.NET WebForms. **Do NOT use JavaScript to set form values across a postback +boundary** — they get cleared. (The real-Safari actor works around this by setting every field +and clicking submit inside a single `do JavaScript` call, which does not cross a postback.) Use +direct interaction: 1. **Select Division** per the resolved case (e.g. "Domestic Relations / Child Support" = value "4") 2. **Ensure "Search by Case Number" radio** is selected (first radio button) 3. **Click into the case number text input** (triple_click to select any existing text) -4. **Type case number**: Use `computer` type action with `` from the resolved case (e.g. `2024D007847` for arias-v-bianchi) +4. **Type case number**: Use `computer` type action with `` from the resolved case — no dashes (e.g. `20261701287`, not `2024-D-007847`) 5. **Click "Start New Search"** button (type="submit") 6. **Wait 3-4 seconds** for page load -### Step 5: Read Docket Results +### Step 6: Read Docket Results (fallback path only) Use `read_page` with: - `filter: "all"` - `depth: 10` @@ -125,13 +157,18 @@ Event Desc: [description] Comments: [optional comments] ``` -### Step 6: Parse Results +(The real-Safari actor extracts the same fields more reliably via structured DOM table queries +instead of flattened accessibility-tree text — see its `TABLES_JS` — because multi-line cells, +e.g. a defendant name that wraps across lines, collapse ambiguously in flattened text but stay +unambiguous per-cell in the DOM.) + +### Step 7: Parse Results (fallback path only) Extract from the accessibility tree: 1. **Next court date** from "Future Court Activity" section 2. **All case activities** with date, event description, and comments 3. Compare against the case's master timeline CSV to identify NEW entries -### Step 7: Update Master Timeline (if `/docket update`) +### Step 8: Update Master Timeline (if `/docket update`) **CSV Format** (7 columns): ```csv Date,Event,Entity,Document Title,Description,Evidence Source (file),Link @@ -150,7 +187,7 @@ Date,Event,Entity,Document Title,Description,Evidence Source (file),Link **Append** new entries to the CSV in chronological order. Do NOT duplicate existing entries. -### Step 8: Report +### Step 9: Report Output a formatted summary: ```markdown From 2f19a43b1dcece3dd1b21f1851154c28c6bbfe35 Mon Sep 17 00:00:00 2001 From: NB Date: Sat, 5 Sep 2026 02:35:43 +0000 Subject: [PATCH 2/2] docs(charter): ChittyMarket is a central remote, not local-only MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Pentad codified "Domain: Local-only (no HTTP deployment)" and listed "Exposing a network API or HTTP endpoints" under IS NOT Responsible For. That directly contradicts the Centralized Registration rule, which requires capability definitions to live on the backend and be reachable by every channel rather than in per-client local config. Operator ratified: this should never have been local-only. - CHARTER: domain is central remote; serving definitions over a network API is now in scope; /market sync reconciles the local projection against backend state (backend wins) rather than against the filesystem. - CHITTY: marketplace.json is a generated projection, not the source of truth; the source of truth is the backend capability index. market.agent.chitty.cc is recorded as a TARGET and explicitly marked not yet deployed — it is currently NXDOMAIN, and the agent index reporting it as "bound" reflects declaration, not reachability. Interim source of truth is the orchestrator capability index via the ch1tty gateway, whose write path is verified working (skill_register persists; skill_search returns the record). Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01SULXPQwfMCiRjp7hZqoZ77 --- CHARTER.md | 9 +++++---- CHITTY.md | 10 +++++----- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/CHARTER.md b/CHARTER.md index e693d99..cff6c3a 100644 --- a/CHARTER.md +++ b/CHARTER.md @@ -16,7 +16,8 @@ visibility: PUBLIC - **Canonical URI**: `chittycanon://core/services/chittymarket` - **Tier**: 3 (Operational) - **Organization**: CHITTYOS -- **Domain**: Local-only (no HTTP deployment) +- **Domain**: Central remote — `market.agent.chitty.cc` (TARGET; not yet deployed, currently does not resolve). + Interim source of truth is the orchestrator capability index reached via the ch1tty gateway. - **ChittyID**: `03-1-USA-5222-T-2603-1-36` ## Mission @@ -26,16 +27,16 @@ Provide a unified marketplace manifest and management interface for all Claude C ## Scope ### IS Responsible For -- Maintaining the central artifact manifest (`marketplace.json`) +- Maintaining the central artifact manifest as backend state, reachable by every channel +- Serving capability definitions over a network API so no channel depends on local config - Toggling artifacts enabled/disabled via type-specific actuators - Switching artifact install mode between Ch1tty (orchestrated) and standalone -- Reconciling manifest state with filesystem state via `/market sync` +- Reconciling the local projection against backend state via `/market sync` (backend wins) - Providing CLI-style management through the `/market` skill ### IS NOT Responsible For - Installing new artifacts or downloading packages - Modifying artifact source code or configuration beyond toggle state -- Exposing a network API or HTTP endpoints - Identity generation (ChittyID) - Token provisioning (ChittyAuth) - Service registration (ChittyRegister) diff --git a/CHITTY.md b/CHITTY.md index 51eda96..addf93c 100644 --- a/CHITTY.md +++ b/CHITTY.md @@ -12,19 +12,19 @@ visibility: PUBLIC # ChittyMarket -> `chittycanon://core/services/chittymarket` | Tier 3 (Operational) | Local-only +> `chittycanon://core/services/chittymarket` | Tier 3 (Operational) | Central remote ## What It Does -Local artifact marketplace and manager for the ChittyOS Claude Code environment. Catalogs **104 capabilities** (MCP servers, skills, plugins, agents, hooks) with enable/disable toggle support and install mode switching (Ch1tty vs standalone). Phase 1 capability overlay generated 2026-05-11 — see `capabilities.generated.json` and `docs/architecture/CHITTYMARKET_CAPABILITY_ROUTER.md`. +Central capability catalog and registration surface for the ChittyOS ecosystem, consumed by Claude Code and every other channel. Catalogs **106 capabilities** (MCP servers, skills, plugins, agents, hooks) with enable/disable toggle support and install mode switching (Ch1tty vs standalone). Phase 1 capability overlay generated 2026-05-11 — see `capabilities.generated.json` and `docs/architecture/CHITTYMARKET_CAPABILITY_ROUTER.md`. ## Architecture -Claude Code skill + JSON manifest — no standalone process or HTTP deployment. +Backend-hosted capability index reached via the ch1tty gateway; the Claude Code skill is a client, not the source of truth. ### Stack -- **Runtime**: Claude Code session -- **Storage**: JSON file on local filesystem (`marketplace.json`) +- **Runtime**: Backend service (target `market.agent.chitty.cc`, not yet deployed); the Claude Code session is a client +- **Storage**: Backend capability index (orchestrator `skill:index` / `agent:index`); `marketplace.json` is a generated projection, not the source of truth - **Interface**: `/market` slash command skill - **Actuator**: `market.sh` shell script for instant toggles