Skip to content

PointSav Documentation

The engineering library for the PointSav platform — operating systems and services for regulated businesses that own their data, their AI, and their record-keeping outright. Where the monorepo holds the code, this wiki holds the reasoning: architecture, services, security, and the governance commitments that bind future development.

Rotate keys and capability tokens

← All revisions

f99f9774 · PointSav Digital Systems ·

feat(machine-authorization): rewrite Machine authorization guide group against real source, split into own category

View the full record as of this revision →

@@ -0,0 +1,79 @@
---
schema: foundry-doc-v1
title: "Rotate keys and capability tokens"
slug: rotate-keys
short_description: "Replaces a service-content credential within the real system's limits: tokens expire on a fixed 24-hour clock, overlap is unavoidable, and no mechanism cuts a live token short."
category: machine-authorization
index_group: pairing-and-tokens
content_type: how-to
type: how-to
quality: complete
status: active
audience: "Engineers (hands on keyboard); service operators"
last_edited: 2026-08-06
editor: pointsav-engineering
paired_with: rotate-keys.es.md
research_trail:
  sources: [pointsav-monorepo service-content pairing module (token issuance, pair registration, capability verification), service-content HTTP route table]
  verification_method: "independently source-verified against pointsav-monorepo on 2026-08-06 by reading the Rust source directly, with file:line citations recorded per claim; the absence of any revoke, delete, or invalidate function across the pairing and capability code was confirmed by reading the module's full public surface rather than by searching for an expected route name"
---

## Prerequisites

- Familiarity with [[issue-capability-token]], which covers the wire format, both payload shapes, and the issuance call — this guide does not repeat them
- HTTP access to the issuing `service-content` instance
- The issuance time of the credential you are replacing, or its decoded `expiry` field

## Purpose

Replace a live capability credential with a fresh one — about five minutes of work, after which the credential you replaced stays valid for the remainder of its own 24 hours.

## Procedure

> **Warning:** there is no revoke, delete, or invalidate operation anywhere in this system. Issue-new-then-retire-old is not available. Plan the cutover on the assumption that the old credential keeps working until its clock runs out.

1. Decode the payload of the credential you are replacing and read its `expiry`. That timestamp is 24 hours after issuance and is the moment the old credential stops working.

2. Request a replacement token with the same role and scope you intend to keep:

   ```bash
   curl -s 'http://<service-content-host>/v1/pair/token?role=<role>&node_label=<label>&archive_scope=<archive-a>,<archive-b>'
   ```

3. Register the replacement with the receiving peer:

   ```bash
   curl -s -X POST http://<peer-host>/v1/pair \
     -H 'Content-Type: application/json' \
     -d '{"token":"<new-token>","public_key":"<issuer-public-key>","node_label":"<label>"}'
   ```

4. Point the calling service at the new credential and confirm its next request succeeds before you stop using the old one.

5. Let the old credential expire on its own clock. No further action shortens it.

## Expected outcome

Two credentials are valid at once: the new one for the next 24 hours, and the old one until the `expiry` you read in step 1. The overlap is a property of the system, not a transition window you configure, and it cannot be shortened.

## Verification

Confirm the new credential works by exercising a capability-gated route with it and checking the request reaches its handler.

Confirm the old credential's retirement by reading its `expiry` field, not by testing for rejection. Testing the old credential before that timestamp will show it still passing the gate — that is the expected result, not a failed rotation.

## Rollback

Rotation is safe to re-run and safe to abandon. Requesting another token does not disturb any token already issued, and the credential you were replacing is still valid until its expiry, so pointing the caller back at it restores the prior state exactly.

## Next steps

- [[issue-capability-token]] — the issuance call, both payload shapes, and the scoping decision
- [[service-content]] — the service that signs and verifies these credentials
- [[capability-based-security]] — the authorization model these tokens operate within

## Known limitations, as built (2026-08-06)

- **No per-token invalidation.** If a credential is suspected compromised, nothing in this system stops that specific token before its 24-hour expiry.
- **The one immediate recourse is service-wide.** Regenerating the issuing service's own signing keypair — deleting its persisted key file and restarting the service — does invalidate the compromised credential, along with every other token and pairing that service has signed. There is no command for this, it is not a documented supported operation, and it is not a rotation procedure.
- **Scope narrowly at issue time.** Because the 24-hour clock is the only control available, the `archive_scope` and `role` chosen at issuance are the practical limit on a compromised credential's reach.
Important Information

Corporate structure. PointSav Digital Systems ("PointSav") is currently a trade name of Woodfine Capital Projects Inc. ("Woodfine"), planned to become a wholly-owned Woodfine subsidiary upon incorporation. PointSav does not itself offer, sell, or solicit any security. Any securities offering associated with Woodfine's real-property direct-hold solutions is made exclusively by Woodfine, and only by means of the applicable Private Placement Memorandum.

No investment advice. This wiki's content is provided for engineering, operational, research, and development purposes. Nothing on this wiki constitutes investment advice or a solicitation to invest in any Woodfine partnership or direct-hold solution.

Intellectual property. The PointSav name, trade name, wordmark, and marks, together with all current and future PointSav- and Totebox-branded products, services, and offerings — and the software, source code, documentation, design system, and all related materials — are proprietary to Woodfine and its affiliates, except for components identified as open source. No rights are granted except as expressly set out in a written license or agreement. The full trademark notice appears in the footer of every page on this site.

Open source components. Portions of the platform are made available under permissive open-source licenses identified in the accompanying repository. Use of those components is governed by their respective license terms.

No warranty; informational use. Content on this wiki is provided for general informational purposes only and does not constitute a representation, warranty, or commitment with respect to product functionality, availability, pricing, or roadmap. Some articles describe planned or intended features, capabilities, and milestones — language such as "planned," "intended," "targeted," "may," and "expected" marks this forward-looking content, which is subject to change and does not constitute a commitment regarding future performance.

Confidentiality. Where an article describes an operational or deployment detail that is not intended for public disclosure, that article is not published on this wiki. Content here is general-purpose engineering documentation, not customer-specific configuration.

Jurisdiction. Woodfine Capital Projects Inc. is organized in British Columbia, Canada. References to the Sovereign Data Foundation on this wiki describe a planned or intended initiative only, not a current equity holder or active governance body.

Changes to this notice. PointSav may update this notice from time to time; the version posted on this page governs.

Not a filing system. This wiki is not a securities filing system, an electronic disclosure repository, or a substitute for SEDAR+ or any other regulatory filing system. Formal securities filings are made through the applicable regulatory filing system, not through this wiki.

Full disclaimer. This notice supplements, and does not replace, the full Disclaimers article. In the event of any conflict, the full Disclaimers article governs.

Read the full disclaimer →