Skip to content

🚑 fix: sdk: Isolate updater Git state - #469

Merged
pascalandy merged 27 commits into
mainfrom
epic16-session-id-1-update-environment
Nov 4, 2026
Merged

pascalandy merged 27 commits into
mainfrom
epic16-session-id-1-update-environment

Conversation

@pascalandy

@pascalandy pascalandy commented Nov 3, 2026 •

Copy link
Copy Markdown
Owner

Outside the plan: Pascal assigned this Epic 16 correction on 2026-11-03.

A caller's GIT_* settings could redirect the updater and Copier's nested Git calls to another repository. Both updater launch paths now use one explicit environment builder that removes every GIT_* entry and preserves other settings. The analyzer checks owned packages and descendants at a slash boundary. Its allowances apply only to the exact NewOwnedRun, updateEnviron, guard.stage and fake.run owners.

The real updater regression uses two repositories it creates under TMPDIR, plus Copier/Go/check stubs. Before repair, Copier's real Git ref write changes the second fixture and sees inherited Git variable names. After repair, the target receives the copied output and pin/check results, the stubs see no GIT_*, and the second repository's refs, HEAD, index, config and tracked contents are identical. Real-clone for-each-ref and worktree list --porcelain outputs are identical before/after each red and green probe; no poison variable targets the clone or any run checkout.

Analyzer cases cover a descendant, a similar prefix, the two exact intentional readers and forbidden sibling/descendant functions. All focused tests, lint, limits and plan checks pass. Pinned documentation rule S65 moved into its own file as a neutral prerequisite split.

Closes #444

  • 1. Spec: the routed sections describe the change
  • 2. Scenario: the new regression fails on the old behavior
  • 3. Code: the focused regression passes after repair
  • 4. Text: no new product string outside catalogs
  • 5. Checks: the full just check passed at this frozen head inside the owner recipe; final-head GitHub CI passed
  • 6. Verify: n/a for core CLI; generated updater and analyzer regressions run in just check
  • 7. Docs: README and the routed rules describe the change; this issue is the outside-plan card
  • 8. Sign off: the project signoff-layers recipe checked this frozen head and posted success status 58038458760

Real-clone protection readback: each exact command below ran outside the poisoned test subprocess. Both captured stdout files in each pair compare byte-for-byte (exit 0). The full inventories are retained through validation; the two scratch checkouts have been removed without force.

Probe Command Before SHA-256 After SHA-256 Bytes each
red git -C /home/pascal/projects/nicely for-each-ref c83f2b468981e5d71084a07ffe26b3f389693e2931725890e37d72914f214d41 c83f2b468981e5d71084a07ffe26b3f389693e2931725890e37d72914f214d41 419290
red git -C /home/pascal/projects/nicely worktree list --porcelain d7639ebf69756ef37626a357b8c1c6a2213bef8c50319c8b9eb72ce1f6ec1339 d7639ebf69756ef37626a357b8c1c6a2213bef8c50319c8b9eb72ce1f6ec1339 9983
green git -C /home/pascal/projects/nicely for-each-ref 42ec2bc0a72f8238fa2247fc174c7bd6a8660b24acdf83211e78ab631a77d05b 42ec2bc0a72f8238fa2247fc174c7bd6a8660b24acdf83211e78ab631a77d05b 419430
green git -C /home/pascal/projects/nicely worktree list --porcelain d7639ebf69756ef37626a357b8c1c6a2213bef8c50319c8b9eb72ce1f6ec1339 d7639ebf69756ef37626a357b8c1c6a2213bef8c50319c8b9eb72ce1f6ec1339 9983

Earlier-head CI: full just check passed at 7ef8e87b14a78edfd1c4dd8dfdb08ed6dfd96725 (workflow check).

Independent Verify evidence

Verify is n/a for a core ncly feature. The affected just update is the generated extension-repository recipe, not a recipe of this core checkout. The regression uses a Copier stub and real Git against two repositories created under TMPDIR. It checks the second repository independently, before and after, and exercises the two allowed readers plus owned-path boundaries through the analyzer tests. These run in just check. No real clone is a poison target. The core checkout's lack of an update recipe does not remove that regression requirement.

First-pair fixes and new-head evidence boundary

Previously recorded layer head: d1200c0adf9f163654a7030822bc2e4023c0d36b. Earlier CI, owner-status and Verify quotes below describe their explicitly recorded earlier heads. They do not certify this new head. New-head full checks and fresh affected Verify are pending.

Keep the issue's removal of every GIT_* variable. Isolate template-test through a scratch HOME as well as its scratch config so child Git cannot regain the user's global config after GIT_CONFIG_GLOBAL is removed. Document the shared helper's existing check/contract/readiness scope. The poison test passes with both poison targets created under TMPDIR and the independent second repository unchanged.

Real-clone inventories immediately before and after the poison test were byte-identical. The captured equality record is:

{
  "head": "42c743ff669529be3c16642fe9792031d37df357",
  "test": "go test ./sdk/extensionrepo -run ^TestUpdateDropsCallerGitEnvironment$ -count=1",
  "test_exit": 0,
  "refs": {
    "command": "git -C /home/pascal/projects/nicely for-each-ref",
    "before_bytes": 437571,
    "after_bytes": 437571,
    "before_sha256": "3c0ac621e236ec6579b382245617f811b54e0546cb8eed97c843b236e3a235da",
    "after_sha256": "3c0ac621e236ec6579b382245617f811b54e0546cb8eed97c843b236e3a235da",
    "cmp_exit": 0
  },
  "worktrees": {
    "command": "git -C /home/pascal/projects/nicely worktree list --porcelain",
    "before_bytes": 9845,
    "after_bytes": 9845,
    "before_sha256": "bd0e2cc96c878ef6fb50fb66772eb129c5a114db2b86baccc6da11601bc2a4f0",
    "after_sha256": "bd0e2cc96c878ef6fb50fb66772eb129c5a114db2b86baccc6da11601bc2a4f0",
    "cmp_exit": 0
  }
}

Then-current layer head: dfdec32b4510760de753cd4e52457e73fb7fdc15. The stack is clean and pushed. Earlier proof retains its explicitly recorded source; new-head checks, final owner statuses and the remaining review passes are still required.

Then-current validation layer head: 54bb169e50836ae7dd6fc004f31968dea2d2c446. Earlier progress entries name historical heads. The extra final fix-only passes, new-head required checks and owner statuses remain pending. The stack is not Ready.

The final-pair corrections are confined to their owning documentation, template text and comments. Existing proof keeps its recorded tested head; a bounded independent supplement will close Verify22's missing live restoration comparisons and README copy. The new #468 and top dependency intersections and protected-path hits are empty under Chef's receipt-retention rule.

Earlier candidate reconciliation

Candidate layer head: 314ac75d2f9a03fc6920e43228e8f9cb3a3a30e8. This update preserves historical proof at its named source. Final-head CI and recipe owner statuses remain pending; steps 5 and 8 stay unticked. The final extra reviewers found no critical or warning issue at c1ded76. Their last comment and terminology proposals were applied by the Cook afterward and have no additional barrage review.

Final frozen-head validation

Ready for Chef validation at 314ac75d2f9a03fc6920e43228e8f9cb3a3a30e8. This section supersedes pending-state statements in the historical progress entries above. All nine heads are frozen, clean and pushed. Every final head has passing CI and a successful recipe-owned signoff status. CodeRabbit auto review is disabled and its check is skipped, not an approval. The recorded barrage reviews are complete.

CI at this exact head: passing Check 1. Owner status: signoff=success, ID 58038458760. Complete owner-recipe evidence and layer log.

The final checks cover the poisoned-Git-environment regression and exact package/function analyzer allowances. Every caller GIT_* variable is removed; other caller settings retain the stated contract.

The final-top macOS check passed all 11 checks at 531b3b4. Historical failed runs remain recorded, with Chef dispositions and follow-ups. The last comment and terminology corrections after the exhausted final barrage pair have no additional barrage review. The keyring behavior repair has old-red/new-green regression evidence and independent final-head Verify29. No further source changes followed those checks.

by GPT-6.1-Sol via Codex

Record the first-command conditions for trash, core diagnostics and tool credit in COR-629 through COR-631

Keep the global flags contract aligned with current core and transcript output
@coderabbitai

coderabbitai Bot commented Nov 3, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Repository UI
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: 3f773632-4cc4-4fee-a366-4207b3a2c6c4

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

@pascalandy
pascalandy added this pull request to stack #467 November 3, 2026 22:44
@pascalandy pascalandy self-assigned this Nov 3, 2026
@pascalandy pascalandy changed the title epic16 session id 1 update environment 🚑 fix: sdk: Isolate updater Git state Nov 3, 2026
Keep the no-code scope while naming the existing catalog overpromise in the conditional diagnostics idea
Resolve template links with the Copier revision and bundled links with the running ncly version

Replace the private modeling skill reference with public steps and reject blob/main links in pinned sources
@pascalandy
pascalandy force-pushed the epic16-session-id-1-update-environment branch from 7ef8e87 to d1200c0 Compare November 4, 2026 02:31
@pascalandy
pascalandy force-pushed the epic16-session-id-1-privacy-limits branch from 74f0b6c to 3efdda2 Compare November 4, 2026 02:31
@pascalandy
pascalandy force-pushed the epic16-session-id-1-update-environment branch 2 times, most recently from dfdec32 to c580c4f Compare November 4, 2026 04:34
- Purpose: keep the moved overview readable as a standalone paragraph
- Impact: state the template behavior with complete sentences
Read the final ERROR record before diagnostic truncation so sign-in refusals cannot inherit a temporary warning

Keep network failures retryable and name the browser setting in the download failure hint
Refuse invalid outputs and missing keys before generating and opening an unnamed run

Keep named-run locking and verified completion replay ahead of attempt checks without deleting lock files
Distinguish the executed preparation checks from the dry-run calls in the same Verify feature
- Purpose: Prove the existing-run answers after successful unnamed preflight
- Impact: Fix only the generated ID in a test subprocess; preserve normal call ordering and saved bytes
Require an explicit accepted limit ID tied to every matrix row of its privacy case while retaining independent output and bad-variant checks

Keep private text searches strict and reject missing, unrelated, duplicate or placeholder limit bindings
Move the seven acceptance rules unchanged to their own linked page before extending their privacy condition
Require the accepted Limit row and every matrix row to name the same Output case
Keep the independent metadata reader and missing-acceptance controls strict
The unrelated hotel-network limit now fails even when the matrix names its ID
Keep the ordinary private-text negative control and route accepted retention through the scoped limit contract
- Purpose: Reject an accepted limit whose text contains only bindings, its ID or placeholders
- Impact: Name missing Limit text and share the Output grammar while keeping independent artifact checks
- Purpose: keep an unfinished limit from suppressing the private-text check
- Impact: reject None or Fill: parts anywhere in the Limit cell, with public regression controls
- Purpose: make the contract describe the actual limit and private-text checks
- Impact: condition generic privacy examples and define the whole-part placeholder rule
@pascalandy
pascalandy force-pushed the epic16-session-id-1-update-environment branch from c580c4f to d2f6629 Compare November 4, 2026 06:14
@pascalandy
pascalandy force-pushed the epic16-session-id-1-privacy-limits branch from 42d2669 to a172b1c Compare November 4, 2026 06:14
Correct the final review's remaining documentation and comment claims. Keep executable behavior unchanged.
Remove caller GIT_* state from every update program and check the owned package trees with exact reader allowances
Preserve the all-GIT-variable update contract while giving Copier a scratch HOME fallback
Document that the shared helpers also serve check, contract and readiness probes
- Purpose: describe the implemented environment readers without an exclusivity claim
- Impact: label current command behavior accurately and retain caller-setting rules
Correct the final review's remaining documentation and comment claims. Keep executable behavior unchanged.
@pascalandy
pascalandy force-pushed the epic16-session-id-1-update-environment branch from d2f6629 to 54bb169 Compare November 4, 2026 06:45
Name every GIT_* variable and use the existing check and readiness terms.
@pascalandy

Copy link
Copy Markdown
Owner Author

Note

🤖 GPT-6.1-Sol responding on behalf of @pascalandy

Final owner-gate evidence for 314ac75d2f9a03fc6920e43228e8f9cb3a3a30e8. The project recipe ran this head's full just check before posting its signoff status.

Signoff36 passed all six remaining heads in one invocation on om1, 06:16:23–07:39:36 America/Montreal on 2026-11-04. Recipe, token reader, private supervisor, pipeline and launcher all exited 0. This head's new status ID is 58038458760. No continuation or client-error exception was used.

Tests used a private D-Bus session and recipe umask 0022. The existing GitHub token crossed only an anonymous pipe into the private process environment. No credential value was written or quoted. All nine frozen heads and 36 ancestry pairs matched on readback. Final GitHub state shows signoff=success for this exact head.

The complete layer log follows. Host-specific paths are normalized. Release output belongs to disposable test fixtures, not a Nicely release. Earlier failed invocations remain historical evidence rather than passing retries.

GOTOOLCHAIN="$(go -C "<run>/cache/nicely/signoff-layers/20261104-061623-2570888/worktree/tools" env GOVERSION)" go tool -modfile="<run>/cache/nicely/signoff-layers/20261104-061623-2570888/worktree/tools/go.mod" golangci-lint fmt --diff ./... ./testdata/extensions/...
for dir in testdata/extensions/standalone testdata/extensions/standalone-named; do (cd "$dir" && GOTOOLCHAIN="$(go -C "<run>/cache/nicely/signoff-layers/20261104-061623-2570888/worktree/tools" env GOVERSION)" go tool -modfile="<run>/cache/nicely/signoff-layers/20261104-061623-2570888/worktree/tools/go.mod" golangci-lint fmt --diff); done
cd tools && go tool golangci-lint fmt --diff
GOTOOLCHAIN="$(go -C "<run>/cache/nicely/signoff-layers/20261104-061623-2570888/worktree/tools" env GOVERSION)" go tool -modfile="<run>/cache/nicely/signoff-layers/20261104-061623-2570888/worktree/tools/go.mod" golangci-lint run ./... ./testdata/extensions/...
0 issues.
for dir in testdata/extensions/standalone testdata/extensions/standalone-named; do (cd "$dir" && GOTOOLCHAIN="$(go -C "<run>/cache/nicely/signoff-layers/20261104-061623-2570888/worktree/tools" env GOVERSION)" go tool -modfile="<run>/cache/nicely/signoff-layers/20261104-061623-2570888/worktree/tools/go.mod" golangci-lint run ./...); done
0 issues.
0 issues.
cd tools && go tool golangci-lint run ./cmd/...
0 issues.
go vet -vettool="$(go tool -n nicelyvet)" ./... ./testdata/extensions/...
vettool="$(go tool -n nicelyvet)"; for dir in testdata/extensions/standalone testdata/extensions/standalone-named; do (cd "$dir" && go vet -vettool="$vettool" ./...); done
go mod tidy -diff
for dir in testdata/extensions/standalone testdata/extensions/standalone-named; do go -C "$dir" mod tidy -diff; done
cd tools && go mod tidy -diff
ok  	github.com/pascalandy/nicely/cmd/ncly	72.626s
ok  	github.com/pascalandy/nicely/extensions/agent	(cached)
?   	github.com/pascalandy/nicely/extensions/agent/cmd/ncly-agent	[no test files]
ok  	github.com/pascalandy/nicely/extensions/skill	(cached)
ok  	github.com/pascalandy/nicely/extensions/transcript	(cached)
?   	github.com/pascalandy/nicely/extensions/transcript/cmd/ncly-transcript	[no test files]
ok  	github.com/pascalandy/nicely/internal/cli	(cached)
?   	github.com/pascalandy/nicely/internal/keychain	[no test files]
?   	github.com/pascalandy/nicely/internal/specdoc	[no test files]
?   	github.com/pascalandy/nicely/sdk/analysis	[no test files]
ok  	github.com/pascalandy/nicely/sdk/analysis/callerenv	1.829s
?   	github.com/pascalandy/nicely/sdk/analysis/cmd/nicelyvet	[no test files]
ok  	github.com/pascalandy/nicely/sdk/analysis/runnerdiscard	0.535s
ok  	github.com/pascalandy/nicely/sdk/command	(cached)
ok  	github.com/pascalandy/nicely/sdk/config	(cached)
ok  	github.com/pascalandy/nicely/sdk/contract	(cached)
ok  	github.com/pascalandy/nicely/sdk/extension	(cached)
ok  	github.com/pascalandy/nicely/sdk/extensionrepo	0.090s
?   	github.com/pascalandy/nicely/sdk/extensionrepo/cmd/extensionrepo	[no test files]
?   	github.com/pascalandy/nicely/sdk/extensionrepo/test	[no test files]
ok  	github.com/pascalandy/nicely/sdk/extensiontest	315.051s
ok  	github.com/pascalandy/nicely/sdk/extensiontest/fake	(cached)
?   	github.com/pascalandy/nicely/sdk/extensiontest/guard	[no test files]
ok  	github.com/pascalandy/nicely/sdk/i18n	0.058s
ok  	github.com/pascalandy/nicely/sdk/platform	(cached)
ok  	github.com/pascalandy/nicely/sdk/record	(cached)
ok  	github.com/pascalandy/nicely/sdk/runner	(cached)
?   	github.com/pascalandy/nicely/sdk/tui	[no test files]
ok  	github.com/pascalandy/nicely/sdk/verification	(cached)
?   	github.com/pascalandy/nicely/sdk/wrap	[no test files]
ok  	github.com/pascalandy/nicely/testdata/extensions/hello	(cached)
?   	github.com/pascalandy/nicely/testdata/extensions/hello/cmd/ncly-hello	[no test files]
ok  	github.com/pascalandy/nicely/testdata/extensions/keyed	(cached)
?   	github.com/pascalandy/nicely/testdata/extensions/shared/export	[no test files]
ok  	github.com/pascalandy/nicely/testdata/extensions/video-convert	(cached)
?   	github.com/pascalandy/nicely/testdata/extensions/video-convert/cmd/ncly-video-convert	[no test files]
ok  	github.com/pascalandy/nicely/testdata/extensions/video-subtitle	(cached)
?   	github.com/pascalandy/nicely/testdata/extensions/video-subtitle/cmd/ncly-video-subtitle	[no test files]
ok  	example.com/standalone	1.778s
?   	example.com/standalone/cmd/ncly-standalone	[no test files]
ok  	example.com/ncly-video-convert	1.817s
?   	example.com/ncly-video-convert/cmd/ncly-video-convert	[no test files]
ok  	github.com/pascalandy/nicely/tools/cmd/plan	1.577s
ok  	github.com/pascalandy/nicely/tools/cmd/release-artifacts	3.778s
Release-check validation and working-source capture passed
Release-verify assets, checksums, compiler, and Homebrew tap formula checks passed
Release-check validation and working-source capture passed
Git hook environment cannot change the caller repository
check-layers and signoff-layers check each layer as origin holds it, on the layer below, sign only what passed, and leave the caller unchanged
signoff: dirty fixes fail, frozen SHAs pass, caller files stay, and failed gates sign nothing
just check stops at the first failure with its code, --keep-going runs every check, then sums them up, and an old python3 stops both first
just preflight exits 0 once every prerequisite is present, and 1 with a hint for each one that is missing
just scenario refuses each selection that would run no scenario or a wrong count
install-test: just install builds only the names that it gets, or all of them
go test -race ./sdk/... ./internal/...
?   	github.com/pascalandy/nicely/sdk/analysis	[no test files]
ok  	github.com/pascalandy/nicely/sdk/analysis/callerenv	5.918s
?   	github.com/pascalandy/nicely/sdk/analysis/cmd/nicelyvet	[no test files]
ok  	github.com/pascalandy/nicely/sdk/analysis/runnerdiscard	2.613s
ok  	github.com/pascalandy/nicely/sdk/command	(cached)
ok  	github.com/pascalandy/nicely/sdk/config	(cached)
ok  	github.com/pascalandy/nicely/sdk/contract	(cached)
ok  	github.com/pascalandy/nicely/sdk/extension	(cached)
ok  	github.com/pascalandy/nicely/sdk/extensionrepo	1.374s
?   	github.com/pascalandy/nicely/sdk/extensionrepo/cmd/extensionrepo	[no test files]
?   	github.com/pascalandy/nicely/sdk/extensionrepo/test	[no test files]
ok  	github.com/pascalandy/nicely/sdk/extensiontest	289.526s
ok  	github.com/pascalandy/nicely/sdk/extensiontest/fake	(cached)
?   	github.com/pascalandy/nicely/sdk/extensiontest/guard	[no test files]
ok  	github.com/pascalandy/nicely/sdk/i18n	1.412s
ok  	github.com/pascalandy/nicely/sdk/platform	(cached)
ok  	github.com/pascalandy/nicely/sdk/record	(cached)
ok  	github.com/pascalandy/nicely/sdk/runner	(cached)
?   	github.com/pascalandy/nicely/sdk/tui	[no test files]
ok  	github.com/pascalandy/nicely/sdk/verification	(cached)
?   	github.com/pascalandy/nicely/sdk/wrap	[no test files]
ok  	github.com/pascalandy/nicely/internal/cli	(cached)
?   	github.com/pascalandy/nicely/internal/keychain	[no test files]
?   	github.com/pascalandy/nicely/internal/specdoc	[no test files]
bash scripts/template-test.sh
go: downloading github.com/rogpeppe/go-internal v1.16.0
go: downloading github.com/santhosh-tekuri/jsonschema/v6 v6.0.3
go: downloading charm.land/bubbles/v2 v2.2.1
go: downloading github.com/charmbracelet/x/ansi v0.11.8
go: downloading github.com/creack/pty v1.1.24
go: downloading golang.org/x/sys v0.48.0
go: downloading github.com/zalando/go-keyring v0.2.8
go: downloading github.com/BurntSushi/toml v1.6.0
go: downloading github.com/nicksnyder/go-i18n/v2 v2.6.1
go: downloading golang.org/x/text v0.42.0
go: downloading golang.org/x/mod v0.41.0
go: downloading golang.org/x/term v0.46.0
go: downloading github.com/spf13/cobra v1.10.2
go: downloading go.yaml.in/yaml/v3 v3.0.5
go: downloading github.com/spf13/pflag v1.0.10
go: downloading github.com/pelletier/go-toml/v2 v2.4.3
go: downloading charm.land/bubbletea/v2 v2.0.8
go: downloading charm.land/glamour/v2 v2.0.1
go: downloading charm.land/huh/v2 v2.0.3
go: downloading github.com/pascalandy/lipgloss/v2 v2.0.7-0.20261016054459-6d92d28af73f
go: downloading github.com/charmbracelet/colorprofile v0.4.3
go: downloading golang.org/x/tools v0.49.0
go: downloading github.com/dlclark/regexp2 v1.11.0
go: downloading github.com/godbus/dbus/v5 v5.2.2
go: downloading github.com/danieljoos/wincred v1.2.3
go: downloading github.com/yuin/goldmark v1.7.17
go: downloading github.com/yuin/goldmark-emoji v1.0.5
go: downloading github.com/alecthomas/chroma/v2 v2.14.0
go: downloading github.com/charmbracelet/x/exp/slice v0.0.0-20250327172914-2fdc97757edf
go: downloading github.com/microcosm-cc/bluemonday v1.0.27
go: downloading github.com/clipperhouse/displaywidth v0.11.0
go: downloading github.com/clipperhouse/uax29/v2 v2.7.0
go: downloading github.com/lucasb-eyer/go-colorful v1.4.1
go: downloading github.com/mattn/go-runewidth v0.0.27
go: downloading github.com/inconshreveable/mousetrap v1.1.0
go: downloading github.com/catppuccin/go v0.2.0
go: downloading github.com/charmbracelet/x/exp/ordered v0.1.0
go: downloading github.com/charmbracelet/x/exp/strings v0.0.0-20240722160745-212f7b056ed0
go: downloading github.com/mitchellh/hashstructure/v2 v2.0.2
go: downloading github.com/charmbracelet/ultraviolet v0.0.0-20260811164956-006e29f97886
go: downloading github.com/charmbracelet/x/term v0.2.2
go: downloading github.com/rivo/uniseg v0.4.7
go: downloading github.com/muesli/cancelreader v0.2.2
go: downloading github.com/aymerick/douceur v0.2.0
go: downloading golang.org/x/net v0.58.0
go: downloading github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e
go: downloading github.com/dustin/go-humanize v1.0.1
go: downloading github.com/atotto/clipboard v0.1.4
go: downloading github.com/gorilla/css v1.0.1
go: downloading golang.org/x/sync v0.23.0
go: downloading github.com/charmbracelet/x/windows v0.2.2
go: downloading github.com/charmbracelet/x/termios v0.1.1
go: downloading github.com/charmbracelet/x/exp/golden v0.0.0-20250806222409-83e3a29d542f
go: downloading github.com/aymanbagabas/go-udiff v0.4.1
go: downloading github.com/charmbracelet/x/xpty v0.1.3
go: downloading golang.org/x/exp v0.0.0-20231006140011-7918f672742d
go: downloading github.com/alecthomas/assert/v2 v2.7.0
go: downloading github.com/stretchr/testify v1.11.1
go: downloading github.com/MakeNowJust/heredoc v1.0.0
go: downloading github.com/alecthomas/repr v0.4.0
go: downloading github.com/google/go-cmp v0.6.0
go: downloading github.com/pmezard/go-difflib v1.0.0
go: downloading gopkg.in/yaml.v3 v3.0.1
go: downloading github.com/davecgh/go-spew v1.1.1
go: downloading github.com/stretchr/objx v0.5.2
go: downloading github.com/charmbracelet/x/conpty v0.1.1
go: downloading github.com/hexops/gotextdiff v1.0.3
go: downloading github.com/charmbracelet/x/errors v0.0.0-20240508181413-e8d8b6e2de86
go run github.com/pascalandy/nicely/sdk/extensionrepo/cmd/extensionrepo check
AGENTS/rule-index.md: 3 of 66 rules are Prose only, and 13 Prose on purpose
go mod tidy -diff
go vet ./...
go build -o <run>/tmp/ncly-nicelyvet-1907449104/nicelyvet github.com/pascalandy/nicely/sdk/analysis/cmd/nicelyvet
go vet -vettool=<run>/tmp/ncly-nicelyvet-1907449104/nicelyvet ./...
go test -count=1 ./...
ok  	example.com/ncly-video-convert	6.278s
?   	example.com/ncly-video-convert/cmd/ncly-video-convert	[no test files]
?   	example.com/ncly-video-convert/internal/export	[no test files]
ok  	example.com/ncly-video-convert	5.310s
?   	example.com/ncly-video-convert/cmd/ncly-video-convert	[no test files]
?   	example.com/ncly-video-convert/internal/export	[no test files]
go run github.com/pascalandy/nicely/sdk/extensionrepo/cmd/extensionrepo check
AGENTS/rule-index.md: 3 of 66 rules are Prose only, and 13 Prose on purpose
go mod tidy -diff
go vet ./...
go build -o <run>/tmp/ncly-nicelyvet-2226052794/nicelyvet github.com/pascalandy/nicely/sdk/analysis/cmd/nicelyvet
go vet -vettool=<run>/tmp/ncly-nicelyvet-2226052794/nicelyvet ./...
go test -count=1 ./...
manifest.toml: example `ncly describe`: skipped: command is outside this manifest, so its paid effects are unknown
manifest.toml:1:13: warning VIDEO_CONVERT_WARNING untested (commands=video convert; modes=run,dry_run): Requires a controlled runtime; https://example.com/issues/1
go run ./internal/export install
installed <run>/tmp/ncly-template-test.4Xl1RaWj/named/data/nicely/extensions/ncly-video-convert
go run github.com/pascalandy/nicely/sdk/extensionrepo/cmd/extensionrepo contract
go mod download github.com/pascalandy/nicely
go run ./internal/export install
installed <run>/tmp/ncly-template-test.4Xl1RaWj/named/data/nicely/extensions/ncly-video-convert
go run ./internal/export uninstall
go run ./internal/export uninstall
release proof: just release v0.1.0, exit 1
go run ./internal/export release 'v0.1.0' 
release: no successful receipt for 590beca4f1b1334dba1ba6f2e21051c219a727f4; run just signoff for this pushed SHA
exit status 1
error: Recipe `release` failed on line 36 with exit code 1
release proof: just release v0.1.0, exit 1
go run ./internal/export release 'v0.1.0' 
release: no successful receipt for 590beca4f1b1334dba1ba6f2e21051c219a727f4; run just signoff for this pushed SHA
exit status 1
error: Recipe `release` failed on line 36 with exit code 1
release proof: just release v0.1.0, exit 1
go run ./internal/export release 'v0.1.0' 
release: no successful receipt for 590beca4f1b1334dba1ba6f2e21051c219a727f4; run just signoff for this pushed SHA
exit status 1
error: Recipe `release` failed on line 36 with exit code 1
release proof: just release v0.1.0, exit 1
go run ./internal/export release 'v0.1.0' 
release: no successful receipt for 590beca4f1b1334dba1ba6f2e21051c219a727f4; run just signoff for this pushed SHA
exit status 1
error: Recipe `release` failed on line 36 with exit code 1
release proof: just release v0.1.0, exit 1
go run ./internal/export release 'v0.1.0' 
release: no successful receipt for 590beca4f1b1334dba1ba6f2e21051c219a727f4; run just signoff for this pushed SHA
exit status 1
error: Recipe `release` failed on line 36 with exit code 1
release proof: just release v0.1.0, exit 1
go run ./internal/export release 'v0.1.0' 
release: no successful receipt for 590beca4f1b1334dba1ba6f2e21051c219a727f4; run just signoff for this pushed SHA
exit status 1
error: Recipe `release` failed on line 36 with exit code 1
release proof: just release v0.1.0, exit 1
go run ./internal/export release 'v0.1.0' 
release: the receipt for 590beca4f1b1334dba1ba6f2e21051c219a727f4 holds no successful just finish; run just signoff for this pushed SHA, which runs just finish first
exit status 1
error: Recipe `release` failed on line 36 with exit code 1
release proof: just release v0.1.0, exit 1
go run ./internal/export release 'v0.1.0' 
release: release needs an unchanged, clean HEAD; commit the intended files and run just signoff
exit status 1
error: Recipe `release` failed on line 36 with exit code 1
release proof: just release v0.1.0, exit 1
go run ./internal/export release 'v0.1.0' 
release: receipt in <run>/tmp/ncly-template-test.4Xl1RaWj/named/release-cache/nicely/release/20261104T120116Z-590beca4f1b1334dba1ba6f2e21051c219a727f4-666460522/receipt.json
release: finish exited 1; read <run>/tmp/ncly-template-test.4Xl1RaWj/named/release-cache/nicely/release/20261104T120116Z-590beca4f1b1334dba1ba6f2e21051c219a727f4-666460522/finish.stderr
exit status 1
error: Recipe `release` failed on line 36 with exit code 1
release proof: just release v0.1.0, exit 1
go run ./internal/export release 'v0.1.0' 
release: release SHA is not the pushed default branch of origin; merge and push the signed SHA first
exit status 1
error: Recipe `release` failed on line 36 with exit code 1
release proof: just release v0.1.0, exit 1
go run ./internal/export release 'v0.1.0' '<run>/tmp/ncly-template-test.4Xl1RaWj/named/missing-fixture.md'
release: receipt in <run>/tmp/ncly-template-test.4Xl1RaWj/named/release-cache/nicely/release/20261104T120117Z-4ae6cbf94cabeb68be9fc1bf7b2d462b044b0cb7-3734129026/receipt.json
release: acceptance exited 1; read <run>/tmp/ncly-template-test.4Xl1RaWj/named/release-cache/nicely/release/20261104T120117Z-4ae6cbf94cabeb68be9fc1bf7b2d462b044b0cb7-3734129026/acceptance.stderr
exit status 1
error: Recipe `release` failed on line 36 with exit code 1
release proof: just release v0.1.0, exit 0
go run ./internal/export release 'v0.1.0' 
release: receipt in <run>/tmp/ncly-template-test.4Xl1RaWj/named/release-cache/nicely/release/20261104T120117Z-4ae6cbf94cabeb68be9fc1bf7b2d462b044b0cb7-2294990082/receipt.json
Released v0.1.0 4ae6cbf94cabeb68be9fc1bf7b2d462b044b0cb7
default Economy: ncly video convert notes.md --dry-run, exit 0
default Economy: ncly video convert notes.md --dry-run --json, exit 0
default Economy: ncly video convert notes.md, exit 0
default Economy: ncly video convert notes.md --json, exit 0
release proof: just release v0.1.1, exit 1
go run ./internal/export release 'v0.1.1' '<run>/tmp/ncly-template-test.4Xl1RaWj/named/release-fixture/input.md'
release: receipt in <run>/tmp/ncly-template-test.4Xl1RaWj/named/release-cache/nicely/release/20261104T120126Z-262b9fc3dfe6a3dfbcd8fa9cdf3dd078cbbc35dc-2549740493/receipt.json
release: README install cloned SHA 4ae6cbf94cabeb68be9fc1bf7b2d462b044b0cb7, want tagged SHA 262b9fc3dfe6a3dfbcd8fa9cdf3dd078cbbc35dc; correct the install block
exit status 1
error: Recipe `release` failed on line 36 with exit code 1
RED D095: previous-tag README rejected after publication, exit 1
release proof: just release v0.1.2, exit 0
go run ./internal/export release 'v0.1.2' '<run>/tmp/ncly-template-test.4Xl1RaWj/named/release-fixture/input.md'
release: receipt in <run>/tmp/ncly-template-test.4Xl1RaWj/named/release-cache/nicely/release/20261104T120135Z-b4b87370da9e95a05c07901a65197fbe3097a278-10688180/receipt.json
Released v0.1.2 b4b87370da9e95a05c07901a65197fbe3097a278
GREEN release receipt: correct README, Economy, and NOT_FOUND, exit 0
template video-convert passes checks, replaces its install, and preserves author edits through updates
go run github.com/pascalandy/nicely/sdk/extensionrepo/cmd/extensionrepo check
AGENTS/rule-index.md: 3 of 66 rules are Prose only, and 13 Prose on purpose
go mod tidy -diff
go vet ./...
go build -o <run>/tmp/ncly-nicelyvet-723769629/nicelyvet github.com/pascalandy/nicely/sdk/analysis/cmd/nicelyvet
go vet -vettool=<run>/tmp/ncly-nicelyvet-723769629/nicelyvet ./...
go test -count=1 ./...
ok  	example.com/ncly-probe	5.574s
?   	example.com/ncly-probe/cmd/ncly-probe	[no test files]
?   	example.com/ncly-probe/internal/export	[no test files]
ok  	example.com/ncly-probe	5.521s
?   	example.com/ncly-probe/cmd/ncly-probe	[no test files]
?   	example.com/ncly-probe/internal/export	[no test files]
go run github.com/pascalandy/nicely/sdk/extensionrepo/cmd/extensionrepo check
AGENTS/rule-index.md: 3 of 66 rules are Prose only, and 13 Prose on purpose
go mod tidy -diff
go vet ./...
go build -o <run>/tmp/ncly-nicelyvet-3507828452/nicelyvet github.com/pascalandy/nicely/sdk/analysis/cmd/nicelyvet
go vet -vettool=<run>/tmp/ncly-nicelyvet-3507828452/nicelyvet ./...
go test -count=1 ./...
manifest.toml: example `ncly describe`: skipped: command is outside this manifest, so its paid effects are unknown
manifest.toml: example `ncly describe`: skipped: command is outside this manifest, so its paid effects are unknown
manifest.toml:1:13: warning PROBE_WARNING untested (commands=probe inspect; modes=run,dry_run): Requires a controlled runtime; https://example.com/issues/1
go run ./internal/export install
installed <run>/tmp/ncly-template-test.4Xl1RaWj/whole/data/nicely/extensions/ncly-probe
go run github.com/pascalandy/nicely/sdk/extensionrepo/cmd/extensionrepo contract
go mod download github.com/pascalandy/nicely
go run ./internal/export install
installed <run>/tmp/ncly-template-test.4Xl1RaWj/whole/data/nicely/extensions/ncly-probe
go run ./internal/export uninstall
go run ./internal/export uninstall
release proof: just release v0.1.0, exit 1
go run ./internal/export release 'v0.1.0' 
release: no successful receipt for 90b456aabbe475d09438f4c0672c66628dcefbe2; run just signoff for this pushed SHA
exit status 1
error: Recipe `release` failed on line 36 with exit code 1
release proof: just release v0.1.0, exit 1
go run ./internal/export release 'v0.1.0' 
release: no successful receipt for 90b456aabbe475d09438f4c0672c66628dcefbe2; run just signoff for this pushed SHA
exit status 1
error: Recipe `release` failed on line 36 with exit code 1
release proof: just release v0.1.0, exit 1
go run ./internal/export release 'v0.1.0' 
release: no successful receipt for 90b456aabbe475d09438f4c0672c66628dcefbe2; run just signoff for this pushed SHA
exit status 1
error: Recipe `release` failed on line 36 with exit code 1
release proof: just release v0.1.0, exit 1
go run ./internal/export release 'v0.1.0' 
release: no successful receipt for 90b456aabbe475d09438f4c0672c66628dcefbe2; run just signoff for this pushed SHA
exit status 1
error: Recipe `release` failed on line 36 with exit code 1
release proof: just release v0.1.0, exit 1
go run ./internal/export release 'v0.1.0' 
release: no successful receipt for 90b456aabbe475d09438f4c0672c66628dcefbe2; run just signoff for this pushed SHA
exit status 1
error: Recipe `release` failed on line 36 with exit code 1
release proof: just release v0.1.0, exit 1
go run ./internal/export release 'v0.1.0' 
release: no successful receipt for 90b456aabbe475d09438f4c0672c66628dcefbe2; run just signoff for this pushed SHA
exit status 1
error: Recipe `release` failed on line 36 with exit code 1
release proof: just release v0.1.0, exit 1
go run ./internal/export release 'v0.1.0' 
release: the receipt for 90b456aabbe475d09438f4c0672c66628dcefbe2 holds no successful just finish; run just signoff for this pushed SHA, which runs just finish first
exit status 1
error: Recipe `release` failed on line 36 with exit code 1
release proof: just release v0.1.0, exit 1
go run ./internal/export release 'v0.1.0' 
release: release needs an unchanged, clean HEAD; commit the intended files and run just signoff
exit status 1
error: Recipe `release` failed on line 36 with exit code 1
release proof: just release v0.1.0, exit 1
go run ./internal/export release 'v0.1.0' 
release: receipt in <run>/tmp/ncly-template-test.4Xl1RaWj/whole/release-cache/nicely/release/20261104T120335Z-90b456aabbe475d09438f4c0672c66628dcefbe2-1161676690/receipt.json
release: finish exited 1; read <run>/tmp/ncly-template-test.4Xl1RaWj/whole/release-cache/nicely/release/20261104T120335Z-90b456aabbe475d09438f4c0672c66628dcefbe2-1161676690/finish.stderr
exit status 1
error: Recipe `release` failed on line 36 with exit code 1
release proof: just release v0.1.0, exit 1
go run ./internal/export release 'v0.1.0' 
release: release SHA is not the pushed default branch of origin; merge and push the signed SHA first
exit status 1
error: Recipe `release` failed on line 36 with exit code 1
release proof: just release v0.1.0, exit 1
go run ./internal/export release 'v0.1.0' '<run>/tmp/ncly-template-test.4Xl1RaWj/whole/missing-fixture.md'
release: receipt in <run>/tmp/ncly-template-test.4Xl1RaWj/whole/release-cache/nicely/release/20261104T120337Z-2645775d51af25d41d2af0558f9f1df087e7dba2-1713037675/receipt.json
release: acceptance exited 1; read <run>/tmp/ncly-template-test.4Xl1RaWj/whole/release-cache/nicely/release/20261104T120337Z-2645775d51af25d41d2af0558f9f1df087e7dba2-1713037675/acceptance.stderr
exit status 1
error: Recipe `release` failed on line 36 with exit code 1
release proof: just release v0.1.0, exit 0
go run ./internal/export release 'v0.1.0' 
release: receipt in <run>/tmp/ncly-template-test.4Xl1RaWj/whole/release-cache/nicely/release/20261104T120337Z-2645775d51af25d41d2af0558f9f1df087e7dba2-803099754/receipt.json
Released v0.1.0 2645775d51af25d41d2af0558f9f1df087e7dba2
default Economy: ncly probe inspect notes.md --dry-run, exit 0
default Economy: ncly probe inspect notes.md --dry-run --json, exit 0
default Economy: ncly probe inspect notes.md, exit 0
default Economy: ncly probe inspect notes.md --json, exit 0
release proof: just release v0.1.1, exit 1
go run ./internal/export release 'v0.1.1' '<run>/tmp/ncly-template-test.4Xl1RaWj/whole/release-fixture/input.md'
release: receipt in <run>/tmp/ncly-template-test.4Xl1RaWj/whole/release-cache/nicely/release/20261104T120352Z-274aff7c27e96dc95a3754c3ec689dc149b3eba1-2798280346/receipt.json
release: README install cloned SHA 2645775d51af25d41d2af0558f9f1df087e7dba2, want tagged SHA 274aff7c27e96dc95a3754c3ec689dc149b3eba1; correct the install block
exit status 1
error: Recipe `release` failed on line 36 with exit code 1
RED D095: previous-tag README rejected after publication, exit 1
release proof: just release v0.1.2, exit 0
go run ./internal/export release 'v0.1.2' '<run>/tmp/ncly-template-test.4Xl1RaWj/whole/release-fixture/input.md'
release: receipt in <run>/tmp/ncly-template-test.4Xl1RaWj/whole/release-cache/nicely/release/20261104T120357Z-cc800f8aecb2cdd87ccc90b75616939c3dac3bc3-3000042667/receipt.json
Released v0.1.2 cc800f8aecb2cdd87ccc90b75616939c3dac3bc3
GREEN release receipt: correct README, Economy, and NOT_FOUND, exit 0
template probe passes checks, replaces its install, and preserves author edits through updates
untouched v0.23.2 bootstrap passes through target v0.99.0 and reconciles replacements
v0.23.2 bootstrap recovers from Copier conflict, staged markers, and .rej through target v0.99.1
an extension of v0.23.4 adopts just finish through its first build after just update v0.99.2
All checks passed!
20 files already formatted
0 errors, 0 warnings, 0 informations
bringing up nodes...
bringing up nodes...

........................................................................ [ 84%]
.............                                                            [100%]
85 passed in 4.18s
shellcheck scripts/*.sh .agents/skills/*/scripts/*.sh
shfmt -d scripts/*.sh .agents/skills/*/scripts/*.sh
GOTOOLCHAIN="$(go -C "<run>/cache/nicely/signoff-layers/20261104-061623-2570888/worktree/tools" env GOVERSION)" go tool -modfile="<run>/cache/nicely/signoff-layers/20261104-061623-2570888/worktree/tools/go.mod" actionlint
GOTOOLCHAIN="$(go -C "<run>/cache/nicely/signoff-layers/20261104-061623-2570888/worktree/tools" env GOVERSION)" go tool -modfile="<run>/cache/nicely/signoff-layers/20261104-061623-2570888/worktree/tools/go.mod" actionlint template/.github/workflows/check.yml
gitleaks git --no-banner --redact --log-level warn
✓ Signed off on 314ac75d2f9a03fc6920e43228e8f9cb3a3a30e8
signoff-layers: signed off 314ac75d2f9a03fc6920e43228e8f9cb3a3a30e8 after its checks passed

Raw layer-log SHA-256: 97134d6f146165608388533af4e1cacf5fc970e967b93cc69d03b48fc048bd84.

by GPT-6.1-Sol via Codex

@pascalandy
pascalandy removed this pull request from stack #467 November 4, 2026 13:07
@pascalandy
pascalandy changed the base branch from epic16-session-id-1-privacy-limits to main November 4, 2026 13:08
@pascalandy
pascalandy merged commit 314ac75 into main Nov 4, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix(sdk): just update runs its programs without the GIT_* variables of its caller

1 participant