Appearance
FAQ & Anti-Patterns
How-to. Frequent questions and the mistakes the design tries to prevent. For the underlying why, see Concept Overview and the ADRs.
Concepts
Why is "phase" the same thing as "milestone"?
Slash-commands keep the word "phase" for backwards compatibility (np:plan-phase, np:discuss-phase, np:execute-phase). Internally, phase = milestone. /np:plan-phase 1 plans milestone M001 entirely. New code paths use "milestone" exclusively. The mismatch is intentional — renaming the slash-commands would break every project's muscle memory.
Why three execution levels (Milestone → Slice → Task) instead of four?
ADR-0003 caps the ontology. A four-level hierarchy with a separate "wave" entity duplicates work — slice and wave are the same concept. The planner decides parallelism by deciding which slice a task goes into; there is no second hierarchy level.
Why one commit per task, not one per slice?
ADR-0004. One commit per task makes /np:undo, /np:undo-task, and /np:reset-slice mechanical git revert operations rather than heuristic search jobs. A slice-level commit would force the undo machinery to parse diffs.
Why doesn't the agent commit on its own?
The executor does commit — but exclusively through np-tools.cjs commit-task <M-S-T>. That wrapper runs the gitignore-guard, formats the commit message canonically, deletes the checkpoint, and flips task frontmatter to done. A bare git commit from the agent would skip all of that and break the undo invariants.
Why no daemon?
ADR-0001. nubos-pilot is a payload of Markdown + .cjs helpers that the host CLI invokes inline. No background process means no service discovery, no port collisions, no dangling state on kill -9. Concurrency safety comes from O_EXCL lockfiles in lib/core.cjs::withFileLock.
Workflow questions
Should I always run np:research-phase?
No. Research is optional. Skip it when the milestone is purely additive in a stack you already know (e.g. "add another endpoint to an existing API"). Run it when the milestone introduces an unfamiliar dependency, a security-sensitive surface, or a stack the planner needs to learn before writing the plan.
Should I always run np:architect-phase?
No, this one is more selective. Run it when:
- the milestone introduces structural change (new module, new boundary, new data flow),
M<NNN>-CONTEXT.mdcarriesarchitecture_review: required,M<NNN>-RESEARCH.mdflagged ≥ 3[ASSUMED]claims in the architecture-patterns dimension.
For purely additive milestones the planner handles structure inline; the extra step is overhead.
What if np-plan-checker keeps returning issues_found?
The loop is bounded at 2 iterations. After that, control returns to you. Open M<NNN>-PLAN-REVIEW.md and read the findings. The most common cause is a gap in M<NNN>-CONTEXT.md — a missing decision the planner has no way to make. Re-run /np:discuss-phase <N> (Append-update mode) to lock the missing decision, then /np:plan-phase <N>.
What if a task fails verification?
Three options, in order of preference:
- Fix in scope. Spawn
np-build-fixer(manual — there is no/np:fix-buildslash-command yet) with the failing task's payload. It classifies the failure, proposes a minimal patch insidefiles_modified, re-runs verify. Hard-capped at 3 attempts. - Fix manually. Edit the files yourself, then
/np:resume-workto pick up where the executor left off. - Reset and re-plan. If the failure reveals a planning gap (the task was wrong-shaped),
/np:reset-sliceto discard, fix the task PLAN, re-run/np:execute-phase.
When do I run /np:add-tests?
After /np:verify-work reports Pass for the SCs you want to lock as regression tests. The command persists those Pass-cases as node:test UAT files under test/uat/m<nnn>-<slug>.test.cjs. Sentinel-preserving — your hand-written tests survive regeneration.
How does /np:propose-milestones differ from /np:new-milestone?
/np:new-milestoneappends one milestone you describe./np:propose-milestonesre-examines the whole open pipeline against the current PROJECT.md + REQUIREMENTS.md and proposesadd/update/removeoperations. Use it after a major requirement shift, not for routine append.
Anti-patterns
Don't put the same task in two slices "to be safe"
Tasks within a slice are parallel; cross-slice deps flow forward only. Putting T0001 in both S001 and S002 either (a) creates duplicate commits or (b) the second one no-ops. Either way, the plan-checker flags it. If two milestones genuinely need the same work, model it as a cross-slice depends_on, not a duplicate.
Don't edit roadmap.yaml by hand mid-plan
Use /np:propose-milestones, /np:new-milestone, or update-phase-meta. The yaml is parsed under a lock; hand-edits during a workflow run can race the parser. After-the-fact corrections are fine if no workflow is mid-flight.
Don't add model or model_profile to agent frontmatter
Forbidden by D-09. Concrete model selection is tier-based and resolved at spawn time by np-tools.cjs resolve-model. Embedding a literal model id breaks portability across runtimes.
Don't add hooks to agent frontmatter
Same reason. Hooks are runtime-specific (Claude Code ≠ Codex ≠ Gemini); they live in the runtime-adapter layer, not in the portable agent contract.
Don't put a host-specific prompt call in workflow Markdown
check-workflows.cjs lints for this. Use node np-tools.cjs askuser --json '{…}' exclusively — the capability layer routes through whatever the host CLI exposes.
Don't git revert task commits manually
Use /np:undo-task or /np:undo. The slash-commands also reset task frontmatter to pending so the next /np:execute-phase picks them up. A bare git revert leaves the frontmatter as done, and the next plan run sees a phantom completed task.
Don't rm -rf .nubos-pilot/ to "start fresh"
That destroys all your plans, decisions, history, and metrics. To uninstall the tool, use npx nubos-pilot uninstall — it removes the install payload but preserves .nubos-pilot/. To clear state for a specific milestone, /np:undo <N> followed by editing roadmap.yaml.
Don't set agents.parallelization: false to "make execution safer"
The kill-switch exists for constrained environments (single-thread CI, rate-limited model APIs). On a normal dev machine, parallel execution within a slice is the whole point of slice-as-wave. Turning it off makes a 5-task slice take 5× longer for no safety benefit — atomicity is per-task, not per-slice.
Don't disable the plan-checker to "save time"
agents.plan_checker: false skips the adversarial review loop. The two iterations cost ~2 minutes; catching an unbounded-scope task before execution saves hours. Disable only when you are confident the planner output is correct (e.g. you're re-running /np:plan-phase --repromote after a fix).
Don't expect agents to spawn other agents
The orchestration graph is one level deep by design. Workflows orchestrate; agents read, write, reason, and exit. If you find yourself wanting an agent to spawn a sub-agent, the right shape is a workflow that runs both in sequence.
Configuration
Where is agent_skills documented?
config.json can carry an agent_skills map (e.g. { "np-researcher": ["nubos-research-skill"] }) that lists additional skill files an agent should load at spawn time. The map is read by np-tools.cjs agent-skills <name> and consumed by the workflow when building the spawn prompt. See Agent skills.
Should I commit config.json?
Yes. It captures runtime, model_profile, response_language — project-wide settings the team needs to share. Sensitive values (API keys, tokens) should never live there; use environment variables or your runtime's secret store.
Should I commit .nubos-pilot/state/?
No. Everything under state/ is ephemeral derived cache (knowledge-index.json, session-snapshot.json). Add .nubos-pilot/state/ to .gitignore if your generator hasn't already.
Multi-runtime
Can I install for several runtimes at once?
Yes. npx nubos-pilot --agents claude,codex,cursor installs payload + managed-block for all three. The tool maintains separate manifest files per runtime path; update and uninstall walk all of them.
What happens when I switch runtimes mid-project?
The .nubos-pilot/ Project-State tree is runtime-agnostic. Re-run npx nubos-pilot --agent <new> to lay down a fresh payload; your plans and decisions survive untouched.
Does /np:doctor check all installed runtimes?
It checks the runtime that detect-runtime resolves to. To verify a different one, set runtime in config.json first or invoke from inside that host CLI.
