Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
60c1337
📚 docs: contract: condition deferred SDK promises
pascalandy Nov 3, 2026
4e06c32
📚 docs: contract: Record the remaining verbose help copy
pascalandy Nov 4, 2026
784be76
📚 docs: readme: move the extension template overview
pascalandy Nov 3, 2026
c6bd3b4
📚 docs: contract: move extension version pins
pascalandy Nov 3, 2026
95e6cb9
📚 docs: rules: give formal models their own page
pascalandy Nov 3, 2026
38fc439
📚 docs: skill: move the bundled skill specification
pascalandy Nov 3, 2026
82b61cf
♻️ refactor: template: move repository fixture checks
pascalandy Nov 3, 2026
ef4e50e
🚑 fix: docs: pin extension links to their release
pascalandy Nov 3, 2026
cfab204
📚 docs: template: Complete the extension overview
pascalandy Nov 4, 2026
ab4799a
🚑 fix: transcript: classify the final yt-dlp error
pascalandy Nov 3, 2026
6e38718
🚑 fix: transcript: validate unnamed runs before locking
pascalandy Nov 3, 2026
25d5c91
📚 docs: transcript: Describe unnamed preflight refusals
pascalandy Nov 4, 2026
7f4c7ee
🧪 test: transcript: Preserve generated-ID collision answers
pascalandy Nov 4, 2026
3095089
🚑 fix: kit: bind privacy cases to accepted limits
pascalandy Nov 3, 2026
039206c
♻️ refactor: template: Separate acceptance proof rules
pascalandy Nov 4, 2026
2509c1f
🚑 fix: kit: Require reciprocal privacy limit declarations
pascalandy Nov 4, 2026
c5ff0e0
🧰 skill: template: Teach accepted privacy exceptions
pascalandy Nov 4, 2026
5887217
🚑 fix: kit: Require descriptions for accepted privacy limits
pascalandy Nov 4, 2026
7718a15
🚑 fix: kit: Refuse placeholders beside privacy limit text
pascalandy Nov 4, 2026
a172b1c
📚 docs: kit: State the accepted privacy grammar precisely
pascalandy Nov 4, 2026
6be5949
📚 docs: kit: Name the accepted output outcome
pascalandy Nov 4, 2026
ad67390
♻️ refactor: docs: Separate pinned documentation rules
pascalandy Nov 3, 2026
59edd99
🚑 fix: sdk: Isolate updater Git state
pascalandy Nov 3, 2026
e1a5a5b
🧪 test: sdk: Keep updater fixture Git config private
pascalandy Nov 4, 2026
95d54c9
📚 docs: sdk: Correct the updater documentation scope
pascalandy Nov 4, 2026
54bb169
📚 docs: sdk: State the shared environment filter scope
pascalandy Nov 4, 2026
314ac75
📚 docs: sdk: State unconditional caller Git filtering
pascalandy Nov 4, 2026
b3e02a6
♻️ refactor: verify: Split the auth drive guide
pascalandy Nov 3, 2026
79e82f7
🚑 fix: verify: Use a private Linux keyring
pascalandy Nov 3, 2026
422aa9e
🚑 fix: verify: Bound abandoned private keyring sessions
pascalandy Nov 4, 2026
e81db62
📚 docs: verify: Clarify platform keychain cleanup
pascalandy Nov 4, 2026
fba9948
📚 docs: verify: Distinguish platform cleanup recovery
pascalandy Nov 4, 2026
c111638
🐛 fix: verify: Keep private keyring cleanup in scope
pascalandy Nov 4, 2026
052e09d
♻️ refactor: docs: Separate the extension command overview
pascalandy Nov 3, 2026
f19f94d
🚑 fix: runner: Reserve time for handler cleanup
pascalandy Nov 3, 2026
c895387
🧪 test: runner: Cover handler and cleanup child deadlines
pascalandy Nov 3, 2026
94bc4c7
♻️ refactor: verify: Separate the staged cleanup guide
pascalandy Nov 4, 2026
a90ecd5
♻️ refactor: contract: Separate program cancellation rules
pascalandy Nov 4, 2026
bf25f1e
📚 docs: runner: State the finite handler cleanup allowance
pascalandy Nov 4, 2026
5ee0754
📚 docs: runner: State the measured cancellation limit
pascalandy Nov 4, 2026
c515e7e
📚 docs: runner: Link the durable cleanup measurements
pascalandy Nov 4, 2026
e50d497
📚 docs: runner: Define the measured cancellation intervals
pascalandy Nov 4, 2026
09eb0e0
📚 docs: runner: Name the reservation and its rule source
pascalandy Nov 4, 2026
387b244
📚 docs: runner: Use one term for the cleanup reservation
pascalandy Nov 4, 2026
fb0283d
📚 docs: decisions: Record author and reviewer sessions
pascalandy Nov 3, 2026
2d07032
📚 docs: sessions: Quote exact receipts and scratch trust
pascalandy Nov 4, 2026
b1585c4
📚 docs: verification: State the review identity scope
pascalandy Nov 4, 2026
531b3b4
📚 docs: sessions: Disclose the trimmed whitespace line
pascalandy Nov 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 20 additions & 2 deletions .agents/skills/verify-nicely/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,27 @@ Copy this checklist and tick each step:
- [ ] 5. Evidence: the transcripts outlive the cleanup, and the report quotes them
```

On Linux, a run also needs `dbus-run-session` and `gnome-keyring-daemon`.
Launch fails with the missing program's name; it never uses the caller's D-Bus session.
The run starts and unlocks its own keyring in one private session, shared by every later step.
Cleanup stops that keyring and its bus before removing scratch files.
The session also stops when its owned state or runtime marker disappears, and expires after six hours.
Start a new run after expiry; the wrapper never falls back to the user's session.
The Linux integration test follows this real start, auth and cleanup path.
It skips with the missing program's name when either prerequisite is absent.
[The lifecycle test](../../../cmd/ncly/keyring_lifecycle_linux_test.go) requires a normal private stop to record exit 0 without a shell diagnostic.
It also checks daemon termination and private runtime removal.
The macOS keychain path is unchanged.

## Launch

```bash
run="$(just verify)"
```

`just verify` runs `scripts/verify.sh start`. It builds `ncly` from the checkout as it is, uncommitted changes included, into `$run/build/`. It makes a scratch home in `$run/scratch/home/`, with its own XDG folders, and installs the Go fixture `hello` there as an external extension, in `.local/share/nicely/extensions/`, with its manifest, catalogs, and skill beside it. It writes the wrapper `$run/scratch/bin/ncly`, which sets `HOME`, the XDG folders, and a `PATH` without any folder that holds an `ncly-<domain>` file, and unsets `NCLY_CONFIG`, which would point the config elsewhere, so every later command reaches only the scratch folder. On macOS, the auth feature points `HOME` back at the real home, as [auth](features/auth.md) says. Its last line on stdout is the run folder, under `${XDG_CACHE_HOME:-$HOME/.cache}/nicely/verify/`. Done when that folder holds `scratch/bin/ncly`.
`just verify` runs `scripts/verify.sh start`. It builds `ncly` from the checkout as it is, uncommitted changes included, into `$run/build/`. It makes a scratch home in `$run/scratch/home/`, with its own XDG folders, and installs the Go fixture `hello` there as an external extension, in `.local/share/nicely/extensions/`, with its manifest, catalogs, and skill beside it. It writes the wrapper `$run/scratch/bin/ncly`, which sets `HOME`, the XDG folders, and a `PATH` without any folder that holds an `ncly-<domain>` file, and unsets `NCLY_CONFIG`, which would point the config elsewhere, so every later command reaches only the scratch folder. On Linux, the wrapper replaces the caller's bus address and runtime directory with the private session of this run.
A missing or stopped private session fails the call, with no fallback.
On macOS, the auth feature points `HOME` back at the real home, as [auth](features/auth.md) says. Its last line on stdout is the run folder, under `${XDG_CACHE_HOME:-$HOME/.cache}/nicely/verify/`. Done when that folder holds `scratch/bin/ncly`.

## Doctor

Expand All @@ -49,13 +63,17 @@ just verify cleanup "$run"
```

`cleanup` makes scratch and build files writable, including Go's module cache, before removal.
On Linux, it first stops the private keyring and D-Bus session, after any fake-key cleanup.
Its evidence records that stop. A stop failure keeps scratch files and fails cleanup.
If the private session already ended, cleanup discards its private keyring with the scratch folder.
It keeps `$run/evidence/` and refuses a folder that `start` did not create.
When the run prepared `auth`, cleanup first removes its fake key and checks that the keychain reports `AUTH_MISSING`.
Both calls remain in `$run/evidence/cleanup.txt`.
Its stderr says `logged the fake key of verifynicely out of the keychain` only after removal.
Otherwise, stderr says `found no fake key`.
When the key may remain, cleanup keeps scratch and exits 1.
Run cleanup again once the keychain answers.
On macOS, run cleanup again once the login keychain answers.
On Linux, rerun cleanup to discard the stopped private keyring and its scratch files.
Run cleanup after a failed drive too.
Done when cleanup lists the evidence files and both `$run/scratch` and `$run/build` are gone.

Expand Down
2 changes: 1 addition & 1 deletion .agents/skills/verify-nicely/features/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ Each feature file starts with an H1 title and one paragraph about what the user
## Features

- `shared-domains.md` covers named roots, shared discovery, help, describe, completion, skills, config ownership, doctor, and grants
- `hello.md` covers the Go fixture installed as an external extension: discovery, help, answers, errors, reports, describe, its skill, and doctor
- `hello.md` covers the installed external Go fixture extension: discovery, help, answers, errors, reports, describe, its skill, doctor, and bounded handler cleanup of private staging
- `auth.md` covers `ncly auth` against the real keychain, with a test service and a fake key: status and its grants, login, logout, grant, revoke, the masked field and the confirmations in a terminal, doctor, and the cleanup of the fake key
- `terminal.md` covers `ncly` on a real terminal inside tmux, whose server does not answer: the version and the root help answer at once
- `agent.md` covers `just install` in the scratch home and the installed `agent` extension, with a counted stub Codex: discovery, help, its skill, the Codex check of doctor, the dry run of `ncly agent run`, its depth limit, and one recorded run with its saved answer
Expand Down
Loading
Loading