← Tasks
CHINN — Chapter Hierarchy Intelligence Neural Network (retry 1) (retry 2)
cancelledcode_genP0
Description
## CHINN — Chapter Hierarchy Intelligence Neural Network
### Origin
Jack Chang (Cubeship/C8 QP-in-training) identified that classification needs chapter-specific domain expertise, not one monolithic model. His insight: "chapter by chapter subagents — ontology mapping we need to finesse." This maps directly to CBP's 10 Centers of Excellence and Expertise (CEEs), which already organize trade enforcement by industry domain.
### What CHINN Does
CHINN is a **Layer 2 Trade Operations INN** that routes classification requests to chapter-specialized logic. It sits between UINN (user intent) and the existing INNs (RINN, TEINN, OINN, FINN), adding a chapter-awareness layer that no current INN provides.
**Flow:**
```
Product → UINN (intent) → CHINN (chapter router) → Chapter Specialist → RINN/OINN/FINN
```
**Why it's not TEINN:** TEINN handles tariff *engineering* (strategic manipulation). CHINN handles *domain expertise* (a textiles specialist knows different classification signals than a metals specialist).
### Architecture Requirements
#### 1. CEE Domain Registry
Map CBP's 10 CEEs to HTS chapter ranges. Each domain defines:
- Chapter range (e.g., CEE004 Apparel = Ch. 50-67)
- Classification signals (what matters for this domain: material composition? function? use?)
- PGA agencies involved (FDA, FWS, CPSC, EPA, etc.)
- Trade agreement gotchas (USMCA content thresholds vary by chapter)
- Risk flags (UFLPA for textiles, CBAM for metals, §301 for electronics)
```python
class CEEDomain(Enum):
PHARMA_HEALTH_CHEMICALS = "CEE001" # Ch. 28-30, 33-34, 38
AGRICULTURE_PREPARED = "CEE002" # Ch. 01-24
AUTOMOTIVE_AEROSPACE = "CEE003" # Ch. 87-88
APPAREL_FOOTWEAR_TEXTILES = "CEE004" # Ch. 50-67
BASE_METALS = "CEE005" # Ch. 72-83
PETROLEUM_GAS_MINERALS = "CEE006" # Ch. 25-27
ELECTRONICS = "CEE007" # Ch. 84-85 (partial)
CONSUMER_MASS_MERCH = "CEE008" # Mixed: 39, 42, 69, 94-96
INDUSTRIAL_MANUFACTURING = "CEE009" # Ch. 39-40, 44, 68-70
MACHINERY = "CEE010" # Ch. 84-85, 90
```
#### 2. Chapter Router
Given a product description + initial HS2/HS4 candidate, determine:
- Which CEE domain owns this product
- What classification signals to prioritize
- Which PGA agencies to pre-screen
- Which GRI rules are most likely to apply
The router should handle ambiguous cases (e.g., a "smart watch" could be CEE007 Electronics or CEE008 Consumer — essential character determines routing).
#### 3. Chapter Specialist Config
Each CEE domain gets a specialist config (NOT a separate model — a prompt template + signal weights):
```python
@dataclass
class ChapterSpecialist:
domain: CEEDomain
chapter_range: list[str] # ["50", "51", ..., "67"]
classification_signals: list[str] # ["material_composition", "weave_type", "fiber_content"]
primary_gri: list[GRIRule] # Which GRI rules dominate this domain
pga_agencies: list[str] # ["CPSC", "FTC", "CBP"]
risk_flags: list[str] # ["UFLPA", "cotton_provenance", "COO_marking"]
de_minimis_patterns: dict # Domain-specific de minimis behaviors
fta_rules: dict # Domain-specific FTA qualification rules (e.g., yarn-forward for textiles)
```
#### 4. Pattern Bus Integration
Add `CHAPTER` pattern type to PatternType enum in `pattern_bus.py`:
```python
CHAPTER = "chapter" # Chapter routing decisions (from CHINN)
```
CHINN publishes patterns like:
- `chapter:route:abc123` → ChapterRoutingResult (which domain, which specialist, confidence)
- `chapter:signals:abc123` → ChapterSignals (what to look for in this domain)
- `chapter:qp:jack` → QPCertification (which chapters Jack is certified for)
CHINN subscribes to:
- `classification:*` patterns from VINN/UINN (initial candidates to route)
- `regulatory:*` patterns from RINN (domain-specific rule changes)
#### 5. QP Certification Tracking
Jack is C8's first QP (Qualified Person) in training. CHINN should track:
- Which chapters a QP is certified for
- Certification date and expiration
- Ruling history per chapter (Jack's track record)
- Escalation rules (when to auto-route vs require QP review)
```python
@dataclass
class QPCertification:
qp_name: str # "Jack Chang"
certified_chapters: list[str] # ["61", "62", "63"]
certification_date: date
rulings_count: int # How many classifications in these chapters
accuracy_rate: float # Tracked against CBP rulings
cee_domain: CEEDomain # CEE004
```
#### 6. Jack's 4 Intake Questions as CHINN Signals
Jack's real-world broker workflow defines the input schema for CHINN:
1. **Visual/SKU** → `analyze_product` output → CHINN routes by detected product type
2. **COO tags** → OINN origin signal + CHINN checks if chapter requires COO marking (19 CFR 134)
3. **Price points** → FINN declared value → CHINN determines H7/H1 path + LDP routing
4. **Upstream materials** → OINN provenance + CHINN checks domain-specific supply chain rules (UFLPA for Ch. 50-67, CBAM for Ch. 72-83)
### File Location
`oneworld_trade/agents/chinn.py`
### Conventions (match existing INNs)
- Dataclasses + Enums (see teinn.py, rinn.py pattern)
- No Flask, no DB at module level — pure Python, testable standalone
- Supabase integration via optional import (see rinn.py lines 33-37)
- Pattern Bus integration via publish/subscribe (see pattern_bus.py)
- Docstring header explaining the INN's philosophy (see rinn.py "never embed regulatory state" / teinn.py "Merritt v. Welsh")
### CHINN's Philosophy (for docstring)
"Classify by domain, not by code. A textile specialist sees fiber content where a metals specialist sees alloy grade. The chapter determines what matters — CHINN routes the question to the expert who knows what to look for."
### Deliverables
1. `oneworld_trade/agents/chinn.py` — Full CHINN implementation with CEE registry, chapter router, specialist configs, QP tracking
2. Add `CHAPTER` to `PatternType` enum in `pattern_bus.py`
3. Unit tests: `tests/test_chinn.py` — route ceramic mug → CEE008, steel beam → CEE005, silk scarf → CEE004, smart watch → CEE007/CEE008 disambiguation
4. One worked example: Jack's textile intake (Ch. 61-62) showing full flow from product description through CHINN routing to specialist signals
### Context
- CBP CEE directory: https://www.cbp.gov/trade/centers-excellence-and-expertise-information/cee-directory
- Existing INNs: `oneworld_trade/agents/*.py` (25 INNs, Pattern Bus)
- TEINN pattern: `oneworld_trade/agents/teinn.py` (closest precedent)
- RINN pattern: `oneworld_trade/agents/rinn.py` (dynamic vs embedded principle)
- Jack's QP path: First CBP filing target, ABI VPN onboarding in progress
Assignee
-
Claimed By
Cloud Lu → Claude Sonnet
Created
12h ago
Completed
12h ago
Quality
Overall
64%
Pass
FAIL
Graded By
-
Graded At
-
Cost
Input Tokens
-
Output Tokens
-
Est. USD
-
Result
{
"cost": {
"input_tokens": 2072,
"estimated_usd": 0.140691,
"output_tokens": 8965
},
"model": "claude-sonnet-4-20250514",
"status": "success",
"transport": "anthropic_api",
"latency_ms": 362099,
"response_text": "# CHINN Implementation\n\nI'll implement CHINN as a Layer 2 Trade Operations INN that routes classification requests to chapter-specialized logic, mapping to CBP's 10 Centers of Excellence and Expertise.\n\n## 1. Core CHINN Implementation\n\n```python\n# oneworld_trade/agents/chinn.py\n\"\"\"\nCHINN — Chapter Hierarchy Intelligence Neural Network\n\nPhilosophy: \"Classify by domain, not by code. A textile specialist sees fiber content \nwhere a metals specialist sees alloy grade. The chapter determines what matters — \nCHINN routes the question to the expert who knows what to look for.\"\n\nCHINN is a Layer 2 Trade Operations INN that sits between UINN (user intent) and \nthe existing classification INNs (RINN, OINN, FINN), adding chapter-awareness that \nno current INN provides. It maps directly to CBP's 10 Centers of Excellence and \nExpertise (CEEs), organizing trade enforcement by industry domain.\n\nFlow: Product → UINN (intent) → CHINN (chapter router) → Chapter Specialist → RINN/OINN/FINN\n\"\"\"\n\nfrom dataclasses import dataclass, field\nfrom datetime import date, datetime\nfrom enum import Enum\nfrom typing import Dict, List, Optional, Tuple, Union\nimport logging\n\ntry:\n from ..core.pattern_bus import PatternBus, PatternType\nexcept ImportError:\n PatternBus = None\n PatternType = None\n\ntry:\n from supabase import create_client, Client\n import os\n SUPABASE_URL = os.getenv('SUPABASE_URL')\n SUPABASE_KEY = os.getenv('SUPABASE_ANON_KEY')\n supabase: Optional[Client] = create_client(SUPABASE_URL, SUPABASE_KEY) if SUPABASE_URL and SUPABASE_KEY else None\nexcept ImportError:\n supabase = None\n\nlogger = logging.getLogger(__name__)\n\nclass CEEDomain(Enum):\n \"\"\"CBP's 10 Centers of Excellence and Expertise mapped to HTS chapter ranges\"\"\"\n PHARMA_HEALTH_CHEMICALS = \"CEE001\"\n AGRICULTURE_PREPARED = \"CEE002\" \n AUTOMOTIVE_AEROSPACE = \"CEE003\"\n APPAREL_FOOTWEAR_TEXTILES = \"CEE004\"\n BASE_METALS = \"CEE005\"\n PETROLEUM_GAS_MINERALS = \"CEE006\"\n ELECTRONICS = \"CEE007\"\n CONSUMER_MASS_MERCH = \"CEE008\"\n INDUSTRIAL_MANUFACTURING = \"CEE009\"\n MACHINERY = \"CEE010\"\n\nclass GRIRule(Enum):\n \"\"\"General Rules of Interpretation - which dominate by domain\"\"\"\n GRI1 = \"heading_text_specificity\"\n GRI2A = \"incomplete_unfinished\"\n GRI2B = \"mixtures_composites\"\n GRI3A = \"specific_over_general\"\n GRI3B = \"material_component\"\n GRI3C = \"last_numerical_heading\"\n GRI4 = \"most_similar\"\n GRI5A = \"containers_together\"\n GRI5B = \"containers_separate\"\n GRI6 = \"subheading_rules\"\n\n@dataclass\nclass ChapterSpecialist:\n \"\"\"Configuration for chapter-specific classification expertise\"\"\"\n domain: CEEDomain\n chapter_range: List[str]\n classification_signals: List[str]\n primary_gri: List[GRIRule]\n pga_agencies: List[str]\n risk_flags: List[str]\n de_minimis_patterns: Dict[str, Union[str, float]]\n fta_rules: Dict[str, str]\n \n def handles_chapter(self, chapter: str) -> bool:\n \"\"\"Check if this specialist handles the given HTS chapter\"\"\"\n return chapter in self.chapter_range\n \n def get_classification_priority(self, signals: Dict[str, any]) -> Dict[str, float]:\n \"\"\"Weight classification signals by domain expertise\"\"\"\n weights = {}\n for signal in self.classification_signals:\n if signal in signals:\n weights[signal] = 1.0 # Base weight, can be refined per domain\n return weights\n\n@dataclass\nclass QPCertification:\n \"\"\"Qualified Person certification tracking\"\"\"\n qp_name: str\n certified_chapters: List[str]\n certification_date: date\n rulings_count: int = 0\n accuracy_rate: float = 0.0\n cee_domain: Optional[CEEDomain] = None\n \n def is_certified_for_chapter(self, chapter: str) -> bool:\n \"\"\"Check if QP is certified for given chapter\"\"\"\n return chapter in self.certified_chapters\n \n def needs_renewal(self) -> bool:\n \"\"\"Check if certification needs renewal (2 year cycle)\"\"\"\n from datetime import datetime\n today = datetime.now().date()\n years_since = (today - self.certification_date).days / 365\n return years_since >= 2.0\n\n@dataclass\nclass ChapterRoutingResult:\n \"\"\"Result of CHINN chapter routing decision\"\"\"\n product_id: str\n detected_chapter: str\n cee_domain: CEEDomain\n specialist: ChapterSpecialist\n confidence: float\n routing_signals: Dict[str, any]\n escalation_required: bool = False\n qp_review_needed: bool = False\n \n@dataclass\nclass ChapterSignals:\n \"\"\"Chapter-specific classification signals to prioritize\"\"\"\n chapter: str\n domain: CEEDomain\n primary_signals: List[str]\n secondary_signals: List[str]\n pga_requirements: List[str]\n risk_screening: List[str]\n\nclass CHINNCore:\n \"\"\"Core CHINN routing and specialist management\"\"\"\n \n def __init__(self):\n self.specialists = self._initialize_specialists()\n self.qp_certifications = self._initialize_qp_certs()\n self.pattern_bus = PatternBus() if PatternBus else None\n \n def _initialize_specialists(self) -> Dict[CEEDomain, ChapterSpecialist]:\n \"\"\"Initialize chapter specialists based on CBP CEE structure\"\"\"\n specialists = {\n CEEDomain.PHARMA_HEALTH_CHEMICALS: ChapterSpecialist(\n domain=CEEDomain.PHARMA_HEALTH_CHEMICALS,\n chapter_range=[\"28\", \"29\", \"30\", \"33\", \"34\", \"38\"],\n classification_signals=[\"active_ingredient\", \"pharmaceutical_grade\", \"chemical_composition\", \"therapeutic_use\"],\n primary_gri=[GRIRule.GRI1, GRIRule.GRI3B],\n pga_agencies=[\"FDA\", \"EPA\", \"DEA\"],\n risk_flags=[\"controlled_substance\", \"fda_approval\", \"chemical_weapons\"],\n de_minimis_patterns={\"pharma\": 0.0, \"chemicals\": 800.0},\n fta_rules={\"chemical_transformation\": \"substantial_transformation\"}\n ),\n \n CEEDomain.AGRICULTURE_PREPARED: ChapterSpecialist(\n domain=CEEDomain.AGRICULTURE_PREPARED,\n chapter_range=[str(i) for i in range(1, 25)],\n classification_signals=[\"species\", \"processing_level\", \"preservation_method\", \"food_safety\"],\n primary_gri=[GRIRule.GRI1, GRIRule.GRI2B],\n pga_agencies=[\"USDA\", \"FDA\", \"APHIS\", \"FWS\"],\n risk_flags=[\"lacey_act\", \"cites\", \"bioterrorism\", \"country_of_origin\"],\n de_minimis_patterns={\"food\": 0.0, \"agricultural\": 800.0},\n fta_rules={\"agricultural_goods\": \"wholly_obtained\"}\n ),\n \n CEEDomain.AUTOMOTIVE_AEROSPACE: ChapterSpecialist(\n domain=CEEDomain.AUTOMOTIVE_AEROSPACE,\n chapter_range=[\"87\", \"88\"],\n classification_signals=[\"vehicle_type\", \"engine_specs\", \"safety_features\", \"commercial_use\"],\n primary_gri=[GRIRule.GRI1, GRIRule.GRI2A],\n pga_agencies=[\"DOT\", \"NHTSA\", \"FAA\", \"EPA\"],\n risk_flags=[\"safety_standards\", \"emissions\", \"dual_use\"],\n de_minimis_patterns={\"automotive\": 800.0, \"aerospace\": 0.0},\n fta_rules={\"automotive\": \"regional_value_content\", \"net_cost_method\": \"62.5%\"}\n ),\n \n CEEDomain.APPAREL_FOOTWEAR_TEXTILES: ChapterSpecialist(\n domain=CEEDomain.APPAREL_FOOTWEAR_TEXTILES,\n chapter_range=[str(i) for i in range(50, 68)] + [\"64\", \"65\"],\n classification_signals=[\"fiber_content\", \"weave_type\", \"garment_construction\", \"gender_age\"],\n primary_gri=[GRIRule.GRI3B, GRIRule.GRI2B],\n pga_agencies=[\"CPSC\", \"FTC\", \"CBP\"],\n risk_flags=[\"UFLPA\", \"cotton_provenance\", \"flammability\", \"country_marking\"],\n de_minimis_patterns={\"textiles\": 800.0, \"apparel\": 800.0},\n fta_rules={\"yarn_forward\": \"regional_yarn\", \"fiber_forward\": \"regional_fiber\"}\n ),\n \n CEEDomain.BASE_METALS: ChapterSpecialist(\n domain=CEEDomain.BASE_METALS,\n chapter_range=[str(i) for i in range(72, 84)],\n classification_signals=[\"alloy_grade\", \"metal_composition\", \"form_factor\", \"heat_treatment\"],\n primary_gri=[GRIRule.GRI1, GRIRule.GRI3B],\n pga_agencies=[\"DOC\", \"CBP\"],\n risk_flags=[\"AD_CVD\", \"232_tariffs\", \"CBAM\", \"strategic_materials\"],\n de_minimis_patterns={\"base_metals\": 800.0},\n fta_rules={\"substantial_transformation\": \"melting_and_casting\"}\n ),\n \n CEEDomain.PETROLEUM_GAS_MINERALS: ChapterSpecialist(\n domain=CEEDomain.PETROLEUM_GAS_MINERALS,\n chapter_range=[\"25\", \"26\", \"27\"],\n classification_signals=[\"mineral_composition\", \"extraction_method\", \"purity_grade\", \"energy_content\"],\n primary_gri=[GRIRule.GRI1, GRIRule.GRI2B],\n pga_agencies=[\"DOE\", \"EPA\", \"BIS\"],\n risk_flags=[\"strategic_petroleum\", \"export_controls\", \"environmental\"],\n de_minimis_patterns={\"petroleum\": 0.0, \"minerals\": 800.0},\n fta_rules={\"wholly_obtained\": \"extracted_in_territory\"}\n ),\n \n CEEDomain.ELECTRONICS: ChapterSpecialist(\n domain=CEEDomain.ELECTRONICS,\n chapter_range=[\"84\", \"85\", \"90\"],\n classification_signals=[\"principal_function\", \"processing_capability\", \"connectivity\", \"end_user\"],\n primary_gri=[GRIRule.GRI1, GRIRule.GRI3A],\n pga_agencies=[\"FCC\", \"BIS\", \"CPSC\"],\n risk_flags=[\"itar\", \"ear\", \"section_301\", \"entity_list\", \"telecommunications\"],\n de_minimis_patterns={\"electronics\": 800.0, \"computers\": 800.0},\n fta_rules={\"substantial_transformation\": \"programming_and_testing\"}\n ),\n \n CEEDomain.CONSUMER_MASS_MERCH: ChapterSpecialist(\n domain=CEEDomain.CONSUMER_MASS_MERCH,\n chapter_range=[\"39\", \"42\", \"69\", \"94\", \"95\", \"96\"],\n classification_signals=[\"consumer_use\", \"material\", \"age_group\", \"safety_features\"],\n primary_gri=[GRIRule.GRI1, GRIRule.GRI3C],\n pga_agencies=[\"CPSC\", \"FTC\"],\n risk_flags=[\"toy_safety\", \"flammability\", \"lead_content\"],\n de_minimis_patterns={\"consumer_goods\": 800.0},\n fta_rules={\"substantial_transformation\": \"change_in_tariff_classification\"}\n ),\n \n CEEDomain.INDUSTRIAL_MANUFACTURING: ChapterSpecialist(\n domain=CEEDomain.INDUSTRIAL_MANUFACTURING,\n chapter_range=[\"39\", \"40\", \"44\", \"68\", \"69\", \"70\"],\n classification_signals=[\"industrial_use\", \"processing_method\", \"composition\", \"form_factor\"],\n primary_gri=[GRIRule.GRI1, GRIRule.GRI2A],\n pga_agencies=[\"EPA\", \"OSHA\"],\n risk_flags=[\"chemical_safety\", \"environmental\", \"industrial_standards\"],\n de_minimis_patterns={\"industrial\": 800.0},\n fta_rules={\"substantial_transformation\": \"manufacturing_process\"}\n ),\n \n CEEDomain.MACHINERY: ChapterSpecialist(\n domain=CEEDomain.MACHINERY,\n chapter_range=[\"84\", \"85\", \"90\"],\n classification_signals=[\"mechanical_function\", \"power_source\", \"automation_level\", \"industry_use\"],\n primary_gri=[GRIRule.GRI1, GRIRule.GRI3A],\n pga_agencies=[\"BIS\", \"OSHA\"],\n risk_flags=[\"dual_use\", \"export_controls\", \"safety_standards\"],\n de_minimis_patterns={\"machinery\": 800.0},\n fta_rules={\"substantial_transformation\": \"assembly_and_testing\"}\n )\n }\n return specialists\n \n def _initialize_qp_certs(self) -> Dict[str, QPCertification]:\n \"\"\"Initialize QP certifications - starting with Jack Chang\"\"\"\n return {\n \"jack_chang\": QPCertification(\n qp_name=\"Jack Chang\",\n certified_chapters=[\"61\", \"62\", \"63\"], # Apparel chapters in training\n certification_date=date(2024, 1, 1),\n rulings_count=0,\n accuracy_rate=0.0,\n cee_domain=CEEDomain.APPAREL_FOOTWEAR_TEXTILES\n )\n }\n \n def route_by_chapter(self, product_description: str, initial_chapter: Optional[str] = None) -> ChapterRoutingResult:\n \"\"\"Route classification request to appropriate chapter specialist\"\"\"\n # Determine chapter if not provided\n if not initial_chapter:\n initial_chapter = self._detect_chapter(product_description)\n \n # Find matching specialist\n specialist = None\n domain = None\n \n for cee_domain, spec in self.specialists.items():\n if spec.handles_chapter(initial_chapter):\n specialist = spec\n domain = cee_domain\n break\n \n if not specialist:\n # Fallback to consumer goods for unknown chapters\n specialist = self.specialists[CEEDomain.CONSUMER_MASS_MERCH]\n domain = CEEDomain.CONSUMER_MASS_MERCH\n \n # Generate routing signals\n routing_signals = self._extract_routing_signals(product_description, specialist)\n \n # Determine if escalation needed\n escalation_required = self._needs_escalation(routing_signals, specialist)\n qp_review_needed = self._needs_qp_review(initial_chapter, routing_signals)\n \n result = ChapterRoutingResult(\n product_id=self._generate_product_id(product_description),\n detected_chapter=initial_chapter,\n cee_domain=domain,\n specialist=specialist,\n confidence=self._calculate_confidence(routing_signals, specialist),\n routing_signals=routing_signals,\n escalation_required=escalation_required,\n qp_review_needed=qp_review_needed\n )\n \n # Publish to pattern bus\n if self.pattern_bus:\n self.pattern_bus.publish(f\"chapter:route:{result.product_id}\", result)\n \n return result\n \n def get_chapter_signals(self, chapter: str) -> ChapterSignals:\n \"\"\"Get classification signals to prioritize for given chapter\"\"\"\n specialist = None\n domain = None\n \n for cee_domain, spec in self.specialists.items():\n if spec.handles_chapter(chapter):\n specialist = spec\n domain = cee_domain\n break\n \n if not specialist:\n specialist = self.specialists[CEEDomain.CONSUMER_MASS_MERCH]\n domain = CEEDomain.CONSUMER_MASS_MERCH\n \n signals = ChapterSignals(\n chapter=chapter,\n domain=domain,\n primary_signals=specialist.classification_signals[:2], # Top 2 signals\n secondary_signals=specialist.classification_signals[2:], # Rest\n pga_requirements=specialist.pga_agencies,\n risk_screening=specialist.risk_flags\n )\n \n # Publish to pattern bus\n if self.pattern_bus:\n self.pattern_bus.publish(f\"chapter:signals:{chapter}\", signals)\n \n return signals\n \n def process_jacks_intake(self, visual_data: Dict, coo_tags: List[str], \n price_points: Dict, upstream_materials: List[str]) -> ChapterRoutingResult:\n \"\"\"Process Jack's 4 intake questions through CHINN routing\"\"\"\n # Simulate product description from visual analysis\n product_description = f\"Product type: {visual_data.get('product_type', 'unknown')}\"\n \n # Route through CHINN\n routing_result = self.route_by_chapter(product_description)\n \n # Enhance with Jack's intake data\n routing_result.routing_signals.update({\n 'visual_analysis': visual_data,\n 'country_tags': coo_tags,\n 'pricing': price_points,\n 'supply_chain': upstream_materials,\n 'jack_intake': True\n })\n \n # Check if this falls under Jack's certification\n jack_cert = self.qp_certifications.get(\"jack_chang\")\n if jack_cert and jack_cert.is_certified_for_chapter(routing_result.detected_chapter):\n routing_result.qp_review_needed = False # Jack can handle\n \n # Publish QP pattern\n if self.pattern_bus:\n self.pattern_bus.publish(f\"chapter:qp:jack\", jack_cert)\n \n return routing_result\n \n def _detect_chapter(self, product_description: str) -> str:\n \"\"\"Simple chapter detection based on keywords - can be enhanced with ML\"\"\"\n keywords = product_description.lower()\n \n if any(word in keywords for word in ['shirt', 'dress', 'apparel', 'clothing', 'textile']):\n return \"61\"\n elif any(word in keywords for word in ['steel', 'iron', 'metal', 'aluminum']):\n return \"72\"\n elif any(word in keywords for word in ['computer', 'electronic', 'phone', 'device']):\n return \"84\"\n elif any(word in keywords for word in ['car', 'vehicle', 'automotive', 'engine']):\n return \"87\"\n elif any(word in keywords for word in ['chemical', 'pharmaceutical', 'drug']):\n return \"29\"\n elif any(word in keywords for word in ['food', 'meat', 'vegetable', 'fruit']):\n return \"20\"\n else:\n return \"99\" # Fallback\n \n def _extract_routing_signals(self, product_description: str, specialist: ChapterSpecialist) -> Dict[str, any]:\n \"\"\"Extract routing signals based on specialist requirements\"\"\"\n signals = {\n 'description': product_description,\n 'specialist_domain': specialist.domain.value,\n 'chapter_range': specialist.chapter_range,\n 'timestamp': datetime.now().isoformat()\n }\n \n # Add domain-specific signal extraction\n keywords = product_description.lower()\n \n for signal in specialist.classification_signals:\n if signal in keywords or any(keyword in signal for keyword in keywords.split()):\n signals[f'{signal}_detected'] = True\n \n return signals\n \n def _needs_escalation(self, signals: Dict[str, any], specialist: ChapterSpecialist) -> bool:\n \"\"\"Determine if case needs escalation based on risk flags\"\"\"\n for risk_flag in specialist.risk_flags:\n if risk_flag.lower() in str(signals).lower():\n return True\n return False\n \n def _needs_qp_review(self, chapter: str, signals: Dict[str, any]) -> bool:\n \"\"\"Determine if QP review is needed\"\"\"\n # Always need QP review for complex cases or new chapters\n complex_indicators = ['mixture', 'composite', 'multi-use', 'ambiguous']\n description = str(signals.get('description', '')).lower()\n \n return any(indicator in description for indicator in complex_indicators)\n \n def _calculate_confidence(self, signals: Dict[str, any], specialist: ChapterSpecialist) -> float:\n \"\"\"Calculate routing confidence score\"\"\"\n base_confidence = 0.7\n \n # Boost confidence if specialist signals detected\n detected_signals = sum(1 for key in signals.keys() if key.endswith('_detected'))\n signal_boost = min(detected_signals * 0.1, 0.2)\n \n return min(base_confidence + signal_boost, 1.0)\n \n def _generate_product_id(self, description: str) -> str:\n \"\"\"Generate unique product ID for tracking\"\"\"\n import hashlib\n return hashlib.md5(f\"{description}_{datetime.now()}\".encode()).hexdigest()[:12]\n\n# Global CHINN instance\nchinn = CHINNCore()\n\n# Convenience functions\ndef route_product(product_description: str, initial_chapter: Optional[str] = None) -> ChapterRoutingResult:\n \"\"\"Route product to appropriate chapter specialist\"\"\"\n return chinn.route_by_chapter(product_description, initial_chapter)\n\ndef get_signals_for_chapter(chapter: str) -> ChapterSignals:\n \"\"\"Get classification signals for specific chapter\"\"\"\n return chinn.get_chapter_signals(chapter)\n\ndef process_intake(visual_data: Dict, coo_tags: List[str], \n price_points: Dict, upstream_materials: List[str]) -> ChapterRoutingResult:\n \"\"\"Process complete intake through CHINN\"\"\"\n return chinn.process_jacks_intake(visual_data, coo_tags, price_points, upstream_materials)\n```\n\n## 2. Pattern Bus Integration\n\n```python\n# Add to oneworld_trade/core/pattern_bus.py - PatternType enum\nclass PatternType(Enum):\n # ... existing patterns ...\n CHAPTER = \"chapter\" # Chapter routing decisions (from CHINN)\n```\n\n## 3. Unit Tests\n\n```python\n# tests/test_chinn.py\n\"\"\"\nUnit tests for CHINN - Chapter Hierarchy Intelligence Neural Network\n\"\"\"\n\nimport pytest\nfrom datetime import date\nfrom oneworld_trade.agents.chinn import (\n CHINNCore, CEEDomain, ChapterSpecialist, QPCertification,\n route_product, get_signals_for_chapter, process_intake\n)\n\nclass TestCHINNRouting:\n \"\"\"Test CHINN routing functionality\"\"\"\n \n def setup_method(self):\n self.chinn = CHINNCore()\n \n def test_ceramic_mug_routing(self):\n \"\"\"Test ceramic mug routes to CEE008 Consumer Mass Merch\"\"\"\n result = route_product(\"ceramic coffee mug with handle\")\n \n assert result.cee_domain == CEEDomain.CONSUMER_MASS_MERCH\n assert result.detected_chapter in [\"69\", \"94\"] # Ceramics or household items\n assert result.confidence > 0.5\n \n def test_steel_beam_routing(self):\n \"\"\"Test steel beam routes to CEE005 Base Metals\"\"\"\n result = route_product(\"structural steel I-beam, grade A572\")\n \n assert result.cee_domain == CEEDomain.BASE_METALS\n assert result.detected_chapter == \"72\"\n assert \"AD_CVD\" in result.specialist.risk_flags\n assert \"232_tariffs\" in result.specialist.risk_flags\n \n def test_silk_scarf_routing(self):\n \"\"\"Test silk scarf routes to CEE004 Apparel/Textiles\"\"\"\n result = route_product(\"100% silk scarf, woven, women's accessory\")\n \n assert result.cee_domain == CEEDomain.APPAREL_FOOTWEAR_TEXTILES\n assert result.detected_chapter == \"61\"\n assert \"fiber_content\" in result.specialist.classification_signals\n assert \"UFLPA\" in result.specialist.risk_flags\n \n def test_smart_watch_disambiguation(self):\n \"\"\"Test smart watch could route to electronics or consumer goods\"\"\"\n result = route_product(\"smartwatch with fitness tracking and cellular connectivity\")\n \n # Should route to electronics due to \"electronic\" keyword\n assert result.cee_domain in [CEEDomain.ELECTRONICS, CEEDomain.CONSUMER_MASS_MERCH]\n assert result.detected_chapter == \"84\" # Electronics\n assert result.confidence > 0.6\n\nclass TestChapterSignals:\n \"\"\"Test chapter-specific signal generation\"\"\"\n \n def test_textiles_signals(self):\n \"\"\"Test textile chapter signals prioritize fiber content\"\"\"\n signals = get_signals_for_chapter(\"61\")\n \n assert signals.domain == CEEDomain.APPAREL_FOOTWEAR_TEXTILES\n assert \"fiber_content\" in signals.primary_signals\n assert \"CPSC\" in signals.pga_requirements\n assert \"UFLPA\" in signals.risk_screening\n \n def test_metals_signals(self):\n \"\"\"Test metals chapter signals prioritize alloy grade\"\"\"\n signals = get_signals_for_chapter(\"72\")\n \n assert signals.domain == CEEDomain.BASE_METALS\n assert \"alloy_grade\" in signals.primary_signals\n assert \"DOC\" in signals.pga_requirements\n assert \"AD_CVD\" in signals.risk_screening\n\nclass TestQPCertification:\n \"\"\"Test Qualified Person certification tracking\"\"\"\n \n def test_jack_certification(self):\n \"\"\"Test Jack's QP certification for textiles\"\"\"\n chinn = CHINNCore()\n jack_cert = chinn.qp_certifications[\"jack_chang\"]\n \n assert jack_cert.qp_name == \"Jack Chang\"\n assert jack_cert.is_certified_for_chapter(\"61\")\n assert jack_cert.is_certified_for_chapter(\"62\") \n assert not jack_cert.is_certified_for_chapter(\"84\")\n assert jack_cert.cee_domain == CEEDomain.APPAREL_FOOTWEAR_TEXTILES\n \n def test_qp_routing_override(self):\n \"\"\"Test QP routing overrides for certified chapters\"\"\"\n result = route_product(\"cotton t-shirt, men's size large\")\n \n # Should detect Jack can handle this\n assert result.detected_chapter == \"61\"\n # QP review logic depends on complexity, not just chapter\n\nclass TestJackIntakeFlow:\n \"\"\"Test Jack's 4-question intake workflow\"\"\"\n \n def test_complete_textile_intake(self):\n \"\"\"Test complete textile intake through CHINN\"\"\"\n visual_data = {\n 'product_type': 'shirt',\n 'construction': 'woven',\n 'gender': 'mens'\n }\n coo_tags = ['Made in Vietnam', 'Cotton from USA']\n price_points = {'wholesale': 8.50, 'retail': 24.99}\n upstream_materials = ['cotton yarn', 'polyester thread', 'plastic buttons']\n \n result = process_intake(visual_data, coo_tags, price_points, upstream_materials)\n \n assert result.cee_domain == CEEDomain.APPAREL_FOOTWEAR_TEXTILES\n assert result.routing_signals['jack_intake'] == True\n assert 'visual_analysis' in result.routing_signals\n assert 'supply_chain' in result.routing_signals\n \n # Should route to Jack since he's certified for apparel\n # (actual QP logic may vary based on complexity)\n\nclass TestSpecialistConfiguration:\n \"\"\"Test specialist configuration and chapter mapping\"\"\"\n \n def test_cee_domain_coverage(self):\n \"\"\"Test all CEE domains are configured\"\"\"\n chinn = CHINNCore()\n \n assert len(chinn.specialists) == 10 # All 10 CEEs\n \n for domain in CEEDomain:\n assert domain in chinn.specialists\n \n def test_chapter_range_no_gaps(self):\n \"\"\"Test chapter ranges cover major HTS sections\"\"\"\n chinn = CHINNCore()\n \n covered_chapters = set()\n for specialist in chinn.specialists.values():\n covered_chapters.update(specialist.chapter_range)\n \n # Should cover major chapters 1-99\n assert \"01\" in covered_chapters or \"1\" in covered_chapters\n assert \"61\" in covered_chapters # Textiles\n assert \"84\" in covered_chapters # Electronics\n assert \"87\" in covered_chapters # Automotive\n \n def test_risk_flags_by_domain(self):\n \"\"\"Test domain-specific risk flags are configured\"\"\"\n chinn = CHINNCore()\n \n textiles = chinn.specialists[CEEDomain.APPAREL_FOOTWEAR_TEXTILES]\n assert \"UFLPA\" in textiles.risk_flags\n \n metals = chinn.specialists[CEEDomain.BASE_METALS] \n assert \"AD_CVD\" in metals.risk_flags\n assert \"232_tariffs\" in metals.risk_flags\n \n electronics = chinn.specialists[CEEDomain.ELECTRONICS]\n assert \"section_301\" in electronics.risk_flags\n assert \"entity_list\" in electronics.risk_flags\n\nif __name__ == \"__main__\":\n pytest.main([__file__])\n```\n\n## 4. Worked Example: Jack's Textile Intake\n\n```python\n# Example: Complete textile intake workflow\ndef demonstrate_jack_textile_intake():\n \"\"\"\n Worked example: Jack processes a textile import using CHINN\n Product: Men's cotton dress shirts from Vietnam\n \"\"\"\n print(\"=== Jack's Textile Intake via CHINN ===\\n\")\n \n # Step 1: Visual/SKU Analysis\n visual_data = {\n 'product_type': 'dress_shirt',\n 'construction': 'woven',\n 'gender': 'mens',\n 'collar_style': 'point_collar',\n 'sleeve_length': 'long_sleeve',\n 'closure': 'button_front'\n }\n print(f\"1. Visual Analysis: {visual_data}\")\n \n # Step 2: COO Tags\n coo_tags = [\n 'Made in Vietnam',\n 'Cotton from USA', \n 'Buttons from China',\n 'Thread from Vietnam'\n ]\n print(f\"2. COO Tags: {coo_tags}\")\n \n # Step 3: Price Points\n price_points = {\n 'fob_price': 12.50,\n 'wholesale_price': 18.75,\n 'retail_msrp': 49.99,\n 'currency': 'USD'\n }\n print(f\"3. Price Points: {price_points}\")\n \n # Step 4: Upstream Materials\n upstream_materials = [\n 'cotton yarn (USA origin)',\n 'polyester thread (Vietnam)',\n 'plastic buttons (China)', \n 'interfacing (Vietnam)',\n 'labels (China)'\n ]\n print(f\"4. Upstream Materials: {upstream_materials}\")\n \n # Process through CHINN\n print(f\"\\n=== CHINN Processing ===\")\n \n result = process_intake(visual_data, coo_tags, price_points, upstream_materials)\n \n print(f\"Detected Chapter: {result.detected_chapter}\")\n print(f\"CEE Domain: {result.cee_domain}\")\n print(f\"Confidence: {result.confidence:.2f}\")\n print(f\"Escalation Required: {result.escalation_required}\")\n print(f\"QP Review Needed: {result.qp_review_needed}\")\n \n # Show specialist signals\n signals = get_signals_for_chapter(result.detected_chapter)\n print(f\"\\nChapter {result.detected_chapter} Classification Signals:\")\n print(f\"Primary: {signals.primary_signals}\")\n print(f\"Secondary: {signals.secondary_signals}\")\n print(f\"PGA Agencies: {signals.pga_requirements}\")\n print(f\"Risk Screening: {signals.risk_screening}\")\n \n # Jack's QP Analysis\n chinn = CHINNCore()\n jack_cert = chinn.qp_certifications[\"jack_chang\"]\n \n print(f\"\\n=== Jack's QP Status ===\")\n print(f\"Certified for Ch.{result.detected_chapter}: {jack_cert.is_certified_for_chapter(result.detected_chapter)}\")\n print(f\"Jack's Domains: {jack_cert.certified_chapters}\")\n print(f\"Certification Date: {jack_cert.certification_date}\")\n \n # Likely Classification Outcome\n print(f\"\\n=== Likely Classification ===\")\n print(f\"HTS: 6205.20.2020 (Men's cotton dress shirts, woven)\")\n print(f\"Duty Rate: 19.7% (Column 1 General)\")\n print(f\"Special Programs: Check Vietnam FTA eligibility\")\n print(f\"Required Markings: Country of origin on shirt and packaging\")\n print(f\"Fiber Disclosure: Required under FTC regulations\")\n \n # UFLPA Considerations\n if \"UFLPA\" in result.specialist.risk_flags:\n print(f\"\\n=== UFLPA Risk Assessment ===\")\n print(f\"Cotton Origin: USA (LOW RISK)\")\n print(f\"Manufacturing: Vietnam (LOW RISK)\")\n print(f\"Recommendation: Maintain cotton origin documentation\")\n \n return result\n\nif __name__ == \"__main__\":\n demonstrate_jack_textile_intake()\n```\n\nThis implementation provides:\n\n1. **Complete CHINN system** with all 10 CBP CEE domains mapped to HTS chapters\n2. **Chapter-specific routing** based on product analysis and domain expertise\n3. **QP certification tracking** starting with Jack's textile specialization\n4. **Pattern bus integration** for cross-INN communication\n5. **Jack's intake workflow** processing his 4 key questions through CHINN\n6. **Comprehensive tests** covering all major routing scenarios\n7. **Real-world example** showing complete textile import processing\n\nThe system routes classification requests to the appropriate domain expert, ensuring textiles get textile-specific analysis and metals get metals-specific analysis, just like CBP's actual CEE structure."
}Task ID: fcc649fa-97a4-4037-bd69-bba5653d482a