@codyswann/lisa 4.27.9 → 4.28.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 (70) hide show
  1. package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
  2. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  3. package/dist/core/upstream-evidence-manifest.js +36 -2
  4. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  5. package/package.json +5 -4
  6. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  7. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  8. package/plugins/lisa/.codex-plugin/skills/lisa-validate-tracker-mapping/SKILL.md +134 -3
  9. package/plugins/lisa/scripts/repo-scope-vocabulary-audit.mjs +458 -0
  10. package/plugins/lisa/skills/lisa-validate-tracker-mapping/SKILL.md +135 -4
  11. package/plugins/lisa-agy/plugin.json +1 -1
  12. package/plugins/lisa-agy/scripts/repo-scope-vocabulary-audit.mjs +458 -0
  13. package/plugins/lisa-agy/skills/lisa-validate-tracker-mapping/SKILL.md +135 -4
  14. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  15. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  16. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  17. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  18. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  19. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  20. package/plugins/lisa-copilot/scripts/repo-scope-vocabulary-audit.mjs +458 -0
  21. package/plugins/lisa-copilot/skills/lisa-validate-tracker-mapping/SKILL.md +135 -4
  22. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  23. package/plugins/lisa-cursor/scripts/repo-scope-vocabulary-audit.mjs +458 -0
  24. package/plugins/lisa-cursor/skills/lisa-validate-tracker-mapping/SKILL.md +135 -4
  25. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  26. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  27. package/plugins/lisa-expo-agy/plugin.json +1 -1
  28. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  29. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  30. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  31. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  32. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  33. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  34. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  35. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  36. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  37. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  38. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  39. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  40. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  41. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  42. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  43. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  44. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  46. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  47. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  48. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  49. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  50. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  51. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  52. package/plugins/lisa-rails-agy/plugin.json +1 -1
  53. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  56. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  57. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  58. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  61. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  62. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  63. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  64. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  65. package/plugins/src/base/scripts/repo-scope-vocabulary-audit.mjs +458 -0
  66. package/plugins/src/base/skills/lisa-validate-tracker-mapping/SKILL.md +135 -4
  67. package/scripts/lib/mutation-performance-reporter.mjs +135 -0
  68. package/scripts/mutation-performance-measure.mjs +1794 -0
  69. package/scripts/mutation-performance.schema.json +103 -0
  70. package/typescript/create-only/.github/workflows/review-evidence.yml +18 -10
@@ -0,0 +1,103 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/CodySwannGT/lisa/schemas/mutation-performance-v1.json",
4
+ "title": "Lisa mutation measurement evidence",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schema_version", "conclusion", "identity", "protocol", "selection", "phases_ms", "resources", "results", "cache", "cleanup", "digests"],
8
+ "properties": {
9
+ "schema_version": { "const": "lisa.mutation-measurement/v1" },
10
+ "conclusion": { "const": "measurement-only" },
11
+ "identity": { "$ref": "#/$defs/identity" },
12
+ "protocol": { "$ref": "#/$defs/protocol" },
13
+ "selection": { "$ref": "#/$defs/selection" },
14
+ "phases_ms": { "$ref": "#/$defs/phases" },
15
+ "resources": { "$ref": "#/$defs/resources" },
16
+ "results": { "$ref": "#/$defs/results" },
17
+ "cache": { "$ref": "#/$defs/cache" },
18
+ "cleanup": { "$ref": "#/$defs/cleanup" },
19
+ "digests": { "$ref": "#/$defs/digests" }
20
+ },
21
+ "$defs": {
22
+ "sha256": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
23
+ "sha40": { "type": "string", "pattern": "^[0-9a-f]{40}$" },
24
+ "nonnegative": { "type": "number", "minimum": 0, "maximum": 9007199254740991 },
25
+ "positiveInteger": { "type": "integer", "minimum": 1, "maximum": 10000000 },
26
+ "stringArray": { "type": "array", "maxItems": 10000, "items": { "type": "string", "minLength": 1, "maxLength": 4096 } },
27
+ "identity": {
28
+ "type": "object", "additionalProperties": false,
29
+ "required": ["subject_sha", "tree_sha", "package_sha256", "package_version", "stack", "runner_family", "fixture_schema", "fixture_sha256", "host_base_sha", "host_head_sha", "run_id", "job_id", "run_attempt", "ubuntu_image", "node_version", "bun_version", "npm_version", "stryker_version", "runner_version", "lock_sha256", "package_json_sha256", "runner_sha256", "raw_config_sha256", "effective_config_sha256", "gate_sha256", "workflow_sha256", "source_sha256", "test_sha256"],
30
+ "properties": {
31
+ "subject_sha": { "$ref": "#/$defs/sha40" }, "tree_sha": { "$ref": "#/$defs/sha40" },
32
+ "package_sha256": { "$ref": "#/$defs/sha256" }, "package_version": { "type": "string", "minLength": 1, "maxLength": 100 },
33
+ "stack": { "enum": ["vitest", "jest"] }, "runner_family": { "enum": ["vitest", "jest"] },
34
+ "fixture_schema": { "const": "fixture/v1" }, "fixture_sha256": { "$ref": "#/$defs/sha256" },
35
+ "host_base_sha": { "$ref": "#/$defs/sha40" }, "host_head_sha": { "$ref": "#/$defs/sha40" },
36
+ "run_id": { "type": "string", "pattern": "^[0-9]+$" }, "job_id": { "type": "string", "minLength": 1, "maxLength": 200 },
37
+ "run_attempt": { "$ref": "#/$defs/positiveInteger" }, "ubuntu_image": { "type": "string", "minLength": 1, "maxLength": 200 },
38
+ "node_version": { "type": "string", "minLength": 1, "maxLength": 100 }, "bun_version": { "type": "string", "minLength": 1, "maxLength": 100 },
39
+ "npm_version": { "type": "string", "minLength": 1, "maxLength": 100 }, "stryker_version": { "type": "string", "minLength": 1, "maxLength": 100 },
40
+ "runner_version": { "type": "string", "minLength": 1, "maxLength": 100 },
41
+ "lock_sha256": { "$ref": "#/$defs/sha256" }, "package_json_sha256": { "$ref": "#/$defs/sha256" },
42
+ "runner_sha256": { "$ref": "#/$defs/sha256" }, "raw_config_sha256": { "$ref": "#/$defs/sha256" },
43
+ "effective_config_sha256": { "$ref": "#/$defs/sha256" }, "gate_sha256": { "$ref": "#/$defs/sha256" },
44
+ "workflow_sha256": { "$ref": "#/$defs/sha256" }, "source_sha256": { "$ref": "#/$defs/sha256" }, "test_sha256": { "$ref": "#/$defs/sha256" }
45
+ }
46
+ },
47
+ "protocol": {
48
+ "type": "object", "additionalProperties": false,
49
+ "required": ["role", "draw", "mode", "started_at", "finished_at", "invalid_reasons", "cold_parent_summary_sha256", "cold_parent_incremental_sha256"],
50
+ "properties": {
51
+ "role": { "enum": ["baseline", "candidate"] }, "draw": { "type": "integer", "minimum": 1, "maximum": 3 },
52
+ "mode": { "enum": ["cold", "warm-local"] }, "started_at": { "type": "string", "format": "date-time" },
53
+ "finished_at": { "type": "string", "format": "date-time" }, "invalid_reasons": { "$ref": "#/$defs/stringArray" },
54
+ "cold_parent_summary_sha256": { "oneOf": [{ "$ref": "#/$defs/sha256" }, { "type": "null" }] },
55
+ "cold_parent_incremental_sha256": { "oneOf": [{ "$ref": "#/$defs/sha256" }, { "type": "null" }] }
56
+ }
57
+ },
58
+ "testIdentity": {
59
+ "type": "object", "additionalProperties": false, "required": ["file", "name", "location"],
60
+ "properties": { "file": { "type": "string", "minLength": 1, "maxLength": 4096 }, "name": { "type": "string", "minLength": 1, "maxLength": 4096 }, "location": { "type": "string", "pattern": "^[0-9]+:[0-9]+$" } }
61
+ },
62
+ "mutantIdentity": {
63
+ "type": "object", "additionalProperties": false, "required": ["file", "mutator", "start", "end", "replacement_sha256"],
64
+ "properties": { "file": { "type": "string", "minLength": 1, "maxLength": 4096 }, "mutator": { "type": "string", "minLength": 1, "maxLength": 300 }, "start": { "type": "string", "pattern": "^[0-9]+:[0-9]+$" }, "end": { "type": "string", "pattern": "^[0-9]+:[0-9]+$" }, "replacement_sha256": { "$ref": "#/$defs/sha256" } }
65
+ },
66
+ "selection": {
67
+ "type": "object", "additionalProperties": false, "required": ["merge_base", "head", "changed_paths", "mutate_files", "tests", "mutants"],
68
+ "properties": { "merge_base": { "$ref": "#/$defs/sha40" }, "head": { "$ref": "#/$defs/sha40" }, "changed_paths": { "$ref": "#/$defs/stringArray" }, "mutate_files": { "$ref": "#/$defs/stringArray" }, "tests": { "type": "array", "minItems": 1, "maxItems": 100000, "items": { "$ref": "#/$defs/testIdentity" } }, "mutants": { "type": "array", "minItems": 1, "maxItems": 1000000, "items": { "$ref": "#/$defs/mutantIdentity" } } }
69
+ },
70
+ "phases": {
71
+ "type": "object", "additionalProperties": false, "required": ["install", "runner_setup", "instrumentation", "dry_run", "plan", "mutation", "reporting", "teardown", "end_to_end", "clock_tolerance"],
72
+ "properties": { "install": { "$ref": "#/$defs/nonnegative" }, "runner_setup": { "$ref": "#/$defs/nonnegative" }, "instrumentation": { "$ref": "#/$defs/nonnegative" }, "dry_run": { "$ref": "#/$defs/nonnegative" }, "plan": { "$ref": "#/$defs/nonnegative" }, "mutation": { "$ref": "#/$defs/nonnegative" }, "reporting": { "$ref": "#/$defs/nonnegative" }, "teardown": { "$ref": "#/$defs/nonnegative" }, "end_to_end": { "$ref": "#/$defs/nonnegative" }, "clock_tolerance": { "$ref": "#/$defs/nonnegative" } }
73
+ },
74
+ "resources": {
75
+ "type": "object", "additionalProperties": false, "required": ["detected_cpus", "peak_cpu_pct", "median_cpu_pct", "peak_rss_bytes", "peak_process_count", "sample_count"],
76
+ "properties": { "detected_cpus": { "$ref": "#/$defs/positiveInteger" }, "peak_cpu_pct": { "$ref": "#/$defs/nonnegative" }, "median_cpu_pct": { "$ref": "#/$defs/nonnegative" }, "peak_rss_bytes": { "$ref": "#/$defs/nonnegative" }, "peak_process_count": { "$ref": "#/$defs/positiveInteger" }, "sample_count": { "type": "integer", "minimum": 2, "maximum": 100000 } }
77
+ },
78
+ "statuses": {
79
+ "type": "object", "additionalProperties": false, "required": ["Killed", "Survived", "NoCoverage", "Timeout", "Ignored", "CompileError", "RuntimeError", "Pending"],
80
+ "properties": { "Killed": { "$ref": "#/$defs/nonnegative" }, "Survived": { "$ref": "#/$defs/nonnegative" }, "NoCoverage": { "$ref": "#/$defs/nonnegative" }, "Timeout": { "$ref": "#/$defs/nonnegative" }, "Ignored": { "$ref": "#/$defs/nonnegative" }, "CompileError": { "$ref": "#/$defs/nonnegative" }, "RuntimeError": { "$ref": "#/$defs/nonnegative" }, "Pending": { "$ref": "#/$defs/nonnegative" } }
81
+ },
82
+ "thresholds": {
83
+ "type": "object", "additionalProperties": false, "required": ["high", "low", "break"],
84
+ "properties": { "high": { "type": "number", "minimum": 0, "maximum": 100 }, "low": { "type": "number", "minimum": 0, "maximum": 100 }, "break": { "type": "number", "minimum": 0, "maximum": 100 } }
85
+ },
86
+ "results": {
87
+ "type": "object", "additionalProperties": false, "required": ["statuses", "expected_total", "observed_total", "thresholds", "reported_score", "timeout_recomputed_score", "exit_code", "signal", "verdict", "named_survivors"],
88
+ "properties": { "statuses": { "$ref": "#/$defs/statuses" }, "expected_total": { "$ref": "#/$defs/positiveInteger" }, "observed_total": { "$ref": "#/$defs/positiveInteger" }, "thresholds": { "$ref": "#/$defs/thresholds" }, "reported_score": { "type": "number", "minimum": 0, "maximum": 100 }, "timeout_recomputed_score": { "type": "number", "minimum": 0, "maximum": 100 }, "exit_code": { "type": ["integer", "null"] }, "signal": { "type": ["string", "null"] }, "verdict": { "enum": ["passed", "threshold-red"] }, "named_survivors": { "$ref": "#/$defs/stringArray" } }
89
+ },
90
+ "cache": {
91
+ "type": "object", "additionalProperties": false, "required": ["incremental_configured", "before_exists", "before_sha256", "after_exists", "after_sha256", "cold_parent_identity", "disposition", "remote_read", "remote_write"],
92
+ "properties": { "incremental_configured": { "type": "boolean" }, "before_exists": { "type": "boolean" }, "before_sha256": { "oneOf": [{ "$ref": "#/$defs/sha256" }, { "type": "null" }] }, "after_exists": { "type": "boolean" }, "after_sha256": { "oneOf": [{ "$ref": "#/$defs/sha256" }, { "type": "null" }] }, "cold_parent_identity": { "oneOf": [{ "$ref": "#/$defs/sha256" }, { "type": "null" }] }, "disposition": { "enum": ["cold-empty", "diagnostic-local-reuse"] }, "remote_read": { "const": false }, "remote_write": { "const": false } }
93
+ },
94
+ "cleanup": {
95
+ "type": "object", "additionalProperties": false, "required": ["root_pid", "root_birth_tick", "signal_forwarded", "kill_reason", "descendant_survivors", "sandbox_entries_before", "sandbox_entries_after", "sampler_healthy"],
96
+ "properties": { "root_pid": { "$ref": "#/$defs/positiveInteger" }, "root_birth_tick": { "type": "string", "minLength": 1, "maxLength": 100 }, "signal_forwarded": { "type": ["string", "null"] }, "kill_reason": { "type": ["string", "null"] }, "descendant_survivors": { "const": 0 }, "sandbox_entries_before": { "$ref": "#/$defs/nonnegative" }, "sandbox_entries_after": { "const": 0 }, "sampler_healthy": { "const": true } }
97
+ },
98
+ "digests": {
99
+ "type": "object", "additionalProperties": false, "required": ["phase_events_sha256", "process_samples_sha256", "selection_sha256", "stryker_report_sha256", "runner_log_sha256", "host_manifest_sha256"],
100
+ "properties": { "phase_events_sha256": { "$ref": "#/$defs/sha256" }, "process_samples_sha256": { "$ref": "#/$defs/sha256" }, "selection_sha256": { "$ref": "#/$defs/sha256" }, "stryker_report_sha256": { "$ref": "#/$defs/sha256" }, "runner_log_sha256": { "$ref": "#/$defs/sha256" }, "host_manifest_sha256": { "$ref": "#/$defs/sha256" } }
101
+ }
102
+ }
103
+ }
@@ -24,14 +24,22 @@
24
24
  # the entire run (#2049). A standalone workflow declares its own permissions and
25
25
  # constrains nothing else.
26
26
  #
27
- # THIS NEVER BLOCKS A MERGE, on purpose. A review bot can go hollow because an
28
- # org-wide SPENDING CAP was hit, and a gate that reddens every pull request on a
29
- # billing state is worse than the one it criticises. What the finding changes is
30
- # what you may CLAIM: a pull request carrying it has not been shown to be
31
- # reviewed, so do not record it as reviewed. Once you have made that governance
32
- # call, add `--fail-on-vacuous` to the command below — that is the supported way
33
- # to ask for an exit code, and it replaces the `--json`-reading wrapper every
34
- # consumer used to have to write.
27
+ # ENFORCING. `--require-review-evidence` requires the declared review check to
28
+ # account for its verdict. A review that RAN AND OBJECTED blocks. These two
29
+ # vendor-owned outcomes remain explicit waivers: `Review rate limited` and
30
+ # `Review skipped: manual review required for this OSS repository`. They stay
31
+ # loud and nonblocking because a pull request author cannot fix the entitlement.
32
+ #
33
+ # A rate-limit queue may be roughly hour-long. Agentic delivery retries through
34
+ # it, with an auditable admin-merge only at the exterior governance gate after
35
+ # every other required check and independent review has passed.
36
+ #
37
+ # `--fail-on-vacuous` is a DIFFERENT switch and is not passed here. It governs
38
+ # other vacuity findings; named review waivers remain nonblocking under it.
39
+ # `--require-review-evidence` alone controls review-gate blocking.
40
+ #
41
+ # THREE STATES, NEVER TWO. `absent` is not `waived`: no review result means
42
+ # nothing accounts for the silence and the gate must refuse it.
35
43
  #
36
44
  # It CAN still go red, for one reason that is not a finding: the arm inspected
37
45
  # NOTHING. An unresolvable pull request, a `gh` it could not read, an empty
@@ -116,7 +124,7 @@ jobs:
116
124
  exit 1
117
125
  fi
118
126
  if [ -n "${VACUITY_PR:-}" ]; then
119
- node scripts/check-skipped-required-checks.mjs --vacuity --pr="$VACUITY_PR"
127
+ node scripts/check-skipped-required-checks.mjs --vacuity --require-review-evidence --pr="$VACUITY_PR"
120
128
  else
121
- node scripts/check-skipped-required-checks.mjs --vacuity
129
+ node scripts/check-skipped-required-checks.mjs --vacuity --require-review-evidence
122
130
  fi