feature-e2e — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited feature-e2e (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
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.
This skill runs a real-world end-to-end shake-out of a Product CLI feature against a fresh, isolated repo, driven entirely through the CLI. The goal is to confirm that a feature works for a brand-new user — not just that the unit tests pass.
The CLI is the canonical user-facing surface. The MCP server is a transport over the same logic. If the feature has an MCP-only surface (e.g. it adds an MCP tool with no CLI equivalent), test that too — but only after the CLI surface is fully exercised.
Open docs/features/FT-XXX-*.md. Extract:
EXX has a path that should fireproduct.toml sections)PRODUCT=/abs/path/to/repo/target/release/product
[ -x "$PRODUCT" ] || cargo build --releaseDon't rebuild if a release binary already exists — the bottleneck is the test work, not compilation.
rm -rf /tmp/<feature-slug>-e2e-test
mkdir -p /tmp/<feature-slug>-e2e-test
cd /tmp/<feature-slug>-e2e-testAlways start clean — the resolution order for templates / config / .product/ directory walks up the filesystem, so a stale parent state can leak into the test.
$PRODUCT init -y \
--name "FT-XXX E2E Test" \
--description "End-to-end test of <feature title>" \
--domain core="<one-sentence domain>"Defaults to the canonical .product/ layout (ADR-048). Pass --legacy-layout only if the feature specifically needs the pre-FT-057 root-based layout.
Verify init landed correctly:
ls -la .product/ # config.toml, features/, adrs/, tests/, graph/
$PRODUCT --help | head -40 # confirms binary loads against the fresh repoA typical e2e run needs at least one feature, one ADR, and one TC, linked together:
$PRODUCT feature new "Hello World"
$PRODUCT adr new "Use TOML for config"
$PRODUCT test new "feature renders"
$PRODUCT feature link FT-001 --adr ADR-001 --yes
$PRODUCT feature link FT-001 --test TC-001 --yesAfter seeding, sanity-check via the CLI's read commands:
$PRODUCT feature list
$PRODUCT feature show FT-001
$PRODUCT adr list
$PRODUCT test show TC-001
$PRODUCT graph checkThis is the core of the skill. Walk every acceptance criterion and every CLI command listed in the feature spec. Capture stdout, stderr, and exit code separately for each invocation:
$PRODUCT <command> [args] > /tmp/out.txt 2> /tmp/err.txt
echo "exit=$? stdout=$(wc -c </tmp/out.txt) stderr=$(wc -c </tmp/err.txt)"
head /tmp/out.txt
[ -s /tmp/err.txt ] && cat /tmp/err.txtMany features emit warnings on stderr while keeping stdout pipe-friendly — always capture stderr separately or you will miss the deprecation notes / drift signals.
For each command, exercise:
--format json), depth/filter flags, and any feature-specific knobsfeature link --adr, feature link --test, feature link --dep--format json is supported, parse the output with python3 -c "import json,sys; json.load(open('/tmp/out.txt'))" to confirm it's well-formedFor each rendering target the feature exposes, validate the output is structurally well-formed:
python3 -c "import json; json.load(open('/tmp/out.txt')); print('JSON ok')"
python3 -c "import yaml; yaml.safe_load(open('/tmp/out.txt')); print('YAML ok')"
python3 -c "import xml.etree.ElementTree as ET; ET.parse('/tmp/out.txt'); print('XML ok')"For every error code the spec promises, intentionally trigger it and confirm the exit code, stderr message, and hint text:
$PRODUCT <bad invocation>; echo "exit=$?"; cat /tmp/err.txtConfirm exit codes follow ADR-013 (1 = error, 2 = warning).
Many features resolve files in repo → user → built-in order (templates, prompts, config overlays). Test all three by:
.product/<thing>/ and confirm it shadows the built-in~/.product/<thing>/ and confirm the repo file winsThe MCP server is a transport over the same logic — it's exercised by every CLI handler under the hood. Only test it directly when:
When you do, the JSON-RPC sequence is initialize → notifications/initialized → tools/call. The response is double-wrapped — parse twice:
{
printf '%s\n' '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"e2e","version":"0"}}}'
printf '%s\n' '{"jsonrpc":"2.0","method":"notifications/initialized"}'
printf '%s\n' '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"<tool>","arguments":{...}}}'
sleep 0.3
} | $PRODUCT mcp 2>/tmp/mcp.errInit with --write-tools if you need to call a write tool, and use python3 -c "import json,sys; ..." to walk both wrapper layers.
After exercising the feature's commands, run the standard health gates one more time to confirm no command corrupted the graph:
$PRODUCT graph check
$PRODUCT gap check
$PRODUCT drift check
$PRODUCT preflight # if defined for this repoFor every acceptance criterion in the spec, mark pass/fail. Call out any drift between spec and behaviour — these are the highest-value findings of an e2e run.
product test new, not product tc new. The internal IDs use TC-XXX but the subcommand family is test.--for-llm) emit deprecation notes to stderr while still producing valid stdout. Always redirect stderr to a separate file.gap check, dep check, preflight) deliberately exit 2 — that is not a test failure.src/context/template/builtin/*.toml but are pulled in via include_str! — there is no templates/ directory at the repo root or anywhere on disk in a fresh install.(built-in) (no path); repo/user templates show their absolute path.feature_id). PRD examples may show feature_id — that is doc drift; the binary reads id.{"result":{"content":[{"text":"<inner json>","type":"text"}]}}. You must json.loads() twice when validating tool output.End each run with:
/tmp/ft063-e2e-test/)~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.