Builders only

For Forge builders.

This detailed breakdown is for Forge builders. Check in to view.

Go to Builder Check-in →
Forge Sprint 01 · Live Results

The Leaderboard.

Judged by an automated multi-agent harness that cloned, ran and forensically analysed every repo. Tap any builder for the full breakdown.
Live · 34 of 34 judged Rankings update as more builders are scored · last update 06 Jun 2026, 14:04 UTC
1 Yashaswi Goel F1 100% 95/100

Score breakdown (weighted)

Detection accuracy (F1 vs ground truth)30 / 30
Pipeline runs end-to-end on the crawl10 / 10
Output contract + fix artifacts7 / 8
Orchestration & architecture14 / 15
Code quality (code review)11 / 12
Process integrity (logs, commits, debugging)12 / 12
Context & memory files5 / 6
Deliverable & docs6 / 7
Raw total95 / 100
Verified F1 (objective accuracy): 99.8%  ·  committed report F1: 99.8%  ·  ran end-to-end: yes
Detection logic: seo/detector.py detect() — pure deterministic Python invoked via mcp/server.py:seo_detect() and run.py. 17 of 18 rulebook rules implemented (missing_title, duplicate_title, title_too_long, title_too_short, missing_meta_description, duplicate_meta_description, meta_description_too_long, missing_h1, duplicate_h1, broken_link, server_error, redirect, redirect_chain, thin_content, orphan_page, non_indexable_but_linked, slow_page); only canonical/hreflang-style rules are absent because those columns are not in the crawl.

Why this rank

Yashaswi Goel shipped a genuinely strong, honest build. The detection logic lives in deterministic Python (seo/detector.py), was expanded from the starter's 7 detectors to 17 covering every rule present in the crawl, and is fully reproducible: re-running the pipeline regenerated a byte-equivalent issue set scoring verified F1 0.9976, matching the committed ~0.998 — so the high score is real, not hand-fabricated or hard-coded (no sample URLs, counts, or ground-truth reads appear anywhere in the code). The pipeline runs clean headless and degrades gracefully when Ollama is absent. Architecture is well beyond the scaffold: a real orchestrator skill, four distinct sub-agents, a wired MCP server, and a live SSE dashboard, backed by an authentic process trail (163 real audit events, a 1.6MB transcript, 17 commits over ~4.4 hours of visible iteration with debugging logged in an excellent DECISIONS.md). The single biggest thing holding it back is the champion-tier fix layer: title/meta rewrites are entirely model-dependent with no deterministic fallback, the committed fix CSVs are static placeholders rather than runtime-generated artifacts, and the README/PROMPTS docs still carry starter boilerplate and a few claims (FastAPI/Jinja2) that don't match the shipped code. Even so, this is a clean, high-accuracy, low-risk submission with no integrity flags.

What they did well

  • Fully reproducible: re-running run.py regenerated report.json with an issue-set IDENTICAL to the committed one (212 pairs, both score F1=0.9976) — committed F1 of ~0.998 is genuine, not fabricated.
  • Top-tier detection accuracy: verified precision 0.9953 / recall 1.0 / F1 0.9976; expanded the starter from 7 detectors to 17, covering essentially every rule present in the sample crawl.
  • Robust pipeline: runs headless and degrades gracefully when Ollama is absent — the AI fixer is skipped/empties cleanly (no crash) while deterministic detection and report writing still complete.
  • Real orchestration: genuine SKILL.md plus 4 distinct, purpose-specific sub-agents (ingest/auditor/fixer/reporter), a /seo-audit command, a wired MCP server exposing 6 tools, and a live SSE dashboard (sortable table, progress bar, fixes card, done banner).
  • Genuine process: 163 varied real audit.jsonl hook events (Bash 98 / Read 30 / Write 18 / Edit 4), a 1.6MB real session transcript, and 17 commits spread coherently over ~4.4 hours (12:06 to 16:32).
  • Strong engineering hygiene: utf-8-sig BOM handling, indexable/200/html filtering before title-meta checks, correct duplicate-grouping, a real redirect_chain algorithm, and a length-validate-and-retry loop in the Ollama fixer.

What held them back

  • Fix artifacts are weak deliverables: titles_metas.csv is a placeholder list (action='rewrite_needed') with no actual rewritten titles, and the CSVs are static committed files not regenerated by run.py; with Ollama absent the report's fixes.titles is empty.
  • CLAUDE.md and PROMPTS.md retain starter boilerplate/aspirational framing — PROMPTS.md references FastAPI/Jinja2 and '17 severity scores' that do not match the shipped stdlib http.server + f-string HTML code.
  • README is still framed as the 'starter' (title and quick-start text largely unchanged), under-selling the substantial work actually done.
  • Fixer redirect-map (404->closest live page) only runs through the model path and isn't surfaced as a standalone deterministic artifact when Ollama is down; redirect_map.csv on disk is a different, simpler 3xx listing.
  • report.json fixes block depends entirely on a live local model — no deterministic fallback for title/meta rewrites means the champion-tier value disappears on the grader machine.

How to improve

  • Make the AI fixer degrade to a deterministic stub (e.g., truncate-at-word-boundary title/meta rewrites) so fixes.titles is non-empty even without Ollama.
  • Generate titles_metas.csv and redirect_map.csv from run.py at runtime (and with real before/after values) instead of committing static placeholders.
  • Rewrite README and CLAUDE.md/PROMPTS.md to describe the actual shipped architecture (stdlib HTTP+SSE, 17 detectors) and drop the unimplemented FastAPI/Jinja2 references.
  • Add a canonical/hreflang detector path guarded on column presence so coverage of the remaining rulebook items is explicit rather than implicit.
  • Persist run_meta (model_calls/duration) honestly per-run so the committed report's model_calls=40 isn't conflated with no-Ollama reruns.
2 Shreyansh Khare F1 97% 90/100

Score breakdown (weighted)

Detection accuracy (F1 vs ground truth)29 / 30
Pipeline runs end-to-end on the crawl10 / 10
Output contract + fix artifacts7 / 8
Orchestration & architecture14 / 15
Code quality (code review)10 / 12
Process integrity (logs, commits, debugging)8 / 12
Context & memory files6 / 6
Deliverable & docs6 / 7
Raw total90 / 100
Verified F1 (objective accuracy): 96.8%  ·  committed report F1: 96.8%  ·  ran end-to-end: yes
Detection logic: seo-command-center/seo/detector.py (full rewrite from stdlib-csv starter to pandas, 196 lines, det_changed_ratio 0.868). Implements ~14 of 17 rulebook rules: missing_title, duplicate_title, title_too_long, title_too_short, missing_meta_description, duplicate_meta_description, meta_description_too_long, missing_h1, duplicate_h1, broken_link, server_error, redirect, thin_content, orphan_page, plus two extras (multiple_h1, missing_image_alt_text). Missing: redirect_chain, non_indexable_but_linked, slow_page.

Why this rank

Shreyansh shipped a genuinely strong, reproducible submission. The detector was rewritten from the stdlib-csv starter into a clean pandas implementation, and running it headless on the official sample-export reproduced the committed numbers exactly (verified_f1 0.9682, precision 1.0, recall 0.938) — the high committed F1 is real, not fabricated. The architecture is well beyond the scaffold: a real MCP server with SSE, four distinct wired sub-agents, an orchestrator skill, and a fixer with an actual LLM validation loop that degrades gracefully when Ollama is off. Accuracy is held back only by three unimplemented rulebook rules (redirect_chain, non_indexable_but_linked, slow_page), which account for the entire recall gap. Process integrity is mostly authentic — a 1MB genuine session transcript and a technically faithful DECISIONS.md — but undercut by a thin, partly hand-written audit.jsonl and a ~1.6-hour build span, both of which the builder at least disclosed honestly. The deliverable polish is the weakest area: fix artifacts are capped at three URLs and the README is still the untouched starter. The single biggest thing holding this back from a top score is the missing detectors plus the thin fix outputs; the work is clean and honest, just not quite complete.

What they did well

  • Fully reproducible: re-running run.py on the official sample-export produced report.json scoring verified_f1=0.9682 (precision 1.0, recall 0.938), matching the committed 0.968 exactly — no fabrication.
  • Genuine detector rewrite from the stdlib-csv starter to a robust pandas implementation with proper NaN handling, content-type pre-filtering, and indexable/200 gating; every detected type scored perfect per-type precision/recall.
  • Real orchestration well beyond the scaffold: SKILL.md orchestrator + 4 distinct, individually wired sub-agents (ingest/auditor/fixer/reporter), a FastMCP server exposing 6 tools, and a live SSE dashboard fed by send_update() calls embedded in the detector.
  • Champion-tier fixer (seo/fixer.py) with a real Ollama validation/retry loop enforcing title<=60 and meta<=155, plus a truncation fallback that lets the pipeline degrade gracefully when Ollama is absent (no crash).
  • Authentic process artifacts: a 1.08MB raw Claude Code session transcript (agent-log.md with valid JSONL/UUIDs) and a genuinely technical DECISIONS.md whose entries (utf-8-sig, fillna, SSE, ThreadingHTTPServer deadlock fix, max_retries=3) precisely match the shipped code.
  • No hardcoding: detection is purely rule-driven over CSV columns, no literal sample URLs, counts, or ground-truth reads in the detection path.

What held them back

  • Three rulebook rules unimplemented (redirect_chain, non_indexable_but_linked, slow_page); the scorer shows the recall miss is exactly non_indexable_but_linked (2) + slow_page (11), capping F1 at 0.938.
  • Fixer is artificially limited to MAX_URLS=3 'to prove pipeline completion', so titles_metas_fixes.csv has only 3 rows and redirect_map.csv is header-only (empty) — fix artifacts are thin.
  • Dead code / inconsistencies: the meta-description rewrite is computed then discarded with a bare 'pass'; fixer.md claims max retries of 5 while the code uses 3; a stray debug print() remains in server.do_POST.
  • Process span is only ~1.62 hours across 12 commits — real iteration is visible but compressed, not spread over time.
  • audit.jsonl is only 5 lines and partly hand-written (round 10:00/10:30/11:00 timestamps; first entry admits jq was missing) — not a genuine captured hook stream, though DECISIONS.md transparently discloses this manual population.
  • README is essentially the untouched starter (title still says 'starter', body still lists 'Your job in the Sprint' TODOs) rather than documenting what was actually built.

How to improve

  • Implement the remaining three detectors (redirect_chain via the {Address->Redirect URL} map, non_indexable_but_linked, slow_page on Response Time>1.0) to push recall toward 1.0.
  • Remove the MAX_URLS=3 cap (or make it a configurable flag) and persist the meta-description rewrites that are currently discarded, so the fix CSVs reflect the full crawl.
  • Reconcile doc/code drift (retry count), delete the dead 'pass' branch and the debug print, and write meta fixes through set_fixes.
  • Rewrite the README to describe the delivered system (architecture, what changed vs starter, how to read report.html) instead of leaving the starter's TODO instructions.
  • Wire a working audit hook (or a Python-native logger) so the process trail is captured automatically rather than reconstructed by hand.
3 Bhavya Goyal F1 96% 89/100

Score breakdown (weighted)

Detection accuracy (F1 vs ground truth)29 / 30
Pipeline runs end-to-end on the crawl9 / 10
Output contract + fix artifacts8 / 8
Orchestration & architecture9 / 15
Code quality (code review)10 / 12
Process integrity (logs, commits, debugging)11 / 12
Context & memory files6 / 6
Deliverable & docs7 / 7
Raw total89 / 100
Verified F1 (objective accuracy): 96.1%  ·  committed report F1: 96.1%  ·  ran end-to-end: yes
Detection logic: Real detection is in src/detect.py (NOT seo/detector.py, which does not exist in this repo - that is why the central scan reported det%change=0 against the starter's seo/detector.py). src/detect.py implements ~15 deterministic pandas detectors covering ~12-13 of the 18 rulebook rules: missing_title, duplicate_title, title_too_long, title_too_short, missing_meta_description, duplicate_meta_description, meta_description_too_long, missing_h1, duplicate_h1, broken_link(4xx), server_error(5xx), redirect(3xx), redirect_chain, thin_content, orphan_page, non_indexable_but_linked, slow_page, and a bonus missing_image_alt_text. On this crawl 10 types fired (broken_link/redirect/etc. produced 0 because such rows are filtered out by the text/html content-type pre-filter in ingest.py).

Why this rank

Bhavya built a clean, genuinely functional SEO audit pipeline in src/ (ingest -> detect -> fix -> report) with ~15 deterministic pandas detectors, and the headline integrity contradiction resolves cleanly in their favor: the central scan flagged det%change=0 only because it diffed a non-existent seo/detector.py against the starter, while the real logic lives in src/detect.py - re-running their code reproduces the committed report.json byte-for-byte at verified_f1=0.9612, so the report is authentic, not fabricated, and there is no hardcoding or ground-truth peeking. The work is strongly above the starter baseline, with a client-ready HTML report, CSV fix exports, a graceful no-Ollama fallback, tailored memory files, and a real 410-line session log backed by 19 incremental commits over ~5.4 hours. The main shortfalls are architectural depth rather than honesty: the advertised MCP server is really a Flask/SocketIO dashboard, the four sub-agents are thin descriptive stubs, and a content-type pre-filter quietly suppresses the broken_link and redirect detectors, capping recall at 0.938. Minor robustness and hygiene issues (a Windows-only emoji crash, a stray binary_search.cpp, agent-log.md duplicating the JSONL) round out the deductions. The single biggest thing holding the score back is the gap between the claimed orchestration (MCP + multi-agent) and what was actually implemented (a dashboard + role stubs). Overall this is an honest, accurate, well-documented submission that earns a high score on real, reproducible merit.

What they did well

  • Committed report.json is FULLY reproducible: re-running their code on the canonical sample-export regenerates a byte-identical prediction set scoring verified_f1=0.9612, exactly matching committed_f1=0.9612 (198 TP / 201 pred / 211 truth). No fabrication.
  • Clean modular architecture: ingest.py (column-strip + numeric coercion + text/html filter + is_indexable helper), detect.py (~15 distinct pandas detectors), fix_engine.py (LLM title rewriter with 3-try <=60-char validation loop), report_builder.py (JSON + client HTML + CSV exports).
  • Genuine process trail: 410-line real Claude Code session log (.claude/audit.jsonl, model gemma4:31b, real session IDs and timestamps spanning 05:56-08:55) and 19 incremental commits spread over ~5.4 hours with descriptive messages (scaffold -> ingest -> detectors -> report -> fix -> MCP -> docs).
  • Graceful degradation without Ollama: fix_engine wraps the localhost:11434 call in try/except and returns a default title, so the pipeline completes and still produces a full report when the model is absent (confirmed in the live run).
  • All three memory files are tailored to this build with concrete, code-specific content (CLAUDE.md notes the trailing-space and LLM-quote gotchas; DECISIONS.md documents the zip-dict redirect-chain choice and the honest log-recovery; PROMPTS.md records the actual title prompt and retry loop).
  • Client-ready deliverable: professional sidebar HTML report with severity grids and collapsible URL lists, plus fixes_titles.csv export and a live Flask/SocketIO dashboard that reflects run progress via stage POSTs from run.py.

What held them back

  • The 'MCP server' (mcp/server.py) is actually a Flask + SocketIO web dashboard receiving HTTP progress POSTs - not a real Model Context Protocol server; plugin.json points 'mcp.server' at it but there is no MCP protocol implementation.
  • The 4 sub-agents (agents/*.md) are 1-2 line descriptive role stubs mapping to pipeline functions, not genuinely autonomous agents; SKILL.md is only 12 lines.
  • Recall is capped at 0.938 because broken_link (6) and redirect (7) ground-truth pairs are never emitted - the text/html content-type pre-filter in ingest.py drops 4xx/3xx rows before those detectors run, even though the detectors exist in code.
  • run.py prints an emoji on startup that crashes on a default Windows console (cp1252 UnicodeEncodeError before any work) - a minor cross-platform robustness flaw (works on the dev's Mac and with PYTHONIOENCODING=utf-8).
  • Repository clutter: a stray binary_search.cpp (an unrelated C++ exercise from the same Claude session) is committed, and agent-log.md is an exact duplicate of the raw audit.jsonl rather than a curated transcript.
  • Output paths are hardcoded to a relative 'outputs/' directory, so the pipeline must be run from the repo root or it writes/fails in the wrong place.

How to improve

  • Implement an actual MCP server (stdio/JSON-RPC tools) or rename the component to 'live dashboard' so the architecture claim matches reality.
  • Detect broken_link/redirect/redirect_chain from the full dataframe (or the issues_reports/response_codes_*.csv files) instead of the text/html-only frame, which would lift recall toward ~0.99.
  • Replace the emoji print or guard stdout encoding for cross-platform safety, and make output paths absolute relative to the script location.
  • Flesh out the sub-agents and SKILL.md into real orchestration (e.g., per-agent prompts/contracts) rather than one-line role descriptions.
  • Remove the stray binary_search.cpp and provide a real markdown transcript distinct from the raw JSONL dump.
4 Ankur Kumar Singh F1 74% 83/100

Score breakdown (weighted)

Detection accuracy (F1 vs ground truth)22 / 30
Pipeline runs end-to-end on the crawl10 / 10
Output contract + fix artifacts7 / 8
Orchestration & architecture12 / 15
Code quality (code review)9 / 12
Process integrity (logs, commits, debugging)11 / 12
Context & memory files6 / 6
Deliverable & docs6 / 7
Raw total83 / 100
Verified F1 (objective accuracy): 73.9%  ·  committed report F1: 73.9%  ·  ran end-to-end: yes
Detection logic: seo/detector.py (detect()), wired through mcp/server.py seo_detect() and run.py. Implements all ~17 rulebook detectors: extended the 6 starter detectors with title_too_short, missing_meta_description, duplicate_meta_description, meta_description_too_long, missing_h1, duplicate_h1, thin_content, non_indexable_but_linked, redirect_chain, slow_page (full rulebook coverage).

Why this rank

Ankur built a genuinely solid, honest submission. The detection logic in seo/detector.py was extended from the 6-detector starter to cover essentially the full ~17-rule rulebook, with the correct indexable/200 pre-filters, and the pipeline ran cleanly headless with no Ollama and produced a schema-valid report whose score I reproduced exactly (verified_f1 0.7391 == committed 0.7391, recall 1.0). Process integrity is a highlight: 13 commits spread over five hours with incremental, debugging-flavoured messages, a real 130-line audit log, 668KB of authentic Claude Code transcripts, tailored DECISIONS/PROMPTS files, a passing test suite, and two custom sub-agents that automate tracing and regression-testing the detector. Nothing is fabricated, hardcoded, or plagiarised. The single biggest thing holding the score back is precision (0.586): slow_page is computed over every row including non-HTML assets (152 predicted vs 11 in truth), which caps F1 even though recall is perfect. Secondary drags are an ordering bug that leaves the report.json fixes block empty and a placeholder (mock) fixer that doesn't read real titles or choose smart redirect targets, plus an orchestrator/agents/README layer that stays close to the starter. Reward the real, reproducible, well-documented detection work; the path to a top-tier score is a few precision filters and wiring the fixes into the JSON deliverable.

What they did well

  • Fully reproducible: re-running the pipeline regenerated a report.json byte-equivalent in scoring to the committed one (verified_f1 0.7391 == committed_f1 0.7391), recall=1.0 (211/211 truth pairs caught) — no fabrication.
  • Complete rulebook coverage in seo/detector.py: deterministic detectors for all ~17 rule types, correctly applying indexable+200 pre-filters per rulebook (e.g. duplicate_title/meta/h1 only over idx200, missing_h1 over all 200 pages).
  • Strong process integrity: 13 commits spread over ~5 hours (11:49-16:49) with genuinely incremental messages (issue count 4->8->10), 130-line real audit.jsonl with varied hook/tool events, and 668KB of authentic Claude Code transcript JSONLs committed under scripts/.
  • Real engineering extras beyond the starter: a passing test suite (tests/test_detector_agent.py validates schema + stores results) plus two purpose-built sub-agents (python-dataflow-tracer, detector-test-runner) that automate tracing and regression-checking the detector.
  • Genuine tailored memory files: DECISIONS.md logs real walls hit (jq install, dashboard not updating live, redirect map showing nothing) and PROMPTS.md captures the actual iterative prompts used; MCP server extended with a seo_fix tool, CSV fix export, and dashboard state-hydration from report.json.

What held them back

  • Precision capped at 0.586: slow_page over-predicts massively (152 predicted vs 11 in truth — applies Response Time>1.0 to ALL rows including non-HTML assets) and non_indexable_but_linked over-predicts (10 vs 2), dragging F1 well below recall.
  • Ordering bug: run.py calls seo_report() before seo_fix(), so outputs/report.json's fixes block is empty {titles:[],redirect_map:[]} even though the fix CSVs are populated — the JSON deliverable doesn't reflect the generated fixes.
  • Fixes are placeholder, not real: fixer.py is an admitted mock — titles become 'Optimized Title for <url> | High Converting SEO' with old='' (current title never read from the crawl) and every redirect target defaults to the homepage.
  • The orchestrator skill, the 4 starter sub-agents, and the README are only lightly modified from the starter scaffold; most of the real delta is concentrated in detector.py and server.py.
  • Stale leftover starter TODO comment in detector.py (lines 149-155) still lists detectors as 'to add' that were in fact already implemented above it.

How to improve

  • Restrict slow_page to indexable text/html 200 pages (and/or align the threshold to the rulebook population) and tighten non_indexable_but_linked — this alone would lift precision and F1 substantially with recall already at 1.0.
  • Reorder run.py to call seo_fix() before seo_report() so the report.json fixes block carries the generated titles/redirects.
  • Make the fixer real: read each page's current Title/Meta from the crawl rows, enforce <=60 char / <=155 char limits programmatically, and pick redirect targets by closest path match instead of always the homepage (graceful fallback when Ollama is absent is fine, but ground the mock in actual data).
  • Remove the obsolete TODO block in detector.py and add brief per-rule comments tying each detector to its rulebook row.
  • Differentiate the 4 inherited sub-agents (or prune to the ones actually used) so orchestration reads as bespoke rather than starter boilerplate.
5 Vansh Gupta F1 72% 83/100

Score breakdown (weighted)

Detection accuracy (F1 vs ground truth)22 / 30
Pipeline runs end-to-end on the crawl10 / 10
Output contract + fix artifacts8 / 8
Orchestration & architecture13 / 15
Code quality (code review)10 / 12
Process integrity (logs, commits, debugging)8 / 12
Context & memory files6 / 6
Deliverable & docs6 / 7
Raw total83 / 100
Verified F1 (objective accuracy): 72.3%  ·  committed report F1: 72.3%  ·  ran end-to-end: yes
Detection logic: seo/detector.py (398 lines, ~74% rewritten from the 7-detector starter), invoked via mcp/server.py seo_detect(); fix logic in fix_champion.py. Implements ~20 detector types covering ~13 of the 18 rulebook rules that map to ground-truth types (titles x3, meta x3, h1 x2, broken_link, redirect, redirect_chain, thin_content, slow_page, orphan, non_indexable_but_linked, canonical).

Why this rank

Vansh Gupta built a genuine, reproducible submission: the detector is ~74% rewritten from the 7-detector starter into a ~20-type rule engine with sensible normalization and redirect-graph traversal, and re-running it on the sample export reproduces the committed report.json exactly (F1 0.7226), so there is no sign of fabrication or hardcoding. Accuracy is held back not by missing detections — recall is a perfect 1.0 and most categories match the ground truth exactly — but by precision (0.566), driven almost entirely by an over-aggressive slow_page threshold (152 predicted vs 11 true) plus spurious canonical_issue and non_indexable_but_linked firings. The pipeline runs cleanly headless and degrades gracefully when Ollama and the Anthropic key are absent, producing a schema-valid report plus valid title-fix and redirect-map artifacts. The architecture is real: a FastMCP server, a live dashboard, an orchestrator skill, and four tailored sub-agents, taken meaningfully beyond the scaffold. Process integrity is mostly solid — a large authentic transcript, nine commits over four hours, and genuinely tailored memory files — but the audit.jsonl is thin and partly hand-added, so the three process records do not fully corroborate each other. The single biggest thing holding this submission back is detector precision: tightening three over-firing rules would lift F1 above 0.85 and add several accuracy points with little extra work. Earned 83/100 with no hard flags.

What they did well

  • Reproducible result: freshly re-run report scores precision 0.566 / recall 1.0 / F1 0.7226, matching the committed report.json exactly — no fabrication.
  • Perfect recall (1.0) with exact per-type matches on the hard categories: title_too_long (63/63), meta_description_too_long (42/42), duplicate_h1 (19/19), duplicate_title (12/12), title_too_short (21/21), broken_link, redirect, thin_content all 100% correct.
  • Runs cleanly headless with Ollama absent and degrades gracefully — fix_champion.py falls back to deterministic title rewrites when no Anthropic key is present, so the pipeline never crashes.
  • Real architecture beyond the scaffold: genuine FastMCP server (@mcp.tool over stdio) plus a live ThreadingHTTPServer dashboard wired into run.py, an orchestrator SKILL.md, and 4 tailored sub-agents (32-52 changed lines each vs starter).
  • Schema-valid report.json plus valid fix artifacts: fixes_titles.csv (84 titles clamped to 60 chars) and redirect_map.csv (6 broken links mapped to closest live page).
  • Genuine process trail: 118KB Claude Code transcript (217 assistant / 136 user messages, 46 file-history snapshots), 9 commits spread over 4.18h, and tailored CLAUDE.md / DECISIONS.md (timestamped iteration log) / PROMPTS.md.

What held them back

  • Precision is only 0.566 — two over-broad detectors dominate the false positives: slow_page predicts 152 vs 11 truth (>1.0s threshold far too aggressive, 141 FP) and canonical_issue predicts 13 (not even a ground-truth type, 13 FP); non_indexable_but_linked adds 8 more FP.
  • audit.jsonl is weak: only 11 lines from a single ~2-minute session covering just the fix_champion stage, and commit message 'added audit.jsonl manual' indicates it was hand-added rather than continuously hook-recorded — the three records (audit log, transcript, git) do not fully agree.
  • The over-firing slow_page=152 leaks into the client-facing report.html, undermining its credibility for a real client.
  • Deterministic title fallback produces low-quality rewrites (e.g. home page becomes 'Nmgtechnologies.Com | NMG Technologies', losing the original keyword-rich title) — acceptable as graceful degradation but not client-ready output.
  • README is essentially the untouched starter text (not tailored to the actual build); dashboard app.js is thin (35 lines).
  • report.html is functional and branded but compact/static (18 lines, single emitted block) rather than a richer client deliverable.

How to improve

  • Tune slow_page (use a realistic threshold or the rulebook's defined limit) and drop/refine canonical_issue and non_indexable_but_linked to cut ~160 false positives — this alone would push F1 well above 0.85 given recall is already 1.0.
  • Keep the audit hooks recording across the whole build so .claude/audit.jsonl reflects the real multi-hour session, rather than hand-adding an 11-line file at the end.
  • Rewrite the README to describe the actual implementation (detectors added, fix stage, run command, known precision tradeoffs) instead of shipping the starter text.
  • Improve the deterministic title fallback to preserve/derive meaningful titles from page content rather than slugifying the domain.
  • Expand the dashboard to surface per-issue drilldowns and live run state to match the 'live cockpit' claim.
6 Manish Upreti F1 75% 82/100

Score breakdown (weighted)

Detection accuracy (F1 vs ground truth)23 / 30
Pipeline runs end-to-end on the crawl10 / 10
Output contract + fix artifacts8 / 8
Orchestration & architecture13 / 15
Code quality (code review)9 / 12
Process integrity (logs, commits, debugging)8 / 12
Context & memory files5 / 6
Deliverable & docs6 / 7
Raw total82 / 100
Verified F1 (objective accuracy): 75.1%  ·  committed report F1: 75.1%  ·  ran end-to-end: yes
Detection logic: seo/detector.py detect() — deterministic plain-Python detectors. All 17 rulebook rules implemented (missing_title, duplicate_title, title_too_long, title_too_short, missing_meta_description, duplicate_meta_description, meta_description_too_long, missing_h1, duplicate_h1, broken_link, server_error, redirect, redirect_chain, thin_content, orphan_page, non_indexable_but_linked, slow_page), extended from the 8-detector starter (detector_changed_ratio 0.599). redirect_chain uses real graph traversal.

Why this rank

Manish built a genuine, working SEO audit pipeline that is clearly a real extension of the starter rather than the untouched scaffold. He implemented all 17 rulebook detectors in deterministic Python (up from the 8-detector starter), wired them through a customized MCP server, four tailored sub-agents, an orchestrator SKILL.md, and a live SSE dashboard, and produced schema-valid report.json plus real fix artifacts. Crucially, his committed F1 of 0.751 is fully reproducible: re-running run.py on the sample export regenerated an identical 351-pair report scoring verified_f1 0.7509, so there is no fabrication or hardcoding — recall is a perfect 1.0. The ceiling on his score is precision (0.601): slow_page and non_indexable_but_linked over-fire badly, costing him roughly seven accuracy points. Process integrity is mostly solid — 13 spread-out commits with substantive messages, a real 397-line transcript, and a genuinely tailored DECISIONS.md — but the audit.jsonl is a trivial one-line test stub, and the AI-fix layer can't be verified without Ollama. The single biggest thing holding him back is detection precision; fixing the slow_page threshold alone would meaningfully raise his accuracy score. Overall a strong, honest, end-to-end submission with no integrity flags.

What they did well

  • verified_f1 0.7509 exactly reproduces committed 0.751 — fully reproducible, no fabrication; running run.py on sample-export regenerated 351 identical pred pairs.
  • Implemented all 17 rulebook detectors with perfect recall (1.0); per-type breakdown shows exact matches on title_too_long (63/63), meta_description_too_long (42/42), duplicate_h1 (19/19), broken_link (6/6) and more.
  • Genuine delta over starter: detector.py +59.9% changed, server.py ~465 changed lines (added fixes block + CSV export), all 4 sub-agents and SKILL.md customized.
  • Graceful degradation without Ollama — model fix calls fail silently into deterministic fallbacks, so detection and a valid report still ship; 13 commits over ~5h (not a single dump) with meaningful messages and a real 397-line agent-log.md transcript.
  • Real deliverables: schema-valid report.json, client-ready dark-themed report.html, fix artifacts (titles_metas.csv with 5 rewrites + redirect_map.csv with 6 entries), and tailored DECISIONS.md documenting actual bugs (KeyError guard, export sequencing, response sanitization).

What held them back

  • Precision only 0.601 — slow_page massively over-predicts (143 vs truth 11; >1.0s threshold too loose for this export) and non_indexable_but_linked over-predicts (10 vs 2), dragging F1 down despite perfect recall.
  • audit.jsonl is a trivial 1-line stub (session_id 'test-123', hook 'ManualTest', tool 'ls') — not a genuine multi-event process log, so the strongest integrity signal is missing (mitigated by real commits + transcript).
  • run.py prints emoji to stdout and crashes on Windows cp1252 consoles (UnicodeEncodeError) unless PYTHONUTF8 is set — a portability/robustness gap, though detection completes and it would not crash on the grader's Linux.
  • DECISIONS.md claims a 'Cloud Ollama, 84.4s runtime' pivot, but Ollama is unavailable to the judge and the AI-fix value-add (title rewrites, contextual redirect targets) cannot be verified live — fixes fall back to slug/default heuristics.
  • CLAUDE.md still carries the starter scaffold header/instructions; only the appended 'Things I learned' section is tailored, so memory-file customization is partial.

How to improve

  • Tighten slow_page and non_indexable_but_linked to the exact rulebook semantics (confirm Response Time units and the indexable-200 prefilter) to lift precision from 0.60 toward 0.9+.
  • Wrap emoji/console output with an encoding-safe print or set sys.stdout reconfigure(encoding='utf-8') so the runner is portable across OS consoles.
  • Wire the .claude/audit.jsonl hook to actually capture tool events during the build instead of leaving a manual one-line test stub.
  • Make the AI fixer degrade explicitly (mark fixes as 'skipped: model unavailable') rather than silently emitting heuristic fallbacks, so reviewers can distinguish real model output.
  • Strip the starter boilerplate from CLAUDE.md and keep only project-specific rules and learnings.
7 Parth Bisht F1 99% 80/100

Score breakdown (weighted)

Detection accuracy (F1 vs ground truth)30 / 30
Pipeline runs end-to-end on the crawl10 / 10
Output contract + fix artifacts5 / 8
Orchestration & architecture8 / 15
Code quality (code review)8 / 12
Process integrity (logs, commits, debugging)8 / 12
Context & memory files6 / 6
Deliverable & docs5 / 7
Raw total80 / 100
Verified F1 (objective accuracy): 99.1%  ·  committed report F1: 99.1%  ·  ran end-to-end: yes
Detection logic: seo/detector.py (detect() extended +64/-11 lines vs starter; invoked via mcp/server.py seo_detect -> run.py). 12 of 18 rulebook types implemented and emitted: duplicate_title, title_too_long, title_too_short, broken_link, redirect, duplicate_meta_description, meta_description_too_long, missing_h1, duplicate_h1, thin_content, non_indexable_but_linked, slow_page. (missing_title/server_error/orphan_page/redirect_chain coded but produce no rows on this crawl; missing_image_alt not implemented.)

Why this rank

Parth's submission earns 80/100 as a clean, honest, accuracy-focused entry whose headline number is fully verified. The committed report.json claims f1=0.991, and re-running their own pipeline on the sample export produced a byte-identical file (matching MD5) scoring verified_f1=0.9905 against the official scorer — so despite the absence of audit.jsonl, the report is demonstrably reproduced by code, not hand-fabricated; no integrity flags apply. Their genuine contribution is concentrated in seo/detector.py (+64/-11 lines over the starter), which implements 12 rulebook issue types with correct indexable/HTML filtering and tuned thresholds, hitting 11 of 12 types exactly and 209/211 true positives with no hardcoding. The process is credible: 10 commits over four hours with a sensible progression, a large real Claude Code transcript, and memory files genuinely tailored to this build. The single biggest thing holding it back is unfinished scope: the Champion-tier fixes were never delivered (empty titles.csv, missing redirect map, zero model calls), and almost everything outside the detector is the untouched starter scaffold (server.py changed by only 3-4 lines, agents and SKILL near-verbatim). A latent missing_h1 logic bug and a run.py that never exits headless round out the rough edges, but the work that exists is real and accurate.

What they did well

  • Reproducible result: re-running their code regenerated outputs/report.json BYTE-FOR-BYTE identical to the committed file (same MD5), scoring verified_f1=0.9905 (209/211 true positives) via the official scorer — the high score is genuine, not fabricated.
  • Near-perfect per-type accuracy: 11 of 12 issue types match ground truth exactly (e.g. title_too_long 63/63, title_too_short 21/21, meta_description_too_long 42/42, broken_link 6/6, redirect 7/7).
  • Real engineering delta in detector.py: +64/-11 lines over the starter, correctly applying text/html + indexable+200 filtering and tuned thresholds; no hardcoding of sample URLs, counts, or any ground-truth file read.
  • Genuine process trail: 10 commits spread across ~4 hours (12:55-16:55) with a believable progression (scaffold -> 17 detectors -> SSE/keepalive fixes -> docs), plus a 940KB real Claude Code session transcript (agent-log.md) showing iterative debugging.
  • Tailored memory files: DECISIONS.md, CLAUDE.md and PROMPTS.md contain real, build-specific, timestamped entries (architecture review, detector implementation, dashboard lifecycle fix) that align with the git history and transcript.
  • Schema-valid output: report.json carries all required issue keys (type/severity/affected_urls/count) plus a fixes block, and the contract validates.

What held them back

  • Champion-tier fixes are essentially absent: fix_files/titles.csv contains only a header row (37 bytes, zero rewrites), redirect_map.csv does not exist despite a commit claiming it was scaffolded, and report.json fixes block is {titles:[], redirect_map:[]} with model_calls=0.
  • No audit.jsonl: the starter hook (.claude/hooks/audit.sh) and settings.json wiring are present but unchanged, and no audit.jsonl was ever produced or committed, so the dedicated tamper-evident process log is missing (mitigated by the genuine agent-log.md transcript).
  • Orchestration is mostly untouched starter scaffold: SKILL.md and the 4 agents are near-verbatim bundle text, and mcp/server.py differs from the starter by only +4/-3 lines (just the SSE emit_fn wiring) — little was built beyond the provided architecture.
  • Logic bug in missing_h1: it filters on 'not indexable(r)' so it flags 2 wrong URLs (scorer: pred 2, correct 0) — the count coincidentally matched truth so it didn't hurt F1, but the detector targets the wrong pages.
  • run.py ignores --no-dashboard semantics for shutdown: after writing the report it enters an infinite 'while True: sleep' keepalive loop, so the headless grader command never terminates on its own.
  • Only 12 of 18 rulebook issue types actually produce output; missing_image_alt and several others are not contributing.

How to improve

  • Deliver the Champion tier: actually populate fix_files/titles.csv with validated <=60-char / <=561px rewrites and generate redirect_map.csv, then wire them into the report.json fixes block.
  • Fix the missing_h1 detector to target indexable 200 HTML pages with an empty H1-1 instead of 'not indexable(r)'.
  • Make run.py exit after writing outputs when --no-dashboard is passed (only enter the keepalive loop when the dashboard is started) so headless grading terminates cleanly.
  • Either generate and commit a real .claude/audit.jsonl from a hooked session, or trim the unused hook wiring so the process log is consistent.
  • Push real work into the orchestration layer (distinct sub-agent behavior, richer dashboard) rather than shipping the near-untouched starter scaffold.
8 Adil Ansari F1 74% 80/100

Score breakdown (weighted)

Detection accuracy (F1 vs ground truth)22 / 30
Pipeline runs end-to-end on the crawl10 / 10
Output contract + fix artifacts8 / 8
Orchestration & architecture12 / 15
Code quality (code review)10 / 12
Process integrity (logs, commits, debugging)6 / 12
Context & memory files6 / 6
Deliverable & docs6 / 7
Raw total80 / 100
Verified F1 (objective accuracy): 73.9%  ·  committed report F1: 73.9%  ·  ran end-to-end: yes
Detection logic: seo/detector.py (230 lines). All 17 rulebook issue types implemented deterministically (starter only had ~6/4 effective). Builder added title_too_short, missing/duplicate/long meta_description, missing_h1, duplicate_h1, redirect_chain (with loop detection), thin_content, non_indexable_but_linked, slow_page; also fixed summarize() to sum affected-URL counts. Wired via mcp/server.py seo_detect().

Why this rank

Adil Ansari built a genuine, working SEO audit pipeline on top of the starter and clearly did real engineering: the detector now implements all 17 rulebook issue types (the starter had only a handful), and the MCP server more than doubled in size to add a real fixer (title/meta rewrites with length validation and a path-walking redirect map), prioritized recommendations, a client HTML report, and an SSE-driven live dashboard that actually reflects the run. The work is fully reproducible — my fresh headless run on the sample export produced a schema-valid report.json that scores verified_f1 = 0.7391, identical to the committed report, with perfect recall; there is no fabrication, no hardcoding of sample URLs or the answer key, and the pipeline degrades gracefully without Ollama. Accuracy is the main objective limiter: precision is 0.586 because slow_page over-predicts 14x (152 vs 11) and non_indexable_but_linked over-fires, so easy threshold fixes could push F1 well above 0.9. Process is credibly genuine — 14 descriptive commits over 5.5 hours plus tailored CLAUDE.md/DECISIONS.md/PROMPTS.md — but the single biggest thing holding the submission back beyond precision is the absence of any committed process audit trail: no .claude/audit.jsonl and no exported transcript, even though the hooks and export script were provided. The sub-agents and README also remain close to the starter scaffold. Overall this is a solid, honest, working submission whose ceiling is capped by detector precision and missing process artifacts rather than by any integrity problem.

What they did well

  • Detector implements the full 17-type rulebook deterministically; verified_f1 = 0.7391 with perfect recall (1.0), and the fresh run reproduces the committed report.json EXACTLY (committed_f1 0.7391, both 360 pred pairs) — fully reproducible, no fabrication.
  • Pipeline runs clean end-to-end with no Ollama: loaded 456 URLs, detected 12 issue types, generated 92 title/meta fixes + 6 redirects, wrote schema-valid report.json (jsonschema.validate passed) + report.html + fix CSVs.
  • Real value-add beyond the scaffold: mcp/server.py grew from the 221-line starter to 548 lines, adding seo_fix (title/meta rewrite with 30-60 char validation + redirect-map walking up the path tree to nearest live ancestor), _build_recommendations, a /run HTTP trigger, and a rich client HTML renderer.
  • Genuine live dashboard (dashboard/app.js, 129 lines): SSE event handling for loaded/issue/summary/fixes/exported, expandable per-issue URL lists with inline fix display, and live KPI counters — it genuinely reflects the run, not a stub.
  • Genuine incremental process: 14 commits spread over 5.5 hours (12:30-18:01) with descriptive messages tracing real iteration (gap analysis -> add detectors -> fixer -> recommendations -> dashboard fixes).
  • Memory files are real and build-specific: CLAUDE.md, DECISIONS.md (timestamped real decisions about detector gaps and focused-file workflow), and PROMPTS.md (actual prompts used) are all tailored, not templates.

What held them back

  • Precision is only 0.586: slow_page massively over-predicts (152 predicted vs 11 in ground truth, Response Time > 1.0 threshold mismatch) and non_indexable_but_linked over-predicts (10 vs 2), dragging F1 from a potential ~0.95 down to 0.74.
  • No process audit trail committed: .claude/audit.jsonl is absent (audit_lines=0) and there is no agent-log.md / transcript (transcript_bytes=0) despite the starter hooks + export script being present — the single biggest gap in process integrity.
  • Sub-agent files (ingest/auditor/fixer/reporter) and SKILL.md are largely the inherited starter scaffold (small diffs, 36-52 lines); they are coherent and wired but not substantially expanded by the builder.
  • README is effectively the untouched starter (still titled 'starter', 'Your job in the Sprint', 'EXTEND THIS') — diff is only line-ending noise; no builder-authored documentation of what they actually shipped.
  • DECISIONS.md notes the builder maintained memory files manually and reserved Claude mainly for code/debugging, which is consistent with the missing audit/transcript artifacts.

How to improve

  • Tighten slow_page (verify the ground-truth Response Time threshold; the >1.0 rule over-fires by 14x) and constrain non_indexable_but_linked (likely should exclude 3xx/canonicalized non-indexables) — this alone would lift precision toward ~0.95.
  • Keep .claude/settings.json hooks active and commit .claude/audit.jsonl, and run scripts/export-transcript.sh to commit agent-log.md — this is free process-integrity credit that was left on the table.
  • Differentiate the sub-agents beyond the scaffold (e.g., give the fixer a real model-validation-and-retry loop, the auditor a CSV cross-check against the issues_reports/ files) so orchestration scores reflect distinct, builder-authored agents.
  • Write a real README describing the shipped system (detectors implemented, run command, dashboard, fix outputs) instead of leaving the starter README.
  • Add a brief precision/recall self-check in run.py (or a test) so threshold over-prediction is caught before submission.
9 Vipul Kohli F1 74% 77/100

Score breakdown (weighted)

Detection accuracy (F1 vs ground truth)22 / 30
Pipeline runs end-to-end on the crawl10 / 10
Output contract + fix artifacts7 / 8
Orchestration & architecture9 / 15
Code quality (code review)9 / 12
Process integrity (logs, commits, debugging)11 / 12
Context & memory files3 / 6
Deliverable & docs6 / 7
Raw total77 / 100
Verified F1 (objective accuracy): 73.9%  ·  committed report F1: 73.9%  ·  ran end-to-end: yes
Detection logic: seo/detector.py (deterministic, stdlib csv). Builder extended the starter from ~7 to ~17 detectors, implementing all 10 TODO rules listed in the starter (title_too_short, missing_meta_description, duplicate_meta_description, meta_description_too_long, missing_h1, duplicate_h1, slow_page, thin_content, non_indexable_but_linked, redirect_chain). detector_changed_ratio 0.325 confirms real edits. Of the 18 rulebook rules, ~16-17 have detectors; 12 distinct issue types fired on the sample, all 12 with perfect recall.

Why this rank

Vipul shipped a genuine, reproducible Track B submission: the detector was extended from the starter's ~7 rules to ~17, implementing all ten of the starter's TODO detectors, and re-running the pipeline reproduced the committed report almost exactly (verified_f1=0.7391 vs committed 0.739) with perfect recall — so there is no sign of fabrication, hard-coding, or faked logs. The accuracy ceiling is set by precision (0.586), which is hurt by two aggressive detectors (slow_page over-counts 152 vs 11, non_indexable_but_linked 10 vs 2). Beyond detection, the standout is a clean, self-authored fix_rewriter.py with disciplined length-validate-retry-truncate loops and a deterministic redirect-map builder that works offline, and the pipeline degrades gracefully when Ollama is absent. Process integrity is strong: 13 incremental commits over ~4.9 hours, a real 93-event audit.jsonl, a 63KB genuine transcript, and a tailored DECISIONS.md showing actual debugging. The single biggest thing holding the score back is that the orchestration and presentation layers — all four sub-agents, the SKILL orchestrator, the command, the dashboard, the inner README, and CLAUDE.md — are the untouched starter scaffold, so the architecture/memory credit is limited and the real engineering is concentrated in three files. It is honest, working, mid-tier work that would jump with precision tuning and real orchestration/memory effort.

What they did well

  • Detection is real work and fully reproducible: re-running run.py produced a report byte-identical to the committed one (only duration_sec differs), scoring verified_f1=0.7391, exactly matching committed_f1=0.739.
  • Extended the starter detector from ~7 to ~17 detectors, implementing every one of the 10 TODO rules the starter left unimplemented; recall is a perfect 1.0 (all 211 truth pairs found).
  • Genuine, well-modularized fix layer in a new file seo/fix_rewriter.py: title and meta rewriting with code-side length validation + a single stricter retry + hard truncate, plus a deterministic path-prefix redirect-map builder that produced 6 valid {from,to,reason} entries WITHOUT Ollama running.
  • Robust headless degradation: with Ollama absent the pipeline ran clean (exit 0), wrote a schema-valid report.json + styled report.html, and the model-driven title/meta fixes simply returned [] instead of crashing.
  • Strong process integrity: 13 commits with meaningful messages spread incrementally over ~4.9h, a real 93-event audit.jsonl (Read/Bash/Edit/Write/WebSearch across two session IDs), a 63KB genuine Claude Code transcript, and a tailored DECISIONS.md documenting real debugging (e.g. fixing redirect_chain to flag the initiating address).

What held them back

  • Orchestration delta is thin: all 4 sub-agent .md files, the SKILL.md orchestrator, the /seo-audit command, and the entire dashboard (app.js + index.html) are byte-identical to the starter scaffold (0 changed lines ignoring line-endings). The real architecture work was confined to detector.py, fix_rewriter.py, and ~32 changed lines in mcp/server.py.
  • Precision is only 0.586, dragged down by two over-counting detectors: slow_page predicted 152 URLs vs 11 truth (threshold >1.0s far too aggressive) and non_indexable_but_linked predicted 10 vs 2 truth.
  • CLAUDE.md is the untouched starter template (0 changed lines vs starter; scan confirms claude_tailored=false), forfeiting most of the memory-file credit.
  • Title/meta fix artifacts are empty in the committed report (titles=[], metas=[]) because they are fully gated behind a live Ollama; only the deterministic redirect_map survives, so the headless deliverable shows no rewritten titles.
  • Minor code bugs in fix_rewriter.build_redirect_map: scores against live_url.split('/') (full URL incl scheme/host) instead of the computed live_path, and several redundant .format() calls on already-interpolated f-strings.

How to improve

  • Tune the over-counting detectors: raise slow_page threshold (or use a percentile / the issues_reports CSV) and tighten non_indexable_but_linked to lift precision toward recall and push F1 well past 0.74.
  • Actually extend the orchestration layer instead of shipping the starter agents/SKILL/dashboard unchanged — e.g. add a verification sub-agent that cross-checks detector counts against the Screaming Frog issue CSVs, and surface the new fix types in the dashboard.
  • Tailor CLAUDE.md to this build (commands, conventions, the detector/fixer split) to capture the memory-file points.
  • Make the fixers degrade more usefully without Ollama (e.g. deterministic truncation fallback for over-long titles/metas) so the offline deliverable still ships title/meta suggestions, not just a redirect map.
  • Fix the live_path bug in the redirect scorer and remove the dead .format() calls.
10 Aryan Khurana F1 50% 77/100

Score breakdown (weighted)

Detection accuracy (F1 vs ground truth)15 / 30
Pipeline runs end-to-end on the crawl10 / 10
Output contract + fix artifacts8 / 8
Orchestration & architecture9 / 15
Code quality (code review)10 / 12
Process integrity (logs, commits, debugging)12 / 12
Context & memory files6 / 6
Deliverable & docs7 / 7
Raw total77 / 100
Verified F1 (objective accuracy): 50.1%  ·  committed report F1: 50.1%  ·  ran end-to-end: yes
Detection logic: seo/detector.py (203 lines, detector_changed_ratio 0.348) — deterministic, reads only internal_all.csv. ~21 detectors implemented covering all 12 ground-truth types plus extras (server_error, redirect_chain, orphan_page, missing_image_alt). Of the 18 rulebook rules, ~17 are present; fixes (title rewrites + redirect map) live in run.py (173 added lines, deterministic).

Why this rank

Aryan built a genuinely working, reproducible SEO audit pipeline: running it headless without Ollama reproduced his committed numbers exactly (verified_f1 0.5012 vs committed 0.501), and the detector achieves perfect recall on every one of the 12 ground-truth issue types with exactly correct URL sets — the underlying detection logic and filters are excellent. The score is held back by precision (0.334): two non-ground-truth/over-aggressive detectors (missing_image_alt at 279 pairs and slow_page at 152 vs 11) flood the output with false positives, and tuning just those two would have roughly doubled his F1. The process side is strong and clearly honest — a real 195-event audit log, a real transcript, 13 well-described commits over nearly five hours, and unusually detailed, build-specific memory files documenting actual debugging. The main architectural weakness is that the orchestrator skill and all four sub-agents are the untouched starter (the real added work lives in run.py, detector.py, and the rewritten dashboard), and the 'model-driven' fixes are actually deterministic, leaving a small honesty gap between docs and code. No integrity flags fire: nothing is fabricated, hardcoded, plagiarized, or faked. The single biggest thing holding him back is detector precision tuning — a near-trivial fix that he didn't catch by validating against the provided issue CSVs.

What they did well

  • Perfect recall (1.0) on all 12 ground-truth issue types: every GT type detected with exactly correct URL sets (e.g. title_too_long 63/63, meta_description_too_long 42/42, duplicate_h1 19/19, broken_link 6/6) — the detection logic and column filters are precise.
  • Fully reproducible: re-running the pipeline produced verified_f1 0.5012, matching committed_f1 0.501 to the digit — no fabrication.
  • Genuine, high-quality process artifacts: real .claude/audit.jsonl with 195 varied tool events spanning ~2.5h, a real Claude Code transcript in agent-log.md, and 13 commits over 4.8h showing clear incremental progression (11/17 → all detectors → champion fixes → dashboard).
  • Exceptional memory files: timestamped DECISIONS.md logging real bugs and fixes (hook matcher format, import path coupling, thin_content empty-word-count edge case), accurate 17-detector reference table in CLAUDE.md, and a substantive PROMPTS.md.
  • Champion-tier fix generation works headless without Ollama: 83 title rewrites (all <=60 chars, 0 over limit) and a 6-entry redirect map, attached via the MCP set_fixes tool; report.json is schema-valid and report.html is client-ready (KPI grid, expandable affected-URL lists, print CSS).

What held them back

  • Precision is only 0.334 — the F1 ceiling. Two detectors over-flag against ground truth: missing_image_alt emits 279 pairs (not a GT type at all) and slow_page emits 152 vs 11 truth (>1.0s threshold far too aggressive). Suppressing/tuning just these two would push precision near 1.0.
  • The orchestration layer is the untouched starter: skills/seo-audit/SKILL.md and all 4 agent files (ingest/auditor/fixer/reporter) are byte-identical to the bundle (only CRLF differs), and mcp/server.py is largely the starter — the real added work is in run.py, detector.py, and the dashboard, not the agent/skill prompts.
  • Fixes are deterministic, not model-driven, yet docs/agents describe model-written titles and redirect-target judgment; the redirect map reflects this gap (e.g. a 4xx image .png is mapped to the homepage as 'closest live page').
  • redirect_map quality is weak — path-similarity fallback sends unrelated broken assets to the site root rather than a sensible section page.
  • DECISIONS.md/CLAUDE.md state 'do not hard-code to the sample export' and that all detectors fire correctly, but the builder never recognized that missing_image_alt and slow_page were hurting precision on the hidden-style export.

How to improve

  • Drop missing_image_alt from the report (not a scored type) and recalibrate slow_page to a realistic threshold (e.g. >3s or use Screaming Frog's own slow-response CSV) — this alone roughly doubles precision and F1.
  • Actually extend the orchestrator SKILL.md and sub-agent prompts instead of shipping the starter versions, so the architecture score reflects real delegation.
  • Wire a genuine model call (with the documented validate-and-retry loop) for title/meta rewrites and redirect-target selection, with deterministic fallback when the model is unavailable.
  • Cross-check detector output counts against the provided issues_reports/*.csv to catch over-/under-flagging before submission.
  • Improve redirect-target selection to prefer a same-section live page and skip non-HTML assets.
11 KAPIL BHATI F1 73% 76/100

Score breakdown (weighted)

Detection accuracy (F1 vs ground truth)22 / 30
Pipeline runs end-to-end on the crawl10 / 10
Output contract + fix artifacts5 / 8
Orchestration & architecture9 / 15
Code quality (code review)9 / 12
Process integrity (logs, commits, debugging)9 / 12
Context & memory files6 / 6
Deliverable & docs6 / 7
Raw total76 / 100
Verified F1 (objective accuracy): 73.0%  ·  committed report F1: 73.0%  ·  ran end-to-end: yes
Detection logic: seo/detector.py (223 lines, changed_ratio 0.349). Real deterministic logic in detect(); ~16-18 of the 18 rulebook rules implemented: missing_title, duplicate_title, title_too_long, title_too_short, missing_meta_description, duplicate_meta_description, meta_description_too_long, missing_h1, duplicate_h1, missing_image_alt (read from issues_reports inlinks CSV), redirect_chain, thin_content, non_indexable_but_linked, slow_page, broken_link, server_error, redirect, orphan_page. Detection is plain Python over the CSV; model is not used for counting.

Why this rank

Kapil started from the standard bundle and did genuine, focused work on the part that matters most: the deterministic detector. He extended it from the starter's handful of rules to roughly the full rulebook (~16-18 detectors), including a non-trivial missing_image_alt detector that reads Screaming Frog's inlinks issue CSV. The result is honest and fully reproducible — re-running on the test crawl yields verified_f1 0.7301, matching the committed 0.73 to the digit, with perfect recall; nothing is fabricated or hard-coded. Accuracy is held back by precision (0.575): slow_page alone over-predicts 152 vs 11, so the score is real but noisy. The pipeline runs cleanly headless without Ollama, and the report.json is schema-valid. Process integrity is mostly strong — 13 incremental, well-labeled commits, a real transcript, and a debugging fix traceable across DECISIONS, PROMPTS and code — but the audit.jsonl never recorded, leaving one process record missing. The single biggest thing holding him back is that the champion fixer was never built: the fixes block is empty, so no title rewrites or redirect map were delivered, and the orchestration beyond detection is largely the untouched starter scaffold.

What they did well

  • Fully reproducible: re-running the pipeline on the test crawl produced verified_f1 0.7301, matching the committed 0.73 exactly (367 pred pairs, 211 truth, perfect recall 1.0) — no fabrication.
  • Substantial real detector work over the starter: added title_too_short, all meta-description detectors, both H1 detectors, redirect_chain, thin_content, non_indexable_but_linked, slow_page, and a missing_image_alt detector that correctly parses Screaming Frog's images_missing_alt_text_inlinks.csv to recover page (Source) URLs.
  • Pipeline runs end-to-end headless with Ollama absent and does not crash, writing valid report.json + report.html; detection is deterministic so accuracy is unaffected by the missing model.
  • Genuine, traceable process: 13 well-described incremental commits spread over the sprint window, a real 457-line agent-log transcript, and a documented debugging story (dashboard not populating after a run -> added /state fetch on load) that appears consistently across DECISIONS.md, PROMPTS.md and the actual app.js code.
  • report.json is schema-valid against report.schema.json (all required keys present) and recommendations are concrete and severity-ordered.

What held them back

  • Champion fixer tier is not implemented: the fixes block is empty ({titles:[], redirect_map:[]}) despite fixer.md and SKILL.md describing title rewrites and a redirect map — no fix artifacts were produced.
  • Precision is only 0.575, driven by over-prediction: slow_page predicts 152 URLs vs 11 in ground truth (>1.0s threshold far too aggressive), non_indexable_but_linked 10 vs 2, and missing_image_alt 4 vs 0 (a false-positive issue type) — perfect recall is partly bought with noisy precision.
  • audit.jsonl is missing entirely (only settings.json and the hooks dir exist); the audit hook never recorded, so one of the three required process records is absent (scan: audit_jsonl=false, audit_lines=0).
  • Orchestration is largely the starter scaffold: SKILL.md and the 4 agents have only light edits, mcp/server.py is functionally the untouched starter (CRLF/blank-line diff noise aside), so the architecture delta beyond detection is modest.
  • README is the untouched starter README, and DECISIONS.md claims 'all detection in plain pandas' while detector.py actually uses the csv stdlib — a small but real doc-vs-code inconsistency.
  • A time.sleep(0.5) per issue is baked into the deterministic detector purely to 'simulate work for dashboard visibility' — an artificial delay in the core path.

How to improve

  • Implement the fixer: generate length-validated title/meta rewrites and a redirect map for 4xx pages, and populate the fixes block to claim the champion tier and the C-contract fix points.
  • Tighten over-predicting detectors: calibrate the slow_page threshold (and review non_indexable_but_linked and missing_image_alt) against the rulebook to lift precision without sacrificing recall.
  • Fix the audit hook so .claude/audit.jsonl actually records tool events, completing the three-record process requirement.
  • Customize the README to describe what was actually built and reconcile the 'pandas' wording in DECISIONS.md with the csv-based implementation.
  • Remove the artificial time.sleep from the detector and emit SSE progress without slowing the deterministic pipeline.
12 Prabal Verma F1 74% 73/100

Score breakdown (weighted)

Detection accuracy (F1 vs ground truth)22 / 30
Pipeline runs end-to-end on the crawl10 / 10
Output contract + fix artifacts6 / 8
Orchestration & architecture8 / 15
Code quality (code review)9 / 12
Process integrity (logs, commits, debugging)10 / 12
Context & memory files5 / 6
Deliverable & docs3 / 7
Raw total73 / 100
Verified F1 (objective accuracy): 73.9%  ·  committed report F1: 73.9%  ·  ran end-to-end: yes
Detection logic: seo/detector.py (154 lines, full pandas rewrite; ~195 real diff lines vs starter). Implements all 17 rulebook types (missing_title, duplicate_title, title_too_long/short, missing/duplicate_meta_description, meta_description_too_long, missing_h1, duplicate_h1, broken_link, server_error, redirect, redirect_chain, thin_content, orphan_page, non_indexable_but_linked, slow_page). Wired through mcp/server.py seo_detect(). 12 of 17 types fired on this crawl (the other 5 have zero ground-truth rows here).

Why this rank

Prabal built a real, working SEO detector: seo/detector.py is a full pandas rewrite covering all 17 rulebook rules (the starter shipped only 7), and it runs end-to-end headlessly, degrading gracefully when Ollama is absent to still emit a schema-valid report.json and report.html. The output is fully reproducible - regenerating the report matched the committed one exactly at verified_f1 = 0.7391, with no fabrication, no hard-coding, and no ground-truth peeking. Recall is perfect (211/211 truth pairs), but precision is only 0.586 because slow_page is scored over all 456 rows instead of indexable-200 pages, injecting 141 false positives that account for essentially the entire accuracy loss. The process is credibly genuine - 19 iterative commits over 5.5 hours and a rich 478-line audit log show real debugging, especially around the LLM integration. Where the submission falls short is the delta beyond the starter outside the detector: the orchestrator skill, all four sub-agents, the dashboard, and the README are the untouched starter scaffold, and the model-driven fix deliverable collapses to LLM_FIX_FAILED with no deterministic fallback and no redirect map. The single biggest thing holding the score back is the slow_page filtering bug, which is a one-line fix that would jump accuracy from ~0.74 to ~0.95; close behind is the thin, mostly-boilerplate orchestration and fix layer.

What they did well

  • Fully reproducible: re-running the pipeline regenerated a report byte-identical (type,count) to the committed one, scoring verified_f1=0.7391 = committed 0.739 exactly. No fabrication.
  • Detector is a genuine full rewrite (not the 7-rule starter): clean vectorized pandas implementing all 17 rulebook rules with correct text/html + indexable + 200 pre-filters, achieving perfect recall (211/211 truth pairs found).
  • Graceful degradation with Ollama absent: pipeline exits 0 and writes valid schema-conformant report.json + report.html; fixer catches the missing-model subprocess error and writes LLM_FIX_FAILED instead of crashing (documented decision in DECISIONS.md).
  • Genuine process: 19 commits over 5.57h with real iterative messages (multiple 'trying to fix llm error' debugging cycles), and a real 478-event audit.jsonl spanning 07:15-11:37 with varied tools (Bash 154, Read 116, Edit 31, Skill 12).
  • CLAUDE.md and DECISIONS.md are tailored to this build (pandas-for-detection rationale, graceful-failure decision, port-conflict workaround) rather than untouched templates.

What held them back

  • Precision only 0.586: slow_page predicted 152 vs truth 11 because the detector applies Response Time > 1.0 to ALL rows instead of indexable-200 pages (141 false positives); non_indexable_but_linked predicted 10 vs truth 2. These two over-predictions are the entire F1 gap.
  • Fix deliverable is empty in practice: all 21 entries in outputs/fixes_titles.csv are 'LLM_FIX_FAILED' and the redirect_map is unimplemented (0 entries despite 7 redirects detected) - the fixer has no deterministic fallback when the model is unavailable.
  • Orchestration scaffold is the untouched starter: SKILL.md (0 real diff lines), all 4 sub-agents (0 real diff), and dashboard/app.js (0 real diff) are byte-for-byte the starter (only CRLF differences); the only architecture delta is ~31 lines wiring the fixer into server.py.
  • README is the untouched starter (still reads 'starter', 'EXTEND THIS', 'Your job in the Sprint') and was never updated to describe what was actually built.
  • PROMPTS.md core 'My prompts' section was left as placeholders ('1. ... 2. ...'); only a generic project-history blurb was added. agent-log.md/transcript is absent (transcript_bytes=0, export-transcript.sh never run).
  • Minor: DECISIONS.md claims start_dashboard() was 'commented out' but it is actually gated behind the --no-dashboard flag; committed __pycache__ .pyc files clutter the repo.

How to improve

  • Restrict slow_page to indexable-200 rows (df_idx200) to match the rulebook ground truth - this single fix would lift precision substantially and push F1 toward ~0.95.
  • Add a deterministic title-rewrite fallback (truncate/template from H1 + URL slug within 60 chars) so fixes_titles.csv is useful even when the model is offline, and implement the redirect_map for 3xx pages.
  • Genuinely extend the orchestration layer (custom SKILL steps, distinct agent prompts, dashboard tweaks) instead of shipping the starter scaffold, and update the README to reflect the real build.
  • Fill in PROMPTS.md with the actual key prompts and run scripts/export-transcript.sh to commit agent-log.md; remove __pycache__ from version control.
13 Divyansh SinghOther issue F1 47% 73/100
Integrity adjustment: raw 76 → final 73 — −3 penalty (Other issue).

Score breakdown (weighted)

Detection accuracy (F1 vs ground truth)14 / 30
Pipeline runs end-to-end on the crawl10 / 10
Output contract + fix artifacts8 / 8
Orchestration & architecture12 / 15
Code quality (code review)8 / 12
Process integrity (logs, commits, debugging)11 / 12
Context & memory files6 / 6
Deliverable & docs7 / 7
Raw total76 / 100
Verified F1 (objective accuracy): 46.8%  ·  committed report F1: 73.9%  ·  ran end-to-end: yes
Evidence: other: committed report.json (F1 0.739) is STALE vs current code. The final commit c3a5f7f 'found bug and fixed: thin-content rule' actually REGRESSED the thin_content detector (changed the row filter from idx200 to all indexable rows), so re-running current HEAD produces thin_content pred=340 vs truth=10, dropping verified_f1 to 0.4684. Not fabrication: I checked out the contemporary detector (d72ec80) and reproduced the committed report exactly (F1 0.7391, thin pred 10).
Detection logic: seo/detector.py (detect()), invoked via mcp/server.py seo_detect() and run.py. All 17 rulebook issue types implemented (missing_title, duplicate_title, title_too_long, title_too_short, missing/duplicate/too-long meta description, missing_h1, duplicate_h1, broken_link, server_error, redirect, redirect_chain, thin_content, orphan_page, non_indexable_but_linked, slow_page); detector grew from the ~7-rule starter (detector_changed_ratio 0.219).

Why this rank

Divyansh built a complete, genuine submission: the detector implements all 17 rulebook rules (a real delta from the ~7-rule starter), the pipeline runs cleanly headless without Ollama, and the output is a schema-valid report.json plus a client-ready HTML report and a real fixer agent that produces validated title rewrites and a redirect map. The process is convincingly authentic - 121 real audit events across multiple sessions, 13 commits over three hours, and timestamped decision/prompt logs that document actual debugging, including the moment he noticed the thin_content rule. The biggest thing holding the score back is that his final 'fix' commit actually regressed that thin_content detector (broadening its row filter), so re-running his current code yields verified_f1 0.468 even though the committed report scores 0.739. Crucially this is not cheating: I checked out the detector version contemporary with the committed report and reproduced it exactly, so the report is honest but stale, and the regression is a real bug, not fabrication. Precision is the underlying ceiling - recall is perfect but several rules over-predict against ground truth. Code quality is solid and readable but marred by that regression, a couple of discarded fix outputs, and crude redirect targeting. Overall this is a strong, honest build whose final score is dragged down by a last-minute self-inflicted accuracy regression rather than any integrity problem.

What they did well

  • Completed the full rulebook: all 17 issue types implemented in detector.py vs the ~7-detector starter, each matching the rulebook spec (verified by diff against C:\tmp\forge-bundle\seo-command-center\seo\detector.py).
  • Pipeline runs cleanly headless with Ollama absent (detection is pure deterministic Python); produced a schema-valid report.json + client-ready report.html with no tweaks.
  • Built a real fixer agent (seo/fixer.py) integrated into run.py: 84 title rewrites with a validator+retry loop (seo/validator.py), 42 meta rewrites, and a 6-entry redirect map via path-similarity matching.
  • Genuine process artifacts: 121-line audit.jsonl with real multi-session Read/Edit/Bash/Write events (08:49-11:48), 19.6KB transcript, 13 commits spread over 3.17h (not a single dump), and a timestamped DECISIONS.md showing real debugging.
  • Extended the dashboard beyond the starter with a live Chart.js severity chart fed by SSE (commit 'added charts using charts.js'); all four sub-agents (ingest/auditor/fixer/reporter) customized, fixer.md tied to the actual validator helper.
  • All memory files tailored and substantive (CLAUDE.md, DECISIONS.md, PROMPTS.md); no hard-coded sample URLs or ground-truth reads (grep clean).

What held them back

  • Committed report.json is stale and does not reproduce from the current code: the final 'thin-content fix' commit regressed the rule (idx200 -> all indexable rows), inflating thin_content from 10 to 340 predictions and dropping verified_f1 from the committed 0.739 to 0.468.
  • Precision is the core ceiling even at best: recall is 1.0 but committed precision only 0.586, with over-prediction in non_indexable_but_linked (pred 10 / truth 2) and slow_page (pred 152 / truth 11).
  • meta_fixes and h1_fixes are computed by the fixer but silently discarded: seo_set_fixes()/report only persist titles + redirect_map, so 42 meta and 2 H1 fixes never reach the deliverable.
  • Redirect map quality is crude: SequenceMatcher path-similarity maps a broken .png.png image URL to /services/web-development ('Semantic path match') - functional but not semantically sound.
  • Minor robustness gap: fixer.py uses int(r.get('Status Code', 0)) which would crash on an empty status cell (works here only because the sample CSV is fully populated).
  • Detection used 'rows' filters inconsistently (thin_content/slow_page/non_indexable over all rows, not 200/HTML), which is the source of the precision loss vs ground truth.

How to improve

  • Regenerate and recommit report.json from the current detector before submitting, and add a CI/self-test that fails if committed report F1 drops - this single step would have caught the thin_content regression.
  • Revert the thin_content rule to filter on indexable 200 HTML pages (idx200), and apply the same 200/HTML pre-filter to slow_page and non_indexable_but_linked to lift precision toward the committed 0.739.
  • Persist meta and H1 fixes in the report contract (extend seo_set_fixes / _report_obj) so the champion-tier fixer work is actually delivered.
  • Improve redirect targeting to consider URL section/path tokens and content type so image 404s map to sensible targets (or are skipped).
  • Harden numeric parsing in fixer.py (reuse detector._int) to avoid crashes on sparse exports.
14 Manoj Sharma F1 96% 72/100

Score breakdown (weighted)

Detection accuracy (F1 vs ground truth)29 / 30
Pipeline runs end-to-end on the crawl10 / 10
Output contract + fix artifacts3 / 8
Orchestration & architecture4 / 15
Code quality (code review)9 / 12
Process integrity (logs, commits, debugging)8 / 12
Context & memory files3 / 6
Deliverable & docs6 / 7
Raw total72 / 100
Verified F1 (objective accuracy): 96.1%  ·  committed report F1: 96.1%  ·  ran end-to-end: yes
Detection logic: Real detection is in top-level audit.py (NOT seo-command-center/seo/detector.py, which is the untouched starter and is never imported). audit.py implements 17 deterministic rules: missing_title, duplicate_title, title_too_long, title_too_short, missing_meta_description, duplicate_meta_description, meta_description_too_long, missing_h1, duplicate_h1, broken_link, server_error, redirect, redirect_chain, thin_content, orphan_page, non_indexable_but_linked, slow_page (~17 of 18 rulebook rules).

Why this rank

Manoj built a genuine, fully reproducible deterministic SEO auditor whose real detection lives in top-level audit.py (the starter seo/detector.py is dead code, which fully explains the det%=0 vs F1=0.961 anomaly — not fabrication). Re-running his actual pipeline on the test crawl regenerated a report scoring verified_f1=0.9612, identical to his committed 0.961, with strong precision (0.985); recall (0.938) is only held back because his broken_link and redirect detectors find nothing in an all-200 internal_all.csv since he never reads the issues_reports/ status CSVs. The code is clean and well-organized, the Flask dashboard genuinely reflects the run, and the process is credible: 16 commits over ~5.4 hours with a real bug-fix and tailored DECISIONS.md/PROMPTS.md. The biggest thing holding him back is that the entire Claude Code orchestration story is the untouched starter — the skill, the four sub-agents, and the MCP server are byte-identical scaffold that run.py never calls — so the architecture/orchestration credit is low and the .claude audit log is a stub. Secondarily, the report.json ignores the output contract and only passes because the scorer is alias-tolerant, and fix artifacts are minimal. No integrity flags: nothing is hardcoded, the report is not fabricated, his own work (the flat Python pipeline) is substantial, and his memory/docs are real where it counts. A solid, honest mid-pack submission: excellent detection accuracy and engineering hygiene, undercut by a fake-by-omission orchestration layer and a non-contract report shape.

What they did well

  • Committed report.json is fully reproducible: re-running the actual pipeline (run.py -> ingest.py/audit.py/fix.py) on sample-export produced an identical report scoring verified_f1=0.9612, exactly matching committed_f1=0.961 (precision 0.985, recall 0.938) — no fabrication.
  • Genuine deterministic detection in top-level audit.py implementing 17 rulebook rules with correct logic; the det%=0 forensic is explained by the starter detector.py being dead/unused, not by cheating.
  • Clean, readable, well-structured code: ingest.py has robust flexible column mapping for Screaming Frog variants with safe null/type coercion; audit.py pre-computes duplicate sets and runs a single pass.
  • Real engineering process: 16 commits spread over ~5.4h (11:54-17:21) with meaningful feat/fix/docs messages including a genuine severity-aggregation bug fix; DECISIONS.md and PROMPTS.md are specifically tailored to this build.
  • Functional Flask dashboard (top-level dashboard.py) that genuinely reflects the run — reads outputs/report.json, dark theme with severity cards, issue table, /api/report endpoint, auto-refresh; README (236 lines) is thorough and accurate to the code.
  • Runs offline without Ollama — detection is pure deterministic code with no model dependency, so it degrades gracefully (no model_calls needed).

What held them back

  • report.json does NOT satisfy the output contract (report.schema.json): missing required site, urls_crawled, and run_meta; issues are a flat per-row list using issue_type/url with lowercase severity instead of grouped objects with type/severity/affected_urls/count. It only scores because scorer.py is alias-tolerant.
  • The entire Claude Code orchestration layer (skills/seo-audit/SKILL.md, the 4 agents, mcp/server.py) under seo-command-center/ is the byte-identical untouched starter and is never invoked by run.py — there is no real orchestrator/sub-agent/MCP delta; run.py is a plain Python script.
  • Fix artifacts are minimal: fix.py only rewrites missing_title (none present in sample) and truncates title_too_long; every other issue gets 'Manual review required' and there is no redirect_map.
  • Recall capped by two unimplemented-for-this-input detectors: broken_link (6 truth) and redirect (7 truth) both scored 0 because audit.py reads only internal_all.csv (all 200s) and ignores the issues_reports/ status-code CSVs.
  • Weak process logs at the Claude layer: .claude/audit.jsonl is a trivial 3-line stub with no timestamps or varied tool events, and agent-log.md is a hand-written summary rather than a real Claude Code transcript (~904 bytes).
  • Top-level CLAUDE.md is empty (0 bytes), so there is no project memory anchor for the actual codebase.

How to improve

  • Emit report.json in the documented contract shape: include site, urls_crawled, run_meta.model_calls, and group issues by type with affected_urls + count + explanation.
  • Either delete the dead starter seo-command-center/ tree or actually wire the real audit.py logic through the MCP server + skill + sub-agents so the orchestration layer is genuine.
  • Add status-code detectors that consume issues_reports/ (or crawl beyond internal_all.csv) to recover broken_link and redirect recall.
  • Expand fix.py to produce real rewritten titles for title_too_long/_too_short and a redirect_map for 3xx/4xx, instead of 'Manual review required'.
  • Make run.py headless-friendly (a --no-dashboard flag) and fill CLAUDE.md / audit.jsonl with real, build-specific content.
15 SUBHASMITA SWAIN F1 74% 72/100

Score breakdown (weighted)

Detection accuracy (F1 vs ground truth)22 / 30
Pipeline runs end-to-end on the crawl10 / 10
Output contract + fix artifacts8 / 8
Orchestration & architecture8 / 15
Code quality (code review)10 / 12
Process integrity (logs, commits, debugging)7 / 12
Context & memory files3 / 6
Deliverable & docs4 / 7
Raw total72 / 100
Verified F1 (objective accuracy): 73.5%  ·  committed report F1: 73.5%  ·  ran end-to-end: yes
Detection logic: seo/detector.py — detect() implements 17 of the 17 rulebook rules (all starter TODOs completed: title_too_short, missing/duplicate/too-long meta, missing/duplicate H1, thin_content, non_indexable_but_linked, slow_page, plus a loop-safe redirect_chain). Detection is pure deterministic Python (csv stdlib), invoked via mcp/server.py seo_detect() from run.py. +91 substantive lines over the starter detector.

Why this rank

Subhasmita delivered solid, honest detection work: she completed every one of the 17 rulebook detectors in seo/detector.py (a +91-line delta over the starter) and added a genuinely well-engineered seo/fixer.py with proper Ollama integration, a length-validation/re-ask loop, and safe deterministic fallbacks. The pipeline runs clean headless with Ollama absent and the committed report reproduces exactly (verified F1 0.7352, recall a perfect 1.0), so there is no fabrication or hard-coding — the polished fallback titles come straight from each page's H1 column, not a baked-in answer key. The score is held back on two fronts: accuracy precision is only 0.581 because slow_page and non_indexable_but_linked over-predict heavily against the realistic crawl, and the entire orchestration/documentation layer is untouched starter — all four agents, the skill, the command, plugin.json, the MCP server, and the README are byte-identical to the bundle, and DECISIONS.md/PROMPTS.md are still empty templates. Process integrity is real but thin (genuine 91-line audit log over 4h, but only 6 commits and no transcript). The single biggest thing holding this back is that the real work lives almost entirely in detection/fixing while the architecture, docs, and process-record deliverables were left as the starter scaffold. Net: a clean, reproducible, competent build that earns its 72 on real code, capped by missing orchestration delta and uncalibrated precision.

What they did well

  • Fully reproducible: re-running headless yields exactly the committed F1 (precision 0.581, recall 1.0, F1 0.7352) — no fabrication; recall is a perfect 1.0 (all 211 truth pairs found).
  • All 17 rulebook detectors implemented correctly with the right pre-filters (text/html, indexable-200 for duplicates) and exact type/severity strings; each detector is commented with its rule.
  • seo/fixer.py (236 new lines) is genuinely well-engineered: Ollama call with timeout + JSON mode, a validate-length-and-re-ask loop, and deterministic H1/slug fallbacks so it never crashes or hangs when Ollama is absent — verified producing 95 title/meta rewrites all within the 60/155 limits from page H1s, not hardcoded.
  • Graceful degradation: ran clean end-to-end with Ollama NOT running, producing a schema-valid report.json + report.html + a 6-entry redirect map (each with from/to/reason chosen by URL-path similarity).
  • Genuine process trail: .claude/audit.jsonl has 91 real hook events (Bash/Glob/Read/Grep/Edit/Agent) spanning ~4h11m, and CLAUDE.md is a detailed, project-specific memory file (architecture map, rulebook quick-ref, model-usage rules).

What held them back

  • Precision is only 0.581: slow_page massively over-predicts (152 predicted vs 11 truth) and non_indexable_but_linked over-predicts (10 vs 2) — the literal rulebook thresholds were not calibrated against the realistic crawl, dragging F1 down.
  • Zero orchestration delta: all four agents (auditor/fixer/ingest/reporter), the SKILL.md, the command, and plugin.json are byte-identical to the starter (0 substantive changed lines, only CRLF differences); mcp/server.py has just a 7-line delta.
  • DECISIONS.md and PROMPTS.md are the untouched starter templates (still showing the '[--:--] ...' and '1. ... 2. ...' placeholders) — no real engineering-judgement or prompt log.
  • README.md is the untouched starter (still titled 'Forge Sprint 01 starter', 0 substantive changes), so docs do not reflect the work actually done.
  • Only 6 commits over 4.7h (below the 10-commit bar), and two are low-value (.pyc files, .gitignore); no agent-log.md / transcript (0 bytes).

How to improve

  • Calibrate over-predicting detectors against a realistic crawl (e.g. revisit slow_page Response Time handling and the non_indexable_but_linked scope) to lift precision without losing the perfect recall — this is the single biggest scoring lever.
  • Do real orchestration work: customize the sub-agent prompts and SKILL pipeline, and extend the MCP server beyond the starter scaffold so architecture reflects deliberate design, not boilerplate.
  • Fill DECISIONS.md and PROMPTS.md with the actual choices and prompts used (the audit log and commit history show real iteration that simply was not recorded).
  • Rewrite README.md to document the completed pipeline, the fixer design, and run instructions instead of shipping the starter's text.
  • Commit more granularly across the build and export an agent-log.md transcript to make the process trail fully verifiable.
16 Aayush shukla F1 50% 72/100

Score breakdown (weighted)

Detection accuracy (F1 vs ground truth)15 / 30
Pipeline runs end-to-end on the crawl8 / 10
Output contract + fix artifacts8 / 8
Orchestration & architecture9 / 15
Code quality (code review)9 / 12
Process integrity (logs, commits, debugging)11 / 12
Context & memory files6 / 6
Deliverable & docs6 / 7
Raw total72 / 100
Verified F1 (objective accuracy): 49.6%  ·  committed report F1: 0%  ·  ran end-to-end: yes
Detection logic: seo/detector.py (detect(), 127 lines, 92% changed vs starter). Pure-Python/pandas deterministic detection of 19 distinct rule types; 13 of them fire on this crawl. Covers ~16-18 of the rulebook's 18 rules including all 12 ground-truth types. Issue grouping into affected_urls[] happens in run.py group_issues(). No committed report.json (outputs/ only had .gitkeep); committed_f1 therefore 0.

Why this rank

Aayush built a real, working SEO auditor that goes well beyond the starter: detection grew from roughly six detector types to nineteen pure-Python rules covering all twelve ground-truth issue types, and on the test crawl it achieved perfect recall (211/211 true positives, exact per-type matches for every scored category). The score is held back by precision (0.33), driven by three over-firing detectors - missing_image_alt (279 spurious hits on an unscored type), an overly loose slow_page threshold (152 vs 11), and non_indexable_but_linked - which drags verified F1 to 0.4965. The pipeline runs end-to-end and produces a schema-valid report.json plus HTML/PDF/PPTX and in-limit title/redirect fixes, but it crashed on first run for a missing fpdf dependency because no requirements.txt was shipped, so it scores partial on robustness. Process integrity is a genuine strength: a 562KB authentic Claude Code transcript, a coherent 42-event audit log, 25 commits spread over nearly five hours, and tailored memory files documenting real debugging and grader-alignment decisions - with no hardcoding, fabrication, or plagiarism detected. Orchestration is the weakest architectural area: the dashboard is a real, polished FastAPI app, but the sub-agents are thin markdown stubs and the 'MCP server' is actually that dashboard rather than an MCP-protocol server. The single biggest thing holding this submission back is detector precision - the recall work is excellent, and a few threshold fixes would have nearly doubled the accuracy score.

What they did well

  • Detection is genuinely accurate where it counts: every one of the 12 ground-truth types is detected exactly (perfect recall = 1.0, 211/211 true positives; title_too_long 63/63, meta_description_too_long 42/42, title_too_short 21/21, duplicate_h1 19/19, etc.)
  • Substantial real work over the starter: detector expanded from ~6 detector types to 19 rule types (detector_changed_ratio 0.921), with vectorized duplicate precompute scoped to indexable 200 pages to match grader semantics
  • Genuine, verifiable process: 562KB raw Claude Code session transcript (real session UUIDs, hook events, cwd /Users/AayushShukla), 42-line coherent audit.jsonl spanning 12:27-17:08, 25 commits over 4.7h with no single dump
  • Output contract fully met: report.json validates against report.schema.json; 20 in-limit rewritten titles + redirect_map + export_fixes.py producing fix CSVs; also emits HTML, PDF and PPTX deliverables
  • Functional FastAPI dashboard (mcp/server.py) with live /status polling, auto-reload on stage 5, stat cards and issues table that read the actual report.json
  • Memory files are real and build-specific: DECISIONS.md documents authentic debugging (nemotron breaking edit tools, Ollama 0.30.5 Write-tool failures, field-name mismatches, scoping duplicates to indexable pages)

What held them back

  • Precision is only 0.33, halving F1 to 0.4965: three detectors over-fire badly - missing_image_alt fired 279 times (not a ground-truth type at all), slow_page 152 vs 11 truth (response-time threshold >1.0 too loose), non_indexable_but_linked 10 vs 2
  • No requirements.txt; pipeline crashed on first run with ModuleNotFoundError: fpdf, and README omits fastapi/uvicorn from the documented install line - needed manual dependency install to run
  • Sub-agents are thin markdown role descriptions (3-5 lines each); the actual pipeline is a monolithic deterministic run.py, so orchestration is documented design rather than genuinely distinct executing agents
  • The 'MCP server' (mcp/server.py) is a FastAPI dashboard, not an actual MCP-protocol server despite the folder name and plugin.json mcp_server field
  • Cosmetic bug: report 'site' field and report.html/dashboard titles show the raw input path (C:/tmp/forge-bundle/sample-export) instead of a clean domain
  • No committed report.json (outputs/ shipped empty bar .gitkeep), so there was no committed result to verify against - graded purely on the freshly generated run

How to improve

  • Tighten the precision-killing detectors: drop or gate missing_image_alt (not scored), align slow_page threshold to the rulebook value, and constrain non_indexable_but_linked - this alone would push F1 toward ~0.9 given the perfect recall
  • Add a requirements.txt (pandas, fpdf2, python-pptx, fastapi, uvicorn, requests) and update the README install line so the pipeline runs out of the box
  • Turn the markdown agents into genuinely distinct executable steps (separate scripts or real sub-agent invocations) so the orchestration is more than a description
  • Derive a clean site/domain string from the crawl (e.g. from the Address column) instead of using the export directory path
  • Commit the generated report.json/report.html so the deliverable is reproducible and verifiable from the repo as submitted
17 Inshal AhmadFabricated process logs F1 98% 71/100
Integrity adjustment: raw 77 → final 71 — −6 penalty (Fabricated process logs).

Score breakdown (weighted)

Detection accuracy (F1 vs ground truth)29 / 30
Pipeline runs end-to-end on the crawl10 / 10
Output contract + fix artifacts8 / 8
Orchestration & architecture6 / 15
Code quality (code review)9 / 12
Process integrity (logs, commits, debugging)5 / 12
Context & memory files6 / 6
Deliverable & docs4 / 7
Raw total77 / 100
Verified F1 (objective accuracy): 97.7%  ·  committed report F1: 97.7%  ·  ran end-to-end: yes
Evidence: faked_logs: .claude/audit.jsonl (41 lines) is hand-fabricated, not hook-produced. Every event is on a perfectly round whole-second minute (09:00:01, 09:30:00, 10:00:05, 11:10:00...) with a single hardcoded session_id 'sess_forge_01' and a tidy errorless linear narrative. The committed audit.sh hook writes millisecond-precision timestamps (date -u +%H:%M:%S.%3NZ) and a real session_id from Claude input, so genuine output is impossible to look like this. No agent-log.md/transcript exists (transcript_bytes=0). Git history (17 commits) and DECISIONS.md timestamps are genuine and agree with each other, so this is a faked process artifact, not a fabricated result.
Detection logic: seo/detector.py (332 lines, extended from the 119-line starter; whitespace-insensitive delta is substantial). Real detection is fully here as deterministic Python. Roughly 13-14 of the 18 rulebook rules implemented and scored: missing_title, duplicate_title, title_too_long, title_too_short, missing/duplicate/too_long meta_description, missing_h1, duplicate_h1, broken_link, server_error, redirect, redirect_chain, thin_content, non_indexable_but_linked, slow_page, orphan_page, plus missing_image_alt read from issues_reports/images_missing_alt_text.csv.

Why this rank

Inshal built a genuinely accurate, reproducible audit: the detector was extended from the 119-line starter to 332 lines of clean deterministic Python, and re-running the pipeline reproduced the committed report.json exactly at verified F1 = 0.977 (211/211 true positives), with the only precision loss coming from an over-eager missing_image_alt detector. The pipeline runs end-to-end headless without Ollama, emits a schema-valid report, and ships real champion-tier fix artifacts (title/meta rewrites and a redirect map exported to CSV), and the memory files (CLAUDE.md, DECISIONS.md, PROMPTS.md) are real and consistent with the git history. The work is real and the result is not fabricated or hardcoded. The biggest things holding it back are process and scaffold authenticity: the committed .claude/audit.jsonl is hand-fabricated synthetic data that the real hook could never produce, no transcript was committed, and the orchestration layer — SKILL.md, all four sub-agents, and the dashboard — is the untouched starter scaffold, so the architecture/orchestration delta is thin. The single biggest detractor is the faked process log, which undercuts an otherwise honest and well-executed accuracy effort. Net: strong objective accuracy and clean code, weak orchestration delta and a flagged faked audit log, for a raw total of 77.

What they did well

  • Verified F1 = 0.9769 fully reproducible: re-running run.py regenerates outputs/report.json byte-equivalent to the committed one; scorer confirms 211/211 true positives across 12 truth types, only 10 false positives from one over-eager detector.
  • Pipeline runs clean end-to-end headless with Ollama absent (exit 0, model_calls=0) and degrades gracefully — detection is pure deterministic Python so no hard crash.
  • report.json is schema-valid against report.schema.json and ships a real champion fixes block (83 title fixes, meta_description fixes, redirect_map) plus exported title_fixes.csv, meta_fixes.csv, redirect_map.csv.
  • Detector and fixer code is clean and readable with a sensible deterministic-vs-model split; fixer correctly filters to text/html pages and validates title/meta length limits in code.
  • Memory files are genuinely tailored: CLAUDE.md documents the real architecture/constraints, DECISIONS.md has timestamped real decisions that align with git commit times, PROMPTS.md logs real moving prompts.
  • Healthy commit cadence: 17 commits spread over ~4.7 hours with meaningful messages (meta fix generation, filter fixes to html pages, missing image alt detector).

What held them back

  • faked_logs: .claude/audit.jsonl is hand-authored synthetic data (round-minute timestamps, single fake session id, no errors/retries) and no transcript/agent-log.md was committed, so the process-log record is not credible.
  • Orchestration scaffold is untouched starter: SKILL.md and all four agents (ingest/auditor/fixer/reporter) are byte-identical to the bundle starter ignoring whitespace (0 real changed lines), so there are no genuinely customized sub-agents.
  • Dashboard is the untouched starter (dashboard/app.js and index.html have 0 real changes vs starter) — no improvement to the cockpit.
  • report.html is the starter-level minified export: no fixes section, no branding, generic 'Fix the N ... issues first' recommendations — readable but not meaningfully more client-ready than the boilerplate.
  • missing_image_alt detector is a precision bug: it emits 10 URLs from images_missing_alt_text.csv but ground truth has 0, which is the entire source of lost precision (0.955).
  • redirect_map fixer is crude — it points every 4xx URL at 'the first 200 URL in the file' as homepage with a 'Fallback redirect suggestion', not a closest-live-page match.

How to improve

  • Stop hand-writing audit.jsonl; keep the real hook wired and commit the actual hook output plus an exported agent-log.md transcript so all three process records agree.
  • Actually customize the sub-agents and SKILL.md to the build (or trim them) instead of shipping the untouched scaffold; tailor the dashboard so D and H reflect real work.
  • Fix the missing_image_alt detector (it over-reports vs ground truth) to recover precision toward 1.0.
  • Upgrade report.html to include the generated fixes table and per-issue remediation guidance so it is genuinely client-shippable.
  • Improve the redirect map to map each broken URL to its closest semantically-matching live page rather than a single fallback homepage.
18 Arijit ChowdhuryOther issue F1 75% 70/100
Integrity adjustment: raw 73 → final 70 — −3 penalty (Other issue).

Score breakdown (weighted)

Detection accuracy (F1 vs ground truth)22 / 30
Pipeline runs end-to-end on the crawl10 / 10
Output contract + fix artifacts7 / 8
Orchestration & architecture6 / 15
Code quality (code review)9 / 12
Process integrity (logs, commits, debugging)7 / 12
Context & memory files6 / 6
Deliverable & docs6 / 7
Raw total73 / 100
Verified F1 (objective accuracy): 75.0%  ·  committed report F1: 75.0%  ·  ran end-to-end: yes
Evidence: other: 2244 node_modules files (~29MB unused puppeteer/chromium-bidi) and forge-sprint-01-starter.zip are committed to the repo as dead-weight bloat; the Python pipeline never imports any of it. Not score-faking, but dirty hygiene.
Detection logic: seo/detector.py (170 lines). The builder genuinely completed the rulebook: starter shipped ~7 detectors, this repo implements 17 (added title_too_short, missing_meta_description, duplicate_meta_description, meta_description_too_long, missing_h1, duplicate_h1, redirect_chain, thin_content, non_indexable_but_linked, slow_page). 12 of those types overlap the ground-truth taxonomy and all 12 are emitted on the sample crawl.

Why this rank

Arijit built a real, working SEO auditor: the deterministic detector was honestly completed from the starter's ~7 rules to the full 17-rule set, and running it headless on the sample crawl reproduces the committed report.json exactly (verified_f1 0.7496, perfect recall, precision 0.599). The pipeline is robust — with Ollama down it degrades gracefully and still produces schema-valid JSON, a styled client-ready HTML report, and a 5-slide PPTX, which is genuine builder value on top of the scaffold. Process signals are mostly credible: 15 commits over ~27 hours with a sensible feature arc and DECISIONS/PROMPTS files that record real engineering choices rather than templates. The work is clean of cheating — no hard-coded sample URLs, no ground-truth reads, no fabricated numbers. The biggest thing holding the score down is that the headline 'multi-agent orchestration' is cosmetic: the four sub-agents, the SKILL orchestrator, the command, and the dashboard are byte-identical to the starter and never exercised, while run.py quietly does all the work itself — so the architecture points and process integrity (no audit log, stub transcript) suffer. Add precision tuning and a genuinely wired orchestrator and this jumps from a solid mid-pack entry to a strong one.

What they did well

  • Detector genuinely completed to the full rulebook (17 detectors vs 7 in starter); diff against starter confirms ~120 lines of real, correct detection logic added.
  • Perfect recall (1.0): all 211 ground-truth (type,url) pairs are found; verified_f1 0.7496 is fully reproducible and exactly matches the committed report.json (no fabrication).
  • Pipeline runs clean end-to-end with Ollama absent — the title fixer catches the connection error and degrades gracefully instead of crashing, still writing a valid report.json/html/pptx.
  • Builder-added value beyond the scaffold: deterministic redirect-map fixer, an Ollama title fixer, a 5-slide python-pptx generator, and a restyled client-ready report.html (server.py _render_html rewritten, ~59 lines changed).
  • Memory files are genuinely tailored — DECISIONS.md and PROMPTS.md log real timestamped choices (e.g. 'starter only had 7 rules', indexable+200 filter, slug-based redirect matching), and 15 commits span ~27 hours with a believable feature progression.

What held them back

  • Precision is only 0.599 (352 predicted vs 211 truth, 141 false positives) — over-detection on threshold rules (title length, thin_content, slow_page, redirects/broken) drags F1 to 0.75; no calibration against ground-truth-style edge cases.
  • Orchestration layer is the untouched starter: agents/*.md, skills/seo-audit/SKILL.md, commands/seo-audit.md, and the dashboard (app.js + index.html) are byte-identical to the starter (ignoring CRLF). The README claims 'specialized sub-agents' that do no real work.
  • run.py drives the pipeline directly by importing server functions; the four sub-agents and the SKILL orchestrator are never actually exercised — the multi-agent architecture is cosmetic.
  • Process artifacts are thin: no .claude/audit.jsonl was ever produced (0 lines) and agent-log.md is a 12-line quoted-string stub, not a real Claude Code transcript.
  • Repo hygiene is poor: 29MB / 2244 node_modules files and the starter zip are committed despite being unused; a stray 'report_test.py`' file (backtick typo) is also checked in.
  • The redirect-map fix is weak — every 4xx image URL falls back to the homepage because slug matching never succeeds, so the 'fix' is not genuinely useful.

How to improve

  • Tighten threshold detectors against the rulebook's exact cut-offs (pixel vs char limits, redirect vs broken scoping) to raise precision without sacrificing the strong recall.
  • Actually wire the orchestrator: have run.py or the SKILL invoke the ingest/auditor/fixer/reporter agents, or remove them and stop claiming a multi-agent architecture in the README.
  • Add a .gitignore for node_modules and remove the vendored puppeteer tree and the starter zip; delete the stray backtick test file.
  • Emit a real .claude/audit.jsonl (the audit hook exists under seo-command-center/.claude but never ran) and keep a genuine session transcript for process credibility.
  • Make the redirect fixer smarter (e.g. match by path stem / nearest live ancestor) so broken-image 404s map to meaningful targets rather than all to '/'.
19 Keshav Goyal F1 74% 70/100

Score breakdown (weighted)

Detection accuracy (F1 vs ground truth)22 / 30
Pipeline runs end-to-end on the crawl10 / 10
Output contract + fix artifacts6 / 8
Orchestration & architecture9 / 15
Code quality (code review)9 / 12
Process integrity (logs, commits, debugging)9 / 12
Context & memory files1 / 6
Deliverable & docs4 / 7
Raw total70 / 100
Verified F1 (objective accuracy): 73.9%  ·  committed report F1: 73.9%  ·  ran end-to-end: yes
Detection logic: seo-command-center/seo/detector.py (deterministic, +79 real lines over starter). Implements 17 named detectors; 12 map to ground-truth types and ALL 12 are detected. Builder added title_too_short, missing/duplicate/too-long meta description, missing_h1, duplicate_h1, redirect_chain, thin_content, slow_page, non_indexable_but_linked over the ~9-rule starter; non-rulebook canonical/crawl-depth detectors were added then removed in a later cleanup commit.

Why this rank

Keshav built a real, reproducible technical-SEO pipeline: the deterministic detector is the genuine work (+79 lines over the starter, 17 rules, all 12 ground-truth types detected) and a fresh headless run reproduces the committed report.json exactly at verified_f1 0.7391 with perfect recall — there is no fabrication, hardcoding, or plagiarism. Accuracy is capped by precision (0.586), driven almost entirely by two over-detectors (slow_page predicts 152 vs 11 truth; non_indexable_but_linked 10 vs 2). The model-fix layer (fixer.py) is the most ambitious add — a thoughtful Ollama rewrite-with-retry plus difflib redirect selection — but it was never successfully run, so even the committed report ships 20 empty title rewrites and an empty redirect map, costing contract and deliverable points. Process integrity is a real strength: 15 incremental commits over ~5 hours with a visible debugging pass and a 113KB transcript, though the audit.jsonl is a single-second scripted burst rather than organic logging. The orchestration scaffold (SKILL.md, the four agents, dashboard, plugin.json) is essentially the untouched starter, and the three memory files are verbatim templates (only CRLF differs) — so context-engineering and architecture authorship score low. The single biggest thing holding this submission back is that the highest-value layer it attempted, the model-driven fixes, produced no actual output, while the memory/orchestration scaffolding it inherited was left unedited; tightening the two over-detectors and genuinely running the fixer would move this from a solid mid-tier entry into top-tier territory.

What they did well

  • Reproducible accuracy: fresh headless run scores verified_f1 0.7391 exactly matching the committed report.json (360 pred pairs, perfect recall 211/211 TP) — no fabrication.
  • Genuine detector work: +79 real lines over the starter; all 12 ground-truth issue types detected, with most types matching truth counts exactly (title_too_long 63/63, title_too_short 21/21, meta_too_long 42/42, duplicate_h1 19/19, broken_link 6/6).
  • Real model-fix layer: fixer.py is an entirely new, well-structured module — Ollama title/meta rewrites with a length-check-and-retry loop plus hard crop, and difflib-similarity redirect-target selection, all degrading gracefully when Ollama is absent.
  • Strong, honest process: 15 commits spread over ~4.9 hours (11:56-16:52), incremental and well-named, including a real debugging pass ('fix: port conflict crash, wrong fixer model, thin_content false positives, remove non-rulebook detectors') and a 113KB agent-log transcript.
  • Clean robustness: pipeline runs end-to-end with Ollama down, writes schema-valid report.json + a client-readable report.html that includes a Generated Fixes section (+32 real lines in server.py).

What held them back

  • Precision-limited accuracy (P=0.586): slow_page over-detects badly (152 predicted vs 11 truth — >1.0s threshold too low) and non_indexable_but_linked over-detects (10 vs 2), dragging F1 to 0.739.
  • Fix artifacts are hollow: even the COMMITTED report.json has all 20 title rewrites with empty 'new' values and an empty redirect_map — the model fixer was never successfully exercised, so no real rewritten titles or redirect map were ever produced.
  • Memory files are untouched starter templates: CLAUDE.md, PROMPTS.md, and DECISIONS.md still contain the placeholder examples ('My log [--:--] ...', 'My prompts 1. ... 2. ...') — only CRLF differs from the starter (confirmed by whitespace-ignored diff = 0 added lines).
  • Orchestration scaffold is largely unchanged: SKILL.md, all 4 agent .md files, dashboard/app.js, and plugin.json have 0 real (whitespace-ignored) edits over the starter; the genuine delta is confined to detector.py, fixer.py, and the fixes-HTML in server.py.
  • audit.jsonl is a single-burst log: all 33 events timestamped within one second (2026-06-06T11:14:13-14, one session_id), reflecting one scripted pipeline run rather than organic build-time tool activity.

How to improve

  • Raise the slow_page threshold (and verify non_indexable_but_linked logic) to lift precision — fixing these two over-detectors alone would push F1 well above 0.85 with recall already at 1.0.
  • Actually run the fixer against a live model (or ship a deterministic fallback rewrite) so report.json contains real non-empty title/meta rewrites and a populated redirect_map.
  • Fill in CLAUDE.md / DECISIONS.md / PROMPTS.md with the real decisions already visible in the commit history (e.g., the thin_content false-positive fix, the redirect-chain condition) — the engineering story exists, it just was not recorded.
  • Extend the orchestrator and agents beyond the starter wording, or trim to what is genuinely used, so the architecture score reflects real authorship.
  • Add the remaining rulebook rules (e.g., missing_meta_description coverage, server_error) and unit-test detector counts against the provided issue CSVs to harden accuracy.
20 PULKIT F1 74% 70/100

Score breakdown (weighted)

Detection accuracy (F1 vs ground truth)22 / 30
Pipeline runs end-to-end on the crawl10 / 10
Output contract + fix artifacts7 / 8
Orchestration & architecture7 / 15
Code quality (code review)9 / 12
Process integrity (logs, commits, debugging)6 / 12
Context & memory files4 / 6
Deliverable & docs5 / 7
Raw total70 / 100
Verified F1 (objective accuracy): 73.9%  ·  committed report F1: 73.9%  ·  ran end-to-end: yes
Detection logic: seo/detector.py detect() — deterministic plain-Python rules. Builder extended the starter's ~8 detectors with 9 more (missing/duplicate/too_long meta_description, missing_h1, duplicate_h1, thin_content, slow_page, non_indexable_but_linked, redirect_chain, title_too_short) for ~17 of the 18 rulebook rules (missing_image_alt absent). On the sample crawl this emits 12 issue types.

Why this rank

Pulkit shipped a working, honest submission: the detector is a solid extension of the starter (about 17 of 18 rules) and the whole pipeline runs headless without Ollama, degrading gracefully via a circuit-breaker in the fixer. Crucially the result is reproducible — re-running produced the same F1 of 0.739, so the committed report is real, not hand-fabricated, and there is no hardcoding of sample URLs or the answer key. Accuracy is mid-pack: perfect recall but 0.586 precision from over-flagging drags F1 down. Beyond detection the builder did genuine value-add on the MCP server, the report.html (health grade, fixes preview, restyle) and the dashboard, and the process artifacts (291KB transcript, tailored PROMPTS/CLAUDE notes) credibly document a real debugging session. The single biggest thing holding the score back is that the orchestration layer — the SKILL.md and all four sub-agents — is the untouched starter scaffold, so the headline 'multi-agent' architecture is largely boilerplate; that, plus a missing audit.jsonl, only 6 commits, an unmodified README and a thin DECISIONS.md, keeps this a competent-but-not-standout 70. Clean integrity, accurate enough, but light on orchestration depth and process rigor.

What they did well

  • Fully reproducible: a fresh headless run produced report.json byte-equivalent in scoring to the committed one (precision 0.5861, recall 1.0, F1 0.7391, 360 pred pairs) — no fabrication.
  • Pipeline runs cleanly with Ollama absent and degrades gracefully: fixer.py has a 3-failure circuit breaker and an availability check, so it skips LLM title/meta rewrites but still emits a deterministic SequenceMatcher-based redirect map (run printed 'Fixed 0 titles, 0 metas, 6 redirects').
  • report.json is schema-valid (all required keys: site, urls_crawled, summary, issues, run_meta; fixes object with titles/redirect_map/metas) and recall is perfect (no missed truth pairs).
  • Real value-add beyond detection: mcp/server.py extended ~100 lines (metas support, A-F health grade, fixes preview) and report.html restyled into a client-readier light theme with a grade card; dashboard app.js/index.html substantially reworked over the starter.
  • Genuine process evidence: 291KB raw Claude Code transcript (real session IDs/timestamps) plus PROMPTS.md/CLAUDE.md notes that match an actual debugging episode (Ollama infinite-loop fixed with a failure cap).

What held them back

  • Orchestration is mostly untouched scaffold: skills/seo-audit/SKILL.md, all 4 agent .md files, commands/seo-audit.md and plugin.json are byte-identical (whitespace-aside) to the starter — the sub-agents are not genuinely distinct work.
  • Precision is only 0.586 (360 predicted vs 211 truth pairs) — over-flagging (e.g. broad slow_page / redirect rules) caps accuracy at F1 0.739, mid-pack.
  • Process thin on two axes: no .claude/audit.jsonl committed (hooks not wired/recorded) and only 6 commits, below the >=10 target, though spread over ~3.9h with real incremental messages.
  • DECISIONS.md is barely tailored — two short one-line entries on top of the untouched template; README.md is the unmodified starter README still saying 'starter' and 'Your job in the Sprint'.
  • Redirect-map matching does path similarity over full URLs including query strings, producing dubious image-to-image redirects (e.g. one .png mapped to an unrelated .png), so the champion fix artifact is low quality.
  • Champion fixes live only inside report.json; no separate titles_fixes.csv / redirect_map.csv deliverables were produced.

How to improve

  • Tighten precision: scope slow_page/redirect/thin_content to the rulebook's exact thresholds and indexable+200 HTML filtering to cut the ~150 false-positive pairs.
  • Actually customize the orchestrator skill and sub-agents (distinct ingest/auditor/fixer/reporter prompts) instead of shipping the untouched scaffold to earn the orchestration points.
  • Wire the audit hooks (.claude/settings.json + hooks/audit.sh) so audit.jsonl records the real process, and commit more incrementally (>=10).
  • Constrain the redirect matcher to path segments (ignore query strings, require same content type) so broken-image redirects are sensible.
  • Flesh out DECISIONS.md and replace the starter README with a real project README documenting the actual build.
21 rajeev F1 74% 69/100

Score breakdown (weighted)

Detection accuracy (F1 vs ground truth)22 / 30
Pipeline runs end-to-end on the crawl10 / 10
Output contract + fix artifacts5 / 8
Orchestration & architecture8 / 15
Code quality (code review)8 / 12
Process integrity (logs, commits, debugging)8 / 12
Context & memory files3 / 6
Deliverable & docs5 / 7
Raw total69 / 100
Verified F1 (objective accuracy): 73.9%  ·  committed report F1: 73.9%  ·  ran end-to-end: yes
Detection logic: seo-command-center/seo/detector.py — rewritten from starter into pandas; 17 detectors implemented (missing_title, duplicate_title, title_too_long/short, missing/duplicate/too_long meta_description, missing/duplicate_h1, broken_link, server_error, redirect, redirect_chain, thin_content, orphan_page, non_indexable_but_linked, slow_page). Covers ~17 of 18 rulebook rules; missing_image_alt not implemented.

Why this rank

Rajeev shipped a working, reproducible deterministic audit: run.py runs end-to-end headless in 0.02s with no Ollama, emits a schema-valid report.json, and the detector is a genuine pandas rewrite covering 17 of 18 rulebook rules with correct html/indexable pre-filtering. Verified F1 is 0.7391, exactly matching the committed report (counts byte-identical), so there is no fabrication, no hardcoding, and no answer-key reads — the work is real. Accuracy is held back almost entirely by two untuned thresholds: slow_page (>1.0s) flags 152 URLs against 11 in ground truth and non_indexable_but_linked over-flags 10 vs 2; with recall already at 1.0 and ten of twelve types perfect, fixing those would push F1 above 0.95. The biggest gap is that the project stops at detection: the champion-tier fixer is unwired and titles.csv/redirect-map.csv are empty headers, the four sub-agents and MCP server are essentially the untouched starter scaffold, and DECISIONS.md/PROMPTS.md remain template stubs. Process integrity is otherwise solid — a real 206KB session transcript, eleven commits spread across the build with a PR-merge workflow, and a tailored root CLAUDE.md — though audit.jsonl is missing and junk files (a pasted-rubric promt.md, a stray CSV, a backup outputs folder) clutter the repo. The single thing holding this submission back is unfinished scope: a strong detection core surrounded by largely un-extended orchestration and undelivered fixes. Final raw score 69/100, clean of hard flags.

What they did well

  • Pipeline runs clean and fast headless (0.02s) with no Ollama dependency; valid schema-conformant report.json produced every time (run.py imports detector+report directly).
  • Detector is a genuine rewrite (detector_changed_ratio 0.911): plain-Python starter (~7 rules) replaced with structured pandas implementation of 17 detectors with proper html+indexable+200 pre-filtering per rulebook.
  • Fully reproducible: re-run F1 (0.7391) matches committed F1 (0.739) and committed report counts are byte-identical to fresh output — not fabricated.
  • Perfect recall (1.0) and near-perfect precision on 10 of 12 types (broken_link, duplicate_title/h1/meta, missing_h1, meta_too_long, redirect, thin_content, title_too_long/short all 100% correct).
  • Genuine process: 206KB raw Claude Code session transcript in agent-log.md (real sessionId/timestamps/tool calls), 11 commits spread over ~5.8h with a real branch/PR-merge workflow, tailored root CLAUDE.md.

What held them back

  • Two badly-tuned thresholds wreck precision: slow_page uses Response Time > 1.0s and predicts 152 URLs vs 11 in truth (141 false positives); non_indexable_but_linked predicts 10 vs 2. These alone drop F1 from ~0.96 to 0.74.
  • Champion-tier fixes are empty placeholders: outputs/fixes/titles.csv and redirect-map.csv contain only the header 'URL,NewValue' — no rewritten titles, no redirect map. The fixer agent is never wired into the run path.
  • Orchestration is mostly the untouched starter scaffold: the 4 agent .md files (ingest/auditor/fixer/reporter) match the starter, the MCP server still carries 'STARTER' comments, and set_fixes/recommend tools are never invoked.
  • DECISIONS.md and PROMPTS.md are the untouched starter templates (still show 'replace with your own' examples and '[--:--] ...' placeholders) — no real decision/prompt log.
  • Repo hygiene issues: a duplicated comment block in detector.py, junk files committed under agents/ (promt.md is a pasted copy of the grading rubric; internal_all.csv), an outputs_committed_bak/ backup folder, and a stray Screenshot png at root.
  • audit.jsonl absent, so the tool-call audit trail required by the brief is missing.

How to improve

  • Calibrate slow_page (the sample's near-1s responses are normal; raise to a Screaming-Frog-style threshold or use a percentile) and tighten non_indexable_but_linked to lift precision toward 0.95+.
  • Actually implement the fixer: generate validated title rewrites and a difflib/redirect-target map and write them into outputs/fixes/*.csv and the report fixes block.
  • Customise the sub-agent definitions and wire set_fixes/recommend into run_with_dashboard.py so the orchestration reflects real work beyond the scaffold.
  • Fill DECISIONS.md and PROMPTS.md with the real build log (the threshold-tuning story is exactly what they ask for), and enable the audit.jsonl hook.
  • Add the missing_image_alt detector and remove committed junk (promt.md, agents/internal_all.csv, outputs_committed_bak/, screenshot).
22 RajOther issue F1 50% 68/100
Integrity adjustment: raw 71 → final 68 — −3 penalty (Other issue).

Score breakdown (weighted)

Detection accuracy (F1 vs ground truth)15 / 30
Pipeline runs end-to-end on the crawl7 / 10
Output contract + fix artifacts8 / 8
Orchestration & architecture13 / 15
Code quality (code review)9 / 12
Process integrity (logs, commits, debugging)7 / 12
Context & memory files6 / 6
Deliverable & docs6 / 7
Raw total71 / 100
Verified F1 (objective accuracy): 49.6%  ·  committed report F1: 49.6%  ·  ran end-to-end: yes
Evidence: other: the two most foundational commits — 'feat: add all 18 rulebook detectors in pure pandas' and 'feat: wire generated fixes into audit outputs' — are authored by 'Codex' (OpenAI's coding agent), not Claude Code, in a Claude Code sprint. The core detector/fixer were written by a different AI tool; Claude Code did dashboard/docs/polish. Disclosed openly in git history (not hidden), so weighed in process score rather than treated as a hard cap.
Detection logic: Real detection lives in agents/detector.py::detect_all (172 lines, pure pandas); seo/detector.py is a thin 51-line wrapper that delegates to it. 18 detectors implemented (the full rulebook + missing_image_alt). 13 fire on the sample; 10 are exactly correct (P=R=1.0).

Why this rank

Raj built a real, well-architected SEO command center: a 172-line pure-pandas detector covering all 18 rulebook rules, a 4-agent SKILL orchestrator, a 411-line MCP server with a live SSE dashboard, and a champion-tier fixer with a genuine self-healing title loop and a difflib redirect map — every claim in the notes checked out against the code. The committed report is fully reproducible (verified_f1 0.4965 = committed 0.496), so nothing is fabricated and recall is perfect. The score is held back almost entirely by precision: 10 detectors are flawlessly tuned, but missing_image_alt (279 false positives, not even a graded rule) and an over-aggressive slow_page threshold (152 vs 11) inject ~420 false positives that halve the F1 — a classic 'chased the 18/18 count instead of accuracy' mistake, which DECISIONS.md inadvertently documents. Process evidence is strong and genuine (real audit hooks, 23 well-spread commits, tailored memory files with honest debugging logs). The one integrity caveat is that the two foundational commits were authored by 'Codex', a non-Claude AI tool, in a Claude Code sprint — disclosed in the history rather than hidden, so it weighs on the process score rather than capping the total. The single biggest thing holding this back is detector precision: removing two over-firing rules would have nearly doubled the F1 and lifted this from a solid mid-tier entry into a top contender.

What they did well

  • Verified F1 exactly reproduces the committed report (0.4965) — genuine, non-fabricated output; recall is a perfect 211/211.
  • 10 of 13 firing detectors are perfectly tuned (P=1.0, R=1.0): title_too_long/short, duplicate_title/meta/h1, missing_h1, broken_link, redirect, thin_content, meta_description_too_long — all match ground truth exactly.
  • Real orchestration: SKILL.md orchestrator + 4 distinct sub-agents (ingest/auditor/fixer/reporter) + 411-line MCP server with SSE-wired live dashboard and health-score gauge, well beyond the starter scaffold.
  • Notes' claims verified in code: self-healing title fixer with 3-retry pixel-width validation + fallback chain (fixer.py), and a difflib get_close_matches redirect map for 404s.
  • Genuine process artifacts: real audit.jsonl (142 varied hook events with real session_id/timestamps), 23 commits spread over ~4.3h, and tailored CLAUDE.md/DECISIONS.md/PROMPTS.md with real timestamped debugging notes.
  • Clean, well-commented code with defensive _str/_num helpers, missing-column guards, and column-strip resilience for hidden exports.

What held them back

  • Precision is only 0.33: missing_image_alt fires 279 times (0 in ground truth — not a graded rule) and slow_page fires 152 vs truth 11 (>1.0s threshold far too aggressive); non_indexable_but_linked over-fires 10 vs 2. These ~420 false positives halve the F1.
  • Builder optimized for '18/18 detectors' (a vanity count) rather than precision; DECISIONS.md even celebrates adding missing_image_alt with '279 affected URLs', unaware it destroys precision.
  • Core detector and fixer wiring authored by 'Codex' (a non-Claude AI tool) in a Claude Code sprint.
  • Title fix artifacts always have old_title empty ('old':''), so the CSV/JSON doesn't show the original title being replaced.
  • Headless run is fragile/slow: the ollama subprocess fixer loop (20 URLs x retries) triggers a UnicodeDecodeError in the reader thread and effectively hangs (~30 min in their own run_meta) before the report is rewritten — robustness drag when Ollama is absent/misbehaving.

How to improve

  • Drop or scope missing_image_alt out of report scoring and raise the slow_page threshold (e.g. >3s) to match the rulebook — these two fixes alone would lift F1 from ~0.50 toward ~0.95.
  • Tighten non_indexable_but_linked to the rulebook's exact condition to cut its 8 false positives.
  • Make the fixer fully decoupled from report generation: write report.json before/independent of the LLM fixer so a missing Ollama can never delay or block the deliverable.
  • Populate old_title from the crawl in title fixes so the fix CSV is actionable.
  • Be transparent about tool usage: if Codex wrote core modules, note it; for a Claude Code sprint, drive the central logic through Claude.
23 Anshul Kumar F1 74% 67/100

Score breakdown (weighted)

Detection accuracy (F1 vs ground truth)22 / 30
Pipeline runs end-to-end on the crawl10 / 10
Output contract + fix artifacts7 / 8
Orchestration & architecture8 / 15
Code quality (code review)8 / 12
Process integrity (logs, commits, debugging)6 / 12
Context & memory files3 / 6
Deliverable & docs3 / 7
Raw total67 / 100
Verified F1 (objective accuracy): 73.9%  ·  committed report F1: 73.9%  ·  ran end-to-end: yes
Detection logic: Executed path: seo-command-center/seo/detector.py (run.py -> mcp/server.py seo_detect -> detector.detect). Implements all 17 rulebook rules (missing/duplicate/too_long/too_short title, missing/duplicate/too_long meta description, missing/duplicate h1, broken_link, server_error, redirect, redirect_chain, thin_content, orphan_page, non_indexable_but_linked, slow_page). A second richer detector lives in agents/auditor.py but is NOT wired into run.py (dead code with divergent type names and fragile string status comparison).

Why this rank

Anshul built a working, fully reproducible SEO auditor: the executed detector (seo/detector.py) implements all 17 rulebook rules and achieves perfect recall, and re-running the pipeline reproduced the committed report.json exactly (verified_f1 = committed_f1 = 0.7391), so there is no sign of fabrication or hard-coding. The pipeline is robust - it ran headless and degraded gracefully with Ollama absent thanks to a real timeout-and-fallback fixer with a length validation loop. Accuracy is capped by precision (0.586): slow_page and non_indexable_but_linked over-fire heavily, adding ~150 false positives that perfect recall cannot offset. The biggest architectural problem is that the two agents he advertises as the core of his orchestration - auditor.py and reporter.py - are never actually invoked by run.py, making them divergent dead code while the simpler ingest/fixer path does the real work. Process integrity is only partly demonstrated: the git history is genuine and well-paced (10 commits over ~4.5h with specific messages and tailored DECISIONS/PROMPTS), but audit.jsonl, the transcript, and agent-log.md are all absent, and CLAUDE.md/README/dashboard remain untouched starter files. The single biggest thing holding the score back is precision tuning - cutting the slow_page/non_indexable false positives would meaningfully raise the accuracy component that dominates the rubric.

What they did well

  • Full rulebook coverage in the executed detector (17/17 rules) -> perfect recall (1.0) on the sample export; all 211 ground-truth pairs found.
  • Output is fully reproducible: re-running on sample-export produced an identical report.json (F1 0.7391) matching the committed one, with the same 12 emitted types and identical per-type counts. No fabrication.
  • Genuine robustness: fixer.py wraps the Ollama call in a 2s timeout with string-fallback and a length validation/retry loop, so the pipeline degrades gracefully and ran clean with Ollama absent (15 title fixes generated, 0 crash).
  • DECISIONS.md and PROMPTS.md are real and specific (graph-based redirect trace, 2s subprocess timeout fix, sys.path import fixes, port handling) and align with the git history of 10 commits spread over ~4.5 hours.
  • No hard-coding: no literal sample URLs, counts, or ground-truth reads anywhere in the code.

What held them back

  • Precision only 0.586: slow_page over-fires badly (152 predicted vs 11 truth, threshold >1.0s too loose) and non_indexable_but_linked over-fires (10 vs 2), dragging F1 to 0.7391 despite perfect recall.
  • Architecture is half-finished: agents/auditor.py and agents/reporter.py are committed as 'sub-agents' but never invoked by run.py (which calls server.seo_detect/seo_report directly); auditor uses non-aliasing type names and a fragile Status Code == '200' string check.
  • Champion fix artifacts incomplete: run.py never calls reporter.py, so the standalone titles_metas_fixes.csv and redirect_map.csv are never generated; the report fixes block has 0 redirects.
  • Process records are mostly missing: no .claude/audit.jsonl committed, no agent-log.md, transcript_bytes=0 - only git history evidences the process; last commit message is 'temporary updation to check something'.
  • CLAUDE.md is the untouched template (the 'Things I have learned' section is still placeholder dots); README and the dashboard (app.js/index.html) are the unmodified starter.

How to improve

  • Tighten slow_page (use the rulebook >1.0 against a cleaner Response Time field or a higher pragmatic threshold) and fix non_indexable_but_linked to cut the ~149 false positives - this alone would lift precision and F1 substantially.
  • Either wire auditor.py/reporter.py into run.py as the real pipeline or delete them; shipping two divergent detectors is confusing and risks the wrong one being graded.
  • Invoke the reporter so the champion CSV deliverables (titles/meta fixes + redirect map) are actually written to outputs/.
  • Run Claude Code with the provided audit hooks active and export agent-log.md so the three process records (audit log, transcript, git) corroborate each other.
  • Tailor CLAUDE.md and the README to the actual build instead of leaving the starter templates.
24 Vijay Pratap SinghFabricated process logs F1 74% 67/100
Integrity adjustment: raw 73 → final 67 — −6 penalty (Fabricated process logs).

Score breakdown (weighted)

Detection accuracy (F1 vs ground truth)22 / 30
Pipeline runs end-to-end on the crawl10 / 10
Output contract + fix artifacts8 / 8
Orchestration & architecture7 / 15
Code quality (code review)9 / 12
Process integrity (logs, commits, debugging)6 / 12
Context & memory files5 / 6
Deliverable & docs6 / 7
Raw total73 / 100
Verified F1 (objective accuracy): 73.9%  ·  committed report F1: 0%  ·  ran end-to-end: yes
Evidence: faked_logs: .claude/audit.jsonl contains only 2 placeholder lines with session_id 'test' and 'verify-123', hook 'unknown', command 'ls', output_preview 'files...' — the lifecycle hooks never genuinely fired during the build; it is not a real process log (the real agent-log.md transcript, by contrast, is genuine).
Detection logic: seo/detector.py (242 lines, fingerprint 6288e9087d7776ee, 0.543 changed vs the 119-line starter). detector.detect() is invoked by mcp/server.py seo_detect(), which run.py drives. Implements 17 rule types (missing_title, duplicate_title, title_too_long, title_too_short, missing_meta_description, duplicate_meta_description, meta_description_too_long, missing_h1, duplicate_h1, broken_link, server_error, redirect, redirect_chain, thin_content, orphan_page, non_indexable_but_linked, slow_page) — roughly 14-15 of the 18 rulebook issues with correct severities and indexable/200/text-html pre-filters; 12 of these intersect the ground-truth keyset.

Why this rank

Vijay built a genuinely working, reproducible deterministic SEO auditor: detector.py grew the starter's ~7 rules into 17 cleanly-implemented, correctly-prefiltered detectors, and re-running the pipeline twice reproduces verified_f1=0.7391 (recall 1.0) with zero hand-fabrication, no hardcoding, and no ground-truth reads. The pipeline runs end-to-end headless on the 456-URL crawl, degrades gracefully without Ollama via a deterministic fixer, and emits a schema-valid report.json plus a full set of valid fix artifacts and a client-ready HTML report. Code quality is solid and readable with a sensible deterministic-vs-model split. Two things hold it back. First, the orchestration story is mostly veneer: the MCP server and dashboard are real and extended, but all four sub-agents, the SKILL.md, and the slash command are byte-identical to the untouched starter, so the 'multi-agent' architecture is scaffold, not delta. Second, the process integrity is mixed — the agent-log transcript and the DECISIONS/PROMPTS files are real, but audit.jsonl is two placeholder test lines, earning a faked_logs flag. Accuracy is honest but middling because slow_page and non_indexable_but_linked over-fire and cap precision at 0.586. The single biggest thing holding this submission back is the gap between an excellent detection engine and a barely-touched orchestration/process layer; closing the two over-broad detectors and shipping real sub-agents would move it into the top tier.

What they did well

  • Reproducible and honest: re-running the pipeline twice yields verified_f1=0.7391 (P=0.586, R=1.0, 360 pred pairs) — exactly the deterministic mid-cluster, with no committed report.json to compare so nothing was hand-faked.
  • Substantial real detection delta: detector.py expands the ~7 starter detectors to 17 well-structured, correctly-severitied rules with proper indexable/200/text-html pre-filters (0.543 changed ratio).
  • Pipeline runs clean end-to-end headless on the real crawl (456 URLs), exit 0, schema-valid report.json (validated against report.schema.json), no real crash even with Ollama absent.
  • Genuine graceful degradation: fixer.py is fully deterministic (slug/url-to-title, path-similarity redirect matching with safe fallbacks); produced 63 title fixes + 6 redirects with Model calls: 0.
  • Complete, valid output contract: report.json + report.html (30KB, severity cards/issues table/recommendations/health) + titles_meta_fixes.csv (old/new within limits) + redirect_map.csv (from/to/reason).
  • Real engineering artifacts: agent-log.md is a genuine 70KB Claude Code transcript, and DECISIONS.md / PROMPTS.md are tailored with real build reasoning and prompts.

What held them back

  • Orchestration is hollow: all four sub-agents (ingest/auditor/fixer/reporter.md), SKILL.md, and commands/seo-audit.md are byte-identical to the untouched starter scaffold — no genuinely distinct sub-agents were authored.
  • audit.jsonl is fake: only 2 placeholder lines (session_id 'test'/'verify-123', command 'ls') — the process hooks never genuinely ran.
  • Precision capped at 0.586 by two over-broad detectors: slow_page emits 152 URLs vs 11 truth (>1.0s threshold catches non-HTML assets) and non_indexable_but_linked emits 10 vs 2.
  • No committed report.json in the repo (committed_f1=0), so the deliverable depended on the grader regenerating it.
  • Cosmetic robustness bug: report writing prints a 'charmap' encoding error on a U+2713 checkmark on Windows consoles (non-fatal but sloppy).
  • Build timeline is compressed: the substantive feat commits are clustered within a ~53-minute window (15:59-16:52), with earlier commits mostly docs/scaffold rather than visible iterative detector debugging.

How to improve

  • Tighten slow_page (filter to text/html and/or align the threshold to the rulebook) and non_indexable_but_linked to lift precision toward the ~0.95+ tier achieved by top submissions.
  • Actually author the four sub-agents and SKILL.md to describe this build's real pipeline instead of shipping the untouched starter scaffold.
  • Wire the audit hooks correctly so audit.jsonl captures a real multi-event lifecycle, not 2 test placeholders.
  • Commit a generated report.json + outputs/ so the deliverable is self-contained and verifiable without re-running.
  • Encode report file writes as UTF-8 explicitly to eliminate the Windows checkmark encoding error.
25 Ranjit Das F1 72% 66/100

Score breakdown (weighted)

Detection accuracy (F1 vs ground truth)22 / 30
Pipeline runs end-to-end on the crawl10 / 10
Output contract + fix artifacts6 / 8
Orchestration & architecture6 / 15
Code quality (code review)8 / 12
Process integrity (logs, commits, debugging)5 / 12
Context & memory files6 / 6
Deliverable & docs3 / 7
Raw total66 / 100
Verified F1 (objective accuracy): 72.0%  ·  committed report F1: 72.0%  ·  ran end-to-end: yes
Detection logic: seo/detector.py (209 lines, expanded from the 119-line starter; changed-ratio 0.43). Implements ~14 of the 18 rulebook rules: missing/duplicate/too_long/too_short title, missing/duplicate/too_long meta description, missing/duplicate h1, broken_link(4xx), server_error(5xx), redirect(3xx), redirect_chain, redirect_loop, thin_content, orphan_page, non_indexable_but_linked, slow_page. A standalone seo/fixer.py (246 lines, net-new vs starter) generates deterministic title/meta rewrites + redirect map but is NOT wired into run.py.

Why this rank

Ranjit delivered a working, reproducible deterministic detector and an honest build. The real work is concentrated in seo/detector.py, which they expanded from the 4-detector starter to roughly 14 of the 18 rulebook rules; running their pipeline fresh on the sample export produced a schema-valid report that scores verified_f1 0.72 and reproduces their committed report exactly, so there is no fabrication or hardcoding. The pipeline is robust: it runs headless, degrades gracefully without Ollama, and writes valid JSON and HTML. Code quality is solid and defensive, and the memory files (especially DECISIONS.md) are genuinely tailored to this build with timestamped decisions that match the code. The submission is held back on three fronts: the orchestration layer (SKILL + all four agents + dashboard) is the untouched starter scaffold, the fixer exists but is never wired into the pipeline so no fix artifacts are produced, and there is no audit.jsonl or transcript at all, gutting the process-integrity evidence. Accuracy itself is dragged down by a slow_page detector that over-fires (152 vs 11) and broken_link/redirect detectors that silently emit nothing. The single biggest thing holding this back is that the builder stopped at a good detector and never pushed the architecture, fixes, or process trail beyond the starter, landing it as a competent-but-incomplete mid-tier entry.

What they did well

  • Detector is genuine real work: grew from the 119-line starter (4-ish detectors) to 209 lines covering ~14 of 18 rules; verified_f1 0.72 reproduces the committed report.json exactly (precision 0.584 / recall 0.938) — fully reproducible, no fabrication.
  • Pipeline runs clean end-to-end headless with Ollama absent: `python run.py <export> --no-dashboard` exits 0, writes schema-valid report.json + report.html, degrades gracefully (model_calls=0) with no crash.
  • report.json passes report.schema.json: all required keys (site, urls_crawled, summary, issues, run_meta) present; every issue has type/severity/affected_urls/count.
  • Defensive, readable code: load_rows() validates required CSV columns and fails fast; _int/_float handle 'nan'/'none'/'n/a'; r.get() used throughout to survive a differently-shaped hidden export.
  • Memory files are genuinely tailored: DECISIONS.md is a real timestamped engineering log whose entries (column validation, NaN handling, context-manager file handles) match the actual code changes I verified; CLAUDE.md and PROMPTS.md tailored too.
  • Git history is honest: 11 incremental commits spread over ~3.8h (12:37-16:26), single author, no single dump, sensible progression from setup to detectors to schema fixes.

What held them back

  • Orchestration layer is the UNTOUCHED starter: SKILL.md and all 4 agent files (ingest/auditor/fixer/reporter) are byte-identical to the starter once CRLF is normalized; mcp/server.py and dashboard/app.js have only cosmetic refactors/null-guards. The delta is essentially detector.py + fixer.py only.
  • Fix artifacts not delivered by the pipeline: run.py never calls the fixer, so report.json ships fixes:{titles:[],redirect_map:[]}. fixer.py only works when run manually (it generated 91 title fixes standalone, 0 redirects) and writes to the bundle dir, not the repo outputs.
  • Process integrity gap: there is NO audit.jsonl and NO agent-log.md / transcript anywhere in the repo — two of the three process-evidence pillars are entirely missing.
  • Detector correctness holes: slow_page over-fires badly (152 predicted vs 11 in truth, threshold >1.0s applied to all rows incl. assets), and broken_link/redirect/redirect_chain detectors exist in code but produce zero rows on this crawl (truth has 6 broken_link + 7 redirect), costing recall and precision.
  • README.md is the untouched starter template despite commit messages implying README work, and JUDGE_REVIEW.md/AUDIT.md are self-assessment padding rather than client deliverables.

How to improve

  • Wire fixer.py into run.py: call generate_fixes() and seo_set_fixes() before seo_report(), and write titles_metas.csv + redirect_map.csv into the repo outputs/ so the champion-tier fix block is actually populated.
  • Fix slow_page (restrict to HTML/indexable 200 pages and tune the threshold) and debug broken_link/redirect/redirect_chain — they currently emit nothing; this alone would lift F1 well above 0.72.
  • Add real process evidence: enable the audit hook to populate .claude/audit.jsonl and export a Claude Code session transcript to agent-log.md.
  • Either genuinely extend the orchestrator/agents (distinct prompts, real MCP-driven delegation) or remove the unused scaffold so the architecture score reflects actual work.
  • Write a project-specific README documenting the real run command, detector coverage, and known limitations instead of shipping the starter template.
26 Vansh Singla F1 51% 66/100

Score breakdown (weighted)

Detection accuracy (F1 vs ground truth)15 / 30
Pipeline runs end-to-end on the crawl10 / 10
Output contract + fix artifacts7 / 8
Orchestration & architecture6 / 15
Code quality (code review)8 / 12
Process integrity (logs, commits, debugging)9 / 12
Context & memory files5 / 6
Deliverable & docs6 / 7
Raw total66 / 100
Verified F1 (objective accuracy): 50.7%  ·  committed report F1: 50.7%  ·  ran end-to-end: yes
Detection logic: seo/detector.py (detect()), called via mcp/server.py seo_detect() from run.py. ~16 deterministic rule types implemented (10+ added beyond the 6-detector starter): missing_title, duplicate_title, title_too_long, title_too_short, broken_link, server_error, redirect, orphan_page, missing_meta_description, duplicate_meta_description, meta_description_too_long, missing_h1, duplicate_h1, redirect_chain (with multi-level + loop detection), thin_content, non_indexable_but_linked, slow_page, missing_image_alt. ~12 of the 12 ground-truth rule types are covered (full recall = 1.0); precision is hurt by extra non-GT detectors.

Why this rank

Vansh built a legitimate, reproducible SEO auditor whose real engineering lives in seo/detector.py and seo/fixer.py. The detector was extended from the 6-rule starter to roughly 16 rules, achieving perfect recall (211/211 ground-truth pairs, every GT type matched exactly) and a fully reproducible F1 of 0.5066 that matches the committed report to three decimals — there is no sign of fabrication or hardcoding. Accuracy is held back not by missed issues but by over-firing: a missing_image_alt detector that isn't even in the rulebook (279 false positives) and an over-broad slow_page threshold (143 vs 11), which together drag precision to 0.34. The champion-tier fixes are genuine — committed CSVs and a report with 20 title rewrites, 15 meta rewrites and 6 redirects prove qwen2.5:0.5b actually ran with a working length-validation loop, though the redirect targets are semantically weak. Process integrity is solid: 23 well-described commits spread naturally over 4.5 hours and a DECISIONS.md full of real failures and fixes, partly undercut by a degraded jq-less audit.jsonl and a thin agent-log. The single biggest thing holding this submission back is that the orchestration layer it claims (SKILL.md plus four sub-agents plus dashboard) is byte-for-byte the untouched starter scaffold, so the architecture score is low and two trivially-removable false-positive detectors are leaving ~30 accuracy points on the table. Fair, honest, mid-tier work that would jump substantially with two small detector deletions and any real agent differentiation.

What they did well

  • Fully reproducible: re-running headless with --no-fixes regenerated a report.json that scores precision 0.3392 / recall 1.0 / F1 0.5066 — exactly matching the committed report (committed F1 0.507). No fabrication.
  • Perfect recall: all 211 ground-truth issue pairs were detected (true_positives 211/211); every GT type matched its exact URL count (title_too_long 63/63, meta_description_too_long 42/42, duplicate_h1 19/19, etc.).
  • Real delta over starter: detector.py grew from the 6-rule starter to ~16 rules, including a genuine redirect_chain implementation with cycle/loop detection (visited-set traversal) — not boilerplate.
  • Genuine champion-tier fixes committed: committed report.json has 20 model-rewritten titles, 15 meta rewrites, 6 redirects (41 model_calls), plus fixes_titles.csv / fixes_redirects.csv — proving qwen2.5:0.5b actually ran and the validation/length-cap loop works.
  • Strong process trail: 23 descriptive commits genuinely spread over 4.5h (12:08 to 16:39) showing real iteration; DECISIONS.md logs concrete failures (Ollama disk-full, WinError 10061, model swap gemma3:4b->qwen2.5:0.5b).
  • Graceful degradation: pipeline runs cleanly without Ollama via try/except around the fix step and a --no-fixes flag; deterministic detection still produces a valid report.

What held them back

  • Precision only 0.339 — two over-firing detectors poison the report: missing_image_alt predicts 279 URLs but is NOT a ground-truth type (0 correct), and slow_page predicts 143 vs 11 truth (>1.0s threshold far too aggressive).
  • Orchestration layer is untouched starter: skills/seo-audit/SKILL.md and all four agents/*.md (ingest, auditor, fixer, reporter) are byte-identical to the starter bundle (only CRLF/LF differences). The sub-agents are scaffold descriptions, not genuinely distinct builder work.
  • Dashboard (dashboard/app.js, index.html) is the unchanged starter SSE cockpit — functional but no enhancement beyond the scaffold.
  • Redirect-map quality is poor: it maps broken image PNGs to an unrelated logo PNG ('closest live URL' by token overlap), so the champion redirect artifact is structurally valid but semantically weak.
  • audit.jsonl is real-but-degraded (32 lines, every entry is the same 'jq not installed' hook note rather than captured tool payloads); agent-log.md is a thin 80-line hand-written summary, not a full transcript.
  • CLAUDE.md and PROMPTS.md retain large chunks of the starter template/instructional preamble and example blocks; tailoring is partial rather than fully rewritten.

How to improve

  • Drop missing_image_alt entirely (not in the rulebook scope) and tighten slow_page to the rulebook threshold — this alone would lift precision from ~0.34 toward ~0.95 and F1 toward ~0.97 without touching recall.
  • Actually differentiate the four sub-agents (distinct system prompts / responsibilities) or wire them into the run so orchestration reflects real architecture instead of untouched scaffolds.
  • Improve the redirect heuristic: restrict candidate targets to same content-type / same path section and skip asset (image) 4xx URLs, so redirect suggestions are usable.
  • Fix the audit hook to capture real tool events (install jq or rewrite audit.sh to emit JSON without jq) so the process log is evidentiary, not a repeated warning.
  • Fully rewrite CLAUDE.md / PROMPTS.md to remove starter template text and keep only build-specific memory and the prompts that actually moved the work.
27 Anurag ThakurFabricated process logsOther issue F1 75% 64/100
Integrity adjustment: raw 73 → final 64 — −6 penalty (Fabricated process logs); −3 penalty (Other issue).

Score breakdown (weighted)

Detection accuracy (F1 vs ground truth)22 / 30
Pipeline runs end-to-end on the crawl10 / 10
Output contract + fix artifacts7 / 8
Orchestration & architecture11 / 15
Code quality (code review)9 / 12
Process integrity (logs, commits, debugging)5 / 12
Context & memory files4 / 6
Deliverable & docs5 / 7
Raw total73 / 100
Verified F1 (objective accuracy): 75.0%  ·  committed report F1: 75.0%  ·  ran end-to-end: yes
Evidence: faked_logs: .claude/audit.jsonl and agent-log.md are post-hoc reconstructions, not genuine session traces — PROMPTS.md Prompt 5 says 'Create a realistic audit.jsonl that matches the git history' and DECISIONS.md Decision 5 + agent-log Turn 6 admit 'Reconstructed the audit trail based on git history and session memory'; audit.jsonl timestamps are perfectly round 5-min intervals and claim lines_added:450 for a 166-line detector. other: CLAUDE.md/DECISIONS.md/PROMPTS.md/agent-log.md assert fabricated technical claims ('switched to Gemma 4 31B Cloud', '34s vs 7m 10x speedup') that no code supports — grep finds zero ollama/gemma/cloud/requests/model code and report run_meta shows model_calls:0.
Detection logic: seo/detector.py (single deterministic detect() function, stdlib csv only) called via mcp/server.py seo_detect() and run.py. Implements the full rulebook — all 17 rule types present (missing_title, duplicate_title, title_too_long, title_too_short, missing_meta_description, duplicate_meta_description, meta_description_too_long, missing_h1, duplicate_h1, broken_link, server_error, redirect, redirect_chain, thin_content, orphan_page, non_indexable_but_linked, slow_page); 12 fire on this sample, the other 5 legitimately produce zero rows.

Why this rank

Anurag delivered a genuinely working, fully reproducible audit: re-running run.py on the test crawl with Ollama absent produced exactly the committed report (verified_f1 0.7496, recall 1.0), and the detection logic in seo/detector.py covers all 17 rulebook rules with correct pre-filters — a real, ~2x extension of the starter's detector. The pipeline runs end-to-end cleanly, writes a schema-valid report.json and a client-readable report.html, and is backed by four edited sub-agents, an MCP server wired through plugin.json, a deterministic fixer, and a live SSE dashboard. Accuracy is held back mainly by the slow_page detector over-firing (152 vs 11), which drops precision to 0.599. The git history (19 commits over 7.3h) is authentic and shows real debugging. The single biggest thing holding this submission back is integrity of the process record: the builder openly reconstructed audit.jsonl and agent-log.md after the fact and seeded the memory files with fabricated claims about a 'Gemma 4 31B Cloud' model and a '10x speedup' that no code supports (model_calls is 0 and there is no model integration anywhere). The committed report itself is honest and the code is real, so this is not report fraud — but the faked logs and invented technical narrative are a real credibility hit on an otherwise solid, accurate build.

What they did well

  • Detection reproduces exactly: re-running run.py on sample-export yields verified_f1=0.7496, identical to the committed report.json (12 issue types, recall 1.0, 211/211 true positives) — no fabrication.
  • Full rulebook coverage: extended the ~9-detector starter to all 17 rule types in seo/detector.py with correct indexable/200/text-html pre-filters and sound null handling (_int/_float helpers).
  • Pipeline is robust headless without Ollama: ran clean to completion and wrote schema-valid report.json + styled report.html with no crash.
  • Genuine, well-paced git history: 19 commits over ~7.3 hours with descriptive messages showing real iteration (skeleton → all detectors → 'Fix 3 critical edge-case bugs' → fixer/CSV exports → cleanup).
  • Added a real deterministic fixer (seo_fix in server.py) producing a redirect map and title generator, plus a working SSE dashboard (app.js) that streams issues into a /18 progress bar reflecting the run.

What held them back

  • Process logs are fabricated: audit.jsonl and agent-log.md are admitted post-hoc reconstructions, not real Claude Code traces (PROMPTS.md Prompt 5 and DECISIONS.md Decision 5 say so explicitly).
  • Memory/docs contain fictional technical claims ('Gemma 4 31B Cloud', '34s vs 7m', 'AI-driven fixes') with no supporting code — the fixer is pure string heuristics and run_meta model_calls=0.
  • Precision drag from slow_page: predicts 152 URLs vs 11 in truth (Response Time > 1.0 over-fires), the main reason precision is only 0.599.
  • Fix quality is crude: every broken 4xx link (including images) is redirected to the homepage with reason 'redirecting to homepage', not the closest live page as the SKILL.md champion spec describes.
  • Fix CSVs (title_meta_fixes.csv, redirect_map.csv) are static committed files not regenerated by run.py, and title_meta_fixes.csv is header-only.
  • README is essentially the untouched starter (title still reads 'Forge Sprint 01 starter').

How to improve

  • Stop fabricating process artifacts — let the real audit hook write audit.jsonl and export the actual transcript; genuine git history already shows the work and would have scored better than a reconstructed log that trips the integrity gate.
  • Tune slow_page (and verify the Response Time threshold against the issue CSVs) to cut the 152→11 over-prediction and lift precision/F1.
  • Make run.py emit title_meta_fixes.csv and redirect_map.csv as part of the pipeline so the deliverables are reproducible, and choose nearest-live redirect targets instead of always the homepage.
  • Remove unsupported claims from CLAUDE.md/DECISIONS.md/PROMPTS.md (Gemma cloud, 34s, AI fixes) so docs match the actual deterministic implementation.
  • Rewrite the README to describe what was built rather than shipping the starter text.
28 Pranjal F1 55% 64/100

Score breakdown (weighted)

Detection accuracy (F1 vs ground truth)17 / 30
Pipeline runs end-to-end on the crawl10 / 10
Output contract + fix artifacts5 / 8
Orchestration & architecture5 / 15
Code quality (code review)8 / 12
Process integrity (logs, commits, debugging)8 / 12
Context & memory files6 / 6
Deliverable & docs5 / 7
Raw total64 / 100
Verified F1 (objective accuracy): 55.4%  ·  committed report F1: 55.4%  ·  ran end-to-end: yes
Detection logic: seo/detector.py (245 lines) — the real, extended detection engine. Expanded from the ~6-detector starter to 22 detectors covering ~14 of the 18 rulebook rules: missing/duplicate/too_long/too_short titles, missing/duplicate/too_long meta descriptions, missing/multiple/duplicate H1, missing_canonical, canonical_mismatch, broken_link, server_error, redirect, graph-based redirect_chain + redirect_loop, thin_content, orphan_page, non_indexable_but_linked, slow_page. A separate seo/fixer.py implements a deterministic redirect-map algorithm but is NOT wired into run.py (dead code).

Why this rank

Pranjal shipped an honest, reproducible submission whose real work lives almost entirely in seo/detector.py, which was expanded from the ~6-detector starter into a 22-detector engine with solid CSV sanitization, strict indexability filtering, and a genuine redirect-graph traversal for chains and loops. Running it headless without Ollama reproduces the committed report exactly (verified_f1 0.5542 == committed 0.554), with no fabrication, hardcoding, or faked logs — and the process artifacts (tailored CLAUDE.md/DECISIONS.md/PROMPTS.md plus 257 real hook events and 9 spread-out commits) corroborate a real build. Accuracy is held back by precision: the detector emits two non-graded issue types (orphan_page, missing_canonical) and over-fires on slow_page and duplicate_h1, dragging F1 to 0.55 despite near-perfect recall and many perfectly-detected types. The single biggest thing holding the score down is that the architecture beyond detection is largely the untouched starter — the four sub-agents, SKILL orchestrator, and dashboard are byte-identical to the scaffold, and the champion-tier fixer.py is never wired in, so no fix artifacts ship. It is a competent detection-engine submission with strong integrity but limited delta on orchestration and deliverables, earning a solid mid-tier 64/100.

What they did well

  • Fully reproducible: re-running the pipeline regenerates the committed report.json byte-for-metric-equivalent (verified_f1 0.5542 == committed 0.554). No fabrication, no hardcoding (grep for sample URLs/ground-truth/answer key came back empty).
  • Pipeline runs cleanly headless with Ollama absent — loaded 456 URLs, detected 12 issue types, wrote valid report.json + report.html with no crash; degrades gracefully (model_calls=0).
  • detector.py is genuinely strong work: robust CSV header sanitization for messy Screaming Frog exports, strict HTML+indexable+200 filtering, and a real redirect-graph traversal for chains/loops. Perfect per-type accuracy on broken_link, duplicate_title, duplicate_meta_description, meta_description_too_long, redirect, thin_content, title_too_long, title_too_short.
  • Excellent, tailored process memory: CLAUDE.md, DECISIONS.md, and PROMPTS.md contain real, timestamped engineering decisions (rejecting the model's false 100% coverage claim, the WinError 10013 port-fallback fix, detector verification loops) that match the actual code.
  • Genuine audit.jsonl: 257 real Claude Code hook events (PreToolUse/PostToolUse/SubagentStop/Stop) spanning ~2.5 hours, plus 9 commits with real messages over ~3.7 hours — a believable build process.

What held them back

  • Precision is poor (0.386): two non-graded detectors flood false positives — orphan_page (109 predicted, 0 in truth) and missing_canonical (13 predicted, 0 in truth) — and slow_page over-fires badly (152 predicted vs 11 truth, threshold >1.0s too loose), as does duplicate_h1 (85 vs 19).
  • Misses two graded types entirely: missing_h1 (2) and non_indexable_but_linked (2) score 0 correct despite the latter being implemented (filter/column mismatch).
  • Orchestration layer is essentially the untouched starter: all 4 sub-agents (ingest/auditor/fixer/reporter), SKILL.md, and the slash command are byte-identical to the starter scaffold (CRLF-only diff). The only original server change is the dynamic port fallback.
  • Champion-tier fixer is dead code: seo/fixer.py is never imported or called by run.py; report.json ships empty fixes ({titles:[], redirect_map:[]}) and no titles_fixes.csv / redirect_map.csv artifacts are produced.
  • No agent-log.md transcript (transcript_bytes=0), and every audit.jsonl event carries the same 'jq not installed' note, so tool-level detail of the process was never captured.
  • Recommendations in the report are the generic starter-generated strings, not model- or rule-driven insight.

How to improve

  • Drop or gate non-rulebook detectors (orphan_page, missing_canonical, canonical_mismatch) out of the graded report, and tune slow_page and duplicate_h1 thresholds to match the rulebook to recover precision — this alone would lift F1 substantially.
  • Fix the missing_h1 and non_indexable_but_linked detectors so their filters actually catch the truth rows.
  • Wire seo/fixer.py into run.py to emit the title-rewrite and redirect-map fix artifacts (with a deterministic fallback when Ollama is down), completing the output contract.
  • Actually customize the sub-agents and SKILL.md so the orchestration reflects this build rather than the starter scaffold.
  • Export a real session transcript (agent-log.md) and install jq so audit.jsonl captures tool names/inputs for verifiable process detail.
29 Saurabh F1 47% 61/100

Score breakdown (weighted)

Detection accuracy (F1 vs ground truth)14 / 30
Pipeline runs end-to-end on the crawl10 / 10
Output contract + fix artifacts5 / 8
Orchestration & architecture5 / 15
Code quality (code review)7 / 12
Process integrity (logs, commits, debugging)11 / 12
Context & memory files6 / 6
Deliverable & docs3 / 7
Raw total61 / 100
Verified F1 (objective accuracy): 46.8%  ·  committed report F1: 46.8%  ·  ran end-to-end: yes
Detection logic: seo/detector.py (detect()). Completed the starter's TODO list: added title_too_short, missing_meta_description, duplicate_meta_description, meta_description_too_long, missing_h1, duplicate_h1, redirect_chain, thin_content, non_indexable_but_linked, slow_page on top of the ~6 starter detectors. ~14 of the 17 rulebook rules implemented deterministically (missing_title, server_error, orphan_page also present from starter; only redirect_chain edge-case loops untested). All detection is in detector.py; orchestration files are untouched starter.

Why this rank

Saurabh's submission is honest and reproducible but narrow. The single piece of real work is seo/detector.py, where he completed the starter's TODO list, growing detection from roughly six to sixteen rules with correct indexable/200 pre-filters and rulebook-accurate severities; re-running the pipeline regenerated an identical report scoring verified_f1=0.4684, exactly matching the committed file, so there is no fabrication or hard-coding. Accuracy is held back by precision: recall is perfect (1.0) but thin_content and slow_page run over every row and flag hundreds of false positives (340 vs 10, 152 vs 11), pulling precision to 0.31. Everything outside the detector — the MCP server, run.py, the orchestrator skill, all four sub-agents, the dashboard, plugin.json, and even the README — is byte-identical to the starter, and the champion-tier fixer was never implemented (empty fixes block, no fix files). On the plus side the process is clearly genuine: a real 99-line audit log with varied hooks, a 1MB authentic Claude Code transcript, eleven commits spread across the build, and a tailored DECISIONS/CLAUDE/PROMPTS set that the code corroborates. The single biggest thing holding this back is that the builder treated the task as 'finish the detector and ship the scaffold' — the low precision plus the entirely untouched orchestration and missing fixer mean the delta over the boilerplate is real but thin, landing it solidly mid-pack rather than near the top.

What they did well

  • Fully reproducible: re-running run.py on the sample regenerated an identical report.json scoring verified_f1=0.4684, exactly matching the committed report (0.468) — no fabrication.
  • Pipeline runs cleanly headless with Ollama absent: `python run.py sample-export --no-dashboard` exits 0, processes 456 URLs, writes schema-valid report.json + report.html, degrades gracefully (model_calls=0).
  • Real detector delta: expanded the starter from ~6 to ~16 detectors, completing the rulebook TODO (meta-description family, H1 family, thin_content, slow_page, redirect_chain) with correct indexable+200 pre-filters on the title/meta/H1 rules and correct rulebook severities.
  • Genuine process trail: 99-line .claude/audit.jsonl with varied real hook events (PreToolUse 28, PostToolUse 27, UserPromptSubmit 20, Stop 18, SubagentStop 4, SessionStart 2) spanning 07:12-10:12, plus a 1.06MB authentic Claude Code session transcript (real thinking blocks, tool calls, gemma4:31b) and 11 commits spread over 2.85h.
  • DECISIONS.md is a real, specific engineering log that matches the code and commit timeline (e.g. corrected meta threshold 160->155, flipped H1 severities, added run_meta to fix schema compliance); CLAUDE.md and PROMPTS.md are substantially tailored.

What held them back

  • Low precision (0.306) drags accuracy down: thin_content predicted 340 vs truth 10 and slow_page predicted 152 vs truth 11 — these two rules run over ALL rows (and count Word Count 0 / loose 1.0s threshold) instead of properly scoping to relevant HTML/indexable pages, producing massive false positives; non_indexable_but_linked also over-fires (10 vs 2).
  • Orchestration is 100% untouched starter scaffold: mcp/server.py, run.py, skills/seo-audit/SKILL.md, all four agents, dashboard/index.html and app.js, and plugin.json are byte-identical to the bundle (only a cosmetic dict reformat in server.py). The architecture beyond the boilerplate is zero-delta.
  • Champion-tier fixes entirely absent: no title rewrites and no redirect map were produced — report.json fixes block is {titles:[], redirect_map:[]} and no fix CSVs exist; the fixer agent is the unmodified starter stub and is never invoked.
  • README.md is the untouched starter README (still says 'Forge Sprint 01 starter', 'EXTEND THIS', 'Your job in the Sprint') — no client/builder-authored documentation of what was actually built.
  • report.html is the starter's minimal template (3.7KB, issue table + canned recommendations) with no charts, fixes, or genuine client-readiness improvements.

How to improve

  • Scope thin_content and slow_page to indexable text/html 200 pages and treat Word Count 0 / missing Response Time as not-applicable rather than flagging them — this alone would lift precision sharply toward the high-0.9 F1 that careful submissions achieved.
  • Tighten non_indexable_but_linked and re-validate every detector's affected-URL counts against the rulebook before submitting (per-type count diffing catches the over-fires).
  • Implement the champion tier: deterministic title truncation/rewrite within limits plus a difflib-based redirect map, and write titles.csv + redirect_map.csv and populate the report fixes block.
  • Actually extend the orchestration (wire the fixer agent, add a real recommendation step, enrich the dashboard/report) so the submission shows architecture work beyond the scaffold.
  • Replace the starter README with a real write-up of the approach, run command, and results.
30 Guneet Toppo F1 47% 56/100

Score breakdown (weighted)

Detection accuracy (F1 vs ground truth)14 / 30
Pipeline runs end-to-end on the crawl10 / 10
Output contract + fix artifacts5 / 8
Orchestration & architecture6 / 15
Code quality (code review)7 / 12
Process integrity (logs, commits, debugging)9 / 12
Context & memory files2 / 6
Deliverable & docs3 / 7
Raw total56 / 100
Verified F1 (objective accuracy): 46.6%  ·  committed report F1: 46.6%  ·  ran end-to-end: yes
Detection logic: seo-command-center/seo/detector.py (235 lines, genuine rewrite of the ~100-line starter; changed_ratio 0.485). Implements ~16 of 18 rulebook rules: missing_title, duplicate_title, title_too_long, title_too_short, missing/duplicate/too_long meta_description, missing_h1, duplicate_h1, broken_link, server_error, redirect, redirect_chain, thin_content, non_indexable_but_linked, orphan_page, slow_page. Adds real normalize_url() and robust _int/_float/val helpers.

Why this rank

Guneet shipped a genuine, reproducible detector: running the pipeline headless without Ollama regenerated a report scoring an identical verified_f1 of 0.466, so there is no fabrication or hardcoding. The detector is a real rewrite of the starter with sound helpers (URL normalization, robust casting) and roughly 16 of 18 rulebook rules, and many of them are exactly right, giving perfect recall (1.0). The score is held back almost entirely by precision (0.30): a handful of mis-calibrated thresholds — thin_content, slow_page, non_indexable_but_linked and a false-positive redirect_chain — over-predict by ~480 URLs. The champion-tier fixer is the second big gap: a broken import path makes it silently fall back to a mock, so the fixes block in report.json is empty and no fix CSVs exist, and even the underlying generators only return placeholder strings. Process integrity is solid for the time invested: nine real commits over ~2.9 hours, a legitimate audit.jsonl, a substantial transcript, and tailored PROMPTS/DECISIONS, though CLAUDE.md, the agents and the README remain untouched starter scaffold. The single biggest thing holding this submission back is precision calibration — correcting three or four thresholds would lift F1 (and the accuracy score) substantially without touching the architecture. The result is a competent but unpolished entry: strong, honest detection with a non-working fix layer and a largely unmodified orchestration shell.

What they did well

  • Output is fully reproducible: re-running the pipeline headless (no Ollama) regenerated report.json scoring identical to the committed file (verified_f1 0.4663 == committed 0.466). No fabrication, no hardcoding.
  • Detector is a genuine rewrite, not the starter: added normalize_url(), robust type-casting helpers, and ~16 of 18 rulebook detectors. Recall is a perfect 1.0 (all 211 truth pairs caught).
  • Many detectors are exactly correct: broken_link 6/6, title_too_long 63/63, title_too_short 21/21, duplicate_title 12/12, duplicate_h1 19/19, duplicate_meta 16/16, meta_description_too_long 42/42, redirect 7/7, missing_h1 2/2.
  • Pipeline runs clean end-to-end without Ollama and writes a schema-valid report.json (all required keys, valid severity enums).
  • Genuine process trail: 9 meaningful commits spread over ~2.9h, a real 133-line .claude/audit.jsonl with varied hook events (SessionStart, UserPromptSubmit, PreToolUse Bash/Edit/Glob/Read) across multiple sessions, and a 223KB session transcript. PROMPTS.md and DECISIONS.md are tailored with real prompts and learnings.

What held them back

  • Precision is only 0.304 (694 predicted vs 211 truth pairs), dragging F1 to 0.466. Caused by mis-calibrated thresholds: thin_content fires on 340 rows vs 10 truth (no HTML/200 filter), slow_page 152 vs 11 (1.0s threshold too low), non_indexable_but_linked 10 vs 2, and redirect_chain produces 4 false positives (truth 0).
  • Fixer is non-functional: fixer.py imports 'from mcp.server import set_fixes' which fails at runtime and silently falls back to a mock that only prints; fixes never reach server.RUN, so report.json fixes block is empty ({titles:[], redirect_map:[]}) and no fix CSVs are produced.
  • Even if wired, the title/meta fixers return hardcoded placeholder strings ('Optimized Title Example') — there is no real LLM rewrite logic, only a prompt-builder skeleton.
  • Orchestration layer is untouched starter: skills/seo-audit/SKILL.md, all four agents/*.md, and README.md are the original scaffold; the agent layer was not extended. Real work is concentrated only in detector.py.
  • Memory/deliverable weak: CLAUDE.md is the untouched template (still says 'Replace the prompts below with your own. This is YOUR file'). report.html is an 18-line minimal table, not client-ready.

How to improve

  • Fix the three precision-killing thresholds: gate thin_content to indexable text/html 200 pages and align the word-count cutoff, raise the slow_page threshold to the rulebook value, and tighten redirect_chain so single redirects are not counted.
  • Repair the fixer import (use the same 'import server' path run.py uses, or expose set_fixes correctly) so fixes actually persist into report.json, and emit titles_fixes.csv + redirect_map.csv.
  • Replace the mock title/meta generators with real model calls (or graceful deterministic fallbacks) and validate length in code.
  • Tailor CLAUDE.md to this build and upgrade report.html to a client-ready layout with severity cards and per-issue tables.
  • Extend the sub-agents and SKILL beyond the starter stubs so the orchestration reflects the actual pipeline.
31 Yatharth Sachdeva F1 27% 56/100

Score breakdown (weighted)

Detection accuracy (F1 vs ground truth)8 / 30
Pipeline runs end-to-end on the crawl10 / 10
Output contract + fix artifacts7 / 8
Orchestration & architecture7 / 15
Code quality (code review)7 / 12
Process integrity (logs, commits, debugging)7 / 12
Context & memory files6 / 6
Deliverable & docs4 / 7
Raw total56 / 100
Verified F1 (objective accuracy): 27.0%  ·  committed report F1: 27.0%  ·  ran end-to-end: yes
Detection logic: seo/detector.py (fully rewritten from the 119-line/8-detector starter to 363 lines). The detect() function implements all 17 rulebook rules correctly, PLUS ~11 extra out-of-scope types (success_2xx, security_missing_*, viewport_not_set, h2_missing/duplicate, url_over_115_chars, url_non_ascii, directives_noindex, canonical_missing, h1_too_long, meta_description_too_short). 28 distinct types emitted total; 17 of the 17 rulebook rules covered.

Why this rank

Yatharth rebuilt the detection layer for real: seo/detector.py went from the 119-line, 8-detector starter to a 363-line engine that correctly implements all 17 rulebook rules, achieving perfect recall (all 211 ground-truth pairs found) and a fully reproducible F1 of 0.27 - the committed and freshly-run numbers match exactly, so nothing is fabricated or hard-coded. The reason that strong detector yields a weak score is over-prediction: the engine also emits 11 out-of-scope issue types (most damagingly success_2xx, which flags every healthy 200 page), inflating predictions to 1350 and crushing precision to 0.156. The pipeline runs cleanly end-to-end and degrades gracefully without Ollama, producing a schema-valid report.json, a presentable client report.html, and valid-but-shallow fix artifacts (canned titles, all-to-homepage redirects). The orchestration story is thinner than it looks: a whitespace-insensitive diff proves the four sub-agents, the orchestrator SKILL.md, the command, run.py, and the README are the untouched starter; the builder's genuine work lives in the detector, ~94 lines of the MCP fixer, and the dashboard's dedup logic. Process is half-credible - 15 well-described commits over 5.6 hours plus tailored CLAUDE/DECISIONS/PROMPTS files, but the audit.jsonl and agent-log.md transcript the brief requires are entirely absent, so only git history corroborates the build. There are no integrity flags - this is honest, partially-finished work. The single biggest thing holding it back is the precision problem: simply scoping output to the 17 rulebook types would have roughly tripled the accuracy score for almost no effort.

What they did well

  • Detector fully rewritten (119 to 363 lines, detector_changed_ratio 0.749) and correct on all 17 rulebook rules: verified recall = 1.0, all 211 ground-truth (type,url) pairs found.
  • Output is reproducible: re-running run.py regenerated a report.json that scores F1 0.2703, matching the committed F1 0.27 exactly. Not fabricated.
  • Pipeline runs end-to-end and degrades gracefully with no Ollama: the fixer (run_cloud_fixer) catches the connection failure and writes 5 length-guarded title fixes + a 5-entry redirect map via fallbacks, so a valid report is still produced.
  • Schema-valid report.json (site, urls_crawled, summary, issues[type/severity/affected_urls/count/explanation], fixes{titles,redirect_map}, recommendations, run_meta) plus a clean, severity-prioritized client report.html.
  • Genuine, well-tailored memory files: CLAUDE.md documents the real architecture, DECISIONS.md has 9 timestamped real engineering entries, PROMPTS.md has the actual sub-agent delegation prompt. 15 commits spread over 5.6h with descriptive incremental messages (not a single dump).

What held them back

  • Low precision (0.156) tanks F1 to 0.27 despite perfect recall: the detector over-predicts ~1139 spurious pairs by emitting 11 types not in the rulebook (e.g. success_2xx flags every 200 page as an 'issue', security_missing_*, viewport_not_set). Treating clean 2xx pages as issues is a clear scoping error.
  • The 'orchestration' they claim is mostly untouched starter: whitespace-insensitive diff shows agents/ingest, auditor, fixer, reporter, SKILL.md, commands/seo-audit.md and run.py are 0 real-content lines changed from the bundle. Their actual delta is detector.py, ~94 lines of mcp/server.py (the fixer), and ~73 lines of dashboard/app.js.
  • Required process records are missing: no .claude/audit.jsonl (audit_lines 0) and no agent-log.md transcript (transcript_bytes 0). The README's own rule that 'audit log, transcript, git history must agree' cannot be satisfied; only git history is present.
  • Fixer is largely cosmetic: with Ollama down the 'model' title rewrites are canned brand strings (e.g. 'Innovative Technology Products | NMG Technologies') and every broken-link redirect maps to the site homepage, so the fix artifacts are valid in shape but low in real value.
  • README is the verbatim starter README (still titled 'starter', still says 'EXTEND THIS'), and CLAUDE.md claims '17 core rules' while the code actually ships 28 emitted types - docs and code disagree.

How to improve

  • Restrict detector output to the 17 rulebook types (or gate extra types behind a flag) - dropping success_2xx and the security/viewport/url noise alone would lift precision from ~0.16 toward ~1.0 and F1 from 0.27 to near 0.9 with no recall loss.
  • Actually customize the sub-agents and SKILL.md rather than shipping the untouched scaffold; if the 4-stage pipeline is the claimed value, the agent prompts and orchestrator should reflect the builder's design.
  • Wire the .claude audit hook and run scripts/export-transcript.sh so audit.jsonl and agent-log.md are committed - the process score depends on these three records agreeing.
  • Make the fixer genuinely useful even offline: derive redirect targets from URL/path similarity to a live page instead of defaulting all 404s to the homepage, and label fallback titles honestly instead of presenting them as model output.
  • Reconcile docs with code (CLAUDE.md '17 rules' vs 28 emitted) and replace the starter README with a real one describing what was built.
32 Kshitija NandaFabricated process logs F1 36% 51/100
Integrity adjustment: raw 57 → final 51 — −6 penalty (Fabricated process logs).

Score breakdown (weighted)

Detection accuracy (F1 vs ground truth)11 / 30
Pipeline runs end-to-end on the crawl10 / 10
Output contract + fix artifacts6 / 8
Orchestration & architecture5 / 15
Code quality (code review)8 / 12
Process integrity (logs, commits, debugging)5 / 12
Context & memory files6 / 6
Deliverable & docs6 / 7
Raw total57 / 100
Verified F1 (objective accuracy): 36.0%  ·  committed report F1: 36.0%  ·  ran end-to-end: yes
Evidence: faked_logs: .claude/audit.jsonl is hand-authored (only 8 lines, perfectly round timestamps 10:00:00/10:01:00/10:01:05, references a 'ValidateFixFiles' subagent that does not exist in agents/, says '12 issue types'); agent-log.md is a 426-byte empty stub containing only a transcript header and two 'Create hello.txt file' lines, not a real Claude Code build transcript. DECISIONS.md/PROMPTS.md candidly state detector.py was 'written entirely in Terminal (no Claude Code quota used)', confirming the process logs were retrofitted rather than captured.
Detection logic: seo/detector.py (149 lines), invoked via mcp/server.py seo_detect() from run.py. Genuinely expanded from the ~6-detector starter to 17 detectors covering ~14 of the 18 rulebook rules: added missing_title, title_too_short, missing_meta, duplicate_meta, meta_too_long, missing_h1, duplicate_h1, server_error, redirect_chain, thin_content, non_indexable_but_linked, slow_page, plus an invented (non-rulebook) missing_alt_text. detector_changed_ratio 0.502.

Why this rank

Kshitija built a real, working deterministic detector: she expanded the starter from ~6 to 17 detectors (~14 of 18 rulebook rules) in seo/detector.py, and her pipeline runs cleanly headless without Ollama, producing a schema-valid report.json and a polished client-ready report.html. The output is fully reproducible - my fresh run scored verified_f1 = 0.3601, matching her committed 0.36 exactly - so there is no fabrication. The score is held down by accuracy: recall is a perfect 1.0 and nine detector types are pixel-exact, but precision collapses to 0.22 because three detectors over-fire (an invented missing_alt_text at 279 false positives, missing_h1 at 333 vs 2, slow_page at 143 vs 11), which is a tuning problem rather than a logic failure and would be cheap to fix. Process integrity is the second drag: the git history (14 commits over five hours) is genuine and the memory files are honestly tailored, but audit.jsonl is hand-fabricated with round timestamps and a phantom subagent, and agent-log.md is an empty stub - earning a faked_logs flag. Orchestration also regressed below the starter, as she left the four agents untouched and deleted the orchestrator skill that plugin.json still references, and her generated fixes were never wired into report.json. The single biggest thing holding her back is detector precision: with the ground truth's recall already saturated, tightening three over-broad rules would roughly triple her accuracy points and move this from a mid-pack to a strong submission.

What they did well

  • Reproducible result: freshly re-run report.json scores verified_f1 = 0.3601, matching committed F1 = 0.36 exactly (961 pred pairs, 211 truth pairs, recall 1.0) - no fabrication.
  • Perfect recall (1.0): every ground-truth issue pair is caught; 9 of 13 detector types are pixel-exact (broken_link 6/6, duplicate_title 12/12, title_too_long 63/63, title_too_short 21/21, meta_description_too_long 42/42, duplicate_meta_description 16/16, duplicate_h1 19/19, thin_content 10/10, redirect 7/7).
  • Pipeline runs clean and headless with Ollama absent - degrades gracefully (model_calls=0), produces a schema-valid report.json with all required keys and a 10.5KB styled, client-ready report.html.
  • detector.py is genuine, readable work: clean helper functions (_int/_float/is_html/indexable), real expansion from the starter scaffold (detector_changed_ratio 0.502), pure-deterministic detection as the brief intended.
  • Tailored memory files: CLAUDE.md, DECISIONS.md and PROMPTS.md are specific to this build (real architecture, real constraints, honest 'coded in terminal' admission), and 14 git commits are spread genuinely over ~5 hours with meaningful incremental messages.
  • Real champion-tier fix artifacts on disk: fix_titles.csv (40 H1/slug-derived rewrites capped to ~60 chars) and fix_redirects.csv (404-to-parent and chain-flatten map).

What held them back

  • Low precision (0.2196) tanks accuracy: three over-broad detectors dominate - missing_alt_text predicts 279 URLs against 0 in truth (an invented, non-rulebook detector), missing_h1 predicts 333 vs 2 truth (scoped to all 200 pages instead of indexable HTML), slow_page predicts 143 vs 11 truth (>1.0s threshold too loose for the ground truth).
  • Faked process logs: audit.jsonl is hand-authored with round timestamps and a phantom subagent; agent-log.md is an empty 426-byte stub - no real Claude Code transcript despite the requirement.
  • Orchestration regressed below the starter: the four agents/ files are the untouched starter stubs, and the orchestrator skill was DELETED - plugin.json still references './skills/seo-audit' but no skills/ directory exists (a broken reference).
  • Fixes are not wired into the contract: run.py never calls seo_set_fixes(), so report.json 'fixes' is {titles:[], redirect_map:[]} even though the CSVs were generated separately - the JSON deliverable understates the work.
  • Hacky code smell: seo_export is monkey-patched/redefined at the bottom of server.py to swap in report_template, rather than cleanly refactored.
  • Fix quality is shallow: redirect map uses naive '404 -> parent path' targets and title rewrites truncate mid-word ('NMG Tec'); no model validation loop actually runs.

How to improve

  • Drop the invented missing_alt_text detector and tighten missing_h1 (indexable HTML 200 only) and slow_page scoping to match the ground truth - this alone would lift precision from 0.22 toward 0.9+ since recall is already perfect.
  • Wire fixer.py output through server.seo_set_fixes() in run.py so report.json carries the title rewrites and redirect map (close the output contract).
  • Restore a real orchestrator skill (SKILL.md under skills/seo-audit) and give the four sub-agents distinct, build-specific instructions instead of the starter stubs.
  • Capture genuine process logs via the audit hook during a real run instead of hand-writing audit.jsonl, and export an actual session transcript to agent-log.md.
  • Improve fix quality: use path/section similarity for redirect targets and word-boundary truncation for titles.
33 Aryan SinghFabricated process logs F1 47% 48/100
Integrity adjustment: raw 54 → final 48 — −6 penalty (Fabricated process logs).

Score breakdown (weighted)

Detection accuracy (F1 vs ground truth)14 / 30
Pipeline runs end-to-end on the crawl10 / 10
Output contract + fix artifacts8 / 8
Orchestration & architecture6 / 15
Code quality (code review)7 / 12
Process integrity (logs, commits, debugging)4 / 12
Context & memory files0 / 6
Deliverable & docs5 / 7
Raw total54 / 100
Verified F1 (objective accuracy): 46.8%  ·  committed report F1: 46.8%  ·  ran end-to-end: yes
Evidence: faked_logs: no .claude/audit.jsonl exists; agent-log.md is a 139-byte stub with an EMPTY code block (transcript_bytes=129); two commits titled 'Add agent session transcript' added only this empty placeholder. No genuine process/debugging record.
Detection logic: seo/detector.py (+58 lines over starter) — builder completed the starter TODO, implementing all 10 missing detectors (title_too_short, missing/duplicate/too_long meta_description, missing_h1, duplicate_h1, redirect_chain, non_indexable_but_linked, thin_content, slow_page) on top of the 8 starter detectors. Plain-Python deterministic, std-lib only. ~12 of the 18 rulebook rules effectively covered. A new seo/fixer.py (~49 lines) adds redirect mapping (difflib) and template content fixes.

Why this rank

Aryan completed the deterministic core of the challenge honestly: he finished the starter's detector TODO by adding all ten missing rules and a new fixer module, and the result is fully reproducible — the regenerated report scores exactly the committed verified_f1 of 0.468, with no hard-coding or fabrication. Accuracy is held back not by missing detection (recall is a perfect 1.0) but by loose thresholds that massively over-predict thin_content and slow_page, dropping precision to 0.31. The pipeline is robust, runs cleanly without Ollama, and produces schema-valid report.json/report.html plus real (if mediocre) fix artifacts. Where the submission falls short is everything around the code: the memory files, orchestrator skill, all four sub-agents, and the dashboard are untouched starter scaffolding, and the process trail is hollow — no audit log and an empty transcript stub committed under a misleading message, which earns a faked_logs flag. The single biggest thing holding him back is breadth beyond the detector: he tuned almost no precision and engineered none of the agent/memory/orchestration layer that the rubric weights heavily. Net: a genuine but narrow submission that does the math right but stops at the boilerplate everywhere else.

What they did well

  • Fully reproducible: freshly re-run report.json scores verified_f1=0.4684, byte-for-byte matching the committed report (precision 0.306 / recall 1.0) — no fabrication.
  • Pipeline runs clean end-to-end with Ollama absent (456 URLs, 12 issue types, valid report.json + report.html), degrading gracefully with model_calls=0.
  • Completed the rulebook TODO: 9 of 12 detected types are pixel-perfect against ground truth (broken_link, duplicate_title/h1/meta, title_too_long/short, missing_h1, redirect, meta_description_too_long all exact).
  • Added genuine fix artifacts beyond the starter: new fixer.py wired through MCP seo_fix() produces 84 title rewrites clamped to 60 chars, 42 meta rewrites, and a 6-entry redirect map; report.json is schema-valid.
  • No hard-coding or overfitting — grep found no sample URLs, hard-coded counts, or ground-truth reads; detector generalizes to any export.

What held them back

  • Low precision (0.306) drags accuracy: thin_content predicts 340 vs 10 truth and slow_page 152 vs 11 — thresholds (<200 words on ALL rows incl. non-HTML/non-indexable; response_time>1.0) are far too loose, and non_indexable_but_linked over-fires (10 vs 2).
  • Memory files are untouched starter templates: CLAUDE.md, PROMPTS.md, DECISIONS.md are byte-identical to the bundle (only CRLF differences); 'My prompts' and 'My log' sections left empty.
  • Orchestration barely exceeds the scaffold: SKILL.md and all four agents (ingest/auditor/fixer/reporter) are unchanged starter stubs; dashboard app.js/index.html unchanged — only the MCP fix-wiring is original.
  • Process integrity is thin: no audit.jsonl, an empty 139-byte transcript, and late commits are doc-only; no visible debugging or iteration on the over-prediction problem.
  • fixer.py uses lexicographic string comparison ('400' <= status < '500') instead of numeric, and emits placeholder 'old':'Missing/Bad' values plus a title truncated mid-word ('| SEO Opt'), so fix quality is low.

How to improve

  • Tighten thin_content (restrict to text/html + indexable + 200) and slow_page (use a realistic threshold or the issue CSVs) to lift precision from 0.31 toward 0.7+ and roughly double F1.
  • Actually fill CLAUDE.md / DECISIONS.md / PROMPTS.md with this build's real choices and prompts — currently zero credit for untouched templates.
  • Customize the orchestrator SKILL.md and the four agents so they reflect the real pipeline instead of starter stubs, and capture a genuine session transcript / audit.jsonl.
  • Fix fixer.py: compare status codes numerically, derive real 'old' title/meta values from the crawl, and avoid mid-word truncation when clamping to 60 chars.
34 RohanMinimal work (starter) F1 2% 30/100
Integrity adjustment: raw 34 → final 30 — score capped at 30 (Minimal work (starter)).

Score breakdown (weighted)

Detection accuracy (F1 vs ground truth)1 / 30
Pipeline runs end-to-end on the crawl5 / 10
Output contract + fix artifacts6 / 8
Orchestration & architecture2 / 15
Code quality (code review)5 / 12
Process integrity (logs, commits, debugging)7 / 12
Context & memory files6 / 6
Deliverable & docs2 / 7
Raw total34 / 100
Verified F1 (objective accuracy): 1.8%  ·  committed report F1: 1.8%  ·  ran end-to-end: no
Evidence: untouched_starter=true: seo/detector.py, mcp/server.py, all 4 agents/*.md, dashboard/app.js+index.html, skills/seo-audit/SKILL.md and commands/seo-audit.md are byte-identical to the starter (whitespace-normalized diff is empty; detector fingerprint f6971381f01b24b1 == starter). The real (delivered) pipeline is a separate seo-command-center/scripts/ chain that implements only 3 detectors (missing_title, broken_link, missing_h1) and is not wired to the starter skill/MCP/dashboard; the committed README is also the untouched starter README still saying 'EXTEND THIS'.
Detection logic: Real detection lives in seo-command-center/scripts/seo_extractor.py (extract_seo_metrics), invoked by scripts/main_pipeline.py which the root run.py drives -- NOT in seo/detector.py (that file is the untouched 4-detector starter, never imported by the delivered path). Only 3 of 18 rulebook rules implemented: missing_title (200+empty Title 1), broken_link (4xx), missing_h1 (200+empty H1-1). None of these filter to text/html pages, so missing_title floods 331 image/CSS/JS asset URLs; missing_title is not even a ground-truth/rulebook issue type.

Why this rank

Rohan built a parallel, deterministic Python pipeline (scripts/seo_extractor.py + json_formatter.py + main_pipeline.py, driven by a hijacked root run.py) that produces a schema-valid report and several client deliverables (HTML/PDF/PPTX). The work is honest -- the committed report reproduces exactly when re-run (F1=0.018), so it is not fabricated -- but the detection delta is tiny: only 3 rules are implemented (missing_title, broken_link, missing_h1), none filter to HTML pages, and missing_title isn't even a real issue type, so it predicts 670 pairs (mostly image/CSS/JS assets) for just 8 true positives. The entire orchestration layer the brief emphasizes -- the SKILL.md, four sub-agents, MCP server, and dashboard -- is the untouched starter (byte-identical, whitespace aside) and is completely bypassed: the dashboard never sees the delivered run. Robustness is weak too: it crashes on a default Windows console and hangs on hundreds of blocking Ollama calls when the model is absent. The genuinely good parts are process and memory -- 13 well-spaced commits and detailed, tailored CLAUDE.md/DECISIONS.md/PROMPTS.md -- though the exported transcript captures only one turn. The single biggest thing holding this submission back is accuracy: it effectively shipped a 3-detector near-starter on top of an untouched scaffold, and detection accuracy is the largest share of the score.

What they did well

  • Reproducible, honest output: re-running the deterministic detection produces exactly the committed report (670 issues, site nmgtechnologies.com, 456 URLs) and scores the same F1=0.018 -- the report.json is genuine, not hand-fabricated.
  • report.json is schema-valid against report.schema.json (all required keys, correct nesting, lowercase enums, integer counts).
  • Genuine, well-tailored memory files: CLAUDE.md, DECISIONS.md (5 real phases: pandas-only parsing, schema enforcement, weasyprint->fpdf2 pivot, hallucination fixes, run.py hijack) and PROMPTS.md with real corrective prompts.
  • Real git process: 13 commits spread over ~4 hours (12:41-16:42) with meaningful incremental messages (pandas extractor -> json formatter -> HTML/PDF -> wire run.py), single author, not a single dump.
  • Sensible engineering choices in the parts that were built: deterministic pandas extraction kept out of the LLM context, pure-Python fpdf2/python-pptx to avoid native-lib failures, multiple client deliverables (HTML/PDF/PPTX) generated.

What held them back

  • Detection accuracy is near-zero (F1=0.018): only 3 detectors, none of which match most of the 12 ground-truth issue types; true positives = 8 (6 broken_link + 2 missing_h1).
  • No text/html filtering -> the missing_title detector flags 331 image/CSS/JS asset URLs as missing titles, destroying precision (0.012); missing_title is not a rulebook/ground-truth type at all.
  • Entire orchestration layer (SKILL.md, 4 sub-agents, MCP server, dashboard) is the untouched starter and is bypassed: root run.py routes straight to a linear scripts/main_pipeline.py; the dashboard reads server.RUN/state which the delivered pipeline never populates (it writes mcp_state.json, which the dashboard ignores) -- so the dashboard does not reflect the run.
  • No graceful degradation without Ollama: the fix stage makes 331 blocking POSTs to localhost:11434 and hangs for many minutes; the report is only written after that stage, so a no-Ollama run does not complete cleanly.
  • Crashes on a default Windows (cp1252) console due to an unguarded emoji print in run.py (UnicodeEncodeError) before any work begins.
  • Process logs are thin: audit.jsonl (15 lines) and agent-log.md (~4 KB) capture only a single turn, so the DECISIONS/PROMPTS narrative of 5 phases is not corroborated by the transcript; fix titles are all 'Needs Manual Review' placeholders.

How to improve

  • Implement the remaining rulebook detectors (title/meta length + duplicates, duplicate_h1, thin_content, slow_page, redirect, non_indexable_but_linked) and filter to indexable text/html pages before title/meta/H1 checks -- this alone would move F1 from 0.018 toward 0.7+.
  • Drop the non-rulebook missing_title type (or map it correctly) so predictions stop flooding asset URLs.
  • Make the AI-fix stage degrade gracefully: detect Ollama availability once, short-circuit to placeholder fixes, and write report.json before/independently of the fix stage so a no-model run still produces output fast.
  • Either wire the real pipeline through the provided MCP server/skill/agents and feed the dashboard live state, or delete the dead starter scaffold so the architecture reflects what actually runs.
  • Guard console output for cp1252 (set UTF-8 stdout or avoid emoji) and export the full multi-turn transcript so audit.jsonl/agent-log.md match the git history and DECISIONS narrative.
Full transparency · how every score was produced

The judging algorithm & weights

Every submission was judged the same way, by evidence, not opinion. We deduplicated to each builder's latest submission, cloned all repos to one machine, and assigned one dedicated AI judge agent per repo (Opus-class, given the original starter to diff against, the real Screaming Frog crawl, the ground-truth answer key, and a deterministic scorer). Each judge actually ran the code, measured accuracy objectively, hunted for cheating, and scored a fixed 100-point rubric. Everyone began from the same starter bundle, so judges scored the delta — what each builder genuinely added — not the boilerplate they were given.

Weighted scoring (100 points)

CriterionWeightWhat it measures
Detection accuracy30F1 of detected SEO issues vs an objective ground-truth answer key built from the full 18-rule rulebook on the real crawl, scored at the (issue-type, URL) level. Score = 30 × F1.
Pipeline runs end-to-end10Cloned fresh and run on the crawl; produces a valid report without crashing, degrading gracefully when the local model is absent.
Output contract + fixes8report.json matches the published schema; champion fix artifacts (title/meta rewrites within limits, redirect map) are valid.
Orchestration & architecture15A real orchestrator skill, ≥2 genuinely distinct sub-agents, MCP server wired, dashboard that reflects the run — credited by how far beyond the starter scaffold it was taken.
Code quality (code review)12Readability, structure, correctness, error handling, and a sensible split between deterministic code and model use — assessed by reading the actual code.
Process integrity12Genuine .claude/audit.jsonl + transcript, ≥10 incremental commits spread over time, and visible debugging/iteration.
Context & memory files6CLAUDE.md, DECISIONS.md, PROMPTS.md genuinely tailored to the build (not the untouched templates).
Deliverable & docs7Client-readiness of report.html, README quality, and dashboard quality.

How accuracy (F1) is computed

We ran a complete reference implementation of all 18 rulebook rules on the real nmgtechnologies.com crawl (456 URLs) to produce the ground-truth set of (issue-type, URL) pairs. Each builder's report is normalised (type aliases + URL formatting) and compared: precision = correct pairs ÷ pairs they reported, recall = correct pairs ÷ all true pairs, F1 = the harmonic mean. The judge re-runs the builder's own code to confirm the committed report is genuinely reproducible — a high score from a report that cannot be reproduced is treated as fabricated.

Integrity gates (applied transparently)

Forensics ran on every repo: reproducibility of outputs, diff against the starter, hard-coding/overfitting to the sample, genuineness of process logs, and cross-repo plagiarism (we confirmed no two builders submitted identical reports). Where an issue was found it is shown openly on the builder's card with the evidence, and the score is adjusted by these fixed rules:

FindingAdjustmentMeaning
Plagiarismcap 25Non-starter code copied from another builder.
Fabricated outputcap 40A committed report that cannot be reproduced by the builder's own code.
Hard-coded to samplecap 45Logic overfit to this crawl so it would fail on unseen data; accuracy zeroed.
Minimal work (starter)cap 30Essentially the untouched starter with little real delta.
Fabricated process logs−6A hand-authored audit.jsonl/transcript the real hook could not have produced. The build itself can still be genuine; the dishonest artifact is penalised and disclosed.
Other issue−3e.g. a last-minute commit that regressed the detector, or unverifiable claims in docs.

Tie-breaks, in order: higher verified F1 → higher process integrity → fewer model calls. The objective half of the score (accuracy + runs + contract = 48 points) is machine-measured; the rest is evidence-based judgement with the reasoning shown on each card. If you believe any score is wrong, every number here is backed by the cloned repo, the run output, and the stated evidence — email labs@nmgdigital.com and we will walk you through it.

Forge Sprint 01 · nmg.labs · transparent automated judging · final standings confirmed on stage.