dumbtv
dumbtv가 ADB로 Fire TV에서 광고·추적·업데이트 알림을 제거, 루트·앱 변경 없이, 무료 오픈소스
Hawkeye Sterling: 귀금속·보석 딜러 AML/CFT 리스크 평가, 0–30점 스코어링·감사 로그
Hawkeye Sterling — AML/CFT entity risk assessment for dealers in precious metals and stones: structured 0–30 risk scoring, CDD/SDD/EDD verdicts, on-device register and hash-chained audit log. All data
보안JavaScript · PythonGitHub @trex0092온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
Hawkeye Sterling: UAE DPMS AML/CFT entity risk assessment, with an AI compliance advisor and operations console.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Hawkeye Sterling - Entity Risk Assessment (RA) Worldwide screening scope: the configured sanctions, adverse-media and PEP controls apply to the full 195-country subject universe. Runtime operational status is reported separately above from actual screening evidence. Dedicated national sanctions sources and dedicated Google News editions are depth metrics shown below. (https://github.com/trex0092/ [README 설치·사용 부분 발췌] Getting started Open directly - download index.html and open it in any modern browser.README 전문 보기 ↗
A static web application for AML/CFT customer (entity) risk assessment, built for Dealers in Precious Metals and Stones (DPMS) and adaptable to other reporting entities.
Live site: https://hawkeye-sterling-ra.netlify.app. Availability alone does not prove that the current main commit is published. See Site Currency below.
Project: Contributing · Security · License · Support · Roadmap
Technical & compliance: Architecture · Methodology · Coverage · Data Sources · Governance · AI Governance · ISO 42001 Controls (Provisional) · Operations · Documentation
How to read this dashboard: Each badge shows the latest result of its linked GitHub workflow, not an overall compliance verdict. A green workflow is not sufficient evidence that its underlying control passed. Red, cancelled, pending and unverified controls must never be counted as green. Check the required evidence in the right column and the linked run before interpreting any result.
Acceptance rule: All mandatory controls must be substantively verified at the same current-code checkpoint. CI, security scan wrappers, screening dispatches and provider probes cannot substitute for their required evidence. The table deliberately preserves real failed statuses rather than displaying a cosmetic all-green result.
| Control | Live workflow badge (not an assurance verdict) | Evidence required for PASS |
|---|---|---|
| Worldwide screening assurance | Persisted receipt must independently verify current-commit source quality | |
| Sanctions case screening | Completed authorized customer and employee screening, with run receipts | |
| Control freshness | All mandatory scheduled controls have successful runs within cadence | |
| Screening recovery | Evidence-backed recovery, not merely accepted workflow dispatches | |
| Advisor guardrails | Completed real-provider behavior tests without evaluation errors | |
| Advisor bias assurance | Completed real-provider bias tests without evaluation errors | |
| Production publishing | Netlify actually publishes the requested commit, not just HTTP 200 from a hook | |
| Production code parity |
Screening scope is not screening assurance. Configuration targets a 195-country subject universe. The generated coverage figures and country-depth register describe configured sources and geographic applicability, not successful retrievals or clean screenings. The independent runtime receipt is authoritative for observed evidence. A domain's operational flag does not imply sourceQuality.assured; if sourceQuality.assured is false, independent screening assurance is degraded even when a runtime step passed.
More checks: All GitHub Actions · Semgrep · Gitleaks · Bandit · OSV dependency scanning · Dependency Review · Workflow lint · Cross-browser smoke · PEP harvest · Regulatory Watch · Delivery Watchdog
A dark neon, AI-persona "command center" spanning three sibling pages - pure HTML/CSS/JS, no framework, cross-linked from the header nav and sharing the six robot portraits in assets/:
| Page | File | Purpose |
|---|---|---|
| Entity Risk Assessment | index.html | The primary tool - live 0–30 risk scoring, animated gauge, CDD/SDD/EDD verdict, analyst override, Risk-Data editor, register and activity log. |
| AI Operations Console | console.html | A live monitoring HUD - a robot "analyst on duty" inside an animated radar, an operator switcher, count-up stat tiles, a live alert stream, the diligence mix and a jurisdiction watch. |
| Hawkeye Sterling Advisor | advisor.html | A cited-answer AML Q&A - a question composer with a swappable AI persona that returns a verdict, cited legal basis, decision guide and recommended steps, plus a filterable regulatory Q&A. |
The AI Risk Advisor in the assessment sidebar is a robot whose head and HUD colour follow the operative outcome - Vale (teal) for CDD, Cypher (amber) for SDD, Ember (red) for EDD / PROHIBITED - each with a one-line advisory note. The header carries a persona avatar, a live UTC clock and a lock toggle. Every animation (gauge draw-in, radar sweep, HUD spin, entrance) respects prefers-reduced-motion.
Desktop captures of the three screens (Chromium, 1280×900 - sources in docs/screenshots/):
| Entity Risk Assessment | AI Operations Console | Hawkeye Sterling Advisor |
|---|---|---|
prefers-reduced-motion.RA-YYYYMMDD-NNN), assessment date, assessor name and role.Beyond the on-device assessment tool, the repository runs an automated, audit-grade
daily screening engine (screen.py) over the firm's live customer base,
augmented by a governance-first AI layer (ai.py). It is free to run -
no paid data feed and no API key are required; an LLM is strictly optional and opt-in.
One unified daily report (workflow weekly-adverse-media.yml,
RUN_MODE=unified) screens every company and every recorded owner / director / UBO
through three modules in a single pass and posts one MLRO-ready task to Asana, delivered
by 09:00 UAE:
| # | Module | What it does |
|---|---|---|
| ① | Sanctions / watchlists | Fuzzy name-match against the live OFAC SDN · UN · EU FSF · UK OFSI · UAE EOCN lists (plus Canada SEMA as a best-effort supplementary list). Shows every candidate with the matched entry and score. |
| ② | Adverse media | Google News RSS across 5 locales (US/GB/AE/TR/AR) plus a targeted risk-term query, the GDELT global index, and Bing News RSS (a third, independently rate-limited pool - headline recall now needs three simultaneous feed refusals to go dark); duplicate stories merged across outlets, bucketed by typology, ranked recent-first, every item carrying its real article link. A deterministic fourth net - the OpenSanctions crime watchlist (bulk download, matched locally) - keeps adverse-exposure coverage alive even when every news feed rate-limits the CI runner. |
| ③ | PEP | Auto-detected against Wikidata (no list supplied by the firm) - politicians, judges, military/SOE heads and their relatives & close associates (RCA). Rate-gated with a circuit breaker; when Wikidata is unreachable, the OpenSanctions PEP mirror (bulk) re-covers the affected individuals, provenance-marked. |
Screening intelligence
data/screen-delta-state.json).onboarding-screen.yml) - screens newly-added customers every 6 h, not only in the daily batch.freshness-check raises a loud alarm if a mandatory-daily control fails to run.AI layer (ai.py) - adopted in line with the UAE National AI Strategy 2031, governance-first:
AI governance & security (see docs/AI-GOVERNANCE.md)
ANTHROPIC_API_KEY. With no key the engine runs fully on-runner, deterministic, with no data egress. When enabled, the LLM is used only for grounded classification (adverse-media triage); generative report prose stays off unless REPORT_ALLOW_LLM=1 is explicitly set.Agentic operating model (agents.py) - aligned to the UAE "Sovereign AI" model (People → Agents → Workflows → Decisions → Outcomes; humans set direction, governance keeps outcomes aligned):
data/sanctions-country-coverage.json records all 195 countries. Each row has its national-list status and a baseline of lists that already cover it every day:
UN).EU). An EU member without its own national list is therefore still covered for EU-level sanctions; only a separate national list, where one exists, is additional.baseline.data/fatf-assessments.json holds the FATF lists from the 19 June 2026 statements (Paris plenary, 17–19 June 2026), with each jurisdiction's assessment: its FSRB, when it made its high-level political commitment, its MER adoption date where the statement gives one, its action-plan status, and the action-plan items quoted verbatim.
The register's fatf field marks each listed country, and the MCP server serves the file as hawkeye://reference/fatf-assessments. A test fails if this file, the register and the risk-scoring list data/jurisdiction-risk.json disagree. Update all three after every FATF plenary (February, June and October).
data/country-indicators.json adds three public-source country indicators next to a screening hit's jurisdiction in the daily report ("Country context (not scored)"), and the MCP server serves it as hawkeye://reference/country-indicators:
These never change the risk score; the FATF list above stays the only jurisdiction scoring input. Commercial country reports (KnowYourCountry, the Organized Crime Index) restrict redistribution, so they are linked, never copied: under the jurisdiction select the app links each country's KnowYourCountry AML profile and, for the 193 UN member states, its Global Organized Crime Index profile. The OC Index report is "all rights reserved" and its downloadable dataset states no reuse licence, so no Index score is stored or used in scoring.
OC Index 2025 country-research catalog: data/ocindex-2025-references.json records the publisher's 2025 downloads and methodology, plus the filename inventory of 192 conventionally named country PDFs from the supplied archive. The archive also contains a separate 3-page Word-generated turkiye.pdf, not the original published report; the catalog points to the publisher's official Türkiye PDF instead. The 2025 Index assesses 2024 conditions, including organized-crime markets, actors and resilience. This evidence is analyst-reviewed context only, never an extra sanctions list, Google News/GDELT substitute, automated customer risk-score input, MLRO decision or screening-assurance PASS. No PDF contents are redistributed.
The same file also holds each jurisdiction's FATF effectiveness ratings (the 11 Immediate Outcomes) for the 199 jurisdictions in FATF's consolidated assessment ratings (2013 Methodology table updated 24 August 2026; 2022 Methodology table updated 25 September 2026). FATF licenses this data under CC BY 4.0, and the file carries FATF's citation and adaptation notice.
scripts/country-score.mjs computes a second, reproducible 1-3 score for every country and writes it to data/country-score-suggested.json. The app shows it under the jurisdiction select and the daily report prints it next to a hit's jurisdiction, beside the current score. It is never applied: no scoring code reads it, and changing a country's score stays an MLRO decision through the existing override (a reason is mandatory).
| Factor | Effect |
|---|---|
| FATF call for action (black list) | suggested 3 |
| FATF grey list | suggested 3 |
| FATF effectiveness: Immediate Outcomes rated High or Substantial | 0-1: 3 pts, 2-3: 2 pts, 4-6: 1 pt, 7-11: 0 |
| US INCSR major money-laundering jurisdiction | 2 pts |
| US TIP Tier 3 / Tier 2 Watch List | 2 pts / 1 pt |
| EU tax list Annex I | 1 pt |
Points give 0-2 = 1 Low, 3-5 = 2 Medium, 6-8 = 3 High. A jurisdiction FATF has not rated, and that is not FATF-listed, gets no suggestion. The weights were chosen when the method was proposed; no source sets them. Transparency International's Corruption Perceptions Index was proposed but is left out because TI's terms (CC BY-ND 4.0, no commercial use) do not allow it here. The method has no sanctions factor yet, so a suggestion below the current score is not a recommendation to lower it. npm test fails if the committed file drifts from its inputs (node scripts/country-score.mjs --write regenerates it).
On 2026-10-08 the 17 suggestions above the then-current score were applied to the country list, on the approval of Luisa Fernanda (repository owner); no separate MLRO countersignature is recorded. The 53 lower suggestions were not applied: 39 of them would take a country off score 3, which also switches off the OECD Annex II escalation for artisanal (ASM) gold from that country.
The transaction-monitoring engine includes explicit gold trade evidence rules:
GOLD_ROUTE_DEVIATION compares the recorded planned and actual transport
routes (ordered two-letter country codes); GOLD_ROUTE_CHANGE reports an
expressly documented post-contract shipment-route or consignee change;
GOLD_ORIGIN_UNVERIFIED reports an explicitly failed/unverified origin
check. A malformed supplied route gives GOLD_ROUTE_UNREADABLE, which needs
manual checking. An absent route or unknown origin is not treated as proof
of a mismatch or a clean supply chain. All are MLRO review findings, not
sanctions designations, fraud findings, reporting/freeze instructions or
automatic customer decisions.
A Payments Register template can provide Gold trade: yes,
Gold planned route: GH, AE, Gold actual route: GH, TR, AE,
Gold route changed after contract: yes, and
Gold origin verified: no. Corresponding fields are also documented
in data/transaction-feed.schema.json. Production transaction
monitoring remains inactive without an approved real feed. Never
commit actual transaction or shipment/customer PII to this repository.
The existing hawkeye_analyze_kyc_note MCP tool also returns an
individuals[].pep_country_qa reminder for Turkey (including Türkiye
spelling), India and Papua New Guinea. These are operator-selected
screening-quality spot-check examples, not newly elevated country risk
scores or evidence of PEP exposure. A nationality never establishes a PEP
finding, and a negative public-source match never confirms someone is not a
PEP. No country scores, lists or Asana KYC records change.
The 53 proposed country-score decreases remain unapplied. In particular, 39 would lower a high-risk classification and affect the existing artisanal-gold EDD trigger. Such changes need separate documented risk-model validation and MLRO approval, not this engineering PR.
A Model Context Protocol (MCP) server exposes the deterministic screening engine - sanctions/watchlist name screening, transaction monitoring, KYC/CDD gap analysis, jurisdiction-risk tiering, transliteration-variant expansion, adverse-media keyword scanning and DRAFT STR-dossier assembly - as MCP tools, resources and prompts an AI agent (Claude Desktop, an SDK client, the MCP Inspector) can discover and call. MCP is the open standard that connects an AI model to external tools through one uniform interface; this server is the bridge between an agent and the engine that already powers the daily screening workflow.
mcp/FastMCP install,
nothing added to ci/requirements.txt, no new supply-chain surface.pip install --require-hashes -r ci/requirements.txt # engine runtime deps
python3 mcp_server.py # serve on stdio
Files: mcp_server.py (transport), mcp_tools.py
(engine wrappers), test/mcp_tools_test.py (tests,
wired into CI). Full reference: docs/mcp-server.md.
| Factor | Scoring |
|---|---|
| Jurisdiction of incorporation & operation | Per-country score (1 Low / 2 Medium / 3 High) from the embedded country list |
| Nature & complexity of business activities | Per-activity score (Regulated Financial Entities = 1; trading, mining, refining, jewellery, wholesale/pawn = 3) |
| Ownership, control & compliance (11 questions) | Yes = 3, No = 1 - except AML/CFT control adequacy, which is inverted (Yes = 1, No = 3) |
| Onboarding channel | In-person = 1, Remote / non-face-to-face = 3 |
| Operational history & relationship duration | < 1 year = 3, 1 year = 2, 2+ years = 1 |
| Supply chain - recycled sources (×3 suppliers) | Per-material score 0–3 (e.g. LBMA Good Delivery = 1, gold-processing chemicals = 3) |
| Supply chain - mined sources (×3 suppliers) | LSM / MSM = 2, ASM (artisanal) = 3, N/A = 0 |
| Total score | Band | Outcome | Suggested review cycle |
|---|---|---|---|
| 0–19 | CDD | Customer Due Diligence | 12 months |
| 20–22 | SDD | Simplified Due Diligence review | 6 months |
| 23+ | EDD | Enhanced Due Diligence | 3 months |
Review cycles follow the firm's Know Your Customer procedure: low-risk customers are reviewed at least every 12 months, medium-risk every 6 months, and high-risk at least every 3 months with EDD.
The numeric score is always displayed unchanged; the operative outcome is layered on top, in strict priority order, with every reason shown in the banner, the JSON export, and the printed report.
1 · PROHIBITED - Do Not Onboard. A Yes on any designated-party question ends the assessment: do not onboard, freeze funds where held, and file a report with the FIU / relevant authority. No review date is suggested - the relationship is declined.
2 · Mandatory EDD floor. When not prohibited, any of the following forces EDD regardless of the total score:
| Trigger | Basis |
|---|---|
| PEP exposure = Yes | FATF Recommendation 12 |
| Jurisdiction on the FATF call-for-action list (Iran, North Korea, Myanmar) | FATF public statements |
| Any mined source = ASM and jurisdiction risk score 3 | OECD Due Diligence Guidance, Annex II red flag |
3 · Otherwise the numeric band applies.
The country/activity/material scores embedded in index.html are the firm-approved baseline (versioned as RISK_DATA_VERSION; changes to it go through a pull request, so git history remains the official audit trail and CI validates every change).
On top of the baseline, the Risk Data panel (sidebar → ⚙ Risk Data) lets the compliance function apply local overrides:
localStorage) and as a portable risk data sheet (JSON export/import), so one approved sheet can be distributed to the whole team.Separately from the risk data (which is firm-wide), the analyst may raise the operative outcome of a single assessment above the computed one - CDD → SDD/EDD or SDD → EDD - with a mandatory justification. It is a one-way ratchet: it can never weaken the computed outcome, is inert without a justification, and never applies to PROHIBITED relationships. The suggested review cadence follows the overridden band, and the report records both the computed and the overridden outcome.
localStorage in the user's browser only; nothing is transmitted anywhere.For an offline, zero-backend tool, sensitive data is protected on the device rather than behind a server:
localStorage with AES-256-GCM (WebCrypto). The key is derived from the officer's passphrase via PBKDF2 (250k iterations, random salt); each write uses a fresh IV. On first run you can set a passphrase or continue unencrypted; the choice is remembered. There is no recovery - store the passphrase securely.netlify.toml); the Asana relay functions enforce a same-origin / ALLOWED_ORIGINS allow-list.A full mapping of this app against the AI Governance & Security Periodic Table (2026) - what applies, what is implemented, and what is out of scope for the deterministic, on-device RA engine, plus the tiles that apply to the optional LLM-backed Advisor (brain-soul.js) - is in docs/governance/ai-governance-gap-analysis-2026.md.
The complete governance pack - policy, framework mappings (ISO/IEC 42001, NIST AI RMF, EU AI Act, UAE AI Charter), risk/impact assessments, registers, and runbooks - is indexed in docs/governance/README.md; the ISO/IEC 42001 AIMS document pack (risk register, SoA, internal audit, management review, CAPA, decommissioning) in docs/aims/README.md; and the per-model cards in docs/models/README.md.
The suite is also mapped against the 6 Layers of Agentic AI Governance (AI visibility → AI assurance) in docs/governance/agentic-ai-governance-6layers-2026.md, supported by:
docs/governance/ai-asset-register.md (+ machine-readable data/ai-assets.json) - the AI inventory and risk tiering (Layer 1);docs/governance/data-retention.md - data stores, retention and lineage (Layer 2); enforced by purgeStaleDraft in index.html;docs/governance/dpia-2026.md - Data Protection Impact Assessment (Layer 2);docs/governance/advisor-bias-review-2026.md - paired-prompt bias-review method + log (Layer 2/4);docs/governance/nist-ai-rmf-mapping-2026.md and docs/governance/iso-42001-soa-2026.md - NIST AI RMF crosswalk + ISO 42001 Statement of Applicability (Layer 6);docs/governance/ai-incident-runbook.md and docs/governance/ai-acceptable-use-policy.md - incident response/kill switch + acceptable use (Layer 6);test/advisor-assurance.test.js + test/ai-assets.test.js + test/data-json.test.js (offline, in CI) and scripts/advisor-eval.mjs / scripts/advisor-bias-eval.mjs (key-gated, weekly/quarterly) - Advisor red-team, charter-drift, register-schema, JSON-integrity, plus live behavioural and bias assurance (Layer 1/2/4). Runtime guards in : PII flag, output-structure validator, budget flag, and an kill switch; in-app AUP acknowledgment gate in .Copy .env.example to .env (never commit it) and fill in the values, then add them to your hosting environment:
| Variable | Required | Purpose |
|---|---|---|
ASANA_ACCESS_TOKEN | Yes | Personal access token from Asana Developer Console. Used by Netlify functions and the GitHub Actions watchdog. Add to GitHub Secrets and Netlify environment variables. |
ASANA_PROJECT_GID | Recommended | GID of the RISK ASSESSMENTS Asana project (from the project URL). Defaults to the built-in value - set explicitly to avoid targeting the wrong project after a project rename or workspace change. |
ASANA_ASSIGNEE | No | Asana user to assign tasks to. Defaults to me (the token bearer). |
ALLOWED_ORIGINS | No | Comma-separated extra browser origins permitted to call the Netlify functions. Same-origin requests and header-less (server-to-server) calls are always allowed; cross-site browser origins are rejected with 403. |
APP_SHARED_TOKEN | Recommended for real data | Shared-secret gate for the Netlify functions. The asana-mirror (register + activity-log) and risk-backup (risk-data sheet) relays carry customer data off-device and a read returns it, so when this is set they require an X-App-Token on every path - including the browser (the Origin header is forgeable). Leave blank and those relays are effectively public; a deployment that files real customer data should set this and fill the matching <meta name="hsra-app-token"> value in the three HTML pages (or rely on the on-device tokenise - no PII delivery option). See netlify/functions/_auth.js. |
APP_STRICT_TOKEN | No | Set to 1 to require X-App-Token on every request to every function (including the task-write endpoint and the browser path) - the only mode that resists Origin forgery. Requires APP_SHARED_TOKEN. |
Open directly - download index.html and open it in any modern browser.
Serve locally:
python3 -m http.server 8000
# → http://localhost:8000
Self-host (container) - every release publishes a provenance-attested image to GHCR (publish-container.yml); versions track APP_VERSION:
docker run -p 8080:8080 ghcr.io/trex0092/hawkeye-sterling-ra:latest
# → http://localhost:8080
The image serves the same static tree as the live site - as a non-root process with the same security headers the Netlify edge sets (CSP, HSTS, COOP/COEP - see sws.toml) and a /health probe endpoint; the Netlify functions (Asana relay, AI brain, encrypted backup) are absent and the app degrades gracefully - all assessment data stays on-device either way.
Deploy - the Netlify project hawkeye-sterling-ra publishes the repo root as-is (netlify.toml, no build step). Link the repository to the project in the Netlify UI for continuous deploys, or deploy any other static host - the app is index.html plus its same-origin app.js (and the console.html/advisor.html pages with their *.js).
The scoring engine, hard-outcome escalations, persistence, and report rendering are covered by a dependency-free test suite that executes the app's full script (app.js) against a DOM stub:
node test/app.test.js # checks - engine, register, report, Asana delivery & backup, edge cases
node test/watchdog.test.mjs # 20 checks - FATF list parsing, alerts, digest, backup extraction
CI runs both suites plus two headless-Chrome smoke tests (one with prefers-reduced-motion for stability, one with motion enabled to exercise animation code paths) on every push and pull request (.github/workflows/ci.yml).
With the dev toolchain installed (npm ci - lockfile-pinned, no runtime dependencies), the same suites run as npm scripts: npm test (every test/*.test.js / test/*.test.mjs - exactly the set CI runs), npm run lint, npm run lint:html, and npm run test:visual / npm run test:e2e (after npx playwright install chromium). The unit suites themselves remain dependency-free - any single one still runs directly with node test/<file>.
The application targets WCAG 2.1 Level AA for its core assessment workflow:
aria-pressed state on Yes/No toggles.prefers-reduced-motion media query - the gauge draw-in and count-up are skipped when motion is reduced.Known limitations: colour-contrast of some badge colours has not been independently audited. The print report requires the user to enable "Print backgrounds" in Safari and Firefox print dialogs.
.
├── index.html # Application markup (CSP: no inline script/style)
├── app.js # Application logic (scoring, data, persistence, UI wiring)
├── app.css # Application styles (externalised for a pure-'self' CSP)
├── console.js / advisor.js # Logic for the console + advisor pages
├── fonts.css / assets/fonts/ # Self-hosted web fonts (no third-party origin)
├── mcp_server.py # MCP stdio server (zero-dep JSON-RPC 2.0) exposing the engine
├── mcp_tools.py # Deterministic MCP tool wrappers over screen/kyc/txn_monitor
├── test/mcp_tools_test.py # MCP server + tool-layer unit tests
├── docs/mcp-server.md # MCP server reference (tools, resources, prompts, safety)
├── test/app.test.js # Functional test suite (no dependencies)
├── test/watchdog.test.mjs # FATF watchdog unit tests
├── test/reg-watch.test.mjs # Regulatory Watch unit tests
├── scripts/fatf-watchdog.mjs # Monthly FATF black/grey list watchdog (Asana alerts)
├── scripts/reg-watch.mjs # Weekly worldwide regulatory-source watcher (opens a PR)
├── scripts/reg-draft.mjs # Optional AI update proposal (needs ANTHROPIC_API_KEY)
├── scripts/sanctions-screen.mjs # Daily customer screening vs sanctions/watchlists (Asana alerts)
├── data/sanctions-screen-state.json # Last-seen matches (committed by the action; no re-alert spam)
├── data/fatf-state.json # Watchdog's last-seen FATF lists (committed by the action)
├── data/reg-sources.json # Regulatory Watch source registry + per-source narratives
├── data/reg-watch-state.json # Regulatory Watch content fingerprints (committed by the action)
├── docs/regulatory-watch.md # Regulatory Watch: source narratives + how it works
├── docs/cybersecurity-skills.md # Claude Code plugin: Anthropic Cybersecurity Skills (817 skills)
├── .claude/settings.json # Pre-registers the cybersecurity-skills plugin marketplace
├── .github/workflows/ # CI, FATF watchdog, Regulatory Watch, site health, releases
├── scripts/asana-alert.mjs # Asana alert task helper (used by site health)
├── package.json / package-lock.json # Dev/CI toolchain, lockfile-pinned (zero runtime npm deps)
├── pyproject.toml # Python engine metadata (runtime pins stay in ci/requirements.txt)
├── Dockerfile # Self-hosting image (GHCR, digest-pinned base, published per release)
├── netlify.toml # Static publish config (repo root, no build)
├── netlify/functions/ # Serverless: Asana task delivery + risk-data mirror
├── docs/ # ~190 documents - see docs/ for the full estate
│ ├── aims/ # ISO/IEC 42001 AIMS pack (risk register, BCP, audits…)
│ ├── governance/ # AI policy, crosswalks, registers, ADRs, readiness review
│ ├── policies/ # AML/CFT/CPF policy pack
│ ├── models/ # Per-feature model cards
│ ├── security/ # Runbooks (history scrub, deploy rollback), scanning triage
│ ├── architecture/ # System context, trust boundaries, data flows
│ ├── executive/ # Brief, ROI, readiness, roadmap, KPI dashboard
│ ├── user-guides/ # Analyst / administrator / reviewer-MLRO guides
│ ├── api/ # Netlify functions reference
│ ├── research/ # Regulatory research + auto-generated updates
│ ├── demo/ # Demo script, sample data, scenarios
│ └── screenshots/ # README captures of the three screens
├── design/ # Original design handoff (reference only, not served logic)
├── GOVERNANCE.md # Repository decision rights (Board / MLRO / maintainer)
├── MAINTAINERS.md # Maintainer roster + succession record
├── CLAUDE.md # Enforced invariants, for AI agents and second operators
└── README.md
An honest map of what runs, what waits on a human act, and where the accepted architectural limits are. The tracking record is the open-actions register; the horizon view is the roadmap.
txn_monitor.py) is implemented and unit-tested but INACTIVE until a
transaction feed is connected (TXN_FEED_PATH) - register item 6, risk
R-13. An interim manual compensating control was adopted 2026-07-29.APP_SHARED_TOKEN is unset.
Confidential read relays require X-App-Token when the shared token is configured,
but that shared bearer secret is still not verified per-user identity or RBAC. The
repository does not infer the live environment setting; verified identity is register
item 20. See netlify/functions/_auth.js.localStorage).
Asana mirrors provide off-device operational copies of the assessment register,
activity log and risk-data overrides, but there is no dedicated authenticated
persistence tier with a documented and rehearsed assessment-data RPO/RTO. That
remaining preservation gap is register item 23.LLM_TRIAGE=1, but the repository cannot read the live
repo-variable value; the third-party register preserves a 2026-07-16 owner
attestation that it was enabled while the formal DPA/go-live evidence remains
unresolved. Items 36 and 42 reconcile the legal and runtime records.docs/i18n-ar-legal-review.md).CONTRIBUTING.md for the test suite, branch/commit conventions, and the gates a PR must pass.CODE_OF_CONDUCT.md.SUPPORT.md, or open an issue with the templates in .github/ISSUE_TEMPLATE.Found a vulnerability? Do not open a public issue - follow the disclosure process in SECURITY.md. Incident response and the Advisor kill switch are documented in docs/governance/ai-incident-runbook.md.
The architecture, trust boundaries, and a STRIDE threat model are in docs/architecture.md. Static analysis runs CodeQL plus Semgrep - generic community rulesets advisory, and app-specific security invariants (.semgrep/hawkeye.yml: no eval/new Function, no document.write, no child_process, no secret reads in client code) blocking in CI. Releases ship a CycloneDX SBOM and a Sigstore-keyless build-provenance attestation - verify a downloaded artifact with gh attestation verify <file> --repo trex0092/HAWKEYE-STERLING-RA.
This repo pre-registers the Apache-2.0 Anthropic Cybersecurity Skills library (817 agent skills across 29 domains, mapped to MITRE ATT&CK / F3, NIST CSF / AI RMF, ATLAS and D3FEND) as a Claude Code plugin via .claude/settings.json. It gives Claude Code expert decision-workflows for the fraud-typology, threat-intelligence, and deployment-security work around this AML/CFT tool - see docs/cybersecurity-skills.md for what installs, how it maps to Hawkeye Sterling, and the authorized-use scope. The Advisor's own typologies are mapped to the MITRE F3 (Fight Fraud Framework) tactics in docs/fraud-f3-mapping.md.
Proprietary - All Rights Reserved. See LICENSE. The source is provided for authorized internal compliance use; redistribution, modification, or commercial use requires written permission.
This tool is for internal compliance use only. It supports - and does not replace - professional judgement, firm policy, and applicable AML/CFT regulatory obligations. Country, activity, and material risk scores are template values sourced from the firm's risk data sheet and should be reviewed and maintained by the compliance function.
Live served assets match current main by content |
| Production functions | Live health probe completes with valid function responses |
.github/workflows/fatf-watchdog.yml) reads FATF's published black/grey lists, compares them with the app's country data, and on any change (listed or delisted) creates a review task in the RISK ASSESSMENTS Asana project naming the affected assessments. Detection is automatic; score changes remain a human decision via the Risk Data panel. The same monthly run also posts a "Reviews due" digest task listing every client whose next review falls due that month (overdue ones flagged), assigned and dated for Asana's reminders. Requires the ASANA_ACCESS_TOKEN repository secret..github/workflows/regulatory-watch.yml) that monitors a worldwide, UAE-weighted set of regulatory sources (MoE, FIU, NAMLCFTC, EOCN, CBUAE, VARA and the gold/jewellery sector; plus FATF guidance, Wolfsberg, RMI, LBMA, OECD, OFAC, UN, EU, UK OFSI, Egmont and the Basel AML Index) defined in data/reg-sources.json. It fingerprints each source's content (scripts/reg-watch.mjs) and, on any change, opens a pull request carrying the updated fingerprint state and a change report so the Q&A answers (assets/super-data.js) and risk data can be reviewed and updated. If an ANTHROPIC_API_KEY secret is present it also attaches an AI-drafted update proposal (scripts/reg-draft.mjs) to the PR. Detection is automatic; the regulator-grade wording change stays a reviewed decision (no auto-publish). Country black/grey list moves are handled by the FATF Watchdog above. See docs/regulatory-watch.md for the source narratives and setup. Run once with mode = seed to record the baseline..github/workflows/sanctions-watch.yml) that fingerprints the major consolidated designation lists (OFAC SDN + non-SDN, UN Security Council, UK OFSI, EU FSF - data/sanctions-sources.json) and, on any change, files a task in the Sanctions Asana project. It answers "did a list change?"..github/workflows/sanctions-screen.yml, results in Asana before 09:00 UAE) that answers the operative question: "is any of our customers now on a list?". It reads the active counterparties from the Customer Database Asana project and batch-screens them locally, in-repo (no external engine, no paid API) via scripts/sanctions-screen.mjs + the matcher in scripts/sanctions-match.mjs. Core lists from data/sanctions-sources.json: OFAC SDN (primary + a.k.a. aliases) · OFAC Consolidated (non-SDN) · UN · EU FSF · UK OFSI; extra national lists from data/sanctions-extra.json: UAE EOCN Local Terrorist List (curated in-repo - the official file is bot-gated PDF/Excel), Canada SEMA, France DGT, Switzerland SECO (enabled), with Australia DFAT, New Zealand, Ukraine NSDC and World-Bank-debarred configured but disabled until a verified machine-readable endpoint exists - a source that fails or parses zero names degrades coverage loudly, never silently. INTERPOL lookups are opt-in (SCREEN_INTERPOL=1, default off). On any new match it raises one alert for MLRO / four-eyes review (UAE Federal Decree-Law No. 10 of 2025; FATF R.26) and the case engine (scripts/screening-cases.mjs) opens an assigned, SLA-tracked case; a standing match is recorded once, not re-alerted daily. Detection is automatic; the freeze/decline/report action stays a reviewed, dual-attested decision. A run that cannot screen (no token, lists unreachable, empty database) never reports all-clear - it fails red and opens a GitHub issue. Needs only the ASANA_ACCESS_TOKEN secret (see .env.example).test/fixtures/screening-benchmark/ - 134 true-equivalent name pairs across Latin/Arabic/Turkish/Cyrillic/CJK/phonetic-drift classes, 90 hard negatives, 114 labelled adverse headlines in 8 languages, 6 multi-day repeat-signal scenarios) runs through both real engines on every push, with per-backend floors pinned in CI (docs/governance/screening-accuracy-benchmark.md). Current state vs the frozen pre-hardening baseline (per the benchmark doc's 2026-08-05 entry, the most recent): sanctions recall 57%→100% Python / 99.3% JS (floor 95%, miss budget capped at the 1 documented residual), adverse-media classification 58%→100%, repeat-signal accuracy 50%→100%, hard-negative precision 100% both backends (JS ratcheted 96.5%→100% on 2026-08-05). The gains come from the shared 89-group transliteration table (data/translit-groups.json), a dependency-free phonetic fold layer (multi-edit romanization drift now flags as a WEAK phonetic-only possible match - never confirmed-looking), description-aware adverse-media scanning with strong/weak keyword tiers, and a relevance/corroboration/fingerprint-gated repeat counter - all recall-monotone: nothing is ever unflagged, dropped or suppressed; precision comes from tiering and escalation weighting. Floors only ratchet upward; every number is benchmark-relative (population-level validation runs through the backtesting protocol).ASANA_ASSIGNEE, default the token owner) with the due date set to the next review date, so Asana itself alerts the compliance officer as each review falls due..github/workflows/site-health.yml): every Monday a headless Chrome renders the live site and verifies it computes; if it is down or broken, an assigned alert task is opened in Asana. Auto Release (.github/workflows/auto-release.yml): every merge to main that bumps APP_VERSION is tagged and released automatically with generated notes. Risk-data backup: on every override change the deployed app mirrors the full risk-data sheet to a dedicated Asana task ("RISK DATA SHEET (auto-backup)") via netlify/functions/risk-backup.js, and the monthly watchdog commits that mirror to data/risk-overrides-backup.json - an off-device backup with a git audit trail.localStorage) and are restored on reload; named assessments are also filed in the on-device register. All dates are entered and displayed as DD/MM/YYYY.brain-soul.jsADVISOR_ENABLEDadvisor.html