From 01bed2d05df0f216e6ef80e34f448f9bcda46376 Mon Sep 17 00:00:00 2001 From: Imran Siddique Date: Wed, 9 Sep 2026 10:28:07 -0700 Subject: [PATCH] fix(wcm): redirect /wcm/ to the single WCM home agentrust-io.com/wcm/ and wcm.agentrust-io.com were two different homepages for one project. Both returned 200, both were indexable, both set canonical to themselves, and they disagreed: this page pinned SDK 0.27.0 from a proof.json captured on 2026-09-07, while the docs site was on 0.28.1. This page existed because the WCM repository was private and GitHub Pages cannot publish a private repo on the free plan, so wcm.agentrust-io.com was a Cloudflare 307 to here. The repo went public and that rule is gone, so the subdomain now serves the project's own MkDocs site and this address had nothing left to be. wcm.agentrust-io.com is the home. This file becomes a redirect: canonical, instant meta refresh, and location.replace() so Back does not bounce, with a visible link if both are blocked. The launch page's content moved to the docs home in weight-custody-manifest, which is where it can stay accurate. og-launch.png stays in this directory and og:image still points at it, so cards already shared against agentrust-io.com/wcm/og-launch.png keep resolving. og:url and canonical point at the docs home, so a share of either address resolves to one card. Repointed everything that linked through the hop: supernav.js (WCM now targets its own host like every other subdomain; the /wcm path branch stays so the stub highlights correctly for the instant it is on screen), llms.txt in two places, and sitemap.xml, which should not advertise a redirecting URL. The sitemap edit agrees with build-discovery.py --check, because that generator reads canonical and this page's canonical is now off-site. launch-page.test.js becomes redirect.test.js: it asserts the three ways out, a single off-site canonical, that og-launch.png stays, and a 6KB ceiling so content cannot quietly grow back here. The SDK numbers it used to gate are gated in weight-custody-manifest now, by a test that counts the actual conformance vectors; proof.json could not see that repo, which is why it went stale. check-site, check-dashes, build-discovery --check, check-discovery and marketplace tests pass locally. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_0193nB52LNx2WqtFRMf7PFYJ --- .../{wcm-launch-page.yml => wcm-redirect.yml} | 10 +- llms.txt | 4 +- sitemap.xml | 1 - supernav.js | 10 +- wcm/index.html | 313 ++---------------- wcm/launch-page.test.js | 66 ---- wcm/proof.json | 11 - wcm/redirect.test.js | 75 +++++ 8 files changed, 123 insertions(+), 367 deletions(-) rename .github/workflows/{wcm-launch-page.yml => wcm-redirect.yml} (66%) delete mode 100644 wcm/launch-page.test.js delete mode 100644 wcm/proof.json create mode 100644 wcm/redirect.test.js diff --git a/.github/workflows/wcm-launch-page.yml b/.github/workflows/wcm-redirect.yml similarity index 66% rename from .github/workflows/wcm-launch-page.yml rename to .github/workflows/wcm-redirect.yml index 34ef83c..f60fabe 100644 --- a/.github/workflows/wcm-launch-page.yml +++ b/.github/workflows/wcm-redirect.yml @@ -1,21 +1,21 @@ -name: WCM launch page +name: WCM redirect on: pull_request: paths: - "wcm/**" - - ".github/workflows/wcm-launch-page.yml" + - ".github/workflows/wcm-redirect.yml" push: branches: [main] paths: - "wcm/**" - - ".github/workflows/wcm-launch-page.yml" + - ".github/workflows/wcm-redirect.yml" permissions: contents: read jobs: - evidence: + redirect: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -24,4 +24,4 @@ jobs: - uses: actions/setup-node@v4 with: node-version: "22" - - run: node wcm/launch-page.test.js + - run: node wcm/redirect.test.js diff --git a/llms.txt b/llms.txt index 8ba7733..7e498e3 100644 --- a/llms.txt +++ b/llms.txt @@ -8,7 +8,7 @@ AgenTrust is the ecosystem at https://agentrust-io.com and the GitHub organizati - [Overview and architecture](https://agentrust-io.com/): The components, trust boundaries, governance, and evidence links. - [10-minute tool-call tutorial](https://agentrust-io.com/quickstart/): Write a policy, observe a denied call, and inspect a signed session record on a laptop. Software mode provides no hardware isolation or hardware-backed provenance. -- [Weight Custody Manifest (WCM)](https://agentrust-io.com/wcm/): Bind model-weight identity and custody terms to key-release policy. The local walkthrough uses synthetic evidence and a placeholder key; it does not load a real model or demonstrate hardware protection. +- [Weight Custody Manifest (WCM)](https://wcm.agentrust-io.com/): Bind model-weight identity and custody terms to key-release policy. The local walkthrough uses synthetic evidence and a placeholder key; it does not load a real model or demonstrate hardware protection. - [Runnable demos](https://agentrust-io.com/demos/): Software examples for policy decisions, evidence verification, delegation, and model-weight custody. Follow each demo's stated prerequisites and limits. - [Marketplace search](https://agentrust-io.com/marketplace/): Find integrations by framework, technology, and use case. - [Complete marketplace catalog](https://agentrust-io.com/marketplace/catalog/): Dated integration descriptions and source links, readable without JavaScript or external catalog requests. Listings do not establish endorsement, certification, or hardware validation. @@ -19,7 +19,7 @@ AgenTrust is the ecosystem at https://agentrust-io.com and the GitHub organizati - [Confidential MCP (cMCP)](https://cmcp.agentrust-io.com/): Evaluates routed tool calls against policy and records the decisions. Hardware deployments place the runtime inside a Trusted Execution Environment; confidentiality also depends on egress policy and deployment configuration. The agent and upstream tool server are separate boundaries. - [Confidential A2A (cA2A)](https://ca2a.agentrust-io.com/): A developer-preview trust profile for Agent2Agent delegation, with attenuated authority, attestation, sealed channels, and provenance. Assurance depends on the evidence and checks performed by the deployment. - [TRACE](https://trace.agentrust-io.com/): Portable, signed runtime evidence. Hardware provenance requires attestation verification against a trusted root. A signature alone does not establish hardware origin or the truth of all recorded claims. -- [WCM public SDK and demos](https://agentrust-io.com/wcm/): Public evaluation path for weight custody. Key release, encrypted artifact delivery, runtime leases, and key-copy handling are separate responsibilities. The specification is in pre-standardization review; use the public material linked from this page. +- [WCM public SDK and demos](https://wcm.agentrust-io.com/): Public evaluation path for weight custody. Key release, encrypted artifact delivery, runtime leases, and key-copy handling are separate responsibilities. The specification is in pre-standardization review; use the public material linked from this page. - [AgenTrust Telemetry](https://agentrust-io.com/telemetry/): An alpha, backend-neutral event contract and reference SDKs for governance facts, caller-owned OpenTelemetry, and evidence finalization. It is not a policy engine or a proof that recorded events are true. - [TRACE Registry](https://agentrust-io.com/registry/): Public anchors and signed checkpoints for offline verification. Inclusion, a signer's stated time, independent time evidence, and consistency of log history are different checks. A registry entry does not validate a record's claims. - [Agentic controls](https://agentrust-io.com/go/): Thirty requirements with stable individual permalinks and OpenCRE mappings. A mapping is not certification or a conformance result. diff --git a/sitemap.xml b/sitemap.xml index 52fe180..d482449 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -9,5 +9,4 @@ https://agentrust-io.com/quickstart/ https://agentrust-io.com/registry/ https://agentrust-io.com/telemetry/ - https://agentrust-io.com/wcm/ diff --git a/supernav.js b/supernav.js index d53384d..62631cd 100644 --- a/supernav.js +++ b/supernav.js @@ -18,7 +18,7 @@ { id: 'manifest', label: 'Manifest', url: 'https://manifest.agentrust-io.com', ext: false }, { id: 'cmcp', label: 'cMCP', url: 'https://cmcp.agentrust-io.com', ext: false }, { id: 'ca2a', label: 'cA2A', url: 'https://ca2a.agentrust-io.com', ext: false }, - { id: 'wcm', label: 'WCM', url: 'https://agentrust-io.com/wcm/', ext: false }, + { id: 'wcm', label: 'WCM', url: 'https://wcm.agentrust-io.com', ext: false }, { id: 'governance', label: 'Governance', url: 'https://governance.agentrust-io.com', ext: false }, { id: 'agt', label: 'AGT', url: 'https://github.com/microsoft/agent-governance-toolkit', ext: true }, { id: 'github', label: 'GitHub', url: 'https://github.com/agentrust-io', ext: true } @@ -26,9 +26,11 @@ var HOST = location.hostname; var PATH = location.pathname; - // Quickstart, demos, telemetry, registry, and (today) WCM live under the - // apex host, so the active item cannot be resolved from the hostname alone - // the way every other entry can. + // Quickstart, demos, telemetry and registry live under the apex host, so the + // active item cannot be resolved from the hostname alone the way every other + // entry can. The /wcm branch below stays for the redirect stub still served + // at agentrust-io.com/wcm/: it highlights WCM for the instant before the + // reader is moved to wcm.agentrust-io.com. var CURRENT_ID = (HOST === 'agentrust-io.com' && PATH.indexOf('/quickstart') === 0) ? 'quickstart' : (HOST === 'agentrust-io.com' && PATH.indexOf('/demos') === 0) ? 'demos' diff --git a/wcm/index.html b/wcm/index.html index aff7fb3..9cc838f 100644 --- a/wcm/index.html +++ b/wcm/index.html @@ -4,309 +4,66 @@ Weight Custody Manifest | AgenTrust - - - + + + + + + - - - + + - - + - - - - + - - -
- Release · Attest · Revoke -

Make model-weight release
conditional on an approved runtime

-

Weight Custody Manifest (WCM) binds model weights to a signed release policy. Its reference SDK checks a workload's evidence before releasing a key and models renewable authorization. Start with a local allow/deny example, then evaluate the hardware and operator assumptions for your deployment.

- -
Pre-1.0 · Example tested with SDK 0.27.0 · Software demo, no hardware isolation
-

The specification, SDK and conformance suite are public. Read the documentation or contribute on GitHub.

-
-
- -
- -

Checked with the published 0.27.0 package: 32 L1, 37 L2, 12 L3, and 10 L4 vectors pass. This is the reference implementation's self-test, not independent certification or a hardware deployment test. The runner prints its uncovered cases.

-
- -
- The problem -

The threat model flips when the model leaves your data center

-

Most deployment security is framed around protecting the customer from the model and its operator. Deploy a frontier model into a customer's own infrastructure, a sovereign cloud, or an air-gapped facility and an additional risk appears: the builder's weights now sit on hardware someone else owns and operates.

-

WCM answers one question: can a model builder release encrypted weights only to an approved workload, keep that approval short-lived, and retain evidence of what happened? The answer is yes for the reference protocol and the software checks, with one boundary stated plainly rather than buried, which you will find further down this page.

-
- -
- The moment that matters -

Change the evidence. The key stays closed.

-

The closed-weight example supplies an approved serving measurement, then changes it. These are selected output lines from the software demo below. It uses mock evidence and a placeholder key; it does not load a real model or demonstrate hardware isolation, sealed transport, or expiry.

-
-
python demo-07-closed-weight/run.py
-
-
manifest signature : True
-
approved enclave : key released = True
-
unapproved enclave : key released = False
-
why : measurement not in accepted_measurements
-
-
-
- -
- Where it fits -

One custody contract, three deployment pressures

-
-
01

Sovereign deployment

Run a closed model inside nationally controlled infrastructure while making weight release conditional on an approved, attested workload.

-
02

Enterprise and air-gapped

Deliver encrypted weights to customer-operated environments without turning a one-time handoff into permanent authorization.

-
03

Regulated model delivery

Carry signed policy, release decisions, renewal state, revocation, and derivative lineage as portable evidence.

-
-
- -
- How it works -

Six steps in a protected deployment

-
- -
-
1
-
-

The builder signs a manifest

-

Encrypted weights, plus a signed manifest naming the exact weight and approved-workload measurements.

-
-
- -
-
2
-
-

The workload asks for a challenge

-

A protected workload requests a fresh, single-use challenge from the key broker.

-
-
- -
-
3
-
-

Attestation binds the request

-

CPU attestation, and GPU attestation where required, binds that challenge, the workload measurement, and an ephemeral transport key to the current launch.

-
-
- -
-
4
-
-

The broker checks independently

-

The broker must authenticate the manifest and verify the required certificate chains, signatures, revocation state, measurements, freshness, and channel binding. A structural check of mock evidence does not establish hardware provenance.

-
-
- -
-
5
-
-

The broker seals the key to the workload

-

With channel binding configured, a successful release seals the model key to the attested transport key. The receiving workload opens it inside its protected boundary. The local example does not configure this transport path.

-
-
- -
-
6
-
-

Authorization expires

-

The runtime must enforce renewal deadlines and stop serving on lapse. Wiping the managed key buffer cannot erase plaintext or key copies that escaped that buffer. Production enforcement requires a trusted time source and control of the serving runtime.

-
-
- -
-
- -
- Trust path -

Separate artifact delivery from key release

-

Artifact path: the builder distributes encrypted weights and a signed manifest to the workload. The key broker holds or controls the decryption key separately.

-
-
RequestWorkloadGet broker challenge
Bind evidence to challenge and transport key
- -
DecisionKey brokerCheck trusted manifest and evidence
Deny on mismatch
- -
ResponseSame workloadOpen key sealed to its transport key
Renew authorization or stop
-
-

This is the intended hardware deployment path. The workload's protected boundary, quote verification, channel binding, trusted time, and stop/wipe behavior must be configured and validated. The local demo runs broker and workload logic in one ordinary Python process.

-
- -
- Try it -

The reference SDK is already installable

-

Use Python 3.11+ and Git. This example needs no cloud account, GPU, model download, or API key. Keep WCM in its own environment because other AgenTrust packages may require a different cryptography version.

- -
- -
-
1
-
-

Install from PyPI

-
-
Terminal
-
python -m venv .venv-wcm
-
-

Activate it with source .venv-wcm/bin/activate in Bash, or .venv-wcm\Scripts\Activate.ps1 in PowerShell. Then install the version used here:

-
-
Terminal
-
python -m pip install "weight-custody-manifest==0.27.0"
-
-
-
- -
-
2
-
-

Run the portable conformance suite

-

Expected: L1 32/32, L2 37/37, L3 12/12, and L4 10/10 PASS. CPU quote vectors use synthetic certificate roots; GPU cryptographic verification is not covered by these vectors. Read the printed NOT COVERED lines.

-
-
Terminal
-
wcm conformance
-
-
-
- -
-
3
-
-

Run the closed-weight allow/deny example

-

Run the script directly using the active WCM environment. It needs only the WCM SDK installed above.

-
-
Terminal
-
git clone https://github.com/agentrust-io/demos
-cd demos
-python demo-07-closed-weight/run.py
-
-

Expected: joint signature True, approved release True, then unapproved release False because the measurement is not accepted. Both cases use synthetic attestation; labels such as "enclave" in the output do not mean hardware was used.

-

Next, run python demo-06-weight-custody/run.py for checkpoint integrity, python demo-08-derivative-lineage/run.py for lineage, or python demo-09-sovereign-threshold/run.py for quorum reconstruction.

-
-
- -
- -
- Reference SDK on PyPI - Runnable demos - Integration examples -
-
- -
- Honest scope -

What the demo proves, and what deployment requires

-

The local run demonstrates signature verification and release-policy decisions with mock evidence. Protecting real model weights requires a separately validated hardware deployment.

- - - - - - -
AgainstWhat you get
Local software demoChecks the reference protocol in an ordinary process. The operator can inspect its memory. Mock attestation provides no hardware-rooted confidentiality.
Protected runtimeRequires verified platform evidence, trusted keys, channel binding, workload isolation, and enforced renewal. Platform configuration, firmware, side channels, and the serving application's export paths affect the result.
Physical hardware ownerDo not assume weight extraction is impossible. Published physical attacks motivate additional hardening and operator assumptions. A valid signature alone cannot distinguish an authorized key from an extracted one.
- -

Assess the complete deployment. The RAND weight-security report provides threat-model context; it is not a certification of WCM. Passing the reference suite does not assign a deployment an attacker-resistance tier.

- -

The published SDK includes hardware-specific verification paths and recorded-fixture tests. The portable conformance run above uses synthetic CPU quote evidence and excludes GPU cryptographic verification. Neither it nor the demo validates your hardware, protected-memory sweep, or production zeroization. Review the package's hardware notes and validate those properties on the target runtime.

- -
- -
- Build with us -

Four ways into the release

-
-

Model owners

Evaluate a closed-weight deployment and pressure-test the release policy against your actual threat model.

Evaluate a deployment →
-

Runtime and cloud teams

Add or review an attestation profile and prove what your protected boundary can support.

Contribute a profile →
- -

Standards contributors

Review the manifest, portable evidence, conformance levels, and interoperability boundaries.

Join the review →
-
-
- -
- Status -

Public source and documentation

-

Available publicly: the Python SDK on PyPI, its bundled conformance vectors, the demos repository, and integration examples. The instructions above use SDK 0.27.0; later releases may change the API or expected results.

-

Public since September 8, 2026: the specification repository includes the source, schemas, conformance suite, threat model and contribution guide. Browse the documentation. WCM remains pre-1.0; public availability does not establish production readiness.

-

Open protocol, implementation ecosystem. The specification, schema, conformance suite, reference SDK, threat model, and reference key-release service are available under Apache-2.0. Vendors may build interoperable hosted services and protected-runtime implementations.

-
- Install the SDK - Browse the source -
-
- +
+ Moved +

Weight Custody Manifest

+

WCM now lives at wcm.agentrust-io.com, with the specification, SDK, conformance suite and threat model in agentrust-io/weight-custody-manifest.

+

If your browser did not move you automatically, open the documentation.

+
-
-
-
- AgenTrust -
Open standards for AI agent governance
-
- -
Independent open-source project. OPAQUE Systems provides funding, engineering time, infrastructure, and confidential-computing contributions as a founding sponsor. Sponsorship does not confer ownership or governance authority.
-
- -
- - - diff --git a/wcm/launch-page.test.js b/wcm/launch-page.test.js deleted file mode 100644 index 40f2d79..0000000 --- a/wcm/launch-page.test.js +++ /dev/null @@ -1,66 +0,0 @@ -'use strict'; - -const assert = require('node:assert/strict'); -const fs = require('node:fs'); -const path = require('node:path'); - -const here = __dirname; -const html = fs.readFileSync(path.join(here, 'index.html'), 'utf8').replace(/\r\n/g, '\n'); -const css = fs.readFileSync(path.join(here, '..', 'design-system.css'), 'utf8'); -const proof = JSON.parse(fs.readFileSync(path.join(here, 'proof.json'), 'utf8')); - -assert.match(html, new RegExp(`${proof.sdk_version.replace('.', '\\.')}`)); -assert.match(html, new RegExp(`${proof.conformance_vectors}`)); -assert.equal(Object.values(proof.conformance_levels).reduce((sum, count) => sum + count, 0), proof.conformance_vectors); -for (const [level, count] of Object.entries(proof.conformance_levels)) { - assert.ok(html.includes(`${level} ${count}/${count}`), `${level} result must match captured output`); -} -assert.ok(html.includes(proof.package_url), 'evidence must link to the tested public package'); -assert.ok(html.includes(`weight-custody-manifest==${proof.sdk_version}`), 'installation must pin the tested version'); -assert.ok(html.includes(`
git clone https://github.com/agentrust-io/demos\ncd demos\n${proof.demo_command}
`)); -assert.equal(proof.hardware_executed, false); -assert.ok(!html.includes('wcm release --explain'), 'do not publish a nonexistent CLI command'); -assert.ok(html.includes('placeholder key'), 'the demo must disclose its synthetic key'); -assert.ok(html.includes('self-test, not independent certification or a hardware deployment test')); - -assert.ok(!html.includes('None protect the builder'), 'avoid an unsupported novelty absolute'); -assert.ok(!html.includes('Open core.'), 'launch copy must describe the open surface precisely'); -assert.ok(html.includes('Sponsorship does not confer ownership or governance authority')); -// The two open limitations must stay disclosed. This used to assert the issue -// links were present, which is how six dead links survived on a public page: the -// tracker is private, so every one of them 404s for the readers this page is -// for. The disclosure is what matters, not the hyperlink, so assert the prose. -assert.ok( - html.includes('Neither it nor the demo validates your hardware, protected-memory sweep, or production zeroization'), - 'the memory-sweep limitation must stay disclosed' -); -assert.ok( - html.includes('Wiping the managed key buffer cannot erase plaintext or key copies that escaped that buffer'), - 'the zeroization limitation must stay disclosed' -); - -// Public launch links must replace the pre-release availability notice. -assert.ok(html.includes('https://github.com/agentrust-io/weight-custody-manifest')); -assert.ok(html.includes('https://wcm.agentrust-io.com/')); -assert.ok(!html.includes('specification repository is still private')); -assert.ok(!html.includes('Not yet a public repository')); -assert.ok(html.includes('/wcm/og-launch.png')); -const socialCard = fs.readFileSync(path.join(here, 'og-launch.png')); -assert.ok(socialCard.length > 100_000); -assert.equal(socialCard.toString('ascii', 1, 4), 'PNG'); -const width = socialCard.readUInt32BE(16); -const height = socialCard.readUInt32BE(20); -assert.equal(width, 1731); -assert.equal(height, 909); -assert.ok(html.includes(``)); -assert.ok(html.includes(``)); -for (const selector of ['.proof-grid', '.wcm-terminal', '.wcm-flow', '.wcm-personas']) { - assert.ok(css.includes(selector), `${selector} must have a responsive style`); -} -assert.equal((css.match(/{/g) || []).length, (css.match(/}/g) || []).length); -const ids = new Set([...html.matchAll(/\sid="([^"]+)"/g)].map((match) => match[1])); -for (const match of html.matchAll(/href="#([^"]+)"/g)) { - assert.ok(ids.has(match[1]), `fragment #${match[1]} must resolve`); -} - -console.log('WCM launch page evidence and positioning checks passed'); diff --git a/wcm/proof.json b/wcm/proof.json deleted file mode 100644 index 0062ac0..0000000 --- a/wcm/proof.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "captured_at": "2026-09-07", - "sdk_version": "0.27.0", - "package_url": "https://pypi.org/project/weight-custody-manifest/0.27.0/", - "conformance_vectors": 91, - "conformance_levels": { "L1": 32, "L2": 37, "L3": 12, "L4": 10 }, - "demo_command": "python demo-07-closed-weight/run.py", - "demo_source_blob": "1c9c7424e4938f51572d739d7acaa1d3f441cf45", - "demo_outcomes": { "approved": true, "unapproved": false }, - "hardware_executed": false -} diff --git a/wcm/redirect.test.js b/wcm/redirect.test.js new file mode 100644 index 0000000..d269f7d --- /dev/null +++ b/wcm/redirect.test.js @@ -0,0 +1,75 @@ +'use strict'; + +// /wcm/ is a redirect to the single WCM home at wcm.agentrust-io.com. +// +// It used to be a full launch page, gated by a proof.json that pinned SDK +// numbers. That file could not see the WCM repository, so it went stale at +// 0.27.0 while the docs site moved to 0.28.1, and the two addresses ended up +// telling different stories. The numbers are now gated inside +// weight-custody-manifest (python/tests/test_docs_home_claims.py), which counts +// the actual conformance vectors. +// +// What this guards is that the page stays a redirect and does not grow content +// again. + +const assert = require('node:assert/strict'); +const fs = require('node:fs'); +const path = require('node:path'); + +const DOCS_HOME = 'https://wcm.agentrust-io.com/'; +const here = __dirname; +const html = fs.readFileSync(path.join(here, 'index.html'), 'utf8').replace(/\r\n/g, '\n'); + +// Three independent ways out, so no single blocked mechanism strands a reader. +assert.match( + html, + new RegExp(``), + 'must carry an instant meta refresh to the docs home', +); +assert.ok( + html.includes(`location.replace("${DOCS_HOME}")`), + 'must redirect in JS with replace(), so Back does not bounce', +); +assert.ok( + html.includes(`open the documentation`), + 'must offer a visible link when refresh and JS are both blocked', +); + +// One canonical, pointing away from here. This is what consolidates the two +// addresses into one indexed page. +const canonicals = html.match(/]*>/g) || []; +assert.equal(canonicals.length, 1, 'exactly one canonical'); +assert.equal(canonicals[0], ``); +assert.ok( + !/`), + 'og:url must be the docs home', +); + +// The card image stays served from this directory: links cached against +// agentrust-io.com/wcm/og-launch.png must keep resolving. +assert.ok( + fs.existsSync(path.join(here, 'og-launch.png')), + 'og-launch.png must stay in place for already-shared cards', +); +assert.ok( + html.includes('content="https://agentrust-io.com/wcm/og-launch.png"'), + 'og:image must be absolute and point at the image this directory still serves', +); + +// A redirect stub is small. If this trips, someone is rebuilding a second +// homepage here, which is the drift this change removed. +const bytes = Buffer.byteLength(html, 'utf8'); +assert.ok(bytes < 6000, `redirect stub must stay small, got ${bytes} bytes`); +assert.ok( + !fs.existsSync(path.join(here, 'proof.json')), + 'proof.json is gated in weight-custody-manifest now; do not reintroduce it here', +); + +console.log(`ok: /wcm/ redirects to ${DOCS_HOME} (${bytes} bytes)`);