Repository navigation
Releases: iap/pstack-hermes
Releases · iap/pstack-hermes
Release list
pstack-hermes v0.4.4
Added
tools/check_action_inputs.py+ CI step: fails when a step passes awith:key the pinned action does not declare. The runner only warns on such a key (Unexpected input(s)) and silently ignores the value - the class behind thesyncLabels/sync-labelsdefect fixed above. Verified as a genuine gap before adding the gate: with the defect reintroduced, actionlint exits 0 and the full pytest suite passes unchanged. Resolves local actions from disk and pinned remote actions from raw.githubusercontent.com; a fetch failure is a tool error, never a pass. Unit tests inject the fetch, so they run offline; the CI step is the only networked consumer..github/dependabot.yml: weekly grouped updates for thegithub-actionsecosystem (updates both the pinned SHA and the# vNcomment) and foruv(pyproject.toml + uv.lock). The repo pins everything; with no update bot the pins silently rot, which was the largest structural gap in the workflow layer.tools/check_pins.py+ CI step: fails whenUPSTREAM_PINis missing, duplicated, malformed or out of step acrossci.yml/release.yml/publish-plugin.yml/upstream-drift-watch.yml. The lock-step rule was documented in two files and enforced by none; this makes it machine-checked and de-risks the re-pin procedure.tools/check_action_shell.py+ CI step: shellchecks every composite action'srun:blocks. actionlint does not lint.github/actions/*/action.ymlsteps (verified against 1.7.12 by injecting a deliberate shell error), so the shared bash had no static check - a class that had already produced a real bug (see Fixed).- CI also gains:
concurrency(superseded PR runs cancel; non-PR runs take a per-run group so every main push keeps its full run - tightened after the review below, see Fixed),timeout-minuteson every job, and 14-day retention on the build artifacts. .github/actions/drift-issue-upsert/: shared composite action for the idempotent issue-by-title upsert both drift watchers need; the two callers' copies had already drifted apart (different jq expressions for the same intent).
Changed
- Repository Actions policy tightened (settings, not files): allowed actions are now an allowlist - GitHub-owned actions plus
astral-sh/setup-uv@*andoven-sh/setup-bun@*- withsha_pinning_requiredstill on, and the defaultGITHUB_TOKENcan no longer create or approve pull requests. Introducing any other action now requires a deliberate settings change. CONTRIBUTING documents the policy and the "add to the allowlist first" rule; itsUPSTREAM_PINlock-step bullet is corrected from three files to four (publish-dist.ymlwas missing after the publisher rename). - Single-source installs. The package now installs from this one repository: the built tree is published to its
distbranch, which is the repository's default branch, sohermes plugins install iap/pstack-hermesworks root-level andhermes plugins update pstackupdates natively. The separate dist repo is retired; no second repository is ever published. (Amain-subdir install ofpstack/remains as a legacy pinned-style alternative.)distalso carries a scheduler stub so the weekly drift watchers keep firing despite the default-branch flip; manual recovery for dispatch-only workflows isgh workflow run <file> --ref main. - Re-pin to upstream
c47b1284(pstack v0.15.5);pstack/rebuilt. Every converter anchor was re-anchored or pruned against the new upstream text (36 dead anchors at the new pin -> 0;T8-T14+ delegation), F16 retired (upstream now ships the slug-agnostic lane check itself),reflect's 4-column reviewer table adopted with the upstreambudgetkey in the setup-written panel shape, and the two new upstream principles ported (principle-attack-the-premise,principle-test-behavior-not-implementation) - 45 -> 47 skills. Prose model defaults refreshed (grok-4.7-xhigh-fast,claude-opus-5-5-max); the shipped panel keeps its vendor-qualified verified slugs.UPSTREAM_PINbumped in all four workflows (lock-step enforced bytools/check_pins.py); details and the triage correction (noskills/orchestrateever existed) indocs/ADAPTATIONS.mdsection 4. - Docs / agent policy (Phase A, no package rebuild):
AGENTS.mdanddocs/USING.mdcodify the stock-skills write surface — Hermes self-improvement (skill_manage/ learning) targets local skills, skill taps, or a dist fork, not stock plugin skills. Stack forge freeze: Graphite (gt) default, GitHub (gh) fallback, GitLab (glab) halted. README Known limitations aligned (was incorrectly describing Graphite as optional-only).
Fixed
- Dev-tree README skill counts corrected: the skills bullet said 45 (24 + 21
principle-*) while the generated package README and.build-provenance.txtalready said 47 (24 + 23) after the v0.15.5 re-pin. Docs-only;pstack/untouched (#80). - Label sync never ran (found while auditing every
with:key against each action's declared inputs - the only such mismatch in the repo).labeler.ymlpassedsyncLabels: true, but the input id issync-labels: the runner logsUnexpected input(s) 'syncLabels'and the action falls back to its declared default (off), so stale labels were never removed onsynchronizedespite the step comment promising exactly that. Corrected tosync-labels(kebab-case; both v5 and the v7 that #69 landed declare it). Evidence: run 37394726141's log records the ignored input verbatim. .github/actions/build-packagewas outside dependabot's scan. The rootgithub-actionsentry covers.github/workflowsplus a repo-rootaction.yml, not.github/actions/*/action.yml- observed when #69's setup-uv bump updated every workflow and skipped the shared action, leaving its pin behind and on a path to silent rot, the exact failure modedependabot.ymlexists to prevent (AGENTS.md: pins are "bumped by dependabot, not by hand"). Added a directory-scoped entry (theactions/github-scriptpattern) and caught the pin up to the SHA the workflows now use.- CI concurrency, from the manual Macroscope review of PR #67:
cancel-in-progress: falsealone did not make the "main runs stay whole" claim true. By default only one run may be pending per concurrency group and a newer pending run cancels the older one, so two merges in quick succession could cancel a queued main run before it ever started and the intermediate commit would skipverify-determinism. Non-PR runs now take a per-run group (github.run_id); semantics verified against GitHub's concurrency documentation. - Drift watchers (High), from the same review: moving the issue upsert into its own composite step silently dropped its guard. The check step's no-drift
exit 0s end only that step, so the upsert still ran with$RUNNER_TEMP/drift-body.mdabsent andgh issue comment/create --body-filefailed - the workflow would fail on the common no-drift path (latent today, because upstream drift keeps the body-writing path active; it would start failing the week after a re-pin). Both watchers now emitdrift=truefrom the check step only on the path that also writes the body, and the upsert step is conditioned on it; pinned for both watchers bytools/tests/test_workflow_review_guards.py. - Drift watchers: the "not creating a possible duplicate" guard could never fire.
existing="$(gh ... || lookup_status=$?)"set the variable inside the subshell, so the parent always saw the initial 0; whengh issue listfailed, the workflow proceeded with an empty result and CREATED a duplicate tracking issue - the exact failure the guard's message claims to prevent. Reproduced in bash before fixing; shellcheck SC2030/SC2031 flagged it once the shellcheck gate existed. The upsert now lives in the shareddrift-issue-upsertaction with the status captured outside the substitution, and one jq form for both callers. - Action version pins had drifted between workflows (
actions/checkoutat v4 in the drift watchers vs v7 elsewhere;astral-sh/setup-uvv5 vs v10). Unified; dependabot keeps them current from here. - Model panel no longer written into the plugin directory (#57).
hermes plugins updatereplaces the installed package tree, so aconfig/models.jsonwritten next toplugin.jsonwas silently discarded on every update - the user's per-role model choices reverted to the shipped defaults with no warning.setup-pstacknow writespstack-models.jsonin the hermes config directory besideconfig.yaml, which survives reinstalls, and the consuming skills (why,reflect,arena,interrogate) read that path while still tolerating a legacy in-package panel so existing customizations are migrated rather than ignored. The shipped default panel stays in the package - only the user override moves. dist_checkout_check: the gate no longer substitutes its own.gitattributesfor the tree's, which made it blind to the regression it exists to catch.stage_treecopiedtools/assets/dist.gitattributesover whatever the dist tree actually held, so a published tree missing the rule - the publishercpline deleted, or the rule stale - still validated clean. A staged tree must now carry the rule and match the tested one; the sourcepstack/tree (which legitimately has none, since the publisher adds it) is still allowed. Both refusals are counterfactual-checked: dropping either guard fails a test.dist_checkout_check: the source-tree exemption is an explicit--source-treeflag instead of a directory-name guess. A staged dist checkout is legitimately namedpstack, so the name-based rule let a published tree with no attributes file at all validate clean - the same blind spot the previous entry closes, reached by another route.dist_checkout_check: git output is decoded as UTF-8 withsurrogateescapeinstead of the ambient locale codec. Under cp1252 a non-ASCII path came back mangled, stopped matching its staged key, and was skipped...
pstack-hermes v0.4.3
Added
publish-plugin.yml: CI publisher that publishes the validated built package to the plugin-only dist repoiap/pstack(build output; append-only commits so installed clones can fast-forward — history is never rewritten; skipped with a warning untilPLUGIN_DIST_TOKENis configured). The dist repo's tree root is the package, enabling the root install shorthandhermes plugins install iap/pstack --enable— no subdir — and in-placehermes plugins update pstack(root installs keep.git; verified against the hermes installer source). Requires the one-timePLUGIN_DIST_TOKENsecret (fine-grained PAT, contents: read/write on the dist repo only).- Agent-facing docs:
AGENTS.md(harness identity, generated-tree rule, hermes-vs-Cursor vocabulary, primitive mapping) and a CONTRIBUTING rewrite (orientation, Bun setup, common-task recipes, publish stage). docs/USING.md"Customizing skills": the three-route guidance (edit in place, fork the dist repo, skill tap) with the keep-hermes-vocabulary warning for end users.
Changed
- README install routes reorganized: root install via the dist repo is primary; the
iap/pstack-hermes/pstacksubdir install is documented as the legacy route (still works). Update instructions split by route (in-place update for root installs; reinstall for subdir installs).
Fixed
- Converter:
T13_MAP's frontier-provider entry was anchored on text that only exists after theT13_MAPforge-wording entry andT14_MAP's first entry run — an ordering that can never match a clean pinned clone (the local 2026-09-14 build predated the map edit and itspstack/was stale). Re-anchored the entry to the pinned paragraph, pruned the two subsumed entries (T13_MAPforge-wording line,T14_MAPfirst entry — their intent is carried by the full-paragraph provider-selection rewrite), and rebuilt from the clean pin:orchestrate.mdand the package README now carry the T15 provider-selection wording, with the anchor audit passing against a fresh clone of93b00b8. - T15b robustness (carried through the converter after a direct-to-generated-file edit was caught by the reproducibility gate): GitHub-native discovery now scopes itself to an explicit
--prspin instead of validating every PR in the repository as one stack,gh pr listpasses an explicit--limit 100so connected stacks beyond 30 PRs are not silently truncated, and auto-provider fallback is persisted intofrontier.jsonas afallbackfield (which providers were skipped) so a Graphite → GitHub fallback is coordinator-visible instead of silent. The GitLab provider remains reserved ("not implemented yet") pending a reviewedglabintegration.
pstack-hermes v0.4.2
Added
- Docs:
docs/ADAPTATIONS.md(adaptations ledger, primitive mapping, deliberately-not-ported),docs/RUNBOOK-upstream-drift.md(re-pin procedure),docs/USING.md(invocation model, first run, expectations). Review round: the upstream closure date corrected to 2026-09-10 (closed unmerged; the API attests no closer), and the panel-consumer claim now quotes the actual role-line phrases. slug_drift.py --prose: scans skill markdown for backtick-quoted model-slug defaults (including vendor/model forms) once the provider catalog loads;model-drift-watch.ymlpasses--proseand reports prose-only findings as informational (exit 0) — a catalog tool error (exit 2) skips the scan, since the panel slugs are verified against the loaded catalog first (#25/#29)- CONTRIBUTING: document the GitHub alert-callout style for docs — and where it does not apply (#30)
Changed
- Structure hygiene:
pstack/markedlinguist-generatedin.gitattributes(diffs collapse in review) and PR guidance now requiresrebuilt from pin <sha>in the body; README documents the two version lines (package0.14.8vs repov0.4.x) and corrects the transform range to T1–T13; the package README's Known limitations gains the optional-MCP-servers note (template change + rebuild); the PR template gains the matching conditionalpstack/rebuild-disclosure fields - Main README rewritten Hermes-first: first-screen unofficial-port identity (not affiliated with Cursor or Lauren Tan; Cursor users go upstream), install up front, Cursor dual-load demoted to a trailing incidental/unsupported note; layout line corrected T1–T11 to T1–T12
- Converter package-README template:
uv run --frozenregenerate command and a CLI-install section replacing the manual-copy path; T13 gains the missed orchestrate.mdcursor-team-kitanchor — rebuilt package from pinned93b00b8now carries zerocursor-team-kitreferences in shipped skills - T13 conversion pass: residual Cursor-vendor coupling reworded across the package —
cursor-team-kitreferences (a deslop pass,control-ui/control-cli), the cloud-agent fleet wording, and Graphite (gt) phrasing;T13_MAPwired into the conversion flow and the anchor audit (115/115) - PR template: replace the unrunnable
python3 convert.pycheckbox with the realuv run --frozen tools/convert.py --source <pstack-clone> --out pstackinvocation (the script lives intools/and requires--source); add thetools/scanner_gate.py --package pstackline that actually enforces the banned-construct checkbox; note the gateway-restart warning in the doctor line as unrelated noise - SECURITY.md reporting triage: issues caused by this port (adaptations, exclusions, configuration, install) belong to this repository; upstream reports are reserved for genuine platform or original-project defects — including a Hermes defect that surfaces only while a plugin is installed
- Issue chooser: the port-problem link now opens the Bug report form directly (
issues/new?template=bug_report.yml) instead of the All-issues list
Fixed
- Residual doc defects: the package README no longer says it rebuilds benny as "hermes cron/loop jobs" (the template is corrected at the source, so the generated line is right by construction), and the control-surface replacement is properly capitalised. The two dead T13 maps —
T13_PRINCIPLE_MAPandT13_README_MAP, both defined but never applied or audited — are removed.
pstack-hermes v0.4.1
Changed
- T12: Cursor built-in
/loopand/goalreferences reworded to hermes-native mechanisms — gateway cron jobs as the wake/scheduler (autonomous-run, autopilot-full, autopilot-stack, babysit, bug-fix, multi-phase-plan, shipping, visual-parity) and an armedgoal.mdin the agent store replacing the goal primitive; trigger phrases de-slashed ("loop until X"); plan checker (check-plan.mjs) marker aligned to accept the new mechanism
Removed
- Executed pipeline-hardening plan doc dropped from
docs/superpowers(#23). The plan shipped in v0.4.0 and the repo's own.gitignorealready places agent session artifacts (plans/notes) outside the repo.
pstack-hermes v0.4.0
Fixed
- Delegation phrasing residuals: collapsed doubled
delegate_taskfragments in reflect (reviewers + synthesizer calls), reworded unbackticked Cursor leftovers (poteto-mode "omit Taskmodel" -> inherit-parent semantics, how "Task subagent" -> delegate subagent) - README differences contract: replaced the stale "nothing else modified" claim with the actual pass register (T8/T9/T10, Phase-2A, T11) and a pointer at
.build-provenance.txtas the authoritative record; documented thedocs/guide/exclusion; fixed off-by-one cross-reference (see 9 -> see 8) - Ban-list inconsistency: unified delegation-vocab ban list under
bans.py(single source of truth, 6 tokens) - Model-slug drift: weekly CI re-verifies configured slugs against the live OpenRouter catalog
- Panel dedup guard: rejects duplicate provider slugs inside a role array;
inherit-parentselector exempt - Empty catalog guard:
slug_drift.pyraises on empty/malformed catalog instead of reporting every slug as missing - Malformed JSON: local input failures return exit 2 (tool error) instead of crashing with exit 1 (misclassified as drift)
- Issue lookup failure: workflow fails instead of creating duplicate tracking tickets
- Workflow concurrency: overlapping runs are serialized, not cancelled
- Stale version reference: removed "hermes v0.20.5" from README template
- Stale line numbers: removed source line number references that drift across versions
- Roadmap promise: removed "expected in a future release" claim from README template
Added
tools/slug_drift.py— model-slug drift check against provider catalog.github/workflows/model-drift-watch.yml— weekly model-slug drift watch## Environmentsection in PR template (OS / Shell / Hermes version)- Update instructions in README (uninstall + reinstall workflow)
Changed
- convert.py: 4 specific-first
DELEGATION_MAPpairs +T9_MAP[19]anchor updated to the collapsed intermediate text (anchor audit 78 -> 82) - PR template: replaced hand-enumerated 2-token ban list with reference to
tools/bans.py - CONTRIBUTING.md: updated ban-list documentation to reflect 6-token set
- README.md: clarified install command (shorthand form required)
pstack v0.14.4-hermes.2
pstack v0.14.4-hermes.2 — the pstack method (Lauren Tan, MIT) ported to Hermes Agent as a self-contained agent-plugins-v1 package.
45 skills (23 workflow/mode + 21 principle-* + hermesbot): the poteto-mode router, verification playbooks, 21 engineering principles, verification-skill generation, decision trails, and a hermes-native bot control surface (webhook subscriptions, signed notifications, peer gateways) filling the excluded make-bot-ui slot.
Install
hermes plugins install iap/pstack-hermes/pstack --enable
(or hermes plugins install pstack once the index entry merges)
Verification
- install-scanner clean (package subdir; the repo root intentionally ships dev tooling)
- cross-platform byte-determinism proven in CI (ubuntu + windows)
- committed-package freshness gate, provenance pinned to upstream
799151d - pinned-ref smoke test documented on the index PR
Attribution: upstream pstack © Lauren Tan (MIT); port modifications © the pstack-hermes-port contributors.