Skip to content
Back to skills

Foundation Bootstrap

ASecurity

The /fsp-bootstrap pipeline engine. Detects which baseline modules (authentication, authorization, logging, error handling, health checks, CORS, and stack-appropriate recommended modules) already exist in a project, scaffolds the missing required ones via the stack implementors on a dedicated branch, and writes .claude/pilot/foundation/STATUS.md — the marker fsp-build-orchestration checks before allowing feature work on a greenfield project.

  • 2 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added September 6, 2026
developmentgosqlangularazuregitci/cdsecurity

Security analysis

A100/100

Scanned September 6, 2026

npx -y skills add AgenticPawan/FullStack-Pilot --skill foundation-bootstrap --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Foundation Bootstrap?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Foundation Bootstrap
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/agenticpawan-foundation-bootstrap/badge)](https://www.skillsdirectory.com/skills/agenticpawan-foundation-bootstrap)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
user-invocable: false
name: foundation-bootstrap
description: The /fsp-bootstrap pipeline engine. Detects which baseline modules (authentication, authorization, logging, error handling, health checks, CORS, and stack-appropriate recommended modules) already exist in a project, scaffolds the missing required ones via the stack implementors on a dedicated branch, and writes .claude/pilot/foundation/STATUS.md — the marker fsp-build-orchestration checks before allowing feature work on a greenfield project.
when_to_use: Invoke via /fsp-bootstrap only. Runs when the user asks to scaffold baseline/default modules for a new project, or when fsp-build-orchestration's Step 0 foundation check tells the user to run it.
---

<!-- HARD RULES -->
<!-- RULE 1: Required modules are a fixed, opinionated list (below) — do not let the user
     talk you into silently dropping one; if they don't want a module, that's a Step 2
     gate decision recorded in STATUS.md as "skipped-by-user-choice", never a silent omission. -->
<!-- RULE 2: File handoffs only, same as fsp-build-orchestration. -->
<!-- RULE 3: Never invent detection heuristics beyond what's listed — if a module's presence
     genuinely can't be determined from the checks below, ask the user rather than guessing. -->

## Module checklist

| Module | Tier | Applies when | Governing standard(s) | Detection heuristic |
|---|---|---|---|---|
| Secrets/config management | Required | always | `always-no-hardcoded-secrets` (hook-enforced already) | Already covered by the `secret-guard` hook — never a work item here, just confirm the hook is active |
| Logging | Required | dotnet present | `dotnet-logging` LOG-*, `always-structured-logging` | `Program.cs` wires a durable sink (Serilog/OpenTelemetry) beyond bare `Console` |
| Error handling | Required | dotnet present (+ angular if present) | `dotnet-error-handling` ERR-*, `angular-error-handling` | `Program.cs` registers `IExceptionHandler`/`UseExceptionHandler`; Angular has a global `ErrorHandler` provider |
| Authentication | Required | dotnet present | `dotnet-authentication` AUTH-* | `Program.cs` calls `AddAuthentication(...).AddJwtBearer(...)` or `AddOpenIdConnect(...)` |
| Authorization (permissions-only) | Required | dotnet present | `dotnet-authorization` AZ-* | `Program.cs` calls `AddAuthorization` with a policy-based (not role-based) scheme |
| Health checks | Required | dotnet present | `dotnet-health-checks` HC-* | `Program.cs` calls `AddHealthChecks()`/`MapHealthChecks()` for both liveness and readiness |
| CORS | Required | dotnet present AND angular present | `dotnet-cors` COR-* | `Program.cs` calls `AddCors` with a named, config-sourced policy |
| Rate limiting | Recommended | dotnet present | `dotnet-rate-limiting` RL-* | `Program.cs` calls `AddRateLimiter` |
| Startup validation | Recommended | dotnet present | `dotnet-startup-validation` SV-* | Options bound with `.ValidateOnStart()` |
| Security headers | Recommended | dotnet present | `dotnet-security-headers` SECH-* | HSTS/`X-Content-Type-Options` middleware present |
| Observability | Recommended | dotnet present | `dotnet-observability` OBS-* | OpenTelemetry tracing/metrics wired |
| CI/CD pipeline skeleton | Recommended | azure present | `azure-cicd-security`, `git-workflow-governance` | `.github/workflows/*.yml` exists with OIDC deploy auth |
| DB migration baseline | Recommended | sql present | `sql-schema-design` | An initial EF Core migration exists with naming-convention-compliant tables |

Required modules gate `/fsp-build` on a greenfield project (see `fsp-build-orchestration`
Step 0). Recommended modules are reported but never block anything.

## Read budget (STRICT): detection only, max 15 files

- Detection is a handful of targeted greps/reads per module (`Program.cs`, `app.config.ts`,
  workflow files) — never a full codebase read. If a scout brief already exists for the
  relevant scope, read it first instead of re-deriving file locations.
- Budgets bound exploration, not quality: if a module's presence genuinely can't be
  determined within budget, mark it "unknown — needs manual confirmation" rather than
  guessing either way.

## Step 0 — Parse arguments and load state

- `--yes`: skip the soft confirmation gate (Step 2); never skips the per-module hard gates
  the stack implementors themselves enforce (auth-policy changes, etc. — same as `/fsp-build`).
- Read `.claude/pilot/stack-profile.json` — stop if absent: "run /fsp-init first".
- If `.claude/pilot/foundation/STATUS.md` exists and every Required module is `done` or
  `skipped-by-user-choice`, print its contents and stop — nothing to do.
- `git status --porcelain` must be clean, else stop and ask (never stash silently).

## Step 1 — Detect current status

For each module in the checklist whose "Applies when" condition is met by the stack
profile, run its detection heuristic. Build the status table:

```
## Foundation module status

| Module | Tier | Status | Evidence |
|---|---|---|---|
<one row per applicable module: Present (file:line) | Missing | Unknown>
```

## Step 2 — Gate (user)

Print the status table. If every Required module is Present, write STATUS.md now (Step 4
format) and stop — report "already bootstrapped."

Otherwise list the missing Required modules and any missing Recommended ones separately.
Ask: "Scaffold the missing Required modules now? (YES / SKIP <module> to accept the gap
knowingly / describe changes)". A `SKIP` records that module as `skipped-by-user-choice` in
STATUS.md with the user's stated reason — never silently dropped. Proceed on `--yes` only
for modules with no `SKIP` request.

## Step 3 — Implement (stack implementors)

Create the branch: `git checkout -b pilot/foundation-bootstrap` (skip if already on it, e.g.
resuming).

For each confirmed missing Required module, in this order — secrets/config (usually already
satisfied) → logging → error handling → CORS → authentication → authorization → health
checks:
1. Invoke the owning `@<stack>-implementor` with a fixed work-item description: the module
   name, its governing standard IDs, and "implement it compliant with the pilot-<stack>
   inventory from the start" (this is the implementor's existing "feature request" input
   mode — no new capability required of it).
2. Run the module's own build verification (`dotnet build` / `npx tsc --noEmit`).
3. Commit the verified module (`feat(foundation): scaffold <module>`).
4. Record `done` in the in-memory status; a failure marks it `failed` and stops the
   pipeline (same failure discipline as `fsp-build-orchestration` RULE 7) — a half-scaffolded
   auth module is worse than none.

## Step 4 — Review (paired stack reviewers)

For each stack touched, invoke its `@<stack>-reviewer` scoped to the diff only
(`git diff <startBranch>...HEAD` for that stack's files). Route findings back to the same
implementor for one fix round; re-verify; commit. This mirrors `fsp-build-orchestration`
Step 6 but without the 2-loop escalation machinery — foundation modules are small, known
shapes, not novel feature work.

## Step 5 — Report

Write `.claude/pilot/foundation/STATUS.md`:

```
# Foundation bootstrap status
Date: <iso> | Branch: pilot/foundation-bootstrap (NOT merged)

| Module | Tier | Status | Standard(s) | Notes |
|---|---|---|---|---|
<one row per module in the checklist: done | skipped-by-user-choice (+ reason) | not-applicable>
```

Print in chat: the branch name, the status table, and:

```
Next steps:
  git diff <startBranch>...pilot/foundation-bootstrap   # review
  <merge per the project's git workflow>
  Then run /fsp-build for feature work — the foundation gate will now pass.
```

The branch is left unmerged — merging is the user's decision, same as `/fsp-build`.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…