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 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