KillWebs.com Sister-Site Design and Implementation Report
Planning baseline: August 1, 2026 Audience: Web developer, product owner, security owner, and compliance reviewer Target: KillWebs.com, implemented as a sister property to KillChains.com Required stack: PHP, browser-native JavaScript, HTML, and CSS; locally hosted open-source 3D JavaScript libraries are permitted External-service boundary: No content delivery network, remote analytics, advertising, hosted search, hosted fonts, external APIs, social widgets, authentication provider, cloud database, telemetry collector, or other runtime third-party integration
Executive summary
KillWebs.com should be built as a structural sibling rather than a visual clone of KillChains.com. It should preserve the parent site’s recognizable information architecture—server-rendered explanatory pages, an interactive synthetic learning environment, evidence and methodology sections, public source transparency, local browser progress, and strong limitations language—while changing the primary mental model from a sequence of stages to a graph of dynamically composable pathways.
The supplied KillChains.com v1.6.0 source package is the correct engineering baseline because it already provides a PHP shell, shared includes, reusable page components, local data files, deterministic simulations, machine-readable discovery files, tests, a /docs/long-term-memory/ hierarchy, and a substantial .uai/ project-memory package. The live KillChains.com site currently identifies itself as release v1.3.0 and exposes a simulation, Evidence Atlas, Human Control Lab, explanatory pages, methodology, sources, privacy, terms, local progress, synthetic-only scenarios, and text fallbacks. The difference between the supplied v1.6.0 package and the public v1.3.0 deployment should be treated as source-to-production drift, not resolved by downgrading the supplied source. citeturn7view0
The most important implementation decision is to fork the supplied source into a new repository or independent deployment root, then systematically replace KillChains-specific identity, route labels, data, simulations, palette, structured metadata, public discovery records, and .uai memory. Shared component patterns may be retained, but canonical URLs, browser-storage namespaces, service-worker caches, manifests, sitemaps, JSON-LD identifiers, local data keys, and release streams must be independent.
KillWebs.com should center its first release on five product capabilities:
| Capability | Purpose | Release recommendation |
|---|---|---|
| Kill Web Explorer | Interactive graph showing sensors, decision nodes, communications paths, authorities, and effectors | Required for launch |
| Resilience Scenarios | Deterministic synthetic exercises in which users remove or degrade nodes and compare recomposed pathways | Required for launch |
| ACK Capability Marketplace Lab | Explains DARPA’s marketplace-style capability discovery and resource allocation | Required for launch |
| Evidence and Architecture Atlas | Organizes doctrine, programs, technical layers, risks, and source strength | Required for launch |
| Human Authority and Autonomy Lab | Demonstrates where human judgment, authorization, uncertainty, and accountability reside | Required for launch |
The content model should preserve an important doctrinal distinction: a kill web does not abolish kill chains. It provides a graph of possible, authorized mission paths from which individual chains can be composed and recomposed. That distinction is strongly represented across the uploaded research corpus and should be the site’s canonical explanatory statement. fileciteturn0file0 fileciteturn0file12
The site should use PHP server rendering as the authoritative content layer and JavaScript only for progressive enhancement. Critical definitions, limitations, citations, scenario descriptions, controls, results, and fallback representations must be understandable without the 3D renderer. This matches UAIX AI-Ready Web guidance, which calls for semantic, human-visible canonical content and warns against hiding key answers behind canvas, scripts, images, tabs, or machine-only artifacts. citeturn9view0turn9view1
For 3D, the recommended launch dependency is Three.js, pinned to an approved version and stored under the site’s own /assets/vendor/ directory. Three.js is already used by KillChains.com, reducing migration and accessibility risk. Its official documentation supports ordinary JavaScript-module projects and static asset folders; the remote CDN example in the supplied KillChains configuration must be replaced by local module paths to satisfy the no-external-services requirement. citeturn7view8
The .uai design should follow a hot-and-durable memory model:
- Compact
.uaifiles hold accepted current state, constraints, architecture, decisions, progress, and routing instructions. - Full reports and long-form research remain under
/docs/long-term-memory/reports/. - Every report receives a stable ID, SHA-256 digest, review state, authority class, topic list, and pointer in
.uai/long-term-memory.uai. - Reviewed conclusions are distributed to the
.uaifile that owns the subject—such asarchitecture.uai,constraints.uai, orreport-synthesis.uai—rather than duplicating entire reports across hot memory. - Public AI-ready discovery files are generated from a public-safe projection and must never expose private
.uaiinstructions, credentials, internal paths, or unpublished records.
UAIX describes .uai files as typed, bounded memory records rather than runtime execution or certification. Its universal launch baseline includes memory-maintenance.uai, identity.uai, world-context.uai, totem.uai, taboo.uai, talisman.uai, startup-packet.uai, and progress.uai; code-bearing packages additionally require architecture, coding standards, and continuation records. citeturn9view4turn7view1
Security should be designed around a public, unclassified educational site with no user accounts and no operational data ingestion. Zero trust in this context means every route, file, process, and state-changing action is authorized according to the resource involved rather than trusted because it originates on the same server or network. NIST’s zero-trust model rejects implicit trust based on network location and emphasizes protecting resources through explicit, continuously evaluated access decisions. citeturn7view5
The recommended delivery period is twelve weeks, subject to the assumptions that the supplied code may legally be reused, hosting supports PHP 8.2 or later, both domains have the same authorized owner, and the content remains public and unclassified. The first public release should not be approved until reciprocal links, local asset verification, performance budgets, accessibility fallbacks, .uai completeness, report indexing, security headers, offline behavior, and content-source review all pass automated and manual acceptance gates.
Baseline audit and assumptions
Source audit. The public KillChains.com implementation establishes the behavioral model to preserve: synthetic-only simulations, no registration, local progress, deterministic scenarios, an evidence-led learning flow, visible methodological limitations, explanatory fallback text, and clear separation between military, cyber, and AI-system meanings of “kill chain.” citeturn7view0
A direct audit of the supplied KillChains.com-v1.6.0-root-deploy(2).zip found:
| Area | Supplied v1.6.0 implementation | KillWebs.com action |
|---|---|---|
| Page layer | Root-level PHP routes with shared includes | Retain the pattern; replace route registry and content |
| Shared shell | includes/bootstrap.php, header.php, footer.php, seo.php, and component helpers | Fork and rename identity-specific functions |
| Configuration | Central config/site.php | Replace all identity, route, feature, origin, contact, and storage values |
| Content data | Local PHP data arrays and JSON files | Replace with kill-web-specific datasets |
| Interaction | Browser JavaScript modules and Three.js | Retain progressive-enhancement pattern |
| Three.js delivery | Remote jsDelivr URLs in config/site.php | Replace with self-hosted, pinned modules |
| Machine discovery | robots.txt, sitemap, llms.txt, JSON indexes, web manifest, and security.txt | Regenerate for KillWebs.com |
| Durable memory | /docs/long-term-memory/ | Preserve hierarchy and replace content authority |
| Agent memory | .uai/ typed package and JSON exports | Rebuild identity and all current-state records |
| Tests | Smoke, link, responsive, content, UAIX, SEO/AEO/GEO, and browser tests | Fork, rename, and expand |
| Runtime telemetry | Feature flag disabled | Keep disabled |
| Browser progress | Local storage supported | Retain with a new domain-specific namespace |
The source package’s current palette is dominated by dark navy, cyan, blue, violet, rose, and amber. KillWebs.com should retain the dark technical presentation and component rhythm but use an organic network palette that is plainly distinct:
| Token | Recommended value | Purpose |
|---|---|---|
| Deep background | #07110E | Page background |
| Surface | #0D1C18 | Cards and panels |
| Elevated surface | #142822 | Dialogs and active panels |
| Primary | #A7F432 | Active nodes, principal calls to action |
| Network teal | #39D9C8 | Links and valid connections |
| Information blue | #8CC8FF | Evidence and explanatory states |
| Warning | #FFB454 | Latency, uncertainty, or degraded state |
| Danger | #FF6F61 | Failed, denied, or invalid connection |
| Main text | #F3FAF6 | Primary copy |
| Muted text | #9AB5AA | Secondary copy |
These colors provide a visual relationship to KillChains.com’s dark interface while replacing its electric-cyan identity with lime and teal. Color must never be the only signal: every node and edge state should also use a label, icon, line pattern, or shape.
Layout compatibility. “Modeled on KillChains.com” should be interpreted as reuse of the following structural grammar:
- Sticky site header and compact mobile navigation.
- Full-width interactive hero with an adjacent or overlaid briefing panel.
- A constrained reading width for reports and definitions.
- Reusable cards for concepts, evidence, risks, and source quality.
- Persistent methodological and synthetic-data labels.
- A large footer divided into understanding, evaluation, and site-governance links.
- A text fallback immediately following every canvas-based experience.
- Consistent components for citations, source strength, review date, limitations, and release status.
It should not mean pixel-for-pixel copying. The graph topology, iconography, node cards, motion language, color, page titles, datasets, and primary calls to action must express a separate KillWebs identity.
Visual mockup guidance.
┌──────────────────────────────────────────────────────────────────────┐
│ KillWebs.com Explore ACK Lab Atlas Architecture Security │
│ [Compare the linear model at KillChains.com] │
├──────────────────────────────────────────────────────────────────────┤
│ A NETWORK IS FORMING │
│ Compose the mission. Test the failure. Preserve authorized options. │
│ │
│ ┌──────────────────────────┐ ┌───────────────────────────────────┐ │
│ │ │ │ Scenario brief │ │
│ │ 3D / 2D network graph │ │ Available capabilities │ │
│ │ sensors ↔ data ↔ C2 │ │ Constraints and authorities │ │
│ │ ↕ links ↔ effectors │ │ [Inspect] [Degrade] [Recompose] │ │
│ │ │ │ │ │
│ └──────────────────────────┘ └───────────────────────────────────┘ │
├──────────────────────────────────────────────────────────────────────┤
│ Current pathway | Alternatives | Evidence age | Authority | Latency │
├──────────────────────────────────────────────────────────────────────┤
│ Why chains still matter | How ACK works | Security | Human control │
├──────────────────────────────────────────────────────────────────────┤
│ Source record • Methodology • Reports • Privacy • Sister site │
└──────────────────────────────────────────────────────────────────────┘
Assumptions requiring owner confirmation.
| Unspecified item | Planning assumption | Consequence if incorrect |
|---|---|---|
| Hosting environment | Linux, Apache or Nginx, PHP 8.2+, HTTPS, writable cache directory | Architecture and deployment scripts may need revision |
| Domain registrar and DNS | Owner controls KillWebs.com and can edit DNS, TLS, and redirects | Launch cannot proceed without verified control |
| KillChains.com ownership | Same legal owner authorizes code reuse and reciprocal changes | Sister-site presentation and source reuse may be impermissible |
| Copyright and content rights | Uploaded reports and source code may be edited and republished | Legal review is required before public release |
| Classification | Public, unclassified, educational material only | CUI or classified content requires a separate accredited environment |
| User accounts | No accounts, login, profiles, or cloud synchronization | Authentication and server-side personal-data architecture would be required otherwise |
| Email and contact forms | Static contact information only | Form processing would add abuse, retention, and privacy controls |
| Analytics | None | Any later analytics decision requires a separate privacy and architecture review |
| Operational data | No real targets, coordinates, current force dispositions, credentials, or mission feeds | Ingesting such data would fundamentally change risk and compliance scope |
| KillChains deployment access | Owner can add reciprocal links to KillChains.com | Otherwise reciprocity can initially be one-directional only |
| Language scope | English, en-US, at launch | Localization adds route, schema, test, and memory requirements |
The uploaded research should be treated as a research-input corpus, not automatically as publication-ready authority. Several files are paired duplicates with “(1)” filenames; these should be deduplicated by cryptographic hash before stable report IDs are issued. Long-form reports also contain varying levels of sourcing and confidence, so each must receive a review state and truth boundary before its conclusions are promoted into public pages or hot .uai memory. UAIX explicitly warns against treating raw intake or archived reports as current truth before review and promotion. citeturn9view5
Product structure and content migration
The proposed information architecture keeps KillChains.com’s learning sequence—experience, understand, evaluate, verify—but changes the interactive metaphor from “interrupt the sequence” to “compose and preserve valid pathways.”
Recommended public sitemap.
| Route | Page | Primary purpose | Launch |
|---|---|---|---|
/ | Kill Web Explorer | Interactive overview and daily resilience scenario | Yes |
/scenarios.php | Resilience Scenario Archive | Browse deterministic synthetic scenarios | Yes |
/ack-lab.php | ACK Capability Marketplace Lab | Explore capability offers, constraints, and recomposition | Yes |
/atlas.php | Kill Web Evidence Atlas | Filter programs, doctrine, architecture, risks, and sources | Yes |
/interoperability-lab.php | Interoperability Lab | Compare data schemas, gateways, and compatibility constraints | Yes |
/human-authority.php | Human Authority and Autonomy Lab | Explore approval, uncertainty, delegation, and accountability | Yes |
/what-is-a-kill-web.php | What Is a Kill Web? | Canonical definition and executive explanation | Yes |
/kill-chain-vs-kill-web.php | Kill Chain vs. Kill Web | Direct comparison and sister-site links | Yes |
/how-kill-webs-work.php | How Kill Webs Work | Sense, make sense, decide, authorize, act, assess | Yes |
/architecture.php | Technical Architecture | Data fabric, cloud-edge, transport, standards, security | Yes |
/jadc2.php | Kill Webs and JADC2 | Relationship to joint all-domain command and control | Yes |
/ai-autonomy.php | AI and Autonomy | Decision support, constraints, uncertainty, human judgment | Yes |
/security.php | Vulnerabilities and Resilience | Cyber, data-integrity, timing, identity, and supply-chain risk | Yes |
/procurement.php | Procurement and Open Architecture | Data rights, modularity, software acquisition, interoperability | Yes |
/risks-law.php | Risk, Law, and Authority | Legal, ethical, governance, and publication boundaries | Yes |
/reports.php | Research Report Index | Public-safe catalog of indexed /docs reports | Yes |
/methodology.php | Methodology | Evidence classification, synthesis, and limitations | Yes |
/sources.php | Source Library | Primary-source register | Yes |
/faq.php | Frequently Asked Questions | Direct answer-oriented summaries | Yes |
/glossary.php | Glossary | Stable definitions and aliases | Yes |
/editorial-policy.php | Editorial Policy | Review, corrections, provenance, and AI-use policy | Yes |
/citation.php | Citation Guidance | How to cite pages and reports | Yes |
/about-author.php | About | Ownership and authorship information | Yes |
/privacy.php | Privacy | Local storage, logs, and no-tracking policy | Yes |
/terms.php | Terms | Educational-use and limitation terms | Yes |
/.well-known/security.txt | Security Contact | Vulnerability-reporting instructions | Yes |
/llms.txt | Advisory AI index | Canonical public pages and limitations | Yes |
/sitemap.xml | Sitemap | Search and agent discovery | Yes |
/feed.xml, /feed.json | Publication feeds | Release and report summaries | Optional |
/status.php | System Status | Build, content-review, and feature status | Recommended |
KillChains-to-KillWebs content mapping.
| KillChains.com source feature | KillWebs.com counterpart | Migration treatment |
|---|---|---|
| Simulation | Kill Web Explorer | Rebuild scenario model as a graph, not a six-stage line |
| Daily Break the Chain | Daily Preserve the Web / Recompose the Mission | Retain deterministic date-based seeds |
| Challenge archive | Resilience Scenario Archive | Retain local completion records under a new namespace |
| Evidence Atlas | Kill Web Evidence Atlas | Extend dimensions to architecture layers, programs, and source authority |
| Evidence Lab | Interoperability and Source Lab | Add data semantics, provenance, compatibility, and authority |
| Human Control Lab | Human Authority and Autonomy Lab | Preserve controls while adding distributed decision nodes |
| What They Are | What Is a Kill Web? | Replace terminology and canonical definitions |
| How They Work | How Kill Webs Work | Present topology, composition, routing, and degradation |
| Countries & Use | Programs, Doctrine, and Public Initiatives | Avoid tactical deployment coordinates |
| Systems | Architecture Components | Organize by sensors, transport, edge, data, C2, effectors, assessment |
| AI Security | Kill Web Security | Expand integrity, timing, orchestration, model, and supply-chain risks |
| Risk, Law & Control | Risk, Law, Authority, and Human Judgment | Preserve legal and governance emphasis |
| Methodology | Evidence and Publication Methodology | Add report-promotion and .uai truth-boundary process |
| Sources | Primary Source Library | Retain curated, reviewable source records |
| About | Ownership and Editorial Responsibility | Update all legal identity and domain references |
| Local progress | Local learning record | Separate storage key and explicit expiration/clear controls |
| Text fallback | Accessible graph and scenario transcript | Required for every interactive experience |
| Result card | Pathway report | Show selected path, alternatives, evidence, constraints, and limitations |
The uploaded KillWebs Concept Website Strategy already frames the desired property as a conceptual successor to KillChains.com and proposes interactive graph-based explanation, resilience demonstrations, JADC2 content, AI, edge computing, and mathematical-network concepts. It is a useful product input, but claims about particular systems, performance improvements, and military programs should be checked against primary sources before publication. fileciteturn0file1
Content inventory and routing.
| Research theme | Uploaded source material | Canonical site destinations | /docs treatment |
|---|---|---|---|
| Transition and ACK | Operational and strategic transition reports | Home, comparison, ACK Lab, architecture | Preserve canonical reports; synthesize reviewed definition |
| Kill chain versus kill web | Comparative report | Comparison page, FAQ, glossary | Make the strongest definition a canonical source record |
| Technical architecture | Military Kill Web Architecture | Architecture, Explorer, Interoperability Lab | Extract architecture layers and constraints |
| JADC2 | Two JADC2-focused reports | JADC2, architecture, atlas | Review current program names and dates before publication |
| Cybersecurity | Vulnerabilities and non-kinetic disruption reports | Security, scenarios, methodology | Preserve defensive architecture; exclude exploit-enabling detail |
| AI and autonomy | Two AI/autonomy report families | AI and Autonomy, Human Authority Lab | Preserve uncertainty and human-judgment boundaries |
| Procurement | Procurement and legacy-friction reports | Procurement, architecture, glossary | Separate statutory facts from analytical recommendations |
| Website strategy | KillWebs Concept Website Strategy | Product requirements and UX decisions | Classify as design input, not doctrinal authority |
The corpus should support a clear editorial hierarchy:
- Official primary sources for doctrine, policy, program descriptions, standards, and technical specifications.
- Reviewed analytical reports that synthesize those sources.
- Interactive explanatory models that make the analysis understandable.
- Synthetic scenarios that demonstrate tradeoffs without representing real operational outcomes.
The uploaded cybersecurity report correctly emphasizes that expanded connectivity increases interfaces, credentials, transformations, and trust relationships and that integrity attacks may be more consequential than visible outages. That should shape both the site’s subject matter and its own web-security posture. fileciteturn0file9
The AI/autonomy report’s most useful publication boundary is that “best capability for the task” should be presented as a constrained recommendation problem, not as autonomous authorization to apply force. The public site should preserve uncertainty, provenance, legal constraints, authority, and human judgment rather than presenting AI optimization as automatic legitimacy. fileciteturn0file10
Reciprocal-link implementation.
KillWebs.com should contain three persistent links to KillChains.com:
| Location | Recommended label | Behavior |
|---|---|---|
| Header utility area | “Explore the linear model at KillChains.com” | Same-tab navigation |
| Comparison page | “Open the interactive Kill Chain model” | Contextual deep link |
| Footer sister-site panel | “KillChains.com — sequences, interruption points, and control” | Same-tab navigation |
KillChains.com should receive parallel links:
| Location | Recommended label |
|---|---|
| Header or home-page comparison callout | “Explore resilient networks at KillWebs.com” |
| “What They Are” or “How They Work” | “See how multiple chains form a Kill Web” |
| Footer sister-site panel | “KillWebs.com — composable pathways, resilience, and distributed authority” |
The sites should not share cookies, sessions, service workers, local-storage keys, authentication state, or analytics identifiers. Each domain should have its own canonical URL, manifest, sitemap, release stream, privacy notice, and browser-storage namespace. A user following a plain link should cross domains without silent state transfer.
Technical architecture and performance budgets
The target architecture should be deliberately simple: PHP renders authoritative pages and same-origin JSON; JavaScript progressively adds interaction; all content, libraries, reports, fonts, models, and images are served locally.
flowchart TD
U[Human user or public agent] --> TLS[HTTPS web server]
TLS --> ROUTER[PHP route bootstrap]
ROUTER --> CONFIG[Site configuration and route registry]
ROUTER --> PAGES[Server-rendered PHP pages]
ROUTER --> API[Same-origin read-only PHP endpoints]
ROUTER --> DOCS[Approved report controller]
CONFIG --> COMPONENTS[Header, footer, SEO, citations, cards]
PAGES --> COMPONENTS
PAGES --> DATA[Local PHP and JSON content]
API --> DATA
DOCS --> INDEX[Generated public report index]
INDEX --> REPORTS[/docs/long-term-memory/reports/]
PAGES --> HTML[Semantic HTML and text fallbacks]
HTML --> JS[Local ES-module JavaScript]
JS --> THREE[Locally vendored Three.js]
JS --> SW[Versioned service worker]
THREE --> CANVAS[Optional WebGL/WebXR graph]
SW --> CACHE[Browser-local public asset cache]
MEMORY[Private project .uai memory] --> GENERATOR[CLI indexing and readiness scripts]
REPORTS --> GENERATOR
GENERATOR --> INDEX
GENERATOR --> PUBLICAI[Public-safe AI-ready manifests]
GENERATOR --> POINTERS[.uai long-term-memory pointers]
PUBLICAI --> TLS
POLICY[Security headers, CSP, permissions, input limits] --- TLS
TESTS[PHP, JS, accessibility, links, security, UAIX tests] --- GENERATOR
Recommended repository shape.
/
├── index.php
├── scenarios.php
├── ack-lab.php
├── atlas.php
├── interoperability-lab.php
├── human-authority.php
├── what-is-a-kill-web.php
├── kill-chain-vs-kill-web.php
├── how-kill-webs-work.php
├── architecture.php
├── jadc2.php
├── ai-autonomy.php
├── security.php
├── procurement.php
├── risks-law.php
├── reports.php
├── methodology.php
├── sources.php
├── faq.php
├── glossary.php
├── privacy.php
├── terms.php
├── config/
│ ├── site.php
│ ├── routes.php
│ ├── security.php
│ └── publication.php
├── includes/
│ ├── bootstrap.php
│ ├── header.php
│ ├── footer.php
│ ├── seo.php
│ ├── components.php
│ ├── reports.php
│ └── security-headers.php
├── data/
│ ├── scenarios.php
│ ├── nodes.php
│ ├── capabilities.php
│ ├── programs.php
│ ├── sources.php
│ └── glossary.php
├── api/
│ ├── scenario.php
│ ├── graph.php
│ ├── reports.php
│ └── status.php
├── assets/
│ ├── css/
│ ├── js/
│ ├── img/
│ ├── models/
│ └── vendor/
│ └── three/
├── docs/
│ └── long-term-memory/
├── .uai/
│ ├── exports/
│ └── *.uai
├── scripts/
│ ├── index-docs.php
│ ├── build-discovery.php
│ └── verify-release.php
├── tests/
├── storage/
│ ├── cache/
│ └── logs/
├── robots.txt
├── sitemap.xml
├── llms.txt
├── manifest.webmanifest
└── .well-known/
├── security.txt
└── ai-ready.json
The runtime web-server account should have read access to code, assets, public reports, and generated indexes, but write access only to explicitly designated storage/cache and storage/logs directories. Public requests should never be allowed to modify code, .uai memory, reports, manifests, or configuration.
PHP architecture rules.
| Rule | Implementation |
|---|---|
| Server-render first | Every route returns useful semantic HTML before JavaScript executes |
| Single bootstrap | Define headers, configuration, error handling, nonce, and route metadata once |
| No framework dependency | Use PHP standard library and project-owned helpers |
| No database at launch | Use reviewed PHP arrays and generated JSON indexes |
| No public content editor | Publish through source-controlled files and release process |
| Read-only public APIs | Prefer GET; add writes only when a documented requirement exists |
| Strict typing | declare(strict_types=1) in PHP files |
| Output encoding | Use htmlspecialchars with explicit UTF-8 and quote flags |
| Path safety | Resolve reports by stable indexed ID, never by arbitrary request path |
| Error control | Generic public errors; detailed local logs without secrets |
| Configuration | Environment-specific secrets outside the repository; none in .uai |
| Dependency boundary | No Composer packages unless separately authorized |
JavaScript architecture rules.
| Rule | Implementation |
|---|---|
| Browser-native modules | Use <script type="module"> and local relative imports |
| No framework | Avoid React, Vue, Angular, jQuery, or remotely loaded components |
| Progressive enhancement | HTML forms, definitions, and fallback graph remain usable without JS |
| Stable controls | Every interactive node and action has an accessible name and state |
No eval | No dynamic code execution or arbitrary scenario scripts |
| Declarative scenarios | Load approved JSON/PHP-generated graph records only |
| Determinism | Seed scenario state from an explicit scenario ID |
| Worker isolation | Use local Web Workers only for graph calculations that need them |
| Reduced motion | Honor prefers-reduced-motion and expose a motion toggle |
| Storage minimization | Store only local scenario IDs, settings, and completion summaries |
| Failure recovery | Renderer errors reveal the HTML/SVG fallback, not a blank region |
UAIX recommends server-rendering or pre-rendering primary content, providing stable programmatic names for controls, and ensuring critical answers remain available outside canvas or post-load scripts. citeturn9view1turn9view3
Three-dimensional library decision.
| Library | Status | Recommendation |
|---|---|---|
| Three.js | Open-source JavaScript 3D library already used by KillChains.com | Preferred for v1 |
| Babylon.js | Open-source JavaScript 3D engine with a broader engine and tooling surface | Evaluate only for a future major release |
| No library / Canvas 2D / SVG | Native browser alternative | Required fallback path, not primary immersive renderer |
Three.js should be selected because it minimizes divergence from the supplied source and is sufficient for nodes, edges, labels, camera controls, picking, animation, WebGL, and optional WebXR. The approved distribution files should be copied into the repository and served from paths such as:
import * as THREE from '/assets/vendor/three/build/three.module.min.js';
import { OrbitControls } from '/assets/vendor/three/examples/jsm/controls/OrbitControls.js';
The build record should store:
- Upstream project name and version.
- Upstream source commit or release tag.
- License file.
- Exact locally deployed files.
- SHA-256 checksums.
- Review date.
- Known security advisories or open exceptions.
- Upgrade and rollback procedure.
No module import may resolve to cdn.jsdelivr.net, unpkg.com, cdnjs, Google-hosted libraries, or any other runtime origin. Official Three.js guidance allows project assets to live in a public/static folder; the local deployment should use that model rather than the documentation’s CDN alternative. citeturn7view8
Graph interaction model. The initial graph should use a controlled number of node types:
| Node type | Shape recommendation | Example content |
|---|---|---|
| Sensor | Circle | Observation capability and confidence |
| Edge processing | Hexagon | Filtering, correlation, local fusion |
| Data service | Rounded square | Track, metadata, capability catalog |
| Command or authority | Diamond | Approval and policy constraint |
| Communications relay | Small linked circles | Reachability and path quality |
| Effector | Triangle | Authorized synthetic effect capability |
| Assessment | Ring | Result and evidence feedback |
| Constraint | Shield or gate | Classification, authority, latency, capacity |
Edges should distinguish physical reachability, data compatibility, authorization, and current selection. A visible line must not imply that a pairing is lawful, sufficiently trusted, or currently available. The interface should therefore expose at least four states: technically possible, data-compatible, authorized, and selected.
Performance and size budgets. These are project acceptance targets, not doctrinal military latency requirements.
| Metric | Launch budget | Degradation rule |
|---|---|---|
| Initial compressed HTML | ≤ 75 KB | Split long reports into semantic sections |
| Critical compressed CSS | ≤ 35 KB | Defer noncritical visual effects |
| Non-3D initial JavaScript | ≤ 80 KB | Remove unused helpers |
| Initial 3D JavaScript | ≤ 250 KB compressed | Load only on interactive routes |
| Non-3D first-load transfer | ≤ 350 KB | Prefer SVG and system fonts |
| Interactive first-load transfer | ≤ 600 KB | Lazy-load models and optional controls |
| Total initial scene assets | ≤ 1.5 MB | Replace models with procedural geometry |
| Single texture | ≤ 256 KB | Resize and compress locally |
| PHP warm render time | ≤ 50 ms at application layer | Cache computed indexes |
| Same-origin JSON API p95 | ≤ 100 ms at application layer | Precompute public graph payloads |
| Target TTFB near host | ≤ 200 ms median; ≤ 500 ms p95 | Investigate hosting or cache misses |
| Largest Contentful Paint | ≤ 2.5 s at p75 | Start with HTML, not canvas initialization |
| Interaction to Next Paint | ≤ 200 ms at p75 | Move layout work to worker or lower node count |
| Cumulative Layout Shift | ≤ 0.1 | Reserve canvas and card dimensions |
| First meaningful 3D frame | ≤ 3 s on supported mid-range desktop | Display 2D fallback first |
| Active graph nodes | 250 normal-detail default | Reduce labels and effects above limit |
| Low-detail graph nodes | Up to 1,000 | Disable shadows, particles, and live labels |
| Frame rate | 60 fps target; 30 fps minimum | Dynamically reduce visual complexity |
| Main-thread task duration | Prefer < 50 ms | Chunk graph operations |
| Offline shell start | ≤ 1.5 s after cached visit | Exclude unvisited report bodies |
Caching strategy.
| Resource class | Browser and server policy |
|---|---|
| Hashed CSS, JS, images, and local vendor files | Cache-Control: public, max-age=31536000, immutable |
| PHP HTML | Cache-Control: no-cache with ETag or Last-Modified |
| Generated route and report indexes | Short cache, such as five minutes, with ETag |
| Public report pages | Revalidate; optionally cache visited pages in service worker |
| Private or administrative responses | Cache-Control: no-store |
| Error pages | Short or no cache |
| Service-worker script | no-cache so updates are detected |
| Web manifest and public AI discovery | Short cache with explicit version or digest |
Offline and edge behavior.
The service worker should be optional, versioned, and same-origin only. It should use:
- Cache-first for content-hashed static assets.
- Network-first for HTML.
- Stale-while-revalidate for previously visited public reports.
- No caching of administrative routes, session-bearing responses, security reports, or unpublished content.
- An explicit “Download this report for offline reading” control rather than automatically caching the entire research corpus.
- A visible offline state.
- No background synchronization to external services.
- A cache migration that deletes obsolete KillWebs cache versions but never touches KillChains.com, which is a separate origin.
The site must remain functional when WebGL, WebXR, service workers, local storage, or JavaScript are unavailable. The fallback should be an HTML/SVG graph summary, node table, selected pathway, alternatives, evidence table, and scenario transcript.
UAIX memory and /docs implementation
UAIX’s memory guidance is particularly compatible with this project because the supplied KillChains source already separates compact .uai state from durable /docs/long-term-memory/ records. UAIX states that hot .uai files should contain current accepted state rather than dated changelog material, while durable memory augments rather than replaces startup memory. citeturn7view1turn9view5
The required implementation principle is:
Every report lives under
/docs; every report has one stable indexed identity; every report appears in the long-term-memory pointer ledger; reviewed conclusions are promoted into the appropriate current.uairecord without copying full report bodies into startup memory.
Recommended /docs organization.
/docs/
├── README.md
├── reports-index.md
└── long-term-memory/
├── index.md
├── architecture/
│ ├── current-architecture.md
│ ├── route-and-component-map.md
│ ├── offline-and-cache-design.md
│ └── threat-model.md
├── decisions/
│ ├── active-decisions.md
│ ├── deferred-decisions.md
│ └── decision-log.md
├── implementation-history/
│ ├── release-line.md
│ ├── source-fork-audit.md
│ ├── uaix-validation.md
│ └── launch-readiness.md
├── research/
│ ├── research-boundaries.md
│ ├── source-routing.md
│ ├── terminology-authority.md
│ └── duplicate-and-supersession-register.md
├── reports/
│ ├── index.md
│ ├── KW-RPT-001-transition-and-ack.md
│ ├── KW-RPT-002-website-strategy.md
│ ├── KW-RPT-003-architecture.md
│ ├── KW-RPT-004-jadc2.md
│ ├── KW-RPT-005-security.md
│ ├── KW-RPT-006-ai-and-autonomy.md
│ ├── KW-RPT-007-procurement.md
│ ├── KW-RPT-008-chain-versus-web.md
│ └── KW-RPT-009-site-design-and-implementation.md
└── security/
├── public-content-boundary.md
├── data-retention.md
├── dependency-register.md
└── incident-response.md
If multiple uploaded reports cover the same theme but are substantively different, preserve each with its own stable ID and record the relationship. If two files have the same SHA-256 digest, retain one canonical file and enter the other filename in an alias or intake-disposition field. Do not issue two stable IDs for byte-identical copies.
Required .uai package.
| File | Status | KillWebs.com responsibility |
|---|---|---|
memory-maintenance.uai | Universal required | Memory lifecycle, writeback, validation, and protected paths |
identity.uai | Universal required | KillWebs.com name, namespace, owner, authority, and public/private boundary |
world-context.uai | Universal required | Observable repository, runtime, and verify-before-use rules |
totem.uai | Universal required | Protected project purpose and owner anchor |
taboo.uai | Universal required | Prohibited actions, secrets, operational-data, and publication constraints |
talisman.uai | Universal required | Governance and conflict-resolution behavior |
startup-packet.uai | Project required | Exact startup read order and first verification steps |
progress.uai | Universal required | Current milestone, blockers, proof, and next accepted action |
system-profile.uai | Project handoff | Hosting and runtime profile, with unknowns explicit |
receiver-brief.uai | Project handoff | Concise handoff state |
context.uai | Project | Audience, product purpose, scope, and priorities |
constraints.uai | Project | PHP/JS-only, local-only dependencies, public-safe content |
stack.uai | Code-bearing | Verified PHP, JS, CSS, server, and dependency versions |
architecture.uai | Code-bearing | Current components, routes, data flow, and boundaries |
coding-standards.uai | Code-bearing | PHP and JS rules |
test-plan.uai | Code-bearing | Automated and manual acceptance plan |
decisions.uai | Project | Accepted decisions separated from proposals |
memory.uai | Project | Compact synthesis and routing |
long-term-memory.uai | Durable-memory profile | Pointer to every report and durable record |
report-synthesis.uai | Content-triggered | Reviewed conclusions and publication state |
file-handoff.uai | File-intake profile | Intake paths and disposition rules |
intake-outcome-ledger.uai | File-intake profile | Accepted, rejected, deduplicated, or superseded files |
operations.uai | Deployment profile | Build, deploy, rollback, backup, and recovery |
next-recursive-prompt.uai | Code-bearing | Approved continuation scope |
index.uai | Package map | Read order, scope, pointers, and exports |
UAIX’s closed-file-state model requires each file to be classified as universal required, profile-required, content-triggered required, configuration-specific required, or out of scope. Code-bearing project packages require architecture, coding standards, and continuation records; .uai files are typed records for accepted context and evidence, not a substitute for human review or runtime controls. citeturn9view4
Distribution of KillWebs information across .uai memory.
| Information | Owning hot-memory record | Durable source |
|---|---|---|
| Domain, namespace, owner, authority | identity.uai | Legal and ownership record |
| Sister-site purpose | context.uai | This design report |
| PHP/JS-only constraint | constraints.uai | Accepted decision |
| No external hosted services | constraints.uai, taboo.uai | Security boundary |
| Local Three.js decision | stack.uai, decisions.uai | Dependency register |
| Server-rendered architecture | architecture.uai | Architecture report |
/docs report requirement | constraints.uai | Product requirement |
| Report index and hashes | long-term-memory.uai | /docs/.../reports/index.md |
| Reviewed research conclusions | report-synthesis.uai | Individual report files |
| Current implementation stage | progress.uai | Proof report |
| Reciprocal-link decision | decisions.uai | UX decision record |
| Public/unclassified boundary | constraints.uai, taboo.uai | Publication boundary |
| Build and rollback | operations.uai | Deployment runbook |
| Test requirements | test-plan.uai | Test results and release proof |
| AI-ready public artifacts | architecture.uai, operations.uai | Generated readiness report |
This meets the requirement that KillWebs information be distributed throughout memory without turning every .uai file into a duplicate report archive.
Example .uai/identity.uai.
---
uai: "1.0"
type: identity
status: current
package_id: killwebs-com
package_family: project-developer-handoff
---
# KillWebs.com identity
name: KillWebs.com
namespace: killwebs-com
canonical_origin: https://killwebs.com
sister_site: https://killchains.com
declared_profiles:
- project-handoff
- code-bearing
- long-term-memory
- file-handoff
sensitivity_boundary: public-unclassified-content-only
source_authority:
code: current repository and verified runtime
publication: reviewed public pages and approved reports
memory: current .uai records plus routed durable evidence
## Actor boundary
- Public users may read approved pages, reports, and read-only APIs.
- Public users may not write project memory, reports, configuration, or code.
- Build operators may regenerate indexes only through reviewed local scripts.
- No .uai file may contain credentials, private keys, access tokens, classified data,
CUI, operational coordinates, or private user data.
Example .uai/long-term-memory.uai.
---
uai: "1.0"
type: long-term-memory
status: current
package_id: killwebs-com
durable_root: ../docs/long-term-memory/
report_root: ../docs/long-term-memory/reports/
generated_export: exports/docs-index.json
---
# KillWebs.com long-term-memory pointer ledger
## Authority order
1. Current code, configuration, and observed runtime behavior.
2. Passing tests and current release proof.
3. Accepted decisions and current architecture.
4. Reviewed public reports and research synthesis.
5. Preserved research inputs, proposals, and superseded history.
## Report rules
- Every report must be below the configured report root.
- Every report must contain a unique `stable_id`.
- Every report must have a SHA-256 digest.
- Duplicate hashes must be deduplicated before release.
- Research-input status does not make a report current publication truth.
- Public exposure is controlled by `publication_status`.
<!-- GENERATED:REPORT-POINTERS:START -->
- KW-RPT-001
- title: From Kill Chain to Kill Web
- path: ../docs/long-term-memory/reports/KW-RPT-001-transition-and-ack.md
- authority: reviewed-analysis
- publication_status: public
- routed_to: [context.uai, report-synthesis.uai]
- KW-RPT-005
- title: Cybersecurity Vulnerabilities and Non-Kinetic Disruption
- path: ../docs/long-term-memory/reports/KW-RPT-005-security.md
- authority: research-input
- publication_status: internal-review
- routed_to: [constraints.uai, report-synthesis.uai]
<!-- GENERATED:REPORT-POINTERS:END -->
Example generated .uai/exports/docs-index.json.
{
"schema": "killwebs-doc-index/v1",
"package_id": "killwebs-com",
"report_root": "docs/long-term-memory/reports",
"reports": [
{
"id": "KW-RPT-001",
"title": "From Kill Chain to Kill Web",
"path": "docs/long-term-memory/reports/KW-RPT-001-transition-and-ack.md",
"sha256": "REPLACE_WITH_GENERATED_DIGEST",
"authority": "reviewed-analysis",
"review_status": "approved",
"publication_status": "public",
"topics": ["transition", "architecture", "DARPA ACK"],
"routed_to": ["context.uai", "report-synthesis.uai"]
}
]
}
Active .uai files should not become dated progress logs. Generated JSON may contain a generation time as release evidence, but current-state memory should route to the release record rather than repeat changing version numbers and dates. UAIX expressly warns against leaving stale date-log material or secrets in active portable memory. citeturn9view5
PHP report-indexing example. This CLI script enforces stable IDs, rejects symbolic links and duplicates, creates the JSON export atomically, and refreshes the generated pointer block in .uai/long-term-memory.uai.
<?php
declare(strict_types=1);
/**
* Usage:
* php scripts/index-docs.php
*
* Each Markdown report must contain metadata lines such as:
*
* stable_id: KW-RPT-001
* authority: reviewed-analysis
* review_status: approved
* publication_status: public
* topics: transition, architecture, DARPA ACK
*
* followed by a first-level Markdown heading.
*/
$projectRoot = realpath(dirname(__DIR__));
if ($projectRoot === false) {
fwrite(STDERR, "Unable to resolve project root.\n");
exit(1);
}
$reportsRoot = realpath(
$projectRoot . '/docs/long-term-memory/reports'
);
$exportPath = $projectRoot . '/.uai/exports/docs-index.json';
$ledgerPath = $projectRoot . '/.uai/long-term-memory.uai';
if ($reportsRoot === false || !is_dir($reportsRoot)) {
fwrite(STDERR, "Report directory is missing.\n");
exit(1);
}
const MAX_REPORT_BYTES = 8_388_608;
const START_MARKER = '<!-- GENERATED:REPORT-POINTERS:START -->';
const END_MARKER = '<!-- GENERATED:REPORT-POINTERS:END -->';
function readField(string $content, string $name, bool $required = true): ?string
{
$pattern = '/^' . preg_quote($name, '/') . ':\s*(.+?)\s*$/mi';
if (preg_match($pattern, $content, $matches) === 1) {
return trim($matches[1], " \t\n\r\0\x0B\"'");
}
if ($required) {
throw new RuntimeException("Missing required field: {$name}");
}
return null;
}
function readTitle(string $content): string
{
if (preg_match('/^#\s+(.+?)\s*$/m', $content, $matches) !== 1) {
throw new RuntimeException('Missing first-level Markdown title.');
}
return trim($matches[1]);
}
function atomicWrite(string $path, string $content): void
{
$directory = dirname($path);
if (!is_dir($directory) && !mkdir($directory, 0750, true) && !is_dir($directory)) {
throw new RuntimeException("Unable to create directory: {$directory}");
}
$temporary = tempnam($directory, '.tmp-');
if ($temporary === false) {
throw new RuntimeException("Unable to create temporary file for {$path}");
}
try {
if (file_put_contents($temporary, $content, LOCK_EX) === false) {
throw new RuntimeException("Unable to write temporary file.");
}
chmod($temporary, 0640);
if (!rename($temporary, $path)) {
throw new RuntimeException("Unable to replace {$path}");
}
} finally {
if (is_file($temporary)) {
@unlink($temporary);
}
}
}
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator(
$reportsRoot,
FilesystemIterator::SKIP_DOTS
)
);
$reports = [];
$seenIds = [];
$seenHashes = [];
foreach ($iterator as $file) {
if (!$file instanceof SplFileInfo || !$file->isFile()) {
continue;
}
if ($file->isLink()) {
throw new RuntimeException(
'Symbolic links are not permitted: ' . $file->getPathname()
);
}
if (strtolower($file->getExtension()) !== 'md') {
continue;
}
if ($file->getSize() > MAX_REPORT_BYTES) {
throw new RuntimeException(
'Report exceeds size limit: ' . $file->getFilename()
);
}
$absolutePath = $file->getRealPath();
if (
$absolutePath === false
|| !str_starts_with(
$absolutePath,
$reportsRoot . DIRECTORY_SEPARATOR
)
) {
throw new RuntimeException('Report escaped the approved root.');
}
$content = file_get_contents($absolutePath);
if ($content === false) {
throw new RuntimeException("Unable to read {$absolutePath}");
}
$id = readField($content, 'stable_id');
$title = readTitle($content);
$authority = readField($content, 'authority', false) ?? 'research-input';
$reviewStatus = readField($content, 'review_status', false) ?? 'unreviewed';
$publicationStatus = readField(
$content,
'publication_status',
false
) ?? 'internal-review';
$topicString = readField($content, 'topics', false) ?? '';
$topics = array_values(
array_filter(
array_map('trim', explode(',', $topicString))
)
);
if (!preg_match('/^KW-RPT-[0-9]{3,6}$/', $id)) {
throw new RuntimeException("Invalid stable ID: {$id}");
}
if (isset($seenIds[$id])) {
throw new RuntimeException(
"Duplicate stable ID {$id}: {$seenIds[$id]} and {$absolutePath}"
);
}
$hash = hash_file('sha256', $absolutePath);
if ($hash === false) {
throw new RuntimeException("Unable to hash {$absolutePath}");
}
if (isset($seenHashes[$hash])) {
throw new RuntimeException(
"Duplicate report content: {$seenHashes[$hash]} and {$absolutePath}"
);
}
$relativePath = 'docs/long-term-memory/reports/'
. str_replace(
DIRECTORY_SEPARATOR,
'/',
substr(
$absolutePath,
strlen($reportsRoot) + 1
)
);
$reports[] = [
'id' => $id,
'title' => $title,
'path' => $relativePath,
'sha256' => $hash,
'bytes' => $file->getSize(),
'authority' => $authority,
'review_status' => $reviewStatus,
'publication_status' => $publicationStatus,
'topics' => $topics,
];
$seenIds[$id] = $absolutePath;
$seenHashes[$hash] = $absolutePath;
}
usort(
$reports,
static fn(array $left, array $right): int =>
strcmp($left['id'], $right['id'])
);
$export = [
'schema' => 'killwebs-doc-index/v1',
'package_id' => 'killwebs-com',
'generated_at' => gmdate(DATE_ATOM),
'report_root' => 'docs/long-term-memory/reports',
'report_count' => count($reports),
'reports' => $reports,
];
$json = json_encode(
$export,
JSON_PRETTY_PRINT
| JSON_UNESCAPED_SLASHES
| JSON_UNESCAPED_UNICODE
| JSON_THROW_ON_ERROR
) . PHP_EOL;
atomicWrite($exportPath, $json);
$ledger = file_get_contents($ledgerPath);
if ($ledger === false) {
throw new RuntimeException("Unable to read {$ledgerPath}");
}
$pointerLines = [START_MARKER];
foreach ($reports as $report) {
$pointerLines[] = sprintf(
"- %s\n - title: %s\n - path: ../%s\n"
. " - sha256: %s\n - authority: %s\n"
. " - review_status: %s\n - publication_status: %s",
$report['id'],
$report['title'],
$report['path'],
$report['sha256'],
$report['authority'],
$report['review_status'],
$report['publication_status']
);
}
$pointerLines[] = END_MARKER;
$generatedBlock = implode("\n", $pointerLines);
$pattern = '/'
. preg_quote(START_MARKER, '/')
. '.*?'
. preg_quote(END_MARKER, '/')
. '/s';
if (preg_match($pattern, $ledger) !== 1) {
throw new RuntimeException(
'The long-term-memory ledger is missing generated markers.'
);
}
$updatedLedger = preg_replace(
$pattern,
$generatedBlock,
$ledger,
1
);
if (!is_string($updatedLedger)) {
throw new RuntimeException('Unable to update pointer ledger.');
}
atomicWrite($ledgerPath, $updatedLedger);
fwrite(
STDOUT,
sprintf("Indexed %d reports.\n", count($reports))
);
The public /reports.php controller should read only the generated index, reject records whose publication_status is not public, resolve the indexed path below the approved report root, and render Markdown through a project-owned limited parser or a deliberately restricted subset. It should never accept a raw filename or include arbitrary PHP based on a query parameter.
AI-ready public projection. UAIX expects a concrete evidence set including a public manifest, .well-known discovery, route inventory, readiness result, robots.txt, sitemap, advisory llms.txt, structured data, visible support boundaries, and targeted checks. These records should agree with human-visible canonical pages and must not expose private routes, secrets, or unsupported capabilities. citeturn9view0turn9view2turn9view3
Recommended generated outputs are:
/.well-known/ai-ready.json
/ai-ready-manifest.json
/route-inventory.json
/readiness-result.json
/content-index.json
/source-index.json
/llms.txt
/robots.txt
/sitemap.xml
The public records should state that KillWebs.com supports reading public content and public-safe JSON, but does not provide authentication, arbitrary tool execution, content mutation, targeting services, credential validation, operational planning, or automatic authority. Unsupported actions should produce a no-op response or a clear human-review instruction, not a fabricated capability. UAIX explicitly states that AI-ready records do not themselves authorize scraping, bypass policy, execute workflows, validate credentials, certify vendors, or prove safety. citeturn9view2
Security, privacy, compliance, and deployment
The site’s security objective is not military-system certification. It is to build a resilient public educational property whose implementation reflects the principles it discusses: least privilege, explicit trust boundaries, integrity, provenance, graceful degradation, local operation, and defensible publication controls.
Zero-trust application model.
| Resource | Trust decision | Required control |
|---|---|---|
| Public HTML | Publicly readable | Output encoding, CSP, integrity-aware build |
| Public JSON | Publicly readable but bounded | Explicit schema, content type, size limit, cache policy |
| Public reports | Read only when publication-approved | Stable-ID allowlist and report-root containment |
| Internal reports | Not public | Publication status enforcement and web-server denial |
.uai memory | Build-operator only | Outside public routing or explicit deny rules |
| Configuration | Process-local | Read-only filesystem, no public access |
| Build scripts | CLI operator only | Not reachable from HTTP |
| Cache directory | Runtime write | Separate ownership and non-executable mount |
| Logs | Security operator | Minimal collection, rotation, restricted access |
| Vendor libraries | Public read | Pinned versions, checksums, license inventory |
| Local progress | User’s browser only | No server upload, expiration and clear control |
| Public API actions | Read-only by default | Method allowlist, request limits, no implicit trust |
| Future write routes | Explicitly authorized | CSRF protection, origin validation, authentication, audit |
NIST describes zero trust as protecting resources rather than trusting network segments and recommends security and privacy controls covering access, audit, configuration, incident response, communications, integrity, supply chain, and privacy. citeturn7view5turn7view6
Security-header baseline.
<?php
declare(strict_types=1);
$nonce = rtrim(
strtr(base64_encode(random_bytes(18)), '+/', '-_'),
'='
);
header("Content-Security-Policy: "
. "default-src 'none'; "
. "script-src 'self' 'nonce-{$nonce}'; "
. "style-src 'self'; "
. "img-src 'self' data:; "
. "font-src 'self'; "
. "connect-src 'self'; "
. "worker-src 'self'; "
. "manifest-src 'self'; "
. "media-src 'self'; "
. "object-src 'none'; "
. "base-uri 'none'; "
. "form-action 'self'; "
. "frame-ancestors 'none'; "
. "upgrade-insecure-requests"
);
header('Strict-Transport-Security: max-age=31536000; includeSubDomains');
header('X-Content-Type-Options: nosniff');
header('Referrer-Policy: strict-origin-when-cross-origin');
header('Cross-Origin-Opener-Policy: same-origin');
header('Cross-Origin-Resource-Policy: same-origin');
header('Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=()');
The exact permissions policy may be relaxed only on an explicitly approved WebXR route. A strong CSP should restrict remote scripts, inline execution, framing, object loading, and external form submission. OWASP recommends delivering CSP as an HTTP response header, using nonce- or hash-based policies where inline scripts are unavoidable, and using frame-ancestors, form-action, object-src, and same-origin fetch restrictions as defense-in-depth controls. citeturn8search0turn8search1
Session policy. The public launch should not need PHP sessions. If a future administrative area uses them, PHP’s official security guidance supports cookie-only sessions, strict mode, HTTP-only cookies, secure transport, and an appropriate SameSite setting. citeturn7view7
Recommended settings are:
session.use_only_cookies = 1
session.use_strict_mode = 1
session.cookie_httponly = 1
session.cookie_secure = 1
session.cookie_samesite = "Strict"
session.cookie_lifetime = 0
session.use_trans_sid = 0
Local-only privacy model.
| Data class | Storage | Retention | Server transmission |
|---|---|---|---|
| Completed scenario IDs | Browser local storage | User-controlled; recommended 180-day expiry | Never |
| User-selected settings | Browser local storage | Until cleared or expired | Never |
| Reduced-motion preference | Browser local storage or browser media query | Until changed | Never |
| Scenario evidence selections | In-memory during session | End of session unless user saves locally | Never |
| Downloaded report cache | Browser Cache Storage | Versioned; user-clearable | Retrieved from same origin only |
| IP address in web-server logs | Server log if operationally necessary | Minimum practical retention | No third-party transfer |
| User agent | Avoid or truncate unless needed for diagnostics | Short retention | No third-party transfer |
| Query strings | Do not log when they may contain sensitive state | Not retained | No third-party transfer |
| Headset pose, gaze, voice, exact location | Do not collect | None | Never |
The privacy page should name every storage key, its purpose, approximate size, expiration behavior, and clear mechanism. It should explicitly state that no learning record is synchronized between KillChains.com and KillWebs.com.
OWASP advises excluding session identifiers, tokens, credentials, keys, sensitive personal data, and higher-classification material from logs, and applying deletion, masking, sanitization, hashing, or encryption where identifiers are unnecessary. citeturn8search3
File and publication controls.
No public file-upload feature should exist in the first release. Reports should enter through a controlled source repository or local administrative process. If uploads are added later, they should be stored outside the web root, renamed to server-generated identifiers, size-limited, type-allowlisted, scanned, protected against CSRF, and made public only through an indexed retrieval handler. OWASP specifically recommends storing uploaded files outside the web root where possible and mapping public access through application-controlled identifiers. citeturn8search2turn8search9
The /docs directory may remain in the repository root while the web server applies one of two models:
| Model | Description | Recommendation |
|---|---|---|
| Repository docs outside public document root | Web root points to /public and PHP reads approved reports from ../docs | Best security model |
| Root deployment compatibility | /docs is physically under the document root but direct access is denied; reports.php serves allowlisted files | Acceptable when matching KillChains packaging |
.uai/, config/, scripts/, tests/, .git/, storage logs, source maps, backup archives, environment files, and internal /docs subtrees must be denied at the web-server level.
Content-sensitivity boundary.
KillWebs.com should publish only material approved for unrestricted public release. The following must be prohibited from reports, scenario data, .uai, JSON indexes, logs, and source control:
- Classified information.
- Controlled unclassified information unless the hosting environment is specifically authorized.
- Real-time or tactically precise force locations.
- Real target packages or operational target data.
- Credentials, keys, tokens, or private endpoints.
- Nonpublic vulnerability details that enable exploitation.
- Weapon-design parameters or instructions.
- Operational rules of engagement.
- Personally identifiable information not required for public authorship.
- Unreviewed claims presented as official doctrine or fielded capability.
If future requirements include CUI, classified data, partner-restricted information, or real operational feeds, the proposed public PHP website is not an acceptable continuation environment. That would require a separate system boundary, authorization process, identity architecture, logging policy, data handling rules, and likely an accredited hosting environment.
DoD data guidance emphasizes architecture, standards, governance, and making data visible, accessible, understandable, linked, trustworthy, interoperable, and secure. Those principles are useful publication analogies, but KillWebs.com must not imply that adopting them makes the site a DoD system or grants compliance certification. citeturn5search1
Dependency and supply-chain controls.
| Control | Requirement |
|---|---|
| Dependency count | One approved 3D dependency at launch |
| Runtime origins | Same origin only |
| Vendor directory | Committed locally with license and checksums |
| Upgrade review | Manual review, test, and release note |
| Lock record | Version, tag, source digest, deployed-file digests |
| Build tools | May be used locally, but generated runtime must not depend on hosted services |
| Source maps | Exclude from production or review for source disclosure |
| SBOM | Maintain a simple machine-readable dependency inventory |
| Integrity test | Release verification compares deployed hashes |
| Rollback | Keep prior approved vendor bundle and asset manifest |
Build and deployment checklist.
| Gate | Required evidence |
|---|---|
| Ownership | Written confirmation of domain, code, content, and reciprocal-link authority |
| Source baseline | Supplied v1.6.0 package unpacked, hashed, and recorded |
| Identity replacement | No unintended KillChains.com name, URL, cookie, cache, or schema ID remains |
| External-request test | Browser test confirms zero required external runtime requests |
| Three.js localization | Module, add-ons, license, version, and hashes stored locally |
| Route inventory | Every public route appears in config, sitemap, and readiness records |
| Report inventory | Every report has stable ID, digest, review state, and .uai pointer |
| Duplicate check | No duplicate report hashes or conflicting stable IDs |
| Publication boundary | Internal reports cannot be retrieved publicly |
| PHP static checks | Syntax validation and strict-type checks pass |
| JavaScript checks | Module imports resolve locally; no eval or remote imports |
| Link tests | Internal and reciprocal links return expected status |
| Accessibility | Keyboard, screen-reader naming, focus, contrast, reduced motion, and fallback tested |
| Canvas fallback | Every 3D route has a complete non-canvas representation |
| Performance | Transfer, render, interaction, and scene budgets pass |
| Offline | Cached shell works; stale content and version transitions are visible |
| Security headers | CSP, HSTS, MIME, referrer, frame, cross-origin, and permissions policies verified |
| Session state | Public routes create no session cookie |
| Storage review | All browser keys documented and clearable |
| Logging review | No tokens, full query strings, or unnecessary PII |
| Error review | Production errors expose no stack traces, paths, or configuration |
| Robots and sitemap | Public-safe and consistent with canonical routes |
| AI-ready artifacts | Manifest, discovery, route inventory, readiness result, llms.txt, and support boundaries agree |
| Structured data | Matches visible content and verified ownership |
| Security contact | security.txt valid and monitored |
| Backup | Source, reports, .uai, and release artifacts backed up and restorable |
| Rollback | Prior release can be restored without database migration |
| Staging approval | Product, security, accessibility, and editorial owners sign off |
| Reciprocal links | Both sites link accurately, or one-sided limitation is documented |
| Production proof | Post-deploy crawl, hash, headers, routes, and external-request tests pass |
Delivery roadmap and acceptance criteria
A twelve-week delivery is realistic for a disciplined first release that reuses the supplied PHP shell while rebuilding the content, graph model, identity, security configuration, and memory records.
gantt
title KillWebs.com implementation roadmap
dateFormat YYYY-MM-DD
axisFormat %b %d
section Foundation
Ownership and source audit :a1, 2026-08-03, 5d
Requirements and architecture decisions :a2, after a1, 5d
Repository fork and identity reset :a3, after a2, 5d
section Product and content
Information architecture and route map :b1, 2026-08-10, 10d
Report deduplication and source review :b2, 2026-08-10, 15d
Canonical content drafting :b3, after b1, 20d
section Engineering
Shared PHP shell and theme :c1, 2026-08-17, 10d
Graph data model and local Three.js :c2, after c1, 15d
Explorer and resilience scenarios :c3, after c2, 15d
ACK and interoperability labs :c4, 2026-09-07, 15d
section Memory and discovery
Docs hierarchy and stable report IDs :d1, 2026-08-17, 10d
UAIX memory rebuild :d2, after d1, 15d
AI-ready public artifacts :d3, after d2, 10d
section Assurance
Security and privacy hardening :e1, 2026-09-21, 10d
Accessibility and performance testing :e2, 2026-09-28, 10d
Editorial and source verification :e3, 2026-09-28, 10d
section Release
Staging and reciprocal links :f1, 2026-10-12, 5d
Acceptance and remediation :f2, after f1, 5d
Production release :milestone, f3, 2026-10-26, 1d
Milestones and exit criteria.
| Milestone | Target outcome | Exit criteria |
|---|---|---|
| Baseline approved | Legal and technical right to proceed | Ownership, hosting, source baseline, and public-content boundary confirmed |
| Architecture frozen | Implementation model agreed | Routes, file tree, dependency boundary, data model, and performance budgets approved |
| Identity-clean fork | No accidental shared state | Automated scan finds no stale canonical URL, cookie, cache, or storage identifiers |
| Content corpus normalized | Reports are manageable and traceable | Duplicates removed, stable IDs assigned, hashes recorded, review state set |
| PHP shell complete | Sister layout works without 3D | All routes render semantic HTML and mobile navigation |
| Interactive alpha | Graph is usable | Keyboard selection, text fallback, deterministic state, and local modules work |
| ACK Lab complete | Capability marketplace is understandable | Users can inspect offers, constraints, alternatives, and limitations |
| UAIX complete | Memory is current and routed | Required files pass scope/read-order checks; every report is referenced |
| AI-ready evidence complete | Public machine records align with pages | Route inventory, manifest, readiness result, sitemap, robots, and llms.txt agree |
| Security complete | No known critical launch blocker | Headers, access boundaries, report controller, logs, and local-only operation pass |
| Accessibility complete | Core tasks are usable without canvas or pointer | Keyboard, screen-reader, reduced-motion, contrast, and fallback tests pass |
| Performance complete | Budgets are met | Measured p75/p95 and transfer sizes satisfy approved thresholds |
| Staging approved | Production candidate is stable | Editorial, product, security, and ownership sign-off |
| Production verified | Live deployment matches release evidence | Post-deploy crawl, hashes, routes, headers, and external-request tests pass |
Minimum launch acceptance criteria.
| Domain | Pass condition |
|---|---|
| Product identity | KillWebs.com is clearly distinct but recognizably related to KillChains.com |
| Reciprocal navigation | Each site links to the other with accurate explanatory context |
| Technology | Runtime uses PHP and browser JavaScript only, plus locally hosted approved Three.js files |
| External services | No required runtime request leaves KillWebs.com |
| Content | Canonical definitions distinguish web, chain, JADC2, ACK, AI support, and authority |
| Reports | Every report is under /docs, indexed, hashed, and referenced in .uai memory |
| UAIX | Universal and project-required files exist, are current, and use the approved read order |
| AI-ready web | Human-visible pages and machine-readable projections express the same claims |
| Accessibility | Primary content and tasks remain usable without JavaScript or WebGL |
| Privacy | No account, tracking profile, cross-site state, or server-side learning history |
| Security | Public users cannot write files, execute scripts, traverse paths, or retrieve private memory |
| Performance | Initial page and 3D budgets pass on representative desktop and mobile hardware |
| Resilience | Offline shell and fallback content work after a supported prior visit |
| Governance | Publication owner, review date, correction route, and limitations are visible |
| Classification | Release corpus is affirmatively approved for public, unclassified publication |
The governing product principle should remain visible throughout the implementation:
KillChains.com explains how a selected sequence progresses and where it can be interrupted. KillWebs.com explains how multiple authorized sequences can be composed, compared, degraded, and recomposed without confusing connectivity with authority, confidence, or legality.
That distinction gives the two properties a coherent relationship while preventing KillWebs.com from becoming a renamed duplicate. It also aligns with the uploaded research consensus that the chain remains the execution path while the web supplies the changing option space around it. fileciteturn0file7 fileciteturn0file11