The root config was plain JS while site/vitest.config.ts was TypeScript — an inconsistency, not a constraint. The file was already ESM with a typed defineConfig, so nothing inside it changed. The landmine was removed first (#223): the path guard DISCOVERS the filename via readdirSync().find(f => f.startsWith("vitest.config.")) instead of spelling the extension, so this rename touches its comment, not its code. Nine references updated; one was a live relative link in docs/testing-matrix.md that would have broken. CLAUDE.md was regenerated from its spec, not hand-edited. Mutation-proven three ways: green on .mjs, green on .ts, and a VALID config not named vitest.config.* fails by the guard's own message ("no vitest.config.* at the repo root") on exactly one assertion. Gates: npm run check 18/18 · npm run coverage 3976 passed, 0 failed — byte-identical to the pre-rename run. Merged without an automated review: the Codex reviewer reported its code-review usage limit was exhausted, so the signal was unavailable rather than pending. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
12 KiB
HANDOFF — volatile cross-session state
Overwrite each session; keep ≤120 lines. The durable map is
research/roadmap.md— this is the orientation pointer, not the record. The SessionStart hook injects this file so a new session starts oriented — read it first. Git-TRACKED + EPHEMERAL container, so an update persists ONLY if you commit + push. REFRESH IT before you end the session (and on any "handoff" request). A Stop hook nudges you at ≥5 commits without a refresh.⚠️ THIS FILE IS PUBLIC (open-source repo). NO STRATEGY here — business direction, monetization, competitive framing, and personal plans live ONLY in the private
zernie/minerepo undervigiles/(migrated 2026-07-13 from the old git-cryptstartup/vault). HANDOFF may say strategy exists there, never name or describe its contents. NEVER name a specific user/company/figure here (public). (Seedoc-tiers.)
RESUME HERE
vigiles.sh is LIVE 🎉 — landing at /, TypeDoc docs at /api, valid TLS. Site auto-deploys
via pages.yml on push to main. Demo UX + real-F default MERGED (PRs #100–#106).
PR #114 MERGED (JVM/Go linters 7→11, audit/init/compile hardening, adoption UX).
PR #116 MERGED (c8910bd) — the LinterAdapter port stages 0–3 (registry + conformance + generate-types + CI
parity + add-a-linter skill) + report-view card lightening. Vlad's issues #107/#109/#110/#111/#113 — CLOSED +
personally replied (v14.12.0; #107 1d dirty-tree + #113 looser-match stated as deferred).
THE LINTERADAPTER PORT IS NOW COMPLETE. LINTERS: Record<BuiltinLinter, LinterAdapter> (src/core/linters.ts)
is the LITERAL single dispatch source — a missing linter is a tsc error, linter-contract.test.ts catches docs/site
drift, and add-a-linter (.claude/skills/) is the authoring guide. To add a linter: BUILTIN_LINTERS (spec.ts)
→ register in LINTERS via nodeApiAdapter/cliAdapter (checkExists/configEnabled inline) → docs row → CI install.
PR #117 MERGED (c9b2a96) — the follow-up (Stage 4 + site-chip derivation + cedar P1) off main.
Stage 4 = collapsed the 4 legacy dispatch maps (LINTER_RESOLVERS/CLI_RULE_CHECKS/LINTER_CONFIG_CHECKERS/
CLI_TOOL_FOR_LINTER + getCliRuleSet) into the adapters, behavior byte-preserved (golden linters.test.ts 307
green; done by a background subagent, dispatch reviewed). Site = Wedge.tsx now DERIVES the linter chip strip from
BUILTIN_LINTERS via a new @engine/spec alias (can't go stale; conformance test guards the derivation). Cedar =
KEPT + P1 roadmap item ("Cedar verification depth — beyond presence"); its reference docs already exist in
docs/linter-support.md § Cedar Policies. Stale-ref sweep: CONTRIBUTING.md + ci.yml comment + roadmap + research
index all de-referenced the deleted maps. Full suite green (2352 passed | 24 skipped), site builds + bundles the names.
DOGFOOD BATCH — DONE. A 4-agent Sonnet fan-out found 14 verified, source-traced bugs; founder's call was
FIX, not file. All 14 fixed + pushed, each with a regression test; full vitest suite green (2327 passing).
The process is now CODIFIED as .claude/skills/dogfood-cli (the find+fix fan-out method + every lesson).
Fixed (by commit): #108 marketplace owner · #112+C3/C4/C5 config parse-don't-validate · I2 Codex install
-s-scoped to SHIPPED_SKILLS · D2 hook-block exit-2-in-comment · A/I3 audit+init honor config harness
(via resolveHarnessSelection) · E1 (P0) real on-disk surface paths not the phantom .claude/... key (both
ScanAgent/ScanSkill.path AND frontmatter-family findings, disk+browser) · C2 clean top-level error message (no
stack trace) + exit 2 · D1 hook-script-exists ignores a glob (find -name "*.js") · E2 default lint
integrity-checks compiled subagents · E3 init reports unmapped frontmatter keys even on malformed YAML · I1/I4
CI-workflow gates npm install on package.json + the lint job on the lint pillar.
Bonus finds fixed en route: a pre-existing scanFiles<->scanPlugin parity failure (browser ownTestSignal), a
literal NUL byte in scan-core (read as binary), and a missed I2 e2e assertion (only the FULL suite caught it).
VLAD'S ISSUES #107/#109/#110/#111/#113 — ALL FIXED (fanned out per the dogfood-cli skill: #109 linters +
#110 scan-FPs on background agents, verified + integrated). #107 skill allowed-tools list + context:fork adopt
(1d dirty-tree deferred as founder UX) · #109 JVM/Go linter catalogs (detekt/ktlint/checkstyle/golangci-lint, 7→11) ·
#110 example-link + shell-comment scan FPs · #111 non-JS harness guide · #113 include docs. Full suite green.
PR #114 REVIEW-FIX + PREVENTION PASS — PUSHED. After the meta-analysis, addressed the Codex bot P2s +
prevention: (a) skill-resource-resolves LINK RECALL — a markdown link is real UNLESS an illustrative cue (don't
also require a use-verb, or Resources: [API](x.md) goes unchecked); bare inline path keeps the stricter gate; +
recall test. (b) detekt CLI check threads basePath not process.cwd(). (c) #4 adopt-surface ROUND-TRIP GATE
(every standard skill frontmatter field survives adopt→compile→re-adopt — the #107 drift class). (d) dogfood-cli
skill: "two recurring bug classes" (unverified external contract → parse-don't-validate + unit shape assertion;
incomplete fix → grep siblings + one choke-point + gate test). Full suite green (2332 passing).
⏳ PENDING FOUNDER DECISION — adopt.ts markdown parsing. Founder flagged (correctly) that adopt.ts
splitBlocks parses CLAUDE.md/agent BODY structure with HAND-ROLLED REGEX (HEADING_RE/FENCE_RE + manual
fence toggle), a prefer-existing-solutions gap. REAL BUG exposed: the fence toggle matches any 3+ backtick run,
so a nested/mismatched fence (4-backtick block containing ```) mis-splits a ##inside code as a heading; setext
headings missed too. (Skills unaffected — body is verbatim; frontmatter IS js-yaml.) FIX = swap boundary-detection
tomarkdown-it token.map line ranges, keep VERBATIM slicing on source offsets (never AST-reserialize — breaks
round-trip), add a nested-fence fixture. Tradeoff: adds 1 runtime dep to a deliberately dep-light CLI (13 deps).
Recommended DO IT (markdown-it, browser-safe, minimal). AWAITING founder: do-on-#114 vs file-separately.
GATE-FAILURE RULE (founder, standing): if a skill/hook/rule DIDN'T CATCH an issue the founder had to spot,
FIX THE GATE FIRST. (e.g. the mobile-overflow CI gate + the responsive-grid lesson in .claude/skills/landing-site.)
FLAG (founder's call): the PR-CREATION harness auto-appends a claude.ai/code/session_… URL to PR bodies
(public no-session-links rule). Using the GitHub MCP create/update_pull_request (as this session did) AVOIDS it.
If a PR is opened another way, edit the body to end at the claude.com/claude-code line.
FETCH-TAIL DOCUMENTED — do NOT chase Codex's fetchRepo P2s. Demo fetches a BOUNDED set; invariant = NEVER GRADE
PARTIAL DATA. Canonical: research/browser-demo-fetch-limits.md.
TOP GOAL (.claude/skills/landing-site): maximize visitors who RUN npx vigiles audit. HOLD every site/ change
against the skill (READ it before touching site/); screenshot desktop AND full 390px mobile.
🎯 DO NEXT
- The linter work is DONE — PR #116 + #117 both merged; the LinterAdapter port is complete and the roadmap's "Vlad's real-harness pass" block is moved to "Shipped recently". No open linter follow-up. The GHA PR-comment grade (item 6) stays deprioritized (later-adoption, not guaranteed after gate-first init).
- Item 4b b2 (per-grade OG card) — the ONLY remaining share-loop piece: a card showing
owner/repo · actual grade. Needs a SERVERLESS OG endpoint (GitHub Pages is static, can't vary<meta>by?repo=) → bundles with 4c (time-boxed upload, needs backend). b1 (generic card) is SHIPPED (site/public/og.png+ tags insite/index.html). - Item 5 (one opt-in README badge) — after the share loop; badge-fatigue data says exactly one.
- STRENGTHEN THE IN-REPORT INVITATION (the real growth lever, per adoption-design.md §1 reasoning). The terminal nudge is now value-framed (why a spec), but the HTML report's adoption surface (Adopt/adoptability preview) deserves its OWN focused pass with screenshots + a Fable cold-visitor review — "make a skeptic WANT a spec/eval by showing what it'd catch". This is where richer-feature adoption is won (gate is opt-in, so the invitation must carry it).
- davila7-F reconciliation — featured at F but not MIT-vendored/opted-in; prefer the live
?repo=grade or apply the vendoring policy before the leaderboard hardens.
Codex trigger-rate is EXPERIMENTAL
Deterministic Codex audit = full parity (KEEP). Real-model trigger-rate on Codex is NOT trustworthy
(no skill-fire event → codexSkillFired infers from SKILL.md reads); marked ⚠ EXPERIMENTAL across the API +
docs/harness-testing-codex.md. Promote only after a LIVE oracle-accuracy run (needs codex + quota).
STILL OPEN
- Multi-harness audit DX — DEFERRED (audit is CLAUDE-CODE-FOCUSED); design in
research/audit-harness-dx.md, scope entry inroadmap.md(Later). - Backend audit service (rate-limited LLM) —
roadmap.md(Later); the demo reference/behavioral-gap fix. - Codex trigger-rate promotion — the live oracle-accuracy run above (blocked on codex + quota).
- Personal/launch/calendar follow-ups → PRIVATE
zernie/mineonly. Do not restate here.
Design-of-record
research/rule-enforcer-design.md— THE front door (STATUS: ALPHA). Pipeline diagram, the rescue-ladder/no-signal-fold decisions, the category↔lane↔glyph table, §8 scope-freeze+backlog, §9 testing. Read FIRST. (rule-enforcer-multilang-design.mdis the older build-log; it defers to this doc.)research/dogfood-corpus.md— the dogfood map + policy (read before touching any dogfood artifact). The word "dogfood" covers FOUR different things — onlytest/dogfood/is the SHA-pinned vendored corpus;examples/harness/dogfood/=skill examples (model-gated MANUAL),rule-enforcer/gold/=package-internal,research/audit-captures/=captured audit OUTPUT (not tests).
Gotchas (still live)
- CI won't trigger on Claude-authored commits —
ci.ymlfires onpull_requestbut GitHub suppresses workflow runs for commits authored byClaude <noreply@…>. If a PR's checks don't start: Approve-and-run-workflows in the PR UI, or Close→Reopen the PR. (pr-title.ymlonpull_request_targetalways runs.) - Real-model evals run in-container on the SUBSCRIPTION (
claude -p;$0metered). Cold start ~20s+; a first probe may time out — retry longer. - A SKILL.md is NOT a skill unless registered — bare
SKILL.mdin cwd never loads; usearm.pluginDir/skillsDir.CLAUDE.mdDOES auto-load as memory. - The 100% coverage gate is an EXPLICIT allowlist in
vitest.config.ts(coverage.include). A new pillar file must be added there + real-IO seams marked/* v8 ignore */. measure()is SINGLE-arg —measure(spec)wherechecks/trials/modellive INSIDE the one object. (RootCLAUDE.mdeval.ts desc still wrongly says "measure(spec, { trials, checks })" — fix the spec later.)CLAUDE.md(root +src/+research/) is COMPILED from.spec.ts— edit the spec + recompile (node dist/cli.js compile <spec>), NEVER hand-edit (a PostToolUse hook does).- COMMIT SIGNING is BROKEN in-container (0-byte pubkey) → "Unverified"; email correct.
add_repois same-owner only — fetch external files viacurl https://raw.githubusercontent.com/OWNER/REPO/BRANCH/PATH(through the proxy).- Commits/PR: NO session links / NO raw model-id strings. Conventional-Commit titles;
a public-API removal/rename needs
!(drives the semantic-release major bump).
Don't re-read unless the task needs it
- strategy KB — PRIVATE
zernie/minerepo undervigiles/(add_repo zernie/mine). research/roadmap.md— the front-door (technical) roadmap.