Factorial Code — App validation
A pre-flight for the platform's own release validation (its criteria are in
fcode-ama references/journey.md §8), run locally before the release is
requested, adding the review dimensions a human gatekeeper would: forms and
lifecycle, i18n, logging hygiene, security.
It serves two audiences with the same procedure: an app developer
self-checking before requesting a release, and a platform reviewer gating
one. Either way the input is a workspace ("team") slug and the output is
APP_VALIDATION_REPORT.md in the cloned workspace plus a ✅/❌ verdict in
chat.
This skill owns only the procedure, the check catalog, the severities, and
the report format. Every rule it checks is owned by another skill and
cited on the catalog row — read the owner when a finding needs context.
Gotchas
- This review is read-only. The only permitted writes are the clone
itself and
APP_VALIDATION_REPORT.md. Never fcode push, never
--force, never settings:versions:create / settings:aliases:set, never edit
workspace files, never fcode add the report.
- Never
fcode run during the review. Processes may call real APIs
with credentials inherited from parent workspaces
(fcode-core-concepts). This is a static review of code and config.
- The clone slug is an encoded
dev-… token, not the app's UUID from
the browser URL — copy it from the app's "How to build locally" guide on
its Development tab (see fcode-cli). A UUID-shaped slug will not clone.
- Any Blocker → ❌. Warnings and Suggestions never flip the verdict.
- Ambiguity blocks the review. If the user names a development team
with several apps, or it's unclear which workspace (
dev- / deploy- /
prod-) to review, list the candidates and ask before cloning. dev- is
the normal review target.
******** placeholders in pulled variables are normal — a masked
secret is never a finding, and the review never needs real secret values.
Never ask for them.
- A failing
fcode clone usually means UUID confusion or missing
access — point at the access flow in fcode-ama; don't retry blindly.
- A mixed JS/Python workspace is fine — review each process with its
own language's rules and note the mix in the report header.
- Review only what the workspace owns. Inherited resources — modules,
processes, and variables from
parentTeams parents,
variables.inherited.env, i18n/<locale>.inherited.yaml — were already
validated when their owning workspace was published. Don't audit their
content; findings may only concern how this workspace uses them.
Severity model
| Severity |
Meaning |
Effect on verdict |
| Blocker |
Breaks at runtime, mishandles credentials, or fails a criterion the platform release gate checks |
Any one → ❌ |
| Warning |
Violates a documented rule; expect reviewer pushback or future breakage |
Advisory |
| Suggestion |
Improvement aligned with platform conventions |
Advisory |
Procedure
- Resolve the workspace. Confirm the slug is the encoded token (see
Gotchas) and which workspace kind it is; disambiguate with the user when
needed. Record the kind in the report header.
- Acquire. Missing CLI: ask the user, then
pnpm install -g @factorialco/fcode-cli — the one permitted install.
Fresh copy: fcode clone <workspace-slug> --skipSkillsSetup. Already
cloned: fcode pull; on divergence never --force — ask whether to
review the local state as-is and record the answer in the report header.
- Inventory (read-only). Detect the language per process (
index.js
vs main.py). List processes, modules, appRoles, and webhook/form
settings from each processes/<slug>/metadata.json; read settings.json,
the three variables files, variables.meta.json, and i18n/. Run
fcode status, fcode variables:status, fcode settings:status, and
fcode i18n:status. Separate owned from inherited as you go — the
catalog applies to owned resources only (see Gotchas).
- Run the check catalog. Read
references/checks.md and evaluate
every check against the inventory, recording file:line evidence.
Whether step 2 was a fresh clone or a pre-existing local workspace
decides if the STRUCT layout checks run fully or are marked
"N/A — fresh clone".
- Classify. Apply each catalog row's severity; deviate only where the
row allows it, and say why in the finding.
- Write the report to
<workspace>/APP_VALIDATION_REPORT.md following
references/report-template.md, overwriting any previous run.
- Print the verdict in chat: the ✅/❌ line, per-severity counts, and
the Blocker titles.
Check categories
STRUCT · LANG · FORM · I18N · SEC · REUSE · LOG · LIFE ·
REL — the full catalog, with per-check severities and owner citations, is
in references/checks.md.
1---2name: fcode-code-validation3description: Pre-production review of a Factorial Code app — clone the workspace read-only, run the static check catalog, classify findings as Blocker/Warning/Suggestion, and write APP_VALIDATION_REPORT.md with a ✅/❌ promotion verdict. Use when validating, reviewing, or auditing a Factorial Code (fcode) app or workspace before a release, or when asked whether an app is ready to ship.4license: MIT5---67# Factorial Code — App validation89A pre-flight for the platform's own release validation (its criteria are in10`fcode-ama` references/journey.md §8), run locally before the release is11requested, adding the review dimensions a human gatekeeper would: forms and12lifecycle, i18n, logging hygiene, security.1314It serves two audiences with the same procedure: an app developer15self-checking before requesting a release, and a platform reviewer gating16one. Either way the input is a workspace ("team") slug and the output is17`APP_VALIDATION_REPORT.md` in the cloned workspace plus a ✅/❌ verdict in18chat.1920This skill owns only the procedure, the check catalog, the severities, and21the report format. Every *rule* it checks is owned by another skill and22cited on the catalog row — read the owner when a finding needs context.2324## Gotchas2526- **This review is read-only.** The only permitted writes are the clone27 itself and `APP_VALIDATION_REPORT.md`. Never `fcode push`, never28 `--force`, never `settings:versions:create` / `settings:aliases:set`, never edit29 workspace files, never `fcode add` the report.30- **Never `fcode run` during the review.** Processes may call real APIs31 with credentials inherited from parent workspaces32 (`fcode-core-concepts`). This is a *static* review of code and config.33- **The clone slug is an encoded `dev-…` token, not the app's UUID** from34 the browser URL — copy it from the app's "How to build locally" guide on35 its Development tab (see `fcode-cli`). A UUID-shaped slug will not clone.36- **Any Blocker → ❌.** Warnings and Suggestions never flip the verdict.37- **Ambiguity blocks the review.** If the user names a development team38 with several apps, or it's unclear which workspace (`dev-` / `deploy-` /39 `prod-`) to review, list the candidates and ask before cloning. `dev-` is40 the normal review target.41- **`********` placeholders in pulled variables are normal** — a masked42 secret is never a finding, and the review never needs real secret values.43 Never ask for them.44- **A failing `fcode clone`** usually means UUID confusion or missing45 access — point at the access flow in `fcode-ama`; don't retry blindly.46- **A mixed JS/Python workspace is fine** — review each process with its47 own language's rules and note the mix in the report header.48- **Review only what the workspace owns.** Inherited resources — modules,49 processes, and variables from `parentTeams` parents,50 `variables.inherited.env`, `i18n/<locale>.inherited.yaml` — were already51 validated when their owning workspace was published. Don't audit their52 content; findings may only concern how *this* workspace uses them.5354## Severity model5556| Severity | Meaning | Effect on verdict |57|---|---|---|58| Blocker | Breaks at runtime, mishandles credentials, or fails a criterion the platform release gate checks | Any one → ❌ |59| Warning | Violates a documented rule; expect reviewer pushback or future breakage | Advisory |60| Suggestion | Improvement aligned with platform conventions | Advisory |6162## Procedure63641. **Resolve the workspace.** Confirm the slug is the encoded token (see65 Gotchas) and which workspace kind it is; disambiguate with the user when66 needed. Record the kind in the report header.672. **Acquire.** Missing CLI: ask the user, then68 `pnpm install -g @factorialco/fcode-cli` — the one permitted install.69 Fresh copy: `fcode clone <workspace-slug> --skipSkillsSetup`. Already70 cloned: `fcode pull`; on divergence never `--force` — ask whether to71 review the local state as-is and record the answer in the report header.723. **Inventory** (read-only). Detect the language per process (`index.js`73 vs `main.py`). List processes, modules, `appRole`s, and webhook/form74 settings from each `processes/<slug>/metadata.json`; read `settings.json`,75 the three variables files, `variables.meta.json`, and `i18n/`. Run76 `fcode status`, `fcode variables:status`, `fcode settings:status`, and77 `fcode i18n:status`. Separate owned from inherited as you go — the78 catalog applies to owned resources only (see Gotchas).794. **Run the check catalog.** Read `references/checks.md` and evaluate80 every check against the inventory, recording `file:line` evidence.81 Whether step 2 was a fresh clone or a pre-existing local workspace82 decides if the STRUCT layout checks run fully or are marked83 "N/A — fresh clone".845. **Classify.** Apply each catalog row's severity; deviate only where the85 row allows it, and say why in the finding.866. **Write the report** to `<workspace>/APP_VALIDATION_REPORT.md` following87 `references/report-template.md`, overwriting any previous run.887. **Print the verdict in chat**: the ✅/❌ line, per-severity counts, and89 the Blocker titles.9091## Check categories9293`STRUCT` · `LANG` · `FORM` · `I18N` · `SEC` · `REUSE` · `LOG` · `LIFE` ·94`REL` — the full catalog, with per-check severities and owner citations, is95in `references/checks.md`.