Two reading depths
A small label, then the register that can defend it.
FEATURE_FACTS.md holds zero to 12 approved rows. Initialization leaves the selection empty. A scanner can propose candidates. It cannot silently curate them.
.featurefacts/ keeps the known capabilities inside a declared survey scope: surfaces, evidence, stale locators, and publication choices. It is not a claim that every capability was found.
Scan one TypeScript repo
Default scan does not execute target code, use the network, or call a model.
npx @xfacts/featurefacts init --root ../my-app npx @xfacts/featurefacts scan --root ../my-app npx @xfacts/featurefacts show --root ../my-app npx @xfacts/featurefacts check --root ../my-app
Install @xfacts/featurefacts (Node 22.18 or newer).
It is not a runtime dependency of the app you scan.
Current scope: TypeScript/Node. Unsupported inputs report
unsupported, not a fabricated inventory.
After scanning, inspect the candidates. There is no approve command.
Confirm only supported capabilities in .featurefacts/features.yaml
(recognition: confirmed plus a declared actor, source, and time).
Record the selection in config.yaml under
curation.selected_ids (up to 12) and
curation.approval. Then run report and check.
An empty label can be the correct result.
The internal label can link to its register. A public label contains only
approved fields and does not expose the private register or source locators.
See docs/LABEL.md and docs/PUBLICATION_AND_SAFETY.md.
Origin · Sponsor
From Catalyst Forge
FeatureFacts was created by Catalyst Forge — AI consulting for growing businesses. Find what matters. Forge it.
Part of the xFacts suite — body, brain, toolbelt, hands, playbook, and terrain, all labeled. Spec & schema are CC0. Tooling is MIT.