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.
- package/CHANGELOG.md +159 -3
- package/README.md +611 -402
- package/package.json +8 -3
- package/src/cli/index.js +14 -0
- package/src/v2/adapters/android-driver.js +1705 -0
- package/src/v2/adapters/android.js +1117 -0
- package/src/v2/adapters/contract.js +643 -0
- package/src/v2/adapters/electron.js +1594 -0
- package/src/v2/adapters/http.js +734 -0
- package/src/v2/adapters/ios-driver.js +1551 -0
- package/src/v2/adapters/ios.js +989 -0
- package/src/v2/adapters/isolate.js +739 -0
- package/src/v2/adapters/process.js +931 -0
- package/src/v2/adapters/source.js +1292 -0
- package/src/v2/adapters/web-driver.js +1532 -0
- package/src/v2/adapters/web.js +1009 -0
- package/src/v2/adapters/windows.js +1329 -0
- package/src/v2/browsers.js +1203 -0
- package/src/v2/cause.js +371 -0
- package/src/v2/check.js +1429 -0
- package/src/v2/ci.js +1209 -0
- package/src/v2/cli.js +670 -0
- package/src/v2/cluster.js +372 -0
- package/src/v2/coverage.js +1124 -0
- package/src/v2/detect.js +1199 -0
- package/src/v2/doctor.js +1702 -0
- package/src/v2/escalate.js +679 -0
- package/src/v2/init.js +1394 -0
- package/src/v2/intent.js +659 -0
- package/src/v2/journeys/from-routes.js +500 -0
- package/src/v2/journeys/from-suite.js +988 -0
- package/src/v2/journeys/index.js +651 -0
- package/src/v2/journeys/record.js +516 -0
- package/src/v2/mcp/server.js +374 -0
- package/src/v2/mcp/tools.js +1571 -0
- package/src/v2/normalise.js +783 -0
- package/src/v2/observation.js +938 -0
- package/src/v2/rank.js +672 -0
- package/src/v2/reference.js +1051 -0
- package/src/v2/remote.js +910 -0
- package/src/v2/run.js +1080 -0
- package/src/v2/sealed.js +568 -0
- package/src/v2/selfcheck.js +729 -0
- package/src/v2/ship.js +684 -0
- package/src/v2/store.js +703 -0
- package/src/v2/types.js +509 -0
- package/src/v2/waiver.js +511 -0
- 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
|
-
## [
|
|
7
|
+
## [0.6.0] — 2026-08-30
|
|
8
8
|
|
|
9
|
-
|
|
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
|
-
[
|
|
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
|