Skip to content

Quickstart

Doc type: Tutorial  ·  Applies to: POSE 7.x

Install

Fast path — Linux and macOS

Run the installer from the root of the Git repository that should receive the POSE contract:

curl -fsSLO https://github.com/oseiaspereira88/pose/releases/latest/download/install.sh && bash install.sh

The script resolves the latest release for the current OS and architecture, installs pose into ~/.local/bin and runs pose install . plus the final strict gate when the current directory is a Git repository. Ensure ~/.local/bin is on PATH, then confirm the installation:

pose version
pose doctor

The one-liner tracks latest and optimizes first-time adoption. It relies on HTTPS but does not independently verify the downloaded archive's checksum or Sigstore identity. Use the pinned flow below when reproducibility or supply-chain verification is required.

Verified install

Download the release archive for your OS and architecture from the release assets, together with that release's checksums.txt. Verify its SHA-256 before executing it. For example, on Linux amd64:

V=7.4.1
curl -fsSLO "https://github.com/oseiaspereira88/pose/releases/download/v${V}/pose_${V}_linux_amd64.tar.gz"
curl -fsSLO "https://github.com/oseiaspereira88/pose/releases/download/v${V}/checksums.txt"
sha256sum --check --ignore-missing checksums.txt
tar -xzf "pose_${V}_linux_amd64.tar.gz" pose

Continue only if verification succeeds. Put the verified binary on PATH. On macOS, compute shasum -a 256 <archive> and compare it with the exact archive's line in checksums.txt; on Windows, use Get-FileHash -Algorithm SHA256. Select the corresponding darwin or windows release asset. Then install the repository contract:

# with the native binary on PATH:
pose install /path/to/your/repo

# or from a release bundle containing install.sh beside the pose binary:
bash install.sh /path/to/your/repo

The installer copies workflows, rules, templates and skills, derives {{PROJECT_NAME}}/{{PROJECT_ID}} from your directory name (override with --project-name / --project-id), configures the same binary as the MCP server, stamps the contract schema version and finishes with native init, index and check --strict — installation only reports success if the gate is green.

The published release archive is accompanied by SHA-256 checksums, keyless Sigstore signatures, a CycloneDX SBOM and SLSA provenance. Use the release's own checksums.txt before placing the binary on PATH; package-manager channel support and its current limits are documented in Package channels.

Useful flags:

Flag Effect
--locale pt-BR Install docs and templates in Brazilian Portuguese
--force Overwrite an edited AGENTS.md/POSE.md on re-run
--skip-mcp Skip creating the project MCP binding; the binary still includes the server
--allow-non-git Install into a non-git directory (not recommended)

Re-running the installer updates the machinery and never touches your instance content (specs, ADRs, knowledge, reports, roadmaps). Custom rules, workflows and templates you added are preserved.

For Sigstore signature and provenance verification, follow the release verification contract. A checksum comparison establishes byte integrity; authenticating the signing workflow is a separate check.

Detect your stacks

pose init --wizard        # interactive; --yes accepts all suggestions

The wizard detects modules by stack markers (go.mod, package.json, Cargo.toml, pom.xml, build.gradle) and seeds them into the validation matrix in tolerant mode — promote to strict when the checks stabilize.

The first governed delivery

This is the whole point of the quickstart: not to show you twenty commands, but to walk one piece of work through the lifecycle every later spec follows — and to watch each gate refuse for a reason you understand, and then pass. Every command below is the one a project runs; no status is edited by hand. tests/quickstart/first-governed-loop.sh runs this page in CI and asserts the outputs shown.

An all-green run would not show you anything. Any tool can agree with you.

Time budget. Installing the current release and running the documented loop takes about 8 seconds of machine time, measured on a clean container by tests/quickstart/measure-clean-environment.sh. That excludes preparing the machine, reading this page and writing your own spec, which is where a first real use spends its time.

Chapter 1 — Set up

pose install ends by naming the next step:

[pose-install] next: `pose setup` — identity, the commit gate and capability decisions, one confirmed step at a time
pose setup

pose setup shows what is in force, what is new and what is missing, with one next step. On a fresh install it asks for a maintainer: a request addressed to the maintainer has nobody to answer it until someone holds the role. Register yourself with a key — your git identity only suggests the name; the key is the proof:

pose identity add --key ~/.ssh/id_ed25519_sk.pub --role maintainer --apply
pose hooks install
git add -A && git commit -m "Adopt POSE" -m "POSE-Spec: pose-onboarding"
pose doctor
identity.suggested=human:you (from git user.email; a name, not a proof — the key is the proof)
identity.presence=proves presence: every signature records whether the security key was touched
...
doctor: 0 error(s), 0 warning(s), 1 next step(s)

A security key (ssh-keygen -t ed25519-sk) is preferred for a person; a plain ssh-keygen -t ed25519 key works and pose doctor says it cannot prove presence. The install also scaffolded .pose/specs/<date>-pose-onboarding.md, which tracks these steps as governed work.

Chapter 2 — The entry gate

pose new-spec customer-export
pose lint-spec customer-export --ready-check
Spec created: .pose/specs/2026-09-07-customer-export.md (status: draft)
[ERROR] customer-export: DoR: section Intent is missing, empty, or skeletal
spec.ready=false

The spec exists, but nothing about it is decided yet. POSE will not let work start against a spec that has not said what it is for. Fill the Intent, one acceptance criterion with a stable ID, and the files the work will touch:

### Goal
Export customer records as CSV for audit.

### Business value
Auditors currently request exports by hand.
- R1: The exporter shall write customer records as CSV.
### Artifacts
- created: svc/export.go
- created: svc/export_test.go
pose lint-spec customer-export --ready-check     # spec.ready=true

Chapter 3 — Start, implement, prove

pose start spec:customer-export                  # preview: start.ready=true, start.digest=...
pose start spec:customer-export --apply --digest <start.digest>
git add -A && git commit -m "Start customer-export" -m "POSE-Spec: customer-export"

pose start moves the spec to in-progress and records the baseline the work is reconciled against. Implement, then run your repository's declared checks — the commands in the validation matrix, not ones POSE invented — and commit with the spec's trailer so the change set is attributed to it:

pose suggest feature          # the workflow, skill, rules and checks for this kind of work
pose validate --strict
git add -A && git commit -m "Export customers as CSV" -m "POSE-Spec: customer-export"

Chapter 4 — A decision the agent cannot take alone

Midway, the agent hits a question only the maintainer can answer. It does not guess; it opens an action request that restricts what the answer affects:

pose action open --origin spec:customer-export --kind decision \
  --question "Include inactive customers in the audit export?" \
  --option "include=Auditors see every customer" --option "exclude=Inactive customers are left out" \
  --recommend include --recipient-role maintainer --requested-by agent:impl \
  --target requirement:R1 --effect closeout:block --apply
pose state --attention --actor maintainer       # the request waits on the maintainer
pose close spec:customer-export                 # refused: 1 action request(s) restrict closeout

The maintainer answers with a signature from the key they registered; POSE verifies it offline and keeps it in the journal:

pose action resolve <act-id> --actor human:you --answer include \
  --request-digest <digest> --expected-revision 1 --idempotency-key answer-1 \
  --sign ~/.ssh/id_ed25519_sk --apply
pose action show <act-id>
action.answer=include by human:you (verified)
action.signature=SHA256:... (presence asserted), re-verified from the journal

An agent can relay the same answer over MCP with pose_action_resolve, which records only an answer the principal signed.

Chapter 5 — The exit gate, review and close

pose close spec:customer-export --apply --reviewer agent:reviewer
closeout_plan.step.trace=blocked — requirement trace incomplete: R1 has no trace entry — declare each under `### Requirement trace`, e.g. `- R1 [satisfied] test:<TestName>` ...

Read that line slowly, because it is the product in one line. The checks passed and the decision is answered — POSE is not disputing your code. It is pointing out that R1, the thing you promised, is not connected to any evidence that it happened. "Done" is a claim by whoever executed; POSE requires it to be a property of the repository. Connect the promise to the proof and commit:

### Requirement trace
- R1 [satisfied] test:TestCustomerExportWritesCSV
git add -A && git commit -m "Trace R1 to its test" -m "POSE-Spec: customer-export"
pose close spec:customer-export --apply --reviewer agent:reviewer

This time pose close regenerates the evidence, indexes and seals the review bundle, then stops for what only a reviewer can conclude — and prints the attest command already filled with the sealed evidence and the required tools:

closeout_plan.stopped=waiting on a reviewer: ...
closeout_plan.attest=pose review attest rvb-... --reviewer <id> --decision approved --evidence unit:svc/go/test --tool 'artifact-check|-|passed|check:artifact|' ... --criterion 'security|passed|unit:svc/go/test|<your conclusion>' --apply

The reviewer writes each conclusion, runs it, and the plan resumes:

pose close spec:customer-export --resume
closeout_plan.result=closed spec:customer-export; commit the closeout (spec, index, results, bundle, attestation) in one commit with its POSE-Spec trailer

That is a governed delivery: an entry gate that refused to start under-specified work, a recorded start, real repository checks, a decision the maintainer proved, an exit gate that refused to close until every promise pointed at evidence, and a review bound to a sealed subject.

If a requirement turned out not to apply, you say that instead — [waived: <reason>] or [withdrawn: <reason>]. What you cannot do is stay silent, which is the option most processes leave open.

See the first analytics

Recognized CLI/MCP activity is observed automatically and locally. The query does not count itself:

pose usage --since-days 30
pose adoption-metrics --json

These are product usage and adoption signals. They do not infer deployment outcomes. To measure delivery, ingest explicit deployment/incident events and run pose dora-metrics; see Analytics and delivery metrics.

Keep it healthy

pose check --strict       # structural integrity + graphs + schema version
pose validate --tolerant  # run the validation matrix
pose followups --open     # live backlog from all specs
pose setup                # what is in force, new and missing; the next step
pose update               # migrate the contract; asks about new capabilities in a review spec
pose hooks install        # pre-commit check + post-merge reindex

Requirements: Git plus Bash for the one-liner, or the native pose binary for the verified/manual path. The POSE runtime itself needs no Bash or Python. Platforms: Linux, macOS and Windows.