[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-trail-of-bits-trailmark":3,"mdc--kj61pn-key":35,"related-repo-trail-of-bits-trailmark":3411,"related-org-trail-of-bits-trailmark":3505},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":30,"sourceUrl":33,"mdContent":34},"trailmark","build and query source code graphs","Builds and queries multi-language source and binary code graphs for security analysis. Includes pre-analysis passes for blast radius, taint propagation, privilege boundaries, entry point enumeration, proxy\u002Funresolved-call tracking, type\u002Freference queries, structural traversal, graph diffs, audit augmentation, declared cross-language\u002FFFI\u002Fexternal links via `.trailmark\u002Flinks.toml`, and SQL schema graphs. Use when analyzing call paths, mapping attack surface, finding complexity hotspots, enumerating entry points, tracing taint propagation, measuring blast radius, importing SARIF\u002FweAudit\u002Fbinary findings, linking source graphs across language or RPC boundaries, or building a code graph for audit prioritization. Feature-gate version-specific Trailmark APIs before using them; prefer `trailmark.parse.detect_languages()` or `--language auto` when the target language is unknown or polyglot.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"trail-of-bits","Trail of Bits","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Ftrail-of-bits.png","trailofbits",[13,17,20],{"name":14,"slug":15,"type":16},"Security","security","tag",{"name":18,"slug":19,"type":16},"Engineering","engineering",{"name":21,"slug":22,"type":16},"Code Analysis","code-analysis",6139,"https:\u002F\u002Fgithub.com\u002Ftrailofbits\u002Fskills","2026-08-01T05:44:51.913078",null,541,[29],"agent-skills",{"repoUrl":24,"stars":23,"forks":27,"topics":31,"description":32},[29],"Trail of Bits Claude Code skills for security research, vulnerability detection, and audit workflows","https:\u002F\u002Fgithub.com\u002Ftrailofbits\u002Fskills\u002Ftree\u002FHEAD\u002Fplugins\u002Ftrailmark\u002Fskills\u002Ftrailmark","---\nname: trailmark\ndescription: \"Builds and queries multi-language source and binary code graphs for security analysis. Includes pre-analysis passes for blast radius, taint propagation, privilege boundaries, entry point enumeration, proxy\u002Funresolved-call tracking, type\u002Freference queries, structural traversal, graph diffs, audit augmentation, declared cross-language\u002FFFI\u002Fexternal links via `.trailmark\u002Flinks.toml`, and SQL schema graphs. Use when analyzing call paths, mapping attack surface, finding complexity hotspots, enumerating entry points, tracing taint propagation, measuring blast radius, importing SARIF\u002FweAudit\u002Fbinary findings, linking source graphs across language or RPC boundaries, or building a code graph for audit prioritization. Feature-gate version-specific Trailmark APIs before using them; prefer `trailmark.parse.detect_languages()` or `--language auto` when the target language is unknown or polyglot.\"\n---\n\n# Trailmark\n\nParses source code into a directed graph of functions, classes, calls, and\nsemantic metadata for security analysis.\n\n## When to Use\n\n- Mapping call paths from user input to sensitive functions\n- Finding complexity hotspots for audit prioritization\n- Identifying attack surface and entrypoints\n- Understanding call relationships in unfamiliar codebases\n- Security review or audit preparation across polyglot projects\n- Adding LLM-inferred annotations (assumptions, preconditions) to code units\n- Importing external binary-analysis graphs to connect source and binary views\n- Querying transitive slices, entrypoint paths, subgraph edges, or type references\n- Producing graph evidence for one suspicious function or candidate finding\n- Pre-analysis before mutation testing (genotoxic skill) or diagramming\n\n## When NOT to Use\n\n- Single-file scripts where call graph adds no value (read the file directly)\n- Architecture diagrams not derived from code (use the `diagramming-code` skill or draw by hand)\n- Mutation testing triage (use the genotoxic skill, which calls trailmark internally)\n- Runtime behavior analysis (trailmark is static, not dynamic)\n\n## Rationalizations to Reject\n\n| Rationalization | Why It's Wrong | Required Action |\n|-----------------|----------------|-----------------|\n| \"I'll just read the source files manually\" | Manual reading misses call paths, blast radius, and taint data | Install trailmark and use the API |\n| \"Pre-analysis isn't needed for a quick query\" | Blast radius, taint, and privilege data are only available after `preanalysis()` | Always run `engine.preanalysis()` before handing off to other skills |\n| \"The graph is too large, I'll sample\" | Sampling misses cross-module attack paths | Build the full graph; use subgraph queries to focus |\n| \"Uncertain edges don't matter\" | Dynamic dispatch is where type confusion bugs hide | Account for `uncertain` edges in security claims |\n| \"Single-language analysis is enough\" | Polyglot repos have FFI boundaries where bugs cluster | Use the correct `--language` flag per component |\n| \"Complexity hotspots are the only thing worth checking\" | Low-complexity functions on tainted paths are high-value targets | Combine complexity with taint and blast radius data |\n| \"The docs mention a version-gated method, so I can call it anywhere\" | Many environments still have Trailmark 0.2.x installed | Check the installed version or probe feature availability before using v0.4+\u002Fv0.5+ features |\n\n---\n\n## Installation\n\n**MANDATORY:** If `uv run trailmark` fails (command not found, import error,\nModuleNotFoundError), install trailmark before doing anything else:\n\n```bash\nuv pip install trailmark\n```\n\n**DO NOT** fall back to \"manual verification\", \"manual analysis\", or reading\nsource files by hand as a substitute for running trailmark. The tool must be\ninstalled and used programmatically. If installation fails, report the error\nto the user instead of silently switching to manual code reading.\n\n## Version Gate\n\nTrailmark 0.4.0 expands the graph model and query surface, and 0.5.0 adds a\nSQL parser, repository-link configuration, and richer entrypoint metadata.\nBefore using a feature listed as **v0.4+** or **v0.5+**, check the installed\nversion:\n\n```bash\ntrailmark --version 2>\u002Fdev\u002Fnull || uv run trailmark --version 2>\u002Fdev\u002Fnull\n```\n\nCompare the reported version numerically (not lexically). `0.4.0` or newer\nmeans the full v0.4 surface is available. The version command itself was added\nin 0.2.2, so a failure means either a pre-0.2.2 install or trailmark missing\nentirely — distinguish with `trailmark analyze --help`. When working\nprogrammatically, probe with `hasattr()` and fall back instead of assuming a\nv0.4-only method exists:\n\n```python\nif hasattr(engine, \"subgraph_edges\"):\n    edges = engine.subgraph_edges(\"tainted\")\nelse:\n    # v0.2 fallback: filter engine.to_json() edges whose endpoints\n    # are both in engine.subgraph(\"tainted\")\n    edges = []\n```\n\n**v0.2-safe baseline:** CLI `analyze`, `diff`, `entrypoints`, `augment`, and\n`--language auto`; `QueryEngine.from_directory()`, `callers_of()`,\n`callees_of()`, `paths_between()`, `ancestors_of()`, `reachable_from()`,\n`entrypoint_paths_to()`, `complexity_hotspots()`, `attack_surface()`,\n`summary()`, `to_json()`, `preanalysis()`, `annotate()`, `annotations_of()`,\n`nodes_with_annotation()`, `clear_annotations()`, `findings()`, `subgraph()`,\n`subgraph_names()`, `diff_against()`, `augment_sarif()`, and\n`augment_weaudit()`.\n\n**Added in 0.2.2:** CLI `--version` flag and `version` subcommand.\n\n**Added in 0.3.x:** the `trailmark.parse` module with module-level\n`detect_languages()` and `supported_languages()`. `detect_languages()` itself\nis v0.2-safe via `from trailmark.query.api import detect_languages` (kept as a\ndeprecated alias in 0.3+); `supported_languages()` has no 0.2.x equivalent.\n\n**v0.4+ features:** native `diagram` subcommand; expanded parser coverage;\nproxy nodes for unresolved calls; node origins; binary graph augmentation via\n`augment_binary()`; `connect_subgraphs()`; `subgraph_edges()`;\n`generic_parameters()`; and `type_references()`.\n\n**v0.5+ features:** `sql` parser (PostgreSQL-oriented schemas, tables, views,\nfunctions, procedures, dependencies); node kinds `schema`, `table`, `view`,\n`procedure`; `.trailmark\u002Flinks.toml` repository-link configuration (see\nRepository Links below), including `proxy.external:\u003Csymbol>` nodes for\ndeclared external endpoints; repository links, unresolved-call proxies, and\n`type_uses` edges now materialize for single-language directory parses (0.4\nemitted them only for polyglot parses); Solidity entrypoints detected from\nparser metadata (interfaces excluded; `solidity_visibility`,\n`solidity_mutability`, `solidity_override`, `solidity_container_kind`, and\n`solidity_overridden_by` node attributes); `attack_surface()` entries carry an\n`attributes` key when the node has attributes; TypeScript resolves receivers\nassigned with `new ConcreteClass()`; C# file-scoped namespaces.\n\nv0.5.0 adds no new `QueryEngine` methods, so `hasattr(engine, ...)` cannot\ndetect it. Gate v0.5 features on the reported version, or probe structurally:\n\n```python\nfrom trailmark.models.nodes import NodeKind\n\nhas_v05 = \"SCHEMA\" in NodeKind.__members__  # sql kinds are 0.5+\n```\n\n## Quick Start\n\n```bash\n# Auto-detect and merge every supported language under the tree\nuv run trailmark analyze --language auto --summary {targetDir}\n\n# Explicit languages (single language or comma-separated list)\nuv run trailmark analyze --language rust {targetDir}\nuv run trailmark analyze --language python,rust {targetDir}\n\n# Complexity hotspots\nuv run trailmark analyze --language auto --complexity 10 {targetDir}\n\n# Entrypoint inventory and structural diff (v0.2-safe)\nuv run trailmark entrypoints --language auto {targetDir}\nuv run trailmark diff --repo {repoDir} main HEAD --json\n\n# Version report (0.2.2+)\nuv run trailmark --version\n\n# v0.4+: native diagram command\nuv run trailmark diagram -t {targetDir} -T call-graph -f main --depth 2\n```\n\n### Programmatic API\n\n```python\n# trailmark.parse is a 0.3+ module; on 0.2.x import detect_languages from\n# trailmark.query.api instead (supported_languages has no 0.2.x equivalent)\nfrom trailmark.parse import detect_languages, supported_languages\nfrom trailmark.query.api import QueryEngine\n\n# Ask the installed Trailmark build what it supports\nsupported_languages()\ndetect_languages(\"{targetDir}\")\n\n# Prefer auto for unknown or polyglot trees; use explicit lists when needed\nengine = QueryEngine.from_directory(\"{targetDir}\", language=\"auto\")\nengine = QueryEngine.from_directory(\"{targetDir}\", language=\"python,rust\")\n\nengine.callers_of(\"function_name\")\nengine.callees_of(\"function_name\")\nengine.paths_between(\"entry_func\", \"db_query\")\nengine.complexity_hotspots(threshold=10)\nengine.attack_surface()\nengine.summary()\nengine.to_json()\n\n# Transitive slices and entrypoint path queries (v0.2-safe)\nengine.ancestors_of(\"sensitive_sink\")\nengine.reachable_from(\"entry_func\")\nengine.entrypoint_paths_to(\"sensitive_sink\")\n\n# v0.4+: connect named subgraphs\nif hasattr(engine, \"connect_subgraphs\"):\n    engine.connect_subgraphs(\"tainted\", \"privilege_boundary\")\n\n# Run pre-analysis (blast radius, entrypoints, privilege\n# boundaries, taint propagation)\nresult = engine.preanalysis()\n\n# Query subgraphs created by pre-analysis\nengine.subgraph_names()\nengine.subgraph(\"tainted\")\nengine.subgraph(\"high_blast_radius\")\nengine.subgraph(\"privilege_boundary\")\nengine.subgraph(\"entrypoint_reachable\")\nif hasattr(engine, \"subgraph_edges\"):\n    engine.subgraph_edges(\"tainted\")\n\n# Add LLM-inferred annotations\nfrom trailmark.models import AnnotationKind\n\nengine.annotate(\"function_name\", AnnotationKind.ASSUMPTION,\n                \"input is URL-encoded\", source=\"llm\")\n\n# Query annotations (including pre-analysis results)\nengine.annotations_of(\"function_name\")\nengine.annotations_of(\"function_name\",\n                       kind=AnnotationKind.BLAST_RADIUS)\nengine.annotations_of(\"function_name\",\n                       kind=AnnotationKind.TAINT_PROPAGATION)\nengine.nodes_with_annotation(AnnotationKind.FINDING)\nengine.clear_annotations(\"function_name\", kind=AnnotationKind.ASSUMPTION)\n\n# v0.4+: generic\u002Ftype-reference and binary augmentation APIs\nif hasattr(engine, \"generic_parameters\"):\n    engine.generic_parameters(\"GenericTypeOrFunction\")\nif hasattr(engine, \"type_references\"):\n    engine.type_references(\"function_name\")\nif hasattr(engine, \"augment_binary\"):\n    engine.augment_binary(\"binary_graph.json\")\n```\n\n## Pre-Analysis Passes\n\n**Always run `engine.preanalysis()` before handing off to genotoxic or\n`diagramming-code` skills.** Pre-analysis enriches the graph with four passes:\n\n1. **Blast radius estimation** — counts downstream and upstream nodes per\n   function, identifies critical high-complexity descendants\n2. **Entry point enumeration** — maps entrypoints by trust level, computes\n   reachable node sets\n3. **Privilege boundary detection** — finds call edges where trust levels\n   change (untrusted -> trusted)\n4. **Taint propagation** — marks all nodes reachable from untrusted\n   entrypoints\n\nResults are stored as annotations and named subgraphs on the graph.\n\nFor detailed documentation, see\n[references\u002Fpreanalysis-passes.md](references\u002Fpreanalysis-passes.md).\n\n## Language Selection\n\nDo not hardcode a stale language table in downstream workflows. Ask the\ninstalled Trailmark build what it supports:\n\n```python\nfrom trailmark.parse import detect_languages, supported_languages\n\nsupported_languages()\ndetect_languages(\"{targetDir}\")\n```\n\nCLI patterns:\n\n```bash\n# Auto-detect and merge\nuv run trailmark analyze --language auto {targetDir}\n\n# Explicit list for a known polyglot target\nuv run trailmark analyze --language python,rust {targetDir}\n```\n\nAs of Trailmark 0.5.0, parser names include: `python`, `javascript`,\n`typescript`, `php`, `ruby`, `c`, `cpp`, `c_sharp`, `java`, `go`, `rust`,\n`solidity`, `cairo`, `circom`, `haskell`, `erlang`, `masm`, `swift`, `objc`,\n`kotlin`, `dart`, `move`, `tact`, `func`, `sway`, `rego`, `proto`, `thrift`,\n`graphql`, and `sql` (added in 0.5.0; PostgreSQL-oriented, `.sql` files).\nTreat this list as documentation, not a source of truth; call\n`supported_languages()` on the installed build before relying on a parser.\n\n## Repository Links (v0.5+)\n\nParsers cannot see cross-language calls (FFI, RPC, IPC, contract invocation)\nor edges into external systems. Declare them in `.trailmark\u002Flinks.toml` at the\nanalysis root and Trailmark materializes the edges on every parse — this is a\nstable public configuration interface:\n\n```toml\n[[link]]\nsource = \"backend:submit\"\ntarget = \"contract:Verifier.verify\"\nkind = \"calls\"                 # any EdgeKind; defaults to calls\nconfidence = \"certain\"         # certain | inferred | uncertain; defaults to inferred\ndescription = \"JSON-RPC eth_call\"\n\n[[link]]\nsource = \"backend:notify\"\ntarget = \"payments-webhook\"\ntarget_external = true         # required because target is unresolved\n```\n\nEndpoint references may be exact node IDs or unique names\u002Fsuffixes. Validation\nfails closed: ambiguous references, unknown internal endpoints, invalid enum\nvalues, and malformed TOML raise `ValueError` rather than silently weakening\nthe graph. `source_external = true` \u002F `target_external = true` permit an\nunresolved endpoint by creating a `proxy.external:\u003Csymbol>` node. Configured\nedges carry a `configured_by = .trailmark\u002Flinks.toml` attribute so they are\ndistinguishable from parser-derived edges.\n\nUse this when the audit spans an FFI\u002FRPC boundary the rationalization table\nwarns about: declare the boundary edges first, then path and taint queries\ncross them like any other call edge.\n\n## Graph Model\n\n**Node kinds:** `function`, `method`, `class`, `module`, `struct`,\n`interface`, `trait`, `enum`, `namespace`, `contract`, `library`,\n`template`; **v0.4+** also materializes unresolved references as `proxy`\nnodes; **v0.5+** adds `schema`, `table`, `view`, and `procedure` for SQL\ngraphs.\n\n**Node origins:** **v0.4+** nodes may carry origin `source`, `proxy`,\n`binary`, or `synthetic`. v0.2 exports may omit origin.\n\n**Edge kinds:** `calls`, `inherits`, `implements`, `contains`, `imports`;\n**v0.4+** adds `resolves_to`, `type_uses`, `specializes`, and\n`corresponds_to`.\n\n**Edge confidence:** `certain` (direct call, `self.method()`), `inferred`\n(attribute access on non-self object), `uncertain` (dynamic dispatch)\n\n### Per Code Unit\n- Parameters with types, return types, exception types\n- Cyclomatic complexity and branch metadata\n- Docstrings\n- Annotations: `assumption`, `precondition`, `postcondition`, `invariant`,\n  `blast_radius`, `privilege_boundary`, `taint_propagation`, `finding`,\n  `audit_note` (last two set by `augment_sarif` \u002F `augment_weaudit`)\n\n### Per Edge\n- Source\u002Ftarget node IDs, edge kind, confidence level\n\n### Project Level\n- Dependencies (imported packages)\n- Entrypoints with trust levels and asset values\n- Named subgraphs (populated by pre-analysis)\n\n## Key Concepts\n\n**Declared contract vs. effective input domain:** Trailmark separates what a\nfunction *declares* it accepts from what can *actually reach* it via call\npaths. Mismatches are where vulnerabilities hide:\n- **Widening**: Unconstrained data reaches a function that assumes validation\n- **Safe by coincidence**: No validation, but only safe callers exist today\n\n**Edge confidence:** Dynamic dispatch produces `uncertain` edges. Account for\nconfidence when making security claims.\n\n**Proxy nodes (v0.4+):** Unresolved calls are preserved as nodes such as\n`proxy.unresolved:\u003Csymbol>`. Do not treat these as source code functions; use\nthem to identify resolution gaps, dynamic dispatch, external APIs, or binary\nlinkage candidates. **v0.5+** also emits `proxy.external:\u003Csymbol>` nodes for\nendpoints declared external in `.trailmark\u002Flinks.toml`.\n\n**Reachability is not taint:** `entrypoint_paths_to()` and the taint subgraph\nanswer different questions. Path queries report call-graph reachability;\npreanalysis taint marks nodes reachable from untrusted entrypoints as a coarse\nsignal. Trailmark does not perform interprocedural taint analysis — do not\npresent either as proof that attacker-controlled data reaches a sink.\n\n**Binary augmentation (v0.4+):** `engine.augment_binary()` imports an external\nbinary-analysis graph JSON file. Trailmark connects it to source nodes when\npossible; it does not disassemble binaries itself.\n\n**Subgraphs:** Named collections of node IDs produced by pre-analysis.\nQuery with `engine.subgraph(\"name\")`. Available after `engine.preanalysis()`.\n\n## Query Patterns\n\nSee [references\u002Fquery-patterns.md](references\u002Fquery-patterns.md) for common\nsecurity analysis patterns.\n\nSee [references\u002Fpreanalysis-passes.md](references\u002Fpreanalysis-passes.md) for\npre-analysis pass documentation.\n\nUse `trailmark-finding-triage` when the user has one concrete candidate\nfinding, SARIF result, weAudit annotation, suspicious function, or report\nexcerpt and needs a handoff-ready reachability and blast-radius evidence packet.\n\nUse `trailmark-variant-neighborhood` after one seed issue is known and the user\nneeds graph-derived variant candidates for `variant-analysis`, Semgrep, CodeQL,\nor manual review.\n",{"data":36,"body":37},{"name":4,"description":6},{"type":38,"children":39},"root",[40,48,54,61,116,122,154,160,349,353,359,378,417,427,433,452,515,544,606,809,834,890,945,1073,1094,1126,1132,1538,1545,2105,2111,2134,2178,2183,2195,2201,2206,2241,2246,2338,2568,2574,2586,2681,2725,2730,2736,2874,2918,2994,3034,3040,3142,3148,3156,3162,3180,3186,3211,3234,3250,3287,3303,3320,3344,3350,3362,3372,3385,3405],{"type":41,"tag":42,"props":43,"children":44},"element","h1",{"id":4},[45],{"type":46,"value":47},"text","Trailmark",{"type":41,"tag":49,"props":50,"children":51},"p",{},[52],{"type":46,"value":53},"Parses source code into a directed graph of functions, classes, calls, and\nsemantic metadata for security analysis.",{"type":41,"tag":55,"props":56,"children":58},"h2",{"id":57},"when-to-use",[59],{"type":46,"value":60},"When to Use",{"type":41,"tag":62,"props":63,"children":64},"ul",{},[65,71,76,81,86,91,96,101,106,111],{"type":41,"tag":66,"props":67,"children":68},"li",{},[69],{"type":46,"value":70},"Mapping call paths from user input to sensitive functions",{"type":41,"tag":66,"props":72,"children":73},{},[74],{"type":46,"value":75},"Finding complexity hotspots for audit prioritization",{"type":41,"tag":66,"props":77,"children":78},{},[79],{"type":46,"value":80},"Identifying attack surface and entrypoints",{"type":41,"tag":66,"props":82,"children":83},{},[84],{"type":46,"value":85},"Understanding call relationships in unfamiliar codebases",{"type":41,"tag":66,"props":87,"children":88},{},[89],{"type":46,"value":90},"Security review or audit preparation across polyglot projects",{"type":41,"tag":66,"props":92,"children":93},{},[94],{"type":46,"value":95},"Adding LLM-inferred annotations (assumptions, preconditions) to code units",{"type":41,"tag":66,"props":97,"children":98},{},[99],{"type":46,"value":100},"Importing external binary-analysis graphs to connect source and binary views",{"type":41,"tag":66,"props":102,"children":103},{},[104],{"type":46,"value":105},"Querying transitive slices, entrypoint paths, subgraph edges, or type references",{"type":41,"tag":66,"props":107,"children":108},{},[109],{"type":46,"value":110},"Producing graph evidence for one suspicious function or candidate finding",{"type":41,"tag":66,"props":112,"children":113},{},[114],{"type":46,"value":115},"Pre-analysis before mutation testing (genotoxic skill) or diagramming",{"type":41,"tag":55,"props":117,"children":119},{"id":118},"when-not-to-use",[120],{"type":46,"value":121},"When NOT to Use",{"type":41,"tag":62,"props":123,"children":124},{},[125,130,144,149],{"type":41,"tag":66,"props":126,"children":127},{},[128],{"type":46,"value":129},"Single-file scripts where call graph adds no value (read the file directly)",{"type":41,"tag":66,"props":131,"children":132},{},[133,135,142],{"type":46,"value":134},"Architecture diagrams not derived from code (use the ",{"type":41,"tag":136,"props":137,"children":139},"code",{"className":138},[],[140],{"type":46,"value":141},"diagramming-code",{"type":46,"value":143}," skill or draw by hand)",{"type":41,"tag":66,"props":145,"children":146},{},[147],{"type":46,"value":148},"Mutation testing triage (use the genotoxic skill, which calls trailmark internally)",{"type":41,"tag":66,"props":150,"children":151},{},[152],{"type":46,"value":153},"Runtime behavior analysis (trailmark is static, not dynamic)",{"type":41,"tag":55,"props":155,"children":157},{"id":156},"rationalizations-to-reject",[158],{"type":46,"value":159},"Rationalizations to Reject",{"type":41,"tag":161,"props":162,"children":163},"table",{},[164,188],{"type":41,"tag":165,"props":166,"children":167},"thead",{},[168],{"type":41,"tag":169,"props":170,"children":171},"tr",{},[172,178,183],{"type":41,"tag":173,"props":174,"children":175},"th",{},[176],{"type":46,"value":177},"Rationalization",{"type":41,"tag":173,"props":179,"children":180},{},[181],{"type":46,"value":182},"Why It's Wrong",{"type":41,"tag":173,"props":184,"children":185},{},[186],{"type":46,"value":187},"Required Action",{"type":41,"tag":189,"props":190,"children":191},"tbody",{},[192,211,243,261,287,313,331],{"type":41,"tag":169,"props":193,"children":194},{},[195,201,206],{"type":41,"tag":196,"props":197,"children":198},"td",{},[199],{"type":46,"value":200},"\"I'll just read the source files manually\"",{"type":41,"tag":196,"props":202,"children":203},{},[204],{"type":46,"value":205},"Manual reading misses call paths, blast radius, and taint data",{"type":41,"tag":196,"props":207,"children":208},{},[209],{"type":46,"value":210},"Install trailmark and use the API",{"type":41,"tag":169,"props":212,"children":213},{},[214,219,230],{"type":41,"tag":196,"props":215,"children":216},{},[217],{"type":46,"value":218},"\"Pre-analysis isn't needed for a quick query\"",{"type":41,"tag":196,"props":220,"children":221},{},[222,224],{"type":46,"value":223},"Blast radius, taint, and privilege data are only available after ",{"type":41,"tag":136,"props":225,"children":227},{"className":226},[],[228],{"type":46,"value":229},"preanalysis()",{"type":41,"tag":196,"props":231,"children":232},{},[233,235,241],{"type":46,"value":234},"Always run ",{"type":41,"tag":136,"props":236,"children":238},{"className":237},[],[239],{"type":46,"value":240},"engine.preanalysis()",{"type":46,"value":242}," before handing off to other skills",{"type":41,"tag":169,"props":244,"children":245},{},[246,251,256],{"type":41,"tag":196,"props":247,"children":248},{},[249],{"type":46,"value":250},"\"The graph is too large, I'll sample\"",{"type":41,"tag":196,"props":252,"children":253},{},[254],{"type":46,"value":255},"Sampling misses cross-module attack paths",{"type":41,"tag":196,"props":257,"children":258},{},[259],{"type":46,"value":260},"Build the full graph; use subgraph queries to focus",{"type":41,"tag":169,"props":262,"children":263},{},[264,269,274],{"type":41,"tag":196,"props":265,"children":266},{},[267],{"type":46,"value":268},"\"Uncertain edges don't matter\"",{"type":41,"tag":196,"props":270,"children":271},{},[272],{"type":46,"value":273},"Dynamic dispatch is where type confusion bugs hide",{"type":41,"tag":196,"props":275,"children":276},{},[277,279,285],{"type":46,"value":278},"Account for ",{"type":41,"tag":136,"props":280,"children":282},{"className":281},[],[283],{"type":46,"value":284},"uncertain",{"type":46,"value":286}," edges in security claims",{"type":41,"tag":169,"props":288,"children":289},{},[290,295,300],{"type":41,"tag":196,"props":291,"children":292},{},[293],{"type":46,"value":294},"\"Single-language analysis is enough\"",{"type":41,"tag":196,"props":296,"children":297},{},[298],{"type":46,"value":299},"Polyglot repos have FFI boundaries where bugs cluster",{"type":41,"tag":196,"props":301,"children":302},{},[303,305,311],{"type":46,"value":304},"Use the correct ",{"type":41,"tag":136,"props":306,"children":308},{"className":307},[],[309],{"type":46,"value":310},"--language",{"type":46,"value":312}," flag per component",{"type":41,"tag":169,"props":314,"children":315},{},[316,321,326],{"type":41,"tag":196,"props":317,"children":318},{},[319],{"type":46,"value":320},"\"Complexity hotspots are the only thing worth checking\"",{"type":41,"tag":196,"props":322,"children":323},{},[324],{"type":46,"value":325},"Low-complexity functions on tainted paths are high-value targets",{"type":41,"tag":196,"props":327,"children":328},{},[329],{"type":46,"value":330},"Combine complexity with taint and blast radius data",{"type":41,"tag":169,"props":332,"children":333},{},[334,339,344],{"type":41,"tag":196,"props":335,"children":336},{},[337],{"type":46,"value":338},"\"The docs mention a version-gated method, so I can call it anywhere\"",{"type":41,"tag":196,"props":340,"children":341},{},[342],{"type":46,"value":343},"Many environments still have Trailmark 0.2.x installed",{"type":41,"tag":196,"props":345,"children":346},{},[347],{"type":46,"value":348},"Check the installed version or probe feature availability before using v0.4+\u002Fv0.5+ features",{"type":41,"tag":350,"props":351,"children":352},"hr",{},[],{"type":41,"tag":55,"props":354,"children":356},{"id":355},"installation",[357],{"type":46,"value":358},"Installation",{"type":41,"tag":49,"props":360,"children":361},{},[362,368,370,376],{"type":41,"tag":363,"props":364,"children":365},"strong",{},[366],{"type":46,"value":367},"MANDATORY:",{"type":46,"value":369}," If ",{"type":41,"tag":136,"props":371,"children":373},{"className":372},[],[374],{"type":46,"value":375},"uv run trailmark",{"type":46,"value":377}," fails (command not found, import error,\nModuleNotFoundError), install trailmark before doing anything else:",{"type":41,"tag":379,"props":380,"children":385},"pre",{"className":381,"code":382,"language":383,"meta":384,"style":384},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","uv pip install trailmark\n","bash","",[386],{"type":41,"tag":136,"props":387,"children":388},{"__ignoreMap":384},[389],{"type":41,"tag":390,"props":391,"children":394},"span",{"class":392,"line":393},"line",1,[395,401,407,412],{"type":41,"tag":390,"props":396,"children":398},{"style":397},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[399],{"type":46,"value":400},"uv",{"type":41,"tag":390,"props":402,"children":404},{"style":403},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[405],{"type":46,"value":406}," pip",{"type":41,"tag":390,"props":408,"children":409},{"style":403},[410],{"type":46,"value":411}," install",{"type":41,"tag":390,"props":413,"children":414},{"style":403},[415],{"type":46,"value":416}," trailmark\n",{"type":41,"tag":49,"props":418,"children":419},{},[420,425],{"type":41,"tag":363,"props":421,"children":422},{},[423],{"type":46,"value":424},"DO NOT",{"type":46,"value":426}," fall back to \"manual verification\", \"manual analysis\", or reading\nsource files by hand as a substitute for running trailmark. The tool must be\ninstalled and used programmatically. If installation fails, report the error\nto the user instead of silently switching to manual code reading.",{"type":41,"tag":55,"props":428,"children":430},{"id":429},"version-gate",[431],{"type":46,"value":432},"Version Gate",{"type":41,"tag":49,"props":434,"children":435},{},[436,438,443,445,450],{"type":46,"value":437},"Trailmark 0.4.0 expands the graph model and query surface, and 0.5.0 adds a\nSQL parser, repository-link configuration, and richer entrypoint metadata.\nBefore using a feature listed as ",{"type":41,"tag":363,"props":439,"children":440},{},[441],{"type":46,"value":442},"v0.4+",{"type":46,"value":444}," or ",{"type":41,"tag":363,"props":446,"children":447},{},[448],{"type":46,"value":449},"v0.5+",{"type":46,"value":451},", check the installed\nversion:",{"type":41,"tag":379,"props":453,"children":455},{"className":381,"code":454,"language":383,"meta":384,"style":384},"trailmark --version 2>\u002Fdev\u002Fnull || uv run trailmark --version 2>\u002Fdev\u002Fnull\n",[456],{"type":41,"tag":136,"props":457,"children":458},{"__ignoreMap":384},[459],{"type":41,"tag":390,"props":460,"children":461},{"class":392,"line":393},[462,466,471,477,482,487,492,497,502,506,510],{"type":41,"tag":390,"props":463,"children":464},{"style":397},[465],{"type":46,"value":4},{"type":41,"tag":390,"props":467,"children":468},{"style":403},[469],{"type":46,"value":470}," --version",{"type":41,"tag":390,"props":472,"children":474},{"style":473},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[475],{"type":46,"value":476}," 2>",{"type":41,"tag":390,"props":478,"children":479},{"style":403},[480],{"type":46,"value":481},"\u002Fdev\u002Fnull",{"type":41,"tag":390,"props":483,"children":484},{"style":473},[485],{"type":46,"value":486}," ||",{"type":41,"tag":390,"props":488,"children":489},{"style":397},[490],{"type":46,"value":491}," uv",{"type":41,"tag":390,"props":493,"children":494},{"style":403},[495],{"type":46,"value":496}," run",{"type":41,"tag":390,"props":498,"children":499},{"style":403},[500],{"type":46,"value":501}," trailmark",{"type":41,"tag":390,"props":503,"children":504},{"style":403},[505],{"type":46,"value":470},{"type":41,"tag":390,"props":507,"children":508},{"style":473},[509],{"type":46,"value":476},{"type":41,"tag":390,"props":511,"children":512},{"style":403},[513],{"type":46,"value":514},"\u002Fdev\u002Fnull\n",{"type":41,"tag":49,"props":516,"children":517},{},[518,520,526,528,534,536,542],{"type":46,"value":519},"Compare the reported version numerically (not lexically). ",{"type":41,"tag":136,"props":521,"children":523},{"className":522},[],[524],{"type":46,"value":525},"0.4.0",{"type":46,"value":527}," or newer\nmeans the full v0.4 surface is available. The version command itself was added\nin 0.2.2, so a failure means either a pre-0.2.2 install or trailmark missing\nentirely — distinguish with ",{"type":41,"tag":136,"props":529,"children":531},{"className":530},[],[532],{"type":46,"value":533},"trailmark analyze --help",{"type":46,"value":535},". When working\nprogrammatically, probe with ",{"type":41,"tag":136,"props":537,"children":539},{"className":538},[],[540],{"type":46,"value":541},"hasattr()",{"type":46,"value":543}," and fall back instead of assuming a\nv0.4-only method exists:",{"type":41,"tag":379,"props":545,"children":549},{"className":546,"code":547,"language":548,"meta":384,"style":384},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","if hasattr(engine, \"subgraph_edges\"):\n    edges = engine.subgraph_edges(\"tainted\")\nelse:\n    # v0.2 fallback: filter engine.to_json() edges whose endpoints\n    # are both in engine.subgraph(\"tainted\")\n    edges = []\n","python",[550],{"type":41,"tag":136,"props":551,"children":552},{"__ignoreMap":384},[553,561,570,579,588,597],{"type":41,"tag":390,"props":554,"children":555},{"class":392,"line":393},[556],{"type":41,"tag":390,"props":557,"children":558},{},[559],{"type":46,"value":560},"if hasattr(engine, \"subgraph_edges\"):\n",{"type":41,"tag":390,"props":562,"children":564},{"class":392,"line":563},2,[565],{"type":41,"tag":390,"props":566,"children":567},{},[568],{"type":46,"value":569},"    edges = engine.subgraph_edges(\"tainted\")\n",{"type":41,"tag":390,"props":571,"children":573},{"class":392,"line":572},3,[574],{"type":41,"tag":390,"props":575,"children":576},{},[577],{"type":46,"value":578},"else:\n",{"type":41,"tag":390,"props":580,"children":582},{"class":392,"line":581},4,[583],{"type":41,"tag":390,"props":584,"children":585},{},[586],{"type":46,"value":587},"    # v0.2 fallback: filter engine.to_json() edges whose endpoints\n",{"type":41,"tag":390,"props":589,"children":591},{"class":392,"line":590},5,[592],{"type":41,"tag":390,"props":593,"children":594},{},[595],{"type":46,"value":596},"    # are both in engine.subgraph(\"tainted\")\n",{"type":41,"tag":390,"props":598,"children":600},{"class":392,"line":599},6,[601],{"type":41,"tag":390,"props":602,"children":603},{},[604],{"type":46,"value":605},"    edges = []\n",{"type":41,"tag":49,"props":607,"children":608},{},[609,614,616,622,624,630,631,637,638,644,646,652,654,660,661,667,669,675,676,682,683,689,690,696,697,703,704,710,711,717,718,724,725,731,732,737,738,744,745,751,752,758,759,765,766,772,773,779,780,786,787,793,794,800,801,807],{"type":41,"tag":363,"props":610,"children":611},{},[612],{"type":46,"value":613},"v0.2-safe baseline:",{"type":46,"value":615}," CLI ",{"type":41,"tag":136,"props":617,"children":619},{"className":618},[],[620],{"type":46,"value":621},"analyze",{"type":46,"value":623},", ",{"type":41,"tag":136,"props":625,"children":627},{"className":626},[],[628],{"type":46,"value":629},"diff",{"type":46,"value":623},{"type":41,"tag":136,"props":632,"children":634},{"className":633},[],[635],{"type":46,"value":636},"entrypoints",{"type":46,"value":623},{"type":41,"tag":136,"props":639,"children":641},{"className":640},[],[642],{"type":46,"value":643},"augment",{"type":46,"value":645},", and\n",{"type":41,"tag":136,"props":647,"children":649},{"className":648},[],[650],{"type":46,"value":651},"--language auto",{"type":46,"value":653},"; ",{"type":41,"tag":136,"props":655,"children":657},{"className":656},[],[658],{"type":46,"value":659},"QueryEngine.from_directory()",{"type":46,"value":623},{"type":41,"tag":136,"props":662,"children":664},{"className":663},[],[665],{"type":46,"value":666},"callers_of()",{"type":46,"value":668},",\n",{"type":41,"tag":136,"props":670,"children":672},{"className":671},[],[673],{"type":46,"value":674},"callees_of()",{"type":46,"value":623},{"type":41,"tag":136,"props":677,"children":679},{"className":678},[],[680],{"type":46,"value":681},"paths_between()",{"type":46,"value":623},{"type":41,"tag":136,"props":684,"children":686},{"className":685},[],[687],{"type":46,"value":688},"ancestors_of()",{"type":46,"value":623},{"type":41,"tag":136,"props":691,"children":693},{"className":692},[],[694],{"type":46,"value":695},"reachable_from()",{"type":46,"value":668},{"type":41,"tag":136,"props":698,"children":700},{"className":699},[],[701],{"type":46,"value":702},"entrypoint_paths_to()",{"type":46,"value":623},{"type":41,"tag":136,"props":705,"children":707},{"className":706},[],[708],{"type":46,"value":709},"complexity_hotspots()",{"type":46,"value":623},{"type":41,"tag":136,"props":712,"children":714},{"className":713},[],[715],{"type":46,"value":716},"attack_surface()",{"type":46,"value":668},{"type":41,"tag":136,"props":719,"children":721},{"className":720},[],[722],{"type":46,"value":723},"summary()",{"type":46,"value":623},{"type":41,"tag":136,"props":726,"children":728},{"className":727},[],[729],{"type":46,"value":730},"to_json()",{"type":46,"value":623},{"type":41,"tag":136,"props":733,"children":735},{"className":734},[],[736],{"type":46,"value":229},{"type":46,"value":623},{"type":41,"tag":136,"props":739,"children":741},{"className":740},[],[742],{"type":46,"value":743},"annotate()",{"type":46,"value":623},{"type":41,"tag":136,"props":746,"children":748},{"className":747},[],[749],{"type":46,"value":750},"annotations_of()",{"type":46,"value":668},{"type":41,"tag":136,"props":753,"children":755},{"className":754},[],[756],{"type":46,"value":757},"nodes_with_annotation()",{"type":46,"value":623},{"type":41,"tag":136,"props":760,"children":762},{"className":761},[],[763],{"type":46,"value":764},"clear_annotations()",{"type":46,"value":623},{"type":41,"tag":136,"props":767,"children":769},{"className":768},[],[770],{"type":46,"value":771},"findings()",{"type":46,"value":623},{"type":41,"tag":136,"props":774,"children":776},{"className":775},[],[777],{"type":46,"value":778},"subgraph()",{"type":46,"value":668},{"type":41,"tag":136,"props":781,"children":783},{"className":782},[],[784],{"type":46,"value":785},"subgraph_names()",{"type":46,"value":623},{"type":41,"tag":136,"props":788,"children":790},{"className":789},[],[791],{"type":46,"value":792},"diff_against()",{"type":46,"value":623},{"type":41,"tag":136,"props":795,"children":797},{"className":796},[],[798],{"type":46,"value":799},"augment_sarif()",{"type":46,"value":645},{"type":41,"tag":136,"props":802,"children":804},{"className":803},[],[805],{"type":46,"value":806},"augment_weaudit()",{"type":46,"value":808},".",{"type":41,"tag":49,"props":810,"children":811},{},[812,817,818,824,826,832],{"type":41,"tag":363,"props":813,"children":814},{},[815],{"type":46,"value":816},"Added in 0.2.2:",{"type":46,"value":615},{"type":41,"tag":136,"props":819,"children":821},{"className":820},[],[822],{"type":46,"value":823},"--version",{"type":46,"value":825}," flag and ",{"type":41,"tag":136,"props":827,"children":829},{"className":828},[],[830],{"type":46,"value":831},"version",{"type":46,"value":833}," subcommand.",{"type":41,"tag":49,"props":835,"children":836},{},[837,842,844,850,852,858,860,866,868,873,875,881,883,888],{"type":41,"tag":363,"props":838,"children":839},{},[840],{"type":46,"value":841},"Added in 0.3.x:",{"type":46,"value":843}," the ",{"type":41,"tag":136,"props":845,"children":847},{"className":846},[],[848],{"type":46,"value":849},"trailmark.parse",{"type":46,"value":851}," module with module-level\n",{"type":41,"tag":136,"props":853,"children":855},{"className":854},[],[856],{"type":46,"value":857},"detect_languages()",{"type":46,"value":859}," and ",{"type":41,"tag":136,"props":861,"children":863},{"className":862},[],[864],{"type":46,"value":865},"supported_languages()",{"type":46,"value":867},". ",{"type":41,"tag":136,"props":869,"children":871},{"className":870},[],[872],{"type":46,"value":857},{"type":46,"value":874}," itself\nis v0.2-safe via ",{"type":41,"tag":136,"props":876,"children":878},{"className":877},[],[879],{"type":46,"value":880},"from trailmark.query.api import detect_languages",{"type":46,"value":882}," (kept as a\ndeprecated alias in 0.3+); ",{"type":41,"tag":136,"props":884,"children":886},{"className":885},[],[887],{"type":46,"value":865},{"type":46,"value":889}," has no 0.2.x equivalent.",{"type":41,"tag":49,"props":891,"children":892},{},[893,898,900,906,908,914,915,921,922,928,930,936,938,944],{"type":41,"tag":363,"props":894,"children":895},{},[896],{"type":46,"value":897},"v0.4+ features:",{"type":46,"value":899}," native ",{"type":41,"tag":136,"props":901,"children":903},{"className":902},[],[904],{"type":46,"value":905},"diagram",{"type":46,"value":907}," subcommand; expanded parser coverage;\nproxy nodes for unresolved calls; node origins; binary graph augmentation via\n",{"type":41,"tag":136,"props":909,"children":911},{"className":910},[],[912],{"type":46,"value":913},"augment_binary()",{"type":46,"value":653},{"type":41,"tag":136,"props":916,"children":918},{"className":917},[],[919],{"type":46,"value":920},"connect_subgraphs()",{"type":46,"value":653},{"type":41,"tag":136,"props":923,"children":925},{"className":924},[],[926],{"type":46,"value":927},"subgraph_edges()",{"type":46,"value":929},";\n",{"type":41,"tag":136,"props":931,"children":933},{"className":932},[],[934],{"type":46,"value":935},"generic_parameters()",{"type":46,"value":937},"; and ",{"type":41,"tag":136,"props":939,"children":941},{"className":940},[],[942],{"type":46,"value":943},"type_references()",{"type":46,"value":808},{"type":41,"tag":49,"props":946,"children":947},{},[948,953,955,961,963,969,970,975,976,982,983,989,990,996,998,1004,1006,1012,1014,1020,1021,1027,1028,1034,1035,1041,1042,1048,1050,1055,1057,1063,1065,1071],{"type":41,"tag":363,"props":949,"children":950},{},[951],{"type":46,"value":952},"v0.5+ features:",{"type":46,"value":954}," ",{"type":41,"tag":136,"props":956,"children":958},{"className":957},[],[959],{"type":46,"value":960},"sql",{"type":46,"value":962}," parser (PostgreSQL-oriented schemas, tables, views,\nfunctions, procedures, dependencies); node kinds ",{"type":41,"tag":136,"props":964,"children":966},{"className":965},[],[967],{"type":46,"value":968},"schema",{"type":46,"value":623},{"type":41,"tag":136,"props":971,"children":973},{"className":972},[],[974],{"type":46,"value":161},{"type":46,"value":623},{"type":41,"tag":136,"props":977,"children":979},{"className":978},[],[980],{"type":46,"value":981},"view",{"type":46,"value":668},{"type":41,"tag":136,"props":984,"children":986},{"className":985},[],[987],{"type":46,"value":988},"procedure",{"type":46,"value":653},{"type":41,"tag":136,"props":991,"children":993},{"className":992},[],[994],{"type":46,"value":995},".trailmark\u002Flinks.toml",{"type":46,"value":997}," repository-link configuration (see\nRepository Links below), including ",{"type":41,"tag":136,"props":999,"children":1001},{"className":1000},[],[1002],{"type":46,"value":1003},"proxy.external:\u003Csymbol>",{"type":46,"value":1005}," nodes for\ndeclared external endpoints; repository links, unresolved-call proxies, and\n",{"type":41,"tag":136,"props":1007,"children":1009},{"className":1008},[],[1010],{"type":46,"value":1011},"type_uses",{"type":46,"value":1013}," edges now materialize for single-language directory parses (0.4\nemitted them only for polyglot parses); Solidity entrypoints detected from\nparser metadata (interfaces excluded; ",{"type":41,"tag":136,"props":1015,"children":1017},{"className":1016},[],[1018],{"type":46,"value":1019},"solidity_visibility",{"type":46,"value":668},{"type":41,"tag":136,"props":1022,"children":1024},{"className":1023},[],[1025],{"type":46,"value":1026},"solidity_mutability",{"type":46,"value":623},{"type":41,"tag":136,"props":1029,"children":1031},{"className":1030},[],[1032],{"type":46,"value":1033},"solidity_override",{"type":46,"value":623},{"type":41,"tag":136,"props":1036,"children":1038},{"className":1037},[],[1039],{"type":46,"value":1040},"solidity_container_kind",{"type":46,"value":645},{"type":41,"tag":136,"props":1043,"children":1045},{"className":1044},[],[1046],{"type":46,"value":1047},"solidity_overridden_by",{"type":46,"value":1049}," node attributes); ",{"type":41,"tag":136,"props":1051,"children":1053},{"className":1052},[],[1054],{"type":46,"value":716},{"type":46,"value":1056}," entries carry an\n",{"type":41,"tag":136,"props":1058,"children":1060},{"className":1059},[],[1061],{"type":46,"value":1062},"attributes",{"type":46,"value":1064}," key when the node has attributes; TypeScript resolves receivers\nassigned with ",{"type":41,"tag":136,"props":1066,"children":1068},{"className":1067},[],[1069],{"type":46,"value":1070},"new ConcreteClass()",{"type":46,"value":1072},"; C# file-scoped namespaces.",{"type":41,"tag":49,"props":1074,"children":1075},{},[1076,1078,1084,1086,1092],{"type":46,"value":1077},"v0.5.0 adds no new ",{"type":41,"tag":136,"props":1079,"children":1081},{"className":1080},[],[1082],{"type":46,"value":1083},"QueryEngine",{"type":46,"value":1085}," methods, so ",{"type":41,"tag":136,"props":1087,"children":1089},{"className":1088},[],[1090],{"type":46,"value":1091},"hasattr(engine, ...)",{"type":46,"value":1093}," cannot\ndetect it. Gate v0.5 features on the reported version, or probe structurally:",{"type":41,"tag":379,"props":1095,"children":1097},{"className":546,"code":1096,"language":548,"meta":384,"style":384},"from trailmark.models.nodes import NodeKind\n\nhas_v05 = \"SCHEMA\" in NodeKind.__members__  # sql kinds are 0.5+\n",[1098],{"type":41,"tag":136,"props":1099,"children":1100},{"__ignoreMap":384},[1101,1109,1118],{"type":41,"tag":390,"props":1102,"children":1103},{"class":392,"line":393},[1104],{"type":41,"tag":390,"props":1105,"children":1106},{},[1107],{"type":46,"value":1108},"from trailmark.models.nodes import NodeKind\n",{"type":41,"tag":390,"props":1110,"children":1111},{"class":392,"line":563},[1112],{"type":41,"tag":390,"props":1113,"children":1115},{"emptyLinePlaceholder":1114},true,[1116],{"type":46,"value":1117},"\n",{"type":41,"tag":390,"props":1119,"children":1120},{"class":392,"line":572},[1121],{"type":41,"tag":390,"props":1122,"children":1123},{},[1124],{"type":46,"value":1125},"has_v05 = \"SCHEMA\" in NodeKind.__members__  # sql kinds are 0.5+\n",{"type":41,"tag":55,"props":1127,"children":1129},{"id":1128},"quick-start",[1130],{"type":46,"value":1131},"Quick Start",{"type":41,"tag":379,"props":1133,"children":1135},{"className":381,"code":1134,"language":383,"meta":384,"style":384},"# Auto-detect and merge every supported language under the tree\nuv run trailmark analyze --language auto --summary {targetDir}\n\n# Explicit languages (single language or comma-separated list)\nuv run trailmark analyze --language rust {targetDir}\nuv run trailmark analyze --language python,rust {targetDir}\n\n# Complexity hotspots\nuv run trailmark analyze --language auto --complexity 10 {targetDir}\n\n# Entrypoint inventory and structural diff (v0.2-safe)\nuv run trailmark entrypoints --language auto {targetDir}\nuv run trailmark diff --repo {repoDir} main HEAD --json\n\n# Version report (0.2.2+)\nuv run trailmark --version\n\n# v0.4+: native diagram command\nuv run trailmark diagram -t {targetDir} -T call-graph -f main --depth 2\n",[1136],{"type":41,"tag":136,"props":1137,"children":1138},{"__ignoreMap":384},[1139,1148,1188,1195,1203,1235,1267,1275,1284,1327,1335,1344,1377,1423,1431,1440,1461,1469,1478],{"type":41,"tag":390,"props":1140,"children":1141},{"class":392,"line":393},[1142],{"type":41,"tag":390,"props":1143,"children":1145},{"style":1144},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[1146],{"type":46,"value":1147},"# Auto-detect and merge every supported language under the tree\n",{"type":41,"tag":390,"props":1149,"children":1150},{"class":392,"line":563},[1151,1155,1159,1163,1168,1173,1178,1183],{"type":41,"tag":390,"props":1152,"children":1153},{"style":397},[1154],{"type":46,"value":400},{"type":41,"tag":390,"props":1156,"children":1157},{"style":403},[1158],{"type":46,"value":496},{"type":41,"tag":390,"props":1160,"children":1161},{"style":403},[1162],{"type":46,"value":501},{"type":41,"tag":390,"props":1164,"children":1165},{"style":403},[1166],{"type":46,"value":1167}," analyze",{"type":41,"tag":390,"props":1169,"children":1170},{"style":403},[1171],{"type":46,"value":1172}," --language",{"type":41,"tag":390,"props":1174,"children":1175},{"style":403},[1176],{"type":46,"value":1177}," auto",{"type":41,"tag":390,"props":1179,"children":1180},{"style":403},[1181],{"type":46,"value":1182}," --summary",{"type":41,"tag":390,"props":1184,"children":1185},{"style":403},[1186],{"type":46,"value":1187}," {targetDir}\n",{"type":41,"tag":390,"props":1189,"children":1190},{"class":392,"line":572},[1191],{"type":41,"tag":390,"props":1192,"children":1193},{"emptyLinePlaceholder":1114},[1194],{"type":46,"value":1117},{"type":41,"tag":390,"props":1196,"children":1197},{"class":392,"line":581},[1198],{"type":41,"tag":390,"props":1199,"children":1200},{"style":1144},[1201],{"type":46,"value":1202},"# Explicit languages (single language or comma-separated list)\n",{"type":41,"tag":390,"props":1204,"children":1205},{"class":392,"line":590},[1206,1210,1214,1218,1222,1226,1231],{"type":41,"tag":390,"props":1207,"children":1208},{"style":397},[1209],{"type":46,"value":400},{"type":41,"tag":390,"props":1211,"children":1212},{"style":403},[1213],{"type":46,"value":496},{"type":41,"tag":390,"props":1215,"children":1216},{"style":403},[1217],{"type":46,"value":501},{"type":41,"tag":390,"props":1219,"children":1220},{"style":403},[1221],{"type":46,"value":1167},{"type":41,"tag":390,"props":1223,"children":1224},{"style":403},[1225],{"type":46,"value":1172},{"type":41,"tag":390,"props":1227,"children":1228},{"style":403},[1229],{"type":46,"value":1230}," rust",{"type":41,"tag":390,"props":1232,"children":1233},{"style":403},[1234],{"type":46,"value":1187},{"type":41,"tag":390,"props":1236,"children":1237},{"class":392,"line":599},[1238,1242,1246,1250,1254,1258,1263],{"type":41,"tag":390,"props":1239,"children":1240},{"style":397},[1241],{"type":46,"value":400},{"type":41,"tag":390,"props":1243,"children":1244},{"style":403},[1245],{"type":46,"value":496},{"type":41,"tag":390,"props":1247,"children":1248},{"style":403},[1249],{"type":46,"value":501},{"type":41,"tag":390,"props":1251,"children":1252},{"style":403},[1253],{"type":46,"value":1167},{"type":41,"tag":390,"props":1255,"children":1256},{"style":403},[1257],{"type":46,"value":1172},{"type":41,"tag":390,"props":1259,"children":1260},{"style":403},[1261],{"type":46,"value":1262}," python,rust",{"type":41,"tag":390,"props":1264,"children":1265},{"style":403},[1266],{"type":46,"value":1187},{"type":41,"tag":390,"props":1268,"children":1270},{"class":392,"line":1269},7,[1271],{"type":41,"tag":390,"props":1272,"children":1273},{"emptyLinePlaceholder":1114},[1274],{"type":46,"value":1117},{"type":41,"tag":390,"props":1276,"children":1278},{"class":392,"line":1277},8,[1279],{"type":41,"tag":390,"props":1280,"children":1281},{"style":1144},[1282],{"type":46,"value":1283},"# Complexity hotspots\n",{"type":41,"tag":390,"props":1285,"children":1287},{"class":392,"line":1286},9,[1288,1292,1296,1300,1304,1308,1312,1317,1323],{"type":41,"tag":390,"props":1289,"children":1290},{"style":397},[1291],{"type":46,"value":400},{"type":41,"tag":390,"props":1293,"children":1294},{"style":403},[1295],{"type":46,"value":496},{"type":41,"tag":390,"props":1297,"children":1298},{"style":403},[1299],{"type":46,"value":501},{"type":41,"tag":390,"props":1301,"children":1302},{"style":403},[1303],{"type":46,"value":1167},{"type":41,"tag":390,"props":1305,"children":1306},{"style":403},[1307],{"type":46,"value":1172},{"type":41,"tag":390,"props":1309,"children":1310},{"style":403},[1311],{"type":46,"value":1177},{"type":41,"tag":390,"props":1313,"children":1314},{"style":403},[1315],{"type":46,"value":1316}," --complexity",{"type":41,"tag":390,"props":1318,"children":1320},{"style":1319},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[1321],{"type":46,"value":1322}," 10",{"type":41,"tag":390,"props":1324,"children":1325},{"style":403},[1326],{"type":46,"value":1187},{"type":41,"tag":390,"props":1328,"children":1330},{"class":392,"line":1329},10,[1331],{"type":41,"tag":390,"props":1332,"children":1333},{"emptyLinePlaceholder":1114},[1334],{"type":46,"value":1117},{"type":41,"tag":390,"props":1336,"children":1338},{"class":392,"line":1337},11,[1339],{"type":41,"tag":390,"props":1340,"children":1341},{"style":1144},[1342],{"type":46,"value":1343},"# Entrypoint inventory and structural diff (v0.2-safe)\n",{"type":41,"tag":390,"props":1345,"children":1347},{"class":392,"line":1346},12,[1348,1352,1356,1360,1365,1369,1373],{"type":41,"tag":390,"props":1349,"children":1350},{"style":397},[1351],{"type":46,"value":400},{"type":41,"tag":390,"props":1353,"children":1354},{"style":403},[1355],{"type":46,"value":496},{"type":41,"tag":390,"props":1357,"children":1358},{"style":403},[1359],{"type":46,"value":501},{"type":41,"tag":390,"props":1361,"children":1362},{"style":403},[1363],{"type":46,"value":1364}," entrypoints",{"type":41,"tag":390,"props":1366,"children":1367},{"style":403},[1368],{"type":46,"value":1172},{"type":41,"tag":390,"props":1370,"children":1371},{"style":403},[1372],{"type":46,"value":1177},{"type":41,"tag":390,"props":1374,"children":1375},{"style":403},[1376],{"type":46,"value":1187},{"type":41,"tag":390,"props":1378,"children":1380},{"class":392,"line":1379},13,[1381,1385,1389,1393,1398,1403,1408,1413,1418],{"type":41,"tag":390,"props":1382,"children":1383},{"style":397},[1384],{"type":46,"value":400},{"type":41,"tag":390,"props":1386,"children":1387},{"style":403},[1388],{"type":46,"value":496},{"type":41,"tag":390,"props":1390,"children":1391},{"style":403},[1392],{"type":46,"value":501},{"type":41,"tag":390,"props":1394,"children":1395},{"style":403},[1396],{"type":46,"value":1397}," diff",{"type":41,"tag":390,"props":1399,"children":1400},{"style":403},[1401],{"type":46,"value":1402}," --repo",{"type":41,"tag":390,"props":1404,"children":1405},{"style":403},[1406],{"type":46,"value":1407}," {repoDir}",{"type":41,"tag":390,"props":1409,"children":1410},{"style":403},[1411],{"type":46,"value":1412}," main",{"type":41,"tag":390,"props":1414,"children":1415},{"style":403},[1416],{"type":46,"value":1417}," HEAD",{"type":41,"tag":390,"props":1419,"children":1420},{"style":403},[1421],{"type":46,"value":1422}," --json\n",{"type":41,"tag":390,"props":1424,"children":1426},{"class":392,"line":1425},14,[1427],{"type":41,"tag":390,"props":1428,"children":1429},{"emptyLinePlaceholder":1114},[1430],{"type":46,"value":1117},{"type":41,"tag":390,"props":1432,"children":1434},{"class":392,"line":1433},15,[1435],{"type":41,"tag":390,"props":1436,"children":1437},{"style":1144},[1438],{"type":46,"value":1439},"# Version report (0.2.2+)\n",{"type":41,"tag":390,"props":1441,"children":1443},{"class":392,"line":1442},16,[1444,1448,1452,1456],{"type":41,"tag":390,"props":1445,"children":1446},{"style":397},[1447],{"type":46,"value":400},{"type":41,"tag":390,"props":1449,"children":1450},{"style":403},[1451],{"type":46,"value":496},{"type":41,"tag":390,"props":1453,"children":1454},{"style":403},[1455],{"type":46,"value":501},{"type":41,"tag":390,"props":1457,"children":1458},{"style":403},[1459],{"type":46,"value":1460}," --version\n",{"type":41,"tag":390,"props":1462,"children":1464},{"class":392,"line":1463},17,[1465],{"type":41,"tag":390,"props":1466,"children":1467},{"emptyLinePlaceholder":1114},[1468],{"type":46,"value":1117},{"type":41,"tag":390,"props":1470,"children":1472},{"class":392,"line":1471},18,[1473],{"type":41,"tag":390,"props":1474,"children":1475},{"style":1144},[1476],{"type":46,"value":1477},"# v0.4+: native diagram command\n",{"type":41,"tag":390,"props":1479,"children":1481},{"class":392,"line":1480},19,[1482,1486,1490,1494,1499,1504,1509,1514,1519,1524,1528,1533],{"type":41,"tag":390,"props":1483,"children":1484},{"style":397},[1485],{"type":46,"value":400},{"type":41,"tag":390,"props":1487,"children":1488},{"style":403},[1489],{"type":46,"value":496},{"type":41,"tag":390,"props":1491,"children":1492},{"style":403},[1493],{"type":46,"value":501},{"type":41,"tag":390,"props":1495,"children":1496},{"style":403},[1497],{"type":46,"value":1498}," diagram",{"type":41,"tag":390,"props":1500,"children":1501},{"style":403},[1502],{"type":46,"value":1503}," -t",{"type":41,"tag":390,"props":1505,"children":1506},{"style":403},[1507],{"type":46,"value":1508}," {targetDir}",{"type":41,"tag":390,"props":1510,"children":1511},{"style":403},[1512],{"type":46,"value":1513}," -T",{"type":41,"tag":390,"props":1515,"children":1516},{"style":403},[1517],{"type":46,"value":1518}," call-graph",{"type":41,"tag":390,"props":1520,"children":1521},{"style":403},[1522],{"type":46,"value":1523}," -f",{"type":41,"tag":390,"props":1525,"children":1526},{"style":403},[1527],{"type":46,"value":1412},{"type":41,"tag":390,"props":1529,"children":1530},{"style":403},[1531],{"type":46,"value":1532}," --depth",{"type":41,"tag":390,"props":1534,"children":1535},{"style":1319},[1536],{"type":46,"value":1537}," 2\n",{"type":41,"tag":1539,"props":1540,"children":1542},"h3",{"id":1541},"programmatic-api",[1543],{"type":46,"value":1544},"Programmatic API",{"type":41,"tag":379,"props":1546,"children":1548},{"className":546,"code":1547,"language":548,"meta":384,"style":384},"# trailmark.parse is a 0.3+ module; on 0.2.x import detect_languages from\n# trailmark.query.api instead (supported_languages has no 0.2.x equivalent)\nfrom trailmark.parse import detect_languages, supported_languages\nfrom trailmark.query.api import QueryEngine\n\n# Ask the installed Trailmark build what it supports\nsupported_languages()\ndetect_languages(\"{targetDir}\")\n\n# Prefer auto for unknown or polyglot trees; use explicit lists when needed\nengine = QueryEngine.from_directory(\"{targetDir}\", language=\"auto\")\nengine = QueryEngine.from_directory(\"{targetDir}\", language=\"python,rust\")\n\nengine.callers_of(\"function_name\")\nengine.callees_of(\"function_name\")\nengine.paths_between(\"entry_func\", \"db_query\")\nengine.complexity_hotspots(threshold=10)\nengine.attack_surface()\nengine.summary()\nengine.to_json()\n\n# Transitive slices and entrypoint path queries (v0.2-safe)\nengine.ancestors_of(\"sensitive_sink\")\nengine.reachable_from(\"entry_func\")\nengine.entrypoint_paths_to(\"sensitive_sink\")\n\n# v0.4+: connect named subgraphs\nif hasattr(engine, \"connect_subgraphs\"):\n    engine.connect_subgraphs(\"tainted\", \"privilege_boundary\")\n\n# Run pre-analysis (blast radius, entrypoints, privilege\n# boundaries, taint propagation)\nresult = engine.preanalysis()\n\n# Query subgraphs created by pre-analysis\nengine.subgraph_names()\nengine.subgraph(\"tainted\")\nengine.subgraph(\"high_blast_radius\")\nengine.subgraph(\"privilege_boundary\")\nengine.subgraph(\"entrypoint_reachable\")\nif hasattr(engine, \"subgraph_edges\"):\n    engine.subgraph_edges(\"tainted\")\n\n# Add LLM-inferred annotations\nfrom trailmark.models import AnnotationKind\n\nengine.annotate(\"function_name\", AnnotationKind.ASSUMPTION,\n                \"input is URL-encoded\", source=\"llm\")\n\n# Query annotations (including pre-analysis results)\nengine.annotations_of(\"function_name\")\nengine.annotations_of(\"function_name\",\n                       kind=AnnotationKind.BLAST_RADIUS)\nengine.annotations_of(\"function_name\",\n                       kind=AnnotationKind.TAINT_PROPAGATION)\nengine.nodes_with_annotation(AnnotationKind.FINDING)\nengine.clear_annotations(\"function_name\", kind=AnnotationKind.ASSUMPTION)\n\n# v0.4+: generic\u002Ftype-reference and binary augmentation APIs\nif hasattr(engine, \"generic_parameters\"):\n    engine.generic_parameters(\"GenericTypeOrFunction\")\nif hasattr(engine, \"type_references\"):\n    engine.type_references(\"function_name\")\nif hasattr(engine, \"augment_binary\"):\n    engine.augment_binary(\"binary_graph.json\")\n",[1549],{"type":41,"tag":136,"props":1550,"children":1551},{"__ignoreMap":384},[1552,1560,1568,1576,1584,1591,1599,1607,1615,1622,1630,1638,1646,1653,1661,1669,1677,1685,1693,1701,1710,1718,1727,1736,1745,1754,1762,1771,1780,1789,1797,1806,1815,1824,1832,1841,1850,1859,1868,1877,1886,1894,1903,1911,1920,1929,1937,1946,1955,1963,1972,1981,1990,1999,2007,2016,2025,2034,2042,2051,2060,2069,2078,2087,2096],{"type":41,"tag":390,"props":1553,"children":1554},{"class":392,"line":393},[1555],{"type":41,"tag":390,"props":1556,"children":1557},{},[1558],{"type":46,"value":1559},"# trailmark.parse is a 0.3+ module; on 0.2.x import detect_languages from\n",{"type":41,"tag":390,"props":1561,"children":1562},{"class":392,"line":563},[1563],{"type":41,"tag":390,"props":1564,"children":1565},{},[1566],{"type":46,"value":1567},"# trailmark.query.api instead (supported_languages has no 0.2.x equivalent)\n",{"type":41,"tag":390,"props":1569,"children":1570},{"class":392,"line":572},[1571],{"type":41,"tag":390,"props":1572,"children":1573},{},[1574],{"type":46,"value":1575},"from trailmark.parse import detect_languages, supported_languages\n",{"type":41,"tag":390,"props":1577,"children":1578},{"class":392,"line":581},[1579],{"type":41,"tag":390,"props":1580,"children":1581},{},[1582],{"type":46,"value":1583},"from trailmark.query.api import QueryEngine\n",{"type":41,"tag":390,"props":1585,"children":1586},{"class":392,"line":590},[1587],{"type":41,"tag":390,"props":1588,"children":1589},{"emptyLinePlaceholder":1114},[1590],{"type":46,"value":1117},{"type":41,"tag":390,"props":1592,"children":1593},{"class":392,"line":599},[1594],{"type":41,"tag":390,"props":1595,"children":1596},{},[1597],{"type":46,"value":1598},"# Ask the installed Trailmark build what it supports\n",{"type":41,"tag":390,"props":1600,"children":1601},{"class":392,"line":1269},[1602],{"type":41,"tag":390,"props":1603,"children":1604},{},[1605],{"type":46,"value":1606},"supported_languages()\n",{"type":41,"tag":390,"props":1608,"children":1609},{"class":392,"line":1277},[1610],{"type":41,"tag":390,"props":1611,"children":1612},{},[1613],{"type":46,"value":1614},"detect_languages(\"{targetDir}\")\n",{"type":41,"tag":390,"props":1616,"children":1617},{"class":392,"line":1286},[1618],{"type":41,"tag":390,"props":1619,"children":1620},{"emptyLinePlaceholder":1114},[1621],{"type":46,"value":1117},{"type":41,"tag":390,"props":1623,"children":1624},{"class":392,"line":1329},[1625],{"type":41,"tag":390,"props":1626,"children":1627},{},[1628],{"type":46,"value":1629},"# Prefer auto for unknown or polyglot trees; use explicit lists when needed\n",{"type":41,"tag":390,"props":1631,"children":1632},{"class":392,"line":1337},[1633],{"type":41,"tag":390,"props":1634,"children":1635},{},[1636],{"type":46,"value":1637},"engine = QueryEngine.from_directory(\"{targetDir}\", language=\"auto\")\n",{"type":41,"tag":390,"props":1639,"children":1640},{"class":392,"line":1346},[1641],{"type":41,"tag":390,"props":1642,"children":1643},{},[1644],{"type":46,"value":1645},"engine = QueryEngine.from_directory(\"{targetDir}\", language=\"python,rust\")\n",{"type":41,"tag":390,"props":1647,"children":1648},{"class":392,"line":1379},[1649],{"type":41,"tag":390,"props":1650,"children":1651},{"emptyLinePlaceholder":1114},[1652],{"type":46,"value":1117},{"type":41,"tag":390,"props":1654,"children":1655},{"class":392,"line":1425},[1656],{"type":41,"tag":390,"props":1657,"children":1658},{},[1659],{"type":46,"value":1660},"engine.callers_of(\"function_name\")\n",{"type":41,"tag":390,"props":1662,"children":1663},{"class":392,"line":1433},[1664],{"type":41,"tag":390,"props":1665,"children":1666},{},[1667],{"type":46,"value":1668},"engine.callees_of(\"function_name\")\n",{"type":41,"tag":390,"props":1670,"children":1671},{"class":392,"line":1442},[1672],{"type":41,"tag":390,"props":1673,"children":1674},{},[1675],{"type":46,"value":1676},"engine.paths_between(\"entry_func\", \"db_query\")\n",{"type":41,"tag":390,"props":1678,"children":1679},{"class":392,"line":1463},[1680],{"type":41,"tag":390,"props":1681,"children":1682},{},[1683],{"type":46,"value":1684},"engine.complexity_hotspots(threshold=10)\n",{"type":41,"tag":390,"props":1686,"children":1687},{"class":392,"line":1471},[1688],{"type":41,"tag":390,"props":1689,"children":1690},{},[1691],{"type":46,"value":1692},"engine.attack_surface()\n",{"type":41,"tag":390,"props":1694,"children":1695},{"class":392,"line":1480},[1696],{"type":41,"tag":390,"props":1697,"children":1698},{},[1699],{"type":46,"value":1700},"engine.summary()\n",{"type":41,"tag":390,"props":1702,"children":1704},{"class":392,"line":1703},20,[1705],{"type":41,"tag":390,"props":1706,"children":1707},{},[1708],{"type":46,"value":1709},"engine.to_json()\n",{"type":41,"tag":390,"props":1711,"children":1713},{"class":392,"line":1712},21,[1714],{"type":41,"tag":390,"props":1715,"children":1716},{"emptyLinePlaceholder":1114},[1717],{"type":46,"value":1117},{"type":41,"tag":390,"props":1719,"children":1721},{"class":392,"line":1720},22,[1722],{"type":41,"tag":390,"props":1723,"children":1724},{},[1725],{"type":46,"value":1726},"# Transitive slices and entrypoint path queries (v0.2-safe)\n",{"type":41,"tag":390,"props":1728,"children":1730},{"class":392,"line":1729},23,[1731],{"type":41,"tag":390,"props":1732,"children":1733},{},[1734],{"type":46,"value":1735},"engine.ancestors_of(\"sensitive_sink\")\n",{"type":41,"tag":390,"props":1737,"children":1739},{"class":392,"line":1738},24,[1740],{"type":41,"tag":390,"props":1741,"children":1742},{},[1743],{"type":46,"value":1744},"engine.reachable_from(\"entry_func\")\n",{"type":41,"tag":390,"props":1746,"children":1748},{"class":392,"line":1747},25,[1749],{"type":41,"tag":390,"props":1750,"children":1751},{},[1752],{"type":46,"value":1753},"engine.entrypoint_paths_to(\"sensitive_sink\")\n",{"type":41,"tag":390,"props":1755,"children":1757},{"class":392,"line":1756},26,[1758],{"type":41,"tag":390,"props":1759,"children":1760},{"emptyLinePlaceholder":1114},[1761],{"type":46,"value":1117},{"type":41,"tag":390,"props":1763,"children":1765},{"class":392,"line":1764},27,[1766],{"type":41,"tag":390,"props":1767,"children":1768},{},[1769],{"type":46,"value":1770},"# v0.4+: connect named subgraphs\n",{"type":41,"tag":390,"props":1772,"children":1774},{"class":392,"line":1773},28,[1775],{"type":41,"tag":390,"props":1776,"children":1777},{},[1778],{"type":46,"value":1779},"if hasattr(engine, \"connect_subgraphs\"):\n",{"type":41,"tag":390,"props":1781,"children":1783},{"class":392,"line":1782},29,[1784],{"type":41,"tag":390,"props":1785,"children":1786},{},[1787],{"type":46,"value":1788},"    engine.connect_subgraphs(\"tainted\", \"privilege_boundary\")\n",{"type":41,"tag":390,"props":1790,"children":1792},{"class":392,"line":1791},30,[1793],{"type":41,"tag":390,"props":1794,"children":1795},{"emptyLinePlaceholder":1114},[1796],{"type":46,"value":1117},{"type":41,"tag":390,"props":1798,"children":1800},{"class":392,"line":1799},31,[1801],{"type":41,"tag":390,"props":1802,"children":1803},{},[1804],{"type":46,"value":1805},"# Run pre-analysis (blast radius, entrypoints, privilege\n",{"type":41,"tag":390,"props":1807,"children":1809},{"class":392,"line":1808},32,[1810],{"type":41,"tag":390,"props":1811,"children":1812},{},[1813],{"type":46,"value":1814},"# boundaries, taint propagation)\n",{"type":41,"tag":390,"props":1816,"children":1818},{"class":392,"line":1817},33,[1819],{"type":41,"tag":390,"props":1820,"children":1821},{},[1822],{"type":46,"value":1823},"result = engine.preanalysis()\n",{"type":41,"tag":390,"props":1825,"children":1827},{"class":392,"line":1826},34,[1828],{"type":41,"tag":390,"props":1829,"children":1830},{"emptyLinePlaceholder":1114},[1831],{"type":46,"value":1117},{"type":41,"tag":390,"props":1833,"children":1835},{"class":392,"line":1834},35,[1836],{"type":41,"tag":390,"props":1837,"children":1838},{},[1839],{"type":46,"value":1840},"# Query subgraphs created by pre-analysis\n",{"type":41,"tag":390,"props":1842,"children":1844},{"class":392,"line":1843},36,[1845],{"type":41,"tag":390,"props":1846,"children":1847},{},[1848],{"type":46,"value":1849},"engine.subgraph_names()\n",{"type":41,"tag":390,"props":1851,"children":1853},{"class":392,"line":1852},37,[1854],{"type":41,"tag":390,"props":1855,"children":1856},{},[1857],{"type":46,"value":1858},"engine.subgraph(\"tainted\")\n",{"type":41,"tag":390,"props":1860,"children":1862},{"class":392,"line":1861},38,[1863],{"type":41,"tag":390,"props":1864,"children":1865},{},[1866],{"type":46,"value":1867},"engine.subgraph(\"high_blast_radius\")\n",{"type":41,"tag":390,"props":1869,"children":1871},{"class":392,"line":1870},39,[1872],{"type":41,"tag":390,"props":1873,"children":1874},{},[1875],{"type":46,"value":1876},"engine.subgraph(\"privilege_boundary\")\n",{"type":41,"tag":390,"props":1878,"children":1880},{"class":392,"line":1879},40,[1881],{"type":41,"tag":390,"props":1882,"children":1883},{},[1884],{"type":46,"value":1885},"engine.subgraph(\"entrypoint_reachable\")\n",{"type":41,"tag":390,"props":1887,"children":1889},{"class":392,"line":1888},41,[1890],{"type":41,"tag":390,"props":1891,"children":1892},{},[1893],{"type":46,"value":560},{"type":41,"tag":390,"props":1895,"children":1897},{"class":392,"line":1896},42,[1898],{"type":41,"tag":390,"props":1899,"children":1900},{},[1901],{"type":46,"value":1902},"    engine.subgraph_edges(\"tainted\")\n",{"type":41,"tag":390,"props":1904,"children":1906},{"class":392,"line":1905},43,[1907],{"type":41,"tag":390,"props":1908,"children":1909},{"emptyLinePlaceholder":1114},[1910],{"type":46,"value":1117},{"type":41,"tag":390,"props":1912,"children":1914},{"class":392,"line":1913},44,[1915],{"type":41,"tag":390,"props":1916,"children":1917},{},[1918],{"type":46,"value":1919},"# Add LLM-inferred annotations\n",{"type":41,"tag":390,"props":1921,"children":1923},{"class":392,"line":1922},45,[1924],{"type":41,"tag":390,"props":1925,"children":1926},{},[1927],{"type":46,"value":1928},"from trailmark.models import AnnotationKind\n",{"type":41,"tag":390,"props":1930,"children":1932},{"class":392,"line":1931},46,[1933],{"type":41,"tag":390,"props":1934,"children":1935},{"emptyLinePlaceholder":1114},[1936],{"type":46,"value":1117},{"type":41,"tag":390,"props":1938,"children":1940},{"class":392,"line":1939},47,[1941],{"type":41,"tag":390,"props":1942,"children":1943},{},[1944],{"type":46,"value":1945},"engine.annotate(\"function_name\", AnnotationKind.ASSUMPTION,\n",{"type":41,"tag":390,"props":1947,"children":1949},{"class":392,"line":1948},48,[1950],{"type":41,"tag":390,"props":1951,"children":1952},{},[1953],{"type":46,"value":1954},"                \"input is URL-encoded\", source=\"llm\")\n",{"type":41,"tag":390,"props":1956,"children":1958},{"class":392,"line":1957},49,[1959],{"type":41,"tag":390,"props":1960,"children":1961},{"emptyLinePlaceholder":1114},[1962],{"type":46,"value":1117},{"type":41,"tag":390,"props":1964,"children":1966},{"class":392,"line":1965},50,[1967],{"type":41,"tag":390,"props":1968,"children":1969},{},[1970],{"type":46,"value":1971},"# Query annotations (including pre-analysis results)\n",{"type":41,"tag":390,"props":1973,"children":1975},{"class":392,"line":1974},51,[1976],{"type":41,"tag":390,"props":1977,"children":1978},{},[1979],{"type":46,"value":1980},"engine.annotations_of(\"function_name\")\n",{"type":41,"tag":390,"props":1982,"children":1984},{"class":392,"line":1983},52,[1985],{"type":41,"tag":390,"props":1986,"children":1987},{},[1988],{"type":46,"value":1989},"engine.annotations_of(\"function_name\",\n",{"type":41,"tag":390,"props":1991,"children":1993},{"class":392,"line":1992},53,[1994],{"type":41,"tag":390,"props":1995,"children":1996},{},[1997],{"type":46,"value":1998},"                       kind=AnnotationKind.BLAST_RADIUS)\n",{"type":41,"tag":390,"props":2000,"children":2002},{"class":392,"line":2001},54,[2003],{"type":41,"tag":390,"props":2004,"children":2005},{},[2006],{"type":46,"value":1989},{"type":41,"tag":390,"props":2008,"children":2010},{"class":392,"line":2009},55,[2011],{"type":41,"tag":390,"props":2012,"children":2013},{},[2014],{"type":46,"value":2015},"                       kind=AnnotationKind.TAINT_PROPAGATION)\n",{"type":41,"tag":390,"props":2017,"children":2019},{"class":392,"line":2018},56,[2020],{"type":41,"tag":390,"props":2021,"children":2022},{},[2023],{"type":46,"value":2024},"engine.nodes_with_annotation(AnnotationKind.FINDING)\n",{"type":41,"tag":390,"props":2026,"children":2028},{"class":392,"line":2027},57,[2029],{"type":41,"tag":390,"props":2030,"children":2031},{},[2032],{"type":46,"value":2033},"engine.clear_annotations(\"function_name\", kind=AnnotationKind.ASSUMPTION)\n",{"type":41,"tag":390,"props":2035,"children":2037},{"class":392,"line":2036},58,[2038],{"type":41,"tag":390,"props":2039,"children":2040},{"emptyLinePlaceholder":1114},[2041],{"type":46,"value":1117},{"type":41,"tag":390,"props":2043,"children":2045},{"class":392,"line":2044},59,[2046],{"type":41,"tag":390,"props":2047,"children":2048},{},[2049],{"type":46,"value":2050},"# v0.4+: generic\u002Ftype-reference and binary augmentation APIs\n",{"type":41,"tag":390,"props":2052,"children":2054},{"class":392,"line":2053},60,[2055],{"type":41,"tag":390,"props":2056,"children":2057},{},[2058],{"type":46,"value":2059},"if hasattr(engine, \"generic_parameters\"):\n",{"type":41,"tag":390,"props":2061,"children":2063},{"class":392,"line":2062},61,[2064],{"type":41,"tag":390,"props":2065,"children":2066},{},[2067],{"type":46,"value":2068},"    engine.generic_parameters(\"GenericTypeOrFunction\")\n",{"type":41,"tag":390,"props":2070,"children":2072},{"class":392,"line":2071},62,[2073],{"type":41,"tag":390,"props":2074,"children":2075},{},[2076],{"type":46,"value":2077},"if hasattr(engine, \"type_references\"):\n",{"type":41,"tag":390,"props":2079,"children":2081},{"class":392,"line":2080},63,[2082],{"type":41,"tag":390,"props":2083,"children":2084},{},[2085],{"type":46,"value":2086},"    engine.type_references(\"function_name\")\n",{"type":41,"tag":390,"props":2088,"children":2090},{"class":392,"line":2089},64,[2091],{"type":41,"tag":390,"props":2092,"children":2093},{},[2094],{"type":46,"value":2095},"if hasattr(engine, \"augment_binary\"):\n",{"type":41,"tag":390,"props":2097,"children":2099},{"class":392,"line":2098},65,[2100],{"type":41,"tag":390,"props":2101,"children":2102},{},[2103],{"type":46,"value":2104},"    engine.augment_binary(\"binary_graph.json\")\n",{"type":41,"tag":55,"props":2106,"children":2108},{"id":2107},"pre-analysis-passes",[2109],{"type":46,"value":2110},"Pre-Analysis Passes",{"type":41,"tag":49,"props":2112,"children":2113},{},[2114,2132],{"type":41,"tag":363,"props":2115,"children":2116},{},[2117,2118,2123,2125,2130],{"type":46,"value":234},{"type":41,"tag":136,"props":2119,"children":2121},{"className":2120},[],[2122],{"type":46,"value":240},{"type":46,"value":2124}," before handing off to genotoxic or\n",{"type":41,"tag":136,"props":2126,"children":2128},{"className":2127},[],[2129],{"type":46,"value":141},{"type":46,"value":2131}," skills.",{"type":46,"value":2133}," Pre-analysis enriches the graph with four passes:",{"type":41,"tag":2135,"props":2136,"children":2137},"ol",{},[2138,2148,2158,2168],{"type":41,"tag":66,"props":2139,"children":2140},{},[2141,2146],{"type":41,"tag":363,"props":2142,"children":2143},{},[2144],{"type":46,"value":2145},"Blast radius estimation",{"type":46,"value":2147}," — counts downstream and upstream nodes per\nfunction, identifies critical high-complexity descendants",{"type":41,"tag":66,"props":2149,"children":2150},{},[2151,2156],{"type":41,"tag":363,"props":2152,"children":2153},{},[2154],{"type":46,"value":2155},"Entry point enumeration",{"type":46,"value":2157}," — maps entrypoints by trust level, computes\nreachable node sets",{"type":41,"tag":66,"props":2159,"children":2160},{},[2161,2166],{"type":41,"tag":363,"props":2162,"children":2163},{},[2164],{"type":46,"value":2165},"Privilege boundary detection",{"type":46,"value":2167}," — finds call edges where trust levels\nchange (untrusted -> trusted)",{"type":41,"tag":66,"props":2169,"children":2170},{},[2171,2176],{"type":41,"tag":363,"props":2172,"children":2173},{},[2174],{"type":46,"value":2175},"Taint propagation",{"type":46,"value":2177}," — marks all nodes reachable from untrusted\nentrypoints",{"type":41,"tag":49,"props":2179,"children":2180},{},[2181],{"type":46,"value":2182},"Results are stored as annotations and named subgraphs on the graph.",{"type":41,"tag":49,"props":2184,"children":2185},{},[2186,2188,2194],{"type":46,"value":2187},"For detailed documentation, see\n",{"type":41,"tag":2189,"props":2190,"children":2192},"a",{"href":2191},"references\u002Fpreanalysis-passes.md",[2193],{"type":46,"value":2191},{"type":46,"value":808},{"type":41,"tag":55,"props":2196,"children":2198},{"id":2197},"language-selection",[2199],{"type":46,"value":2200},"Language Selection",{"type":41,"tag":49,"props":2202,"children":2203},{},[2204],{"type":46,"value":2205},"Do not hardcode a stale language table in downstream workflows. Ask the\ninstalled Trailmark build what it supports:",{"type":41,"tag":379,"props":2207,"children":2209},{"className":546,"code":2208,"language":548,"meta":384,"style":384},"from trailmark.parse import detect_languages, supported_languages\n\nsupported_languages()\ndetect_languages(\"{targetDir}\")\n",[2210],{"type":41,"tag":136,"props":2211,"children":2212},{"__ignoreMap":384},[2213,2220,2227,2234],{"type":41,"tag":390,"props":2214,"children":2215},{"class":392,"line":393},[2216],{"type":41,"tag":390,"props":2217,"children":2218},{},[2219],{"type":46,"value":1575},{"type":41,"tag":390,"props":2221,"children":2222},{"class":392,"line":563},[2223],{"type":41,"tag":390,"props":2224,"children":2225},{"emptyLinePlaceholder":1114},[2226],{"type":46,"value":1117},{"type":41,"tag":390,"props":2228,"children":2229},{"class":392,"line":572},[2230],{"type":41,"tag":390,"props":2231,"children":2232},{},[2233],{"type":46,"value":1606},{"type":41,"tag":390,"props":2235,"children":2236},{"class":392,"line":581},[2237],{"type":41,"tag":390,"props":2238,"children":2239},{},[2240],{"type":46,"value":1614},{"type":41,"tag":49,"props":2242,"children":2243},{},[2244],{"type":46,"value":2245},"CLI patterns:",{"type":41,"tag":379,"props":2247,"children":2249},{"className":381,"code":2248,"language":383,"meta":384,"style":384},"# Auto-detect and merge\nuv run trailmark analyze --language auto {targetDir}\n\n# Explicit list for a known polyglot target\nuv run trailmark analyze --language python,rust {targetDir}\n",[2250],{"type":41,"tag":136,"props":2251,"children":2252},{"__ignoreMap":384},[2253,2261,2292,2299,2307],{"type":41,"tag":390,"props":2254,"children":2255},{"class":392,"line":393},[2256],{"type":41,"tag":390,"props":2257,"children":2258},{"style":1144},[2259],{"type":46,"value":2260},"# Auto-detect and merge\n",{"type":41,"tag":390,"props":2262,"children":2263},{"class":392,"line":563},[2264,2268,2272,2276,2280,2284,2288],{"type":41,"tag":390,"props":2265,"children":2266},{"style":397},[2267],{"type":46,"value":400},{"type":41,"tag":390,"props":2269,"children":2270},{"style":403},[2271],{"type":46,"value":496},{"type":41,"tag":390,"props":2273,"children":2274},{"style":403},[2275],{"type":46,"value":501},{"type":41,"tag":390,"props":2277,"children":2278},{"style":403},[2279],{"type":46,"value":1167},{"type":41,"tag":390,"props":2281,"children":2282},{"style":403},[2283],{"type":46,"value":1172},{"type":41,"tag":390,"props":2285,"children":2286},{"style":403},[2287],{"type":46,"value":1177},{"type":41,"tag":390,"props":2289,"children":2290},{"style":403},[2291],{"type":46,"value":1187},{"type":41,"tag":390,"props":2293,"children":2294},{"class":392,"line":572},[2295],{"type":41,"tag":390,"props":2296,"children":2297},{"emptyLinePlaceholder":1114},[2298],{"type":46,"value":1117},{"type":41,"tag":390,"props":2300,"children":2301},{"class":392,"line":581},[2302],{"type":41,"tag":390,"props":2303,"children":2304},{"style":1144},[2305],{"type":46,"value":2306},"# Explicit list for a known polyglot target\n",{"type":41,"tag":390,"props":2308,"children":2309},{"class":392,"line":590},[2310,2314,2318,2322,2326,2330,2334],{"type":41,"tag":390,"props":2311,"children":2312},{"style":397},[2313],{"type":46,"value":400},{"type":41,"tag":390,"props":2315,"children":2316},{"style":403},[2317],{"type":46,"value":496},{"type":41,"tag":390,"props":2319,"children":2320},{"style":403},[2321],{"type":46,"value":501},{"type":41,"tag":390,"props":2323,"children":2324},{"style":403},[2325],{"type":46,"value":1167},{"type":41,"tag":390,"props":2327,"children":2328},{"style":403},[2329],{"type":46,"value":1172},{"type":41,"tag":390,"props":2331,"children":2332},{"style":403},[2333],{"type":46,"value":1262},{"type":41,"tag":390,"props":2335,"children":2336},{"style":403},[2337],{"type":46,"value":1187},{"type":41,"tag":49,"props":2339,"children":2340},{},[2341,2343,2348,2349,2355,2356,2362,2363,2369,2370,2376,2377,2383,2384,2390,2391,2397,2398,2404,2405,2411,2412,2418,2419,2425,2426,2432,2433,2439,2440,2446,2447,2453,2454,2460,2461,2467,2468,2474,2475,2481,2482,2488,2489,2495,2496,2502,2503,2509,2510,2516,2517,2523,2524,2530,2531,2537,2538,2544,2546,2551,2553,2559,2561,2566],{"type":46,"value":2342},"As of Trailmark 0.5.0, parser names include: ",{"type":41,"tag":136,"props":2344,"children":2346},{"className":2345},[],[2347],{"type":46,"value":548},{"type":46,"value":623},{"type":41,"tag":136,"props":2350,"children":2352},{"className":2351},[],[2353],{"type":46,"value":2354},"javascript",{"type":46,"value":668},{"type":41,"tag":136,"props":2357,"children":2359},{"className":2358},[],[2360],{"type":46,"value":2361},"typescript",{"type":46,"value":623},{"type":41,"tag":136,"props":2364,"children":2366},{"className":2365},[],[2367],{"type":46,"value":2368},"php",{"type":46,"value":623},{"type":41,"tag":136,"props":2371,"children":2373},{"className":2372},[],[2374],{"type":46,"value":2375},"ruby",{"type":46,"value":623},{"type":41,"tag":136,"props":2378,"children":2380},{"className":2379},[],[2381],{"type":46,"value":2382},"c",{"type":46,"value":623},{"type":41,"tag":136,"props":2385,"children":2387},{"className":2386},[],[2388],{"type":46,"value":2389},"cpp",{"type":46,"value":623},{"type":41,"tag":136,"props":2392,"children":2394},{"className":2393},[],[2395],{"type":46,"value":2396},"c_sharp",{"type":46,"value":623},{"type":41,"tag":136,"props":2399,"children":2401},{"className":2400},[],[2402],{"type":46,"value":2403},"java",{"type":46,"value":623},{"type":41,"tag":136,"props":2406,"children":2408},{"className":2407},[],[2409],{"type":46,"value":2410},"go",{"type":46,"value":623},{"type":41,"tag":136,"props":2413,"children":2415},{"className":2414},[],[2416],{"type":46,"value":2417},"rust",{"type":46,"value":668},{"type":41,"tag":136,"props":2420,"children":2422},{"className":2421},[],[2423],{"type":46,"value":2424},"solidity",{"type":46,"value":623},{"type":41,"tag":136,"props":2427,"children":2429},{"className":2428},[],[2430],{"type":46,"value":2431},"cairo",{"type":46,"value":623},{"type":41,"tag":136,"props":2434,"children":2436},{"className":2435},[],[2437],{"type":46,"value":2438},"circom",{"type":46,"value":623},{"type":41,"tag":136,"props":2441,"children":2443},{"className":2442},[],[2444],{"type":46,"value":2445},"haskell",{"type":46,"value":623},{"type":41,"tag":136,"props":2448,"children":2450},{"className":2449},[],[2451],{"type":46,"value":2452},"erlang",{"type":46,"value":623},{"type":41,"tag":136,"props":2455,"children":2457},{"className":2456},[],[2458],{"type":46,"value":2459},"masm",{"type":46,"value":623},{"type":41,"tag":136,"props":2462,"children":2464},{"className":2463},[],[2465],{"type":46,"value":2466},"swift",{"type":46,"value":623},{"type":41,"tag":136,"props":2469,"children":2471},{"className":2470},[],[2472],{"type":46,"value":2473},"objc",{"type":46,"value":668},{"type":41,"tag":136,"props":2476,"children":2478},{"className":2477},[],[2479],{"type":46,"value":2480},"kotlin",{"type":46,"value":623},{"type":41,"tag":136,"props":2483,"children":2485},{"className":2484},[],[2486],{"type":46,"value":2487},"dart",{"type":46,"value":623},{"type":41,"tag":136,"props":2490,"children":2492},{"className":2491},[],[2493],{"type":46,"value":2494},"move",{"type":46,"value":623},{"type":41,"tag":136,"props":2497,"children":2499},{"className":2498},[],[2500],{"type":46,"value":2501},"tact",{"type":46,"value":623},{"type":41,"tag":136,"props":2504,"children":2506},{"className":2505},[],[2507],{"type":46,"value":2508},"func",{"type":46,"value":623},{"type":41,"tag":136,"props":2511,"children":2513},{"className":2512},[],[2514],{"type":46,"value":2515},"sway",{"type":46,"value":623},{"type":41,"tag":136,"props":2518,"children":2520},{"className":2519},[],[2521],{"type":46,"value":2522},"rego",{"type":46,"value":623},{"type":41,"tag":136,"props":2525,"children":2527},{"className":2526},[],[2528],{"type":46,"value":2529},"proto",{"type":46,"value":623},{"type":41,"tag":136,"props":2532,"children":2534},{"className":2533},[],[2535],{"type":46,"value":2536},"thrift",{"type":46,"value":668},{"type":41,"tag":136,"props":2539,"children":2541},{"className":2540},[],[2542],{"type":46,"value":2543},"graphql",{"type":46,"value":2545},", and ",{"type":41,"tag":136,"props":2547,"children":2549},{"className":2548},[],[2550],{"type":46,"value":960},{"type":46,"value":2552}," (added in 0.5.0; PostgreSQL-oriented, ",{"type":41,"tag":136,"props":2554,"children":2556},{"className":2555},[],[2557],{"type":46,"value":2558},".sql",{"type":46,"value":2560}," files).\nTreat this list as documentation, not a source of truth; call\n",{"type":41,"tag":136,"props":2562,"children":2564},{"className":2563},[],[2565],{"type":46,"value":865},{"type":46,"value":2567}," on the installed build before relying on a parser.",{"type":41,"tag":55,"props":2569,"children":2571},{"id":2570},"repository-links-v05",[2572],{"type":46,"value":2573},"Repository Links (v0.5+)",{"type":41,"tag":49,"props":2575,"children":2576},{},[2577,2579,2584],{"type":46,"value":2578},"Parsers cannot see cross-language calls (FFI, RPC, IPC, contract invocation)\nor edges into external systems. Declare them in ",{"type":41,"tag":136,"props":2580,"children":2582},{"className":2581},[],[2583],{"type":46,"value":995},{"type":46,"value":2585}," at the\nanalysis root and Trailmark materializes the edges on every parse — this is a\nstable public configuration interface:",{"type":41,"tag":379,"props":2587,"children":2591},{"className":2588,"code":2589,"language":2590,"meta":384,"style":384},"language-toml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[[link]]\nsource = \"backend:submit\"\ntarget = \"contract:Verifier.verify\"\nkind = \"calls\"                 # any EdgeKind; defaults to calls\nconfidence = \"certain\"         # certain | inferred | uncertain; defaults to inferred\ndescription = \"JSON-RPC eth_call\"\n\n[[link]]\nsource = \"backend:notify\"\ntarget = \"payments-webhook\"\ntarget_external = true         # required because target is unresolved\n","toml",[2592],{"type":41,"tag":136,"props":2593,"children":2594},{"__ignoreMap":384},[2595,2603,2611,2619,2627,2635,2643,2650,2657,2665,2673],{"type":41,"tag":390,"props":2596,"children":2597},{"class":392,"line":393},[2598],{"type":41,"tag":390,"props":2599,"children":2600},{},[2601],{"type":46,"value":2602},"[[link]]\n",{"type":41,"tag":390,"props":2604,"children":2605},{"class":392,"line":563},[2606],{"type":41,"tag":390,"props":2607,"children":2608},{},[2609],{"type":46,"value":2610},"source = \"backend:submit\"\n",{"type":41,"tag":390,"props":2612,"children":2613},{"class":392,"line":572},[2614],{"type":41,"tag":390,"props":2615,"children":2616},{},[2617],{"type":46,"value":2618},"target = \"contract:Verifier.verify\"\n",{"type":41,"tag":390,"props":2620,"children":2621},{"class":392,"line":581},[2622],{"type":41,"tag":390,"props":2623,"children":2624},{},[2625],{"type":46,"value":2626},"kind = \"calls\"                 # any EdgeKind; defaults to calls\n",{"type":41,"tag":390,"props":2628,"children":2629},{"class":392,"line":590},[2630],{"type":41,"tag":390,"props":2631,"children":2632},{},[2633],{"type":46,"value":2634},"confidence = \"certain\"         # certain | inferred | uncertain; defaults to inferred\n",{"type":41,"tag":390,"props":2636,"children":2637},{"class":392,"line":599},[2638],{"type":41,"tag":390,"props":2639,"children":2640},{},[2641],{"type":46,"value":2642},"description = \"JSON-RPC eth_call\"\n",{"type":41,"tag":390,"props":2644,"children":2645},{"class":392,"line":1269},[2646],{"type":41,"tag":390,"props":2647,"children":2648},{"emptyLinePlaceholder":1114},[2649],{"type":46,"value":1117},{"type":41,"tag":390,"props":2651,"children":2652},{"class":392,"line":1277},[2653],{"type":41,"tag":390,"props":2654,"children":2655},{},[2656],{"type":46,"value":2602},{"type":41,"tag":390,"props":2658,"children":2659},{"class":392,"line":1286},[2660],{"type":41,"tag":390,"props":2661,"children":2662},{},[2663],{"type":46,"value":2664},"source = \"backend:notify\"\n",{"type":41,"tag":390,"props":2666,"children":2667},{"class":392,"line":1329},[2668],{"type":41,"tag":390,"props":2669,"children":2670},{},[2671],{"type":46,"value":2672},"target = \"payments-webhook\"\n",{"type":41,"tag":390,"props":2674,"children":2675},{"class":392,"line":1337},[2676],{"type":41,"tag":390,"props":2677,"children":2678},{},[2679],{"type":46,"value":2680},"target_external = true         # required because target is unresolved\n",{"type":41,"tag":49,"props":2682,"children":2683},{},[2684,2686,2692,2694,2700,2702,2708,2710,2715,2717,2723],{"type":46,"value":2685},"Endpoint references may be exact node IDs or unique names\u002Fsuffixes. Validation\nfails closed: ambiguous references, unknown internal endpoints, invalid enum\nvalues, and malformed TOML raise ",{"type":41,"tag":136,"props":2687,"children":2689},{"className":2688},[],[2690],{"type":46,"value":2691},"ValueError",{"type":46,"value":2693}," rather than silently weakening\nthe graph. ",{"type":41,"tag":136,"props":2695,"children":2697},{"className":2696},[],[2698],{"type":46,"value":2699},"source_external = true",{"type":46,"value":2701}," \u002F ",{"type":41,"tag":136,"props":2703,"children":2705},{"className":2704},[],[2706],{"type":46,"value":2707},"target_external = true",{"type":46,"value":2709}," permit an\nunresolved endpoint by creating a ",{"type":41,"tag":136,"props":2711,"children":2713},{"className":2712},[],[2714],{"type":46,"value":1003},{"type":46,"value":2716}," node. Configured\nedges carry a ",{"type":41,"tag":136,"props":2718,"children":2720},{"className":2719},[],[2721],{"type":46,"value":2722},"configured_by = .trailmark\u002Flinks.toml",{"type":46,"value":2724}," attribute so they are\ndistinguishable from parser-derived edges.",{"type":41,"tag":49,"props":2726,"children":2727},{},[2728],{"type":46,"value":2729},"Use this when the audit spans an FFI\u002FRPC boundary the rationalization table\nwarns about: declare the boundary edges first, then path and taint queries\ncross them like any other call edge.",{"type":41,"tag":55,"props":2731,"children":2733},{"id":2732},"graph-model",[2734],{"type":46,"value":2735},"Graph Model",{"type":41,"tag":49,"props":2737,"children":2738},{},[2739,2744,2745,2751,2752,2758,2759,2765,2766,2772,2773,2779,2780,2786,2787,2793,2794,2800,2801,2807,2808,2814,2815,2821,2822,2828,2829,2833,2835,2841,2843,2847,2849,2854,2855,2860,2861,2866,2867,2872],{"type":41,"tag":363,"props":2740,"children":2741},{},[2742],{"type":46,"value":2743},"Node kinds:",{"type":46,"value":954},{"type":41,"tag":136,"props":2746,"children":2748},{"className":2747},[],[2749],{"type":46,"value":2750},"function",{"type":46,"value":623},{"type":41,"tag":136,"props":2753,"children":2755},{"className":2754},[],[2756],{"type":46,"value":2757},"method",{"type":46,"value":623},{"type":41,"tag":136,"props":2760,"children":2762},{"className":2761},[],[2763],{"type":46,"value":2764},"class",{"type":46,"value":623},{"type":41,"tag":136,"props":2767,"children":2769},{"className":2768},[],[2770],{"type":46,"value":2771},"module",{"type":46,"value":623},{"type":41,"tag":136,"props":2774,"children":2776},{"className":2775},[],[2777],{"type":46,"value":2778},"struct",{"type":46,"value":668},{"type":41,"tag":136,"props":2781,"children":2783},{"className":2782},[],[2784],{"type":46,"value":2785},"interface",{"type":46,"value":623},{"type":41,"tag":136,"props":2788,"children":2790},{"className":2789},[],[2791],{"type":46,"value":2792},"trait",{"type":46,"value":623},{"type":41,"tag":136,"props":2795,"children":2797},{"className":2796},[],[2798],{"type":46,"value":2799},"enum",{"type":46,"value":623},{"type":41,"tag":136,"props":2802,"children":2804},{"className":2803},[],[2805],{"type":46,"value":2806},"namespace",{"type":46,"value":623},{"type":41,"tag":136,"props":2809,"children":2811},{"className":2810},[],[2812],{"type":46,"value":2813},"contract",{"type":46,"value":623},{"type":41,"tag":136,"props":2816,"children":2818},{"className":2817},[],[2819],{"type":46,"value":2820},"library",{"type":46,"value":668},{"type":41,"tag":136,"props":2823,"children":2825},{"className":2824},[],[2826],{"type":46,"value":2827},"template",{"type":46,"value":653},{"type":41,"tag":363,"props":2830,"children":2831},{},[2832],{"type":46,"value":442},{"type":46,"value":2834}," also materializes unresolved references as ",{"type":41,"tag":136,"props":2836,"children":2838},{"className":2837},[],[2839],{"type":46,"value":2840},"proxy",{"type":46,"value":2842},"\nnodes; ",{"type":41,"tag":363,"props":2844,"children":2845},{},[2846],{"type":46,"value":449},{"type":46,"value":2848}," adds ",{"type":41,"tag":136,"props":2850,"children":2852},{"className":2851},[],[2853],{"type":46,"value":968},{"type":46,"value":623},{"type":41,"tag":136,"props":2856,"children":2858},{"className":2857},[],[2859],{"type":46,"value":161},{"type":46,"value":623},{"type":41,"tag":136,"props":2862,"children":2864},{"className":2863},[],[2865],{"type":46,"value":981},{"type":46,"value":2545},{"type":41,"tag":136,"props":2868,"children":2870},{"className":2869},[],[2871],{"type":46,"value":988},{"type":46,"value":2873}," for SQL\ngraphs.",{"type":41,"tag":49,"props":2875,"children":2876},{},[2877,2882,2883,2887,2889,2895,2896,2901,2902,2908,2910,2916],{"type":41,"tag":363,"props":2878,"children":2879},{},[2880],{"type":46,"value":2881},"Node origins:",{"type":46,"value":954},{"type":41,"tag":363,"props":2884,"children":2885},{},[2886],{"type":46,"value":442},{"type":46,"value":2888}," nodes may carry origin ",{"type":41,"tag":136,"props":2890,"children":2892},{"className":2891},[],[2893],{"type":46,"value":2894},"source",{"type":46,"value":623},{"type":41,"tag":136,"props":2897,"children":2899},{"className":2898},[],[2900],{"type":46,"value":2840},{"type":46,"value":668},{"type":41,"tag":136,"props":2903,"children":2905},{"className":2904},[],[2906],{"type":46,"value":2907},"binary",{"type":46,"value":2909},", or ",{"type":41,"tag":136,"props":2911,"children":2913},{"className":2912},[],[2914],{"type":46,"value":2915},"synthetic",{"type":46,"value":2917},". v0.2 exports may omit origin.",{"type":41,"tag":49,"props":2919,"children":2920},{},[2921,2926,2927,2933,2934,2940,2941,2947,2948,2954,2955,2961,2962,2966,2967,2973,2974,2979,2980,2986,2987,2993],{"type":41,"tag":363,"props":2922,"children":2923},{},[2924],{"type":46,"value":2925},"Edge kinds:",{"type":46,"value":954},{"type":41,"tag":136,"props":2928,"children":2930},{"className":2929},[],[2931],{"type":46,"value":2932},"calls",{"type":46,"value":623},{"type":41,"tag":136,"props":2935,"children":2937},{"className":2936},[],[2938],{"type":46,"value":2939},"inherits",{"type":46,"value":623},{"type":41,"tag":136,"props":2942,"children":2944},{"className":2943},[],[2945],{"type":46,"value":2946},"implements",{"type":46,"value":623},{"type":41,"tag":136,"props":2949,"children":2951},{"className":2950},[],[2952],{"type":46,"value":2953},"contains",{"type":46,"value":623},{"type":41,"tag":136,"props":2956,"children":2958},{"className":2957},[],[2959],{"type":46,"value":2960},"imports",{"type":46,"value":929},{"type":41,"tag":363,"props":2963,"children":2964},{},[2965],{"type":46,"value":442},{"type":46,"value":2848},{"type":41,"tag":136,"props":2968,"children":2970},{"className":2969},[],[2971],{"type":46,"value":2972},"resolves_to",{"type":46,"value":623},{"type":41,"tag":136,"props":2975,"children":2977},{"className":2976},[],[2978],{"type":46,"value":1011},{"type":46,"value":623},{"type":41,"tag":136,"props":2981,"children":2983},{"className":2982},[],[2984],{"type":46,"value":2985},"specializes",{"type":46,"value":645},{"type":41,"tag":136,"props":2988,"children":2990},{"className":2989},[],[2991],{"type":46,"value":2992},"corresponds_to",{"type":46,"value":808},{"type":41,"tag":49,"props":2995,"children":2996},{},[2997,3002,3003,3009,3011,3017,3019,3025,3027,3032],{"type":41,"tag":363,"props":2998,"children":2999},{},[3000],{"type":46,"value":3001},"Edge confidence:",{"type":46,"value":954},{"type":41,"tag":136,"props":3004,"children":3006},{"className":3005},[],[3007],{"type":46,"value":3008},"certain",{"type":46,"value":3010}," (direct call, ",{"type":41,"tag":136,"props":3012,"children":3014},{"className":3013},[],[3015],{"type":46,"value":3016},"self.method()",{"type":46,"value":3018},"), ",{"type":41,"tag":136,"props":3020,"children":3022},{"className":3021},[],[3023],{"type":46,"value":3024},"inferred",{"type":46,"value":3026},"\n(attribute access on non-self object), ",{"type":41,"tag":136,"props":3028,"children":3030},{"className":3029},[],[3031],{"type":46,"value":284},{"type":46,"value":3033}," (dynamic dispatch)",{"type":41,"tag":1539,"props":3035,"children":3037},{"id":3036},"per-code-unit",[3038],{"type":46,"value":3039},"Per Code Unit",{"type":41,"tag":62,"props":3041,"children":3042},{},[3043,3048,3053,3058],{"type":41,"tag":66,"props":3044,"children":3045},{},[3046],{"type":46,"value":3047},"Parameters with types, return types, exception types",{"type":41,"tag":66,"props":3049,"children":3050},{},[3051],{"type":46,"value":3052},"Cyclomatic complexity and branch metadata",{"type":41,"tag":66,"props":3054,"children":3055},{},[3056],{"type":46,"value":3057},"Docstrings",{"type":41,"tag":66,"props":3059,"children":3060},{},[3061,3063,3069,3070,3076,3077,3083,3084,3090,3091,3097,3098,3104,3105,3111,3112,3118,3119,3125,3127,3133,3134,3140],{"type":46,"value":3062},"Annotations: ",{"type":41,"tag":136,"props":3064,"children":3066},{"className":3065},[],[3067],{"type":46,"value":3068},"assumption",{"type":46,"value":623},{"type":41,"tag":136,"props":3071,"children":3073},{"className":3072},[],[3074],{"type":46,"value":3075},"precondition",{"type":46,"value":623},{"type":41,"tag":136,"props":3078,"children":3080},{"className":3079},[],[3081],{"type":46,"value":3082},"postcondition",{"type":46,"value":623},{"type":41,"tag":136,"props":3085,"children":3087},{"className":3086},[],[3088],{"type":46,"value":3089},"invariant",{"type":46,"value":668},{"type":41,"tag":136,"props":3092,"children":3094},{"className":3093},[],[3095],{"type":46,"value":3096},"blast_radius",{"type":46,"value":623},{"type":41,"tag":136,"props":3099,"children":3101},{"className":3100},[],[3102],{"type":46,"value":3103},"privilege_boundary",{"type":46,"value":623},{"type":41,"tag":136,"props":3106,"children":3108},{"className":3107},[],[3109],{"type":46,"value":3110},"taint_propagation",{"type":46,"value":623},{"type":41,"tag":136,"props":3113,"children":3115},{"className":3114},[],[3116],{"type":46,"value":3117},"finding",{"type":46,"value":668},{"type":41,"tag":136,"props":3120,"children":3122},{"className":3121},[],[3123],{"type":46,"value":3124},"audit_note",{"type":46,"value":3126}," (last two set by ",{"type":41,"tag":136,"props":3128,"children":3130},{"className":3129},[],[3131],{"type":46,"value":3132},"augment_sarif",{"type":46,"value":2701},{"type":41,"tag":136,"props":3135,"children":3137},{"className":3136},[],[3138],{"type":46,"value":3139},"augment_weaudit",{"type":46,"value":3141},")",{"type":41,"tag":1539,"props":3143,"children":3145},{"id":3144},"per-edge",[3146],{"type":46,"value":3147},"Per Edge",{"type":41,"tag":62,"props":3149,"children":3150},{},[3151],{"type":41,"tag":66,"props":3152,"children":3153},{},[3154],{"type":46,"value":3155},"Source\u002Ftarget node IDs, edge kind, confidence level",{"type":41,"tag":1539,"props":3157,"children":3159},{"id":3158},"project-level",[3160],{"type":46,"value":3161},"Project Level",{"type":41,"tag":62,"props":3163,"children":3164},{},[3165,3170,3175],{"type":41,"tag":66,"props":3166,"children":3167},{},[3168],{"type":46,"value":3169},"Dependencies (imported packages)",{"type":41,"tag":66,"props":3171,"children":3172},{},[3173],{"type":46,"value":3174},"Entrypoints with trust levels and asset values",{"type":41,"tag":66,"props":3176,"children":3177},{},[3178],{"type":46,"value":3179},"Named subgraphs (populated by pre-analysis)",{"type":41,"tag":55,"props":3181,"children":3183},{"id":3182},"key-concepts",[3184],{"type":46,"value":3185},"Key Concepts",{"type":41,"tag":49,"props":3187,"children":3188},{},[3189,3194,3196,3202,3204,3209],{"type":41,"tag":363,"props":3190,"children":3191},{},[3192],{"type":46,"value":3193},"Declared contract vs. effective input domain:",{"type":46,"value":3195}," Trailmark separates what a\nfunction ",{"type":41,"tag":3197,"props":3198,"children":3199},"em",{},[3200],{"type":46,"value":3201},"declares",{"type":46,"value":3203}," it accepts from what can ",{"type":41,"tag":3197,"props":3205,"children":3206},{},[3207],{"type":46,"value":3208},"actually reach",{"type":46,"value":3210}," it via call\npaths. Mismatches are where vulnerabilities hide:",{"type":41,"tag":62,"props":3212,"children":3213},{},[3214,3224],{"type":41,"tag":66,"props":3215,"children":3216},{},[3217,3222],{"type":41,"tag":363,"props":3218,"children":3219},{},[3220],{"type":46,"value":3221},"Widening",{"type":46,"value":3223},": Unconstrained data reaches a function that assumes validation",{"type":41,"tag":66,"props":3225,"children":3226},{},[3227,3232],{"type":41,"tag":363,"props":3228,"children":3229},{},[3230],{"type":46,"value":3231},"Safe by coincidence",{"type":46,"value":3233},": No validation, but only safe callers exist today",{"type":41,"tag":49,"props":3235,"children":3236},{},[3237,3241,3243,3248],{"type":41,"tag":363,"props":3238,"children":3239},{},[3240],{"type":46,"value":3001},{"type":46,"value":3242}," Dynamic dispatch produces ",{"type":41,"tag":136,"props":3244,"children":3246},{"className":3245},[],[3247],{"type":46,"value":284},{"type":46,"value":3249}," edges. Account for\nconfidence when making security claims.",{"type":41,"tag":49,"props":3251,"children":3252},{},[3253,3258,3260,3266,3268,3272,3274,3279,3281,3286],{"type":41,"tag":363,"props":3254,"children":3255},{},[3256],{"type":46,"value":3257},"Proxy nodes (v0.4+):",{"type":46,"value":3259}," Unresolved calls are preserved as nodes such as\n",{"type":41,"tag":136,"props":3261,"children":3263},{"className":3262},[],[3264],{"type":46,"value":3265},"proxy.unresolved:\u003Csymbol>",{"type":46,"value":3267},". Do not treat these as source code functions; use\nthem to identify resolution gaps, dynamic dispatch, external APIs, or binary\nlinkage candidates. ",{"type":41,"tag":363,"props":3269,"children":3270},{},[3271],{"type":46,"value":449},{"type":46,"value":3273}," also emits ",{"type":41,"tag":136,"props":3275,"children":3277},{"className":3276},[],[3278],{"type":46,"value":1003},{"type":46,"value":3280}," nodes for\nendpoints declared external in ",{"type":41,"tag":136,"props":3282,"children":3284},{"className":3283},[],[3285],{"type":46,"value":995},{"type":46,"value":808},{"type":41,"tag":49,"props":3288,"children":3289},{},[3290,3295,3296,3301],{"type":41,"tag":363,"props":3291,"children":3292},{},[3293],{"type":46,"value":3294},"Reachability is not taint:",{"type":46,"value":954},{"type":41,"tag":136,"props":3297,"children":3299},{"className":3298},[],[3300],{"type":46,"value":702},{"type":46,"value":3302}," and the taint subgraph\nanswer different questions. Path queries report call-graph reachability;\npreanalysis taint marks nodes reachable from untrusted entrypoints as a coarse\nsignal. Trailmark does not perform interprocedural taint analysis — do not\npresent either as proof that attacker-controlled data reaches a sink.",{"type":41,"tag":49,"props":3304,"children":3305},{},[3306,3311,3312,3318],{"type":41,"tag":363,"props":3307,"children":3308},{},[3309],{"type":46,"value":3310},"Binary augmentation (v0.4+):",{"type":46,"value":954},{"type":41,"tag":136,"props":3313,"children":3315},{"className":3314},[],[3316],{"type":46,"value":3317},"engine.augment_binary()",{"type":46,"value":3319}," imports an external\nbinary-analysis graph JSON file. Trailmark connects it to source nodes when\npossible; it does not disassemble binaries itself.",{"type":41,"tag":49,"props":3321,"children":3322},{},[3323,3328,3330,3336,3338,3343],{"type":41,"tag":363,"props":3324,"children":3325},{},[3326],{"type":46,"value":3327},"Subgraphs:",{"type":46,"value":3329}," Named collections of node IDs produced by pre-analysis.\nQuery with ",{"type":41,"tag":136,"props":3331,"children":3333},{"className":3332},[],[3334],{"type":46,"value":3335},"engine.subgraph(\"name\")",{"type":46,"value":3337},". Available after ",{"type":41,"tag":136,"props":3339,"children":3341},{"className":3340},[],[3342],{"type":46,"value":240},{"type":46,"value":808},{"type":41,"tag":55,"props":3345,"children":3347},{"id":3346},"query-patterns",[3348],{"type":46,"value":3349},"Query Patterns",{"type":41,"tag":49,"props":3351,"children":3352},{},[3353,3355,3360],{"type":46,"value":3354},"See ",{"type":41,"tag":2189,"props":3356,"children":3358},{"href":3357},"references\u002Fquery-patterns.md",[3359],{"type":46,"value":3357},{"type":46,"value":3361}," for common\nsecurity analysis patterns.",{"type":41,"tag":49,"props":3363,"children":3364},{},[3365,3366,3370],{"type":46,"value":3354},{"type":41,"tag":2189,"props":3367,"children":3368},{"href":2191},[3369],{"type":46,"value":2191},{"type":46,"value":3371}," for\npre-analysis pass documentation.",{"type":41,"tag":49,"props":3373,"children":3374},{},[3375,3377,3383],{"type":46,"value":3376},"Use ",{"type":41,"tag":136,"props":3378,"children":3380},{"className":3379},[],[3381],{"type":46,"value":3382},"trailmark-finding-triage",{"type":46,"value":3384}," when the user has one concrete candidate\nfinding, SARIF result, weAudit annotation, suspicious function, or report\nexcerpt and needs a handoff-ready reachability and blast-radius evidence packet.",{"type":41,"tag":49,"props":3386,"children":3387},{},[3388,3389,3395,3397,3403],{"type":46,"value":3376},{"type":41,"tag":136,"props":3390,"children":3392},{"className":3391},[],[3393],{"type":46,"value":3394},"trailmark-variant-neighborhood",{"type":46,"value":3396}," after one seed issue is known and the user\nneeds graph-derived variant candidates for ",{"type":41,"tag":136,"props":3398,"children":3400},{"className":3399},[],[3401],{"type":46,"value":3402},"variant-analysis",{"type":46,"value":3404},", Semgrep, CodeQL,\nor manual review.",{"type":41,"tag":3406,"props":3407,"children":3408},"style",{},[3409],{"type":46,"value":3410},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":3412,"total":3504},[3413,3429,3439,3457,3472,3483,3494],{"slug":3414,"name":3414,"fn":3415,"description":3416,"org":3417,"tags":3418,"stars":23,"repoUrl":24,"updatedAt":3428},"address-sanitizer","detect memory errors during fuzzing","AddressSanitizer detects memory errors during fuzzing. Use when fuzzing C\u002FC++ code to find buffer overflows and use-after-free bugs.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3419,3421,3424,3425],{"name":3420,"slug":2382,"type":16},"C#",{"name":3422,"slug":3423,"type":16},"Debugging","debugging",{"name":14,"slug":15,"type":16},{"name":3426,"slug":3427,"type":16},"Testing","testing","2026-07-17T06:05:14.925095",{"slug":3430,"name":3430,"fn":3431,"description":3432,"org":3433,"tags":3434,"stars":23,"repoUrl":24,"updatedAt":3438},"aflpp","perform multi-core fuzzing of C\u002FC++ projects","AFL++ is a fork of AFL with better fuzzing performance and advanced features. Use for multi-core fuzzing of C\u002FC++ projects.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3435,3436,3437],{"name":3420,"slug":2382,"type":16},{"name":14,"slug":15,"type":16},{"name":3426,"slug":3427,"type":16},"2026-07-17T06:05:12.433192",{"slug":3440,"name":3440,"fn":3441,"description":3442,"org":3443,"tags":3444,"stars":23,"repoUrl":24,"updatedAt":3456},"agentic-actions-auditor","audit GitHub Actions for security vulnerabilities","Audits GitHub Actions workflows for security vulnerabilities in AI agent integrations including Claude Code Action, Gemini CLI, OpenAI Codex, and GitHub AI Inference. Detects attack vectors where attacker-controlled input reaches AI agents running in CI\u002FCD pipelines, including env var intermediary patterns, direct expression injection, dangerous sandbox configurations, and wildcard user allowlists. Use when reviewing workflow files that invoke AI coding agents, auditing CI\u002FCD pipeline security for prompt injection risks, or evaluating agentic action configurations.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3445,3448,3451,3452,3455],{"name":3446,"slug":3447,"type":16},"Agents","agents",{"name":3449,"slug":3450,"type":16},"CI\u002FCD","ci-cd",{"name":21,"slug":22,"type":16},{"name":3453,"slug":3454,"type":16},"GitHub Actions","github-actions",{"name":14,"slug":15,"type":16},"2026-07-18T05:47:48.564744",{"slug":3458,"name":3458,"fn":3459,"description":3460,"org":3461,"tags":3462,"stars":23,"repoUrl":24,"updatedAt":3471},"algorand-vulnerability-scanner","scan Algorand smart contracts for vulnerabilities","Scans Algorand smart contracts for 11 common vulnerabilities including rekeying attacks, unchecked transaction fees, missing field validations, and access control issues. Use when auditing Algorand projects (TEAL\u002FPyTeal).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3463,3466,3467,3468],{"name":3464,"slug":3465,"type":16},"Audit","audit",{"name":21,"slug":22,"type":16},{"name":14,"slug":15,"type":16},{"name":3469,"slug":3470,"type":16},"Smart Contracts","smart-contracts","2026-07-18T05:47:43.989063",{"slug":3473,"name":3473,"fn":3474,"description":3475,"org":3476,"tags":3477,"stars":23,"repoUrl":24,"updatedAt":3482},"ask-questions-if-underspecified","clarify requirements before implementation","Clarify requirements before implementing. Use when serious doubts arise.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3478,3479],{"name":18,"slug":19,"type":16},{"name":3480,"slug":3481,"type":16},"Productivity","productivity","2026-07-17T06:05:33.543262",{"slug":3484,"name":3484,"fn":3485,"description":3486,"org":3487,"tags":3488,"stars":23,"repoUrl":24,"updatedAt":3493},"atheris","fuzz Python code with Atheris","Atheris is a coverage-guided Python fuzzer based on libFuzzer. Use for fuzzing pure Python code and Python C extensions.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3489,3491,3492],{"name":3490,"slug":548,"type":16},"Python",{"name":14,"slug":15,"type":16},{"name":3426,"slug":3427,"type":16},"2026-07-17T06:05:14.575191",{"slug":3495,"name":3495,"fn":3496,"description":3497,"org":3498,"tags":3499,"stars":23,"repoUrl":24,"updatedAt":3503},"audit-augmentation","augment code graphs with audit findings","Augments Trailmark code graphs with external audit findings from SARIF static analysis results, weAudit annotation files, and version-gated Trailmark 0.4.x binary-analysis graph exports. Maps findings to graph nodes by file and line overlap, creates severity-based subgraphs, and enables cross-referencing findings with pre-analysis data (blast radius, taint, etc.). Use when projecting SARIF results onto a code graph, overlaying weAudit annotations, importing binary graph findings, cross-referencing Semgrep, CodeQL, or binary-analysis findings with call graph data, or visualizing audit findings in the context of code structure.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3500,3501,3502],{"name":3464,"slug":3465,"type":16},{"name":21,"slug":22,"type":16},{"name":14,"slug":15,"type":16},"2026-08-01T05:44:54.920542",77,{"items":3506,"total":3610},[3507,3514,3520,3528,3535,3540,3546,3552,3565,3576,3588,3599],{"slug":3414,"name":3414,"fn":3415,"description":3416,"org":3508,"tags":3509,"stars":23,"repoUrl":24,"updatedAt":3428},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3510,3511,3512,3513],{"name":3420,"slug":2382,"type":16},{"name":3422,"slug":3423,"type":16},{"name":14,"slug":15,"type":16},{"name":3426,"slug":3427,"type":16},{"slug":3430,"name":3430,"fn":3431,"description":3432,"org":3515,"tags":3516,"stars":23,"repoUrl":24,"updatedAt":3438},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3517,3518,3519],{"name":3420,"slug":2382,"type":16},{"name":14,"slug":15,"type":16},{"name":3426,"slug":3427,"type":16},{"slug":3440,"name":3440,"fn":3441,"description":3442,"org":3521,"tags":3522,"stars":23,"repoUrl":24,"updatedAt":3456},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3523,3524,3525,3526,3527],{"name":3446,"slug":3447,"type":16},{"name":3449,"slug":3450,"type":16},{"name":21,"slug":22,"type":16},{"name":3453,"slug":3454,"type":16},{"name":14,"slug":15,"type":16},{"slug":3458,"name":3458,"fn":3459,"description":3460,"org":3529,"tags":3530,"stars":23,"repoUrl":24,"updatedAt":3471},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3531,3532,3533,3534],{"name":3464,"slug":3465,"type":16},{"name":21,"slug":22,"type":16},{"name":14,"slug":15,"type":16},{"name":3469,"slug":3470,"type":16},{"slug":3473,"name":3473,"fn":3474,"description":3475,"org":3536,"tags":3537,"stars":23,"repoUrl":24,"updatedAt":3482},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3538,3539],{"name":18,"slug":19,"type":16},{"name":3480,"slug":3481,"type":16},{"slug":3484,"name":3484,"fn":3485,"description":3486,"org":3541,"tags":3542,"stars":23,"repoUrl":24,"updatedAt":3493},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3543,3544,3545],{"name":3490,"slug":548,"type":16},{"name":14,"slug":15,"type":16},{"name":3426,"slug":3427,"type":16},{"slug":3495,"name":3495,"fn":3496,"description":3497,"org":3547,"tags":3548,"stars":23,"repoUrl":24,"updatedAt":3503},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3549,3550,3551],{"name":3464,"slug":3465,"type":16},{"name":21,"slug":22,"type":16},{"name":14,"slug":15,"type":16},{"slug":3553,"name":3553,"fn":3554,"description":3555,"org":3556,"tags":3557,"stars":23,"repoUrl":24,"updatedAt":3564},"audit-context-building","build architectural context for code analysis","Enables ultra-granular, line-by-line code analysis to build deep architectural context before vulnerability or bug finding.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3558,3561,3562,3563],{"name":3559,"slug":3560,"type":16},"Architecture","architecture",{"name":3464,"slug":3465,"type":16},{"name":21,"slug":22,"type":16},{"name":18,"slug":19,"type":16},"2026-07-18T05:47:40.122449",{"slug":3566,"name":3566,"fn":3567,"description":3568,"org":3569,"tags":3570,"stars":23,"repoUrl":24,"updatedAt":3575},"audit-prep-assistant","prepare codebases for security audits","Prepares codebases for security review using Trail of Bits' checklist. Helps set review goals, runs static analysis tools, increases test coverage, removes dead code, ensures accessibility, and generates documentation (flowcharts, user stories, inline comments).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3571,3572,3573,3574],{"name":3464,"slug":3465,"type":16},{"name":21,"slug":22,"type":16},{"name":18,"slug":19,"type":16},{"name":14,"slug":15,"type":16},"2026-07-18T05:47:39.210985",{"slug":3577,"name":3577,"fn":3578,"description":3579,"org":3580,"tags":3581,"stars":23,"repoUrl":24,"updatedAt":3587},"burpsuite-project-parser","parse Burp Suite project files","Searches and explores Burp Suite project files (.burp) from the command line. Use when searching response headers or bodies with regex patterns, extracting security audit findings, dumping proxy history or site map data, or analyzing HTTP traffic captured in a Burp project.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3582,3583,3586],{"name":3464,"slug":3465,"type":16},{"name":3584,"slug":3585,"type":16},"CLI","cli",{"name":14,"slug":15,"type":16},"2026-07-17T06:05:33.198077",{"slug":3589,"name":3589,"fn":3590,"description":3591,"org":3592,"tags":3593,"stars":23,"repoUrl":24,"updatedAt":3598},"c-review","audit C and C++ code","Performs comprehensive C\u002FC++ security review for memory corruption, integer overflows, race conditions, and platform-specific vulnerabilities. Use when auditing native C\u002FC++ applications, reviewing daemons or services for memory safety, or hunting integer overflow \u002F use-after-free \u002F race conditions in userspace code.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3594,3595,3596,3597],{"name":3464,"slug":3465,"type":16},{"name":3420,"slug":2382,"type":16},{"name":21,"slug":22,"type":16},{"name":14,"slug":15,"type":16},"2026-07-17T06:05:11.333374",{"slug":3600,"name":3600,"fn":3601,"description":3602,"org":3603,"tags":3604,"stars":23,"repoUrl":24,"updatedAt":3609},"cairo-vulnerability-scanner","scan Cairo and StarkNet contracts for vulnerabilities","Scans Cairo\u002FStarkNet smart contracts for 6 critical vulnerabilities including felt252 arithmetic overflow, L1-L2 messaging issues, address conversion problems, and signature replay. Use when auditing StarkNet projects.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3605,3606,3607,3608],{"name":3464,"slug":3465,"type":16},{"name":21,"slug":22,"type":16},{"name":14,"slug":15,"type":16},{"name":3469,"slug":3470,"type":16},"2026-07-18T05:47:42.84568",111]