From 02bb2363672a7abb5a405eb7adb6de8b46379f12 Mon Sep 17 00:00:00 2001 From: Gregg Cochran Date: Tue, 28 Jul 2026 15:53:19 -0700 Subject: [PATCH] fix(site): correct v1.0.0 copy and add the missing SEO surface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two problems, found while tracing where search traffic actually lands. The site still described v0.1.0 It advertised six agents and seven phases, and the agent roster listed every role as claude-sonnet-4.6 โ€” including QA Sealed and Lead Engineer, the exact same-family pairing that v1.0.0 exists to eliminate. The landing page was demonstrating the bug as though it were the design. Now: eight agents, eight phases, and the real cross-family assignments from config.yml, with Arch Critic and Red Team added. Seal plurality is shown as two independent authors, and the QA Validator card notes that its identity is deliberately unconstrained because it executes rather than authors. No SEO surface at all robots.txt and sitemap.xml both 404'd, there was no canonical link, and there were no Open Graph or Twitter tags โ€” so every link to this site, in Slack, on social, anywhere, rendered as a bare URL with no title or description. For a project whose measured bottleneck is distribution rather than conversion, that is the worst place to be losing traffic. Added robots.ts and sitemap.ts as static routes, plus canonical, Open Graph, Twitter card, keywords and metadataBase. The description also carried the same stale six-agent claim and has been corrected. Verified from the build output: robots.txt and sitemap.xml resolve, canonical and og tags are present, no stale counts remain, and npm audit is clean. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 9cb0b232-bb14-47a5-a150-00e71bdddcae --- site/src/app/layout.tsx | 32 ++++++++++++++++++++++++++++++-- site/src/app/page.tsx | 30 ++++++++++++++++-------------- site/src/app/robots.ts | 10 ++++++++++ site/src/app/sitemap.ts | 14 ++++++++++++++ 4 files changed, 70 insertions(+), 16 deletions(-) create mode 100644 site/src/app/robots.ts create mode 100644 site/src/app/sitemap.ts diff --git a/site/src/app/layout.tsx b/site/src/app/layout.tsx index d9bd84d..ba6df02 100644 --- a/site/src/app/layout.tsx +++ b/site/src/app/layout.tsx @@ -1,10 +1,38 @@ import type { Metadata } from "next"; import "./globals.css"; +const SITE = "https://dubsopenhub.github.io/dark-factory"; +const DESCRIPTION = + "Dark Factory is a GitHub Copilot CLI skill that turns a short free-text goal into a production-grade pull request. Eight specialist agents drawn from different model families, sealed-envelope testing, and a checkpoint-gated pipeline."; + export const metadata: Metadata = { + metadataBase: new URL(SITE), title: "Dark Factory ๐Ÿญ โ€” Lights Out Builds", - description: - "Dark Factory is a GitHub Copilot CLI skill that turns a short free-text goal into a production-grade pull request. Six specialist agents, sealed-envelope testing, checkpoint-gated pipeline.", + description: DESCRIPTION, + keywords: [ + "GitHub Copilot CLI", + "Copilot skill", + "agentic build system", + "sealed-envelope testing", + "shadow score", + "adversarial independence", + "AI code review", + ], + authors: [{ name: "DUBSOpenHub", url: "https://github.com/DUBSOpenHub" }], + alternates: { canonical: "/" }, + openGraph: { + type: "website", + url: SITE, + siteName: "Dark Factory", + title: "Dark Factory ๐Ÿญ โ€” Lights Out Builds", + description: DESCRIPTION, + }, + twitter: { + card: "summary_large_image", + title: "Dark Factory ๐Ÿญ โ€” Lights Out Builds", + description: DESCRIPTION, + }, + robots: { index: true, follow: true }, }; export default function RootLayout({ diff --git a/site/src/app/page.tsx b/site/src/app/page.tsx index 5e725fb..a36be47 100644 --- a/site/src/app/page.tsx +++ b/site/src/app/page.tsx @@ -73,8 +73,8 @@ export default function Home() { const [copied, setCopied] = useState(false); // โ”€โ”€ Counters โ”€โ”€ - const agents = useCounter(6); - const phases = useCounter(7); + const agents = useCounter(8); + const phases = useCounter(8); const hardening = useCounter(3); const shadow = useCounter(0); @@ -230,7 +230,7 @@ export default function Home() {

The agentic dark factory for AI building. Turn a short free-text goal into a{" "} - production-grade pull request โ€” six specialist agents orchestrated through a + production-grade pull request โ€” eight specialist agents from different model families orchestrated through a checkpoint-gated pipeline with{" "} The Machine

- 6 agents, 7 phases, zero blind spots + 8 agents, 8 phases, zero blind spots

Dark Factory orchestrates a team of specialist agents through a sealed-envelope pipeline. @@ -381,7 +381,7 @@ export default function Home() {

Agentic
lights out builds

Dark Factory is an agentic build system โ€” it isolates every build in a disposable - git worktree, orchestrates six specialist AI agents, and measures quality with sealed-envelope testing. + git worktree, orchestrates eight specialist AI agents drawn from different model families, and measures quality with sealed-envelope testing. The shadow score tells you exactly how much the builder missed. Lights out means the builder works blind โ€” and the hidden tests prove whether the spec was truly covered.

@@ -428,7 +428,7 @@ export default function Home() { {[ { num: "01", title: "Goal in, PR out", desc: <>Write a sentence. Get production code. Dark Factory takes a free-text goal and produces a complete pull request โ€” spec, architecture, implementation, tests, and delivery report. }, { num: "02", title: "Sealed-envelope testing", desc: <>QA writes hidden acceptance tests before any code exists. The builder never sees them. Shadow scores quantify blind spots the builder didn't know about. }, - { num: "03", title: "Six specialist agents", desc: <>Each phase has its own expert. Product Manager, Architect, QA Sealed, Lead Engineer, QA Validator, and Outcome Evaluator โ€” stateless, focused, governed. }, + { num: "03", title: "Eight specialist agents", desc: <>Each phase has its own expert. Product Manager, Architect, Arch Critic, QA Sealed, Lead Engineer, Red Team, QA Validator, and Outcome Evaluator โ€” stateless, focused, governed, and drawn from different model families. }, { num: "04", title: "Checkpoint-gated", desc: <>You stay in control. Human approval gates at every phase boundary. Review the PRD, approve the architecture, inspect the build โ€” or go fully dark with skip-all. }, { num: "05", title: "Crash-recoverable", desc: <>Every phase checkpoints to state.json. Network drops, timeouts, interrupted sessions โ€” just run dark factory resume and continue. }, { num: "06", title: "Express mode", desc: <>Short goals get fast builds. Express mode skips PRD and architecture, but still runs sealed QA from the raw goal. Quick fixes get the same quality envelope. }, @@ -513,16 +513,18 @@ export default function Home() {
Agent Team

The team.

-

Six specialist agents, each with its own prompt, model assignment, and governance rules. Stateless โ€” they only see what the Factory Manager passes them.

+

Eight specialist agents, each with its own prompt, model assignment, and governance rules. Stateless โ€” they only see what the Factory Manager passes them.

{[ - { icon: "๐Ÿ“‹", name: "Product Manager", role: "Phase 1 ยท PRD Author", desc: "Turns your free-text goal into a structured PRD with acceptance criteria, user stories, and technical constraints. Capped at 180 lines.", model: "claude-sonnet-4.6" }, - { icon: "๐Ÿ—๏ธ", name: "Architect", role: "Phase 2b ยท System Designer", desc: "Designs the system from the PRD โ€” diagrams, contracts, file structure, tech decisions. Runs in parallel with QA Sealed.", model: "claude-sonnet-4.6" }, - { icon: "๐Ÿ”’", name: "QA Sealed", role: "Phase 2a ยท Hidden Test Author", desc: "Writes acceptance tests from the PRD that the builder will never see. Tests are SHA-256 hashed and stored in a sealed vault.", model: "claude-sonnet-4.6" }, - { icon: "โš™๏ธ", name: "Lead Engineer", role: "Phase 3 & 5 ยท Builder", desc: "Implements the spec, writes tests, and handles hardening cycles. Only sees failure messages from sealed tests โ€” never the tests themselves.", model: "claude-sonnet-4.6" }, - { icon: "๐Ÿงช", name: "QA Validator", role: "Phase 4 ยท Sealed Test Runner", desc: "Temporarily injects sealed tests into the worktree, runs them, reports the shadow score, then removes all traces.", model: "claude-haiku-4.5" }, - { icon: "๐Ÿ“Š", name: "Outcome Evaluator", role: "Phase 7 ยท Post-Ship Analyst", desc: "Revisits archived artifacts after delivery. Scores PRD criteria fulfillment and KPI alignment out of 100.", model: "claude-sonnet-4.6" }, + { icon: "๐Ÿ“‹", name: "Product Manager", role: "Phase 1 ยท PRD Author", desc: "Turns your free-text goal into a structured PRD with acceptance criteria, user stories, and technical constraints.", model: "gpt-5.5 ยท openai" }, + { icon: "๐Ÿ—๏ธ", name: "Architect", role: "Phase 2b ยท System Designer", desc: "Designs the system from the PRD โ€” diagrams, contracts, file structure, tech decisions. Runs in parallel with the sealed authors.", model: "claude-opus-5 ยท anthropic" }, + { icon: "๐Ÿ”", name: "Arch Critic", role: "Phase 2.5b ยท Design Reviewer", desc: "Reviews the architecture before a line is implemented, from a different family than the Architect, with a full requirement-coverage walk.", model: "gpt-5.6-terra ยท openai" }, + { icon: "๐Ÿ”’", name: "QA Sealed", role: "Phase 2a ยท Hidden Test Author", desc: "Writes acceptance tests from the PRD that the builder will never see. Two independent families author suites, so one family's blind spot cannot sink the envelope.", model: "gpt-5.6-terra + gemini-3.1-pro" }, + { icon: "โš™๏ธ", name: "Lead Engineer", role: "Phase 3 & 5 ยท Builder", desc: "Implements the spec and handles hardening cycles. Different family from every seal author โ€” it only ever sees failure messages, never the tests.", model: "claude-opus-4.8 ยท anthropic" }, + { icon: "๐ŸŽฏ", name: "Red Team", role: "Phase 4.5 ยท Adversary", desc: "Attacks what the spec forgot once the seal opens. Each finding is classed as spec gap or implementation bug, which decides who learns from it.", model: "gpt-5.6-sol ยท openai" }, + { icon: "๐Ÿงช", name: "QA Validator", role: "Phase 4 ยท Sealed Test Runner", desc: "Runs both suites in a disposable worktree built from the engineer's commit, reports the shadow score, then destroys it. Identity is unconstrained โ€” it executes, it does not author.", model: "gemini-3.6-flash ยท google" }, + { icon: "๐Ÿ“Š", name: "Outcome Evaluator", role: "Phase 7 ยท Post-Ship Analyst", desc: "Revisits archived artifacts after delivery. Scores PRD criteria fulfillment and KPI alignment out of 100.", model: "claude-sonnet-5 ยท anthropic" }, ].map((a) => (
{a.icon}
@@ -637,7 +639,7 @@ export default function Home() {
{[ - { name: "Full Build", code: "dark factory โ€” ", desc: "Complete pipeline with all 7 phases and checkpoints at every gate. The \"lights out\" experience." }, + { name: "Full Build", code: "dark factory โ€” ", desc: "Complete pipeline with all 8 phases and checkpoints at every gate. The \"lights out\" experience." }, { name: "Express", code: "dark factory express โ€” ", desc: "Skips PRD/Architecture. Sealed QA still runs from the raw goal. One checkpoint at delivery." }, { name: "Resume", code: "dark factory resume", desc: "Reloads state.json and continues from the saved phase. Crash recovery built in." }, { name: "Status", code: "dark factory status", desc: "Prints current state without mutating anything. Shows pending evaluations." }, diff --git a/site/src/app/robots.ts b/site/src/app/robots.ts new file mode 100644 index 0000000..4ebd485 --- /dev/null +++ b/site/src/app/robots.ts @@ -0,0 +1,10 @@ +import type { MetadataRoute } from "next"; + +export const dynamic = "force-static"; + +export default function robots(): MetadataRoute.Robots { + return { + rules: { userAgent: "*", allow: "/" }, + sitemap: "https://dubsopenhub.github.io/dark-factory/sitemap.xml", + }; +} diff --git a/site/src/app/sitemap.ts b/site/src/app/sitemap.ts new file mode 100644 index 0000000..e0619fc --- /dev/null +++ b/site/src/app/sitemap.ts @@ -0,0 +1,14 @@ +import type { MetadataRoute } from "next"; + +export const dynamic = "force-static"; + +export default function sitemap(): MetadataRoute.Sitemap { + return [ + { + url: "https://dubsopenhub.github.io/dark-factory/", + lastModified: new Date(), + changeFrequency: "monthly", + priority: 1, + }, + ]; +}