Repository navigation
Closed
6 / 66 of 6 issues completedLabels
1-ready-for-agentValidated work, sufficiently specified for an autonomous agentValidated work, sufficiently specified for an autonomous agent3-pty:p2Normal planned work; default when no priority is establishedNormal planned work; default when no priority is established4-epicGroups Stories around a shared outcome through native sub-issuesGroups Stories around a shared outcome through native sub-issues
Description
The problem (CMO)
The 2026-11-03 reality check found six places where nicely promises more than its code does:
- A YouTube sign-in request gets
TEMPORARY(exit 75), so an agent retries a refusal that waiting does not fix. This occurred twice on the mbp on 2026-10-20. - Each transcript call without
--run-idthat fails the output or key check leaves one more lock file. nicely never deletes lock files. just updateruns git, uv, and Copier with theGIT_*variables of its caller. Under a git hook, git can write in the wrong repository.nclywith a scratch HOME still reaches the real Secret Service on Linux. A testauth logincan write to the user's keyring.- An extension pinned to a release reads the documentation of
mainthrough 47blob/mainlinks. The template also names a private skill. - The principles promise the OS trash, debug details from core, and help that names the wrapped tool. No code does these things.
REF: #295
The outcome (FMO)
Each answer, check, and promise above matches the code. Each fix has a test or a check that fails on the old behavior.
Stories
- A YouTube sign-in request answers TEMPORARY. (fix(transcript): answer a YouTube sign-in request with its cause, not TEMPORARY #295) · code + tests
- Today:
youtube.pysearches the whole diagnostic for a 429, so a 429 warning wins over the final sign-in error. - After: the final
ERRORrecord decides the code. A sign-in request answersTRANSCRIPT_DOWNLOAD_FAILED(exit 1), and its hint names thebrowsersetting.
- Today:
- A refused transcript call leaves a lock file. (fix(transcript): a call without a run ID that fails its checks leaves no lock file #443) · code + tests
- Today:
extensions/transcript/execute.goline 34 opens the run before the output and key checks of lines 59-67. - After: a call without
--run-idchecks the output and the key first. Such a refusal adds no file to the runs folder.
- Today:
just updategives its programs the variables of its caller. (fix(sdk): just update runs its programs without the GIT_* variables of its caller #444) · code + tests- Today:
updateRunandupdateOutputinsdk/extensionrepo/update.gostart programs with noEnv.callerenvchecks three exact package paths only. - After: each program of
just updategets an explicit environment withoutGIT_*.callerenvchecks each package under the paths that it owns.
- Today:
nclywith a scratch HOME reaches the real keyring. (test(auth): on Linux, tests and verify-nicely use a private keyring #445) · code + tests- Today: the keyring library finds the Secret Service through the D-Bus session of the user, not through HOME. The auth scenarios use a fake keychain.
- After: on Linux, a test runs the real
nclyagainst a private keyring, and verify-nicely uses a private keyring.
- A pinned extension reads the documentation of main. (fix(docs): links point to the release tag, and no private skill is named #446) · code + tests
- Today: the template has 44
blob/mainlinks, the bundlednicely-extensionsskill has 3, andreplace-a-file.mdline 52 names a private skill. - After: each link points to the release tag of the template or of the running
ncly. The template names no private skill.
- Today: the template has 44
- The principles promise features with no code. (docs(north-star): promise the trash, core debug details, and tool credit only when a command needs them #447) · text
- Today: principle 4 promises the OS trash,
global-flags.mdpromises debug and verbose details from core, and principle 10 promises help that names the tool. - After: each text says that the feature comes when a command needs it, through the SDK. Each rule links the item or decision that delivers it.
- Today: principle 4 promises the OS trash,
Done when
The scenarios of #295, #443, #444, and #446 pass in just check. The private keyring test of #445 passes on om1. The texts of #447 promise only what the code does.
Every Story has a documented disposition. The outcome has delivery evidence.
👨🏻🍳 For the agent
👨🏻🍳 Details
Out of this Epic
- Hard-coded English in
sdk/extensionrepoandinternal/cli/values.go: COR-102-T1, after docs(backlog): serve COR-104-T10 before COR-102, and make the tracking files true #442 - A
GRANT_UNUSEDmessage for a hidden copy, andncly helpin text under JSON: backlog issues fix(grants): GRANT_UNUSED says that no extension is there for a hidden copy #452 and fix(cli): ncly help answers in text when JSON is requested #453 - A check of a stale
nclybuild inncly doctor: backlog issue feat(doctor): tell the user that the installed ncly is older than the latest release #454
File conflicts
None between these six Stories. #446 and #451 both change template/AGENTS/rule-index/loop.md.jinja, so #451 waits for #446.
Uncertainty
- test(auth): on Linux, tests and verify-nicely use a private keyring #445: nobody tried
dbus-run-sessionwithgnome-keyring-daemonon om1 yet. Omarchy ships gnome-keyring, and the go-keyring CI uses the same method.
Approaches considered
- An SSA analyzer for a command with no
Env: refused. An explicitEnvwith a poisoned test proves more for less. - A sweeper that deletes old lock files: refused. Deletion of a flock file races with a new lock.
- The Python API of yt-dlp: refused. Its errors still give text, not stable codes.
- Code for the trash, core debug details, and tool credit now: refused (Pascal, 2026-11-03, 2a). No command needs them yet.
by Opus-5.5 via Claude Code
Metadata
Metadata
Assignees
Labels
1-ready-for-agentValidated work, sufficiently specified for an autonomous agentValidated work, sufficiently specified for an autonomous agent3-pty:p2Normal planned work; default when no priority is establishedNormal planned work; default when no priority is established4-epicGroups Stories around a shared outcome through native sub-issuesGroups Stories around a shared outcome through native sub-issues
Activity
pascalandy commentedon Nov 4, 2026
Done. All six Stories merged to main at 531b3b4 on 2026-11-04 and shipped in v0.26.1.
Done when:
just check. The evidence is CI andsignoff=successon each frozen head, and the mini full check (Mini30, 11/11) at 531b3b4.just signoff-layersrun that signed 🚑 fix: verify: Use a private Linux keyring #470 (status 58039110225), with Verify29 in #470.The same stack also merged #462 (#466) and #468 (#471), which were outside the plan, and #450 (#472) of Epic #458. Follow-ups: #473, #474, #475, #476, #477.
by Opus-5.5 via Claude Code