Pursers Personal Import 5.0.0
pursers-personal-import is a copy-only importer from On Board v4 into Pursers
Personal. It does not modify or replace the On Board v4 command or its data.
The importer copies one local v4 .agent-mem board into a new, empty Personal
Central data root. It requires an explicit owner principal and owner agent; it
does not infer either identity from legacy labels. Legacy agents remain
unbound for later review.
Safety boundary
- Stop Personal Central before every
import,archive-backfill,retry,rollback, andstatusoperation.--confirm-central-stoppedis an operator attestation; the tool does not detect or stop a running Central process. - The source is read under its
.board.lock. The tool verifies the live tree before and after the lock-bounded copy and performs all conversion from the sealed private copy. - The completed proof becomes authoritative only after the durable
freeze_completedstate anchors its exact bytes and all three copied trees. If interruption occurs before that anchor, retry discards the unanchored output and revalidates the live source. Source writes after the anchor do not become a retry or rollback precondition. full-source-backuppreserves every supported regular source file byte. Original metadata is recorded in the source seal, while private-copy modes are normalized.source-snapshotis a separate import-domain copy with a synthetic write fence; these hashes are intentionally different.- Source symlinks, hard links, special entries, duplicate JSON keys, duplicate memory or ticket identifiers, and malformed record shapes fail closed.
- The importer accepts at most 100,000 tree entries, 64 MiB per regular file, and 256 MiB of regular-file payload per tree. Oversized inputs fail before installation; these are explicit compatibility limits, not truncation.
- The Central target must be absent or an empty private directory. Import into an existing non-empty Personal data root is intentionally out of scope.
- Conversion halts at
review_requiredbefore target installation whenever a masked quarantine row or unbound legacy agent remains. A private worksheet is written under the run directory. Installation resumes only after a complete decision file and explicit bind-or-RETIREcoverage replay as idempotent, leaving zeroUNMAPPEDagents. - Install and rollback use durable state, parent-directory fsync, private backups, and exact tree seals. A changed post-import Central tree is moved to rollback quarantine before the original empty baseline is restored.
- The stable v4 Homebrew installation is hashed immediately before and after conversion. Later package-manager changes do not disable retry or rollback.
- The tool opens no network listener and makes no remote call.
Command contract
Use the canonical Homebrew Cellar directory, not the opt symlink:
STABLE_INSTALL="$(brew --cellar onboard-memory)/4.0.4"
pursers-personal-import import /path/to/project/.agent-mem /path/to/new-central-data \
--run-dir /path/to/private-import-run \
--board-id personal-board \
--owner-principal-id personal-owner \
--owner-agent-name local-agent \
--stable-install-root "$STABLE_INSTALL" \
--confirm-central-stopped
pursers-personal-import retry /path/to/private-import-run \
--confirm-central-stopped
pursers-personal-import status /path/to/private-import-run \
--confirm-central-stopped
pursers-personal-import archive-backfill /path/to/project/.agent-mem/archive.json \
/path/to/existing-central-data \
--board-id personal-board \
--scrub-profile internal \
--redact-secrets-record ARCHIVE-record-key \
--confirm-central-stopped
pursers-personal-import decide /path/to/private-import-run \
--policy /path/to/POLICY-signed.json
pursers-personal-import review /path/to/private-import-run \
--decisions /path/to/private-decisions.json \
--bindings /path/to/private-bindings.json \
--confirm-central-stopped
pursers-personal-import rollback /path/to/private-import-run \
--confirm-central-stopped
archive-backfill is for boards imported before archive.json became part of
the import domain. It appends deterministic archived-memory records only;
rerunning it does not duplicate rows and it never rewrites existing memories.
The default strict scrub profile rejects every detected violation. Use
--scrub-profile internal only when home paths must be retained byte-exact;
all non-posix_home violations remain fail-closed.
Repeat --redact-secrets-record only for explicitly approved archive record
keys. Secret spans in those records are replaced with scrub markers and the
rules are recorded as provenance; a missing or clean listed key is an error.
When import reports review_required, use the private files under the owned
run directory:
decideaccepts an owned0600policy JSON document withschema_version: 1,status: "POLICY-SIGNED-READY", the matchingboard_idandworksheet_sha256, and arulesobject mapping every rule present in the worksheet toaccept-as-is,redact-span, ordrop. It writesevidence/policy-decisions-<policy-hash>.jsonas an owned0600complete decisions file. Use--outputto select another file in an owned0700directory. Mixed rules on one record escalate the entire record to the most restrictive action (drop, thenredact-span, thenaccept-as-is). Secret-class rules cannot be auto-accepted.evidence/quarantine-worksheet.jsonlists masked quarantine rows. Create an owned0600decisions file with the sameboard_id,worksheet_sha256, and one entry per worksheet row. SetstatustoREVIEWED-SIGNED-READY, includereview_metadata.reviewed_at, preserve each row'srecord_key,record_type,record_id,field, andrules, and replacedecisionwith exactlyaccept-as-is,redact-span, ordrop. A decision applies to the whole top-level legacy record, so every row for the same record must use the same action; mixed per-field actions fail closed.accept-as-ispreserves reviewed content, except a secret-bearing structural memory, agent, ticket, artifact, or state key identifier is always replaced by its stablesha256-...safe identifier.redact-spanuses the same structural normalization. This exception prevents the raw identifier from becoming a database key, worksheet key, or log value.evidence/identity-binding-worksheet.jsonexplains every legacy identity; copyevidence/identity-bindings-template.jsonto a separate owned0600decisions file. Replace each applicablePENDINGvalue withRETIREor an approved Central principal ID. Keys userecord:<record_id>so duplicate display names remain unambiguous. Delete template entries for quarantined agents that the quarantine decision drops; keep and decide entries restored byaccept-as-isorredact-span, and updateentry_countto the number of binding keys. Do not edit the sealed worksheet or template in place.
Pass the completed owned 0600 files to review. The tool copies and seals
them before use; incomplete, extra, ambiguous, or changed decisions fail before
installation.
The source, run directory, Central target, and stable installation must be disjoint. Run and target parents must be owned by the current user and must not be group- or other-writable. State, receipts, backups, worksheets, and quarantine remain private under the run directory.
The runtime uses only the Python standard library. Building the distribution
requires the build dependencies declared in pyproject.toml.
Metadata
Release files for pursers-personal-import 5.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| pursers_personal_import-5.0.0-py3-none-any.whl | Python 3 | none | any | Details for pursers_personal_import-5.0.0-py3-none-any.whl |
Release files / pursers_personal_import-5.0.0-py3-none-any.whl
| Download URL | pursers_personal_import-5.0.0-py3-none-any.whl |
|---|---|
| Size | 65.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1812b486a62678d050e56edc85a952f1746f881984204266297a7599d9f66c2f
|
|
BLAKE2b-256 checksum How to use checksums |
70a409399b920bfc6be68c36bda6155c5e65ac1e4fb521da593ea885f69a1879
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 18, 2026.
Transparency logSecurity for pursers-personal-import 5.0.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 1 file in this release has been uploaded with provenance metadata.
Attestation for pursers_personal_import-5.0.0-py3-none-any.whl
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 18, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.