The problem
Anyone working with US–Cuba trade rules has to consult sources that live apart: Treasury's OFAC regulations (31 CFR 515 and the new part 516), Commerce's export rules (15 CFR 746.2 and part 740), the State Department's §515.582 list of goods that may be imported, and the sanctions list of designated individuals/entities. I had separate trackers for all these, each with its own interface. My ultimate goal, now fulfilled working exclusively with Claude's Sonnet 5.5 model: one suite, one coherent look.
What the hub does
Reads regulation text from the eCFR, keeps a dated cache on disk, and compares versions over time.
Monitors entities designated under Executive Order 14404 through a small Python sidecar.
Checks the §515.582 list by product category and covers services supplied by independent entrepreneurs.
The Claude-designed stack is deliberately plain: Node 22 and Express 5, vanilla JavaScript with hash routing, and the Python standard library for the sanctions monitor; no front-end framework.
Two design decisions worth sharing
1. The §515.582 list is an exclusion list: it blocks certain sections and chapters of the US tariff schedule (HTS), and everything else is allowed. So the tool stores only the rules and computes each answer from them. The selector follows the official order of the 21 current HTS sections, checked against the USITC's public API at most once every 24 hours:
// simplified from lib/hts-schema.js
const DAY = 24 * 3600 * 1000;
if (!force && state.checkedAt && now() - state.checkedAt < DAY)
return { checked: false }; // checked less than 24 h ago: zero network calls
2. One regulatory section from 15 CFR 740 refused to render. The layout engine assumed outline markers run perfectly in sequence: (a), (b), (1), (2)... A single repeated marker made it give up on the whole section. Claude fixed this with graded tolerance: strict first, then gaps, then repeats:
if (v === last + 1) out.push({ depth: d, val: v });
else if (level >= 1 && v > last + 1) out.push({ depth: d, val: v, gap: true });
else if (level >= 2 && v === last) out.push({ depth: d, val: v, dup: true });
Thus, only a section with many anomalies falls back to plain, unindented text.
Working (again) with Claude
The loop was simple: I described the goal, Claude wrote the code and ran its tests, and I opened the app and tried to break it. That is where I mattered most. I noticed that a selector did not follow the official order of tariff sections, that a link to a government PDF pointed to the wrong section, and that the CACR's annual edition files were still being fetched online instead of read from the local cache. Claude fixed each one and caught some of its own mistakes too: a keyword list that would have steered users to the wrong regulatory section.
Usage Projections
My intention now is to monetize this "Cuba Regulations Hub" as part of the consulting and training services I want to offer through my university's tech transfer company. Potential clients are SMEs, whether software companies or businesses generally engaged in importing and exporting goods and services, as well as self-employed individuals interested in opportunities offered by general licenses and license exceptions enabled by OFAC and BIS, respectively. I will keep you posted on this and other developments closely tied to this knowledge-based, technology-intensive business strategy.