# Generated Artifact Policy

SF keeps operational generated artifacts out of the project root unless a human
explicitly promotes them into durable project documentation.

## Default Locations

- `.sf/` stores SF-local operational state, generated harness notes, scaffold
  manifests, runtime caches, locks, temporary agent files, and generated
  orientation caches such as `.sf/repo-map/`.
- `docs/plans/`, `docs/specs/`, and `docs/adr/` store promoted or generated
  human-facing exports for review and git history.
- `docs/generated/` stores explicitly promoted generated documentation when a
  project wants a generated artifact in version control.
- Generated docs may change by design. Git keeps their human-facing history;
  SF-owned operational history belongs in `.sf`/SQLite when runtime replay,
  ledgers, memory, or drift analysis matter.
- Root files such as `AGENTS.md`, `ARCHITECTURE.md`, and `.siftignore` are
  allowed only when they are part of the versioned scaffold contract.

## Resource Layers

SF follows the same separation as Copilot-style agent customization:

| Layer | Path | Git ownership | Purpose |
|---|---|---|---|
| Bundled SF resources | `src/resources/skills/`, `src/resources/workflow-skills/`, `src/resources/agent-overlays/`, `src/resources/extensions/sf/prompts/`, `src/resources/extensions/sf/` | tracked source | Product-shipped defaults. Change these to change SF itself. Workflow skills are hidden system patterns, not a general skill catalog. |
| Repo agent overlay | `.agents/` | tracked project policy | Project-owned prompts, policies, and optional user skill overrides. Same-name skills override non-locked bundled skills. |
| Repo instructions | `AGENTS.md`, `CLAUDE.md`, `.github/copilot-instructions.md`, `.github/instructions/*.instructions.md` | tracked project policy | Agent-facing repo guidance. Keep short, durable, and non-runtime. |
| Runtime generated context | `.sf/repo-map/`, `.sf/traces/`, `.sf/backups/`, `.sf/metrics.db*` | gitignored | Local cache, observability, recovery, and orientation. Safe to delete/regenerate. |
| Promoted generated docs | `docs/generated/` | tracked after review | Durable generated docs that humans chose to version. |

`.sf/repo-map/` is not a source of truth. It is a generated context cache for
agent orientation. If a repo-map page becomes valuable as documentation, promote
it to `docs/generated/repo-map/` or rewrite it into normal `docs/`.

## Prompt and Instruction Layers

Prompt resources follow the same split:

- **Built-in prompts:** `src/resources/extensions/sf/prompts/` and other
  bundled resource directories. These ship with SF and should be edited only
  when changing product behavior.
- **Built-in repo defaults:** `src/resources/agent-overlays/` contains product
  defaults that SF ships, including default repo prompts and default policies.
- **Repo prompts and instructions:** `.agents/prompts/`, root `AGENTS.md`,
  root `CLAUDE.md`, and compatible tool files such as
  `.github/copilot-instructions.md`. `.agents/prompts/` is for repo-owned
  overrides only; root instruction files remain durable human-readable pointers.
- **Path-specific instructions:** use repo instruction files when behavior
  should apply only to part of the tree. Keep them stable and reviewable.
- **Generated context:** `.sf/repo-map/` and other `.sf/` runtime outputs are
  not prompt source. They may be injected as context when fresh, but they are
  ignored and regenerable.

Do not promote generated `.sf` context by copying it into prompt overlays
verbatim. Summarize the durable rule, link the canonical source, and keep the
overlay short enough to be loaded every run.

## SF `.agents` Overlay

Until the external `.agents` specs settle, this repo uses
`sf-agents-overlay/v1`:

- `.agents/manifest.yaml` is the repo-owned machine index for optional prompt,
  policy, mode, adapter, and project skill overrides.
- `.agents/prompts/`, `.agents/policies/`, `.agents/modes/`,
  `.agents/adapters/`, `.agents/scopes/`, and `.agents/profiles/` are empty by
  default. Defaults live in `src/resources/`.
- `.agents/skills/<name>/SKILL.md` is the canonical skill payload and follows
  the Agent Skills specification.
- `.agents/skills/` is empty by default. SF product-owned user skills live under
  `src/resources/skills/`; automatic workflow guidance lives under
  `src/resources/workflow-skills/` as hidden system pattern skills.
- SF self-learning is per repo: runtime evidence and candidate variants belong
  in `.sf` / SQLite first, reviewed repo-specific improvements are proposed as
  `.agents/` overrides, and bundled defaults under `src/resources/` change only
  when the improvement is product-wide.
- `.agents/skills/<name>/skill.yaml` is optional compatibility metadata for
  projection tools. It may point at `SKILL.md`, but it must not replace it as
  the instruction source.
- `.agents/state/state.yaml` is local convenience state and must remain
  gitignored.
- `.sf/` remains SF runtime state. Structured SF state stays DB-first.

## Harness

Generated harness material belongs under `.sf/harness/`.

Top-level `harness/` is not created by SF by default. If a project intentionally
owns a top-level harness, SF leaves it alone unless the files still carry
pending `sf-doc` markers proving they are old SF-generated residue.

## Doctor Cleanup

`/sf doctor --fix` may remove root-level generated residue only when all of the
following are true:

- the file is under a legacy SF-generated path such as `harness/specs/`;
- the file has an `sf-doc` marker;
- the marker template matches the file path;
- the marker state is `pending`;
- the current body hash still matches the marker hash.

Anything edited, completed, unmarked, or project-owned is reported conservatively
or left untouched.
