Skip to content

feat: README role and highlights, AI workflow page, About, potd entry - #12559

Merged
MarkusNeusinger merged 14 commits into
mainfrom
docs/portfolio-framing
Nov 5, 2026
Merged

MarkusNeusinger merged 14 commits into
mainfrom
docs/portfolio-framing

Conversation

@MarkusNeusinger

Copy link
Copy Markdown
Owner

Summary

Package E of the portfolio framing, plus B-03. It shows what the human behind anyplot does, in the owner's own wording, and backs every claim with a link to code or docs.

  • README. A "How I build anyplot" section on the first screen (the owner's approved text, verbatim). "Engineering highlights" lists seven decisions, each with its reason and the code that carries it out. "Architecture" has two Mermaid diagrams: the services, and the pipeline.

  • Docs page docs/concepts/ai-workflow.md, "How anyplot is built with AI agents". It covers:

    It's registered in all three parts of docs/index.md, and the README links it.

  • Site. The About page gets one short section each on the review, "Use with my data" and MCP, linked to /stats, /plots and /mcp. The bot HTML of /about (_ABOUT_BOT_BODY) carries the same sections. The landing page's plot of the day gets .use_my_data() beside github.open(). It shows only when useAgentEligibility names a lane for its pair, with one request per view. The chat records the new source agent_open{source: plot_of_the_day}: one line in OPEN_SOURCES, documented in plausible.md and in the design doc's entry points.

Plan

The draft the owner reviewed lives outside the repository. Where the build departs from it:

  • Two diagrams instead of one. On GitHub the single diagram came out 1,674 px tall in a frame capped at 1,383 px, which cut off anyplot-renderer. GitHub's Mermaid ignores a subgraph's direction once its nodes link outside it, and it wraps long labels. The services and the pipeline share only the storage, so each gets its own diagram. Both now fit their frames at scale 1 with 16 px text, measured on the pushed branch.
  • The edge api -- … --> chat targets the subgraph on purpose. An edge to the node agents would make GitHub ignore the subgraph's left-to-right direction, and that inherited direction is what stacked the boxes into the tall, clipped layout. A pre-PR check noted that some older Mermaid renderers reject edges to a subgraph. GitHub renders it, and the README is read there.
  • "the stats page shows the score distribution per library". The draft said "every score is on the stats page", but the page shows the average, the distribution per library and the top 8, not every score.
  • 869 merged pull requests, re-counted on 2026-11-04 (gh pr list --state merged --author MarkusNeusinger): 866 into main and 3 into other branches. The approved text said 864.
  • plot_of_the_day is a new source rather than a reuse of landing, which is documented as the 2026-11-02 hero line.
  • On a phone, the plot of the day's two actions take their own line below the filename, right-aligned, so the filename keeps its width. From 600 px up, and whenever the entry is absent, the header stays on one line as before.

Texts to read

The README's "How I build anyplot" section is the owner's approved text, verbatim, with 869 in place of 864. Everything else this PR adds that a visitor or reader sees follows.

About page (AboutPage.tsx, house style)

  • ❯ review: every implementation is scored before it ships. automated checks come first: the code runs, the image isn't blank, the canvas has its size. then an ai reviewer scores the render on a 100-point rubric of 24 criteria — visual quality, design, spec compliance, data quality, code quality, and library mastery — blind to any earlier score. a first review needs 90; below that, ai repairs the defects the review named and the plot is reviewed again, up to four times. the [stats page] shows the score distribution per library.
  • ❯ use with my data: experimental, open to everyone since 2 november 2026. [pick any plot], choose .use_my_data(), and paste your data. an agent adapts that plot's code to your columns, renders it in a sandbox with no network access, reviews the render against the catalogue's rubric, repairs it once if needed, and hands back the image and the code. your chat and data live only in server memory and are deleted after an hour idle, unless you send feedback.
  • ❯ mcp: the same catalogue, served to ai coding assistants over the model context protocol. six tools search specs by tag, return a spec with its implementations, and fetch one library's code, so your assistant starts from code that already rendered and passed review. setup on the [mcp page].
  • ❯ origin, changed: built in Visp, a small town in the Swiss Alps, by a physicist and data analyst looking for one place to find the right plot for the data in front of him — and a way to explore what each library does best. (It said "by a data scientist". The new wording matches the README's "physicist" and the style guide's "data analyst" in §3.8. The bot HTML has no origin section, so there's nothing to mirror.)

Bot HTML of /about (api/routers/seo.py): the same three new paragraphs in sentence case, under <h2>Review</h2>, <h2>Use with my data</h2> and <h2>MCP server</h2>.

Plot of the day (PlotOfTheDayTerminal.tsx): the visible label .use_my_data() and the accessible name Use with my data (the existing USE_MY_DATA_LABEL).

README "Engineering highlights" and "Architecture"; docs/concepts/ai-workflow.md: as in the draft the owner reviewed, with the deltas listed under Plan. "What I bring" uses only the CV facts the owner confirmed:

  • an apprenticeship as an energy electronics technician;
  • a physics Diplom from Heidelberg University (2012) and its thesis;
  • data analyst, then senior data analyst, in steering system development since 2013;
  • defichain-data (2022 to 2024), built and run largely without AI.

It names no employer and claims no security experience.

Test plan

  • App: yarn lint, fm:check, type-check, test (1,654 passed), build.
  • Backend: ruff check ., ruff format --check ., mypy api core, and pytest tests/unit tests/integration -n auto (26,834 passed, 176 skipped).
  • uv run python -m tools.changelog check --base origin/main
  • Browser, headless playwright-core on a local dev server against the public API, with the chat build flag on. /agent/lane and /agent/eligibility were mocked, and every /agent/sessions request was aborted, so no session opened.
    • At 1440 and 390 px, light and dark: the plot of the day's link is 12 px MonoLisa, the same colour as github.open(), with no page overflow. The click opens /agent?spec=…&library=…&language=…&source=plot_of_the_day. The About sections render with their three router links.
    • Console: only the known font-CORS noise from a localhost origin. No 4xx or 5xx.
  • The plot of the day's header, measured with the entry shown:
    • 390 px: the actions on their own line, with 274 of the filename's 307 px visible (before, it shrank to plot…);
    • 360 px: 244 px visible;
    • 600 px and 1440 px: one line;
    • without the entry at 390 px: one line, as before.
  • GitHub rendering on the pushed branch: the headings are in order, the #engineering-highlights anchor resolves, and both Mermaid frames fit (899 and 712 px, scale 1, 16 px text).
  • Unit tests:
    • the plot of the day shows no entry without a lane; on the public lane it links through the router, on the admin lane with a full page load;
    • the About page's three links go through the router;
    • the bot page carries the three sections and their links.
  • Pre-PR Gemini 3.8 Flash check on 10b83612: nothing blocking. Its one low finding, the subgraph edge target, is kept on purpose (see Plan).

https://claude.ai/code/session_01H7HSkGyea1k2v293XiAMo8

MarkusNeusinger and others added 7 commits November 4, 2026 23:48
The README's first screen now says who builds anyplot and how: models
write the code and the owner leads them, in his own approved wording.
Seven engineering decisions follow, each with its reason and a link to
the code that carries it out, then a Mermaid diagram of the services and
the pipeline.

docs/concepts/ai-workflow.md tells the whole story the README links to:
who does what, what the owner brings, the path of a change to
production, how a repeated mistake becomes a rule (three dated cases
from .claude/guardrails.md), the #12557 timeline, and the limits.
Registered in docs/index.md (quick links, tree, concepts).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H7HSkGyea1k2v293XiAMo8
One short paragraph each, in the site's voice, linked to /stats,
/plots and /mcp through the router. The bot HTML of /about carries the
same three sections, so crawlers read what visitors read. The palette
link and the three new ones share one in-prose link helper.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H7HSkGyea1k2v293XiAMo8
The plot of the day's header shows .use_my_data() beside github.open()
when the eligibility check names a lane for its spec and library, one
request per view as on the spec pages. The public lane opens /agent
through the router, the admin lane /debug/agent with a full page load.
The chat records agent_open{source: plot_of_the_day}: one line in
OPEN_SOURCES, documented in plausible.md and the design doc's entry
points.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H7HSkGyea1k2v293XiAMo8
GitHub laid the single diagram out 1,674 px tall in a frame capped at
1,383 px, so its bottom row (anyplot-renderer) was cut off: GitHub's
Mermaid ignores a subgraph's direction once its nodes link outside it,
and it wraps long labels into narrow columns. The services and the
pipeline share only the storage, so each now gets a small diagram of
its own with short label lines, and the edges into "Use with my data"
target the subgraph, so its left-to-right direction holds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H7HSkGyea1k2v293XiAMo8
…tHub

Left to right it was 1,299 px wide, which GitHub shrank to 66 % (about
11 px text) with its zoom controls over the last node.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H7HSkGyea1k2v293XiAMo8
The background in three sentences: the apprenticeship, the physics
Diplom from Heidelberg University with its thesis, the work in data and
AI since 2013, and defichain-data (2022 to 2024), built and run largely
without AI, as the proof of the stack. Then four kinds of evidence; the
structure bullet goes, since the bridge sentence and the README carry
that point.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H7HSkGyea1k2v293XiAMo8
…hysicist and data analyst"

At 390 px the new .use_my_data() squeezed the plot of the day's
filename to "plot…". On a phone the two actions now take their own
line, right-aligned below the filename (274 of its 307 px visible at
390 px, 244 at 360); from 600 px up, and whenever the entry is absent,
the header stays on one line as before.

The About page's origin line says "by a physicist and data analyst"
instead of "by a data scientist", matching the README and the style
guide's story points. useAgentLaneOpen's docstring names the new entry
point.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H7HSkGyea1k2v293XiAMo8
Copilot AI lite review requested due to automatic review settings November 4, 2026 23:12
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H7HSkGyea1k2v293XiAMo8

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Approval is blocked by two active nit findings: missing page-level analytics coverage for the new allowlisted source and a missing required status line at the start of the new concept page.

2 open issues
What changed in this PR

This pull request adds portfolio framing for anyplot, documents its human-led AI development workflow, expands the About and SEO pages, and introduces an eligibility-aware .use_my_data() entry point for the plot of the day.

Changes:

  • Adds README engineering highlights, architecture diagrams, and AI workflow documentation.
  • Expands About-page, bot-rendered SEO, analytics, and agent-network content.
  • Adds plot-of-the-day agent routing, responsive actions, source attribution, and tests.
File Description
tests/​unit/​api/​test_routers.py Verifies the SEO About page contains the new sections and links.
README.md Adds owner perspective, engineering highlights, architecture diagrams, and documentation links.
docs/​reference/​plausible.md Documents the new analytics source and About-page destinations.
docs/​index.md Registers the AI workflow documentation throughout the index.
docs/​concepts/​ai-workflow.md Documents roles, development flow, guardrails, timeline, and limitations.
docs/​concepts/​agent-network.md Documents the plot-of-the-day agent entry point.
changelog.d/​portfolio-framing.md Records the user-facing portfolio and landing-page changes.
app/​src/​sections/​landing/​PlotOfTheDayTerminal.tsx Adds the eligibility-aware .use_my_data() action and responsive layout.
app/​src/​sections/​landing/​PlotOfTheDayTerminal.test.tsx Tests eligibility behavior and public/admin routing.
app/​src/​pages/​AgentChatPage.tsx Accepts plot_of_the_day as an analytics source.
app/​src/​pages/​AboutPage.tsx Adds review, agent-chat, MCP, and updated origin content.
app/​src/​pages/​AboutPage.test.tsx Tests the new About-page links.
app/​src/​hooks/​useAgentLaneOpen.ts Updates entry-point documentation for the plot-of-the-day action.
api/​routers/​seo.py Mirrors the About-page additions in bot-optimized HTML.

Review effort: Lite

Comment thread app/src/pages/AgentChatPage.tsx Resolved
Comment thread docs/concepts/ai-workflow.md Resolved
@codecov

codecov Bot commented Nov 4, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

MarkusNeusinger and others added 6 commits November 5, 2026 08:22
…ed; status line on the AI workflow page

Review of #12559: the page test now opens the chat with
source=plot_of_the_day and asserts that agent_open carries that source,
not "direct", and that the URL then drops it. Breaking the
OPEN_SOURCES line turns it red ("direct" instead). The AI workflow
page opens with a dated status line, because its counts were taken on
2026-11-04.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H7HSkGyea1k2v293XiAMo8
… README's claims

scripts/readme_showcase.py redraws the owner's showcase layout:
- the wordmark, the eyebrow, and the title with "4 languages." in the
  script italic;
- a 3 x 5 grid of light previews (the _800 derivatives), one spec per
  library;
- a footer with the library count per language, the implementations
  and the lines of code.

Every count comes from /stats and the library registry. It writes
docs/assets/readme-showcase.png (1600 x 2000, 222,781 bytes,
256-colour PNG once the full-colour file passes 600 KB). It stops when
MonoLisa or its italic cannot load, when text shaping is missing, or
when a pick has no preview; it never falls back to another font. The
image replaces the ridgeline OG card in the README and links to
/plots.

tests/unit/test_readme_claims.py reads each value the highlights, the
architecture and the About page (and its bot copy) state from its
source:
- core.defects.CRITERIA for the rubric's criteria and points;
- impl-review.yml's threshold formula for the bar and its step;
- AgentSettings and MAX_REVIEWS through ast for the pipeline bounds,
  the idle time and the default model;
- the registry for the libraries;
- the @mcp_server.tool() count for the MCP tools.
Each value must stand right beside its keyword. The test also checks
every relative link against git ls-files and every in-page anchor
against the headings. A merged-pull-request count must be a floor:
the README and the AI workflow page now say "more than 850", and the
workflow page's decision count is a floor ("more than 80 times").

/write-docs gets the sync duty, the release procedure a step that
redraws the image and raises the floor, and /audit-licenses the new
asset in its baseline.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H7HSkGyea1k2v293XiAMo8
…ecorded count

Pre-PR check of the delta: the floor test matched any "N pull requests",
so an unrelated count failed it, and it never checked the number, so
"more than 50,000" passed. It now matches only "(more than|over) N pull
requests from my account have merged", requires that claim in both texts,
and bounds N by MERGED_PRS_SNAPSHOT (869, 2026-11-04): a multiple of 50,
below the count and at most 50 below it. The release procedure's step 4
updates the snapshot and the floor in one commit. review_bar() allows
spaces inside $(( ... )).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H7HSkGyea1k2v293XiAMo8
#12566 moved the model routing out of CLAUDE.md into
agentic/docs/agent-operations.md, so the page's opening now points
there next to CLAUDE.md, the guardrails and the skills.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H7HSkGyea1k2v293XiAMo8
@MarkusNeusinger
MarkusNeusinger merged commit 15f65a7 into main Nov 5, 2026
16 checks passed
@MarkusNeusinger
MarkusNeusinger deleted the docs/portfolio-framing branch November 5, 2026 12:56
MarkusNeusinger added a commit that referenced this pull request Nov 5, 2026
No conflicts: AgentChatPage.tsx and its test keep the one field beside
portfolio's plot_of_the_day source and its test; agent-network.md and
plausible.md take both sides' text.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H7HSkGyea1k2v293XiAMo8
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