staysfixed 0.3.1 → 0.6.0

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 (48) hide show
  1. package/CHANGELOG.md +159 -3
  2. package/README.md +611 -402
  3. package/package.json +8 -3
  4. package/src/cli/index.js +14 -0
  5. package/src/v2/adapters/android-driver.js +1705 -0
  6. package/src/v2/adapters/android.js +1117 -0
  7. package/src/v2/adapters/contract.js +643 -0
  8. package/src/v2/adapters/electron.js +1594 -0
  9. package/src/v2/adapters/http.js +734 -0
  10. package/src/v2/adapters/ios-driver.js +1551 -0
  11. package/src/v2/adapters/ios.js +989 -0
  12. package/src/v2/adapters/isolate.js +739 -0
  13. package/src/v2/adapters/process.js +931 -0
  14. package/src/v2/adapters/source.js +1292 -0
  15. package/src/v2/adapters/web-driver.js +1532 -0
  16. package/src/v2/adapters/web.js +1009 -0
  17. package/src/v2/adapters/windows.js +1329 -0
  18. package/src/v2/browsers.js +1203 -0
  19. package/src/v2/cause.js +371 -0
  20. package/src/v2/check.js +1429 -0
  21. package/src/v2/ci.js +1209 -0
  22. package/src/v2/cli.js +670 -0
  23. package/src/v2/cluster.js +372 -0
  24. package/src/v2/coverage.js +1124 -0
  25. package/src/v2/detect.js +1199 -0
  26. package/src/v2/doctor.js +1702 -0
  27. package/src/v2/escalate.js +679 -0
  28. package/src/v2/init.js +1394 -0
  29. package/src/v2/intent.js +659 -0
  30. package/src/v2/journeys/from-routes.js +500 -0
  31. package/src/v2/journeys/from-suite.js +988 -0
  32. package/src/v2/journeys/index.js +651 -0
  33. package/src/v2/journeys/record.js +516 -0
  34. package/src/v2/mcp/server.js +374 -0
  35. package/src/v2/mcp/tools.js +1571 -0
  36. package/src/v2/normalise.js +783 -0
  37. package/src/v2/observation.js +938 -0
  38. package/src/v2/rank.js +672 -0
  39. package/src/v2/reference.js +1051 -0
  40. package/src/v2/remote.js +910 -0
  41. package/src/v2/run.js +1080 -0
  42. package/src/v2/sealed.js +568 -0
  43. package/src/v2/selfcheck.js +729 -0
  44. package/src/v2/ship.js +684 -0
  45. package/src/v2/store.js +703 -0
  46. package/src/v2/types.js +509 -0
  47. package/src/v2/waiver.js +511 -0
  48. package/src/v2/watch/focus.js +215 -0
package/CHANGELOG.md CHANGED
@@ -4,9 +4,162 @@ All notable changes to this project are recorded here. The format follows
4
4
  [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and the version
5
5
  numbers follow [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
- ## [Unreleased]
7
+ ## [0.6.0] — 2026-08-30
8
8
 
9
- Nothing yet.
9
+ The second sweep for silences, done the same way as the first: read all of
10
+ `src/v2` looking for anything that can drop something and then report nothing
11
+ found. Five more were there, and two of them were in the safety machinery
12
+ itself — the gate that decides what an agent may never wave through, and the
13
+ proof that decides whether a change explains a break.
14
+
15
+ Every fix below has a test that fails against yesterday's code and passes
16
+ against today's. That was checked by putting the old behaviour back, one line at
17
+ a time, in a copy of the repository, and watching each test go red.
18
+
19
+ ### Fixed — silences, second sweep
20
+
21
+ - **Only the first 80 differences of a finding were read when deciding whether it
22
+ was one of the five things nobody may wave through.** A cluster can hold
23
+ hundreds of addresses; a refund sitting at address 150 of 300 was classified
24
+ ordinary, which means an agent could waive it and it would never reach a
25
+ person. Every difference is read now. A cap on the one gate that cannot have
26
+ one is not a performance decision, it is a hole.
27
+ - **The causal proof re-checked five addresses and then spoke for all of them.**
28
+ A finding of three hundred where the first five went away came back "caused by
29
+ that change" — a machine-checked reason for an agent to close a break it had
30
+ only half explained. It re-checks every address now, and when a change explains
31
+ part of a finding and not the rest it says exactly that, with both numbers. It
32
+ costs nothing: the journeys were already re-walked and each extra address is one
33
+ lookup.
34
+ - **A wobble big enough to swallow the comparison was still subtracted, and the
35
+ run came back clean.** If the second run of the new build falls over, or the
36
+ product writes hash-named files, or stamps a fresh id on every line, most of its
37
+ addresses are unsteady, nearly every difference is dropped before anything is
38
+ compared, and the verdict reads "nothing that already worked has changed". A
39
+ build that disagrees with itself about more than half of its own addresses now
40
+ gets **no verdict**: the summary opens with `NO ANSWER FROM THIS RUN`, the
41
+ reason is a named hole in the coverage, and `ok` is false. No number here
42
+ decides whether any difference is real — it decides only whether the run has
43
+ earned the word clean.
44
+ - **Two facts written at one address lost one of them, silently.** Every index in
45
+ the engine keeps the first observation at a path, so a second one is never
46
+ compared with anything and a door that broke behind it is invisible. The
47
+ detector for this was written on the first day of v2 and nothing ever called it.
48
+ Every walk is checked now and each clash is named — which address, and what the
49
+ ignored answer was. Identical repeats are not reported, because they hide
50
+ nothing.
51
+ - **The route reader skipped a folder it could not open, and every route behind
52
+ it, without a word.** This is the same bug as the one fixed yesterday in the
53
+ file walk, in a second function that the first fix did not touch. It names the
54
+ folder now.
55
+
56
+ ### Added
57
+
58
+ - A twelfth case in the self-check corpus, and a third kind of expectation with
59
+ it: a product so unsteady that the comparison is thrown away before it happens,
60
+ where the only honest answer is that the run says nothing. Confirmed to fail
61
+ against 0.5.0 and pass against this. Measured after the change: twelve of
62
+ twelve, three times running, with the project's own suite in parallel and the
63
+ machine's load average between 208 and 343.
64
+ - Six more tests in `test/v2/silences.test.js`, one per fix above, each confirmed
65
+ red against the previous code.
66
+
67
+ ### Changed
68
+
69
+ - `readFileRoutes(root)` returns `{ doors, problems }` rather than an array. The
70
+ problems are folders it could not open, and they are reported as missing
71
+ coverage by every caller.
72
+
73
+ ### Known, and written down rather than fixed
74
+
75
+ - What a normalisation rule rubbed out is not itemised per run. The receipt
76
+ exists in the code and nothing calls it. The rules are in your repository and
77
+ the capture is stamped with which set it used, so a comparison across a rule
78
+ change is announced — but a broad rule is still how you go blind on purpose.
79
+ - Ranking reads up to 4,000 source files of up to 400KB. Past that a finding is
80
+ still reported and still counted; it may just not sort where it deserves to.
81
+ Nothing is dropped for being far from the change.
82
+
83
+ ## [0.5.0] — 2026-08-30
84
+
85
+ The release about the one way this tool can be catastrophically wrong: reporting
86
+ nothing while something is broken. Five separate places could do that, and one of
87
+ them could do it permanently.
88
+
89
+ ### Fixed — silences
90
+
91
+ Each of these produced a clean-looking run while something was invisible.
92
+
93
+ - **A `git diff` too big to read was treated as no diff at all**, so a large
94
+ uncommitted change was fingerprinted as a clean checkout of the commit it sat
95
+ on. If that commit was the reference, the check was comparing the build against
96
+ itself, and a comparison of a build with itself can only ever come back clean.
97
+ The diff is now streamed into a hash with no ceiling, and a git command that
98
+ fails is refused loudly rather than read as "nothing has changed".
99
+ - **A folder with no git in it** gave every build the same identity, with the same
100
+ consequence, quietly and for ever. It is now refused, with a sentence saying
101
+ why.
102
+ - **The two ends of a huge output were kept with only a rough size**, so a break
103
+ in the middle that was thrown away left a byte-identical record. The exact byte
104
+ count is kept now, and a truncated value is reported as missing coverage rather
105
+ than passed over.
106
+ - **An adapter that threw while listing what it would walk had its journeys
107
+ dropped in silence** — a whole surface disappearing from a run whose verdict
108
+ then read "nothing that worked has changed". It is recorded as a hole, by name.
109
+ - **A folder the source reader could not open was skipped without a word**, taking
110
+ every door behind it. It is named now, along with any file still too big to read.
111
+ - **The normalisation-rule stamp on a stored capture was written and never read.**
112
+ Comparing a record tidied up under one set of rules against a run tidied up
113
+ under another produces differences that are about the rules; the run now says so.
114
+
115
+ ### Changed — how long something took is recorded and never compared
116
+
117
+ A stopwatch on a shared machine measures how busy the machine is at least as much
118
+ as it measures the product. Measured on the corpus's own fixture: thirty runs of
119
+ the same one-line program on an idle Mac took 48ms to 96ms, against a bucket
120
+ boundary at 100ms — four milliseconds of headroom, so any load at all crossed it.
121
+ That is what made the self-check come back "1 of 9 wrong" one busy evening and
122
+ then pass five times in a row on a quiet machine.
123
+
124
+ Durations are still measured and still shown, in the sentence beside the address,
125
+ where a person can read them. They are no longer differenced, on any platform.
126
+ **Stays Fixed will not tell you your product got slower.** A build that hangs is
127
+ still caught, because it is stopped for taking too long and how it finished is
128
+ compared exactly, and every counter that comes from the product rather than from
129
+ the clock is compared exactly as before.
130
+
131
+ ### Added
132
+
133
+ - **Two more cases in the self-check corpus**, eleven in total: a break buried in
134
+ the middle of an output too big to store, and a build ten times slower that must
135
+ stay silent. Both were confirmed to fail against the previous code and pass
136
+ against this one.
137
+ - **The corpus re-runs a case before accusing the engine.** Fail twice and it is a
138
+ real failure. Behave the second time and it is reported as *could not tell* —
139
+ not a pass, not a failure, exit code 2 — with the machine's load beside it.
140
+ Measured after the change: eleven of eleven, three times running, with the
141
+ project's own test suite in parallel and load average between 227 and 334.
142
+ - `test/v2/silences.test.js`, holding each of the above shut.
143
+
144
+ ## [0.4.0] — 2026-08-30
145
+
146
+ The difference engine, published. Seven observation channels flattened into one
147
+ address space; the new build run twice so the product's own wobble is measured
148
+ and subtracted rather than guessed at; differences clustered, ranked by distance
149
+ from the changed code, and their cause proven by reverting the suspect change and
150
+ running again. The reference is cut by saying ship, and an agent may waive within
151
+ four gates but can never decide what "working" means. Adapters for processes,
152
+ HTTP, source reading, the web, Electron, Android, iOS and Windows, and a
153
+ self-check corpus of deliberately broken builds.
154
+
155
+ ## [0.3.0] — 2026-08-29
156
+
157
+ Checks tick off live as they run, and guards show what they assert.
158
+
159
+ ## [0.2.0] — 2026-08-29
160
+
161
+ Pictures you can look at, motion, and a report that says what was checked rather
162
+ than only how long it took.
10
163
 
11
164
  ## [0.1.0] — 2026-08-29
12
165
 
@@ -57,5 +210,8 @@ not been used by many people yet.
57
210
  - No phone or tablet simulators.
58
211
  - No hosted service, no dashboard, no accounts.
59
212
 
60
- [Unreleased]: https://github.com/asadev/staysfixed/compare/v0.1.0...HEAD
213
+ [0.5.0]: https://github.com/asadev/staysfixed/compare/v0.4.0...v0.5.0
214
+ [0.4.0]: https://github.com/asadev/staysfixed/compare/v0.3.1...v0.4.0
215
+ [0.3.0]: https://github.com/asadev/staysfixed/compare/v0.2.3...v0.3.0
216
+ [0.2.0]: https://github.com/asadev/staysfixed/compare/v0.1.1...v0.2.0
61
217
  [0.1.0]: https://github.com/asadev/staysfixed/releases/tag/v0.1.0