gh-glance 0.15.0 → 0.15.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. package/CHANGELOG.md +49 -1
  2. package/README.md +33 -1
  3. package/index.mjs +1120 -417
  4. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -5,6 +5,52 @@ All notable changes to this project are documented here.
5
5
  The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [Unreleased]
9
+
10
+ ## [0.15.2] - 2026-09-24
11
+
12
+ ### Fixed
13
+
14
+ - Recover aged incomplete acquisition locks through the same fenced owner
15
+ protocol as the quota governor, so one abandoned lock cannot stop every pane.
16
+ - Bound live acquisition claims, fence late owners, and resume the current
17
+ generation after owner loss without publishing stale rows or advancing false
18
+ freshness.
19
+ - Keep core-backed tabs progressing during a GraphQL observer failure and
20
+ retry held queries and pending intents automatically after recovery.
21
+ - Report acquisition metadata and lock health separately in read-only doctor
22
+ output. Keep the visible acquisition cause across unrelated budget updates,
23
+ show source ages beyond 100 hours, and remove duplicate stale wording. Keep
24
+ incomplete Security observations marked Limited while a retry is scheduled.
25
+ - Flush Linux PTY captures and run governor tests separately from the other
26
+ terminal tests to address CI timing failures.
27
+
28
+ ### Changed
29
+
30
+ - Pin the Sutura CI workflow to v0.3.3 and declare its Node runtime.
31
+
32
+ ## [0.15.1] - 2026-09-17
33
+
34
+ ### Fixed
35
+
36
+ - **A failed write no longer wedges every pane on the machine.** The shared
37
+ coordination lock is created with `open("wx")` and its owner record written
38
+ afterwards. When that write failed -- a full disk is the usual cause -- the
39
+ empty lock file stayed behind with no owner to test, so every pane, on every
40
+ request, reported "Coordinating with your other panes" until the file was
41
+ deleted by hand. A failed release (the rename can fail on a full APFS volume)
42
+ left a complete record naming a live owner that then waited on itself. Lock
43
+ creation now removes exactly what it created on any failure, a release that
44
+ cannot rename falls back to unlinking its own record, an acquirer that meets
45
+ its own record releases it, and an unreadable lock or recovery marker that has
46
+ gone untouched for ten seconds is quarantined through the same double-checked
47
+ protocol dead-owner locks already use -- which also clears the files 0.15.0
48
+ panes have already left behind.
49
+ - **`--doctor --probe` names why the governor is unavailable.** The API
50
+ governor line read `unavailable` for a lock nobody released and for a state
51
+ file that failed validation alike, and those are fixed in different places.
52
+ It now reads `unavailable (busy)`, `unavailable (corrupt)`, and so on.
53
+
8
54
  ## [0.15.0] - 2026-09-15
9
55
 
10
56
  ### Added
@@ -1120,7 +1166,9 @@ engineering, security, QA and UX. What follows is what changed as a result.
1120
1166
  - The `main` field from `package.json`. It advertised the file as importable,
1121
1167
  but importing it took over the terminal or exited the host process.
1122
1168
 
1123
- [Unreleased]: https://github.com/juan294/gh-glance/compare/v0.15.0...HEAD
1169
+ [Unreleased]: https://github.com/juan294/gh-glance/compare/v0.15.2...HEAD
1170
+ [0.15.2]: https://github.com/juan294/gh-glance/compare/v0.15.1...v0.15.2
1171
+ [0.15.1]: https://github.com/juan294/gh-glance/compare/v0.15.0...v0.15.1
1124
1172
  [0.15.0]: https://github.com/juan294/gh-glance/compare/v0.14.1...v0.15.0
1125
1173
  [0.14.1]: https://github.com/juan294/gh-glance/compare/v0.14.0...v0.14.1
1126
1174
  [0.14.0]: https://github.com/juan294/gh-glance/compare/v0.13.3...v0.14.0
package/README.md CHANGED
@@ -718,7 +718,9 @@ cached subscription is a cache hit, not a coalesced request. Active queries are
718
718
  queries with a live subscriber. Retained queries remain listed as `cache-only`
719
719
  without inflating that count. Holds distinguish observer failure, primary and
720
720
  secondary limits, disconnected acquisition, shared producer waits, and local
721
- coordination.
721
+ coordination. Doctor checks acquisition metadata, referenced snapshot artifacts,
722
+ and the lock path separately. A readable metadata file does not make an aged
723
+ orphan lock or invalid snapshot healthy; plain doctor never repairs either.
722
724
 
723
725
  Use `gh-glance --doctor --probe` when live capability evidence is needed. Probe
724
726
  mode uses an ephemeral governor lease and admits every quota-consuming endpoint
@@ -881,6 +883,33 @@ when the candidate and baseline used a compatible workload, machine, platform,
881
883
  and runtime. Missing or incompatible baseline values stay labelled as such;
882
884
  fixture performance is not presented as live GitHub performance.
883
885
 
886
+ ### Live freshness monitor
887
+
888
+ The repository includes a read-only monitor for a declared set of live panes.
889
+ Create its manifest independently of the acquisition store, after each pane has
890
+ installed its subscription. Each entry fixes the pane ID, process ID, expected
891
+ repository and tab, start time in Unix milliseconds, and effective cadence:
892
+
893
+ ```json
894
+ {"schema":1,"panes":[{"id":"my-pane","pid":12345,"repository":"owner/repo","tab":"actions","startedAt":1800000000000,"cadenceMs":5000}]}
895
+ ```
896
+
897
+ Use the same private config root as the panes and write a new report path:
898
+
899
+ ```sh
900
+ node scripts/freshness-monitor.mjs --manifest panes.json \
901
+ --store "$XDG_CONFIG_HOME/gh-glance/coordination-v2/acquisition.json" \
902
+ --report freshness.jsonl --interval-ms 5000 --duration-ms 86400000
903
+ ```
904
+
905
+ The JSONL contains hashed pane/target labels, validated source-success times,
906
+ maximum eligible gaps, overdue time, lock status, and declared hold intervals.
907
+ Missing or expired subscriptions and corrupt stores fail the run, even when no
908
+ subscriber remains in the store. To close an expectation after an intentional
909
+ pane exit, add its `exitedAt` timestamp to the manifest. Only a `holds` interval
910
+ declared in that pane entry and confirmed by the runtime excludes time from
911
+ the cadence check. No GitHub request is made by the monitor.
912
+
884
913
  ## Limitations
885
914
 
886
915
  - **Security tab**: code scanning and secret scanning alerts require [GitHub
@@ -983,6 +1012,9 @@ GH_GLANCE_ICONS=ascii gh-glance
983
1012
  | `Shared` | This pane is using a generation acquired for matching local subscribers. This is coalescing, not quota scarcity. |
984
1013
  | `Paused` with a reset time | The active tab's REST or GraphQL resource is at its reserve, exhausted, or under a shared rate-limit block. Wait for the stated reset/probe. Other tabs can continue when they use the healthy resource. |
985
1014
  | `Paused` without a reset time | Budget or coordinator evidence is unknown, corrupt, locked, or unwritable. No data call is started. Run `gh-glance --doctor`; also check the config directory permissions and whether another live process owns its private lock. |
1015
+ | `--doctor` reports an acquisition lock as `orphaned` | A dead owner or an aged incomplete lock record was found. A running pane retries recovery through the private lock protocol; plain doctor only inspects it. If the state does not change, inspect the reported lock age and the config directory permissions. |
1016
+ | `--doctor` reports an acquisition lock as `busy` | A live or unconfirmed owner, or a recent incomplete lock record, is present. Keep the other pane running and check again after the reported age advances; plain doctor does not steal a lock. |
1017
+ | Rows stay old while the footer shows a coordination reason | The rows remain last-known-good data. The reason persists until a valid shared snapshot or completed cleanup clears that acquisition failure; a healthy rate-budget probe alone does not prove that acquisition succeeded. The footer shows the source age and the notice line gives the longer reason. |
986
1018
  | A failing tab seems to have stopped retrying | Recognized endpoint failures back off rather than re-spawning `gh` at the floor. Press `r` to request a higher-priority retry, or `R` to also clear the endpoint backoff; either way the retry waits for a safe grant, so the tab remains Watching or Paused. |
987
1019
  | `unknown argument: -v` | `-v` used to mean `--version` and no longer does, because this CLI also has `--verbose`. Use `--version` or `--verbose` explicitly. |
988
1020
  | Cached rows plus `Paused`, `Stale`, or `Disconnected` | The rows are last-known-good data while the live source is blocked, overdue, or unavailable. A cache read never advances source success. The footer never calls stale or disconnected rows `Watching`. |