@codyswann/lisa 4.4.21 → 4.5.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/all/copy-overwrite/scripts/lisa-gates.mjs +125 -33
- package/all/copy-overwrite/scripts/lisa-run-gates.mjs +112 -4
- package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
- package/dist/core/lisa-owned-hash-ledger.js +3 -0
- package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +4 -3
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/package.json +1 -1
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-agy/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
- package/typescript/copy-overwrite/scripts/lisa-mutation.mjs +75 -1
package/package.json
CHANGED
|
@@ -147,7 +147,7 @@
|
|
|
147
147
|
"zod-validation-error": "^4.0.0"
|
|
148
148
|
},
|
|
149
149
|
"name": "@codyswann/lisa",
|
|
150
|
-
"version": "4.
|
|
150
|
+
"version": "4.5.0",
|
|
151
151
|
"description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
|
|
152
152
|
"main": "dist/index.js",
|
|
153
153
|
"exports": {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.5.0",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.5.0",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, across Claude and Codex.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.5.0",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.5.0",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.5.0",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -104,6 +104,14 @@
|
|
|
104
104
|
* score recomputed with timeouts NOT credited — and the recomputed one is
|
|
105
105
|
* judged against `thresholds.break`. That can only ever tighten: it is applied
|
|
106
106
|
* on top of Stryker's own verdict, and nothing here can turn a red run green.
|
|
107
|
+
*
|
|
108
|
+
* Every one of those verdicts names the floor it was judged against and that
|
|
109
|
+
* floor's value — the passing ones as well as the failing ones. Two mutation
|
|
110
|
+
* floors exist and deliberately differ, so "it cleared the floor" has two
|
|
111
|
+
* answers, and a bare pass is unfalsifiable by its reader: it cannot be told
|
|
112
|
+
* from one that cleared a much lower number, or from one judged against a
|
|
113
|
+
* default nobody chose. A run against no declared floor says NO floor was
|
|
114
|
+
* applied rather than reporting one as `0`.
|
|
107
115
|
* Raising `timeoutMS` is NOT the fix and is refused as one — it converts a
|
|
108
116
|
* timeout into a slow pass and hides the identical gap.
|
|
109
117
|
*
|
|
@@ -159,6 +167,8 @@ export const OUTCOMES = Object.freeze({
|
|
|
159
167
|
timeoutUnmeasured: "mutation-gate: timeout-share-unmeasured",
|
|
160
168
|
timeoutShareExceeded: "mutation-gate: timeout-share-exceeded",
|
|
161
169
|
inflatedByTimeouts: "mutation-gate: score-below-break-without-timeouts",
|
|
170
|
+
clearedBreakThreshold: "mutation-gate: cleared-break-threshold",
|
|
171
|
+
noFloorApplied: "mutation-gate: no-floor-applied",
|
|
162
172
|
});
|
|
163
173
|
|
|
164
174
|
/**
|
|
@@ -702,6 +712,62 @@ const unmeasuredBlock = () =>
|
|
|
702
712
|
' Add "clear-text" to `reporters` in your Stryker config to measure it, or set\n' +
|
|
703
713
|
" MUTATION_CAPTURE=0 to say out loud that this run is not being accounted for.";
|
|
704
714
|
|
|
715
|
+
/**
|
|
716
|
+
* The floor a completed run was judged against, named with its value.
|
|
717
|
+
*
|
|
718
|
+
* ## The defect this closes
|
|
719
|
+
*
|
|
720
|
+
* The failing verdict below names the floor it judged against and that floor's
|
|
721
|
+
* value. The passing one named neither: it printed the accounting block and
|
|
722
|
+
* stopped. Two mutation floors exist in this project and deliberately differ —
|
|
723
|
+
* the `thresholds.break` Stryker enforces, and the value the Lisa config
|
|
724
|
+
* declares — so "it cleared the floor" has two answers, and a report could pick
|
|
725
|
+
* the flattering one without ever lying. A reader could not tell a run that
|
|
726
|
+
* cleared 60 from one that cleared 5, nor a run judged against the intended
|
|
727
|
+
* floor from one judged against a default nobody chose.
|
|
728
|
+
*
|
|
729
|
+
* ## Where no floor was applied it says so, rather than inventing one
|
|
730
|
+
*
|
|
731
|
+
* Two arms reach this with nothing to name, and `0` would be a fabrication in
|
|
732
|
+
* both: a project that declared no `thresholds.break` has not asked for a floor
|
|
733
|
+
* (see {@link resolveBreakThreshold}, which returns null and not zero for
|
|
734
|
+
* exactly this reason), and a run whose tally produced no score has nothing to
|
|
735
|
+
* judge against the floor it did declare. Both say NO floor was applied, which
|
|
736
|
+
* is the same answer this gate's `nothing-to-mutate` and `no-diff-base` exits
|
|
737
|
+
* already give: nothing was measured, so nothing passed.
|
|
738
|
+
*
|
|
739
|
+
* This is reporting only. It changes no threshold and gates nothing — the arm
|
|
740
|
+
* that fails a run is below, and it is untouched.
|
|
741
|
+
* @param {{timedOut: number}} tally - The counts.
|
|
742
|
+
* @param {{withoutTimeouts: number}} accounting - From
|
|
743
|
+
* {@link timeoutAccounting}.
|
|
744
|
+
* @param {number|null} breakThreshold - `thresholds.break`, or null.
|
|
745
|
+
* @returns {string} The block, appended to the accounting report.
|
|
746
|
+
*/
|
|
747
|
+
const clearedFloorBlock = (tally, accounting, breakThreshold) => {
|
|
748
|
+
if (breakThreshold === null)
|
|
749
|
+
return (
|
|
750
|
+
`\n⚪ ${OUTCOMES.noFloorApplied}\n` +
|
|
751
|
+
' Your Stryker config declares no "thresholds.break", so NO floor was applied\n' +
|
|
752
|
+
" to this run. The scores above are reported, not cleared — nothing here says\n" +
|
|
753
|
+
" they are good enough, because nothing said what good enough is."
|
|
754
|
+
);
|
|
755
|
+
if (!Number.isFinite(accounting.withoutTimeouts))
|
|
756
|
+
return (
|
|
757
|
+
`\n⚪ ${OUTCOMES.noFloorApplied}\n` +
|
|
758
|
+
` A break threshold of ${breakThreshold} is declared, but this run produced no score to\n` +
|
|
759
|
+
" judge against it, so NO floor was applied. Nothing here is a verdict about\n" +
|
|
760
|
+
" your tests."
|
|
761
|
+
);
|
|
762
|
+
return (
|
|
763
|
+
`\n✅ ${OUTCOMES.clearedBreakThreshold}\n` +
|
|
764
|
+
` Without crediting the ${tally.timedOut} timed-out mutant(s), this run scores\n` +
|
|
765
|
+
` ${score(accounting.withoutTimeouts)} against a break threshold of ${breakThreshold} — "thresholds.break" in your\n` +
|
|
766
|
+
" Stryker config, and the only floor this gate applied. That is a statement\n" +
|
|
767
|
+
" about this number and nothing else the run did."
|
|
768
|
+
);
|
|
769
|
+
};
|
|
770
|
+
|
|
705
771
|
/**
|
|
706
772
|
* Judge a completed run on what it can prove, rather than on what it counted.
|
|
707
773
|
*
|
|
@@ -760,7 +826,15 @@ export const judgeTimeoutAccounting = (tally, breakThreshold, ceiling) => {
|
|
|
760
826
|
};
|
|
761
827
|
}
|
|
762
828
|
|
|
763
|
-
|
|
829
|
+
// A verdict that clears is stated with the floor it cleared and that floor's
|
|
830
|
+
// value, the same way the two failing arms above state theirs. A bare pass is
|
|
831
|
+
// unfalsifiable by a reader: while two floors exist, "it cleared the floor"
|
|
832
|
+
// has two answers.
|
|
833
|
+
return {
|
|
834
|
+
failed: false,
|
|
835
|
+
measured: true,
|
|
836
|
+
message: `${report}${clearedFloorBlock(tally, accounting, breakThreshold)}`,
|
|
837
|
+
};
|
|
764
838
|
};
|
|
765
839
|
|
|
766
840
|
/**
|