FeatureFacts

Open label format · part of xFacts

What can this product do?

Read a compact capability label before adopting a product. Maintainers review candidates in an evidence-backed register, then select the capabilities and fields appropriate for a public label.

Candidates are not confirmed features. Zero rows is valid. Linked tests do not mean those tests passed.

xFacts label

Example · synthetic fixture · not a scan of a real product
ProductWorkshop Demo
Modemap-backed
QuestionWhat can this product do?
SelectedResume import
Lifecyclereleased
Availabilityconditional · Pro · member
Maturityexperimental
Evidencecurrent
Not a coverage score. Linked documentation or tests means an accepted association exists. It does not mean the tests passed or the docs are adequate.

Two reading depths

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 review --root ../my-app
npx @xfacts/featurefacts review --apply --root ../my-app \
  --actor "Your Name" --id cmd-scan --name "cmd-scan=Scan"
npx @xfacts/featurefacts check  --root ../my-app

Requires Node 22.18 or newer; it is not a runtime dependency of the app you scan. Unsupported inputs report unsupported, not a fabricated inventory.

  1. scan proposes candidates; review lists them.
  2. review --apply confirms the IDs you name, records who approved them, and writes the label (up to 12 rows). --name sets a row’s label name.
  3. check fails when the label, register, or source are out of date.
  4. Commit all of .featurefacts/, including manifest.json, with FEATURE_FACTS.md.

Selecting nothing is a valid result; then no label file is written. To curate by hand, edit .featurefacts/features.yaml and config.yaml, then run report. For a config from an older version, refresh-config lists the include and exclude changes it needs, such as app folders like viewer/; --write applies them and keeps the selection. A public label carries only approved fields and never the register or source locators. See docs/LABEL.md and docs/PUBLICATION_AND_SAFETY.md.