chore(deps): update dependency sheeki03/tirith to v0.4.1 - #7013
chore(deps): update dependency sheeki03/tirith to v0.4.1#7013renovate-fullsend[bot] wants to merge 1 commit into
Conversation
|
🤖 Finished Review · ✅ Success · Started 3:26 PM UTC · Completed 3:36 PM UTC Commit: Runtime: claude · Model: opus → claude-opus-4-6 · Effort: high · Cost: $1.64 |
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
ReviewFindingsHigh
Next steps:
Previous runReviewFindingsHigh
Next steps:
Previous run (2)ReviewFindingsHigh
Next steps:
Previous run (3)ReviewFindingsHigh
Next steps:
|
add9fd4 to
fb0898c
Compare
|
🤖 Finished Review · ✅ Success · Started 3:28 AM UTC · Completed 3:41 AM UTC Commit: Runtime: claude · Model: opus → claude-opus-4-6 · Effort: high · Cost: $2.30 |
|
Risk Assessment: moderate (2/5) DetailsBot-authored single-file Containerfile patch bump (sheeki03/tirith v0.4.0→v0.4.1) yields a near-minimal Tier 1 sub-score of 1.25, and while Tier 2 remains elevated (3.43) due to high 30d churn (36 commits), 7 authors in 90d, and 9 fix-pattern commits, the weighted composite (0.62×1.25 + 0.38×3.43 ≈ 2.08) rounds to 2; Tier 1 signals are unchanged from the prior assessment, anchoring confirms the prior score of 2 (moderate) is appropriate. Previous runRisk Assessment: moderate (2/5) DetailsBot-authored single-file patch bump (sheeki03/tirith v0.4.0→v0.4.1) keeps Tier 1 nearly all minimal; Tier 2 signals have intensified since the prior review (churn 38/30d, fix/revert commits 22/90d, 7 authors) but the composite still rounds to moderate at 2, unchanged from the prior assessment. Previous run (2)Risk Assessment: moderate (2/5) DetailsTiny bot-authored dependency bump (sheeki03/tirith v0.4.0 → v0.4.1) in a single Containerfile — metadata signals are almost all minimal. Elevated Tier 2 driven by the Containerfile being a high-churn hotspot (30 commits/30d, 6 authors/90d, 8 fix commits/90d). Composite lands at moderate: the change is trivial but the file's recent volatility warrants a careful look. |
fb0898c to
7a8c2d8
Compare
|
🤖 Finished Review · ✅ Success · Started 3:28 AM UTC · Completed 3:40 AM UTC Commit: Runtime: claude · Model: opus → claude-opus-4-6 · Effort: high · Cost: $2.66 |
7a8c2d8 to
2338d0b
Compare
|
🤖 Finished Review · ✅ Success · Started 3:22 PM UTC · Completed 3:35 PM UTC Commit: Runtime: claude · Model: opus → claude-opus-4-6 · Effort: high · Cost: $2.69 |
This PR contains the following updates:
0.4.0→0.4.1Release Notes
sheeki03/tirith (sheeki03/tirith)
v0.4.1Compare Source
Added
.github/threatdb-source-pins.jsonis now the manifest every build resolves the reviewed OpenSSF, DataDog, andecosyste-msrevisions from.fetch-threatdb-sources.shreads them throughthreatdb_source_pins.py resolveand refuses to start when the manifest does not validate: exact source set, reviewed upstream repository per source, lowercase 40-hex commit, RFC3339 UTC timestamps, a commit that does not postdate its own selection, and amax_lag_hoursinside 1 to 8760. A scheduled workflow (.github/workflows/threatdb-source-pins.yml, 02:37 UTC daily,mainonly) discovers each upstream's candidate, requires GitHub's comparison to report it strictly ahead of the current pin, rewrites the manifest, and then proves the candidate before asking anyone to look: it re-runs the pin unit tests and the fail-closed fetch fixture suite, performs a real source fetch, and compiles the exact snapshots with a public deterministic test key. OpenSSF only ever pins a completedAssign IDscommit, paginating up to 10 pages of 100, so a mid-ingestion tree is never selected. The output is a pull request onautomation/threatdb-source-pinswhose body carries the compare links, changed path prefixes, file-status counts, whether GitHub truncated the file list, and each source's lag against itsmax_lag_hours. The security boundary is deliberate: discovery runs on the read-onlygithub.tokenunderpermissions: contents: read, the workflow holds no ThreatDB signing key and publishes no database, it pushes only to its own automation branch, and the report says not to auto-merge. Operator action after upgrading this repository: pushing that branch and opening the pull request need a separately scopedTHREATDB_PIN_PR_TOKENrepository secret (contents plus pull requests, this repository only). Until it is set, the watcher fails at the token check the first time a pin actually changes.allowlistandallowlist_rulesmatch only URLs extracted from the input that appear in a finding's evidence. They never match raw command text, and a finding with no URL evidence cannot be suppressed at all, so a command-shaped entry such aslaunchctl listis inert. The README now spells out the grammar, which is the same onetirith trustuses, and points attirith policy effectiveandtirith policy test '<command>'for checking what a policy actually resolves to.Changed
bind -xon Enter runs the bound function but does not then accept the line on stock bash, so enter mode stashed the typed command and dropped it. The capability self-test correctly reported that, which is why every 0.4.0 bash user fell back to warn-only preexec and got no blocking without settingTIRITH_BASH_PREEXEC_ENFORCE=1(issues #111, #224). Enter is now bound to a readline macro that runs the checker throughbind -xand then a guarded accept-line: the accept sub-sequence stays bound to a no-op until_tirith_enterarms it, and_tirith_prompt_hookre-disarms it at every prompt, so typing or injecting the accept bytes cannot accept a line the checker never approved.operate-and-get-next(Ctrl-O) accepts a line without running the checker, so it is unbound while enter mode owns delivery, and the exact prior Ctrl-O binding is captured per keymap and restored on degrade. Bindings and the startup health gate coveremacs-standard,vi-insert, andvi-command, so a laterset -o vicannot expose an unguarded Enter. Every failure to arm or disarm rolls back: the pending command and its receipt are dropped, the receipt is discarded, the command goes back into the readline buffer, and the shell degrades to preexec. Verified over a real PTY with the real binary on GNU bash 5.2 and 5.3. The 0.4.0 gate is unchanged: enter mode is selected only when thetirith setuportirith doctorself-test has proven delivery for that exact bash version, path, and fingerprint, and an SSH session, a persisted safe-mode flag, or a forcedTIRITH_BASH_MODE=preexecstill selects preexec.source-provenance.jsongainscommit_timestampandpin_selected_at. The fetch reads the commit time out of the checkout itself and aborts when a manifest-pinned tree disagrees with the manifest, andtirith-threatdb-compileverifies the pair independently rather than trusting the document: both fields must be present together or both absent, both must be RFC3339 UTC, the commit must not postdate its own selection, andverify_git_checkoutre-runsgit show -s --format=%cI HEADagainst the staged tree and refuses a mismatch. Provenance written before this release carries neither field and still validates, so older signed generations keep verifying.threatdb.ymlno longer keeps a second copy of the pins:THREATDB_OSSF_MP_REF,THREATDB_DD_MP_REF, andTHREATDB_TYPOSQUAT_REFare gone from its environment block. The overrides still exist for pre-review shadow builds, but an overridden ref now requires a matchingTHREATDB_*_PIN_SELECTED_ATor the fetch refuses to run.TIRITH_BASH_REQUIRE_ENTERis labelled reserved.tirith doctordisplayed it alongside the knobs that do something, but no hook reads it: it appears only in doctor's own display and its captured-environment list. Doctor now printson (reserved; not enforced by this version), anddocs/troubleshooting.mdsays the same, so nobody plans around an enforcement that does not exist yet.Fixed
std::env::current_exereturns the launch path unresolved there, so registering or validating the shell receipt capability through Homebrew's/opt/homebrew/bin/tirithor an npm wrapper hit theO_NOFOLLOWidentity open on the symlink itself, failed withELOOP, and the shell fell back to legacy mode with no execution receipts. The launch path is canonicalized first. TheO_NOFOLLOWopen, the owner and group/other-writable checks, and thesymlink_metadatadevice/inode recheck all still run against the resolved path, so a symlink swapped in after canonicalization still fails closed. Reported in issue #221.WINCHtrap earlier in the rc is the usual trigger) the substitution runs behind an intermediate fork, so registration was rejected,TIRITH_STATUSwent todegraded, and the session ran with no execution receipts. zsh now registers with a plain foreground command redirected into temp files, the way the bash hook already did, so tirith is a direct child of the main shell in every condition. The fish hook gets the same shape for consistency, not because it had the zsh failure. All three hooks also stop discarding the register stderr: the first line of the rejection is kept in_TIRITH_RECEIPT_REGISTER_ERRORand printed under the legacy-mode warning, so a downgrade says why. Reported in issue #221.noclobberbroke the hooks' private capture files. A redirect into a filemktemphas already created fails undernoclobber, and bash used a plain>everywhere. The bash redirects are now forced with>|across receipt registration, the preexec check, the DEBUG-trap bootstrap command, and the enter-mode check and paste paths; zsh gains the same on its registration redirect, its accept-line and paste widgets having already carriedsetopt localoptions clobber. A rejected zsh registration is also kept inside an explicit condition soERR_EXITcannot kill hook initialization before the rejection is recorded and the honest fallback runs, and both branches clean up their temp files.export TIRITH_BASH_PREEXEC_ENFORCE=1before thetirith initline.tirith doctorprints the same remedy whenever it still applies, and adds that a forcedTIRITH_BASH_MODE=enterhas to go, because preexec enforcement only arms in a shell that starts in preexec mode. When enforcement is already armed and the shell is blocking, doctor prints neither line.tirith receiptclaimed to manage execution receipts. It fronts the download receiptstirith runwrites, and the wrong noun sent the reporter of issue #221 hunting for shell execution receipts in a store this command has never touched. The command help now reads "Manage download receipts recorded bytirith run", the after-help says shell execution receipts are a separate store with no CLI viewer, the empty-store message names the directorytirith runactually writes to, anddocs/compatibility.mdmatches.warn_repo_policy_neutralizedkeyed onpolicy.scope == Repo, but since the baseline plus overlay merge the merged policy carries the trusted baseline's scope, so a repo overlay whose weakening fields were dropped produced no warning at all for an operator with a user or org policy in place. It now keys on the recorded drop set, which only repo sanitization populates, so it still cannot fire for a purely trusted policy.tirith policy effectivealready listed the full drop set and is unchanged._tirith_ensure_prompt_hookaborted instead of degrading whenPROMPT_COMMANDwas readonly. The reattach path assigned toPROMPT_COMMANDwithout checking its attributes first, and assigning to a readonly variable is a fatal error in bash: the function died before it could return non-zero, so the runtime self-heal never reported a failure and the session never degraded. It now refuses unsafe attributes up front, the same_tirith_prompt_command_attrs_safecheck the preexec guard install already used, and confirms the reattachment actually took effect before returning success. Latent before this release; the enter-mode work exposed it.1ea2762dto54642f7eand the DataDog revision fromef4a781dto2d098390; theecosyste-mstyposquat pin is unchanged. That OpenSSF tree is roughly 200k sparse-materialized advisory files, soTHREATDB_FETCH_TIMEOUT_SECONDSnow defaults to 300 instead of 180; the 600sTHREATDB_TRANSACTION_TIMEOUT_SECONDSend-to-end deadline and the separate 420s registry-snapshot budget are unchanged. Content hashing no longer forkssha256sumandcutonce per file, close to half a million subprocesses on the current tree:.github/scripts/hash-threatdb-tree.pyruns once under the samerun_boundeddeadline and folds the identical path-NUL/digest-NUL byte stream into one digest, so publishedcontent_sha256values are byte-for-byte what the old loop produced, and a fixture test recomputes the digest with the old shell oracle and fails on any difference. The hasher useslstatandos.walk(followlinks=False), keepingfind -type fsemantics: symlinks are neither followed nor hashed, and the OpenSSF fixture now plants one to prove it.tirith updateon a Hermes-managed install no longer refuses with package-manager advice. A Tirith release cached at$HERMES_HOME/bin/tirithmatched no branch ofdetect_install_method, so it classified asUnknown, and on a Debian or RPM hostrefine_system_pmturned that intoaptordnf.updatethen exited 0 having changed nothing, telling the user todpkg -iorrpm -Ua package they never installed, and--rollbackrefused outright. Such an install is now treated as self-replaceable and runs the existing path unchanged: signed download, mandatory cosign verification (checksum-only only with--allow-unsigned), atomic swap keeping thetirith.tirith-previoussidecar, and--rollback. Recognition is proof-based and Unix-only, and only a binary whose path resolved cleanly and classified asUnknownis even a candidate. The root (HERMES_HOME, else~/.hermeswhen that variable is unset; an emptyHERMES_HOMEdisables the path entirely) must be absolute and lexically normal, so a relative path, a..component, or an alias spelling such as/safe/./rootis refused, and it must not be a system or package-manager root (/usr,/usr/local,/opt/homebrew,/nix/store, a Cellar, and the rest of the deny list). The layout must be exactly<root>/bin/tirithor<root>/profiles/<profile>/bin/tirith. The root, every traversed directory, and the binary must be owned by the current effective uid, must not be symlinks, must carry no group or world write bit, and must carry no POSIX ACL entry granting write to another principal, checked by the newtirith_core::trusted_child::validate_unix_trusted_path_acl, which fails closed when ACLs cannot be read. The binary must canonicalize back to the running executable, and a tree carrying Cargo's install metadata (.crates.tomlor.crates2.json) is never granted self-replacement, the same signal~/.local/binalready uses. The proof is re-run immediately before the swap and again before a rollback; a boundary that changed since classification aborts with exit 1 and a message naming ownership, permissions, and path, rather than falling through to generic self-management.install_methodreportshermesintirith version --provenanceandverify-selfJSON, and a Hermes update never requests the privileged package-approval-helper effect or installs that helper. The publictirith_core::selfupdate::InstallMethodenum is deliberately untouched, so this patch release adds no variant to it:hermesis a CLI-private origin (CliInstallOrigin::Hermes) layered overSelfManagedand rendered only byinstall_method_token.threatdb-currentafterGitHub sealed the former
threatdb-latestrolling release. The signed legacychannel remains intact as a last-known-good fallback, while new manifests,
assets, pruning, and v2 rollback operations use the replacement channel.
Configuration
📅 Schedule: (UTC)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR has been generated by Mend Renovate CLI.