position
Original:🇺🇸 English
Translated
Bootstrap the session into a team position. Loads the position profile from `ai-workspace/team/<name>.md`, loads sibling state directory if present (PLAYBOOK + DECISIONS), runs the position's session-start sequence. Use when a teammate session needs to assume a persistent role identity.
15installs
Sourcecamacho/ai-skills
Added on
NPX Install
npx skill4agent add camacho/ai-skills positionTags
Translated version includes tags in frontmatterSKILL.md Content
View Translation Comparison →/position — load a team position into the session
/position <name>ai-workspace/team/<name>.md/tpm/position tpmPosition vs role
- Position = persistent identity, loaded once per teammate session. Lives in . Examples:
ai-workspace/team/<name>.md,tpm,software-engineer,technical-editor.architect - Role = one-shot activity dispatched at a step. Lives in
/task. Examples:ai-workspace/agents/<name>.md,implementer,code-reviewer,test-writer.explorer
/positionAgent({subagent_type: <role-name>})AGENTS.md1. Resolve position
bash
NAME="<arg>"
PROFILE="ai-workspace/team/${NAME}.md"
STATE_DIR="ai-workspace/team/${NAME}"Pre-flight: if does not exist, refuse with:
$PROFILEPositionnot found at<name>. Available positions: list them by runningai-workspace/team/<name>.md. (For one-shot subagent role dispatch instead, use your tool's role-dispatch mechanism — Claude Code:ls ai-workspace/team/*.md.)Agent({subagent_type: <role>})
Do not auto-bootstrap. Absence is a signal to verify the environment.
2. Load profile + state
Read in order. Load all files into context first, then reason — do not summarize as you read.
- (required) — the position's role identity, working agreement, decision rules, triggers, anti-patterns, lifecycle hooks.
$PROFILE - (if exists) — the position's operating manual.
${STATE_DIR}/PLAYBOOK.md - (if exists) — the position's append-only judgment log.
${STATE_DIR}/DECISIONS.md
Most positions have NO sibling state directory — only stateful positions (currently just ) do. The skill silently skips state-load when the directory is absent.
tpm3. Regenerate live state (if profile prescribes it)
The position's profile body specifies whether/how to regenerate live state on session start. Common patterns:
- TPM: +
gh project item-list+git worktree listgh pr list - Software-engineer: tail chat + read
#generalif resuming.branch-context.md - Technical-editor: tail chat for review requests
#general
Follow the profile's section verbatim. The skill doesn't prescribe regeneration steps — the profile owns them.
## Session lifecycle / Session start4. Acknowledge + take the position
After load + bootstrap:
- Acknowledge:
Position '<name>' loaded. Following profile session-start instructions. - Hold the position for the rest of the session — the agent operates as according to profile rules until session end.
@<name> - Chat handle (if the position's chat substrate is online): post the registration message the profile prescribes.
5. --resume
flag (optional)
--resume/position <name> --resume- Read if present (per the position's profile resume convention)
.branch-context.md - Skip the registration chat post (the position is presumed already known to the team)
- Pick up where the prior session left off
If the profile has no resume semantics, is a no-op silently.
--resume6. Switching positions
A session can switch positions by re-invoking . Latest wins. Profile rules from the prior position drop. Exception: the position has a unidirectional refusal contract (enforced by the wrapper skill, where installed) — switching out of TPM mid-session is refused per its own rules.
/position <other>tpm/tpmAnti-patterns
| Anti-pattern | Why wrong |
|---|---|
Reading from | That's the role directory (subagents). Positions live in |
| Auto-bootstrapping a missing position | Refusal is the contract — positions must be defined first |
| Soft-loading just the profile without the state dir | Stateful positions need both; skipping state breaks continuity |
| Summarizing the profile as you load it | Load first, reason second — same as |
Treating | Roles are not positions; refuse and direct to your tool's role-dispatch mechanism (Claude Code: |
Invocation forms
- — load position, run bootstrap
/position <name> - — same, but resume semantics if the profile defines them
/position <name> --resume
Wrapper skills
A position can ship with a sibling wrapper skill that adds position-specific lifecycle behavior on top of . Wrappers are optional — always works directly. If a wrapper is installed alongside in the same skills repo, prefer the wrapper for the position it covers (it handles position-specific contracts the generic loader can't).
/position/position <name>/positionExample: (where shipped as a separate skill) is the wrapper for the position — it invokes and adds a unidirectional refusal contract. If is not installed in your environment, use directly; the position loads cleanly without the wrapper, just without the refusal-contract enforcement.
/tpmtpm/position tpm/tpm/position tpmQuick reference
| Step | Action | On failure |
|---|---|---|
| 1 | Resolve | Refuse with available positions list |
| 2 | Read profile + state dir | Silently skip state if dir absent |
| 3 | Regenerate live state per profile | — |
| 4 | Acknowledge + hold position | — |
| 5 | Honor | No-op if profile has no resume semantics |
| 6 | Switch positions on re-invoke | Refuse for unidirectional positions (tpm) |