/project-interview
Create the durable project profile that tells engineering-skills what
the project is trying to be. /adapt-project can discover facts, but it
cannot safely infer purpose, priorities, risk posture, intentional
tradeoffs, or whether a repeated pattern is healthy.
The deliverable is a draft or applied profile:
.engineering/project/profile.yml — machine-readable, human-approved
project intent.
.engineering/project/profile.md — readable summary.
.engineering/project/open-questions.md — unresolved questions agents
should revisit.
How success is judged
- The run writes a draft scan under
${ARTIFACT_ROOT}/reports/project-interview/scan-<TS>/ by default, or
additionally writes .engineering/project/ only when --apply was
explicitly requested.
profile.yml, profile.md, open-questions.md, and evidence.json
exist in the same scan directory, and the final reply pastes the exact
evidence_gate.py check output for that scan.
- The stock-selected skill resolves both helpers from its own
scripts/
directory and runs under isolated stdlib Python; no repository-level
scripts/, toolkit venv, or sibling skill is required.
--no-host-write runs never write inside ${PROJECT_ROOT}. The
command must use an ${ARTIFACT_ROOT} outside the host project, and
every later read/check uses that same artifact root.
- User answers are captured in the draft profile, or unresolved topics are
left in
open-questions.md; do not claim human approval without a
visible user answer.
Forms
/project-interview
/project-interview --project-root /path/to/repo
/project-interview --project-root /path/to/repo --artifact-root /private/tmp/adapt/foo --no-host-write
/project-interview --apply
Default behavior writes a draft under
reports/project-interview/scan-<TS>/. --apply writes durable files
under .engineering/project/. --no-host-write is the dogfood mode and
requires --artifact-root outside the host project.
Pipeline
Resolve the installed skill and artifact roots for this run:
PROJECT_ROOT="${PROJECT_ROOT:-$(pwd)}"
ARTIFACT_ROOT="${ARTIFACT_ROOT:-${PROJECT_ROOT}}"
PYTHON_BIN="${PYTHON_BIN:-python3}"
if [ -n "${PROJECT_INTERVIEW_SKILL_DIR:-}" ]; then
SKILL_DIR="${PROJECT_INTERVIEW_SKILL_DIR}"
elif [ -f ".agents/skills/project-interview/SKILL.md" ]; then
SKILL_DIR="$(cd .agents/skills/project-interview && pwd)"
elif [ -f ".claude/skills/project-interview/SKILL.md" ]; then
SKILL_DIR="$(cd .claude/skills/project-interview && pwd)"
else
echo "error: cannot find installed project-interview skill" >&2
exit 2
fi
If the user invoked --no-host-write, set ARTIFACT_ROOT to a
directory outside PROJECT_ROOT before running the helper. Reuse the
exact same ARTIFACT_ROOT for every later read and evidence gate.
Run repo-fact discovery to seed the interview:
SCAN_DIR="$("${PYTHON_BIN}" -I -S \
"${SKILL_DIR}/scripts/project_interview.py" draft \
--project-root "${PROJECT_ROOT}" \
--artifact-root "${ARTIFACT_ROOT}")"
Add --no-host-write when the user requested it. The helper performs
objective, lightweight discovery only and always writes an unapproved
draft. Do not pass --apply here; durable apply happens only after
visible human answers are captured and confirmed.
Read the printed scan directory:
test -d "${SCAN_DIR}" || { echo "missing scan: ${SCAN_DIR}" >&2; exit 2; }
Read ${SCAN_DIR}/profile.yml, ${SCAN_DIR}/profile.md, and
${SCAN_DIR}/open-questions.md.
Ask only questions that cannot be answered from the repo and that
materially change future agent behavior:
- What is the project for, and who is it for?
- Which workflows are correctness-critical?
- Is this prototype, feature-shop, durable, or regulated work?
- Where should agents slow down?
- Which current patterns are intentional tradeoffs?
- Which common current patterns are known bad and must not be
standardized?
- What should the project become next?
Update the profile draft with the user's answers if the run is
interactive. Set user_approved: true only after visible answers and
confirmation; repository facts never count as human approval. If the user
is unavailable, keep user_approved: false and leave the answers as open
questions. Update profile.yml, profile.md, and open-questions.md
together so the evidence shapes describe the same state.
Run the evidence gate:
"${PYTHON_BIN}" -I -S "${SKILL_DIR}/scripts/evidence_gate.py" check \
--skill project-interview \
--scan-dir "${SCAN_DIR}"
Paste the gate output in the final reply. A claim that the artifacts
exist is not enough.
If and only if the user invoked --apply, the evidence gate passed, and
the visible answers support user_approved: true, apply the three profile
artifacts:
"${PYTHON_BIN}" -I -S \
"${SKILL_DIR}/scripts/project_interview.py" apply \
--project-root "${PROJECT_ROOT}" \
--scan-dir "${SCAN_DIR}"
--apply and --no-host-write are mutually exclusive intents. The helper
refuses apply while user_approved is not true and rejects a symlinked
.engineering/project destination.
How Future Skills Use The Profile
/which-skill tunes recommendations by maturity and risk posture.
- Planning skills treat critical workflows and intentional tradeoffs as
prior constraints.
/adapt-project --apply should prefer user-approved profile entries
over inferred facts.
/prevent-regression prioritizes guards for do-not-break surfaces.
/engineering-fitness can grade profile completeness once that skill
ships.
Vibe-Coded Or Legacy Projects
The interview must explicitly ask what not to standardize. In a
messy project, repeated patterns are often scars, not examples. Capture
those under open-questions.md or the profile's standardization policy
so future agents do not turn accidental consistency into doctrine.
When things go sideways
| Symptom |
Action |
--no-host-write fails because the artifact root is inside the project |
Stop, choose an artifact root outside ${PROJECT_ROOT}, and rerun; do not retry without --no-host-write |
| The draft helper exits 2 |
Paste stderr, fix the invocation or write-mode conflict, and do not claim a profile was produced |
| The printed scan directory is missing |
Stop and report the printed path; do not fall back to a repo-local reports directory |
| Evidence gate reports missing tokens |
Leave the run incomplete; name the missing token and scan directory in the user reply |
| User is unavailable for interview answers |
Keep the generated draft and move unanswered items to open-questions.md; do not mark the profile approved |
Apply reports user_approved is not true |
Keep the draft, ask for the missing human answers or confirmation, and never flip approval from repository inference |
--apply was requested but durable .engineering/project/ writes fail |
Keep the draft scan as evidence, paste the write failure, and do not claim durable profile files were written |
Replay case
For artifact-root or evidence-gate changes, replay the dogfood form with a
temporary artifact root:
ARTIFACT_ROOT="$(mktemp -d)"
PROJECT_ROOT="$(git rev-parse --show-toplevel)"
SKILL_DIR="${PROJECT_INTERVIEW_SKILL_DIR:-${PROJECT_ROOT}/.claude/skills/project-interview}"
PYTHON_BIN="${PYTHON_BIN:-python3}"
SCAN_DIR="$("${PYTHON_BIN}" -I -S \
"${SKILL_DIR}/scripts/project_interview.py" draft \
--project-root "$(git rev-parse --show-toplevel)" \
--artifact-root "${ARTIFACT_ROOT}" \
--timestamp project-interview-smoke \
--no-host-write)"
"${PYTHON_BIN}" -I -S "${SKILL_DIR}/scripts/evidence_gate.py" check \
--skill project-interview \
--scan-dir "${SCAN_DIR}"
The replay passes only when the helper prints the scan directory under
${ARTIFACT_ROOT} and the evidence gate prints OK: 3/3 required evidence shapes present.
1---2name: project-interview3description: Build the human-approved project profile that complements /adapt-project discovery. Reads repository facts first, then interviews the user about purpose, maturity, critical workflows, risk posture, desired direction, intentional tradeoffs, known-bad legacy patterns, and do-not-break surfaces. Writes draft artifacts under reports/project-interview/scan-<TS>/ by default; durable .engineering/project/profile.yml, profile.md, and open-questions.md require --apply.4---56# /project-interview78Create the durable project profile that tells engineering-skills what9the project is trying to be. `/adapt-project` can discover facts, but it10cannot safely infer purpose, priorities, risk posture, intentional11tradeoffs, or whether a repeated pattern is healthy.1213The deliverable is a draft or applied profile:1415- `.engineering/project/profile.yml` — machine-readable, human-approved16 project intent.17- `.engineering/project/profile.md` — readable summary.18- `.engineering/project/open-questions.md` — unresolved questions agents19 should revisit.2021## How success is judged2223- The run writes a draft scan under24 `${ARTIFACT_ROOT}/reports/project-interview/scan-<TS>/` by default, or25 additionally writes `.engineering/project/` only when `--apply` was26 explicitly requested.27- `profile.yml`, `profile.md`, `open-questions.md`, and `evidence.json`28 exist in the same scan directory, and the final reply pastes the exact29 `evidence_gate.py check` output for that scan.30- The stock-selected skill resolves both helpers from its own `scripts/`31 directory and runs under isolated stdlib Python; no repository-level32 `scripts/`, toolkit venv, or sibling skill is required.33- `--no-host-write` runs never write inside `${PROJECT_ROOT}`. The34 command must use an `${ARTIFACT_ROOT}` outside the host project, and35 every later read/check uses that same artifact root.36- User answers are captured in the draft profile, or unresolved topics are37 left in `open-questions.md`; do not claim human approval without a38 visible user answer.3940## Forms4142```bash43/project-interview44/project-interview --project-root /path/to/repo45/project-interview --project-root /path/to/repo --artifact-root /private/tmp/adapt/foo --no-host-write46/project-interview --apply47```4849Default behavior writes a draft under50`reports/project-interview/scan-<TS>/`. `--apply` writes durable files51under `.engineering/project/`. `--no-host-write` is the dogfood mode and52requires `--artifact-root` outside the host project.5354## Pipeline55560. Resolve the installed skill and artifact roots for this run:5758 ```bash59 PROJECT_ROOT="${PROJECT_ROOT:-$(pwd)}"60 ARTIFACT_ROOT="${ARTIFACT_ROOT:-${PROJECT_ROOT}}"61 PYTHON_BIN="${PYTHON_BIN:-python3}"6263 if [ -n "${PROJECT_INTERVIEW_SKILL_DIR:-}" ]; then64 SKILL_DIR="${PROJECT_INTERVIEW_SKILL_DIR}"65 elif [ -f ".agents/skills/project-interview/SKILL.md" ]; then66 SKILL_DIR="$(cd .agents/skills/project-interview && pwd)"67 elif [ -f ".claude/skills/project-interview/SKILL.md" ]; then68 SKILL_DIR="$(cd .claude/skills/project-interview && pwd)"69 else70 echo "error: cannot find installed project-interview skill" >&271 exit 272 fi73 ```7475 If the user invoked `--no-host-write`, set `ARTIFACT_ROOT` to a76 directory outside `PROJECT_ROOT` before running the helper. Reuse the77 exact same `ARTIFACT_ROOT` for every later read and evidence gate.78791. Run repo-fact discovery to seed the interview:8081 ```bash82 SCAN_DIR="$("${PYTHON_BIN}" -I -S \83 "${SKILL_DIR}/scripts/project_interview.py" draft \84 --project-root "${PROJECT_ROOT}" \85 --artifact-root "${ARTIFACT_ROOT}")"86 ```8788 Add `--no-host-write` when the user requested it. The helper performs89 objective, lightweight discovery only and always writes an unapproved90 draft. Do not pass `--apply` here; durable apply happens only after91 visible human answers are captured and confirmed.92932. Read the printed scan directory:9495 ```bash96 test -d "${SCAN_DIR}" || { echo "missing scan: ${SCAN_DIR}" >&2; exit 2; }97 ```9899 Read `${SCAN_DIR}/profile.yml`, `${SCAN_DIR}/profile.md`, and100 `${SCAN_DIR}/open-questions.md`.1013. Ask only questions that cannot be answered from the repo and that102 materially change future agent behavior:103 - What is the project for, and who is it for?104 - Which workflows are correctness-critical?105 - Is this prototype, feature-shop, durable, or regulated work?106 - Where should agents slow down?107 - Which current patterns are intentional tradeoffs?108 - Which common current patterns are known bad and must not be109 standardized?110 - What should the project become next?1114. Update the profile draft with the user's answers if the run is112 interactive. Set `user_approved: true` only after visible answers and113 confirmation; repository facts never count as human approval. If the user114 is unavailable, keep `user_approved: false` and leave the answers as open115 questions. Update `profile.yml`, `profile.md`, and `open-questions.md`116 together so the evidence shapes describe the same state.1175. Run the evidence gate:118119 ```bash120 "${PYTHON_BIN}" -I -S "${SKILL_DIR}/scripts/evidence_gate.py" check \121 --skill project-interview \122 --scan-dir "${SCAN_DIR}"123 ```124125 Paste the gate output in the final reply. A claim that the artifacts126 exist is not enough.1276. If and only if the user invoked `--apply`, the evidence gate passed, and128 the visible answers support `user_approved: true`, apply the three profile129 artifacts:130131 ```bash132 "${PYTHON_BIN}" -I -S \133 "${SKILL_DIR}/scripts/project_interview.py" apply \134 --project-root "${PROJECT_ROOT}" \135 --scan-dir "${SCAN_DIR}"136 ```137138 `--apply` and `--no-host-write` are mutually exclusive intents. The helper139 refuses apply while `user_approved` is not true and rejects a symlinked140 `.engineering/project` destination.141142## How Future Skills Use The Profile143144- `/which-skill` tunes recommendations by maturity and risk posture.145- Planning skills treat critical workflows and intentional tradeoffs as146 prior constraints.147- `/adapt-project --apply` should prefer user-approved profile entries148 over inferred facts.149- `/prevent-regression` prioritizes guards for do-not-break surfaces.150- `/engineering-fitness` can grade profile completeness once that skill151 ships.152153## Vibe-Coded Or Legacy Projects154155The interview must explicitly ask what **not** to standardize. In a156messy project, repeated patterns are often scars, not examples. Capture157those under `open-questions.md` or the profile's standardization policy158so future agents do not turn accidental consistency into doctrine.159160## When things go sideways161162| Symptom | Action |163|---|---|164| `--no-host-write` fails because the artifact root is inside the project | Stop, choose an artifact root outside `${PROJECT_ROOT}`, and rerun; do not retry without `--no-host-write` |165| The draft helper exits 2 | Paste stderr, fix the invocation or write-mode conflict, and do not claim a profile was produced |166| The printed scan directory is missing | Stop and report the printed path; do not fall back to a repo-local reports directory |167| Evidence gate reports missing tokens | Leave the run incomplete; name the missing token and scan directory in the user reply |168| User is unavailable for interview answers | Keep the generated draft and move unanswered items to `open-questions.md`; do not mark the profile approved |169| Apply reports `user_approved is not true` | Keep the draft, ask for the missing human answers or confirmation, and never flip approval from repository inference |170| `--apply` was requested but durable `.engineering/project/` writes fail | Keep the draft scan as evidence, paste the write failure, and do not claim durable profile files were written |171172## Replay case173174For artifact-root or evidence-gate changes, replay the dogfood form with a175temporary artifact root:176177```bash178ARTIFACT_ROOT="$(mktemp -d)"179PROJECT_ROOT="$(git rev-parse --show-toplevel)"180SKILL_DIR="${PROJECT_INTERVIEW_SKILL_DIR:-${PROJECT_ROOT}/.claude/skills/project-interview}"181PYTHON_BIN="${PYTHON_BIN:-python3}"182SCAN_DIR="$("${PYTHON_BIN}" -I -S \183 "${SKILL_DIR}/scripts/project_interview.py" draft \184 --project-root "$(git rev-parse --show-toplevel)" \185 --artifact-root "${ARTIFACT_ROOT}" \186 --timestamp project-interview-smoke \187 --no-host-write)"188"${PYTHON_BIN}" -I -S "${SKILL_DIR}/scripts/evidence_gate.py" check \189 --skill project-interview \190 --scan-dir "${SCAN_DIR}"191```192193The replay passes only when the helper prints the scan directory under194`${ARTIFACT_ROOT}` and the evidence gate prints `OK: 3/3 required evidence195shapes present.`