Skip to content

docs(deploy): two-phase deploy_component, revert_component, stage/activate CLI (draft) - #599

Open
dawsontoth wants to merge 7 commits into
mainfrom
claude/two-phase-deploy-docs
Open

docs(deploy): two-phase deploy_component, revert_component, stage/activate CLI (draft)#599
dawsontoth wants to merge 7 commits into
mainfrom
claude/two-phase-deploy-docs

Conversation

@dawsontoth

Copy link
Copy Markdown
Contributor

Draft. Documentation companion to the two-phase deploy work in HarperFast/harper#1849 (also a draft). Tracks that PR — the API surface there is still settling (the ops fold landed; the team is finalizing before de-draft), so hold merge until #1849 lands and pin the version badges to the shipping release.

What this documents

The deploy_component operation now runs as a two-phase, cluster-wide deploy, and there are new operator-facing knobs plus a rollback operation. This PR updates the reference docs to match.

reference/operations-api/operations.md

  • deploy_component — documents the internal stage → cluster-wide barrier → activate flow (all-or-nothing at go-live), and the new properties:
    • activate: false — stage-and-stop; returns a staged deployment_id, nothing goes live.
    • deployment_id — activate a previously-staged deployment (no re-fetch/install).
    • revert_on_failure, two_phase, ignore_replication_errors, deployment_timeout.
    • Worked examples for a normal deploy and for stage-now / activate-later.
  • revert_component (new section) — fast cluster-wide rollback to the retained previous version; bidirectional; customer-driven-rollback use case.
  • Deployment lifecycle — updated phase names (stage/activate, legacy prepare/replicate), the new statuses (staging/staged/activating/rolled_back), and staged-build retention (deployment_stagingRetention_maxCount, default 5) with the "aged-out deployment_id" caveat.

reference/cli/operations-api-commands.md

  • Added harper stage, harper activate, and harper revert to the alias table and the aliases list, with examples in Component Operations.

Notes for review

  • Version badges use v5.2.0 as a placeholder — confirm against the actual shipping release before merge.
  • I did not touch the reference_versioned_docs/version-v4/ copies (this is a v5 feature).
  • No new config-reference page was added for deployment_stagingRetention_maxCount; it's described inline where deployments are documented, matching how deployment_payloadRetention_maxSize is currently surfaced. If you'd prefer a dedicated configuration entry, happy to add one.

🤖 Generated with Claude Code

…ivate CLI

Document the two-phase deploy behavior and the new surface from HarperFast/harper#1849:

- deploy_component: cluster-wide stage -> barrier -> activate; new properties
  activate:false (stage-and-stop, returns a staged deployment_id), deployment_id
  (activate a previously-staged deployment), revert_on_failure, two_phase, and
  the ignore_replication_errors / deployment_timeout knobs.
- revert_component: fast cluster-wide rollback to the retained previous version.
- Deployment lifecycle: stage/activate phase names, staged/staging/activating/
  rolled_back statuses, and staged-build retention (deployment_stagingRetention_maxCount).
- CLI: harper stage / activate / revert verbs (aliases + examples).

Companion to HarperFast/harper#1849 (still a draft).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request updates the documentation for the CLI and Operations API to reflect the new two-phase deployment process (staging and activation) and the rollback mechanism (revert_component). It introduces new CLI commands, aliases, API parameters, and examples. The review feedback suggests improving consistency by pointing the new CLI operation category links to the main #components section, and enhancing readability in the API documentation by adding clear labels to the multi-step "Stage now, activate later" JSON examples.

Comment thread reference/cli/operations-api-commands.md Outdated
Comment thread reference/operations-api/operations.md
@github-actions
github-actions Bot temporarily deployed to pr-599 July 21, 2026 14:32 Inactive
@github-actions

Copy link
Copy Markdown

🚀 Preview Deployment

Your preview deployment is ready!

🔗 Preview URL: https://preview.harper-documentation.harperfabric.com/pr-599

This preview will update automatically when you push new commits.

…tage/activate example

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@github-actions
github-actions Bot temporarily deployed to pr-599 July 21, 2026 14:42 Inactive
@github-actions

Copy link
Copy Markdown

🚀 Preview Deployment

Your preview deployment is ready!

🔗 Preview URL: https://preview.harper-documentation.harperfabric.com/pr-599

This preview will update automatically when you push new commits.

@dawsontoth
dawsontoth marked this pull request as ready for review July 29, 2026 17:53
@dawsontoth
dawsontoth requested a review from a team as a code owner July 29, 2026 17:53
Conflict in reference/operations-api/operations.md was additive: main added the
`credentials` parameter plus its "Deploy credentials" section (#581) where this
branch adds the two-phase parameters. Kept both — the parameter list now carries
activate/deployment_id/revert_on_failure/ignore_replication_errors/
deployment_timeout/two_phase AND credentials, followed by main's credentials
section. main's get_deployment_payload / delete_deployment_payload docs (#600)
are untouched.
… values

Documents harper-pro#594 and syncs with harper#1849's latest behavior.

add_ssh_key `generate: true` (harper-pro#594):
- Harper mints the ed25519 keypair on the node and returns only `public_key`,
  so the private key is never carried in a request body, shell history, or CI
  log. Includes the response shape and the `harper:<name>` comment.
- `key` and `generate` are mutually exclusive; ssh-keygen must be on PATH.
- Notes that `public_key` is returned ONLY on the generating call — Harper does
  not retain it, and update_ssh_key requires a key you supply (it cannot mint
  one), so the recovery path is delete_ssh_key + add_ssh_key generate again.
- CLI example added alongside the deploy/stage/activate/revert examples.

Payload retention (harper#1849):
- Splits the old one-line aside into its own subsection with a table covering
  both bounds: payloadRetention_maxSize (10 MiB, bounds a single payload) and
  the new payloadRetention_maxCount (default 1, bounds how many are kept per
  project). Explains why the default is conservative, that rows are never
  deleted, and that a reclaimed payload reports payload_blob_present: false.

Also:
- revert_on_failure / ignore_replication_errors now note they apply to a
  `deployment_id` activate too, matching the peer-failure gate added to that
  path.
- list_deployments `status` listed only 5 of 13 real values; replaced with
  terminal vs in-flight groupings.
- New note on restartRequired: deploying a brand-new component without a
  restart marks one as required (per node), while redeploying a live component
  does not.
@github-actions

Copy link
Copy Markdown

🚀 Preview Deployment

Your preview deployment is ready!

🔗 Preview URL: https://preview.harper-documentation.harperfabric.com/pr-599

This preview will update automatically when you push new commits.

@github-actions
github-actions Bot temporarily deployed to pr-599 July 29, 2026 18:03 Inactive
…cument them

The SSH rows linked to #certificate-management, but the SSH operations are
documented under ## Components — so every one of those seven links landed the
reader in the wrong section. Repointed them to #components (the convention the
other 15 component rows already use).

Auditing the same block turned up the identical defect on the six user/role rows
(list_users, add_user, alter_user, drop_user, list_roles, drop_role), which are
documented under ## Users & Roles. Repointed those to #users--roles, matching the
existing link to that section elsewhere in the docs.

The five genuine certificate rows (create_csr, sign_certificate,
list_certificates, add_certificate, remove_certificate) were already correct and
are unchanged. Category labels updated to match their new targets.

Verified every operations.md anchor referenced from this table against the real
headings — all 11 resolve.
@github-actions

Copy link
Copy Markdown

🚀 Preview Deployment

Your preview deployment is ready!

🔗 Preview URL: https://preview.harper-documentation.harperfabric.com/pr-599

This preview will update automatically when you push new commits.

Builds on the two-phase deploy docs (#599) to cover the rest of the
deploy-by-reference workflow.

reference/components/applications.md
- "Deploying by Reference" — `harper deploy by_ref=true`, `ref=`, `credential=`.
  Explains why a reference pins to a resolved SHA rather than the tag or branch
  name typed: peers resolve the package independently, so a tag that moves
  mid-deploy could otherwise leave nodes running different code. Notes that the
  cluster clones the pushed remote, and that by-reference means the cluster
  builds from source — so an app whose build can't run on the node should stay
  on payload deploys.
- "Provisioning a Deploy Credential" — `harper deploy setup=true`, the
  client-side sealing flow, and that reverting to the previous version needs no
  credential at all.

reference/cli/authentication.md
- Documents HARPER_CLI_REFRESH_TOKEN / HARPER_CLI_OPERATION_TOKEN and adds
  "Token credentials for CI/CD", so the CI guidance is no longer "put an admin
  password in your pipeline". Covers precedence, in-memory-only refresh, and
  token lifetimes (1d / 30d defaults).
- Warns that a user holds only ONE valid refresh token at a time: issuing a new
  one invalidates the last, so a routine local `harper login` silently breaks a
  pipeline using the same account. Hence the recommendation to give CI its own
  user. (Verified against security/tokenAuthentication.ts, which stores a single
  hashed refresh_token per user record.)

reference/cli/commands.md
- `harper login --for-ci`, including the stdout/stderr split that makes
  `| gh secret set --env-file -` work without displaying the token.

reference/security/secrets.md
- Points the existing private-source deploy credentials section at the CLI flow
  that automates it.

Documents HarperFast/harper#1850, #1851, and #1876. Verified every anchor link
in the changed files resolves (16 checked).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@dawsontoth

Copy link
Copy Markdown
Contributor Author

Opened #616 stacked on this branch: docs(deploy): by-reference deploys, sealed credentials, CI token auth.

It targets claude/two-phase-deploy-docs rather than main, so its diff shows only the new material (+139, no deletions, no overlap with this PR). Merge this one first and #616 retargets to main automatically.

Where the two meet: this PR documents the two-phase deploy and revert_component; #616 documents how you point a cluster at a specific commit in the first place (harper deploy by_ref=true), how it authenticates to a private source (harper deploy setup=true), and how CI authenticates to the cluster (harper login --for-ci + HARPER_CLI_REFRESH_TOKEN). It leans on your revert_component section for the point that a rollback to the previous version needs no credential at all.

Comment thread reference/operations-api/operations.md Outdated
Comment thread reference/operations-api/operations.md
Comment thread reference/operations-api/operations.md Outdated
Comment thread reference/operations-api/operations.md Outdated
Comment thread reference/operations-api/operations.md Outdated
Comment thread reference/cli/operations-api-commands.md
…vert caveat

Addresses cb1kenobi's review on #599.

- "Terminal" wrongly included `staged`. The implementation's TERMINAL_STATUSES is
  {success, failed, rolled_back} and that set gates get_deployment_payload and
  payload-pruning eligibility, so listing `staged` as terminal contradicted the
  get_deployment_payload section. Split into Terminal / Resting / In flight, and
  noted why a resting payload is deliberately still held.
- get_deployment's `status` row listed 7 of 13 values; now lists all, pointing at
  the grouped explanation.
- The `restart: "rolling"` example's response showed the no-restart message.
  Corrected to the rolling shape (restartJobId + ", restarting Harper") and noted
  what the no-restart response looks like instead.
- revert_component: added a caution that reverting swaps live directories and does
  NOT rewrite the stored `package:` reference, so a node provisioned after a revert
  installs the reverted-away version. Verified in code: revertComponent never calls
  writeComponentRootConfig, and installApplications() installs from root config.
- deployment_id activate: documents that the staged package identifier and
  credential references are recovered and persisted at activation (fixed in
  harper#1849), so `package` need not be repeated on the activate call.
@github-actions

Copy link
Copy Markdown

🚀 Preview Deployment

Your preview deployment is ready!

🔗 Preview URL: https://preview.harper-documentation.harperfabric.com/pr-599

This preview will update automatically when you push new commits.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants