Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
108 commits
Select commit Hold shift + click to select a range
60aaf56
test(continuity): pin preservation policy boundaries
thunderock Oct 13, 2026
b201bc1
docs(continuity): establish verified preservation policy
thunderock Oct 13, 2026
069afbb
test(continuity): require protected-branch policy
thunderock Oct 13, 2026
bb636db
docs(continuity): explicitly forbid protected-branch writes
thunderock Oct 13, 2026
0eff35a
test(continuity): specify model-free settings contracts
thunderock Oct 13, 2026
9994b46
feat(continuity): add model-free settings and manifest contracts
thunderock Oct 13, 2026
5adc688
test(continuity): reproduce schema and CLI validation gaps
thunderock Oct 13, 2026
8c683ef
fix(continuity): align schema and structural CLI validation
thunderock Oct 13, 2026
ddaf880
test(backup): specify capture and verification contracts
thunderock Oct 13, 2026
4e8010d
test(git): specify scoped checkpoint push contracts
thunderock Oct 13, 2026
886cae2
test(backup): use bare repository for bundle recovery
thunderock Oct 13, 2026
8010683
feat(backup): capture verified files and branch history
thunderock Oct 13, 2026
4dab1cd
feat(git): add authorized exact-ref checkpoint pushes
thunderock Oct 13, 2026
c4516ae
test(backup): expose silent scoped exclusions
thunderock Oct 13, 2026
b0ddf4e
fix(backup): report scoped exclusions without ancestor leakage
thunderock Oct 13, 2026
4e0e79c
test(backup): require recovery without TMPDIR dependency
thunderock Oct 13, 2026
4a6f175
fix(backup): decouple file capture from Git scratch
thunderock Oct 13, 2026
cd20447
test(backup): pin staged deletion and rename tombstones
thunderock Oct 13, 2026
1c0f4d2
fix(backup): preserve staged deletion tombstones
thunderock Oct 13, 2026
791f0b1
test(backup): distinguish index removal from worktree deletion
thunderock Oct 13, 2026
8522229
fix(backup): retain recreated working paths after index removal
thunderock Oct 13, 2026
e9eb078
test(restore): specify initial model-free context loading
thunderock Oct 13, 2026
e354f77
test(checkpoint): specify read-only setup preview
thunderock Oct 13, 2026
f36e165
feat(restore): load bounded inert snapshot context
thunderock Oct 13, 2026
2bf95a3
feat(checkpoint): preview private setup without activation
thunderock Oct 13, 2026
7546f33
test(restore): specify approved file export roundtrip
thunderock Oct 13, 2026
095c2f8
test(checkpoint): specify approved installation and owned uninstall
thunderock Oct 13, 2026
07486db
feat(restore): export verified files with explicit approval
thunderock Oct 13, 2026
a5fbc9a
test(checkpoint): specify monotonic runtime capture cadence
thunderock Oct 13, 2026
c5b03d3
test(restore): require dirty checkout and branch history recovery
thunderock Oct 13, 2026
40884f2
feat(checkpoint): apply private setup and owned uninstall
thunderock Oct 13, 2026
94ea8c2
test(checkpoint): pin setup failures and committed project support
thunderock Oct 13, 2026
bd5123e
feat(checkpoint): capture on monotonic event and due cadence
thunderock Oct 13, 2026
aaec58c
test(checkpoint): require Git capture and fresh publication authority
thunderock Oct 13, 2026
3ac9367
feat(restore): recover verified branch history without checkout
thunderock Oct 13, 2026
61629af
test(restore): specify standalone model-free recovery commands
thunderock Oct 13, 2026
bc3b4f6
fix(checkpoint): bind first setup and report interrupted ownership
thunderock Oct 13, 2026
4912073
test(checkpoint): require resumable setup after failed capture
thunderock Oct 13, 2026
241cf24
feat(restore): expose standalone model-free recovery commands
thunderock Oct 13, 2026
b763755
test(restore): bind export approval to previewed manifest
thunderock Oct 13, 2026
409ae14
fix(checkpoint): resume failed setup with fresh scoped approval
thunderock Oct 13, 2026
90454b0
test(checkpoint): cover setup capacity and retained snapshot budgets
thunderock Oct 13, 2026
0ac35e2
fix(restore): bind export approval to previewed content
thunderock Oct 13, 2026
a2d6894
test(restore): bound recovery descriptors and input work
thunderock Oct 13, 2026
aaddc7f
feat(checkpoint): reconcile branch history with fresh push authority
thunderock Oct 13, 2026
3e54c7c
test(checkpoint): preserve files when history is unavailable
thunderock Oct 14, 2026
a1e2963
fix(checkpoint): respect setup capacity across retained snapshots
thunderock Oct 14, 2026
9d441a3
test(checkpoint): require resumption at final retained slot
thunderock Oct 14, 2026
736841c
fix(checkpoint): preserve files beyond history limits
thunderock Oct 14, 2026
f52710c
test(checkpoint): bound reachable observation state
thunderock Oct 14, 2026
31412d6
fix(restore): bound snapshot reads and output descriptors
thunderock Oct 14, 2026
33f14c9
test(restore): disclose incomplete scoped working trees
thunderock Oct 14, 2026
48da0b7
fix(checkpoint): bound current-graph observation state
thunderock Oct 14, 2026
c5a44be
test(checkpoint): protect cleanup from late deadlines
thunderock Oct 14, 2026
36e606a
fix(restore): disclose uncaptured tracked worktree paths
thunderock Oct 14, 2026
1322969
test(restore): cover common recovery CLI limits
thunderock Oct 14, 2026
d8a8c35
fix(setup): reuse verified complete final snapshot
thunderock Oct 14, 2026
f5ad4e9
fix(checkpoint): protect owned resources from late alarms
thunderock Oct 14, 2026
79aeb68
test(restore): validate nested recovery policy fixture
thunderock Oct 14, 2026
4a53cbf
feat(restore): expose bounded common recovery limits
thunderock Oct 14, 2026
a921f18
test(checkpoint): cover nested snapshot deadline cleanup
thunderock Oct 14, 2026
b32f690
fix(backup): defer deadlines across nested cleanup
thunderock Oct 14, 2026
97f84e2
test(restore): exercise recovery trust boundaries
thunderock Oct 14, 2026
5ae09a7
test(checkpoint): respect ignored unborn project files
thunderock Oct 14, 2026
24ecf47
fix(backup): honor ignored files before first commit
thunderock Oct 14, 2026
a224866
test(checkpoint): pin cooperative deadline boundaries
thunderock Oct 14, 2026
874284c
fix(checkpoint): enforce cooperative deadline budgets
thunderock Oct 14, 2026
f297143
test(checkpoint): preserve files through history timeouts
thunderock Oct 14, 2026
a55e837
fix(backup): reserve time for current file preservation
thunderock Oct 14, 2026
202c301
test(backup): expose repeated late verification failures
thunderock Oct 14, 2026
86af513
fix(backup): finish final verification within outer deadline
thunderock Oct 14, 2026
d0b8677
test(checkpoint): pin model-free setup and capture CLI
thunderock Oct 14, 2026
062de86
test(restore): pin model-free standalone recovery
thunderock Oct 14, 2026
0e87b56
test(checkpoint): pin approved local commit connection
thunderock Oct 14, 2026
61e0700
feat(checkpoint): add approved local commit connection
thunderock Oct 14, 2026
38e75d0
test(checkpoint): protect inactive reference transactions
thunderock Oct 14, 2026
d745fb6
fix(checkpoint): ignore inactive ref phases before loading
thunderock Oct 14, 2026
2a83fab
feat(checkpoint): expose approved setup and capture commands
thunderock Oct 14, 2026
89d8e95
feat(restore): ship model-free standalone recovery
thunderock Oct 14, 2026
994aa10
test(checkpoint): pin qualified periodic scheduler integration
thunderock Oct 14, 2026
9f2f580
feat(checkpoint): integrate qualified periodic host schedules
thunderock Oct 14, 2026
a076b85
test(checkpoint): pin explicit global capture scope
thunderock Oct 14, 2026
82e9471
test(continuity): pin lifecycle preservation boundaries
thunderock Oct 14, 2026
ad88637
test(continuity): exercise commit loss and full recovery
thunderock Oct 14, 2026
b68b9ce
test(checkpoint): pin recoverable host ownership and bounded transport
thunderock Oct 14, 2026
e5bda49
feat(checkpoint): support explicit global capture scope
thunderock Oct 14, 2026
da5e4cc
docs(continuity): integrate approved preservation checkpoints
thunderock Oct 14, 2026
bd2589c
test(checkpoint): require explicit CLI setup resumption
thunderock Oct 14, 2026
ddfbbc2
feat(checkpoint): expose approved setup resumption
thunderock Oct 14, 2026
8610a3d
feat(checkpoint): persist recoverable host connections and schedules
thunderock Oct 14, 2026
e6579e1
test(checkpoint): pin host lifecycle CLI approval boundaries
thunderock Oct 14, 2026
0ff5fde
feat(checkpoint): expose qualified host lifecycle commands
thunderock Oct 14, 2026
e748fd6
test(checkpoint): honor changed installed backup policy
thunderock Oct 14, 2026
8ac69f9
fix(checkpoint): honor installed backup revocation
thunderock Oct 14, 2026
946d6c3
test(checkpoint): preserve fresh-process cleanup recovery
thunderock Oct 14, 2026
167c8a6
docs(continuity): ship qualified host commands and payloads
thunderock Oct 14, 2026
a707305
test(continuity): verify real host commit and idle coverage
thunderock Oct 14, 2026
c7fb19f
test(checkpoint): require explicit global periodic setup
thunderock Oct 14, 2026
41c7965
test(checkpoint): require global periodic CLI workflow
thunderock Oct 14, 2026
93cda93
test(checkpoint): reuse the verified global control snapshot
thunderock Oct 14, 2026
ac64eea
test(checkpoint): retain global recovery and payload contracts
thunderock Oct 14, 2026
4a8dba6
test(checkpoint): cover concurrent global installation ownership
thunderock Oct 14, 2026
6a84fc8
feat(checkpoint): install independently scoped global schedules
thunderock Oct 14, 2026
8be6295
feat(checkpoint): expose approved global schedule commands
thunderock Oct 14, 2026
14b32f4
test(restore): cover model-free recovery routing scenarios
thunderock Oct 14, 2026
e21ec78
feat(continuity): distribute global scheduling and operator docs
thunderock Oct 14, 2026
1ca586c
test(ci): require a private checkpoint interpreter
thunderock Oct 14, 2026
398ade5
fix(ci): use a private Python copy for checkpoint tests
thunderock Oct 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
8 changes: 8 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,14 @@ jobs:
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97
with:
python-version: "3.12"
- name: Prepare private Python runtime
run: |
umask 077
prefix="$(mktemp -d "$RUNNER_TEMP/python-runtime.XXXXXX")"
python="$(python3 -c 'import pathlib, sys; print(pathlib.Path(sys.executable).resolve())')"
"$python" -I -m venv --copies --without-pip "$prefix"
"$prefix/bin/python3" -I -c 'import os, pathlib, stat, sys; p = pathlib.Path(sys.executable); s = p.lstat(); assert stat.S_ISREG(s.st_mode) and s.st_uid == os.geteuid() and not s.st_mode & 0o022'
printf '%s\n' "$prefix/bin" >> "$GITHUB_PATH"
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020
with:
node-version: "24"
Expand Down
9 changes: 9 additions & 0 deletions .github/workflows/release-please.yml
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,15 @@ jobs:
release_help="$(gh release create --help)"
for flag in --repo --verify-tag --target --title --generate-notes --prerelease --latest; do [[ "$release_help" == *"$flag"* ]]; done
test "$(git rev-parse HEAD)" = "$GITHUB_SHA"
- id: private-python
name: Prepare private Python runtime
run: |
umask 077
prefix="$(mktemp -d "$RUNNER_TEMP/python-runtime.XXXXXX")"
python="$(python3 -c 'import pathlib, sys; print(pathlib.Path(sys.executable).resolve())')"
"$python" -I -m venv --copies --without-pip "$prefix"
"$prefix/bin/python3" -I -c 'import os, pathlib, stat, sys; p = pathlib.Path(sys.executable); s = p.lstat(); assert stat.S_ISREG(s.st_mode) and s.st_uid == os.geteuid() and not s.st_mode & 0o022'
printf '%s\n' "$prefix/bin" >> "$GITHUB_PATH"
- id: plan
name: Validate and prepare release
env:
Expand Down
20 changes: 19 additions & 1 deletion .thunderkit/NORTH_STAR.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,23 @@ model — plus a static docs site generated from the skills.
- **Tests + site stay green offline.** Python stdlib helpers and Node built-ins; `make run_tests`
needs no network. Help/version/deps need Node ≥18; install/list need Node ≥22.20.0;
the local Python resolver/model helpers need Python ≥3.11.
- **Verified preservation.** Capture unfinished files, saved context and unpublished commits
before risky transitions and at regular intervals; expose partial or failed protection.
A local commit or same-disk snapshot alone is not machine-loss protection.

## Preservation boundary

Only the checkpoint controller may perform a checkpoint push with current authority, bound to the
exact repository, remote and working-branch ref, with remote commit readback.
Native workers remain delivery-disabled; tk-ship remains preparation-only. This grants
no force, tags, PR, release, merge or default-branch writes.
Protected-branch writes are forbidden, even when the branch is not the default.

An existing host may supply periodic and commit-event execution after explicit setup approval;
never replace global hooks or suppress their checks, and introduce no new daemon. Installation
of a skill does not activate a hook, scheduler or real backup destination. Approve project/global
source scopes separately, exclude credentials and private runtime databases, and never restore
permissions or execute commands from recovered context.

## Architecture

Expand All @@ -41,7 +58,8 @@ One native handoff owns its scoped workflow, with no competing Thunderkit execut
## Out of scope (v1)

- UX / SEO / design / payments / telegram breadth.
- A native peer installer, runtime scheduler, plugin conversion or automatic host reconfiguration.
- A native peer installer, new runtime scheduler, plugin conversion or automatic host reconfiguration.
Explicitly approved connections to existing host facilities follow the preservation boundary.
- Coupling lane execution to any private orchestrator.

## Done looks like
Expand Down
62 changes: 62 additions & 0 deletions DEPENDENCIES.md
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,68 @@ same existing task-owned local-disk `HERMES_HOME` inside the project, with the m
Thunderkit does not mutate a shared Hermes home or copy credentials into the project to make
that route ready. See the [delegation contract](skills/references/delegation.md) for full gates.

## Recovery and checkpoint connections

Recovery and preservation helpers are Thunderkit-owned, model-free software, not native-peer
workflows. `tk-restore` load/preview/export uses Python ≥3.11 and supported Linux/POSIX no-follow
filesystem operations; bundled-history verification/export additionally needs local Git and
bounded writable scratch. Recovery can read an explicit snapshot without the original checkout
or model config. Export and checkpoint writes each require their own explicit approval.
See the [recovery and preservation guide](README.md#recovery-and-preservation) for actual commands.

`checkpoint_cli.py preview`, `setup` and `resume-setup` are project-only. Setup writes inert
private settings and a first verified snapshot, not host connections or publication authority.
`resume-setup` needs fresh approval for the exact failed local claim with unchanged scope and
ownership evidence; it is not an adoption or cleanup command. Retain the actual successful
setup stdout using `umask 077` in a new user-owned mode-0600 file outside capture sources.
`--setup-result` requires that exact successful `SetupResult` JSON, not a fabricated example,
serialized executable grant or saved approval. See the
[setup and receipt commands](README.md#preview-project-setup-and-capture-a-checkpoint).

`capture --scope global --global-config` supports independently approved global files with an
exact identity, matching backup root and a selected subset of `global.approved_sources`.
Global capture has no project root, branch history or push. Its versioned nested policy must
validate too; see the [global settings example](README.md#capture-an-independently-approved-global-scope).
`global-setup` records actual storage qualification and a verified snapshot. Preserve its
successful private JSON stdout for `global-preview` and separately approved `global-install`.
The global wrapper pins the selected interpreter/helpers, source subset, policy and backing
identity; it installs no Git hook and launches no subprocess during a tick. `global-remove`
requires fresh approval and confirms removal of the owned schedule before deleting its
unchanged private integration files. Snapshots and preexisting cadence state survive.
Both scheduler qualification flags below are required. Changed or disabled global policy
refuses capture; reconfiguration requires reviewed reinstall. See the
[global schedule commands](README.md#configure-an-independent-global-schedule).

`host-preview` and separately approved `host-install` bind the exact unchanged setup scope
and recorded storage identity, verified snapshot and explicit trusted `--python`. A replaced
store is refused without requalifying the replacement. Installation activates only the
repository-local `reference-transaction` hook; foreign hooks and external hook managers are
refused, not replaced. `schedule-preview`, `schedule-install` and `schedule-remove` use an
explicit trusted `--crontab` and require both `--service-qualified` and `--exclusive-writer`,
backed by actual operator evidence of a qualified running service and exclusive-writer
authority. Binary presence and those flags alone do not establish these conditions.
The driver preserves unrelated crontab bytes with read/compare-and-swap replacement.

Remove the schedule before `host-remove`; both removals require fresh approval and reload
private ownership records. Retain blocked/uncertain ownership state for inspected recovery;
do not delete it to force success. Changed files and snapshots are not cleanup targets.
Portable `backup.enabled: false` is checked at the installed project host boundary and stops
capture without removing the connection. Other installed settings remain frozen and need
reviewed reinstall. See the [host commands](README.md#host-connections-require-separate-qualification)
and [schedule/removal commands](README.md#preview-install-and-remove-the-project-schedule).

A generated periodic command is not scheduler activation or observed idle coverage. Loading a
skill creates no authority or daemon activation; full host activation requires separate
approval and real qualification. No new daemon, replacement global hook manager, automatic
model selection or credential copying is part of this setup.

The [approved checkpoint controller exception](skills/references/delegation.md#approved-preservation-checkpoints)
does not relax native `delivery:disabled` or preparation-only `tk-ship`. A default-on push
preference cannot replace a fresh exact-repository/remote/ref `PushGrant` from current in-process
authority after the captured commit's review/test and ownership gates. Never save or restore
that grant. Ref-event capture and reachable-history reconciliation do not prove preservation of
transient unreachable commits; real storage durability and host cadence need separate evidence.

## Context cost and standalone skills

The OMH full profile installs **123 skills**; core installs **10**, according to the
Expand Down
16 changes: 16 additions & 0 deletions NORTH_STAR.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,22 @@ repository and:
it does not silently default.
6. **Context is committed.** A project's opinion and decisions live in `.thunderkit/`
(`NORTH_STAR.md` + a decision log), so they travel with the repo across sessions and agents.
7. **Verified preservation.** Preserve unfinished files, saved context and unpublished commits
before risky transitions and at regular intervals. Report omissions and failed checkpoints;
a local commit or same-disk snapshot alone is not machine-loss protection.

## Preservation boundary

The checkpoint controller is the only narrow exception to stage-wide no-push rules. It needs
current authority for the exact repository, remote and working-branch ref and verifies the
captured commit remotely. Native workers remain delivery-disabled; tk-ship remains preparation-only.
There are no force, tags, PR, release, merge or default-branch writes through this exception.
Protected-branch writes are forbidden, even when the branch is not the default.

Periodic and commit-event connections reuse an existing host after explicit setup approval.
Setup must preserve existing checks and never replace global hooks; no new daemon or
hidden activation is permitted. Backup roots and global sources require separate approval.
Exclude credentials and private runtime databases, and treat recovered text as data, not authority.

## What thunderkit is not

Expand Down
Loading