Skip to content

docs: regenerate rules from documentation@0d151a2 - #84

Open
harper-skills-sync[bot] wants to merge 1 commit into
mainfrom
auto/docs-sync
Open

docs: regenerate rules from documentation@0d151a2#84
harper-skills-sync[bot] wants to merge 1 commit into
mainfrom
auto/docs-sync

Conversation

@harper-skills-sync

@harper-skills-sync harper-skills-sync Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Automated regeneration of docs-driven skill rules, now synced to HarperFast/documentation@0d151a2.

Why these rules changed

Each rule regenerated because its source content differs from the docs commit it was last synced from. The trigger commit is not necessarily what changed a given rule — drift accumulates across every docs commit since the rule’s recorded baseline (below).

  • automatic-apis — last synced from docs@677ad21
  • checking-authentication — last synced from docs@677ad21
  • programmatic-table-requests — last synced from docs@677ad21
  • deploying-to-harper-fabric — last synced from docs@677ad21
  • v5-upgrade — last synced from docs@677ad21
  • enabling-mcp — last synced from docs@d7d2ddb
  • custom-mcp-tools — last synced from docs@d7d2ddb

Docs commits since baseline (d7d2ddb..0d151a2)

0d151a2c	Document Table.oldestRetainedAuditTime() and the subscription catch-up horizon (#660)
e2b84dba	docs(http): correct serializeStream return type - follow-up to #641 (#655)
8ef2ff04	docs(components): document app cleanup on shutdown via scope 'close' (#647)
3356abcd	docs(configuration): pair threads.preload with preloadRequire for dd-trace (#644)
d895f428	docs(reference): use harper-config.yaml consistently in v5 (#661)
c8322454	docs: fix four v5 reference errors surfaced by skills#81 (#662)
c2f80c8e	Document that deploy_component waits for restart: true (#638)
677ad213	docs(learn): link Docker install tab to env var configuration reference (#643)
980e5cb1	Document copy-db's blob companion directory and restore steps (#620)
48f13df2	docs: add Multiple Applications on One Cluster guide (#586)
a563b467	docs(agents): --cherry-mark, not --cherry-pick, to find a back-port
e757d703	docs(agents): ancestry cannot answer the badge question; test for the files
4de5206d	docs(security): fix a policy example that would be rejected, and three gaps
86440d3e	docs(agents): patch tags come off a release branch, so --contains is empty by design
5cda8154	docs(rest): map exported tables to their automatic REST endpoints (#650)
98872e4e	docs: link static plugin implementation as plugin API example (#642)
eb49a16c	docs(http): remove unimplemented deserializeStream handler property (#641)
0841ba68	docs(cli): document the `harper deploy` command (#624)
090ff882	docs(resources): scope static properties schema docs to shipped behavior (#605)
3603b4d8	docs(mcp): custom mcpResources and the harper+rest:// descriptor scheme (#567)
39526f8b	chore: add missing final newlines to config files (#652)
4a7cf94f	ci: deploy on reference/** and historic-redirects.ts changes (#651)
ef9921b6	docs: fix broken anchors and stale HarperDB org URLs (#649)
f0c92c59	docs(components): align package scopes with published npm names (#645)
be934414	docs(cli): object and array-of-object params do work via CLI (#646)
55228e71	style(version-badge): right-align standalone badges onto the heading line (#653)
966c5b88	chore: make Renovate group, automerge, and refresh dependencies (#648)
ca6143ef	Document record-structure dictionary counts and the encoding they measure (#633)
0734027c	Document the built-in agent operations API (#635)
28b62396	Add companion-check workflow: docs PRs auto-merge once their companion code PR lands (#629)
51e315e8	docs: document static loadAsInstance in the v5 Resource API reference (#619)
cd6e102e	docs: replicating the system database with a constrained topology (5.2) (#583)
71bb19e0	docs(analytics): document transaction-commit-time metric (#572)
efa22403	docs: replication.blobGapReconnectMs and bulk-copy cursor flush options (#628)
a455bd46	Document scoped tokens (inline role) for create_authentication_tokens (#627)
fd94430a	docs(storage): document storage.blobRetention (#622)
87f1d209	Document cacheControl directive, identity-floor caching headers, and static plugin cache options (#578)
e52bed3f	docs(security): response-header hardening (app-level controls + #1567 gap) (#560)
c1885b71	docs: clarify that @hidden, @export are not access controls + allowRead trusted-context / filter caveats (#553)
1fd0faa9	docs(agents): verify the tag object before trusting --contains
2dadb894	docs(security): qualify the uniform-rejection claim
9c8a89fa	docs(security): aim the OIDC section at the happy path, add a CLI walkthrough
399338c1	docs: copy edits from review
8a4762f3	docs: OIDC trusted publishing, ops-table anchors, and badge guidance
6bf676d4	docs(deploy): complete the super_user call list for deploy setup
d1f34583	docs: drop a duplicated header and clarify "before it ships"
47d872ad	docs(security): add_ssh_key server-side keygen (v5.2.4)
a74ae3b6	docs(deploy): by-reference deploys and sealed credentials (v5.2.3)
aa74b1cc	Badge node identity change for v5.3.0 and add 5.3 release notes
cca76303	Correct node.hostname docs to match merged rejection behavior
0ca3fbfb	Drop in-doc harper issue/PR links per review
97b3b05f	Document node.hostname config and require a bare hostname
97284557	docs(cli): local authorization applies only when no credential is attached
7b99e1b8	docs(security): give authorizeLocal the facts the CLI page defers to it
05412a63	docs(cli): scope the loopback remediation to a pointer, keep the hazard
964fd165	docs(cli): the socket rule is also the limit of the loopback remediation
9f3b6b03	docs(cli): only authorizeLocal:false closes the loopback exposure, and it needs a restart
c5255853	docs(cli): the loopback case needs configuration, not a result check
4a4b855b	docs(cli): resolve the contradiction the loopback bullet created
c8acc796	docs(cli): loopback targets make a token failure succeed, not fail
e70060ff	docs(cli): point the 403 warning at its tracking issue
a9ecc7eb	docs(cli): state the one-credential-style rule once, up front
43bbafcf	docs(cli): a lost target falls back to the saved login, not straight to local
64a51e58	docs(cli): expiry answers 403 and does not halt the command
86ea5c5e	docs(release-notes): scope the refresh-failure caveat to the CI credential shape
3388ec11	docs(cli): split refresh-failure behavior by credential shape
e6c37f0e	docs(cli): narrow two token-handling claims to what 5.2.4 actually does
030c46ef	docs(cli): a blank token namespace is skipped, not a hard failure
7a9187d8	docs(release-notes): cover CI token credentials in 5.2
7cfed5a8	docs(cli): slot token credentials into the canonical auth precedence
c6838cf2	Document the child_process spawn contract for components (#634)
544f15d1	Separate queue depth coverage and attribution limits
56a9d4e1	Document mixed-engine queue depth undercounting
5ca5352d	Identify the stuck commit log signal
633c0dbd	Clarify raw queue depth alert path
098e548b	Clarify transaction queue depth metric semantics
e70894de	fix(docs): sync maxTransactionQueueTime bypass note and remove stale duplicate wording
dabdad00	fix(analytics): transaction-commit-time is silent on a true wedge, not rising
e0d58b4d	fix(analytics): document transaction-commit-time as the 503 leading indicator
9607b80d	fix(analytics): correct aggregation semantics and doc conventions
1c415a61	fix(analytics): correct transaction queue depth documentation
ab213e59	fix(analytics): satisfy prettier table formatting
ef7d4427	docs(analytics): document transaction queue depth metrics
df4971bc	Fix conflicting storage model in logging.auditLog description
a7ad4a01	Address Codex review: fix LMDB result fields, cross-page log terminology, config default
98b1a99e	Collapse audit-log/transaction-log distinction; fix conflicting messaging
1e9a4d50	Split the scoping notes into bold-led sub-paragraphs
bb794065	Add tool-calling scoping note to the CI-stub section
ebb9e70e	Document operation authorization and explicit row filters (#593)
5cc6c517	Address review round 2: LMDB example gap, WAL clustering row, data-safety admonition, params/results, get_job error example, 5.2 release note
ffe30c44	Address review: job semantics, storage-model consistency, badge placement, type style
f3d66404	Clarify engine scope of the 404 change and document cleanup_deleted_records
22004028	Add Transaction Log Operations section header
71bd2636	Document database-wide-only transaction log deletion on RocksDB
7ddbe0e8	docs(backups): use plain ASCII in blob path notation and shell comments
e93a18d5	docs(http): address review feedback on connectionInfo docs
92719679	docs(http): document request.connectionInfo (forwarded PROXY v2 TLS facts)
f6924587	docs: fastifyRoutes host mount fails to load, not just a warning
f013ba24	docs: note that deploy_component mount options require package
b36d21e7	docs: note what an application mount does not do
d623f458	docs: route applications by host/urlPath in the root config
b2d60531	docs(backups): align with harper#1831 (blobs, verify scope, restore semantics)
a3521397	docs: clarify env var context in CLI auth precedence list
d3631f0a	Document CLI authentication precedence
de314d59	Add missing transaction import to migration example (#606)
a5be7383	chore: migrate to @harperfast/code-guidelines (#615)
8ee6cda7	docs: add Web Application Firewall reference (#603)
a19158fc	docs(schema): correct from+to relationship cardinality to many-to-one (#602)
94a3d5af	docs(backups): clarify engine-specific backup paths and reorder ops
c75d5891	ci: re-enable the pr-preview paths filter (#611)
47b82ca9	feat(ci): deploy docs site to production Harper fabric on main (#610)
024870f6	ci: pin deploy/validate workflow actions to commit SHAs at latest releases (#608)
9a7ae7fc	fix(ci): use admin-scoped token to delete PR preview environments (#607)
dd5fa32b	fix(mcp): correct the exportTypes MCP-gating example (#601)
fcf2c7a5	Document get_deployment_payload / delete_deployment_payload response contracts (#600)
69343c0e	docs(tls): document multi-source cipher/SECLEVEL resolution per listener (#598)
6dff1546	docs(sql): 5.2 SQL engine performance guidance (#588)
aaa7af1b	Document the built-in scheduler component plugin (5.2) (#592)
7eae83cc	docs(models): local-development setup matching production (#597)
03000d39	docs: document middleware host and path routing (#595)
d8d7ba4d	docs(learn): deploying from a CI/CD pipeline into Harper — best practices for private repos and registries (#594)
f0d69516	docs: note cross-database read consistency for sourcedFrom resolvers (#591)
8aba3c31	Document the @expiresAt schema directive (#585)
37dd3476	docs(security): secrets store, secrets operations, and deploy_component registryAuth (#581)
c7e80a74	docs(rest): clarify PATCH is a shallow top-level merge (nested objects replaced, not deep-merged) (#547)
752cdef8	Restructure backup docs into a dedicated Backups reference section
561160bc	Use snake_case response fields for backup operations (backup_id, file_count)
f7211a60	Address docs review: keep_count wording, target_database CLI example
ff392e0d	Document RocksDB backup & restore operations

Produced by .github/workflows/generate.yaml. Review the diff as you would any rule change — the generator reads the docs build output and rewrites mode: generate / imports mode: direct rule bodies, then reassembles AGENTS.md. See docs/plans/docs-driven-skills.md.

🤖 Generated with Claude Code

@harper-skills-sync
harper-skills-sync Bot requested a review from a team as a code owner September 2, 2026 18:55
@harper-skills-sync harper-skills-sync Bot changed the title docs: regenerate rules from documentation@c832245 docs: regenerate rules from documentation@d895f42 Sep 2, 2026
@harper-skills-sync harper-skills-sync Bot changed the title docs: regenerate rules from documentation@d895f42 docs: regenerate rules from documentation@e2b84db Sep 2, 2026
@harper-skills-sync harper-skills-sync Bot changed the title docs: regenerate rules from documentation@e2b84db docs: regenerate rules from documentation@0d151a2 Sep 2, 2026

@kriszyp kriszyp left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

🤖 Reviewed with Codex

When both tokens have expired, call `create_authentication_tokens` again with username and password.

8. **Mint scoped tokens for limited access**: A super user can embed an inline role in `create_authentication_tokens` using the same `permission` structure as `add_role`. Include `expires_in` to control lifetime. Do not include a `password` field. The `username` is attribution only and must not match an existing user.
8. **Mint scoped tokens with an inline role**: A `super_user` can embed permissions directly in a token using the `role` field and `expires_in`. The `username` is attribution only and must not name an existing user. No `refresh_token` is issued. Use `add_role`-style `permission` structure.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

The previous generated rule retained the 12KB Authorization-header limit for scoped tokens, but this regeneration removes the only mention of it. A large inline role can therefore produce a token that the HTTP server rejects even though the recipe presents it as valid. Please restore the limit next to the scoped-token constraints and add a localized must_cover anchor so later regenerations cannot discard it again.

— KrAIs (GPT-5)

## How It Works

1. **Import `tables` from `harper`**: Access all tables in the default `data` database via the `tables` object. Each table defined with `@table` in `schema.graphql` is a property.
1. **Import `tables` (and other APIs) from `harper`**: Access every table defined in `schema.graphql` as a named property of `tables`. Each property is the table class implementing the Resource API.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

tables contains only tables from the default data database; a schema type declared with @table(database: "analytics"), as this regeneration now demonstrates elsewhere, is available through databases.analytics, not tables. Following this statement makes tables.Event unexpectedly undefined. Please preserve the default-database qualifier and direct readers to databases.<name> for non-default tables, with generation coverage for that distinction.

— KrAIs (GPT-5)

Product.search({ conditions: [{ attribute: ['brand', 'name'], value: 'Harper' }] });
```

6. **Apply `select` to shape results**: Pass an array of property names, a single string, or nested objects for relationships.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

The declared Resource API source explains that a to-many relationship resolves to an array and, depending on the access pattern, its property may need to be awaited before iteration. This regenerated relationship-select recipe drops that caveat, so an agent can treat an unresolved relationship as the array itself. Please restore the to-many behavior and await warning, and anchor it in generation coverage.

— KrAIs (GPT-5)

// NEW
const target = new RequestTarget(); // passed in automatically when overriding get()
target.id = id;
const record = await Table.get(target);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This const record redeclares the binding introduced earlier in the same JavaScript fence, so the example fails to parse. The next old/new example repeats the problem at harper-best-practices/rules/v5-upgrade.md:55-59, and the relationship example similarly redeclares book at harper-best-practices/rules/programmatic-table-requests.md:116-120. Please split each old/new or alternative example into separate fences, or use distinct bindings, then rebuild the aggregate mirror. A localized syntax check for generated JavaScript fences would prevent this class of regression.

— KrAIs (GPT-5)

5. **Apply `select` to shape results**: Return only the fields you need. Supports arrays, nested relationship selects, and special properties.
```javascript
Product.search({
conditions: [

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This generated line prefixes a tab with spaces. The same issue occurs throughout harper-best-practices/rules/programmatic-table-requests.md:90-99, harper-best-practices/rules/programmatic-table-requests.md:121-122, harper-best-practices/rules/programmatic-table-requests.md:151-152, harper-best-practices/rules/programmatic-table-requests.md:179-195, harper-best-practices/rules/programmatic-table-requests.md:227-228, three lines in harper-best-practices/rules/v5-upgrade.md, and their aggregate mirrors; git diff --check origin/main...HEAD reports 70 errors. Please normalize both source rules and rebuild the aggregate before merging.

— KrAIs (GPT-5)

- The `headers` property on a returned REST response object is used as response headers.
- Under `lockdown: ses`, the constrained `fetch` applies only in `vm` mode. In `vm-current-context` and `native` modes, application code uses the standard global `fetch`.
- In production, `allowedDirectory: app` is the default; modules outside the application directory tree will throw. Set `allowedDirectory: any` only if legitimately required.
- Import all Harper functions and APIs from `from 'harper'`, not from global variables or `harperdb`.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This note says to import APIs from from 'harper', leaving a duplicated from in the generated instruction. Please change it to “from 'harper'” and rebuild the aggregate mirror.

— KrAIs (GPT-5)

Ethan-Arrowood added a commit that referenced this pull request Sep 4, 2026
Three fixes from Kris's review on #86.

Git identity before the merge. actions/checkout configures no identity,
and `git merge origin/main` writes a commit whenever it is not a
fast-forward — which is the normal path, since semantic-release advances
main routinely. Git then exits 128 with "Committer identity unknown" and
the broad handler misreported it as a merge conflict, wedging sync.
Reproduced locally: exit 128, and `git ls-files --unmerged` empty, so the
old message was actively wrong. Configure the App identity before the
merge (the commit step still sets it; git config is idempotent), and
split the handler so a real conflict names its files via
--diff-filter=U while any other failure says so instead of guessing.

Reuse the branch only while an open PR owns it. Remote branch existence
is not the same thing: closing a rejected sync PR leaves its head branch
behind, so the documented "close the PR and re-run" recovery checked out
the same stale branch and replayed the conflict, or carried abandoned
generated content into the next PR. Gate on `gh pr view --json state`
and start clean from origin/main otherwise; --force-with-lease still
refuses to clobber a push that landed after checkout. The recovery hint
now matches the behaviour.

Fence-aware stripping. inlineCodeSpans stripped only triple-backtick
fences while its comment promised fenced blocks were excluded, so a
backtick expression inside a ~~~ fence would register as a fact and
deleting that example later could falsely block generation. Add
stripFencedBlocks to lib/sources.mjs, where fence knowledge already
lives — sliceSection has handled `{3,}`/`~{3,}` all along, so the
narrower regex was also inconsistent with the module it sits next to.
It follows CommonMark on delimiter character, run length, indent and
info strings, and stripCode now shares it.

Covered by 13 focused tests under node --test (no new dependency), wired
into `npm run validate` via a `test` script. Behaviour on the current
corpus is provably unchanged: old and new stripping produce identical
fact sets across all 33 rule bodies, so the losses this caught on #84
still get caught. The scanner only differs on inputs the corpus does not
yet contain, which is the point.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant