mit einem Klick
check-forbidden-markers
// Pre-deploy gate that scans built JS chunks for forbidden substring markers (saga-era / obsolete code paths) listed in a project-local forbidden-markers.txt
// Pre-deploy gate that scans built JS chunks for forbidden substring markers (saga-era / obsolete code paths) listed in a project-local forbidden-markers.txt
Execute via @babysitter. Use this skill when asked to babysit a task, do anything that is structured process-driven (even a loop) or whenever it is called explicitly. (babysit, babysitter, with a process, orchestrate, orchestrate a run, workflow, loop until, etc.)
Clean up .a5c/runs and .a5c/processes directories. Aggregates insights from completed/failed runs into docs/run-history-insights.md, then removes old run data and orphaned process files.
Plan a babysitter run. use this command to plan a complex workflow, without actually running it.
Orchestrate a babysitter run. use this command to start babysitting a complex workflow in a non-interactive mode, without any user interaction or breakpoints in the run.
Launch the babysitter observer dashboard. Installs and runs the real-time observer UI that watches babysitter runs, displaying task progress, journal events, and orchestration state in your browser.
help and documentation for babysitter command usage, processes, skills, agents, and methodologies. use this command to understand how to use babysitter effectively.
| name | check-forbidden-markers |
| description | Pre-deploy gate that scans built JS chunks for forbidden substring markers (saga-era / obsolete code paths) listed in a project-local forbidden-markers.txt |
Invoke the babysitter:babysit skill (using the Skill tool) and follow its instructions (SKILL.md). Compose the gate from the shared helper at library/processes/shared/forbidden-markers-scanner.js (issue #477).
Reads a list of literal substring markers from scripts/forbidden-markers.txt (blank lines and #-prefixed comments stripped) and greps every .js chunk under .vercel/output/static/_next/static/chunks/ (Next.js / Vercel default; configurable) for any occurrence. Reports structured hits per (marker, chunk) pair with occurrence counts. Designed to chain between vercel build --prod and vercel deploy --prod.
Use this gate when a refactor or restart-from-baseline replaced load-bearing code paths and you need a structural guarantee the obsolete symbols never re-ship. Burned-in evidence: cookbook VI-9 / VI-12 near-miss revivals during the 2026-05 iOS-Safari saga; the prototype lives at cookbook/scripts/check-no-forbidden.mjs and shipped two upstream contributions before being generalized as this gate.
ok: false.forbidden-markers.txt and let CI hold the line.scripts/forbidden-markers.txt — one marker per line, # for comments. The list is the contract; the gate is mechanical. Commit this file to source control..vercel/output/static/_next/static/chunks/ — default scan target. Override for non-Vercel frameworks via the --chunks-dir flag or the chunksDir task input.A missing markers file is a no-op (ok: true, reason: 'missing-markers-file') — misconfiguration is never a deploy block. A missing chunks directory is likewise a no-op (reason: 'missing-chunks-dir') so the gate is safe to chain into check:all before the build runs.
| Reason | ok | Deploy decision |
|---|---|---|
missing-markers-file | true | Pass (no gate active) |
missing-chunks-dir | true | Pass (run before build) |
empty-markers | true | Pass (list is empty) |
no-chunks | true | Pass (nothing to scan) |
clean | true | Pass — proceed to deploy |
hits | false | BLOCK — surface hits, ask for triage |
For each hit, the gate emits { marker, chunk, count } so the operator sees the exact marker string, the absolute chunk path, and the number of occurrences in that chunk. Multiple hits across chunks for the same marker are reported separately.
import { scanForbiddenMarkers, checkForbiddenMarkersTask } from '@a5c-ai/babysitter-library/processes/shared';
// Direct call:
const result = await scanForbiddenMarkers({
markersFile: 'scripts/forbidden-markers.txt',
chunksDir: '.vercel/output/static/_next/static/chunks',
});
if (!result.ok) {
// result.hits: Array<{ marker, chunk, count }>
// result.reason === 'hits'
process.exit(1);
}
// Or dispatched as a babysitter task:
const gate = await ctx.task(checkForbiddenMarkersTask, {
projectDir: '.',
// markersFile / chunksDir are inferred from projectDir if omitted
});
library/processes/shared/forbidden-markers-scanner.jscookbook/scripts/check-no-forbidden.mjs (81 lines)