Skip to content

Move the Harper Pro reference pages and 5.4 release notes into docs/ - #1237

Merged
kriszyp merged 25 commits into
mainfrom
kris/docs-in-repo
Nov 5, 2026
Merged

kriszyp merged 25 commits into
mainfrom
kris/docs-in-repo

Conversation

@kriszyp

@kriszyp kriszyp commented Nov 3, 2026 •

Copy link
Copy Markdown
Member

Kyle files the replication and firewall manuals under the map of server towers.

⊙ Problem

Harper Pro features are documented in HarperFast/documentation, so a user-facing change here needs a companion docs PR and a companion-check gate. Some core reference pages also mix in Harper Pro sections, which harper-pro changes cannot edit without a harper PR.

🤔 Should Harper Pro's reference pages live here?

Proposed yes, alongside the harper PR that moves the core reference into harper. The alternative is keeping Pro pages in harper, which leaves about 10% of changes needing a companion PR.

💡 Solution

  • docs/reference/replication/ and docs/reference/web-application-firewall/ move here from HarperFast/documentation, with their git history.
  • Three Harper Pro sections of core pages become partials here (_pro-*.md). The core page renders each partial, and its headings, anchors and table of contents are unchanged.
  • The 5.4 notes for replication and the profiler are release-note fragments here.
  • A Docs workflow builds the site with this PR's docs/ and the core docs at this PR's core commit.
  • core is bumped to the harper PR that adds docs/.
  • A Publish Docs workflow redeploys the site on a release or a docs/ correction tag.

🔧 Changes

Moved files (17)

✅ Verification

  • Built the documentation site with HARPER_DOCS_PATH=core and HARPER_PRO_DOCS_PATH=., as the workflow does: it succeeds, and the published pages match the current site.
  • Prettier passes on docs/ and the new workflow.
  • Not run: publish-docs.yaml first runs at the next published release. It relies on the HarperFast AI App being installed on HarperFast/documentation, which that repo's claude-review.yml already uses; if it is not, the step fails and the site's hourly check publishes the release.
  • PR QA: skipped @ c224ff2 — docs relocation and CI only; no runtime code changes.
Paired PRs and merge order

This is one of three PRs: harper#3944 (core reference), harper-pro#1237 (Harper Pro pages) and documentation#788 (the site assembles both). Merge harper and harper-pro first, with a merge commit, then documentation. Until documentation merges, the Docs check here fails on purpose, because the site's main does not yet read docs/.

🤖 Generated by Claude Code (Claude Opus 5.5); posted via @kriszyp.

Release target: main — moves documentation and CI only; the site publishes these docs from the first release that contains them (5.4.0)
Related PRs: #1211 overlaps (also moves the core submodule pointer; whichever merges second rebases), 1 other independent
Complexity: medium

Deferred findings

  • 57f5d26f40e93d43 minor reliability — .github/workflows/docs.yaml — Unpinned documentation-site checkout — NOT FILED
  • 6a204d81d0de7ba6 minor security — .github/workflows/docs.yaml — Unpinned site npm ci/build runs with the full harper-pro tree on disk — NOT FILED
  • dcd34aca9c1e56b0 nit reliability — .github/workflows/docs.yaml — Path-filtered check: if required it stays pending on other PRs; if optional a red build can merge — NOT FILED
  • a54e44b09caafce6 nit reliability — .github/workflows/docs.yaml — No push-to-main trigger for a post-merge docs build — NOT FILED

Late Grok findings

3 surviving (highest minor), 5 previously adjudicated — Grok reviewed 24a7dbb
  • major — .github/workflows/docs.yaml:49 — The core submodule this branch pins has no docs/ tree. Once the documentation site's main branch reads HARPER_DOCS_PATH, every Docs build this workflow triggers fails before compiling a page. (previously adjudicated)
  • minor — .github/workflows/docs.yaml:33 — The check can pass green without building this PR's docs at all.
  • minor — .github/workflows/docs.yaml:28 — Code from the site repo runs with the whole private harper-pro source on disk.
  • nit — .github/workflows/docs.yaml:33 — The site checkout passes no token. If HarperFast/documentation were private, the checkout would fail with not-found.
  • nit — .github/workflows/docs.yaml:8 — With the paths: filter, the check cannot safely be required. As a required check it stays pending on every PR outside those paths; left optional, a red docs build can merge. (previously adjudicated)
  • nit — .github/workflows/docs.yaml:3 — Part of the header comment describes the checkout and build steps the YAML already shows. (previously adjudicated)
  • nit — docs/README.md:5 — The preview command does not say it must be run from a HarperFast/documentation checkout. (previously adjudicated)
  • nit — .github/workflows/docs.yaml:8 — There is no push: main trigger, so landed changes get no build in this repo. (previously adjudicated)

Not standing: none. Grok ran 8m (8m from launch to report); the fold adjudication (cursor-grok@24a7dbbdd669-baaf2cfb, claude) took 1m.

Review-Coverage: authored=claude; ran=gemini,cursor-composer,codex,cursor-grok; late=cursor-grok:adjudicated; adjudicated=domain; declined=muse; rounds=5; full=2 @ c224ff2

Review-Attention: study ~20m (sensitive: docs.yaml, publish-docs.yaml; decisions: core-bump-in-docs-pr, publish-dispatch-on-release-and-docs-tags, docs-build-against-site-main, operator-maintenance-snippet-in-reference) @ c224ff2

Ethan-Arrowood and others added 15 commits March 30, 2026 16:12
…mentation#436)

* initial reference section creation and configuration

* v4 docs reference plan init

* update plans

* create migration context dir

* Configure build system for major-version-reorg branch

- Temporarily disable local search plugin (will re-enable later)
- Set onBrokenLinks to 'warn' to allow build during migration
- Add /reference redirect page to handle versioned docs structure
- Create index.md files for reference directories
- Update sidebars to autogenerate from directory structure
- Document temporary changes in project brief for future re-enablement

The site now builds successfully and is ready for migration PRs.
Broken link warnings are expected as content is migrated.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

* docs: migrate CLI section to v4 consolidated reference (HarperFast/documentation#439)

* docs: migrate CLI section to v4 consolidated reference

Migrated Harper CLI documentation from versioned_docs to new
reference_versioned_docs/version-v4/cli/ structure following the v4
documentation consolidation plan.

Files created:
- reference_versioned_docs/version-v4/cli/overview.md
- reference_versioned_docs/version-v4/cli/commands.md
- reference_versioned_docs/version-v4/cli/operations-api-commands.md
- reference_versioned_docs/version-v4/cli/authentication.md
- migration-context/link-placeholders/cli-link-placeholders.md

Key Features:

Version Annotations - All 72 CLI operations now include "Available Since"
information with complete version coverage:
- 51 operations from v4.3.0
- 11 operations from v4.4.0 (SSH and certificate operations)
- 3 data operations from v4.4.9 (insert, update, upsert)
- 3 status operations from v4.6.0
- Individual operations from v4.7.2 and v4.7.3

Authentication Documentation - Corrected to explain Unix domain socket
authentication for local operations (automatically authenticated as
superuser). Detailed environment variable and command parameter methods
for remote operations with security best practices.

Operations API Commands - Complete operations table with all 72 operations
categorized by function, command aliases, parameter formatting guidelines,
and cross-references to related sections via tip callouts.

Process Management - Documented PID file location at <ROOTPATH>/hdb.pid,
clarified foreground/background behavior for commands, and updated dev
mode features.

Link Management - 12 internal CLI section links resolved using relative
paths. ~96 cross-section TODO links documented for future resolution in
cli-link-placeholders.md.

Content Consolidation - Merged content from v4.1 through v4.7 with inline
version annotations following Node.js documentation patterns.

Migration approach:
- Single consolidated v4 reference (no separate v4.1-v4.7 versions)
- Inline version annotations for feature availability
- TODO: prefix for cross-section links pending future migrations
- Comprehensive source attribution in HTML comments
- Learn guide links use /learn paths
- Consistent use of 'harper' command throughout

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

* fixup! docs: migrate CLI section to v4 consolidated reference

* fixup! docs: migrate CLI section to v4 consolidated reference

---------

Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>

* GraphQL Querying Migration (HarperFast/documentation#440)

* docs: migrate GraphQL Querying section to v4 consolidated reference

Generated with Claude Code (https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

* fixup! docs: migrate GraphQL Querying section to v4 consolidated reference

* fixup! fixup! docs: migrate GraphQL Querying section to v4 consolidated reference

* Update reference_versioned_docs/version-v4/graphql-querying/overview.md

Co-authored-by: Kris Zyp <kriszyp@gmail.com>

* remove coming soon sections

---------

Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Co-authored-by: Kris Zyp <kriszyp@gmail.com>

* Studio Migration (HarperFast/documentation#441)

* docs: migrate Studio section to v4 consolidated reference

Generated with Claude Code (https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

* fixup! docs: migrate Studio section to v4 consolidated reference

* fixup! docs: migrate Studio section to v4 consolidated reference

* fixup! docs: migrate Studio section to v4 consolidated reference

* fixup! docs: migrate Studio section to v4 consolidated reference

* fixup! fixup! docs: migrate Studio section to v4 consolidated reference

* docs: update plans to clarify Studio vs Harper Cloud Studio distinction

* manual edits

* edit credentials/authentication info

* move additional cloud docs over per discussion

* simplify legacy cloud

* remove reference to cloud in studio docs.

* update link placeholders doc

---------

Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>

* Fastify Routes Migration (HarperFast/documentation#442)

* docs: migrate Fastify Routes section to v4 consolidated reference

Generated with Claude Code (https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

* fixup! docs: migrate Fastify Routes section to v4 consolidated reference

* manual tweaks

---------

Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>

* format

* update map progress statusses

* update workflow to do preview deploys for new files paths

* Environment Variables Migration (HarperFast/documentation#444)

* docs: migrate Environment Variables section to v4 consolidated reference

Adds the Environment Variables section focused on the built-in `loadEnv`
plugin. Harper-level env var configuration (naming conventions,
HDB_CONFIG, HARPER_DEFAULT_CONFIG, HARPER_SET_CONFIG) is intentionally
deferred to the Configuration section, with research notes captured in
the migration map.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Update overview.md

Co-authored-by: Chris Barber <chris@harperdb.io>

* adjust intro

* fix titles

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Chris Barber <chris@harperdb.io>

* HTTP section migration (HarperFast/documentation#446)

* docs: migrate HTTP section to v4 consolidated reference

Adds reference_versioned_docs/version-v4/http/ with four pages:
- overview.md: architecture, threading model, protocols served
- configuration.md: full http section config reference
- tls.md: top-level tls section reference (shared by HTTP and MQTT)
- api.md: server global API (server.http, Request/Response, server.ws, etc.)

Also adds migration-context/link-placeholders/http-link-placeholders.md
and updates the v4 sidebar and migration map status.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fixup! docs: migrate HTTP section to v4 consolidated reference

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* Static Files Migration (HarperFast/documentation#445)

* docs: migrate Static Files section to v4 consolidated reference

- Add reference_versioned_docs/version-v4/static-files/overview.md
  covering the static built-in plugin: basic usage, files/urlPath,
  v4.7 options (index, extensions, fallthrough, notFound), auto-update
  behavior, and examples including SPA client-side routing pattern
- Add Static Files category to version-v4 sidebar
- Add migration-context/link-placeholders/static-files-link-placeholders.md
- Update v4-docs-migration-map.md status to In Progress with source notes

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fixup! docs: migrate Static Files section to v4 consolidated reference

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* Logging Section Migration (HarperFast/documentation#450)

* docs: migrate Logging section to v4 consolidated reference

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fixup! docs: migrate Logging section to v4 consolidated reference

* fixup! docs: migrate Logging section to v4 consolidated reference

* fixup! docs: migrate Logging section to v4 consolidated reference

* fixup! docs: migrate Logging section to v4 consolidated reference

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* Analytics Section Migration (HarperFast/documentation#451)

* docs: migrate Analytics section to v4 consolidated reference

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fixup! docs: migrate Analytics section to v4 consolidated reference

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* MQTT Section Migration (HarperFast/documentation#449)

* docs: migrate MQTT section to v4 consolidated reference

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fixup! docs: migrate MQTT section to v4 consolidated reference

* whoops - missed a space

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* Security and Users & Roles Sections Migration (HarperFast/documentation#452)

* docs: migrate Security section to v4 consolidated reference

Migrates all security documentation from versioned_docs into the new
reference_versioned_docs/version-v4/security/ structure. Includes 9
pages covering authentication methods, certificate management, CORS,
SSL/HTTPS configuration, and users/roles RBAC.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* docs: move Users & Roles to its own top-level section

Splits security/users-and-roles.md into a dedicated users-and-roles/
section with overview, configuration, and operations files. Updates
the sidebar to reflect the new top-level "Users & Roles" category.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* manual edits to security sections

* docs: add security/configuration.md and fix authentication config keys

- Add security/configuration.md covering the top-level `authentication:`
  config block (authorizeLocal, cacheTTL, enableSessions, token timeouts,
  hashFunction) with a TODO to verify the hashFunction key name
- Fix jwt-authentication.md: config was incorrectly nested under
  `operationsApi.authentication` — it is a top-level `authentication:` section
- Fix jwt-authentication.md: update broken ssl.md link to http/tls.md
- Update users-and-roles/configuration.md: replace fabricated config snippet
  with a link to security/configuration.md#hashfunction

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* finish security and users-and-roles sections

* docs: update plan to reflect users-and-roles promotion to top-level section

Notes that users-and-roles was broken out from security/ during migration,
and documents the new users-and-roles/ and security/configuration.md structure.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* pr review fixes

* switch to jsonwebtoken module reference

* remove cluster_user

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* update plan docs

* correct links

* clean up version annotations

* REST Section Migration (HarperFast/documentation#457)

Adds all 5 pages of the REST reference section:
- overview.md: HTTP methods (GET/PUT/POST/PATCH/DELETE), URL structure, ETag caching, OpenAPI endpoint
- querying.md: Full URL query syntax — FIQL operators, unions, grouping, select/limit/sort functions, relationships/joins, null queries, type conversion
- headers.md: Request/response headers (ETag, If-None-Match, Content-Type, Accept, etc.)
- content-types.md: JSON, CBOR, MessagePack, CSV — with encoding recommendations
- websockets.md: WebSocket connections, custom connect() handler, MQTT-over-WS, message ordering
- server-sent-events.md: SSE connections, one-directional streaming, connect() usage

Also adds rest-link-placeholders.md and marks REST section Complete in migration map.

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* Database Section Migration (HarperFast/documentation#458)

* docs: migrate Database section to v4 consolidated reference

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fixup! docs: migrate Database section to v4 consolidated reference

* fixup! fixup! docs: migrate Database section to v4 consolidated reference

* fixup! fixup! docs: migrate Database section to v4 consolidated reference

* manual review edits

* manual review edits

* remove nats section

* docs: add database/api.md for JS globals (tables, databases, transaction, createBlob)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* Resources Section Migration (HarperFast/documentation#459)

* docs: migrate Resources section to v4 consolidated reference

Adds overview, resource-api, global-apis, and query-optimization pages
for the Resources section of the v4 reference docs.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fixup! docs: migrate Resources section to v4 consolidated reference

* fixup! docs: migrate Resources section to v4 consolidated reference

* fixup! docs: migrate Resources section to v4 consolidated reference

* fixup! docs: migrate Resources section to v4 consolidated reference

* fixup! docs: migrate Resources section to v4 consolidated reference

* fixup! docs: migrate Resources section to v4 consolidated reference

* fixup! docs: migrate Resources section to v4 consolidated reference

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* follow up edits from reviews

* Components Section Migration (HarperFast/documentation#460)

* docs: migrate Components section to v4 consolidated reference

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* docs: add JavaScript Environment page to Components section

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* manual review

* format

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* Replication Section Migration (HarperFast/documentation#461)

* docs: migrate Replication section to v4 consolidated reference

Adds overview.md, clustering.md, and sharding.md for the Replication section.
Updates the v4 versioned sidebar and adds a link placeholder tracker.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* docs(replication): remove all NATS/legacy clustering content

Strips the Legacy NATS Clustering section from clustering.md, removes
NATS-era callout blockquotes from overview.md, and drops version
annotations that only make sense in a migration-history context.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* manual review

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* Operations API Migration (HarperFast/documentation#462)

* docs: migrate Operations API section to v4 consolidated reference

Adds overview and operations reference for the Operations API section
to the v4 consolidated reference structure.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* manual review

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* Configuration Section Migration (HarperFast/documentation#463)

* docs: migrate Configuration section to v4 consolidated reference

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* manual review

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* update plan docs and add custom functions and sql pages

* clean up progress before starting on other fixes

* Link resolution (HarperFast/documentation#467)

* docs(link-resolution): resolve link placeholders in CLI section

- cli/overview.md: resolved Operations API and Configuration links
- cli/commands.md: resolved Configuration link
- cli/operations-api-commands.md: resolved all TODO links; mapped
  operations table category links to operations-api/operations.md with
  anchors (no sub-pages exist); resolved Applications → components/overview.md

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* docs(link-resolution): resolve link placeholders in Fastify Routes, Studio, GraphQL Querying

- fastify-routes/overview.md: resolved Resources and REST overview links
- studio/overview.md: resolved configuration options and Operations API links
- graphql-querying/overview.md: resolved schema definition, Resources, and
  Resource Query API links

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* docs(link-resolution): resolve link placeholders in Env Vars, Static Files, HTTP, MQTT

- environment-variables/overview.md: resolved Configuration and Components links
- static-files/overview.md: resolved all Components overview links
- http/overview.md: resolved REST Overview link
- http/configuration.md: resolved Configuration Overview link
- http/tls.md: resolved Operations API Configuration links (x2)
- http/api.md: resolved Operations API and REST Overview links
- mqtt/overview.md: resolved REST Overview link
- mqtt/configuration.md: resolved Configuration Overview link

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* docs(link-resolution): resolve link placeholders in Logging and Analytics

- logging/configuration.md: resolved Configuration Overview link
- logging/operations.md: resolved Operations API Overview link
- analytics/overview.md: resolved Configuration Overview links (x2)
- analytics/operations.md: resolved search_by_conditions and Operations API Overview links

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* docs(link-resolution): resolve link placeholders in Security

- security/overview.md: resolved Configuration Operations links (CORS network, TLS)
- security/mtls-authentication.md: resolved Replication clustering link
- security/certificate-verification.md: resolved Replication clustering link
- security/certificate-management.md: resolved Replication clustering link

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* docs(link-resolution): resolve link placeholders in REST, Components, Resources, Replication

- rest/websockets.md: resolved Resource API and Resources overview links
- rest/server-sent-events.md: resolved Resources overview link
- components/overview.md: fixed malformed TODO-as-link-text for Resource API and Schema links
- components/extension-api.md: resolved server global API link
- components/plugin-api.md: resolved Resource API and server global API links
- resources/overview.md: resolved REST Overview and MQTT Overview links
- resources/query-optimization.md: resolved Schema documentation link
- replication/overview.md: resolved Certificate Verification and Certificate Management links

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* docs(link-resolution): resolve link placeholders in Database section

- database/overview.md: resolved Resource API, Resources, Operations API, Configuration links
- database/schema.md: resolved Operations API, Resources, Configuration links
- database/api.md: resolved Resource API (x3) and Configuration links
- database/data-loader.md: resolved Extension API and Components links
- database/storage-algorithm.md: resolved Configuration links (x2)
- database/jobs.md: resolved Operations API links (x2)
- database/system-tables.md: resolved Replication clustering, Replication overview, Operations API links
- database/compaction.md: resolved Configuration link
- database/transaction.md: resolved Replication and Operations API links

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* docs(link-resolution): resolve link placeholders in Operations API and Configuration

- operations-api/overview.md: resolved Configuration Overview link
- operations-api/operations.md: resolved SQL (→ database/sql.md) and Configuration links
- configuration/operations.md: resolved restart and restart_service operation links

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* docs(link-resolution): delete resolved link placeholder tracker files

All link placeholders have been resolved. Removing tracker files now that
link resolution is complete.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* chore: update MEMORY.md — Part 3 link resolution complete

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(reference): resolve broken anchors in reference/v4 docs

- security/overview: remove non-existent #network and #tls anchors from configuration/operations links
- replication/overview: remove non-existent #operations-api anchor from clustering link
- http/overview: fix server.http() anchor (#serverhttp → #serverhttplistener-options)
- logging/api: fix logging.external anchor (#logging-external → #loggingexternal)
- configuration/operations: fix restart_service anchor (#restart-service → #restart_service)
- graphql-querying/overview: fix Resource Query API link (resources/overview#query → rest/querying)
- components/applications: fix add_ssh_key anchor (#add-ssh-key → #add_ssh_key)
- components/plugin-api: add explicit {#scopehandleentry} id to handleEntry heading
- resources/overview: fix empty database/schema link

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* update memory docs

* format

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* Cross reference updates (HarperFast/documentation#468)

* docs(cross-refs): update old /docs/ links in release notes to v4 reference paths

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* docs(cross-refs): update old /docs/ links in learn guides to v4 reference paths

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* docs(cross-refs): fix broken links and anchors from Docusaurus build

- fabric/index.md: /docs/deployments/configuration#localstudio → /reference/v4/configuration/options#localstudio
- fabric/grafana-integration.md: ../docs/developers/operations-api/analytics → /reference/v4/analytics/overview
- release-notes/4.2.0: remove broken /docs/administration/cloning link (no target page exists)
- release-notes/4.2.0: drop non-existent #adding-components-to-root anchor
- release-notes/4.5.0 + index.mdx: #blob-storage → #blob-type (correct heading anchor)
- src/pages/index.mdx: update 4 /docs/developers/* links to /reference/v4/ paths

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* update memory

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* checkpoint before deleting old content files

* delete old docs content

* copy new content to reference/

* finish redirects

* remove paginator for reference section

* touch up sidebar styles

* copy to v5 sidebar

* add index pages

* format

* start on some new dev docs

* add version badge and update docs

* update dev docs for new VersionBadge

* fix config

* fix config to throw on broken links

* update contrib and simplify readme

* add ai generated retro for future reflection

* remove planning documents

* default to v4

* reorder rest/querying

* move sql to operations section

---------

Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Co-authored-by: Kris Zyp <kriszyp@gmail.com>
Co-authored-by: Chris Barber <chris@harperdb.io>
* rename harperdb-config.yaml to harper-config.yaml and harperdb CLI/package to harper

* update __harperRequestUpgraded property

* format
…perFast/documentation#555)

The "Controlling Replication Flow" example used `host:` while the rest of the
doc and the schema use `hostname:` (both are accepted). Reconcile for
consistency. Relates to harper-pro#498.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
…2) (HarperFast/documentation#583)

* docs: replicating the system database with a constrained topology (5.2)

Controlled-flow replication can now include the `system` database while
keeping a constrained topology (directional self-record). Update the
replication overview (Controlling Replication Flow) — the previous "avoid
replicating system" note no longer applies for directional routes — and add
a 5.2 release note. Documents per-database directional routes, the
add_node database-scoping behavior change, and the central-visibility caveat.

Companion to the harper-pro core change (branch kris/systemdb-routing-repro).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* docs: address review findings on systemdb routing docs (PR HarperFast/documentation#583)

- Fix heading-hierarchy skip (h4 -> h3) and hostname/host key
  inconsistency in the controlled-flow example.
- Extend the per-database routing example to actually route `system`,
  matching the section it introduces.
- Soften "discovered non-neighbor nodes therefore do not open direct
  connections" to the actual guarantee (no subscription/replication
  connection), and call out that on-demand residency/retrieval
  connections are a separate, unaffected mechanism.
- Document add_node/set_node's sendsTo/receivesFrom fields in the
  Clustering reference (previously undocumented) and note the
  config-authority limitation: dynamic Operations API scoping doesn't
  make a node advertise a directional self-record — that's derived
  only from harper-config.yaml routes.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* docs: correct add_node sendsTo/receivesFrom semantics (PR HarperFast/documentation#583)

Ethan-Arrowood's review traced the actual behavior in harper-pro's
knownNodes.ts/setNode.ts: a bare-string sendsTo/receivesFrom entry is
matched as a peer name, not a database, and silently authorizes
nothing; and add_node's sendsTo/receivesFrom describe the *added*
node's perspective (opposite of a config route's local-node
perspective) with no peer/target scoping, so the resulting hdb_nodes
record is visible cluster-wide rather than confined to one connection.
Corrects both the clustering.md reference and the matching 5.2 release
note bullet to describe this accurately.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* docs: document target/source peer-scoping for add_node sendsTo/receivesFrom

Independent review (codex/grok) caught that the previous wording said
entries "carry no peer scoping" and must be `{ database, excludeTables? }`
objects — both incomplete. harper-pro's RouteEntry type and matcher
(knownNodes.ts routeEntriesIncludePeer) support target/source fields that
do scope an entry to one peer; the docs just never mentioned them. Also
clarifies that the per-database YAML example pushes system/config
downstream, whereas the roadside-to-core narrative right after it
describes the opposite (upstream) direction, and how to flip it.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* docs: version-gate add_node sendsTo/receivesFrom, clarify upstream-aggregation example

Independent review (codex/gemini/grok) flagged two more issues:
- add_node's sendsTo/receivesFrom are new in v5.2 (harper-pro#572,
  commit 0b49587) but the parameter list had no VersionBadge, and the
  "must be an object" wording incorrectly implied a bare string is
  never valid (it is — it just matches a peer name across all
  databases, not a database name).
- The "aggregate upstream" guidance didn't say which node's config
  route needs the receivesFrom entry, so it could be misread as
  "configure receivesFrom on the leaf's route to the core" (which
  would do the opposite of what's intended). Spelled out the
  roadside/middle example explicitly.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* docs: fix upstream-aggregation example and bare-string wording found by review

- The roadside-to-middle upstream aggregation example only described
  the middle tier's receivesFrom entry. replicationConnection.ts's
  send-side authority gate (harper-pro#498) independently checks the
  SENDER's own directional config route, so roadside also needs a
  matching sendsTo entry or the subscription is rejected as
  unauthorized. Documented both sides.
- The 5.2 release note still said a bare-string entry "authorizes
  nothing," contradicting the corrected clustering.md wording (a
  string names a peer and authorizes all databases for it). Aligned.
- Added a caveat that routing `system` upstream from an edge node
  propagates hdb_user/hdb_role along with everything else, so a
  compromised or careless edge node's changes reach every node
  downstream of it.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* docs: stop recommending add_node target/source peer-scoping (it's broken)

Traced setNode.ts's reciprocal add_node_back registration: it swaps
sendsTo/receivesFrom wholesale onto the peer (targetAddNodeObj.sendsTo
= req.receivesFrom, etc.) without rewriting each entry's target/source
for the new direction. A target/source value that's correct for the
calling side ends up wrong on the peer's copy, so the send-authority
gate (replicationConnection.ts's shouldCloseSendAuthWatch) rejects the
subscription — replication silently doesn't happen. The docs
previously told users to set target/source to scope an add_node entry
to one peer; that's not a reliable fix given this behavior. Removed
the recommendation and pointed to config routes instead, which don't
have this problem (computeSelfReplicates stamps target/source
correctly on both sides). Also fixed an overstated "rejected as
unauthorized" claim for the roadside/middle example: omitting the
receiver's half means no subscription is attempted at all, not a
rejection.

This is a real harper-pro implementation gap, not just a docs issue —
noting it in the dispatch Findings for a follow-up.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* docs: bare-string add_node entries have the same reciprocal-registration bug as target/source

Traced the failure Grok/codex flagged: add_node's bare-string form
(entry === peerName) has the identical swap-without-rewrite problem as
target/source — a string that's correct for the caller's own send
authorization becomes wrong once add_node_back copies it unmodified
onto the peer's record, so the peer's send-authority gate rejects the
subscription. Consolidated the guidance: only the unscoped object form
{ database?, excludeTables? } is reliable; steered both the string
form and target/source into the same "don't rely on this" warning
instead of presenting the string as a working (if blunt) alternative.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* docs: address constrained topology review feedback

Co-Authored-By: GPT-5 Codex <noreply@openai.com>

* docs: clarify directional route safeguards

Co-Authored-By: GPT-5 Codex <noreply@openai.com>

* docs: disambiguate advertised route matching

Co-Authored-By: GPT-5 Codex <noreply@openai.com>

* docs: qualify controlled-flow send fallback

Co-Authored-By: GPT-5 Codex <noreply@openai.com>

* docs: clarify directional route requirements

Co-Authored-By: GPT-5 Codex <noreply@openai.com>

* docs: clarify add_node directional replication scope

Co-Authored-By: GPT-5 Codex <noreply@openai.com>

* docs: clarify system replication trust boundaries

Co-Authored-By: GPT-5 Codex <noreply@openai.com>

* docs: correct version badges and qualify containment claims

Address review findings on PR HarperFast/documentation#583:

- Gossip Discovery: the constrained-topology claim depended on the
  discovered node's advertised record, not the discovering node's
  config. A directional node still subscribes to a discovered peer that
  advertises the legacy full-mesh record (shouldReplicateFromNode falls
  back to the peer record when no config route exists).
- Per-database controlled flow: badge was v5.2.0, but route-level
  sendsTo/receivesFrom shipped in v5.1.0 (ed9cca0); note that
  enforcement on live connections landed in v5.1.15 (3af29c0).
- add_node sendsTo/receivesFrom: badge was v5.2.0; the parameters
  shipped in v5.1.0. Document what 5.2 changed, per direction: the
  blanket sends:true short-circuited the receive gate, so sendsTo's
  database scoping was inert, while the send gate matched a
  receivesFrom entry only when it named both this node and the
  database, so the recommended peer-agnostic form did not authorize
  sending. 5.2 drops the blanket flag and treats an absent
  peer/database as a wildcard. Flagged as an upgrade caveat here and in
  the 5.2 release note.

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

* docs: fix trust-boundary framing and mesh-precondition gaps

From the pre-push cross-model review (round 1):

- The untrusted-edge guidance advised downstream-only `system`
  replication as a mitigation, one bullet before stating that any node
  receiving `system` holds the custody key for `hdb_secret`. Lead with
  the confidentiality decision, then present direction as the integrity
  control it is.
- `excludeTables` was cited as the remedy but never documented for
  config routes; it is a route-entry field (RouteEntry.excludeTables),
  so show it in the per-database section. Note that excluding
  `hdb_secret` breaks replicated component deploys that resolve
  credential references locally, so it is not a substitute for the
  trust decision.
- The constrained-mesh precondition list omitted that `add_node` /
  `set_node` scoping does not produce a directional self-record, which
  is exactly the trap for a dynamically provisioned tier.
- Qualify the Gossip Discovery lead sentence so the reader doesn't form
  the full-mesh model one line before it is narrowed.

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

* docs: note the widening half of the v5.2 add_node change

The upgrade caveat covered only the narrowing direction. The same
record-shape change widens too: v5.1's send-authority check matched a
`receivesFrom` entry only when it named both the subscriber and the
database, so a peer-agnostic entry was inert; v5.2 delegates to
routeEntriesIncludePeer, where an absent peer means any peer. An entry
left in place because it did nothing on v5.1 starts authorizing
outbound replication on v5.2.

Found by the pre-push cross-model review (round 2, Gemini).

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

* docs: add an add_node controlled-flow example and the durability boundary

Documents the request shape for add_node's sendsTo/receivesFrom and states
that the scoping is not durable: every node rewrites its own hdb_nodes row
from its config routes on restart or component reload (startOnMainThread ->
ensureThisNode), superseding directional entries an add_node call wrote onto
that row.

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

* docs: define target/source on add_node route entries

The add_node bullet referenced `target`/`source` without either
appearing anywhere else in the docs. Gloss them as the per-entry
peer reference (absent = any peer), matching
`routeEntriesIncludePeer`'s `entry.target ?? entry.source` match.

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

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: GPT-5 Codex <noreply@openai.com>
…erFast/documentation#684)

* docs(replication): document sendsTo/receivesFrom on Update Node

The shared setNode handler and its Joi schema accept sendsTo/receivesFrom
identically for add_node, set_node, and update_node (no operation-specific
branch restricts them to add-only), but the Update Node section only listed
hostname, revoked_certificates, shard, and subscriptions. Cross-reference the
Add Node block instead of duplicating its v5.1/v5.2 gating and
add_node_back peer-rewrite caveats.

Also correct subscriptions from required to optional for Update Node: the
schema has no .required() on it, and the existing request example already
omitted it.

Dispatch-Task: documentation-update-node-sendsto-receivesfrom
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G9H43LD4wQtipqJdjTFJ7Z

* docs(replication): drop version badges and disambiguate node reference

Pre-push review (codex+gemini+cursor-muse+harper-domain, major finding):
the v5.1.0/v5.2.0 badges asserted sendsTo/receivesFrom acceptance history
for update_node, but update_node is not currently a registered operation
on harper-pro main (replication/setNode.ts only registers set_node,
add_node, add_node_back, remove_node_back, remove_node) — it has never
been reachable at any version, so the badges' claim is false regardless
of when registration lands. Point to Add Node's gating history instead
of asserting a version for update_node itself.

Also fix a minor finding: "this node" in the new bullet collided with
Add Node's use of the same phrase for the local node, inverting the
read for a careless reader. Name the hostname node explicitly.

Dispatch-Task: documentation-update-node-sendsto-receivesfrom
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G9H43LD4wQtipqJdjTFJ7Z

* docs(replication): fix self-referential precedence wording

Gemini nit from round-2 review: "as with subscriptions, subscriptions
takes precedence" compares subscriptions with itself. Say "as with Add
Node" to name the actual precedent.

Dispatch-Task: documentation-update-node-sendsto-receivesfrom
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G9H43LD4wQtipqJdjTFJ7Z

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…arperFast/documentation#709)

* Document replication.threads, the dedicated replication worker pool

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015QW9pttHCFmEN8mPjAxejn
Dispatch-Task: hp-975-replication-worker-pool

* Say which table hooks replication threads cannot run

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015QW9pttHCFmEN8mPjAxejn
Dispatch-Task: hp-975-replication-worker-pool

* Correct the pool's refusal scope and restart semantics, and add the 5.4 release note

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015QW9pttHCFmEN8mPjAxejn
Dispatch-Task: hp-975-replication-worker-pool

* Point the computed-property and set_configuration pages at the replication thread limits

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015QW9pttHCFmEN8mPjAxejn
Dispatch-Task: hp-975-replication-worker-pool

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…ables (HarperFast/documentation#746)

* Document replicaExpiration and replicaRefreshFraction for residency tables

Dispatch-Task: hp-residency-replica-tier
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JxKx7SjhcDpWXLNcydYC7g

* State how a replica is invalidated and swept, give the section an anchor, and note the 5.4 change

Dispatch-Task: hp-residency-replica-tier
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JxKx7SjhcDpWXLNcydYC7g

* Note the one-second floor of the replica sweep

Dispatch-Task: hp-residency-replica-tier
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JxKx7SjhcDpWXLNcydYC7g

* Document local replicas as RocksDB-only

LMDB remote reads remain proxy reads and never arm replica maintenance.
Match the Float schema argument and explain the sweep interval floor.

Dispatch-Task: harper-3375-audit-refs-regression
Co-Authored-By: GPT-5 Codex <noreply@openai.com>

* Clarify replica option reload and disable behavior

Reload RocksDB workers after changing replica settings; existing classes can
retain their previous values. Disabling admission does not purge old replicas.

Dispatch-Task: harper-3375-audit-refs-regression
Co-Authored-By: GPT-5 Codex <noreply@openai.com>

* Document live replica option propagation on schema rescan

Dispatch-Task: harper-3375-audit-refs-regression
Co-Authored-By: GPT-5 Codex <noreply@openai.com>

* Clarify that zero replica lifetime stops new admissions

Dispatch-Task: harper-3375-audit-refs-regression
Co-Authored-By: GPT-5 Codex <noreply@openai.com>

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Co-authored-by: GPT-5 Codex <noreply@openai.com>
…_network_access) (HarperFast/documentation#743)

* docs: document set_network_access and get_network_access (operations API allowlist)

Refs HarperFast/harper#3358

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AQei7F67D8RESAvxSPQ6XF
Dispatch-Task: harper-3358

* docs: 5.4 release note for the operations API source allowlist

Refs HarperFast/harper#3358

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AQei7F67D8RESAvxSPQ6XF
Dispatch-Task: harper-3358

* docs: state the allowlist's per-family matching

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AQei7F67D8RESAvxSPQ6XF
Dispatch-Task: harper-3358

* docs: unknown source addresses and the no-metadata warning

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AQei7F67D8RESAvxSPQ6XF
Dispatch-Task: harper-3358

* docs: order the lockout paragraphs

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AQei7F67D8RESAvxSPQ6XF
Dispatch-Task: harper-3358

* docs: release note matches the lockout rule

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AQei7F67D8RESAvxSPQ6XF
Dispatch-Task: harper-3358

* docs: name the callers with no source address

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AQei7F67D8RESAvxSPQ6XF
Dispatch-Task: harper-3358

* docs: qualify replication, name both socket settings, and scope the 409 to non-empty lists

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AQei7F67D8RESAvxSPQ6XF
Dispatch-Task: harper-3358

* docs: tie the list's reach to system replication

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AQei7F67D8RESAvxSPQ6XF
Dispatch-Task: harper-3358

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…cumentation#671)

* docs(learn): add Administration production reliability track

Ten Learn > Administration guides derived from Jeff's "Operating Reliable
Harper Applications" field guide, drafted by Aleks Haugom with Claude and
moved into the repo largely as delivered. Replaces the Administration
"Coming Soon" placeholder and redirects its old URL to the first guide.

Guides, in sidebar order:

  1. How Harper Runs in Production
  2. Health Checks and Traffic Admission
  3. Sizing a Harper Cluster
  4. Operating Replication
  5. Monitoring and Triage
  6. Safe Deployments and Rollback
  7. Backup and Recovery
  8. Engineering RPO, RTO, and Uptime
  9. Production Readiness Checklist
 10. Reliability Plan Template

Only content change from the delivered drafts: the get_components link in
guide 1 pointed at an anchor that does not exist on the operations page;
it now points at components/applications#get_components.

Co-Authored-By: Aleks Haugom <aleks@harperdb.io>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* docs: correct Administration guides against harper/harper-pro source

Technical verification pass over the ten Administration guides against
harper and harper-pro at origin/main (v5.2.12 current). Most of the track
held up; these are the claims that did not, plus the reference fixes they
turned up.

Guides:

- Rewrite "What restart actually does" for released 5.2 behavior. The
  awaited `restart: true` is v5.3.0 only, so the section now describes the
  fire-and-forget behavior operators actually have, with the wait moved to
  its own subsection badged `changed in v5.3.0`.
- Warn that a replicated deploy with `restart: true` restarts every node at
  once, and prefer `rolling` on a cluster. Matches the guidance already in
  the shipped CI/CD guide.
- Document that `replicated` is opt-out: omitting it replicates.
- Correct the new-node row. A joining node requests a full copy from every
  peer it has no resume cursor for, and established peers full-copy from it
  in turn, so a join into N peers is N inbound plus N outbound transfers.
- `system` is in replication scope by default, so users and roles already
  propagate unless someone narrowed it.
- `drop_database` and `drop_table` replicate by default; `drop_attribute`
  does not.
- `get_backup target=` writes a file; it does not clone a database.
- Blob snapshots are hard-linked, so they are near-free on the default
  layout and a full copy only across filesystems. The transaction-log
  snapshot is the part that genuinely costs disk every backup.
- `verify_backup` checks that a blob snapshot is present, not that blob
  contents are intact.
- The availability flag is already `replicate: false` in both mechanisms,
  so the guidance is to preserve that rather than to go establish it.
- `/status` returns a body as well as a status code, and the component
  entry belongs in the root harper-config.yaml, not an application's
  config.yaml, where it would replace the default component config.
- Readiness sample: a missing record resolves rather than throws, so check
  the result; import from 'harper'; and note the route is unauthenticated
  because a static handler bypasses the authorization gate.
- Logging sample: there is no node-name environment variable, so use
  server.hostname. `context.requestId` needs http.logging.id, which is off
  by default. Harper's logger renders text via Node's Console, not JSON.
- Badge `write-transaction-queue-depth` v5.2.0, and note the Prometheus
  exporter does not cover the saturation, commit-time, or storage metrics.

Reference:

- State the `replicated` default across the component operations; it was
  the only optional parameter whose default went unstated.
- `drop_database`/`drop_table` replicate by default; only `drop_attribute`
  is per-node.
- Users and roles do propagate by default, which contradicted both the code
  and this file's own statement that all databases replicate by default.

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

* docs(reference): correct six claims contradicted by harper source

Follow-on from the Administration verification pass. Each of these was
checked against harper/harper-pro at origin/main and is wrong on the live
site today.

- `set_status` / `get_status` / `clear_status` are not in-memory. They
  persist to the `hdb_status` table in the `system` database, which is
  declared `replicate: false`, so values survive a restart and stay
  node-local. Adds what `restartRequired` on a bare `get_status` actually
  tracks.
- `system_information` no longer advertises a `replication` attribute,
  which does not exist. Lists the ten real attribute names and notes that
  unrecognized names are dropped silently rather than rejected, so a typo
  returns a smaller response instead of an error.
- The `cluster_status` sample showed `lastSendTime`, a field present in
  neither repo, and `thread_id` where the code emits `threadId`. Also
  notes that the timing fields hold the literal string "Copying" during an
  initial full copy, which breaks anything parsing them as dates.
- `logging.console` defaults to `false`, not `true`. The two reference
  pages disagreed; the runtime default is `logOptions.console ?? false`.
  Core's own config schema description carries the same stale "Default:
  true" and should be fixed separately.
- `get_backup target=` reads a snapshot from another node into a local
  file. It does not clone that node's database onto the current one.
- `verify_backup` confirms a recorded blob snapshot is present and fails
  the backup as corrupt when it is missing, but does not check individual
  blob files, so verification can pass on damaged blob contents.

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

* docs(learn): close coverage gaps against the original field guide

Read Jeff's "Operating Reliable Harper Applications" doc and compared it
against the ten guides. Coverage was broadly good, but three documented
capabilities were dropped entirely and one CLI claim was wrong.

- `get_backup` has no offline CLI form. Guide 7 told readers every backup
  operation works with the server stopped; `get_backup` is absent from the
  offline command switch and fails as an unknown command. That matters
  because a stopped node is exactly when an operator reaches for it.

- `storage.writeAsync` was missing from the RPO guide. It defaults off, and
  turning it on disables fsync so acknowledged commits can be lost on power
  loss or an OS crash. Nothing else in the track surfaces it: backup
  timestamps still look right and no alert fires, so a stated recovery point
  can be quietly false. Now framed as an RPO decision with the cases where
  enabling it is defensible.

- `threads.preload` and `threads.preloadRequire` were missing from the
  observability guide. They are how an APM or tracing agent loads ahead of
  the code it instruments. Includes the split-entry case, which fails
  confusingly: with only the loader hooks preloaded a tracer emits no-op
  spans and exports nothing, so instrumentation looks installed while the
  collector stays empty.

- `HARPER_SAFE_MODE` was missing from the backup guide. Guide 7 explains
  that a component holding a database open blocks an online restore but
  never mentioned the escape hatch. Safe mode starts Harper without loading
  components, so the restore can run, and it is also how you reach a node a
  broken component stopped.

Also corrects the safe mode example in the configuration reference, which
invoked `harperdb` rather than `harper`.

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

* docs: address Gemini review feedback

Three of the seven review comments were worth taking.

- Move `<VersionBadge>` out of prose and list items in guide 6, per
  CONTRIBUTING's "reserve VersionBadge for standalone placement after
  headings". Uses the repo's own inline form, `(Added in: vX.Y.Z)`, rather
  than the bare `(v5.2.0)` the review suggested. Also applies it to the two
  list-item badges the review did not flag, so the guide is internally
  consistent. Table-cell badges are left alone, which is established
  practice across the reference.
- Promote the two managed-backup limitations to an admonition, since a
  database on per-table storage paths silently has no backup strategy at
  all. Uses `:::warning` rather than `:::caution` to match the dominant
  type in this repo.

The other four were declined; see the PR threads for reasoning. In short:
the snake_case suggestion would have made the sentinel example inconsistent
with every shipped Learn guide, and the three remaining suggestions wrapped
multi-paragraph body prose in admonitions, one of them quoting text that had
already been corrected.

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

* docs: fixes from an independent Gemini review pass

Ran the PR diff through Gemini (gemini-3.1-pro-high) file by file. Of 52
findings, 12 held up against the harper/harper-pro sources; the rest were
contradicted by code I had already verified. The ones that held up cluster
almost entirely in internal consistency, which is what a diff-only reviewer
can actually check.

Bugs this pass caught, several of my own making:

- `HARPER_SAFE_MODE=1 harper` does not start the server. Bare `harper` falls
  through to the CLI-operations branch; starting it needs `harper run`. I
  introduced this when correcting the reference's `harperdb`.
- The drain sequence checked peer capacity at step 3, after the node was
  already drained and its traffic had moved. Moved the check before the
  drain and added the abort path, which was missing entirely.
- The readiness sample could never pass. After I changed it to test the
  sentinel record, nothing told the reader to create one, so the probe would
  return 503 forever. Added the seeding step.
- Guide 8 contradicted itself on recovery time: one place measured from
  detection, another counted a detection gap inside the total. Settled on
  recovery time starting when the journey breaks, detection included.
- The availability flag does not stop replication, so the restore sequence
  implied an isolation it never provided. An online restore on a drained but
  still-connected node exposes rolled-back data to peers before validation.
  Isolation is now its own step with a danger note.
- `system_information` reports node and npm versions, not Harper's. The
  service inventory now points at `registration_info`.
- The sizing sample requested neither disk nor network while the prose told
  the reader to watch both.
- A Prettier wrap left a link orphaned as its own paragraph, stranding the
  sentence that followed it.
- Smaller: "point-in-time restore" implied continuous PITR rather than
  restoring a snapshot; two checklist items still named `config.yaml` after
  the prose moved to the root `harper-config.yaml`; the status types are
  fixed while only their values are application-defined; and one leftover
  opt-in phrasing sat next to the corrected opt-out default.

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

* docs(learn): unwrap hard-wrapped prose in the Administration guides

The ten guides arrived hard-wrapped at 80 columns, which nothing else in the
repo does: existing Learn and reference pages run one line per paragraph,
with prose lines routinely past 500 characters. Prettier is configured
without proseWrap, so it preserves whatever it is given and never enforced
either style.

Wrapping is undone across all ten. Paragraphs and list items are now one
logical line each. Code fences, tables, frontmatter, JSX, admonitions,
headings, blockquotes, and import lines are untouched, and a content
fingerprint was compared before and after each rewrite to confirm nothing
but line breaks changed. Verified per file: identical structural element
counts, identical token streams, and a clean build.

Also carries an edit to the opening paragraph of
how-harper-runs-in-production.mdx that was made by hand in the worktree, not
by the rewrap. It is the one token-level change in the diff.

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

* human edit wip

* docs: apply the correctness items from Jeff's review

Takes the factual corrections from Jeff's review and leaves the prose,
structure and diagram requests for the human editing pass. Each was
re-verified at the v5.2.14 tag rather than origin/main, since the guides
document released 5.2 and main has moved.

- Replication port. `9933` is what a fresh Harper Pro install writes into
  `harper-config.yaml`, but it is configured rather than constant: with no
  `replication` block the secure port falls back to the Operations API
  secure port. An in-place upgrade never backfills that block, so an
  upgraded node and a fresh one can replicate on different ports. Says so,
  and the `cluster_status` sample no longer hard-codes the number.
- `host` / `urlPath`. Routing by either has existed since v5.1.0; what
  v5.2.0 added is declaring it on the root-config entry and the `host`
  parameter on `deploy_component`. Those were collapsed into one badge.
- `hdb_nodes`. The registry lives in `system` and propagates with it, which
  is what makes gossip discovery work. Keeping it per cluster is a
  deliberate per-route `excludeTables` setting, which the guide now covers.
- Backup storage root. The rejection rule is a database whose tables resolve
  to more than one storage root. A per-table `path` landing on the same root
  is fine, so the blanket "per-table paths are unsupported" was wrong.
- `restart: true`. Each node restarts independently as it finishes applying
  the deploy, unsequenced and free to overlap. The previous wording implied
  a coordinated simultaneous restart.
- `HARPER_SAFE_MODE` skips your applications and components; Harper's
  built-in root component still loads.

Also resolves the `get_configuration` placeholder link. The remaining
`[TODO](TODO)` on the asynchronous-execution sentence is left in place
because its target is a drafting decision, and it is the only thing keeping
the build red.

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

* Document Fabric load balancing, status-check, and taking an unhealthy node out of rotation

Add a Learn guide for applications on Fabric that feed their own health into
the node's availability record, which Fabric's status-check component serves
to the load balancer at GET /status. It covers when to do it, six safety
rules (hysteresis; never undoing Fabric's or an operator's write, tracked by
the record's __updatedtime__ in a non-replicated marker table and re-read
before every write; never taking the last node out; a recheck right after
going out; surviving restarts; warn logging and an off switch), a generic
sample component, a local drill against a throwaway Harper with the real
status-check component and the CLI's harper login, and caveats, including
the narrow windows a set_status without compare-and-swap leaves open.

Add a Fabric page for status-check: what GET /status answers, that POST and
DELETE need a super user, that the record is per node, persisted and not
replicated, and how to take a node out with harper login and harper
set_status, locally or from GitHub Actions with OIDC, as a role whose
operations list names only set_status and get_status (v5.3.0). It warns
not to deploy the @harperdb/status-check npm package on Fabric.

In the set_status reference, say that set_status stores only status, that
Harper core does not act on status values, and that on Fabric the
availability record decides routing.

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

* Make the production reliability guides easier to read

Co-Authored-By: OpenAI Codex <noreply@openai.com>

* Tighten readiness and recovery guidance after independent review

Co-Authored-By: OpenAI Codex <noreply@openai.com>

* Clarify synchronization and recovery contracts in the guides

Co-Authored-By: OpenAI Codex <noreply@openai.com>

* Align reliability objectives and document engine-specific recovery limits

Co-Authored-By: OpenAI Codex <noreply@openai.com>

* Align restart, routing, and logging guidance across pages

Co-Authored-By: OpenAI Codex <noreply@openai.com>

* Finish version annotations and remove repeated sample narration

Co-Authored-By: OpenAI Codex <noreply@openai.com>

* Lead the deployments guide with copy-paste deploy and rollback steps

Rework Safe Deployments and Rollback around commands operators can run:
log in and deploy a create-harper backend, build a Vite frontend once and
deploy only its output, deploy from GitHub Actions with OIDC, wait for the
rolling job, and roll back by deployment_id from the CLI or Studio.

State what restart=rolling actually does: it restarts nodes one at a time
but leaves each node in rotation, runs no application checks between
nodes, and (without canary certification) skips a node it cannot reach.
Correct the "zero-downtime" and "keeps serving throughout" claims in the
CLI reference and CI guide, and add a drain gate to the checklist.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Dispatch-Task: fix-Ethan-Arrowood_documentation_671-1627592f

* Address pre-push review findings on the reliability guides

- Staged frontend config: keep the project's own rest, schema, resource,
  and static entries (TypeScript templates load resources/*.ts) and drop
  only the plugins whose packages the release does not install.
- Configuration operations reference: replace "the cluster stays
  available" with the same rolling-restart limit the guides now state.
- Operating replication: define the exported OpsProbe table the
  convergence recipe writes, and name logging.auditRetention as the bound
  past which a peer sends a full copy.
- Node rotation: note that a worker restart can briefly run two loops on
  Linux, and that it ends the "not going out again" state.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Dispatch-Task: fix-Ethan-Arrowood_documentation_671-1627592f

* Keep the catch-up retention wording hedged and write the probe via databases

A forced full copy is not yet verified to remove rows deleted while a node
was away past retention, so state only that such a node needs a full copy.
Write the convergence sentinel through databases.<name> so the recipe works
for a database other than data.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Dispatch-Task: fix-Ethan-Arrowood_documentation_671-1627592f

* Tell operators to rebuild a node that was away past audit retention

Deletes older than logging.auditRetention are purged from history, so the
full copy a long-absent node receives can leave rows that were deleted
elsewhere. Qualify the returning-node row and the replication reference by
that bound, and say to rebuild such a node from empty or replace it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Dispatch-Task: fix-Ethan-Arrowood_documentation_671-1627592f

* Point long-absent nodes at the reconciliation policy instead of a rebuild

Rebuilding from empty would discard writes only that node took, so state
both sides of the hazard and send operators to the restore guide's
authority and reconciliation steps, noting that routes reconnect on start.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Dispatch-Task: fix-Ethan-Arrowood_documentation_671-1627592f

* Default deploy examples to restart=true, read the target from .env, and cover get_backup restores

- Safe Deployments: the CLI reads HARPER_CLI_TARGET from the project's
  .env (v5.1.0+), so login and deploy need no target. Examples use
  restart=true, which since v5.3.0 deploys to every node and returns once
  each has restarted, with no job to poll. A new "Choose a restart mode"
  section compares it with restart=rolling, including the v5.4.0 CLI wait
  and canary certification.
- Backup and Recovery: restore_backup cannot read a get_backup file; point
  to the manual restore, including the RocksDB blob roots.
- Readiness checklist: add the storage.writeAsync gate from the RPO guide
  and the get_backup restore rehearsal.

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

* Rebuild a node that returns after its peers' history expired, and lead the guides with runnable commands

A node whose saved position predates its peers' oldest retained history
gets a base copy, and harper-pro's base copy only sends puts: it never
clears tables, purged tombstones are absent, and retained tombstones
arrive as valueless puts the receiver skips. The copy also runs the other
way, so a copied row can bring back a row a peer deleted once that peer's
tombstone is purged. Disk pressure can purge history before
logging.auditRetention. cluster_status, a finished copy, and a sentinel
write prove none of this was reconciled, and there is no resync operation.

- Operating Replication and the replication reference: describe both
  directions, and require isolating and rebuilding a long-absent node
  (or treating it as a restore) before it reconnects.
- Health Checks: the return gate says the same; Backup and Recovery warns
  that a node restored from data older than retained history behaves alike.
- Across the guides: replace JSON operation bodies an operator runs with
  harper CLI commands against each node's direct URL, and add commands to
  the triage, drain/return, inventory, sizing, backup, and writeAsync
  steps.
- deploying-from-ci: fix the anchor to the renamed restart-mode section.

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

* Fix the documented commands that failed against a live Harper Pro 5.3.4

Ran the commands the changed pages document against a scratch Harper Pro
5.3.4 node. Fixes for what failed, each reproduced and traced in source
(unchanged on harper main):

- Rollback: activating a kept release that loaded a package: component,
  such as the templates' @harperfast/schema-codegen, fails with 409 because
  the loader's nested node_modules/harper link "links outside the build".
  Redeploy from the commit instead; releases without package: entries,
  like the built-once frontend, activate normally.
- Health checks: @harperdb/status-check 1.0.2 returns 500 on every /status
  request under the default vm-current-context loader, which parses its
  top-level await as CommonJS. Document a patched-copy workaround,
  verified GET/DELETE/POST.
- Monitoring: the exporter serves /prometheus_exporter/metrics, from its
  exported name, not /<project>/metrics.
- harper stop returns before Harper exits and removes hdb.pid first, so the
  manual snapshot restore raced the shutdown. Wait on the PID before
  touching files, in the CLI and backup references and the backup guide.
- create-harper adds https:// and :9925 only when they are omitted.

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

* Address review: rebuild peers from an authoritative node, isolate before restart, poll one node

- Long-absent policy now covers the authoritative-node case: keep it
  isolated, rebuild each peer empty, then add the peers back so they copy
  from it. The backup guide's step 6 links there instead of saying
  "reconcile", which closed the loop between the two guides. Checklists
  and the replication reference match.
- Drain step 5 isolates replication before Harper restarts when the node
  may outlast its peers' retained history; the return step refers back.
- The rolling-wait script deploys to and polls one node's own URL, since
  jobs are not replicated and the .env target is load-balanced.

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

* Address review: order the authoritative rebuild, wait out harper stop, update the deploy workflow

- Authoritative-node rebuild is now ordered steps: return the node to
  rotation while isolated, stop every peer before reinstalling any,
  reinstall each with replication isolated, then add the peers back one
  at a time. Backup step 6 admits the restored node first, so only the
  peers wait for convergence. The replication reference matches.
- The rotation drill waits for the old process to exit between
  harper stop and harper start (harper#3749).
- Link N - F to the sizing page's failure-state section.
- The frontend deploy workflow uses checkout, setup-node and
  upload-artifact v7, download-artifact v8, and Node 26 (LTS).

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

* Update the CI workflow examples to checkout and setup-node v7 and Node 26

The CI guide and the CLI authentication reference pinned actions v4 and
Node 22. From checkout v6 the persisted token lives in a file under
$RUNNER_TEMP rather than .git/config, so the persist-credentials
explanations now describe both.

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

* Address review: drain the peers before exporting their writes

In the authoritative-node rebuild, the export ran while peers were still
in rotation, so a write a peer accepted afterwards was lost when it was
reinstalled. The node now returns to rotation in the same window the
peers leave it, the export waits until their measured traffic is zero,
and stopping the peers is its own step.

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

---------

Co-authored-by: Aleks Haugom <aleks@harperdb.io>
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Co-authored-by: Dawson Toth <dawson@harperdb.io>
Co-authored-by: OpenAI Codex <noreply@openai.com>
…ommit error (HarperFast/documentation#740)

* Document super_user-only replication directives and the unconfirmed-commit outcome

X-Replicate-To and the operations API replicateTo/replicatedConfirmation
fields require super_user (harper#3084). A confirmation failure after a
local commit is reported with replicationUnconfirmed: true and
retryable: false (harper#3187).

Dispatch-Task: documentation-replicate-to-superuser-and-unconfirmed
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KEQo4qTSsfyXTJf7JNQVsz

* Scope the operations 403 note to operations that accept the fields

The sql operation never reads a body replicateTo or replicatedConfirmation,
so it is outside the verifyPerms guard by design; keep the claim to the
operations that consume them.

Dispatch-Task: documentation-replicate-to-superuser-and-unconfirmed
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KEQo4qTSsfyXTJf7JNQVsz

* Link the trusted-context example and warn against copying request input

The 403 notes now point to Programmatic Replication Control, whose example
shows the application deciding replication itself, and a sentence says that
copying client input into context.replicateTo or replicatedConfirmation hands
that client the control the super_user check removes.

Dispatch-Task: fix-kriszyp_documentation_740-efd46db4
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Show replicatedConfirmation through a new transaction, not a resource method

transaction() copies context.replicatedConfirmation onto the transaction
when it starts, and a REST request starts its transaction before the
resource method runs, so setting the count in put() was silently ignored.
The example now sets only replicateTo (read at write time) in the method and
shows the count passed to a new transaction() context.

Dispatch-Task: fix-kriszyp_documentation_740-efd46db4
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Say the confirming transaction needs a new context and commits on its own

Dispatch-Task: fix-kriszyp_documentation_740-efd46db4
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Drop the RocksDB-only limit on replication confirmation

harper#3392 (in v5.4.0-alpha.1) makes replicatedConfirmation wait for
peers on LMDB too, through the same ReplicationConfirmationError path.

Dispatch-Task: fix-kriszyp_documentation_740-1169ad29
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
…ocumentation#753)

* Document declarative slot residency and conversion

Dispatch-Task: hp-980-slot-residency
Co-Authored-By: GPT-5 Codex <noreply@openai.com>

* docs: state application branch residency limitation

Dispatch-Task: hp-980-slot-residency
Co-Authored-By: GPT-5 Codex <noreply@openai.com>

* docs: make conversion steps and example independently readable

Dispatch-Task: hp-980-slot-residency
Co-Authored-By: GPT-5 Codex <noreply@openai.com>

* docs: limit online residency adoption to key policies

Dispatch-Task: hp-980-slot-residency
Co-Authored-By: GPT-5 Codex <noreply@openai.com>

* docs: clarify shard agreement for legacy wire fallback

Dispatch-Task: hp-980-slot-residency
Co-Authored-By: GPT-5 Codex <noreply@openai.com>

* docs: require replica drain before residency downgrade

Dispatch-Task: hp-980-slot-residency
Co-Authored-By: GPT-5 Codex <noreply@openai.com>

* docs: state the slot-map precedence over replicateTo

Dispatch-Task: hp-980-slot-residency
Co-Authored-By: GPT-5 Codex <noreply@openai.com>

* Complete residency references and verified rollback procedure

Document conditional shard configuration, initialization and verification operations, status diagnostics and schema metadata. Give operators an executable replica-drain procedure and require custom-map installation before declarative application deployment on joining nodes.

Dispatch-Task: hp-980-slot-residency
Co-Authored-By: GPT-5 Codex <noreply@openai.com>

* docs: clarify initialization and conversion boundaries

Dispatch-Task: hp-980-slot-residency
Co-Authored-By: GPT-5 Codex <noreply@openai.com>

* docs: clarify residency prerequisites and confirmation behavior

Dispatch-Task: hp-980-slot-residency
Co-Authored-By: GPT-5 Codex <noreply@openai.com>

* docs: clarify confirmation failures and unknown slot deletion

Dispatch-Task: hp-980-slot-residency
Co-Authored-By: GPT-5 Codex <noreply@openai.com>

* Clarify single-key reads and unknown-slot deletion guidance

Dispatch-Task: hp-980-slot-residency
Co-Authored-By: GPT-5 Codex <noreply@openai.com>

* Document residency quarantine, writer replicas and confirmation timeouts

Dispatch-Task: hp-980-slot-residency
Co-Authored-By: GPT-5 Codex <noreply@openai.com>

* Connect replica lifetime settings to declarative writer caches

Dispatch-Task: hp-980-slot-residency
Co-Authored-By: GPT-5 Codex <noreply@openai.com>

* Clarify quarantined declarations and audit blob retention costs

Dispatch-Task: hp-980-slot-residency
Co-Authored-By: GPT-5 Codex <noreply@openai.com>

* Clarify residency activation and transaction confirmation examples

Dispatch-Task: hp-980-slot-residency
Co-Authored-By: GPT-5 Codex <noreply@openai.com>

* Link the subscription projection limitation directly

Dispatch-Task: hp-980-slot-residency
Co-Authored-By: GPT-5 Codex <noreply@openai.com>

* docs: link confirmation outcomes directly

Dispatch-Task: hp-980-slot-residency
Co-Authored-By: GPT-5 Codex <noreply@openai.com>

* docs: clarify new-owner confirmation scope

Dispatch-Task: hp-980-slot-residency
Co-Authored-By: GPT-5 Codex <noreply@openai.com>

* Document database-wide sharding and regional slot expressions

Explain hashed tenant affinity, logical regional slots, immutable policy, older residency APIs, and the spread follow-up in HarperFast/documentation#1122.

Dispatch-Task: hp-980-slot-residency
Co-Authored-By: GPT-5 Codex <noreply@openai.com>

* docs: define sharded recovery and existing-owner admission

Dispatch-Task: hp-980-slot-residency

Co-Authored-By: GPT-5 Codex <noreply@openai.com>

* docs: preserve ordinary writes during sharding root recovery

Dispatch-Task: hp-980-slot-residency

Co-Authored-By: GPT-5 Codex <noreply@openai.com>

* docs: clarify sharding placement and recovery boundaries

Dispatch-Task: hp-980-slot-residency
Co-Authored-By: GPT-5 Codex <noreply@openai.com>

* docs: explain local-only slot transition refusal

Describe the application-only refusal before native submission, internal apply exemptions, ordinary local-only behavior and affected-database rollback boundary.

Dispatch-Task: hp-980-slot-residency
Co-Authored-By: GPT-5 Codex <noreply@openai.com>

* Clarify local-only writer replica retention

Dispatch-Task: hp-980-slot-residency

Co-Authored-By: GPT-5 Codex <noreply@openai.com>

* Document the attribute-slot retry gap and marker-gated refusal

Dispatch-Task: hp-980-slot-residency

Co-Authored-By: GPT-5 Codex <noreply@openai.com>

* Clarify the binding affected by the attribute-slot retry gap

Dispatch-Task: hp-980-slot-residency
Co-Authored-By: GPT-5 Codex <noreply@openai.com>

* docs: describe the 5.4 abort-marker default and minimal retry fallback

Dispatch-Task: hp-980-slot-residency

Co-Authored-By: GPT-5 Codex <noreply@openai.com>

* Document primary-key sharding and defer concurrent attribute moves

Dispatch-Task: hp-980-slot-residency
Co-Authored-By: GPT-5 Codex <noreply@openai.com>

* Remove leftover attribute admission prose and clarify key conversion eligibility

Dispatch-Task: hp-980-slot-residency
Dispatch-Task: docs-753-rebase-20261028
Dispatch-Task: pr-maint-2615cc297c5c7e582179e0c7f65fb1b3
Co-Authored-By: GPT-5 Codex <noreply@openai.com>
Co-Authored-By: Gemini <noreply@google.com>

* Point confirmation-failure guidance at the single explanation

The Confirmation Failure After a Local Commit section in sharding.md
(from HarperFast/documentation#740) is the one place that explains replicationUnconfirmed and
retry safety. Replace the restatement in residency.md with a short link,
and point the API reference and 5.4 release note at that section rather
than the LMDB-only Confirmation outcomes section.

Dispatch-Task: docs-753-rebase-20261102
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017xoBAASx3a6cCDKgFGeZem

* Correct what the rowFilter warnings say a subscriber can learn

Non-owner invalidation payloads carry only indexed fields, so the exposure
a negated predicate creates is a record's id and indexed fields, not an
unindexed value. Match the wording in residency.md on the resource API and
schema pages.

Dispatch-Task: docs-753-rebase-20261102
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017xoBAASx3a6cCDKgFGeZem

---------

Co-authored-by: GPT-5 Codex <noreply@openai.com>
Co-authored-by: Gemini <noreply@google.com>
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>

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

Copy link
Copy Markdown

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 adds comprehensive documentation and release notes for Harper Pro, focusing on replication, clustering, schema-defined sharding, and the Web Application Firewall (WAF). The feedback points out several broken markdown links across the new documentation files where the opening parenthesis of the link target was omitted. These should be fixed to ensure the documentation renders correctly.


### Shard map operations

The POST operations [`initialize_shard_map`](./residency.md#installed-maps) and [`verify_shard_map`](./residency.md#3-compare-placement-on-every-node) require `super_user`. The former installs a snapshot without moving records; the latter compares the actual legacy function against a proposed key policy without modifying data. Their request examples, parameters and result fields are in the linked procedures.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

The markdown links for initialize_shard_map and verify_shard_map are broken because they are missing the opening parenthesis ( before the path. They should be formatted as [text](path).

Suggested change
The POST operations [`initialize_shard_map`](./residency.md#installed-maps) and [`verify_shard_map`](./residency.md#3-compare-placement-on-every-node) require `super_user`. The former installs a snapshot without moving records; the latter compares the actual legacy function against a proposed key policy without modifying data. Their request examples, parameters and result fields are in the linked procedures.
The POST operations [\`initialize_shard_map\`](./residency.md#installed-maps) and [\`verify_shard_map\`](./residency.md#3-compare-placement-on-every-node) require \`super_user\`. The former installs a snapshot without moving records; the latter compares the actual legacy function against a proposed key policy without modifying data. Their request examples, parameters and result fields are in the linked procedures.


## Schema-defined sharding

In v5.4, [`@sharded`](./residency.md) hashes primary keys to fixed slots on every worker. Slot counts and the installed slot map belong to the database. Attribute-derived policies and custom expressions are refused pending [concurrent-move design (#1178)](https://github.com/HarperFast/harper-pro/issues/1178).

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

The markdown link for @sharded is broken because it is missing the opening parenthesis ( before the path. It should be formatted as [text](path).

Suggested change
In v5.4, [`@sharded`](./residency.md) hashes primary keys to fixed slots on every worker. Slot counts and the installed slot map belong to the database. Attribute-derived policies and custom expressions are refused pending [concurrent-move design (#1178)](https://github.com/HarperFast/harper-pro/issues/1178).
In v5.4, [\`@sharded\`](./residency.md) hashes primary keys to fixed slots on every worker. Slot counts and the installed slot map belong to the database. Attribute-derived policies and custom expressions are refused pending [concurrent-move design (#1178)](https://github.com/HarperFast/harper-pro/issues/1178).


Default: None

This node's region for rule [`activation.regions`](./operations.md#activation) matching.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

The markdown link for activation.regions is broken because it is missing the opening parenthesis ( before the path. It should be formatted as [text](path).

Suggested change
This node's region for rule [`activation.regions`](./operations.md#activation) matching.
This node's region for rule [\`activation.regions\`](./operations.md#activation) matching.


Default: `[]`

This node's tags for rule [`activation.tags`](./operations.md#activation) matching. A tag selector matches when at least one rule tag appears in this array.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

The markdown link for activation.tags is broken because it is missing the opening parenthesis ( before the path. It should be formatted as [text](path).

Suggested change
This node's tags for rule [`activation.tags`](./operations.md#activation) matching. A tag selector matches when at least one rule tag appears in this array.
This node's tags for rule [\`activation.tags\`](./operations.md#activation) matching. A tag selector matches when at least one rule tag appears in this array.

Each present selector must be a non-empty string array:

- `nodes` - Matches this node's configured name.
- `regions` - Matches [`waf.region`](./configuration.md#wafregion).

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

The markdown link for waf.region is broken because it is missing the opening parenthesis ( before the path. It should be formatted as [text](path).

Suggested change
- `regions` - Matches [`waf.region`](./configuration.md#wafregion).
- \`regions\` - Matches [\`waf.region\`](./configuration.md#wafregion).


- `nodes` - Matches this node's configured name.
- `regions` - Matches [`waf.region`](./configuration.md#wafregion).
- `tags` - Matches if any listed tag appears in [`waf.nodeTags`](./configuration.md#wafnodetags).

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

The markdown link for waf.nodeTags is broken because it is missing the opening parenthesis ( before the path. It should be formatted as [text](path).

Suggested change
- `tags` - Matches if any listed tag appears in [`waf.nodeTags`](./configuration.md#wafnodetags).
- \`tags\` - Matches if any listed tag appears in [\`waf.nodeTags\`](./configuration.md#wafnodetags) value.

The optional `activation` object supports staged or canary deployment:

- `nodes` matches the node name.
- `regions` matches [`waf.region`](./configuration.md#wafregion).

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

The markdown link for waf.region is broken because it is missing the opening parenthesis ( before the path. It should be formatted as [text](path).

Suggested change
- `regions` matches [`waf.region`](./configuration.md#wafregion).
- \`regions\` matches [\`waf.region\`](./configuration.md#wafregion).


- `nodes` matches the node name.
- `regions` matches [`waf.region`](./configuration.md#wafregion).
- `tags` matches when the node has at least one listed [`waf.nodeTags`](./configuration.md#wafnodetags) value.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

The markdown link for waf.nodeTags is broken because it is missing the opening parenthesis ( before the path. It should be formatted as [text](path).

Suggested change
- `tags` matches when the node has at least one listed [`waf.nodeTags`](./configuration.md#wafnodetags) value.
- \`tags\` matches when the node has at least one listed [\`waf.nodeTags\`](./configuration.md#wafnodetags) value.

kriszyp and others added 9 commits November 3, 2026 08:30
…origins for 5.4 (HarperFast/documentation#791)

* Document stuck base copies, purge-bound retention copies and unnamed origins for 5.4

Companion to #1249: the cluster_status stuckCopy field
(retrying, held, refused), the per-log purge-bound rule that stops idle
databases from forcing base copies, and unnamed-origin-<id>@<node> naming.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Dispatch-Task: docs-harper-pro-1249-base-copy-liveness

* Tighten stuck-copy and purge-copy wording from review

Name the reporting node for reverse copies, count refusal-reason changes as
log transitions, scope `held` to one database, and list manual
delete_transaction_logs_before purges among the conservative copy cases.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Dispatch-Task: docs-harper-pro-1249-base-copy-liveness

* Describe the manual-purge copy point as at most the given timestamp

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Dispatch-Task: docs-harper-pro-1249-base-copy-liveness

* Point the Learn copy statements at the 5.4 base-copy rule

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Dispatch-Task: docs-harper-pro-1249-base-copy-liveness

* Smooth the purged-history wording and split the purge warning

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Dispatch-Task: docs-harper-pro-1249-base-copy-liveness

* Link the health-checks returning-node note to the 5.4 base-copy rule

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Dispatch-Task: docs-harper-pro-1249-base-copy-liveness

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…arperFast/documentation#733)

* docs: clarify RocksDB no-fsync durability and LMDB-only writeAsync

Explain that RocksDB commits write to Harper's transaction log in the OS
page cache without calling fsync (with RocksDB's own WAL disabled) and
rely on replication confirmation for durability across OS, power, or
host failures. Mark storage.writeAsync as LMDB-only and update the
storage algorithm and tuning pages accordingly.

Refs HarperFast/harper#3243

Dispatch-Task: docs-no-fsync-durability
Co-Authored-By: Gemini <noreply@google.com>

* docs: clarify transaction-log crash recovery and replication residency

Qualify that process-crash recovery on RocksDB requires the transaction log
to be enabled (the default via logging.auditLog: true and @table(audit: true)),
distinguish replication confirmation from replicateTo residency, note failure
domain and single-node constraints, correct logging.auditLog default to true in
options.md, and update the Storage Algorithm summary in database/overview.md.

Refs HarperFast/harper#3243

Dispatch-Task: docs-no-fsync-durability
Co-Authored-By: Gemini <noreply@google.com>

* docs: recommend X-Replicate-To: *;confirm=<k> for full-cluster REST confirmation

Document X-Replicate-To: *;confirm=<k> in storage-tuning.md and sharding.md so
REST clients can require peer confirmation without pinning residency to a fixed
node list, note the interaction with replication.replicateTo when omitting
replicateTo, and explicitly note that replication requires Harper Pro.

Refs HarperFast/harper#3243

Dispatch-Task: docs-no-fsync-durability
Co-Authored-By: Gemini <noreply@google.com>

* docs: clarify any-k confirmation failure domains and replication.databases[].replicateTo

Note in storage-tuning.md that replication confirmation counts any <k>
responding peers (so <k> must exceed the number of peers in the writer's
failure domain to survive a site-wide failure), and reference per-database
replication.databases[].replicateTo in storage-tuning.md and sharding.md.

Refs HarperFast/harper#3243

Dispatch-Task: docs-no-fsync-durability
Co-Authored-By: Gemini <noreply@google.com>

* docs: include system in replication.databases example and note allowlist behavior

Include system in the replication.databases example in sharding.md, note that
setting replication.databases to a list replaces the '*' default, and list
replicateTo in the replication.databases sub-options in options.md.

Refs HarperFast/harper#3243

Dispatch-Task: docs-no-fsync-durability
Co-Authored-By: Gemini <noreply@google.com>

* docs: note X-Replicate-To super_user requirement and audit inheritance

Note that the REST X-Replicate-To header requires super_user permissions (pointing non-superuser paths to Resource context.replicatedConfirmation), clarify that tables inherit logging.auditLog unless @table(audit: false), and qualify the ACID Durability bullet and intro in storage-algorithm.md.

Refs HarperFast/harper#3243

Dispatch-Task: pr-maint-f4c27688f221e43b3b7713c7df09f8da

Co-Authored-By: Gemini <noreply@google.com>

* docs: refine sharding confirmation phrasing and remove YAML comment in storage-tuning

Dispatch-Task: fix-kriszyp_documentation_733-81a9967d
Co-Authored-By: Gemini <noreply@google.com>

---------

Co-authored-by: Gemini <noreply@google.com>
….4.0 (HarperFast/documentation#799)

The purge-bound retention copy, derived names for unnamed origins and
cluster_status stuckCopy are backported to the 5.3 line by
#1262 and HarperFast/harper#4014. On 5.3, stuckCopy has
only retrying and held: refusal needs schema-defined sharding, new in 5.4.


Dispatch-Task: docs-harper-pro-1262

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…HarperFast/documentation@0a29827da6

The history of the pages moved here, rewritten to their new paths so log and blame keep
working. Commit messages refer to documentation PRs as HarperFast/documentation#N.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…cumentation

Converted from documentation@0a29827da6 by ~/dev/scripts/docs-migration/migrate.sh:
sidebar order is now page front matter and _category_.json (the site autogenerates the
sidebar from the tree assembled from harper and harper-pro), and the 5.4 release notes are
one fragment per change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Builds HarperFast/documentation with this PR's docs/ and the core docs at this PR's core
submodule commit, so broken links, imports and MDX errors fail the PR.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…closed

Bumps core to the harper change that moves the reference into docs/, so this repo's docs build
assembles core pages from the submodule commit. The build fails when the documentation site's
main cannot assemble docs/ yet, instead of passing without reading it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The site publishes the latest published release (or a docs/<release>-<n> tag of it), so it
redeploys when either appears rather than at its hourly check. Also bumps core to the harper
docs-in-repo head.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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