orion-handoff 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- orion_handoff-0.1.0/CHANGELOG.md +17 -0
- orion_handoff-0.1.0/CONTRIBUTING.md +20 -0
- orion_handoff-0.1.0/LICENSE +21 -0
- orion_handoff-0.1.0/MANIFEST.in +9 -0
- orion_handoff-0.1.0/PKG-INFO +87 -0
- orion_handoff-0.1.0/README.md +76 -0
- orion_handoff-0.1.0/RELEASE_CHECKLIST.md +13 -0
- orion_handoff-0.1.0/SECURITY.md +11 -0
- orion_handoff-0.1.0/docs/runbooks/local-handoff-store.md +73 -0
- orion_handoff-0.1.0/docs/runbooks/release.md +19 -0
- orion_handoff-0.1.0/examples/record-input.json +32 -0
- orion_handoff-0.1.0/pyproject.toml +23 -0
- orion_handoff-0.1.0/requirements-build.txt +5 -0
- orion_handoff-0.1.0/setup.cfg +4 -0
- orion_handoff-0.1.0/specs/orion-handoff-core-spec.md +188 -0
- orion_handoff-0.1.0/src/orion_handoff/__init__.py +3 -0
- orion_handoff-0.1.0/src/orion_handoff/cli.py +158 -0
- orion_handoff-0.1.0/src/orion_handoff/context.py +80 -0
- orion_handoff-0.1.0/src/orion_handoff/records.py +168 -0
- orion_handoff-0.1.0/src/orion_handoff/store.py +366 -0
- orion_handoff-0.1.0/src/orion_handoff.egg-info/PKG-INFO +87 -0
- orion_handoff-0.1.0/src/orion_handoff.egg-info/SOURCES.txt +30 -0
- orion_handoff-0.1.0/src/orion_handoff.egg-info/dependency_links.txt +1 -0
- orion_handoff-0.1.0/src/orion_handoff.egg-info/entry_points.txt +2 -0
- orion_handoff-0.1.0/src/orion_handoff.egg-info/top_level.txt +1 -0
- orion_handoff-0.1.0/tests/cleanup_writer.py +64 -0
- orion_handoff-0.1.0/tests/crash_writer.py +74 -0
- orion_handoff-0.1.0/tests/support.py +94 -0
- orion_handoff-0.1.0/tests/test_boundaries.py +39 -0
- orion_handoff-0.1.0/tests/test_cli.py +213 -0
- orion_handoff-0.1.0/tests/test_integrity.py +236 -0
- orion_handoff-0.1.0/tests/test_release_regressions.py +78 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.1.0 candidate
|
|
4
|
+
|
|
5
|
+
Explicit local stores, immutable task revisions and bounded JSON/text inspection.
|
|
6
|
+
Pickup separates matching, integrity, observed recency and acceptance claims;
|
|
7
|
+
every result carries no authority. No provider adapters or runtime integration.
|
|
8
|
+
|
|
9
|
+
Release review corrections:
|
|
10
|
+
|
|
11
|
+
- Reject numeric timezone offsets outside hour 00–23 / minute 00–59 before
|
|
12
|
+
normalization, including timestamps inside claims, evidence and stored records.
|
|
13
|
+
- Preserve candidate identity for uncertain publication when lock or descriptor
|
|
14
|
+
cleanup fails. Attempt all descriptor cleanup and preserve original operation
|
|
15
|
+
faults. Inspect the candidate before retrying.
|
|
16
|
+
|
|
17
|
+
Supported evidence is limited to the environments recorded in the release packet.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Development and conformance
|
|
2
|
+
|
|
3
|
+
Use an isolated checkout and disposable environments. No test may use a real handoff store, native hook, transcript, account, phone or browser. Keep source and installed runtime separate.
|
|
4
|
+
|
|
5
|
+
```sh
|
|
6
|
+
python3.11 -m venv .venv-dev
|
|
7
|
+
.venv-dev/bin/python -m pip install -r requirements-build.txt
|
|
8
|
+
.venv-dev/bin/python -m pip install --no-deps --no-build-isolation .
|
|
9
|
+
.venv-dev/bin/python -m unittest discover -s tests -v
|
|
10
|
+
ruff check src tests
|
|
11
|
+
.venv-dev/bin/python -m build
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Reinstall after changing source. These are non-editable installs. Child CLI processes use temporary homes/stores and run outside the checkout. For release conformance, install the exact wheel and sdist separately into fresh Python 3.11/3.13 environments, run the tests outside the source tree, and retain artifact hashes and exit logs.
|
|
15
|
+
|
|
16
|
+
The installed CLI is the primary test seam. Real subprocesses exercise contention. Test-only launchers target interruption stages without shipping any public fault controls. Exact clock equality and otherwise unreachable output-buffer caps use narrow deterministic checks against installed internal modules; this does not establish a supported Python import API.
|
|
17
|
+
|
|
18
|
+
Implement one observable scenario RED→GREEN at a time. Update the living spec with contract changes and the operator runbook with operational changes. Tests are standard-library unittest; Ruff and pinned build tools are development-only. A pinned four-combination CI workflow is prepared locally; no hosted run or publishing workflow is active for this private candidate.
|
|
19
|
+
|
|
20
|
+
Keep examples synthetic, preserve applicable notices, and document provenance for new copied code. This private implementation was written from the reviewed behavior spec; private runtime files and history are not redistributed.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Dan Mercede
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
include README.md LICENSE SECURITY.md CONTRIBUTING.md CHANGELOG.md RELEASE_CHECKLIST.md requirements-build.txt
|
|
2
|
+
recursive-include src *.py
|
|
3
|
+
recursive-include specs *.md
|
|
4
|
+
recursive-include docs *.md
|
|
5
|
+
recursive-include examples *.json
|
|
6
|
+
recursive-include tests *.py
|
|
7
|
+
prune .private
|
|
8
|
+
prune .venv-dev
|
|
9
|
+
global-exclude __pycache__ *.py[cod]
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: orion-handoff
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Carry bounded, unverified task context between local sessions
|
|
5
|
+
Author: Dan Mercede
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Requires-Python: >=3.11
|
|
8
|
+
Description-Content-Type: text/markdown
|
|
9
|
+
License-File: LICENSE
|
|
10
|
+
Dynamic: license-file
|
|
11
|
+
|
|
12
|
+
# Orion Handoff
|
|
13
|
+
|
|
14
|
+
Carry bounded task context between local sessions. A producer records what it observed; another session selects the intended task and reviews what remains uncertain. Handoff data never grants permission to execute the next step.
|
|
15
|
+
|
|
16
|
+
**Version 0.1.0. MIT licensed.** The installed CLI is the supported interface; internal Python imports are not a public API.
|
|
17
|
+
|
|
18
|
+
## Install and select an isolated store
|
|
19
|
+
|
|
20
|
+
Use CPython 3.11 or 3.13 on Linux x86_64 and a supported local filesystem. Validation covers WSL2 with an ext4-backed store. Native Windows, Windows-mounted stores, network filesystems and cross-host writers are unsupported. Exact interpreter and artifact proof belongs in the release receipt.
|
|
21
|
+
|
|
22
|
+
```sh
|
|
23
|
+
python3 -m venv .venv
|
|
24
|
+
.venv/bin/python -m pip install orion-handoff==0.1.0
|
|
25
|
+
.venv/bin/orion-handoff --json --version
|
|
26
|
+
.venv/bin/orion-handoff --store /absolute/owned/scratch/handoff-demo --json init
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Select an existing writable parent and a new store path. Every stateful invocation requires `--store` or the new `ORION_HANDOFF_STORE` environment variable. There is no implicit home, and the private tool's `ORION_HANDOFF_HOME` is ignored. Package installation creates no store, hook, service or harness pointer.
|
|
30
|
+
|
|
31
|
+
For a complete wheel-only walkthrough with a synthetic generator and recovery checks, read the [guide](https://www.danmercede.com/guides/hand-off-local-agent-tasks).
|
|
32
|
+
|
|
33
|
+
## A two-session walkthrough
|
|
34
|
+
|
|
35
|
+
In the producer session, review `examples/record-input.json`. It is synthetic and has fixed historical times; supply actual observation times for a new demonstration. A new timestamp does not reverify an old result.
|
|
36
|
+
|
|
37
|
+
```sh
|
|
38
|
+
.venv/bin/orion-handoff --store /absolute/owned/scratch/handoff-demo --json record --input - < examples/record-input.json
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
In another session:
|
|
42
|
+
|
|
43
|
+
```sh
|
|
44
|
+
.venv/bin/orion-handoff --store /absolute/owned/scratch/handoff-demo --json pickup --task sample-task-alpha
|
|
45
|
+
.venv/bin/orion-handoff --store /absolute/owned/scratch/handoff-demo --json list --task sample-task-alpha
|
|
46
|
+
.venv/bin/orion-handoff --store /absolute/owned/scratch/handoff-demo --json show FULL_RECORD_ID
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Task keys are explicit opaque identities. A project-resume selection needs exactly one current task; two tasks remain ambiguous even if one is newer, stale or done. Pickup with no selector returns provisional context without reading any records.
|
|
50
|
+
|
|
51
|
+
To revise a task, send a **complete** new input with `predecessor` set to its current record ID. All existing records remain immutable. A competing update returns conflict; inspect and reconcile rather than automatically overwriting it. Marking context stale or done is a successor record, not a PM task transition.
|
|
52
|
+
|
|
53
|
+
## Read results honestly
|
|
54
|
+
|
|
55
|
+
JSON reports task match, structural integrity, context recency, recorded acceptance and disposition separately. `context_available` remains unverified. `inspect_only` has a selected record but no usable continuation. Missing, ambiguous or invalid context stays provisional; there is no fallback to an older baseline.
|
|
56
|
+
|
|
57
|
+
Every result states `authority: none`. References, actor labels, acceptance claims, evidence and next steps are recorded data. References are never opened or fetched. Freshness describes the supplied observation time, not current source compatibility or permission. The core performs no network requests, subprocess actions, session/history reads or integration with another tool's private store.
|
|
58
|
+
|
|
59
|
+
| Exit | Meaning |
|
|
60
|
+
|---|---|
|
|
61
|
+
| 0 | Named operation established; no execution authority. |
|
|
62
|
+
| 2 | Usage/configuration error. |
|
|
63
|
+
| 10 | Matched context needs inspection. |
|
|
64
|
+
| 11 | Missing or ambiguous requested context. |
|
|
65
|
+
| 65 | Invalid submitted input; no record committed. |
|
|
66
|
+
| 69 | Store/platform/I/O unavailable. |
|
|
67
|
+
| 73 | Busy, predecessor conflict or ID collision. |
|
|
68
|
+
| 74 | Integrity/compatibility/budget failure or unknown commit. Inspect before retry. |
|
|
69
|
+
|
|
70
|
+
## Limits and recovery
|
|
71
|
+
|
|
72
|
+
Inputs and records are at most 64 KiB, the body at most 16 KiB, and a store retains at most 512 committed records. Reads are bounded and reject invalid stores rather than report partial selection as healthy. There is no automatic deletion, archive, import, migration or current-task pointer. A malformed committed record blocks selected pickup until an operator recovers the store.
|
|
73
|
+
|
|
74
|
+
Locks coordinate cooperative local clients. This is not authentication or protection from malicious same-user processes. Process-interruption tests do not establish physical power-loss behavior on every filesystem.
|
|
75
|
+
|
|
76
|
+
Read the [operator runbook](docs/runbooks/local-handoff-store.md) for stopped-writer backup, exact-store restore, unknown commits and retention. Uninstall preserves the store. The first version's recovery uses the exact artifact and matching backup; no prior public version exists to downgrade to.
|
|
77
|
+
|
|
78
|
+
## Contracts and development
|
|
79
|
+
|
|
80
|
+
- [Living implementation spec](specs/orion-handoff-core-spec.md)
|
|
81
|
+
- [Release checklist](RELEASE_CHECKLIST.md)
|
|
82
|
+
- [Security scope](SECURITY.md)
|
|
83
|
+
- [Contribution and test instructions](CONTRIBUTING.md)
|
|
84
|
+
|
|
85
|
+
The core has no runtime dependencies outside the Python standard library. PM, browser, phone, Remote Hands and vendor harness integrations are separate packages. An optional future starter profile needs exact component pins and its own combined proof. Releasing this package does not migrate an installed estate.
|
|
86
|
+
|
|
87
|
+
MIT. Copyright 2026 Dan Mercede.
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Orion Handoff
|
|
2
|
+
|
|
3
|
+
Carry bounded task context between local sessions. A producer records what it observed; another session selects the intended task and reviews what remains uncertain. Handoff data never grants permission to execute the next step.
|
|
4
|
+
|
|
5
|
+
**Version 0.1.0. MIT licensed.** The installed CLI is the supported interface; internal Python imports are not a public API.
|
|
6
|
+
|
|
7
|
+
## Install and select an isolated store
|
|
8
|
+
|
|
9
|
+
Use CPython 3.11 or 3.13 on Linux x86_64 and a supported local filesystem. Validation covers WSL2 with an ext4-backed store. Native Windows, Windows-mounted stores, network filesystems and cross-host writers are unsupported. Exact interpreter and artifact proof belongs in the release receipt.
|
|
10
|
+
|
|
11
|
+
```sh
|
|
12
|
+
python3 -m venv .venv
|
|
13
|
+
.venv/bin/python -m pip install orion-handoff==0.1.0
|
|
14
|
+
.venv/bin/orion-handoff --json --version
|
|
15
|
+
.venv/bin/orion-handoff --store /absolute/owned/scratch/handoff-demo --json init
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Select an existing writable parent and a new store path. Every stateful invocation requires `--store` or the new `ORION_HANDOFF_STORE` environment variable. There is no implicit home, and the private tool's `ORION_HANDOFF_HOME` is ignored. Package installation creates no store, hook, service or harness pointer.
|
|
19
|
+
|
|
20
|
+
For a complete wheel-only walkthrough with a synthetic generator and recovery checks, read the [guide](https://www.danmercede.com/guides/hand-off-local-agent-tasks).
|
|
21
|
+
|
|
22
|
+
## A two-session walkthrough
|
|
23
|
+
|
|
24
|
+
In the producer session, review `examples/record-input.json`. It is synthetic and has fixed historical times; supply actual observation times for a new demonstration. A new timestamp does not reverify an old result.
|
|
25
|
+
|
|
26
|
+
```sh
|
|
27
|
+
.venv/bin/orion-handoff --store /absolute/owned/scratch/handoff-demo --json record --input - < examples/record-input.json
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
In another session:
|
|
31
|
+
|
|
32
|
+
```sh
|
|
33
|
+
.venv/bin/orion-handoff --store /absolute/owned/scratch/handoff-demo --json pickup --task sample-task-alpha
|
|
34
|
+
.venv/bin/orion-handoff --store /absolute/owned/scratch/handoff-demo --json list --task sample-task-alpha
|
|
35
|
+
.venv/bin/orion-handoff --store /absolute/owned/scratch/handoff-demo --json show FULL_RECORD_ID
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Task keys are explicit opaque identities. A project-resume selection needs exactly one current task; two tasks remain ambiguous even if one is newer, stale or done. Pickup with no selector returns provisional context without reading any records.
|
|
39
|
+
|
|
40
|
+
To revise a task, send a **complete** new input with `predecessor` set to its current record ID. All existing records remain immutable. A competing update returns conflict; inspect and reconcile rather than automatically overwriting it. Marking context stale or done is a successor record, not a PM task transition.
|
|
41
|
+
|
|
42
|
+
## Read results honestly
|
|
43
|
+
|
|
44
|
+
JSON reports task match, structural integrity, context recency, recorded acceptance and disposition separately. `context_available` remains unverified. `inspect_only` has a selected record but no usable continuation. Missing, ambiguous or invalid context stays provisional; there is no fallback to an older baseline.
|
|
45
|
+
|
|
46
|
+
Every result states `authority: none`. References, actor labels, acceptance claims, evidence and next steps are recorded data. References are never opened or fetched. Freshness describes the supplied observation time, not current source compatibility or permission. The core performs no network requests, subprocess actions, session/history reads or integration with another tool's private store.
|
|
47
|
+
|
|
48
|
+
| Exit | Meaning |
|
|
49
|
+
|---|---|
|
|
50
|
+
| 0 | Named operation established; no execution authority. |
|
|
51
|
+
| 2 | Usage/configuration error. |
|
|
52
|
+
| 10 | Matched context needs inspection. |
|
|
53
|
+
| 11 | Missing or ambiguous requested context. |
|
|
54
|
+
| 65 | Invalid submitted input; no record committed. |
|
|
55
|
+
| 69 | Store/platform/I/O unavailable. |
|
|
56
|
+
| 73 | Busy, predecessor conflict or ID collision. |
|
|
57
|
+
| 74 | Integrity/compatibility/budget failure or unknown commit. Inspect before retry. |
|
|
58
|
+
|
|
59
|
+
## Limits and recovery
|
|
60
|
+
|
|
61
|
+
Inputs and records are at most 64 KiB, the body at most 16 KiB, and a store retains at most 512 committed records. Reads are bounded and reject invalid stores rather than report partial selection as healthy. There is no automatic deletion, archive, import, migration or current-task pointer. A malformed committed record blocks selected pickup until an operator recovers the store.
|
|
62
|
+
|
|
63
|
+
Locks coordinate cooperative local clients. This is not authentication or protection from malicious same-user processes. Process-interruption tests do not establish physical power-loss behavior on every filesystem.
|
|
64
|
+
|
|
65
|
+
Read the [operator runbook](docs/runbooks/local-handoff-store.md) for stopped-writer backup, exact-store restore, unknown commits and retention. Uninstall preserves the store. The first version's recovery uses the exact artifact and matching backup; no prior public version exists to downgrade to.
|
|
66
|
+
|
|
67
|
+
## Contracts and development
|
|
68
|
+
|
|
69
|
+
- [Living implementation spec](specs/orion-handoff-core-spec.md)
|
|
70
|
+
- [Release checklist](RELEASE_CHECKLIST.md)
|
|
71
|
+
- [Security scope](SECURITY.md)
|
|
72
|
+
- [Contribution and test instructions](CONTRIBUTING.md)
|
|
73
|
+
|
|
74
|
+
The core has no runtime dependencies outside the Python standard library. PM, browser, phone, Remote Hands and vendor harness integrations are separate packages. An optional future starter profile needs exact component pins and its own combined proof. Releasing this package does not migrate an installed estate.
|
|
75
|
+
|
|
76
|
+
MIT. Copyright 2026 Dan Mercede.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Release checklist
|
|
2
|
+
|
|
3
|
+
MIT. Selected source rights confirmed by the author. Release approval covers the exact recorded candidate and destinations.
|
|
4
|
+
|
|
5
|
+
- Verify wheel/sdist on CPython 3.11 and 3.13 with the installed CLI outside source.
|
|
6
|
+
- Confirm explicit-store isolation, task matching, observed recency, immutable revision integrity and uncertain-commit receipts.
|
|
7
|
+
- Validate backed-up stores, uninstall/reinstall preservation and future-version refusal.
|
|
8
|
+
- Bind distribution files to SHA256SUMS; verify the manifest before uploading. Never rebuild inside the publishing job.
|
|
9
|
+
- Require CI, secret scans, dependency review, protected human review and the PyPI environment approval.
|
|
10
|
+
- Verify source, package install, site assets, Works routing and canonical guide at their public consumer boundaries.
|
|
11
|
+
- A package release performs no estate integration, native hook installation or migration.
|
|
12
|
+
|
|
13
|
+
See [release operations](docs/runbooks/release.md) and [local recovery](docs/runbooks/local-handoff-store.md).
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Security scope
|
|
2
|
+
|
|
3
|
+
The core records unverified local task context. It does not authenticate actors, grant execution authority, validate approval, execute next steps or fetch references. Record prose and evidence are untrusted data.
|
|
4
|
+
|
|
5
|
+
The supported coordination model is cooperating processes under one local user on a tested Linux local filesystem. Other processes with that user's access can modify files or bypass advisory locks. Cross-host fencing, network filesystems and adversarial same-user isolation are outside the contract.
|
|
6
|
+
|
|
7
|
+
Core commands require an explicit store. They reject unsafe paths, ownership/modes, unrecognized entries, invalid revision chains and bounded-I/O failures. Those checks reduce accidental escape and corruption; they are not a sandbox. Do not place secrets in synthetic examples or send a real handoff store as a bug report.
|
|
8
|
+
|
|
9
|
+
Report vulnerabilities privately through [GitHub security advisories](https://github.com/OrionArchitekton/orion-handoff/security/advisories/new). Provide the candidate version, platform/filesystem, a minimal synthetic reproduction and the observed exit/JSON. Exclude tokens, transcripts, personal paths, approvals and private task content.
|
|
10
|
+
|
|
11
|
+
No security contact, hosted reporting service or notification workflow is installed by the package.
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
---
|
|
2
|
+
verified: 2026-10-17
|
|
3
|
+
review_after: 2026-11-17
|
|
4
|
+
topics:
|
|
5
|
+
- orion-handoff
|
|
6
|
+
- private-extraction
|
|
7
|
+
- local-store-recovery
|
|
8
|
+
references:
|
|
9
|
+
- ../../specs/orion-handoff-core-spec.md
|
|
10
|
+
- ../../README.md
|
|
11
|
+
- ../../RELEASE_CHECKLIST.md
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Local handoff core: operator runbook
|
|
15
|
+
|
|
16
|
+
The installed CLI has passed isolated synthetic conformance. Published checksums bind the release artifacts; validation covers CPython 3.11 and 3.13 on WSL2 Linux x86_64/ext4. Select a new user-owned store for a trial. This runbook neither installs native hooks nor migrates existing handoffs.
|
|
17
|
+
|
|
18
|
+
## Rollout and isolated use
|
|
19
|
+
|
|
20
|
+
Use an owned scratch parent, a fresh virtual environment and a new explicit store. Record the artifact digest and interpreter/filesystem combination before use. Install the reviewed wheel into that environment; verify `orion-handoff --version` before selecting state. Installation/help/import must create no handoff store or harness integration.
|
|
21
|
+
|
|
22
|
+
Example flow for this candidate, one invocation at a time:
|
|
23
|
+
|
|
24
|
+
```text
|
|
25
|
+
orion-handoff --store /owned/scratch/sample-handoff --json init
|
|
26
|
+
orion-handoff --store /owned/scratch/sample-handoff --json record --input -
|
|
27
|
+
orion-handoff --store /owned/scratch/sample-handoff --json list --task sample-task-alpha
|
|
28
|
+
orion-handoff --store /owned/scratch/sample-handoff --json pickup --task sample-task-alpha
|
|
29
|
+
orion-handoff --store /owned/scratch/sample-handoff --json show FULL_RECORD_ID
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
The `record` invocation receives the reviewed synthetic JSON on stdin; reference strings are not opened. The [example input](../../examples/record-input.json) has fixed historical times and will naturally age. For a fresh demonstration, the producer must supply its actual observation time. Changing a timestamp is not a way to reverify old work. Copy a **complete** successor input and set predecessor to the observed current record ID when revising; there is no patch inheritance or status mutation command.
|
|
33
|
+
|
|
34
|
+
## Validation and monitoring
|
|
35
|
+
|
|
36
|
+
Check parsed JSON and exit status together. Exit 0 only establishes its named operation; context_available remains unverified. Inspect-only (10), no-match/ambiguity (11), conflict/busy (73) and integrity/unknown commit (74) are intentional distinct outcomes. No hook-compatible fail-open mode is provided.
|
|
37
|
+
|
|
38
|
+
Observe current record IDs, chain integrity, record count, selected-task dimensions and warnings through the CLI. No background monitor is installed. Listing is bounded and reports truncation; it is not a complete export when truncated. A store limit refuses new writes and never triggers deletion. Null/future observations and unchecked references remain review work.
|
|
39
|
+
|
|
40
|
+
## Backup and restore
|
|
41
|
+
|
|
42
|
+
1. Stop all cooperating producers and readers for the selected synthetic/user-owned store. A filesystem copy during active publication is not the supported backup procedure.
|
|
43
|
+
2. Copy the complete selected store, including version marker and empty lock file, with modes preserved into a new private directory. Do not follow symlinks; unsafe objects require inspection. Backup access must remain restricted to the owner. Preserve hard links if present; otherwise validate the restored structure before use.
|
|
44
|
+
3. Record original record byte hashes and the complete expected record count (at most 512). Preserve temporary files as evidence; never silently discard them in backup.
|
|
45
|
+
4. Restore to a fresh explicit path on a supported local filesystem. Verify ownership/modes, compatible versions and all expected IDs/hashes, then inspect current context through the reviewed CLI. Keep the original untouched until this comparison succeeds.
|
|
46
|
+
5. Re-enable only the selected cooperating users/processes. Native estate hooks are not part of this core procedure.
|
|
47
|
+
|
|
48
|
+
No command writes another tool's private state. The core does not search for a backup, import old Markdown packs or select a “nearest” compatible record automatically.
|
|
49
|
+
|
|
50
|
+
## Failure and recovery decisions
|
|
51
|
+
|
|
52
|
+
| Observation | Action |
|
|
53
|
+
|---|---|
|
|
54
|
+
| Conflict | Inspect current record. Reconcile the whole successor deliberately; do not automatically replace the winning context. |
|
|
55
|
+
| Busy | Check live cooperating processes. Retry after the holder exits; never delete or recreate the lock file to break a lock. |
|
|
56
|
+
| Commit unknown / writer killed without receipt | Preserve output if present, inspect candidate ID and current task chain. Compare committed content with intended input before deciding on any new successor. Unlock/close acknowledgement errors after attempted publication also return `commit_unknown` (74) with the candidate ID. Never infer that exit 74 means nothing was written, and never blindly resend. |
|
|
57
|
+
| Recognized orphan temporary warning | Stop writers, back up the whole store, inspect final ID/inode relationships. Remove only specifically identified orphan names after verifying committed record integrity; this manual cleanup is not an automatic core command. Keep the backup. |
|
|
58
|
+
| Incomplete initialization | Preserve the incomplete directory for inspection. Select a fresh empty store path for a retry; do not initialize over unknown files. |
|
|
59
|
+
| Corrupt/unsafe/over-limit store | Stop writes and preserve evidence. Inspect a known compatible backup in a fresh path; do not delete an inconvenient record to make pickup look healthy. |
|
|
60
|
+
| Incompatible version | Use the matching reviewed artifact against a copy, or restore its matching backup. No automatic downgrade/migration. |
|
|
61
|
+
| Unsupported filesystem | Select a newly initialized store on a tested local filesystem; moving production state is a separate backed-up operation. |
|
|
62
|
+
|
|
63
|
+
## Retention and removal
|
|
64
|
+
|
|
65
|
+
v0.1 retains every committed record, including stale/done/historical revisions, until the operator explicitly disposes of the selected store outside the CLI. There is no sweep, scheduled cleanup or auto-expiry deletion. Near capacity, preserve/retire a complete store and deliberately begin a new one; previous task context is not implicitly carried across. A future archive/import feature needs its own spec and lineage proof.
|
|
66
|
+
|
|
67
|
+
Uninstall removes package files from the selected environment, preserving the store. To undo the isolated trial, stop its processes, preserve receipts/backup, uninstall or remove only the owned test environment, and remove only the explicitly owned synthetic store if no longer wanted. Never use recursive cleanup against `.orion`, `.claude` or `.codex`.
|
|
68
|
+
|
|
69
|
+
## Limits of rollback
|
|
70
|
+
|
|
71
|
+
At the first public version there is no previous public artifact to downgrade to. Recovery means reinstalling the exact reviewed artifact, selecting a validated backup/copy, or removing the isolated trial. Later upgrades must declare store compatibility and add actual upgrade/downgrade proof. Publication rollback and users' installed copies are separate from local store restore; future release notes must explain both.
|
|
72
|
+
|
|
73
|
+
No estate adoption is performed by a package release. An eventual adapter migration needs a fresh inventory, explicit activation and reversal instructions, authority checks, native binding proof and a separate approval checkpoint.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
---
|
|
2
|
+
verified: 2026-10-17
|
|
3
|
+
review_after: 2026-11-17
|
|
4
|
+
topics: [release, pypi, github]
|
|
5
|
+
references: [../../.github/workflows/release.yml, ../../.github/release-manifest.json, ../../requirements-build.txt]
|
|
6
|
+
---
|
|
7
|
+
# Release operations
|
|
8
|
+
|
|
9
|
+
Release from a human-reviewed protected main. CI validates installed wheel and sdist separately on CPython 3.11/3.13, plus lint, secrets and dependency changes.
|
|
10
|
+
|
|
11
|
+
Build distributions outside the publishing job, run the exact-artifact conformance suite, inspect exports and bind bytes to the release manifest and SHA256SUMS. If packaging documentation changes, record the new hashes and prove runtime module bytes unchanged from the approved implementation.
|
|
12
|
+
|
|
13
|
+
Upload wheel, sdist, source archive and checksums to the corresponding GitHub release. Configure a PyPI Trusted Publisher scoped to OrionArchitekton/orion-handoff, release.yml, environment pypi. The protected environment requires a human reviewer. No package password or API token is needed.
|
|
14
|
+
|
|
15
|
+
Dispatch release.yml from main after verifying the public GitHub release. Its verify job and publish job each download the named release files and check the fixed manifest hashes; the publishing job never checks out source, builds, or installs dependencies. It submits only wheel/sdist to PyPI. Never overwrite published version bytes.
|
|
16
|
+
|
|
17
|
+
Validate public GitHub/PyPI metadata, downloaded hashes, clean installs and the installed CLI's version/pickup behavior. Monitor the exact workflow, version and artifacts; a workflow success alone is not consumer proof.
|
|
18
|
+
|
|
19
|
+
Rollback: stop an unapproved pending environment deployment or future release workflow. If a public package is defective, preserve receipts, consider yanking and publish a corrected version after review. Do not delete/reuse release versions or roll back user stores automatically. Site/hub reversions are separate. No estate hooks, runtime, stores or scheduled jobs are changed by publishing.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"record_version": 1,
|
|
3
|
+
"task_key": "sample-task-alpha",
|
|
4
|
+
"predecessor": null,
|
|
5
|
+
"project_key": "sample-project",
|
|
6
|
+
"title": "Inspect the sample report",
|
|
7
|
+
"status": "active",
|
|
8
|
+
"actor": "sample-producer",
|
|
9
|
+
"request_id": "sample-request-1",
|
|
10
|
+
"context_as_of": "2026-10-17T23:00:00Z",
|
|
11
|
+
"last_observed_outcome": "The synthetic report contained the expected heading.",
|
|
12
|
+
"unfinished_step": "Review the report against the current request.",
|
|
13
|
+
"recorded_next_step": "Read the current request and obtain any authority needed for further work.",
|
|
14
|
+
"remaining_authority": "This record grants no authority.",
|
|
15
|
+
"acceptance_claims": [
|
|
16
|
+
{
|
|
17
|
+
"baseline": "sample-baseline-1",
|
|
18
|
+
"reference": "sample://review/1",
|
|
19
|
+
"accepted_at": "2026-10-17T22:59:00Z"
|
|
20
|
+
}
|
|
21
|
+
],
|
|
22
|
+
"evidence": [
|
|
23
|
+
{
|
|
24
|
+
"source": "synthetic-demo",
|
|
25
|
+
"artifact": "sample-report-1",
|
|
26
|
+
"observed_at": "2026-10-17T23:00:00Z",
|
|
27
|
+
"scope": "The heading was visible; no broader behavior was tested.",
|
|
28
|
+
"reference": "sample://report/1"
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
"body": "Synthetic context for a private example. Recheck the current task before taking action."
|
|
32
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools==84.0.0"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "orion-handoff"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
description = "Carry bounded, unverified task context between local sessions"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.11"
|
|
11
|
+
dependencies = []
|
|
12
|
+
authors = [{name = "Dan Mercede"}]
|
|
13
|
+
license = "MIT"
|
|
14
|
+
|
|
15
|
+
[project.scripts]
|
|
16
|
+
orion-handoff = "orion_handoff.cli:main"
|
|
17
|
+
|
|
18
|
+
[tool.setuptools.packages.find]
|
|
19
|
+
where = ["src"]
|
|
20
|
+
|
|
21
|
+
[tool.ruff]
|
|
22
|
+
target-version = "py311"
|
|
23
|
+
line-length = 100
|