## AndrewDryga/emisar — v0.36.0…v0.37.0

_482+ commits._

### Features
- **Add bind-mount ownership to the surfaces a workstation misjudges** (8de826c)
- **Add the no_new_privs tests left out of their own commit** (e1fab3e)
- **Reconnect every discovered peer each poll, not just the new ones** (36cd679)
- **Correct three public claims the code does not support** (80ac4ec)

### Fixes
- **Fix Linux signed-dispatch runner fixture** (7ddf2f2)
- **Name an empty pack selection where the operator can fix it** (a3ab139)
- **Fix multi-arch runner release smoke** (b65eddb)
- **Fix six installer paths an ordinary operator reaches** (86a231b)
- **Fix the three pack defects the behavior matrix exposed** (6a67580)
- **Rule out standing spend as the fix for occasional scarcity** (46c18c8)

### Backend
- **Judge a no_action case on what the client did, not on our search recall** (ceea9e7)
- **Hand the demo runners a config the host uid cannot invalidate** (0a2484c)
- **Say what an operator must change when a setgid helper stops elevating** (c67ee6f)
- **Drive only the two clients a release is actually certified against** (a1f93d3)
- **Give postfix.mailq an identity that can actually read the queue** (979c9c8)
- **release: v0.37.0 — Self-rotating runner credentials and a harder execution boundary** (4f46022)
- **Drop the runner-action changeset transition nothing writes** (9e61c11)
- **Compare a stored descriptor digest, not every jsonb column of the catalog** (2b8d5cc)
- **Name a crashed proxy in the PITR drill instead of blaming IAM revocation** (d7b1146)
- **Count only unexpired keys as connected agents, matching the Agents page** (7d14269)
- **Rank an unknown plan above the self-serve tiers, not below Free** (9ae5d48)
- **Decide a timestamp's year suffix by the calendar year, not by elapsed days** (3c08496)
- **Flush a heartbeat timeout the timer already delivered, not just cancel it** (6c926a3)
- **Hold a nested audit broadcast until the outer transaction actually commits** (0f1f743)
- **Fall back to a group's external id when its display is blank, not just null** (131a6bb)
- **Reject a null byte in a client registration instead of 500ing on the insert** (d39b5ed)
- **Mask a run's sensitive values in one pass, so one cannot rewrite the marker** (a5cec41)
- **Ship a run's backlogged output in one frame, not one per line** (828a929)
- **Make CI prove the installers verified, not merely that they ran** (d16ffb2)
- **Renew the runner lease at half its life, not on every heartbeat** (bba1caf)
- **Prune runbook executions like every other history table** (6a0c441)
- **Give the keyset pages their index and stop counting packs by loading them** (2fb3722)
- **Set no_new_privs on action children** (132e88b)
- **Let the airflow run finish before the case deletes it** (6527457)
- **Verify release provenance where a verifier exists, and pin where it cannot** (80db127)
- **Stop holding shared pack rows through a runner's action sync** (225517f)
- **Resolve one MCP action from its own pack, not the whole catalog** (3cc493f)
- **Record why the Terraform IAP policy role is project-scoped** (453385b)
- **Say how to gate fs-search's content reads, and what the runner refuses outright** (cdc8347)
- **Pin the credential directory to a descriptor and drop the signing key from env** (a66e4ce)
- **Collapse the runner tally and match deployments as tuples** (6a5aebb)
- **Store secret-shaped pack fixtures under names an agent box won't shadow** (c38cfc3)
- **Keep the GitHub API off http redirects and packctl off the branch tip** (0f6f34e)
- **Mount the Livebook data disk noexec and destroy-guard the operator DB user** (6d7e62a)
- **Stop three low-risk reads from returning credentials unreviewed** (817087f)
- **Stop re-scanning the whole redaction window for every output line** (13a29a5)
- **Stop the console paying for every page twice** (ab8fa94)
- **Refuse action path args that name the runner's own state** (c09474c)
- **Batch the MCP tool render and settle queries, throttle key usage writes** (4c8796d)
- **Index the recovery-sweep predicates and sweep event retention daily** (eb1aea9)
- **Cut MCP bridge per-request overhead** (2aa6de8)
- **Say that a runner token rotates itself** (1435f56)
- **Give every pre-rotation runner token an expiry** (6621028)
- **Refuse a runner token once its expiry has passed** (40b3d60)
- **Stop a redirect off an unpublished runbook crashing the view** (21503f9)
- **Stop the sandbox queue heuristic failing races it was never meant to judge** (1d37621)
- **Take postgrex 0.22.4 for the :comment injection advisory** (36a370c)
- **Pin the one target line the three runbook surfaces share** (06f3599)
- **Move a step's id up beside the action it runs** (8d3d912)
- **Say which runbook version actually runs alongside the one being read** (7acb011)
- **Stop two portal test runs from colliding on one database** (cadce19)
- **Name the mechanism behind the intermittent Postgrex disconnect** (4e98127)
- **Drop the CoreComponents alias the audience split left behind** (33b1aaa)
- **Split sso.ex without inventing a context boundary** (a396b64)
- **Say in words how far a runbook step reaches** (4d01567)
- **Measure the SSO context split, and record why it is not happening** (fb35a9f)
- **Re-timestamp two migrations that aborted every fresh database** (cb0c91c)
- **Split core_components by the audience each part serves** (7f0f730)
- **Say the same thing when a membership change is refused** (3f1b57b)
- **Prove the approval gates actually refuse** (18c2a78)
- **Give the capture rigs one TOTP, and its first test** (9a2a3fa)
- **Land the halves three earlier commits described but omitted** (c7bb830)
- **Make the two hostile-JSON validators agree on a corpus** (2ad93df)
- **Sell the audit export /pricing forgot to mention** (f44ef66)
- **Declare why 78 risky actions have no behavior case** (ab1dcd0)
- **Stop a context borrowing another's test coverage** (eb1637b)
- **Index the cascade keys, drop the indexes they duplicate** (ede46f9)
- **Pin what each role is actually allowed to do** (fd947b5)
- **Keep one symlink-containment walk in the runner** (6e0884c)
- **Give the frozen digests and the email rule one definition each** (0cd40ac)
- **Drop two enum values, dead CSS, and orphaned screenshots** (3061660)
- **Delete portal helpers and a preload surface nothing reaches** (91d2a2b)
- **Spell a runbook target's group the way it was named** (40285ee)
- **Delete config and flags nothing reads** (09b61ae)
- **Make the agent manuals describe the agents we actually run** (70b247e)
- **Unpin Bandit so its security releases can land** (e5ecee3)
- **Confine every pack's curl to a protocol, and turn off globbing** (3db804d)
- **Teach the MCP contract that runbook targets can be groups** (f72f218)
- **Keep the Grafana credential off the process table** (c515771)
- **Stop accepting --json and a work_dir that do nothing** (9bb8e97)
- **Make the Entra capture rigs runnable by someone else** (149ee8d)
- **Put every required check inside its canonical gate** (62fdfbf)
- **Select the jobs a change can actually break** (ca11654)
- **Remove unsupported long-window backup alert** (9f3c54e)
- **Preserve signed-dispatch failure logs** (f1ffa95)
- **Narrow the signed-dispatch runbook runner** (dc6ce92)
- **Cut runner v0.17.1 after Actions outage** (a933758)
- **Size the picker's validation error to the picker** (3ea3528)
- **Give the dev server a lifetime of its own** (e039bf8)
- **Say what a member's keys inherit in the operator's words** (3b0fb29)
- **Read a plan step's mark at the size of its row title** (06a8711)
- **Name the two grant decisions, and stop promising only runners** (efbe335)
- **Shrink the plan-step marker to a position mark** (10cf8d2)
- **Give each access dimension its own labelled row** (858ad85)
- **Give an open step the whole row instead of a box inside the rail** (aca615c)
- **Show a step's target scope with the picker's own dots** (c15555a)
- **Say each access dimension once in the roster row** (ae5b2ce)
- **Say what each extractor and comparison actually does** (27cafd6)
- **Grant packs, not just runners** (3afff9f)
- **Name a stage and an open step, don't just number them** (2494c0b)
- **Lead a step with its own name, and read its values as prose** (8eabafe)
- **Drop the arrow from a collapsed step's target line** (726c0eb)
- **Say what a step targets, and let its values share one voice** (af2bb57)
- **Put every step fact beside its own name** (bee5527)
- **Cut recurring Portal refresh queries** (800b04f)
- **Read a collapsed step in the run surface's plan-row grammar** (237caa6)
- **Summarize an authored runbook step instead of unrolling its form** (3ef8c91)
- **Shoot the fleet screenshot against a fleet that is actually running** (eda4f02)
- **Upgrade admin runners and reconcile every installed pack** (f42e88c)
- **Make the runner rollback check reach rollback again** (a1135af)
- **Put the installers back above assets.deploy, where the build needs them** (b53f3bf)
- **Make the backup alarm watch a method Cloud SQL actually emits** (28e436a)
- **Stop the fleet caption promising what its screenshot cannot show** (1edb07a)
- **Deduplicate shared LiveView mount work** (52be10f)
- **Reserve the right box for every docs screenshot** (c7a84e5)
- **Say the action exists when only its runner is missing** (7baa1a0)
- **Stop the docs lightbox loading every screenshot at first paint** (e097035)
- **Stop four checks reporting work they never did** (9e902f6)
- **Close eight infrastructure gaps a fresh apply or a leak would find** (2d82038)
- **Point the agent-nudge tests at a string the app emits** (800cb35)
- **Cover four gates that no test could have caught losing** (cf06bce)
- **Bound the runbook version to what an int4 column holds** (eb968e2)
- **Refuse a device grant approved by a suspended member** (0cc7b0c)
- **Count runner-supplied result fields in codepoints** (226145d)
- **Fail open when a plan slug is unrecognized** (fc47175)
- **Stop a long approval note losing the decision and its audit row** (629f317)
- **Stop two diagnostics reporting success when they cannot look** (c2eb472)
- **Bound the credential lock on the platforms we ship** (96498d2)
- **Keep a reformatted response from killing the bridge** (d77ed5f)
- **Freeze every documented flag, not a list that drifts** (4547010)
- **Keep audit verify --all reaching the active log** (cfe1eaa)
- **Back off when the runner state is too large to advertise** (484f3de)
- **Let the systemd restart cap actually fire** (4632417)
- **Verify the narrative the bridge actually signs** (d697f0d)
- **Give the pack behavior harness a config the runner will accept** (6c49d1c)
- **Let a rollout repair in a zone that has run dry** (e296b51)

### Docs
- **docs: correct signing e2e service description in dev README (#33)** (bb8cb4e)
- **docs: correct --hostile PID limit from 512 to 4096 (#30)** (ff46693)
- **docs: require pack behavior cases alongside the pack gate (#31)** (8a85716)
- **docs: add pack scope to MCP spec and operator troubleshooting (#32)** (8340094)

_Recap by [Repo Wrapped](https://repowrapped.com/gh/AndrewDryga/emisar?utm_source=github-action)._