Loading...
Loading...
Check whether a tenant's DEPLOYED Sumsub config actually satisfies a regulation/policy document — tracing each requirement to where it is collected, scored, and ENFORCED, and flagging "collected-but-not-enforced" gaps. TRIGGER when the user has a regulation/policy/requirements doc (PDF or text) and wants to verify the live config matches it, audit a client's setup against compliance rules, "does my config satisfy this regulation", "check conformance / gap analysis", or close the loop after configuring with the create-* skills. SKIP for building config (sumsub-create-*) or for generating a config plan from a regulation (sumsub-analyze-regulation). For pure hygiene linting with no regulation, run this skill's bundled lint_config.py sub-pass directly.
npx skill4agent add sumsub/agent-skills sumsub-conformancescripts/sumsub_curl.shresolve_graph.sh| Purpose | Method + Path |
|---|---|
| Levels (find target) | |
| Workflows (auto-find the one referencing the level) | |
| Questionnaire content + scores | |
| PoA / cross-check preset | |
Entitlements ( | |
sumsub-api-auth⚠️ Sandbox tokens only. Read-only, but still: do not accept a production App Token. If the user offers one, refuse and ask for a sandbox pair at https://cockpit.sumsub.com/checkus/devSpace/appTokens (toggle to Sandbox first). The helper rejects tokens that don't start with.sbx:
| Var | Example |
|---|---|
| |
| paired secret |
| optional; |
Use the scripts — do not hand-roll the deterministic steps. The whole point of this skill is that resolution and the verdict are deterministic, not re-derived by eyeball each run:
- Resolve the graph ONLY via
. Do not callresolve_graph.shendpoints directly, list levels by hand, or strip the/resources/...trailer yourself — the script does all of that and emits one clean graph.HTTP <code>- If the graph can't be resolved, STOP — never work around the failure. A
/401, a403, or404/ "level not found" from0 levelsmeans the run cannot proceed. Report the failure plainly (likely a bad/non-sandbox token or wrong level name) and stop. Do not editresolve_graph.sh(or any script) to route around the error, add a by-id fallback, retry a different endpoint, or otherwise improvise a graph — and never emit a report, bucket counts, or a CONFORMANT verdict from a partial or substituted graph. No resolved graph → no findings.resolve_graph.sh- Derive the verdict ONLY from
/trace.py. Do not read the workflow/questionnaire JSON by eye and decide "enforced / not enforced" yourself — that re-introduces variance and hallucination. Thereport.pyfinding must come from the engine.COLLECTED-NOT-ENFORCED- If a script already ran, trust its output — do not re-verify it with manual API calls.
- To inspect the graph for the Map step, run
. Do not hand-iterate the graph JSON:python3 scripts/graph_summary.py "$CONFIG"/questionnaires/poaPresetsare dicts keyed by id (iterating yields id strings →crossCheckPresets) and'str' has no attribute 'get'is a list.entitlementsprints the section/item indices + scores you need, correctly. The agent's judgment belongs to two steps only: ingest (reading the regulation) and map (matching requirements to deployed config elements — questions, docSets, fields, countries, entitlements). Everything else is the scripts.graph_summary.py
Artifacts — MANDATORY location & naming. Every run MUST write its artifacts into the same directory as the source regulation file, named from its stem (filename without extension). Never save in the cwd or under improvised names. Derive the exact paths once, up front:eval "$(python3 scripts/artifact_paths.py "<path/to/RegFile.pdf>")" # $REQUIREMENTS = <dir>/<stem>_regulations.json (the requirements you build in steps 1+3) # $CONFIG = <dir>/<stem>_config.json (resolve_graph output, step 2) # $REPORT = <dir>/<stem>_report.md (the rendered report, step 6)e.g.→Level4regulations.pdf,Level4regulations_regulations.json,Level4regulations_config.json. UseLevel4regulations_report.md/$REQUIREMENTS/$CONFIGverbatim in the steps below.$REPORT
pagespypdfpdftotextscripts/render_regulation.pyreferences/conformance-method.md$REQUIREMENTS<stem>_regulations.jsonreferences/requirements-schema.md{id, source, text, type, enforceable, …}source"§5.9.2""Section 2 — Scoring Result""p.21"enforceable: sdk|platformbash scripts/resolve_graph.sh <levelNameOrId> > "$CONFIG"python3 scripts/graph_summary.py "$CONFIG"[section]/[item]typematchmatchreferences/requirements-schema.mdmatch: {questionnaire, section, item}expectScoresmatch: {docSet: "IDENTITY", types: [...]}type: data-fieldmatch: {field: "dob"}{fields: [...]}type: country-eligibilitymatch: {mustHaveAllowlist: true}{mustExclude: [...]}type: livenessmatch: {}type: entitlementmatch: {entitlement: "WATCHLISTS"}enforcementSignalmatch: nullpython3 scripts/trace.py --requirements "$REQUIREMENTS" --graph "$CONFIG"basisbash scripts/resolve_graph.sh <level> | python3 scripts/lint_config.pyreferences/lint-rules.mdreferences/rules.json$REPORTpython3 scripts/trace.py --requirements "$REQUIREMENTS" --graph "$CONFIG" | python3 scripts/report.py --date <today> > "$REPORT"basis$REPORTtrace.pyNOT-CONFIG-REPRESENTABLEbasisenforcementSignalcountryreferences/requirements-schema.mdresolve_graph.sh0 levelssumsub-analyze-regulationexamples/sample-requirements.jsonsample-graph.jsontest_trace.pyfiu-india-vasp-mapped.jsonvasp-graph.jsonpython3 scripts/trace.py --requirements examples/fiu-india-vasp-mapped.json --graph examples/vasp-graph.json | python3 scripts/report.pycfd-requirements.jsoncfd-onboarding-eufiu-india-requirements.jsonaudit-input{,-dirty}.jsontest_lint.py