Skip to content

Commit 660b608

Browse files
committed
Add shared favicons and landing SEO social previews
1 parent d316296 commit 660b608

31 files changed

Lines changed: 1041 additions & 3 deletions

‎docs/ADR/ADR-053-unified-visual-identity.md‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,28 @@ coherent presentation change. Missing independent comparison evidence remains
9696
an explicit publication blocker. This continuation remains Accepted until all
9797
required verification exists.
9898

99+
## Icon and site metadata continuation, 2026-10-03
100+
101+
The owner's favicon/SEO/social-preview request adds REQ-SEO-001..006 and
102+
AC-SEO-001..007 in [SiteMetadata](../Features/BenchmarkComparisons/SiteMetadata.md).
103+
Preserve the canonical SVG and existing identity; derive six PNG/ICO files under
104+
console Assets with byte-identical site mirrors. Static landing metadata and an
105+
authored SVG/1200×630 PNG share card use the existing www canonical. JSON-LD
106+
describes the real MIT project without invented ratings/offers or measurements.
107+
The console receives only those finite public GET/HEAD icon routes and noindex;
108+
its authentication, CSP and data routes remain unchanged. Existing robots/sitemap
109+
generation is extended within BenchmarkComparisons, not a second crawl source.
110+
111+
Implementation stages, disjoint worker/lead ownership and acceptance are retained
112+
in [SiteMetadata](../Features/BenchmarkComparisons/SiteMetadata.md#implementation-and-delivery-contract).
113+
Join the exported bytes, emitted/static-host behavior and acceptance-driven real
114+
builder/RF3 tests before lead review/development/static/manual checks and normal
115+
exact-SHA GitHub qualification/publication. No new dependency or persisted-data
116+
migration. Rollback coherently reverts the added head/assets/copy/whitelist changes.
117+
Provider indexing/share-cache refresh is a manual external outcome; source push
118+
or local rendering cannot establish it. Missing isolated evidence is reported,
119+
never bypassed. This additive contract remains Accepted until required gates pass.
120+
99121
## Alternatives
100122

101123
- Restyle each surface separately. Rejected because drift returns.

‎docs/Architecture.md‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,12 @@ classDiagram
3232

3333
The additive [AdminDashboard](Features/AdminDashboard.md) slice under [ADR-051](ADR/ADR-051-admin-dashboard.md) hosts the runtime read-only console in `src/KeyLoad.Server/Features/AdminDashboard/Assets/`, with shared Abstractions DTOs, Core catalog/queue readers, matching Client SDK and UnitTests/IntegrationTests slices. It borrows the existing unique Orleans request/read actors and node-local administration; physical observations are explicitly per node. The public benchmark `site/` remains its own surface. Both surfaces share one light visual identity under [ADR-053](ADR/ADR-053-unified-visual-identity.md): the console owns the canonical `brand.css`/`logo.svg`, and the site keeps byte-identical mirrors checked by SiteTests. Exact-SHA dashboard unit/RF3/native browser cases pass and retained desktop/mobile images are visually reviewed; complete recovery/comparison and numeric coverage qualification remains open.
3434

35+
[SiteMetadata](Features/BenchmarkComparisons/SiteMetadata.md) extends that identity
36+
with mirrored PNG/ICO exports, static landing SEO/OG/Twitter/JSON-LD and an authored
37+
share card. The existing static builder owns root delivery and crawl files; the
38+
console's finite embedded shell owns only its exact icon routes and noindex.
39+
Source assets and local rendering do not establish indexing or publication.
40+
3541
```mermaid
3642
flowchart LR
3743
Admin[Same origin admin console] --> API[AdminDashboard API and MCP]

‎docs/Features/AdminDashboard.md‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# AdminDashboard
22

3+
The owner-requested shared favicon export and noindex continuation is specified
4+
by [SiteMetadata](BenchmarkComparisons/SiteMetadata.md), REQ-SEO-001/005 and
5+
AC-SEO-001/006 under ADR053. It adds only finite public icon GET/HEAD assets;
6+
all operational authorization and existing console contracts remain required.
7+
38
Status: source delivered; exact-SHA dashboard unit, RF3 API and native Chrome cases pass, and retained desktop/mobile screenshots are visually reviewed. Complete recovery/comparison and numeric coverage gates remain open; ADR-051 remains Accepted. Owner: KeyLoad lead. User request: attractive runtime administration with sizes, throughput, tables/collections, queues and files.
49

510
This is the durable requirements and acceptance contract. Architecture and the ordered agent implementation contract are in [ADR-051](../ADR/ADR-051-admin-dashboard.md). Root-level brainstorm, acceptance and plan files are local task scaffolding under the repository ignore policy; delivery evidence belongs here and in `docs/implementation/status.json`.

‎docs/Features/BenchmarkComparisons.md‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,10 @@ flowchart LR
414414

415415
## Owner-directed isolated Linux performance matrix, 2026-10-03
416416

417+
The additive owner-requested favicon/search/social-preview presentation contract
418+
is [SiteMetadata](BenchmarkComparisons/SiteMetadata.md), REQ-SEO-001..006 /
419+
AC-SEO-001..007 under ADR053. It preserves every benchmark/evidence gate.
420+
417421
[ADR-056](../ADR/ADR-056-isolated-linux-comparison-cells.md) and the canonical
418422
[acceptance](../../isolated-comparisons.acceptance.md)/[plan](../../isolated-comparisons.plan.md)
419423
replace the three-OS and all-engine-on-one-runner producer for new qualification.
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
# BenchmarkComparisons — website discovery and shared icons
2+
3+
Owner request 2026-10-03. ADR040/051/053 retain the site build, finite console asset shell and one canonical visual source. The additive ADR053 implementation contract covers this presentation standard. The task acceptance/plan are local scaffolding; this document retains the durable requirements, acceptance and verification contract.
4+
5+
Scope: recognizable shared icons for the public landing and operational console, accurate static search/social metadata, and a readable link-preview card. The existing canonical is `https://www.keyload.cloud/`; copy remains English. No logo redesign, dependency, DNS, service worker, analytics, persisted data, public database API or topology change.
6+
7+
| Requirement | Acceptance | Owning surface and proof |
8+
| --- | --- | --- |
9+
| REQ-SEO-001 shared compatible favicon/touch set | 001 | canonical AdminDashboard Assets, byte-identical site root mirrors; SiteMetadata icon assertions |
10+
| REQ-SEO-002 accurate static search/social discovery | 002–003 | BenchmarkComparisons index.html, assets/site.webmanifest and existing builder robots/sitemap; emitted HTML/JSON-LD TUnit |
11+
| REQ-SEO-003 readable factual share card | 004 | BenchmarkComparisons assets/og-image.svg/png; PNG output assertions and manual artwork review |
12+
| REQ-SEO-004 safe complete static output | 005 | BenchmarkComparisons build-site.mjs; real clean/rejection builds |
13+
| REQ-SEO-005 operational console icon/indexing boundary | 006 | AdminDashboard index/AdminStaticAssets and real RF3 AdminFaviconAssertions |
14+
| REQ-SEO-006 honest qualification/publication | 007 | exact-SHA site/runtime GitHub receipts, lead review |
15+
16+
## Acceptance and test matrix
17+
18+
| Criterion | Pass condition; negative/edge behavior | Verification |
19+
| --- | --- | --- |
20+
| AC-SEO-001 | Canonical console `logo.svg` and site `favicon.svg` remain unchanged and byte-identical. Six derived binary files are identical across surfaces and emitted output: ICO with bounded 16/32/48 frames; square PNG32/96/180/192/512. Both heads reference SVG, ICO, PNG32/96 and touch180. Landing manifest references local192/512 with scope/start URL `./` and display `browser`. Missing, conflicting or incorrectly sized assets fail. | `SiteMetadataTests` validates actual source/build bytes, formats, dimensions and head references. |
21+
| AC-SEO-002 | Real built initial HTML has exactly one nonempty title/description, www HTTPS canonical, index/large-preview robots and canonical theme color. Complete OG website/title/description/site_name/url/locale/image/type/1200×630/alt and Twitter large-card/title/description/image/alt agree. Image URL is `https://www.keyload.cloud/og-image.png`. No localhost, conflicting fields, credentials or unsupported readiness/performance claims. Existing H1/navigation/body hooks remain. | `SiteMetadataTests` parses the actual builder head; native browser/manual review retains readable output. |
22+
| AC-SEO-003 | Valid schema.org JSON-LD describes WebSite and SoftwareSourceCode with stable IDs, actual name/URL/GitHub/C#/MIT. Invented offers, ratings, reviews and search actions are absent. Generated robots/sitemap use the same canonical, allow icon/card fetches, and exclude admin. | Real-output HTML/JSON-LD/robots/sitemap assertions in `SiteMetadataTests`. |
23+
| AC-SEO-004 | Editable `assets/og-image.svg` and real PNG1200×630 under300KiB use the existing K/palette and readable product message. No measurements or screenshot artifacts. Root `og-image.png` is the exact source PNG. Every manifest/head asset exists. | Signature/IHDR/size/exact-byte assertions; subjective full-size and reduced composition is a manual ADR040/053 exception. |
24+
| AC-SEO-005 | Builder checks every added source as a regular confined asset before output. Missing/symlink icon or card is rejected without partial output. Existing immutable report/vendor hashes, output confinement and JS/CSS budgets remain mandatory. | `SiteMetadataRejectionTests` mutates isolated source copies and invokes the real builder with authentic reports; existing SiteBuildTests remain. |
25+
| AC-SEO-006 | Console uses shared icons/theme and `noindex,nofollow`. Only six exact additional embedded public GET/HEAD routes exist, with PNG/ICO MIME, no-store/nosniff and unchanged CSP/referrer policy. Credential-free GET returns valid bytes; HEAD is empty. Unknown assets, POST and database routes gain no public access. Console has no marketing canonical/schema/OG claims. | `AdminFaviconAssertions` joins the existing genuine RF3 `AdminDashboardRf3Tests` shell flow; prior authentication/method/unknown-path assertions remain. |
26+
| AC-SEO-007 | Preserve unrelated changes, normal current-branch delivery and exact-SHA GitHub run/job/artifact receipts. Source push, local rendering, failed/pending cohorts and skipped suites do not establish publication/indexing/coverage. | Lead review plus real Website/Tests provider results and live asset confirmation after successful deployment. |
27+
28+
## Implementation and delivery contract
29+
30+
The lead freezes scope/criteria before three disjoint scopes:
31+
32+
- Exports: six icon files under `src/KeyLoad.Server/Features/AdminDashboard/Assets/`
33+
and exact site-root mirrors; `site/Features/BenchmarkComparisons/assets/og-image.svg/png`
34+
and `site.webmanifest`.
35+
- Production: only `site/Features/BenchmarkComparisons/index.html` head and
36+
`build-site.mjs`, plus console `Assets/index.html` head and `AdminStaticAssets.cs`.
37+
- Regressions: new `SiteMetadata*` files under the existing SiteTests slice,
38+
new `AdminFaviconAssertions` helpers in IntegrationTests/AdminDashboard, and one
39+
invocation in `AdminShellAssertions`.
40+
41+
The lead owns shared docs, reviews every result and joins all three
42+
before development/static/manual checks, normal scoped main commit/push, and
43+
exact-SHA GitHub qualification. A blocked worker does not unblock integration.
44+
The sequence and boundaries extend ADR053 rather than introducing another
45+
identity or crawl-file owner. No migration is needed; rollback coherently reverts
46+
the head, exports, builder copies and finite route additions.
47+
48+
Public DTOs, SDK/MCP, persistence, schema migrations, RAM/SIMD and measured operation performance: N/A; static presentation writes none of them. Canonical names remain BenchmarkComparisons for the public site and AdminDashboard for the console, sharing existing identity assets under ADR053. No analytics or service worker is introduced.
49+
50+
```mermaid
51+
flowchart LR
52+
Logo[Canonical console SVG] --> Icons[Derived PNG and ICO]
53+
Icons --> Console[Finite public admin icon routes]
54+
Icons --> Mirror[Byte-identical site icons]
55+
Card[Authored OG source and PNG] --> Build[Confined static builder]
56+
Head[Static SEO OG Twitter JSON-LD] --> Build
57+
Mirror --> Build
58+
Build --> Pages[Existing qualified Pages publication]
59+
Tests[Real builder and RF3 tests] --> Build
60+
Tests --> Console
61+
```
62+
63+
Acceptance explicitly covers missing/symlink files, invalid dimensions, metadata conflicts, long-text preview readability and unauthorized/unknown routes. Qualification remains GitHub-only. Local development builds and visual inspection are manual/design evidence and do not prove provider cache refresh, indexing, full tests, coverage or publication. The full relevant baseline is recorded in the plan; isolated cohort absence remains a publication blocker.
14.2 KB
Loading
Lines changed: 35 additions & 0 deletions
Loading
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"name": "KeyLoad",
3+
"short_name": "KeyLoad",
4+
"start_url": "./",
5+
"scope": "./",
6+
"display": "browser",
7+
"theme_color": "#f7f6f2",
8+
"background_color": "#f4f3ef",
9+
"icons": [
10+
{ "src": "icon-192.png", "sizes": "192x192", "type": "image/png" },
11+
{ "src": "icon-512.png", "sizes": "512x512", "type": "image/png" }
12+
]
13+
}

‎site/Features/BenchmarkComparisons/build-site.mjs‎

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ import { produceIsolatedProjection } from './isolated-projection.mjs';
99
import { validateIsolatedCatalog, validateIsolatedProjection } from './isolated-loader.mjs';
1010
import { readBytes } from '../../../scripts/Features/BenchmarkComparisons/aggregate-files.mjs';
1111

12+
const META_ASSET = Object.freeze({
13+
manifest: 'assets/site.webmanifest', manifestOutput: 'site.webmanifest',
14+
ogImage: 'assets/og-image.png', ogImageOutput: 'og-image.png', ogSource: 'assets/og-image.svg',
15+
});
1216
const BUILD = Object.freeze({
1317
encoding: 'utf8', hash: 'sha256', hex: 'hex', feature: 'Features/BenchmarkComparisons', sourceParent: '../..',
1418
vendor: 'vendor/three/0.186.1', manifest: 'manifest.json', three: 'three', version: '0.186.1',
@@ -20,6 +24,9 @@ const BUILD = Object.freeze({
2024
'benchmark-lab.mjs', 'benchmark-chart.mjs', 'benchmark-profiles.mjs', 'cluster-scene.mjs',
2125
'scene-geometry.mjs', 'scene-lifecycle.mjs', 'scene-observers.mjs', 'styles.css', 'brand.css', 'tokens.css', 'scene.css',
2226
'assets/cluster-poster.svg', 'assets/cluster-poster-mobile.svg'],
27+
rootAssets: ['favicon.ico', 'favicon-32x32.png', 'favicon-96x96.png', 'apple-touch-icon.png', 'icon-192.png', 'icon-512.png'],
28+
metadataAssets: [META_ASSET.manifest, META_ASSET.ogImage, META_ASSET.ogSource],
29+
metadataCopies: [[META_ASSET.manifest, META_ASSET.manifestOutput], [META_ASSET.ogImage, META_ASSET.ogImageOutput]],
2330
vendorFiles: ['three.webgpu.js', 'three.core.js', 'LICENSE'],
2431
vendorHashes: ['15cfce5c653541704fd9a3463c39d3e8b854bb6265ccd854d7cfe74090625cc6',
2532
'9edde002b066a9a05676a6127f67735b62baf399bdea529f2f7e31657da769e6',
@@ -36,7 +43,7 @@ const BUILD = Object.freeze({
3643
path: 'path', bytes: 'bytes',
3744
parent: '..', staticEvidence: '<!-- KEYLOAD_STATIC_EVIDENCE -->',
3845
documentationBlob: '/blob/main/docs', documentationTree: '/tree/main/docs',
39-
robots: 'User-agent: *\nAllow: /\nSitemap: https://www.keyload.cloud/sitemap.xml\n',
46+
robots: 'User-agent: *\nAllow: /\nDisallow: /admin/\nSitemap: https://www.keyload.cloud/sitemap.xml\n',
4047
sitemap: '<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"><url><loc>https://www.keyload.cloud/</loc></url></urlset>\n',
4148
});
4249
const ERRORS = Object.freeze({
@@ -127,6 +134,8 @@ async function verifyAssets() {
127134
if (name.endsWith(BUILD.cssExtension)) css += gzipSync(bytes).length;
128135
}
129136
await assertRegular(join(source, BUILD.favicon));
137+
for (const name of BUILD.rootAssets) await assertRegular(join(source, name));
138+
for (const name of BUILD.metadataAssets) await assertRegular(join(feature, name));
130139
if (javascript > BUILD.authoredJsLimit || css > BUILD.cssLimit) throw new Error(ERRORS.budget);
131140
return { javascriptGzipBytes: javascript, cssGzipBytes: css };
132141
}
@@ -168,6 +177,8 @@ async function copyAsset(output, path, target = path) {
168177
async function emit(output, reports, catalog, isolated) {
169178
await emitHtml(output, catalog, isolated);
170179
await copyAsset(output, BUILD.favicon);
180+
for (const asset of BUILD.rootAssets) await copyAsset(output, asset);
181+
for (const [asset, target] of BUILD.metadataCopies) await copyAsset(output, `${BUILD.feature}/${asset}`, target);
171182
for (const asset of BUILD.assets) await copyAsset(output, `${BUILD.feature}/${asset}`);
172183
for (const file of [...BUILD.vendorFiles, BUILD.manifest]) await copyAsset(output, `${BUILD.feature}/${BUILD.vendor}/${file}`);
173184
for (const run of catalog.runs) {

0 commit comments

Comments
 (0)