Map and maintain the founder-skills <-> PlatAtlas integration surface: the fable-org-audit endpoint map (with its known drift against the live worker), the market-validation market-map sink (nodes.json + flows.json into workflow-atlas, shape-valid but load-untested), adoption guidance for PlatAtlas rail agent seats, and the documented-not-executed mirror plan into workflow-atlas's own plugin convention. Use when a maintainer says "how does founder-skills connect to PlatAtlas", "is the org-audit endpoint map still current", "prove the market-map sink", "load the market map into PlatAtlas", "can the rail agents use these skills", "mirror founder-skills into workflow-atlas", or "what drifted on the PlatAtlas side".
Installation
Installer avec Codex ou Claude Copiez ce prompt, collez-le dans Codex, Claude ou un autre assistant, puis laissez-le vérifier la page du skill et l'installer pour vous.
Map and maintain the founder-skills <-> PlatAtlas integration surface: the fable-org-audit endpoint map (with its known drift against the live worker), the market-validation market-map sink (nodes.json + flows.json into workflow-atlas, shape-valid but load-untested), adoption guidance for PlatAtlas rail agent seats, and the documented-not-executed mirror plan into workflow-atlas's own plugin convention. Use when a maintainer says "how does founder-skills connect to PlatAtlas", "is the org-audit endpoint map still current", "prove the market-map sink", "load the market map into PlatAtlas", "can the rail agents use these skills", "mirror founder-skills into workflow-atlas", or "what drifted on the PlatAtlas side".
fs-platatlas-integration — the founder-skills <-> PlatAtlas surface
Announce at start: "Loading fs-platatlas-integration — the PlatAtlas surface map, adoption path, mirror plan, and sink proving protocol."
Scope fixed by operator decision 2026-07-02: four parts — (1) surface map, (2) rail-seat
adoption, (3) mirror plan (documented, NOT executed), (4) sink proving protocol (gated).
All facts below were verified 2026-07-02 unless labeled otherwise.
Terms (read once)
Term
Meaning
PlatAtlas
GitHub-org intelligence platform, live at platatlas.com (Worker + D1 + R2 + Pages)
workflow-atlas
The PlatAtlas dev monorepo. Environment-specific checkout: /home/craigm26/projects/PlatAtlas/workflow-atlas
rail
Separate monorepo; its main is the production source for the live worker since the 2026-07-02 cutover (the workflow-atlas proxy-worker/ and its CLAUDE.md deploy notes predate this). Environment-specific checkout: /home/craigm26/projects/rail (worker at apps/platatlas-worker/)
atlas
An org's workflow graph: nodes.json (+ edges.json, derived_edges.json, optional flows.json) under a repo's docs/workflows/
market-map sink
market-validation's emitted nodes.json + flows.json dropped into a destination that renders them; PlatAtlas is the worked sink (plugins/market-validation/references/sinks.md, Sink 3)
Loadout (#137)
PlatAtlas per-actor declared-vs-observed inventory of plugins/MCP/skills/tools, with bloat flags (declared, never used)
rail seats
The data-driven agent roster in rail's PlatChat (@claude-fable, @sonnet, plus local gemma/qwen scouts)
When NOT to use this skill
Repo orientation, group map, which skill covers what → fs-orientation.
Actually executing the sink proving run as a campaign step (it is gated there) → fs-flagship-chain-campaign.
Classifying/gating any change this skill motivates (endpoint-map update, mirror execution) → fs-change-control. Nothing here authorizes skipping the spec → plan → commit pipeline.
The recurring drift sweep across ALL volatile facts (model IDs, URLs, this map included) → fs-freshness-watch.
Editing or authoring skills that come out of this work → fs-skill-authoring / fs-skill-style-guide.
Part 1 — Surface map
Two touchpoints exist between the repos. Nothing else in founder-skills references PlatAtlas
as a live system.
1a. fable-org-audit endpoint map (drifted)
plugins/fable-org-audit/references/worked-example-platatlas.md maps 8 audit dimensions to
worker endpoints: /api/orgs/<slug>/usage, /traces, /graph, /intelligence, /progress,
/robots-geo, /billing, /api/key/whoami, each with numeric grading thresholds.
Drift, live-verified 2026-07-02 (unauthenticated probe: 401 = route exists behind auth,
404 = absent — control probe on a garbage path returned 404). The live worker now also serves,
none of which the worked example mentions:
Impact: an org audit run from the worked example under-probes the live surface (Pulse and
ingest-health are directly audit-relevant to Dimension 1/ingest and Dimension 7/intelligence).
Updating the worked example is a normal change — route it through fs-change-control.
The worked example itself is deliberately platform-generic ("map each dimension to YOUR
platform"); the drift matters when the audit target is PlatAtlas itself.
Re-verify (copy-paste):
# Route existence on the live worker (401=exists, 404=absent):for p in pulse grants; doprintf"%s: "$p; curl -s -o /dev/null -w "%{http_code}\n" \
"https://platatlas.com/api/orgs/platatlas/$p"; done
curl -s -o /dev/null -w "ingest-health: %{http_code}\n" https://platatlas.com/api/admin/ingest-health
curl -s -o /dev/null -w "org-collisions: %{http_code}\n" https://platatlas.com/api/admin/org-collisions
curl -s -o /dev/null -w "control-404: %{http_code}\n""https://platatlas.com/api/orgs/platatlas/nonexistent-zzz"
1b. market-map sink (format risk, mostly retired — one real gap remains)
plugins/market-validation/assets/market-map/emit_market_map.py emits nodes.json
({families,nodes}) + flows.json ({flows:[{id,title,view,tags,summary,steps}]}).
references/sinks.md Sink 3 says: drop both into a repo's docs/workflows/, register the
atlas in the console, refresh — labeled "shape-valid, load-untested".
The facts pack (2026-07-02) flagged a format-mismatch risk: workflow-atlas's own atlas uses
edges.json, not flows.json. Inspection the same day narrows that risk:
Claim
Verified 2026-07-02
Where
flows.json is a first-class optional companion format
crates/core/src/atlas/edges.rs (test missing_file_returns_empty_edges) — so the emitter emitting no edges.json is fine
The static web viewer fetches flows.json directly
YES (.catch(() => ({flows:[]})))
web/js/data.js
Emitter output satisfies the schemas' constraints (id patterns, 14-kind node enum, hex colors, view enum, step from/to/label)
YES — sample run passed scripts/check_map_shape.py (this skill dir)
run it yourself, command below
The HOSTED org console renders a file-dropped map end-to-end
NO — never run. This is the surviving gap.
see Part 4
The surviving structural gap: the hosted path is split. Nodes/edges reach the hosted
console via bin/atlas-onboard.mjs (pulls per-repo ATLAS.md/ROBOT.md manifests → merges
into R2 META; it contains zero handling of flows), while flows reach it via a separate
operator-gated seeder bin/seed-org-flows.mjs (writes the D1 flows table, dry-run by
default). A naive "drop files into docs/workflows/" therefore feeds the local server and the
static viewer, but NOT the hosted console. sinks.md's honesty caveat stands.
Re-verify (copy-paste; workflow-atlas checkout is environment-specific):
cd /home/craigm26/projects/PlatAtlas/workflow-atlas
head -1 crates/core/src/flow/loader.rs # "Companion `flows.json` loader. Missing file = empty..."ls schemas/ | grep -E 'nodes|flows|edges'# nodes/flows/edges schemas all present
grep -ac flows bin/atlas-onboard.mjs # 0 = onboard still ignores flows (-a: file trips grep's binary heuristic)
sed -n '10,13p' bin/seed-org-flows.mjs # seeder usage line (D1 flows table, dry-run default)# Emitter shape-check against the schemas' constraints (any deck-data.json):
python3 plugins/market-validation/assets/market-map/emit_market_map.py <deck-data.json> /tmp/mapout \
&& python3 .claude/skills/fs-platatlas-integration/scripts/check_map_shape.py /tmp/mapout
# (run from the founder-skills repo root for the two relative paths)
Part 2 — Adoption: rail agent seats using founder-skills
Current status (verified 2026-07-02): NOT adopted. Neither rail nor workflow-atlas
references founder-skills anywhere load-bearing (only an unrelated copied strategy doc).
Everything below is the candidate path, not a description of running state.
The rail roster is data-driven (apps/platchat-orchestrator/src/roster.ts: scout /
supervisor / fable archetypes). Only seats that run Claude Code sessions can consume
these skills — local gemma/qwen scouts cannot (skills are Claude-Code-shaped prompts).
Seat
Fit
Which skills
@claude-fable (frontier planner seat)
Good — matches the repo's Fable-plans-never-implements doctrine
market-validation, build-options, prd, tasks; session-start/effort for calibration
gemma/qwen scouts
No — not Claude Code
none
Install (same as any user — the marketplace is live-publishing, so seats track master):
/plugin marketplace add craigm26/founder-skills
/plugin install fable-org-audit@founder-skills # etc. per the seat table
Loadout connection (#137). Once a seat has skills installed, it should self-declare them
so PlatAtlas can diff declared-vs-observed and flag bloat. The mechanism exists and is in
rail main source (routes verified 2026-07-02: POST /api/orgs/:slug/loadout/declare,
per-actor .../actors/:actor_id/loadout/declare + /reoptimize):
# From the workflow-atlas checkout; auth = the org's ingest key (same credential# as the trace uploader; server resolves the actor from the key):
node bin/declare-loadout.mjs --org <slug> --items-file loadout.json
This is the "skills-as-product" hook (operator beyond-SOTA decision #4): founder-skills
entries appearing in a seat's Loadout with observed-use evidence. First declaration PROVEN
2026-07-02 for org platatlas: an ingest-scope key was minted via the admin console API
(POST /api/orgs/:slug/api-keys, session + X-PlatAtlas-CSRF from GET /api/me), stored at
~/.platatlas-platatlas-ingest.key (environment-specific), and declare-loadout.mjs declared
15 founder-skills items — the server auto-created actor
act_90fdfaad-1d32-4afa-9b85-e11d5bebd31c from the key subject, and the loadout index shows
declared 15 / observed 0 / bloat 15 (honest: the seat has pushed no traces yet, so every item
is correctly bloat-flagged until observed use arrives). Next milestone: observed>0 via the
seat's trace uploads.
Part 3 — Mirror plan into workflow-atlas convention (documented, NOT executed)
Operator decision 2026-07-02: this is a follow-on plan only. Do NOT execute it from this
skill; execution requires a spec via fs-change-control (and a corresponding change in
the workflow-atlas repo, which has its own change discipline).
workflow-atlas uses a DIFFERENT plugin convention (verified 2026-07-02):
plugin.json ({"name":"platatlas","version":"0.11.0",...,"commands":"commands/"}) +
16 slash-command markdown files in commands/ (connect.md, init.md, refresh.md, ...).
It has no .claude/skills/ and no .claude/workflows/ (ls -d .claude → not found).
Its command frontmatter differs from ours: name: platatlas:<cmd>, description, plus an
arguments: list with required/flag fields — richer than our two-field frontmatter.
The plan (checkbox form, for a future spec):
Pick the mirror set — candidates are the skills a PlatAtlas maintainer would invoke
inside workflow-atlas: fable-org-audit, fable-repo-audit, tufte-viz-adjacent dataviz
guidance. (workflow-atlas CLAUDE.md already routes to these via ~/.claude/skills/ —
the mirror would make that routing repo-vendored instead of machine-dependent.)
Translation rule per skill: SKILL.md body → commands/<name>.md body; our
description "Use when..." → their description triggers; any AskUserQuestion blocks
and Workflow({scriptPath}) references must be re-verified in their runner (their
commands mostly wrap bin/*.mjs scripts — ours mostly don't; this is the hard part,
not a rename).
Namespace: platatlas:org-audit etc.; bump their plugin.json version.
Decide sync direction: founder-skills stays canonical; the mirror is a generated
copy with a provenance header, refreshed manually (no CI anywhere — standing rule).
Sanitization gate before anything lands in workflow-atlas: it is a different
publication surface; re-apply the fs-doctrine-and-honesty checklist.
Open question (UNVERIFIED): whether their marketplace/plugin loader accepts a second
commands directory or a nested plugin — nobody has tried. Resolve during the spec, not here.
Part 4 — Sink proving protocol (gated; current status: shape-valid, load-untested)
This is the end-to-end test that would retire the sinks.md honesty caveat. It is a
gated step of fs-flagship-chain-campaign — run it there, in order; this section is the
reference for what "proven" means.
Prerequisites (all must hold before starting):
A market-validation run's real deck-data.json (not the synthetic sample).
A live PlatAtlas org you may write to, with console access to see the result.
Operator present for any --write step (hosted writes are operator-gated by the tools
themselves: dry-run defaults in connect.mjs / seed-org-flows.mjs).
gh (PAT: repo + read:org) and a logged-in wrangler on the machine (environment-specific).
Protocol — prove ONE path fully rather than three partially. Paths in ascending cost:
Path
Steps
Proves
A. Static viewer (cheapest)
emit → shape-check → drop nodes.json+flows.json at a URL-fetchable base → open the workflow-atlas web viewer pointed at that base (web/js/data.js fetches <base>/nodes.json + <base>/flows.json)
files render as-is; flows draw
B. Local server
emit → shape-check → drop into a scratch repo's docs/workflows/ (add a minimal atlas.md; edges.json may be absent) → run the workflow-atlas local server against it
the Rust loaders accept real emitter output
C. Hosted console (full claim)
emit → shape-check → nodes via the org's atlas path (note: hosted onboard reads ATLAS.md manifests, NOT raw JSON — expect to adapt) → flows via bin/seed-org-flows.mjs --config ... --write (operator runs the printed D1 commands) → console refresh → screenshot
"PlatAtlas renders an emitted market map" with zero asterisks
Every path: 1. emit_market_map.py <deck-data.json> <out-dir> 2. scripts/check_map_shape.py <out-dir> (this skill dir) 3. load per path 4. render 5. record evidence
(command transcript + screenshot) in the campaign log, then update sinks.md's caveat via
fs-change-control — the label only changes from "shape-valid, load-untested" to
"proven on path X, date Y" with evidence attached. Path C's nodes leg is expected to
surface work (the ATLAS.md-vs-JSON gap in Part 1b); if it does, that finding goes to
fs-failure-archaeology, not under the rug.
Status ledger (update in place):
Date
Step
Result
2026-06-11
emit + referential-integrity assert
shape-valid (emitter self-check)
2026-07-02
emitter output vs workflow-atlas schema constraints
PASS on synthetic sample (check_map_shape.py)
2026-07-02
Path C (hosted console) — PROVEN on org platatlas with the real 2026-06-24 accountability-rail map (21 nodes / 6 families / 1 flow)
Nodes: registered as own atlas 92892cbc-c4f1-5b06-a849-791d80677dcc (R2 META hand-PUT + non-destructive [[atlases]] append; backup kept). Flow competitive-landscape seeded via bin/seed-org-flows.mjs --write (dry-run inspected first). Hosted graph API: edges 25→40, 15 new kind:step; survey resolves flow:competitive-landscape. Screenshot NOT captured (no browser in the proving env) — graph DTO is the render evidence. Run log: PlatChat org platatlas #general thread msg_01KWJH0JGC6YKJC121X392XA08.
Findings from the proving run (2026-07-02):
The hosted graph endpoint serves the ORG-MERGED node pool for ANY atlas_id of the org
(per-atlas ids scope ACCESS, not content) — both atlas ids returned the identical
34-node / 11-family graph. Plan flows/nodes accordingly; a map atlas is not isolated in render.
Auth for hosted verification: ~/.platatlas/auth.json + the MCP cache both go stale; a
session mints fine via POST /auth/github/device-exchange with the gh CLI token
(gh auth token) — no interactive device flow needed while gh is logged in.
Rollback (unused): wrangler d1 execute platatlas --remote --command "DELETE FROM flows WHERE org_slug='platatlas' AND id='competitive-landscape'"; descriptor backup at the
proving session's scratchpad (platatlas.toml.backup).
Provenance and maintenance
Sources: facts pack 2026-07-02; plugins/fable-org-audit/references/worked-example-platatlas.md;
plugins/market-validation/references/sinks.md + assets/market-map/emit_market_map.py;
read-only inspection of the workflow-atlas and rail checkouts (paths environment-specific).
One-line re-verification for everything volatile here:
# Live worker still serves the drifted endpoints (401=exists, 404=gone):
curl -s -o /dev/null -w "%{http_code}\n" https://platatlas.com/api/orgs/platatlas/pulse
# rail main still the worker source with pulse/grants/loadout routes (env-specific path):
grep -c "pulse\|:slug/grants\|loadout" /home/craigm26/projects/rail/apps/platatlas-worker/src/index.ts
# workflow-atlas convention unchanged (plugin.json commands + no .claude/skills):cd /home/craigm26/projects/PlatAtlas/workflow-atlas && grep '"commands"' plugin.json && ls commands | wc -l && ls -d .claude 2>&1
# flows.json still first-class + onboard still flow-blind:
grep -l flows.json crates/core/src/flow/loader.rs; grep -ac flows bin/atlas-onboard.mjs
# Emitter output still shape-valid (from founder-skills root, with a deck-data.json):
python3 .claude/skills/fs-platatlas-integration/scripts/check_map_shape.py <emitted-map-dir>
# Rail seats still on the data-driven roster:
grep -n '"scout" | "supervisor" | "fable"' /home/craigm26/projects/rail/apps/platchat-orchestrator/src/roster.ts
# Adoption still not started:
grep -rl founder-skills /home/craigm26/projects/rail --include='*.ts' --include='*.json' | grep -v node_modules
Known drift risks: the rail cutover is one day old — deploy topology may move again;
the endpoint list grows monthly (route the map update through fs-change-control);
check_map_shape.py hardcodes schema constants copied 2026-07-02 (schemas win on conflict).