north-star — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited north-star (Agent Skill) and scored it 96/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 1 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
At the very beginning of a new project, business, or pivot, before brand, scope, or implementation work. Or later, in drift mode, when the existing north-star isn't working anymore and the founder explicitly wants to revise.
Skip for: features (those use the project's feature skill if one exists), pure technical decisions (use ADRs directly), marketing campaigns (downstream).
Three artifacts:
<project>/docs/adrs/ for durable bright-line decisions surfaced during the interview that warrant separable, citable records.Downstream skills (e.g. feature) read (1) and (2) at requirements-gathering time to check alignment before scoping new work.
docs/00-north-star.md in their editor (code <path>, $EDITOR <path>, or whatever they use) and let them edit there. Quality jumps once the founder is in their own editor; chat-based list confirmations are explicitly forbidden.Bright lines and counter-personas live in the build log's positioning-context section.
BRAINTRUST_API_KEY is set, the skill accumulates interview transcripts, draft versions, cross-model reviews, and the lock event in /tmp/claude/north-star-traces-<project-slug>.jsonl, then flushes to the configured braintrust project via npm run flush-traces in Phase 6. Without the env var, all logging no-ops. Traces are private (braintrust SaaS); the <consumer-repo>/docs/build-logs/ and <consumer-repo>/docs/eval-runs/north-star.md files are committed to whichever repo the skill is run against and inherit that repo's public-or-private status. Run with the env var off for projects whose transcripts should not leave the local machine.scripts/ or workflow under .github/workflows/ that touches braintrust data may print only aggregate numbers. Canonical statement lives in CLAUDE.md; repeated here so future SKILL.md edits surface it to the agent during a run.Ask one at a time. Listen. Reflect back what you heard in the founder's own words. Move on only when they confirm.
Q1 is generative; Q2 and Q3 are selective. Q1 produces most of the raw material the artifact and positioning context will draw from. Q2 surfaces texture that wouldn't come up otherwise (community, room temperature). Q3 is a stop-or-go gate, not a generation question. Treat Q1's depth as the foundation; if Q1 is thin, the run is thin.
Synthesis happens for the founder in Phase 3, not by them in real time. Bright lines, counter-personas, and felt-experience details surface as side-effects of Q1 and Q2; the interviewer collects them into the build log's positioning-context section. There is no separate "bright lines confirm" question; that approach overwhelms founders with confirmation lists and was abandoned twice in the inaugural run.
Spend most of the session here. The founder dumps; the interviewer parses and asks natural follow-ups for any artifact dimension that's missing or thin (most often: the why and the specific person).
Listening cues — flag in the build log as you hear them:
Captures community, belonging, ambient quality, and what-being-there-is-like, material that does not surface in Q1 unless prompted.
Listening cues:
Stop-or-go gut check. Ask clean, no pre-framing. The strongest answers are lived experience the founder is currently living through (per Hard rule 10).
If the founder says "I don't know" to any question, sit with them, don't move on. The not-knowing is data. The truest answer often comes after the silence.
Six phases. The build log is populated throughout, append after each phase, not at the end.
docs/00-north-star.md already exists. If yes and the founder hasn't named drift, exit (the artifact is locked). If yes and drift named, drift mode. If no, fresh-start. Open the build log and write the header (project, founder, date, mode, model running interview, model that will review).Trace each question — REQUIRED. After each question's discussion completes, run the append-trace wrapper (write input and output to temp JSON files first to avoid CLI quoting issues on large transcripts):
npm run append-trace -- \
--jsonl /tmp/claude/north-star-traces-{project-slug}.jsonl \
--name north-star/interview/q<1|2|3> \
--input-file <path-to-question-input.json> \
--output-file <path-to-question-output.json> \
--metadata '{"phase":"interview","question":<1|2|3>,"project":"<project-slug>","mode":"fresh-start|drift","skill_version":"<version from this SKILL.md frontmatter>"}'Input file: {"question":"<question text>","prior_context":"<accumulated content so far>"}. Output file: {"transcript":"<founder verbatim>","summaries":["<reflections>"],"bright_line_signals":["..."]}.
code <path>, $EDITOR <path>, etc.) and hand the editing experience over to them. Track the draft version (v1, v2, ..., vN) in the build log with the reason each version was rejected or evolved; this version history is how drift-prevention is shown.Trace each draft version — REQUIRED. Run the append-trace wrapper per draft (v1, v2, ..., vN):
npm run append-trace -- \
--jsonl /tmp/claude/north-star-traces-{project-slug}.jsonl \
--name north-star/synthesis/v<N> \
--input-file <path-to-synthesis-input.json> \
--output-file <path-to-synthesis-output.json> \
--metadata '{"phase":"synthesis","draft_version":<N>,"project":"<project-slug>","skill_version":"<version>"}'Input: {"transcript_accumulated":"<Q1+Q2+Q3 verbatim>","prior_draft":"<vN-1 paragraph or null>"}. Output: {"paragraph":"<vN paragraph>","rejection_reason":"<why prior was rejected, or null for v1>"}.
model="<other>") to check the work-so-far against the build log. Default pairing: if running on Sonnet, review on Opus; if on Opus, review on Sonnet; Haiku as a fallback for speed. The reviewer returns a punch list; the interviewer surfaces it in chat; the founder triages. Append the review verbatim AND an "Items acted on" block listing which items were addressed. The Items-acted-on block is the most navigable element of the build log; don't skip it.docs/00-north-star.md with YAML frontmatter, paragraph body, and provenance line. Add the consolidated Positioning context for downstream skills section to the build log. In drift mode, archive prior version to docs/north-star-archive/north-star-v{N}-YYYY-MM-DD.md and add a ## Changelog section to the new artifact body. The changelog lives in body markdown only; it is not a structured frontmatter field.Trace the lock event — REQUIRED. Run the append-trace wrapper one final time:
npm run append-trace -- \
--jsonl /tmp/claude/north-star-traces-{project-slug}.jsonl \
--name north-star/lock \
--input-file <path-to-lock-input.json> \
--output-file <path-to-lock-output.json> \
--metadata '{"phase":"lock","project":"<project-slug>","mode":"fresh-start|drift","skill_version":"<version>"}'Input: {"final_draft":"<paragraph>","review_findings":[...]}. Output: {"locked_paragraph":"<paragraph>","artifact_path":"<consumer-repo>/docs/00-north-star.md","version":<N>}.
Flush traces and increment the usage counter.
npm run flush-traces -- /tmp/claude/north-star-traces-<project-slug>.jsonl. The script no-ops without BRAINTRUST_API_KEY and prints only an aggregate count, never trace content.<consumer-repo>/docs/eval-runs/north-star.md. If the file does not exist, create it with runs_total: 0 and runs_drift: 0.runs_total by 1.runs_drift by 1 if this was a drift-mode run.last_updated_at to today's ISO date.The counter is a usage indicator. Eval scorers for north-star (when added) live at skills/north-star/evals/*.eval.ts and run via the braintrust eval-action against logged traces; the counter file does not drive evals.
The skill version is the version field in this file's YAML frontmatter (currently 0.2.1). It is the single source of truth. The agent reads it at the start of each run and includes it in every logTrace metadata as skill_version.
When to bump the version: when the agent's behavior changes in a way that invalidates prior labeled traces. Bump on interview question changes, synthesis prompt changes, cross-model review prompt changes, hard-rule changes. Do not bump on typo fixes, README rewording, or test additions that do not change skill behavior.
Why version matters: when SKILL.md changes meaningfully, old labeled traces are evaluating a different system. Tagging every trace with skill_version lets future eval analysis filter by version. The counter in docs/eval-runs/north-star.md stays cumulative (it does NOT reset on bump); per-version slicing is a property of the traces themselves.
Reading the version at runtime (agent): the version field in this file's frontmatter (the YAML block at the top, currently version: 0.2.1) is already loaded into your context when Claude Code invokes the skill. Extract the literal value once at the start of the run, hold it in working memory, and pass it into every logTrace line's metadata.skill_version. Do NOT shell out to grep: the working directory during a run is the consumer repo, not the toolkit, and there is no SKILL.md there to read.
Every real run accumulates traces in a temporary JSONL file at /tmp/claude/north-star-traces-<project-slug>.jsonl. One line per interview question (Q1, Q2, Q3), one per draft version (v1..vN), one per cross-model review (mid-flight and pre-lock fan-out), and one for the final lock event. At Phase 6 lock, npm run flush-traces -- <path> reads the file, calls logTrace for each line, and flushes the braintrust buffer. The JSONL file is preserved on disk (not deleted) so you can inspect what was sent if a flush fails or you need to debug. /tmp/ is cleared on system reboot, so the files are ephemeral but inspectable until then.
Shape of each JSONL line: { name, input, output, metadata }. Each phase above shows the specific shape inline.
Privacy: the JSONL file lives in /tmp/, never the repo. The flush script prints only aggregate counts to stdout. Trace payloads flow only to the configured braintrust project (private). If BRAINTRUST_API_KEY is unset, logTrace no-ops and nothing leaves the machine. north-star transcripts contain sensitive founder content (felt-experience answers, founder-market-fit stories); the env-var gating is what lets you run the skill on sensitive projects without forwarding.
Counter: Phase 6 lock also increments <consumer-repo>/docs/eval-runs/north-star.md (runs_total and runs_drift). This counter is just numbers; it never contains transcript content.
This mode is designed but not yet exercised in real-world use; the prompts will refine after the first drift run.
Triggered when the founder explicitly says the locked north-star isn't working anymore. Replace Phase 2's prompts with these:
The founder is doing surgery, not creation. Be precise; preserve what still holds.
<project>/docs/00-north-star.md:
---
name: <Project Name>
founder: <Founder name(s)>
locked_at: YYYY-MM-DD
version: 1
schema: forward-deployed-engineer-toolkit/north-star/v1
paragraph: |
<The paragraph as a YAML literal block, machine-readable.
Identical content to body below.>
---
# <Project Name> — North Star
<3 to 5 sentence paragraph, human-readable.>
---
## Provenance
Produced by the `north-star` skill on YYYY-MM-DD. The full session is recorded at `docs/build-logs/north-star-v{N}.md`.
Re-running the skill on this project requires explicit founder say-so describing what's drifted.The TypeScript schema and a working parseNorthStar parser live at forward-deployed-engineer-toolkit/skills/north-star/schema.ts. Downstream apps can install the package via git URL and import directly.
Before locking, the build log gets a final section consolidating everything from the interview that did not fit in the paragraph but is durable. Required subsections:
Before assembling this section, do a final pass over all mid-flight review notes; signals flagged during the run sometimes don't make it into the section without explicit lookup.
This section is what downstream skills (feature, brand work, marketing) read when they need fuller context than the paragraph alone provides.
Done. The artifact is the touchstone; future plans, ADRs, and decisions cite or test against it. The skill's job ends here. Alignment with downstream work is the founder's job (or the project's feature skill if one exists, which should read docs/00-north-star.md and docs/build-logs/north-star-v{N}.md at requirements-gathering time).
v0.2.1 (draft). The hard rules and 3-question structure encode opinions formed during real-world use. Some elements (drift mode, optional ADRs, Hard rule 10 stop-or-go) are designed but not yet exercised in real-world use; first runs to test them will surface any necessary refinement. Expect further revision as the skill is run on more projects.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.