Repository navigation
Move the Harper Pro reference pages and 5.4 release notes into docs/ - #1237
Conversation
…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>
There was a problem hiding this comment.
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. |
There was a problem hiding this comment.
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).
| 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). |
There was a problem hiding this comment.
The markdown link for @sharded is broken because it is missing the opening parenthesis ( before the path. It should be formatted as [text](path).
| 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. |
There was a problem hiding this comment.
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).
| 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. |
There was a problem hiding this comment.
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).
| 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). |
There was a problem hiding this comment.
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).
| - `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). |
There was a problem hiding this comment.
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).
| - `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). |
There was a problem hiding this comment.
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).
| - `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. |
There was a problem hiding this comment.
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).
| - `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. |
…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>
c224ff2 to
cab4dcb
Compare
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
⊙ Problem
Harper Pro features are documented in HarperFast/documentation, so a user-facing change here needs a companion docs PR and a
companion-checkgate. 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/anddocs/reference/web-application-firewall/move here from HarperFast/documentation, with their git history._pro-*.md). The core page renders each partial, and its headings, anchors and table of contents are unchanged.Docsworkflow builds the site with this PR'sdocs/and the core docs at this PR'scorecommit.coreis bumped to the harper PR that addsdocs/.Publish Docsworkflow redeploys the site on a release or adocs/correction tag.🔧 Changes
docs/reference/replication/anddocs/reference/web-application-firewall/(7 pages plus_category_.json) are the documentation repo's files at the import commit, with sidebar order moved into front matter and prettier 3.9 formatting._pro-replication-operations.mdand_pro-waf-operations.mdare the Replication & Clustering and Web Application Firewall sections of the core Operations API page;_pro-replication-options.mdis thereplicationsection of the core configuration options page.docs/README.mdpoints to harper's docs guide and says how to preview with both checkouts.docs.yamlbuilds the site with this PR'sdocs/and the core docs at thecorecommit, runs on acorebump too, and fails when the site cannot assemble it yet.coremoves to the harper PR's head, the first core commit withdocs/.publish-docs.yamlruns on a published release (not a prerelease) or adocs/tag push, and sendsdocs-source-changedto HarperFast/documentation with a HarperFast AI App token scoped to that repo.docs/README.mdpreviews with justHARPER_PRO_DOCS_PATH, taking the core docs fromcore/.Moved files (17)
docs/reference/configuration/_pro-replication-options.mddocs/reference/operations-api/_pro-replication-operations.mddocs/reference/operations-api/_pro-waf-operations.mddocs/reference/replication/_category_.jsondocs/reference/replication/clustering.mddocs/reference/replication/overview.mddocs/reference/replication/residency.mddocs/reference/replication/sharding.mddocs/reference/web-application-firewall/_category_.jsondocs/reference/web-application-firewall/configuration.mddocs/reference/web-application-firewall/operations.mddocs/reference/web-application-firewall/overview.mddocs/release-notes/v5-lincoln/5.4/dedicated-replication-threads.mddocs/release-notes/v5-lincoln/5.4/lmdb-replication-confirmation.mddocs/release-notes/v5-lincoln/5.4/local-replicas-of-records-fetched-from-another-node.mddocs/release-notes/v5-lincoln/5.4/sharding.mddocs/release-notes/v5-lincoln/5.4/the-harper-pro-profiler-samples-in-short-windows.md✅ Verification
HARPER_DOCS_PATH=coreandHARPER_PRO_DOCS_PATH=., as the workflow does: it succeeds, and the published pages match the current site.docs/and the new workflow.publish-docs.yamlfirst runs at the next published release. It relies on the HarperFast AI App being installed on HarperFast/documentation, which that repo'sclaude-review.ymlalready uses; if it is not, the step fails and the site's hourly check publishes the release.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
Docscheck here fails on purpose, because the site'smaindoes not yet readdocs/.🤖 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
57f5d26f40e93d43minor reliability —.github/workflows/docs.yaml— Unpinned documentation-site checkout — NOT FILED6a204d81d0de7ba6minor security —.github/workflows/docs.yaml— Unpinned site npm ci/build runs with the full harper-pro tree on disk — NOT FILEDdcd34aca9c1e56b0nit reliability —.github/workflows/docs.yaml— Path-filtered check: if required it stays pending on other PRs; if optional a red build can merge — NOT FILEDa54e44b09caafce6nit reliability —.github/workflows/docs.yaml— No push-to-main trigger for a post-merge docs build — NOT FILEDLate Grok findings
3 surviving (highest minor), 5 previously adjudicated — Grok reviewed 24a7dbb
.github/workflows/docs.yaml:49— Thecoresubmodule this branch pins has nodocs/tree. Once the documentation site's main branch readsHARPER_DOCS_PATH, every Docs build this workflow triggers fails before compiling a page. (previously adjudicated).github/workflows/docs.yaml:33— The check can pass green without building this PR's docs at all..github/workflows/docs.yaml:28— Code from the site repo runs with the whole private harper-pro source on disk..github/workflows/docs.yaml:33— The site checkout passes notoken. IfHarperFast/documentationwere private, the checkout would fail with not-found..github/workflows/docs.yaml:8— With thepaths: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).github/workflows/docs.yaml:3— Part of the header comment describes the checkout and build steps the YAML already shows. (previously adjudicated)docs/README.md:5— The preview command does not say it must be run from aHarperFast/documentationcheckout. (previously adjudicated).github/workflows/docs.yaml:8— There is nopush: maintrigger, 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