Threat10 is a public, browser-local explorer for structured security knowledge. The restored legacy interface is the product's visual and route authority. The approved data direction is an independent build-time pipeline in this repository that produces compact, query-routed Parquet releases for the public Hugging Face dataset link42-au/threat; the static application will query immutable releases with DuckDB-Wasm.
Threat10 is structured knowledge, not live IOC monitoring. It does not claim current sightings, an ephemeral indicator feed, or an upstream availability SLA.
| Area | State | Evidence |
|---|---|---|
| Independent static repository and legacy interface | Live-verified interface | The restored legacy UI is live at link42-au.github.io/threat10 after hosted run 33161073249 passed verification and deployment. |
| Source and rights evaluation | Source-complete | Copied F2/F3 policy and synthetic contract evidence establish fail-closed boundaries; the upstream selection was completed in the Link42 architecture work. |
| Enterprise tactic raw-path policy | Source-complete | T2B binds seven exact MITRE ATT&CK STIX paths to the normalized tactic field and passes eight fail-closed fixtures for unknown paths, kill chains, domains, tactic references, and missing or multiple matrices. Exactly one Enterprise matrix produces an asserted zero-based tactic order. This is policy evidence only; no source ingestion or matrix output exists yet. |
| Enterprise relationship policy | Source-complete | T2C allows official revoked-by replacements between techniques and sub-techniques in either direction. Eight fixtures retain fail-closed rejection for unknown predicates and every other unapproved cross-type endpoint pair. |
| Synthetic Parquet and DuckDB-Wasm spike | In progress | Local Chromium, Firefox, and Playwright WebKit prove deterministic routed entity/edge/search queries, pagination, corrupt-current fallback, and same-origin request/byte ceilings. A live Chromium proof against immutable HF data bb5fa284b55b9847f2cb01594b7c2c4cd2d74a1c and manifest e7944f9a3f40a17c5234cfbcbcbeaea09e94ea13 passed bounded anonymous HTTP-range queries and previous-good fallback. Actual Safari remains outstanding, so T2 is not source-complete. |
| App-owned ingestion and release pipeline | T3 source-complete locally | The builder pins Enterprise ATT&CK 19.2 at an immutable official commit, enforces the source, tactic, and relationship policies, and writes deterministic routed entity/relation/reference/search/matrix Parquet plus capability/source/provenance metadata. Two clean official builds reproduced all 1,029 files and 1,028 artifact hashes exactly. T5 manifest/release assembly and T6 publication remain separate later gates. |
| Public Hugging Face dataset | Synthetic proof live; production release blocked | The public, ungated link42-au/threat dataset exists, and an anonymous API read returned HTTP 200 at observed revision de75502017efa6acc83a736657785748b4e2071a. It contains only the synthetic T2 feasibility publication; T6 still requires the T5 source-derived local build and scoped publication/readback proof. |
| Data-backed Threat10 product | Planned | The legacy Pages interface is live, but upstream adapters, DuckDB queries, dataset-backed views, daily source-change builds, and the full Threat10 product are not. |
This repository contains a static SvelteKit application. GitHub Pages serves generated files; later features add an offline/build-time ingestion pipeline and query the resulting approved Parquet artifacts directly in the browser with DuckDB-Wasm. The initial full build runs locally. Subsequent public Actions builds are bounded to a daily source-change check, skip unchanged inputs, compact stable logical partitions rather than accumulating daily files, and publish immutable manifests with a previous-known-good release.
There is no application server, runtime database, account system, private workspace, runtime AI, paid feature, or browser secret. A future Hugging Face write credential is allowed only as a least-privilege build-time publication secret after the public dataset exists; it is never available to the application, forks, or pull requests.
The repository contains no third-party or production threat dataset bytes. Contract fixtures are project-authored synthetic STIX. The local builder accepts an externally downloaded, hash-pinned source file and writes only ignored local output; it does not fetch or publish. Copied source-policy documents are fail-closed inputs, not permission to expose every upstream field. See PLAN.md for the ordered implementation and publication blocker.
The ignored-output feasibility bundle is prepared with pnpm prepare:publication:t2. After publishing its data-revision/ tree and recording the immutable Hugging Face revision, finalize the manifest-last tree with THREAT10_T2_HF_DATA_REVISION=<revision> pnpm finalize:publication:t2. See the scoped dataset-card fragment for the synthetic-only licensing boundary. These commands do not publish or use a Hugging Face token.
The published synthetic proof uses data revision bb5fa284b55b9847f2cb01594b7c2c4cd2d74a1c and manifest revision e7944f9a3f40a17c5234cfbcbcbeaea09e94ea13. Its Chromium run observed 14/14 Parquet payload responses as HTTP 206 with CORS *, transferring 2,827,775 bytes for 5,842,431 bytes of selected artifacts. The browser retained immutable manifest-selected URLs, allowed only Hugging Face's validated CDN redirect target, used no authorization or application backend, and passed entity, search, edge, empty, and previous-good fallback queries. DuckDB's full-HTTP-read fallback is disabled. This is synthetic T2 feasibility evidence, not a production Threat10 dataset or data-backed product release.
Requirements:
- Node.js 22.23.1
- pnpm 10.15.1
Install dependencies and the Chromium test runtime:
pnpm install --frozen-lockfile
pnpm exec playwright install chromiumRun the local site:
pnpm --filter @threat10/web devRun formatting/lint, strict type checking, unit/component tests, copied contract and policy validation, static build validation, and the browser smoke test:
pnpm verifyThe individual commands are pnpm check, pnpm typecheck, pnpm test, pnpm validate:contracts, pnpm validate:policy, pnpm validate:tactic-policy, pnpm validate:relationship-policy, pnpm build, pnpm verify:static, and pnpm test:e2e.
The T3 builder accepts a locally downloaded bundle and never fetches or publishes data itself. The reviewed production source lock is config/attack-enterprise-19.2.json. Release eligibility requires that exact repo-owned path and exact lock hash; a copied or caller-authored lock is rejected even when internally self-consistent. The lock binds the source version, immutable commit URL/path, byte size, source hash, bundle/collection/matrix/STIX/domain identities, notice, and all three machine-policy identities. A build uses an empty ignored output directory:
pnpm build:attack:t3 -- \
--input /absolute/path/to/enterprise-attack-19.2.json \
--source-lock config/attack-enterprise-19.2.json \
--output .artifacts/t3-local/enterprise-attack-19.2The lock has SHA-256 da46350f7eb708b5b90a86ed81c144485b630c2bce5656352333828e5c54114a and records commit 6cda5ad8462c79e14fbb872f4e09059b18e0cfc4, 53,835,637 input bytes, and source SHA-256 dc1639caa5501d720e280cf1cbd8fbe009884a0c9b3e6e9ed9d0c25166c3d8f4. Two clean local builds produced 4,820 entities, 21,262 relations, 38,462 references, 11,423 search rows, 872 matrix rows, and 1,028 data/metadata artifacts. Their inventory digest was identically 83c5ac2716b61f4c391aad6b57ea5cb4dc0916a9acef5cd94cc7a7fb455a8eea; including the identical build report, the complete-tree digest was 68a37287ff2cb00836519a14ced6901390e444f5a04e512af632a7dbb87e0591 across 1,029 files and 49,131,858 bytes. This is local source-complete evidence, not a Hugging Face release or data-backed site.
Direct public hosting does not override originating-source terms. Every future file and predicate needs both the aggregator decision and the originating source/field decision. The authoritative first-release boundary is the Threat10 v1 data-content contract: official MITRE ATT&CK Enterprise STIX 2.1 only. See ATTRIBUTION.md and docs/licensing/ for the copied evidence boundary.
Threat10 code and project-authored documentation are licensed under the GNU Affero General Public License v3.0 or later, identified by AGPL-3.0-or-later.
Copyright © 2026 Iain Dickson.
Upstream data is not relicensed by this repository. Third-party libraries and Geist fonts retain their own licences; see THIRD_PARTY_NOTICES.md and LICENSES/.