@codyswann/lisa 3.37.0 → 3.38.1

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 (59) hide show
  1. package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
  2. package/dist/core/lisa-owned-hash-ledger.js +1 -0
  3. package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
  4. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  5. package/dist/core/upstream-evidence-manifest.js +5 -1
  6. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  7. package/expo/create-only/.github/workflows/playwright-e2e.yml +151 -0
  8. package/package.json +1 -1
  9. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  10. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  11. package/plugins/lisa-agy/plugin.json +1 -1
  12. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  13. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  14. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  15. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  16. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  17. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  18. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  19. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  20. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  21. package/plugins/lisa-expo-agy/plugin.json +1 -1
  22. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  23. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  24. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  25. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  26. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  27. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  28. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  29. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  30. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  31. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  32. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  33. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  34. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  35. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  36. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  37. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  38. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  39. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  40. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  41. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  42. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  43. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  44. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  46. package/plugins/lisa-rails-agy/plugin.json +1 -1
  47. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  48. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  49. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  50. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  51. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  52. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  53. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  56. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  57. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  59. package/typescript/copy-overwrite/scripts/check-nightly-e2e-health.mjs +27 -3
@@ -689,15 +689,21 @@ export function readSuiteScope(artifacts) {
689
689
  return Object.freeze({
690
690
  readable: false,
691
691
  filtered: Object.freeze([]),
692
+ full: Object.freeze([]),
692
693
  counts: Object.freeze({}),
693
694
  totalFlows: null,
694
695
  });
695
696
  }
696
697
  const filtered = [];
698
+ const full = [];
697
699
  const counts = {};
698
700
  for (const artifact of artifacts) {
699
701
  const name = typeof artifact?.name === "string" ? artifact.name : "";
700
702
  const scope = SCOPE_ARTIFACT_PATTERN.exec(name);
703
+ if (scope && scope.groups.scope === "full") {
704
+ full.push(scope.groups.platform);
705
+ continue;
706
+ }
701
707
  if (scope && scope.groups.scope === "filtered") {
702
708
  filtered.push(scope.groups.platform);
703
709
  continue;
@@ -717,6 +723,10 @@ export function readSuiteScope(artifacts) {
717
723
  return Object.freeze({
718
724
  readable: true,
719
725
  filtered: Object.freeze(filtered.sort()),
726
+ // Tracked as well as `filtered`, because "the run asserted it was UNFILTERED"
727
+ // and "the run said nothing" are different facts and only one of them is
728
+ // grounds to stop asking. Every pre-adoption run is the second.
729
+ full: Object.freeze(full.sort()),
720
730
  counts: Object.freeze({ ...counts }),
721
731
  // `null`, not 0, when nothing was published. Zero is a READING — the arm ran
722
732
  // and tested nothing — and rendering "no evidence" as that reading is the
@@ -843,9 +853,21 @@ export function assessSuite(suite, observation, context) {
843
853
  reason,
844
854
  // Only ever true when no floor was declared — with one declared, the same
845
855
  // condition returns a disqualifier above instead.
856
+ //
857
+ // The condition is "no floor AND the run never asserted it was unfiltered",
858
+ // NOT "no floor AND no count was published". Running this against the real
859
+ // AcmeOrgB run 32023540492 is what corrected it: that run publishes
860
+ // `flowcount-4` on both arms, so a count-based condition read it as
861
+ // verified and printed a clean green — the exact 5%-of-the-suite false
862
+ // green this file exists to catch, silently. Knowing the number is not the
863
+ // same as being able to judge it; only a declared floor or the run's own
864
+ // `scope-full` marker settles the question.
846
865
  scopeUnverified:
847
- suite.min_flows === undefined &&
848
- (!scope.readable || scope.totalFlows === null),
866
+ suite.min_flows === undefined && (scope.full?.length ?? 0) === 0,
867
+ // Carried so the notice can quote what WAS measured. "this run executed 8
868
+ // flow(s)" is a number a reader can act on; "how much ran is unknown" when
869
+ // the count was sitting right there is the gate withholding its evidence.
870
+ observedFlows: scope.totalFlows,
849
871
  };
850
872
  };
851
873
 
@@ -1395,7 +1417,9 @@ export function formatFinding(finding) {
1395
1417
  // precise reading error this gate was measured making: a filtered run and a
1396
1418
  // full one rendered the same, so the history read as "green recently".
1397
1419
  const unverified = finding.scopeUnverified
1398
- ? " — ⚠️ scope unverified: this run published no executed-flow count, so how much of the suite ran is unknown. If this suite publishes `maestro-<platform>-flowcount-<N>`, declare `min_flows` to make that a blocking question; if it does not (a browser suite, say), this line is the honest limit of what the gate can see"
1420
+ ? typeof finding.observedFlows === "number"
1421
+ ? ` — ⚠️ scope unverified: this run executed ${finding.observedFlows} flow(s), and no \`min_flows\` is declared for this suite, so the gate cannot tell whether that is the whole suite or a slice of it. Compare it against a known-full night and declare \`min_flows\` to make this a blocking question`
1422
+ : " — ⚠️ scope unverified: this run published no executed-flow count, so how much of the suite ran is unknown. If this suite publishes `maestro-<platform>-flowcount-<N>`, declare `min_flows` to make that a blocking question; if it does not (a browser suite, say), this line is the honest limit of what the gate can see"
1399
1423
  : "";
1400
1424
  return `${marker} ${finding.label} — green${when}${link}${unverified}`;
1401
1425
  }