packaging: one paste installs telltale on Windows, and says the binary is unsigned - #303
Merged
Conversation
…y is unsigned `irm .../packaging/install.ps1 | iex` is the third Windows route and the only one that needs nothing installed first. scoop and winget both assume the reader already has the package manager; a reader with neither had to unpack an archive by hand or build from source. The script downloads the release, compares the SHA-256 against checksums.txt BEFORE it unpacks anything, and deletes the download on a mismatch. It then prints, at the one moment the reader can act on it, that the binary carries no Authenticode signature and that the checksum proves what the workflow built and not who built it. It signs nothing and prepares no signing pipeline; design.md §8 item 8 stands unchanged. No brew tap, no npm, no winget automation. Measured 2026-08-18 against the published v0.2.0, on PowerShell 7.6.5 and Windows PowerShell 5.1.26100.9168: both installed the archive, both computed the digest GitHub reports for the asset, and the installed binary answered `telltale 0.2.0`. Two refusals ran end to end and installed nothing. The mismatch refusal has no end-to-end trial and STATE.md records that gap. README gains a first-five-minutes table, every row keyed to a line `telltale doctor` actually prints, so a stranger can tell this preflight working from telltale failing. CI now parses install.ps1 under Windows PowerShell 5.1 and rejects any byte at or above 0x80: 5.1 reads a BOM-less file as ANSI, and one em dash cost four parser errors while pwsh read the same file fine. README also gains a badge slot and a hero slot, and design.md records the listing and Show HN cadence as strategy no contributor may execute. The run-evidence bar's threshold stays the owner's to name; the sweep's proposed number has no measurement behind it and was not adopted. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What a user can now do
Paste one line into PowerShell and have telltale on
PATH:It is the third Windows route and the only one that needs nothing installed
first. scoop and winget both assume the reader already has the package
manager. A reader with neither had two choices: unpack an archive by hand, or
build from source.
What it verifies, and what it refuses to claim
The script downloads the archive and
checksums.txt, compares the SHA-256before it unpacks anything, and deletes the download on a mismatch. It
then prints, in its own output rather than only in a document nobody reads at
install time, that the binary carries no Authenticode signature and that the
checksum proves what the workflow built and not who built it. That is
design.md§8 item 8 restated at the one moment the reader can act on it.The script signs nothing and prepares no signing pipeline. No brew tap, no
npm, no winget automation. Each of those is ruled elsewhere and a one-paste
installer is not an argument to revisit any of them.
Three refusals live in the script rather than in a note: a non-
AMD64machine, a tag with no published release (named with the URL that 404'd), and
a
checksums.txtwith no entry for the archive.Verified LIVE, 2026-08-18, against the published
v0.2.0installed
telltale_0.2.0_windows_amd64.zip, both computed7a2401aa…33772528, and that equals the digest GitHub reports for theasset. The installed binary answers
telltale 0.2.0.irm | iexshape, exercised asGet-Content -Raw | Invoke-Expression.The calling shell survived: the script throws and never calls
exit.PATHbranch, driven once against the real user variable and restoredbyte for byte. It also measured the one surprise, now recorded: the
directory is appended, so a
telltale.exealready earlier onPATHgoes on winning.
TELLTALE_VERSION=v0.1.0against the tag that has no release.telltale doctoron this box, twice, for the troubleshooting table below:once with all five vendors resolvable, once with a stripped
PATH.Recorded as debt, not claimed: the mismatch refusal has no end-to-end live
trial, because driving it needs a host that serves a corrupted archive. Its
comparison was measured live instead (the real
checksums.txtparsed, a byteappended to the real archive, the hashes differed); the three lines that act
on that result are unexercised.
STATE.mdcarries it as a known gap anddesign.md§8 carries the record.First five minutes
README.mdgains a troubleshooting table. Every row is keyed to a linetelltale doctoractually prints, taken from the two runs above — includingthe one a stranger meets first:
0 checks passedwith no vendor CLIinstalled, which is the preflight working rather than telltale failing.
The gate
ci.ymlparsesinstall.ps1under Windows PowerShell 5.1 on every push,rejects any byte at or above
0x80, and rejects anexitstatement. It neverexecutes the script, because executing it would download a release on every
push.
That gate exists because the trap bit during this work: 5.1 reads a BOM-less
file as ANSI, so one em dash inside a
throwproduced four parser errorsunder 5.1 while pwsh 7.6.5 read the same file fine. The ASCII arm was measured
non-vacuous — one em dash appended to a copy, and the gate reported three
bytes and failed.
The playbook, recorded and not executed
design.md§8 gains a dated amendment for the launch cadence, because thisrepo rejects unrecorded strategy and every piece of it is an owner action on a
surface outside this repository:
automated, never opened by a contributor session. The README badge slot
fills only after a listing merges.
pins the launch to ONE hypothesis, so a serial cadence must not quietly
widen that claim.
evidence. The threshold is NOT taken here: the sweep proposed "10 runs
in 30 days", that number has no measurement behind it, and adopting it would
be the invented figure ADR-001 refuses. The count and the window are the
owner's to name.
README.mdgains a badge slot and a hero slot with their rules written in.The badge slot holds one badge, the CI result, which is GitHub rendering
GitHub's own run. A star, download or install count never lands there:
telltale measures none of them.
Gates
go vet ./...clean.go test ./... -timeout 20mgreen, all 35 packages,exit 0 (
internal/council368.8s). No Go file changed.