Skip to content

docs: add blog with "How Piwi was built" post - #417

Merged
PhenX merged 22 commits into
mainfrom
claude/reddit-post-project-uawswl
Aug 19, 2026
Merged

docs: add blog with "How Piwi was built" post#417
PhenX merged 22 commits into
mainfrom
claude/reddit-post-project-uawswl

Conversation

@PhenX

@PhenX PhenX commented Aug 19, 2026

Copy link
Copy Markdown
Collaborator

What & why

Adds a blog section to the documentation site with the first post: "How Piwi was built", a detailed technical narrative covering the eight-month development of Piwi, its core architecture, and the two guiding principles behind all design decisions.

The post explains:

  • Why Piwi was built and the evolution from a simple dashboard to a comprehensive diagnosis tool
  • The two foundational rules: "the tool proposes, the developer decides" and "deterministic first, AI second"
  • The three-stage failure explanation loop: gathering evidence, clustering failures, and diagnosis
  • Key features like locator healing, flaky test detection, and CI integration
  • Architectural choices like the in-browser demo and the capture-based approach to locator stability

Also includes:

  • New blog infrastructure: posts.data.mts for build-time post indexing, blog/index.md for the listing page
  • Three new SVG diagrams illustrating the failure loop, ecosystem architecture, and in-browser demo design
  • New screenshots (gather-evidence.png, run-timeline.png) and updated ai-diagnosis.png for the post
  • Blog styling in custom.css for post listings
  • Blog link added to the documentation navbar
  • Minor fix to TestCaseEvidenceCard.vue to safely handle undefined attachment/trace arrays

How was it tested?

  • VitePress build succeeds with new blog content
  • Blog index page renders correctly with post metadata
  • Screenshots captured using existing screenshot automation
  • Existing documentation tests pass

Checklist

  • PR title follows Conventional Commits (docs: ...)
  • Docs updated (apps/docs/ — new blog post, diagrams, screenshots, styling)
  • No tests needed (documentation content addition)

https://claude.ai/code/session_011QZAWkvGnmB38Sjnj5P68j

claude added 22 commits August 18, 2026 13:58
Scaffold a VitePress blog under apps/docs/blog: an auto-updating index
driven by a build-time content loader (posts.data.mts), a Blog entry in
the top nav, and list styling scoped under .blog-list. New posts appear
on the index automatically; no hand-maintained list.

Add the first post — a four-part tour of the browser demo, the desktop
app, auto-heal PRs, and AI steps — written to the docs voice and drawn
from the feature sources, with a marked placeholder for the project's
origin story.

Blog pages set sidebar:false so they render with the doc layout without
inheriting the docs journey sidebar. The loader is .mts so it bundles as
ESM and can import from the ESM-only vitepress package.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011QZAWkvGnmB38Sjnj5P68j
Add a second blog post — a retrospective of the project's first eight
months reconstructed from git history, adapted to a first-person blog
voice and brought up to v0.25 (auto-heal PRs, share links) with a short
"since then" coda.

Replace the placeholder origin-story section in the four-part tour with a
two-paragraph intro that links to the full genesis post.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011QZAWkvGnmB38Sjnj5P68j
Cut the day-by-day chronicle, the numbers and release-timeline tables,
and the commit hashes. Keep six sections on the parts that were actually
hard: the in-browser app, dual databases, failure clustering, locator
healing and auto-heal PRs, and AI steps as a compiler. Mark six slots for
personal opinion/story with HTML comments, to be filled from the author.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011QZAWkvGnmB38Sjnj5P68j
The April–June commits are under my name but were not hand-written: that
was a surgical phase assisted by DeepSeek V4 Flash. Rewrite the "three
assistants" section so the record is Copilot → DeepSeek → Claude, and note
in the open story slot that the under-my-name commit count is not solo work.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011QZAWkvGnmB38Sjnj5P68j
Merge the four-part tour into the genesis so there is a single "how it
was built" post covering every hard part, and remove the tour; its one
unique topic, the desktop app, is folded in as a brief entry. Rewrite the
prose without em dashes so it reads as hand-written.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011QZAWkvGnmB38Sjnj5P68j
Fill two of the author story slots in the author's voice: a "Why I built
it" section (the CyborgTests starting point, wanting no third-party
dependency, building tools for team and community) and the demo-decision
paragraphs (the Blazor/WASM playgrounds that inspired the in-browser app,
and why an open-a-link demo matters). No em dashes.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011QZAWkvGnmB38Sjnj5P68j
Fill two more story slots: the dual-database decision (SQLite first,
Postgres always planned, Drizzle, the migration reset once the LLM
instructions held) and the locator-healing philosophy (developer decides,
never magical, never a raw CSS selector), the latter corrected against the
reporter and recipe docs. Promote the desktop app to its own section and
add a browser-extension section, both grounded in their docs. Remove the
desktop bullet from the brief list. Still no em dashes.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011QZAWkvGnmB38Sjnj5P68j
Two more feature sections grounded in the docs: the per-worker run
timeline with its setup/test/wasted-waits/teardown span filter, and open
in IDE with the confirmable-local-server versus fire-and-forget URL
scheme distinction behind Auto. No em dashes.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011QZAWkvGnmB38Sjnj5P68j
Promote evidence gathering to a full section that tells its "storing to
reconstructing" evolution, deepen failure clustering (deterministic
fingerprint floor plus the semantic and human-in-the-loop layer), and add
the missing AI-assisted diagnosis section: SCM-grounded diff window,
relevance-ranked changed files, full-source context, and server-side patch
validation, with the developer always deciding. Drop the evidence bullet
from the brief list. No em dashes.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011QZAWkvGnmB38Sjnj5P68j
Give the post a clearer arc the reader can keep: why, the two rules the
project follows, the failure-explaining pipeline (evidence, clusters,
diagnosis, fix) as nested steps, then flaky-test pricing, the CI loop
(gate, PR feedback, fix verification, agent fix plans), the ideas behind
the demo, AI steps and the databases, and the surrounding tools. Bold the
key takeaways throughout.

Add the parts the docs cover that the post missed: flaky scoring and
wasted-CI-minutes impact, quarantine with a way out, the CI gate, PR
feedback with CODEOWNERS ownership, fix verification's three verdicts,
MCP fix plans, and brief-list entries for sharding, run imports, offline
export and share links, notifications and analytics.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011QZAWkvGnmB38Sjnj5P68j
Widen the section to "Flaky tests and wasted time": waitForTimeout sleeps
classified as wasted time with configurable patterns and view-time
re-classification, and the timeout advisor surfacing oversized timeouts
and stale test.slow() marks with the reclaimable minutes.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011QZAWkvGnmB38Sjnj5P68j
Add three new diagrams in the house style (failure-loop, demo-in-browser,
piwi-ecosystem) and wire eight figures into the post: the live-run poster
up top, the loop under the heart intro, the fingerprint diagram in
clustering, the diagnosis screenshot, the healing capture diagram, the
flaky tab screenshot, the in-browser demo architecture, and the ecosystem
map opening the toolbox.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011QZAWkvGnmB38Sjnj5P68j
The traces prop can arrive as a non-array value, so `props.traces.length`
was undefined and the summed evidence count rendered as NaN in the section
header. Read both attachments and traces through Array.isArray guards so the
count stays numeric.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011QZAWkvGnmB38Sjnj5P68j
…ptures

Add three docs screenshot scenes (gather-evidence, run-timeline,
ai-diagnosis), all captured in dark theme, and a run-timeline data-shot
anchor on WorkersTimeline. ai-diagnosis is now produced by a scene (cluster
10 with its stored, verified diagnosis) instead of the marketing pipeline, so
it leaves the external allowlist. Wire the images in: the post gains evidence
and run-timeline figures and refreshes the diagnosis one; evidence.md and the
faster-suite recipe get the evidence and timeline shots.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011QZAWkvGnmB38Sjnj5P68j
Fill the three-assistants section with the author story: Copilot in Rider
as the unblocker on a personal .NET project, discovering the cloud agent,
and the honest emotional beat, ahead of the factual Copilot/DeepSeek/Claude
arc for Piwi itself.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011QZAWkvGnmB38Sjnj5P68j
Expand the three-eras section with the full journey: Copilot in Rider as
the unblocker, the cloud agent and the army-of-developers feeling with its
overconfidence caveat, the opencode and DeepSeek spring at near-zero cost,
then Claude Code with plan and execute roles, and the weekly step-back
lesson. Close the post with the slower stabilization rhythm and the two
questions every new idea must answer. All author story slots are now
filled.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011QZAWkvGnmB38Sjnj5P68j
Retitle the assistants section to match its content, anchor the toolbox
intro to the failure loop by name, and widen the desktop availability note
beyond Linux.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011QZAWkvGnmB38Sjnj5P68j
…tions

Lead the desktop section with the capabilities only a desktop app can
provide (local re-runs with the bundled Node, one-click MCP client setup,
disk-path imports, folder-linked projects) and compress reporter discovery
to one sentence. Give the extension its test-functions story a full
paragraph: the reviewed catalog, live ranking while recording, exports that
call your own functions, and the against-this-page checklist.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011QZAWkvGnmB38Sjnj5P68j
Cut the post from 82 bold spans to a handful per section so emphasis reads
again, keeping only the strongest phrase in each and the structural bullet
labels. Remove the dollar figures and credit references from the assistants
story, keeping the tool and model journey.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011QZAWkvGnmB38Sjnj5P68j
…oject-uawswl

# Conflicts:
#	apps/docs/.vitepress/config.mts
Give the two strongest sections the missing depth. AI steps now shows the
naive locator-cache that churns git, the committed artifact JSON, the
canonical byte-stable file, and the pre-armed waitForResponse race. Healing
shows what the passing-run probe records, the probe-per-resolution blowup
and the dedupe-by-call-site fix, and why capture only fires on a single
resolved element.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011QZAWkvGnmB38Sjnj5P68j
Explain where the name came from (Playwright Dashboard renamed over a
Microsoft trademark worry, PW heard as pi-wi) at the end of "Why I built
it", and replace the flat footer with a warm, actionable close that ties
back to the opening pain and folds in the MIT and demo offering.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011QZAWkvGnmB38Sjnj5P68j
@github-actions

Copy link
Copy Markdown
Contributor

Coverage Report for Reporter (./packages/reporter)

Status Category Percentage Covered / Total
🔵 Lines 74.72% 2244 / 3003
🔵 Statements 73.01% 2552 / 3495
🔵 Functions 77.88% 391 / 502
🔵 Branches 67.26% 1802 / 2679
File CoverageNo changed files found.
Generated in workflow #1451 for commit 6264798 by the Vitest Coverage Report Action

@github-actions

Copy link
Copy Markdown
Contributor

Coverage Report for Application (./apps/application)

Status Category Percentage Covered / Total
🔵 Lines 43.2% 5706 / 13206
🔵 Statements 42.43% 6640 / 15646
🔵 Functions 42.32% 1108 / 2618
🔵 Branches 38.78% 4972 / 12820
File CoverageNo changed files found.
Generated in workflow #1451 for commit 6264798 by the Vitest Coverage Report Action

@PhenX
PhenX merged commit f5e1dd3 into main Aug 19, 2026
25 checks passed
@PhenX
PhenX deleted the claude/reddit-post-project-uawswl branch August 19, 2026 20:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants