@codyswann/lisa 2.217.3 → 2.217.4
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/dist/cli/doctor-monitor-thresholds.d.ts +7 -4
- package/dist/cli/doctor-monitor-thresholds.d.ts.map +1 -1
- package/dist/cli/doctor-monitor-thresholds.js +57 -66
- package/dist/cli/doctor-monitor-thresholds.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/.codex-plugin/skills/lisa-monitor/SKILL.md +63 -8
- package/plugins/lisa/skills/lisa-monitor/SKILL.md +63 -8
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-monitor/SKILL.md +63 -8
- 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-copilot/skills/lisa-monitor/SKILL.md +63 -8
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/skills/lisa-monitor/SKILL.md +63 -8
- 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/plugins/src/base/skills/lisa-monitor/SKILL.md +63 -8
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
import type { DoctorCheck } from "./doctor.js";
|
|
2
1
|
/**
|
|
3
|
-
*
|
|
2
|
+
* Find legacy monitor keys in committed and local config independently.
|
|
4
3
|
* @param targetPath - Project path to inspect
|
|
5
|
-
* @returns
|
|
4
|
+
* @returns One named doctor check result
|
|
6
5
|
*/
|
|
7
|
-
export declare function checkLegacyMonitorThresholds(targetPath: string): Promise<
|
|
6
|
+
export declare function checkLegacyMonitorThresholds(targetPath: string): Promise<{
|
|
7
|
+
name: string;
|
|
8
|
+
status: "ok" | "warn";
|
|
9
|
+
detail: string;
|
|
10
|
+
}>;
|
|
8
11
|
//# sourceMappingURL=doctor-monitor-thresholds.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor-monitor-thresholds.d.ts","sourceRoot":"","sources":["../../src/cli/doctor-monitor-thresholds.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"doctor-monitor-thresholds.d.ts","sourceRoot":"","sources":["../../src/cli/doctor-monitor-thresholds.ts"],"names":[],"mappings":"AAqEA;;;;GAIG;AACH,wBAAsB,4BAA4B,CAChD,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC;IACT,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,CA6BD"}
|
|
@@ -1,90 +1,81 @@
|
|
|
1
1
|
import { existsSync } from "node:fs";
|
|
2
2
|
import { readFile } from "node:fs/promises";
|
|
3
3
|
import * as path from "node:path";
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const MONITOR_THRESHOLDS_PREFIX = "monitor.thresholds.";
|
|
8
|
-
const LEGACY_MONITOR_THRESHOLD_KEYS = [
|
|
4
|
+
const MONITOR_THRESHOLD_CONFIG_CHECK_NAME = "Monitor threshold keys current?";
|
|
5
|
+
const CONFIG_FILES = [".lisa.config.json", ".lisa.config.local.json"];
|
|
6
|
+
const LEGACY_MONITOR_THRESHOLDS = [
|
|
9
7
|
{
|
|
10
|
-
legacy:
|
|
11
|
-
|
|
8
|
+
legacy: "monitor.thresholds.sentryMinEvents24h",
|
|
9
|
+
current: "monitor.thresholds.minEvents24h",
|
|
10
|
+
property: "sentryMinEvents24h",
|
|
12
11
|
},
|
|
13
12
|
{
|
|
14
|
-
legacy:
|
|
15
|
-
|
|
13
|
+
legacy: "monitor.thresholds.xrayFaultRatePct",
|
|
14
|
+
current: "monitor.thresholds.faultRatePct",
|
|
15
|
+
property: "xrayFaultRatePct",
|
|
16
16
|
},
|
|
17
17
|
];
|
|
18
18
|
/**
|
|
19
|
-
*
|
|
20
|
-
* @param
|
|
21
|
-
* @returns
|
|
19
|
+
* Return an object-shaped value as a string-keyed record.
|
|
20
|
+
* @param value - Value to narrow
|
|
21
|
+
* @returns Record for objects, otherwise undefined
|
|
22
22
|
*/
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
try {
|
|
28
|
-
return JSON.parse(await readFile(configPath, "utf8"));
|
|
29
|
-
}
|
|
30
|
-
catch {
|
|
31
|
-
return undefined;
|
|
32
|
-
}
|
|
23
|
+
function asRecord(value) {
|
|
24
|
+
return typeof value === "object" && value !== null
|
|
25
|
+
? value
|
|
26
|
+
: undefined;
|
|
33
27
|
}
|
|
34
28
|
/**
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
* @param
|
|
38
|
-
* @
|
|
29
|
+
* Find legacy monitor threshold keys in one raw config file.
|
|
30
|
+
* Parse failures are reported by doctor's existing project-config check.
|
|
31
|
+
* @param targetPath - Project path to inspect
|
|
32
|
+
* @param fileName - Raw config file to inspect
|
|
33
|
+
* @returns Legacy-path migration findings
|
|
39
34
|
*/
|
|
40
|
-
function
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
35
|
+
async function legacyFindingsForFile(targetPath, fileName) {
|
|
36
|
+
const configPath = path.join(targetPath, fileName);
|
|
37
|
+
if (!existsSync(configPath))
|
|
38
|
+
return { findings: [] };
|
|
39
|
+
try {
|
|
40
|
+
const config = asRecord(JSON.parse(await readFile(configPath, "utf8")));
|
|
41
|
+
const monitor = asRecord(config?.["monitor"]);
|
|
42
|
+
const thresholds = asRecord(monitor?.["thresholds"]);
|
|
43
|
+
return {
|
|
44
|
+
findings: LEGACY_MONITOR_THRESHOLDS.filter(threshold => Object.hasOwn(thresholds ?? {}, threshold.property)).map(threshold => `${fileName}: ${threshold.legacy} -> ${threshold.current}`),
|
|
45
|
+
};
|
|
51
46
|
}
|
|
52
|
-
|
|
53
|
-
return
|
|
47
|
+
catch {
|
|
48
|
+
return { findings: [], uninspectable: fileName };
|
|
54
49
|
}
|
|
55
|
-
return hasConfigPathSegments(value[segment], remaining);
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Determine whether an object owns a dotted config path.
|
|
59
|
-
* @param value - Object to inspect
|
|
60
|
-
* @param dottedPath - Dot-separated config key path
|
|
61
|
-
* @returns True when every segment exists as an own property
|
|
62
|
-
*/
|
|
63
|
-
function hasConfigPath(value, dottedPath) {
|
|
64
|
-
return hasConfigPathSegments(value, dottedPath.split("."));
|
|
65
50
|
}
|
|
66
51
|
/**
|
|
67
|
-
*
|
|
52
|
+
* Find legacy monitor keys in committed and local config independently.
|
|
68
53
|
* @param targetPath - Project path to inspect
|
|
69
|
-
* @returns
|
|
54
|
+
* @returns One named doctor check result
|
|
70
55
|
*/
|
|
71
56
|
export async function checkLegacyMonitorThresholds(targetPath) {
|
|
72
|
-
const
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
return {
|
|
79
|
-
name: CHECK_NAME,
|
|
57
|
+
const inspections = await Promise.all(CONFIG_FILES.map(fileName => legacyFindingsForFile(targetPath, fileName)));
|
|
58
|
+
const findings = inspections.flatMap(inspection => inspection.findings);
|
|
59
|
+
const uninspectable = inspections.flatMap(inspection => inspection.uninspectable ? [inspection.uninspectable] : []);
|
|
60
|
+
return findings.length === 0 && uninspectable.length === 0
|
|
61
|
+
? {
|
|
62
|
+
name: MONITOR_THRESHOLD_CONFIG_CHECK_NAME,
|
|
80
63
|
status: "ok",
|
|
81
|
-
detail: "No legacy monitor threshold keys
|
|
64
|
+
detail: "No legacy monitor threshold keys found",
|
|
65
|
+
}
|
|
66
|
+
: {
|
|
67
|
+
name: MONITOR_THRESHOLD_CONFIG_CHECK_NAME,
|
|
68
|
+
status: "warn",
|
|
69
|
+
detail: [
|
|
70
|
+
findings.length > 0
|
|
71
|
+
? `Replace legacy monitor threshold keys: ${findings.join(", ")}`
|
|
72
|
+
: undefined,
|
|
73
|
+
uninspectable.length > 0
|
|
74
|
+
? `Could not inspect monitor threshold keys in: ${uninspectable.join(", ")}`
|
|
75
|
+
: undefined,
|
|
76
|
+
]
|
|
77
|
+
.filter((message) => message !== undefined)
|
|
78
|
+
.join(". "),
|
|
82
79
|
};
|
|
83
|
-
}
|
|
84
|
-
return {
|
|
85
|
-
name: CHECK_NAME,
|
|
86
|
-
status: "warn",
|
|
87
|
-
detail: `Legacy monitor threshold keys found; migrate ${findings.join(", ")}`,
|
|
88
|
-
};
|
|
89
80
|
}
|
|
90
81
|
//# sourceMappingURL=doctor-monitor-thresholds.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor-monitor-thresholds.js","sourceRoot":"","sources":["../../src/cli/doctor-monitor-thresholds.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor-monitor-thresholds.js","sourceRoot":"","sources":["../../src/cli/doctor-monitor-thresholds.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -95,7 +95,7 @@
|
|
|
95
95
|
"ws": ">=8.20.1"
|
|
96
96
|
},
|
|
97
97
|
"name": "@codyswann/lisa",
|
|
98
|
-
"version": "2.217.
|
|
98
|
+
"version": "2.217.4",
|
|
99
99
|
"description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
|
|
100
100
|
"main": "dist/index.js",
|
|
101
101
|
"exports": {
|
|
@@ -15,14 +15,69 @@ Spot-check application health, **audit observability completeness**, and **file
|
|
|
15
15
|
- `--all-gaps` — also file `recommended`-tier gaps (session replay, product analytics, etc.), not just `core`. Does not change anomaly thresholds.
|
|
16
16
|
- `max_candidates=<n>` — cap tickets filed this run (default 20; config `monitor.maxCandidates`).
|
|
17
17
|
|
|
18
|
-
##
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
18
|
+
## Monitor threshold compatibility
|
|
19
|
+
|
|
20
|
+
Before resolving anomaly thresholds, inspect the committed
|
|
21
|
+
`.lisa.config.json` and local `.lisa.config.local.json` separately with `jq`.
|
|
22
|
+
Use a literal, fixed-path projection that returns presence and value for only
|
|
23
|
+
these four exact paths; do not use `Read`, `cat`, interpolation, or a filter
|
|
24
|
+
that emits either entire config into agent context:
|
|
25
|
+
|
|
26
|
+
- `monitor.thresholds.minEvents24h`, then
|
|
27
|
+
`monitor.thresholds.sentryMinEvents24h`.
|
|
28
|
+
- `monitor.thresholds.faultRatePct`, then
|
|
29
|
+
`monitor.thresholds.xrayFaultRatePct`.
|
|
30
|
+
|
|
31
|
+
Run this fixed filter once with literal final argument `.lisa.config.json` and
|
|
32
|
+
once with literal final argument `.lisa.config.local.json` when the respective
|
|
33
|
+
file exists:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
jq 'def threshold($object; $name):
|
|
37
|
+
if ($object | has($name)) then
|
|
38
|
+
($object[$name] | type) as $type |
|
|
39
|
+
if $type == "number" then
|
|
40
|
+
if ($object[$name] | isfinite and (isnan | not)) then
|
|
41
|
+
{present: true, valid: true, type: "number", value: $object[$name]}
|
|
42
|
+
else
|
|
43
|
+
{present: true, valid: false, type: "non-finite-number"}
|
|
44
|
+
end
|
|
45
|
+
else
|
|
46
|
+
{present: true, valid: false, type: $type}
|
|
47
|
+
end
|
|
48
|
+
else
|
|
49
|
+
{present: false, valid: false, type: "missing"}
|
|
50
|
+
end;
|
|
51
|
+
(.monitor.thresholds | if type == "object" then . else {} end) as $t |
|
|
52
|
+
{
|
|
53
|
+
"monitor.thresholds.minEvents24h": threshold($t; "minEvents24h"),
|
|
54
|
+
"monitor.thresholds.sentryMinEvents24h": threshold($t; "sentryMinEvents24h"),
|
|
55
|
+
"monitor.thresholds.faultRatePct": threshold($t; "faultRatePct"),
|
|
56
|
+
"monitor.thresholds.xrayFaultRatePct": threshold($t; "xrayFaultRatePct")
|
|
57
|
+
}' .lisa.config.json
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
A nonzero `jq` result fails threshold collection; do not treat an uninspectable
|
|
61
|
+
present file as if it were absent.
|
|
62
|
+
|
|
63
|
+
For each exact path, keep the raw `jq` presence/value result from each file;
|
|
64
|
+
do not inject defaults during this merge. Local presence overrides committed
|
|
65
|
+
presence per path. After that merge, resolve the current key before the legacy
|
|
66
|
+
key, then use default `1` for `monitor.thresholds.minEvents24h` or default `5`
|
|
67
|
+
for `monitor.thresholds.faultRatePct`. Current key wins over legacy key even
|
|
68
|
+
when its configured value is invalid.
|
|
69
|
+
|
|
70
|
+
Every configured threshold must be a finite JSON number. If the selected path
|
|
71
|
+
is null, a string, a boolean, an object, an array, or otherwise non-finite,
|
|
72
|
+
fail threshold collection and report the exact path and source without echoing
|
|
73
|
+
the invalid value; never fall through to a legacy value or default. Never quote
|
|
74
|
+
or report either whole config. The fixed `jq` projection itself must redact
|
|
75
|
+
invalid configured content: it emits only presence, validity, and a fixed type
|
|
76
|
+
classification, and includes the numeric `value` field only for a finite number.
|
|
77
|
+
For a valid resolution, the monitor report must include the resolved value and
|
|
78
|
+
source. Report only a validated numeric resolved value and one fixed source enum:
|
|
79
|
+
`local-current`, `committed-current`, `local-legacy`, `committed-legacy`, or
|
|
80
|
+
`default`.
|
|
26
81
|
|
|
27
82
|
## Orchestration: agent team
|
|
28
83
|
|
|
@@ -15,14 +15,69 @@ Spot-check application health, **audit observability completeness**, and **file
|
|
|
15
15
|
- `--all-gaps` — also file `recommended`-tier gaps (session replay, product analytics, etc.), not just `core`. Does not change anomaly thresholds.
|
|
16
16
|
- `max_candidates=<n>` — cap tickets filed this run (default 20; config `monitor.maxCandidates`).
|
|
17
17
|
|
|
18
|
-
##
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
18
|
+
## Monitor threshold compatibility
|
|
19
|
+
|
|
20
|
+
Before resolving anomaly thresholds, inspect the committed
|
|
21
|
+
`.lisa.config.json` and local `.lisa.config.local.json` separately with `jq`.
|
|
22
|
+
Use a literal, fixed-path projection that returns presence and value for only
|
|
23
|
+
these four exact paths; do not use `Read`, `cat`, interpolation, or a filter
|
|
24
|
+
that emits either entire config into agent context:
|
|
25
|
+
|
|
26
|
+
- `monitor.thresholds.minEvents24h`, then
|
|
27
|
+
`monitor.thresholds.sentryMinEvents24h`.
|
|
28
|
+
- `monitor.thresholds.faultRatePct`, then
|
|
29
|
+
`monitor.thresholds.xrayFaultRatePct`.
|
|
30
|
+
|
|
31
|
+
Run this fixed filter once with literal final argument `.lisa.config.json` and
|
|
32
|
+
once with literal final argument `.lisa.config.local.json` when the respective
|
|
33
|
+
file exists:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
jq 'def threshold($object; $name):
|
|
37
|
+
if ($object | has($name)) then
|
|
38
|
+
($object[$name] | type) as $type |
|
|
39
|
+
if $type == "number" then
|
|
40
|
+
if ($object[$name] | isfinite and (isnan | not)) then
|
|
41
|
+
{present: true, valid: true, type: "number", value: $object[$name]}
|
|
42
|
+
else
|
|
43
|
+
{present: true, valid: false, type: "non-finite-number"}
|
|
44
|
+
end
|
|
45
|
+
else
|
|
46
|
+
{present: true, valid: false, type: $type}
|
|
47
|
+
end
|
|
48
|
+
else
|
|
49
|
+
{present: false, valid: false, type: "missing"}
|
|
50
|
+
end;
|
|
51
|
+
(.monitor.thresholds | if type == "object" then . else {} end) as $t |
|
|
52
|
+
{
|
|
53
|
+
"monitor.thresholds.minEvents24h": threshold($t; "minEvents24h"),
|
|
54
|
+
"monitor.thresholds.sentryMinEvents24h": threshold($t; "sentryMinEvents24h"),
|
|
55
|
+
"monitor.thresholds.faultRatePct": threshold($t; "faultRatePct"),
|
|
56
|
+
"monitor.thresholds.xrayFaultRatePct": threshold($t; "xrayFaultRatePct")
|
|
57
|
+
}' .lisa.config.json
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
A nonzero `jq` result fails threshold collection; do not treat an uninspectable
|
|
61
|
+
present file as if it were absent.
|
|
62
|
+
|
|
63
|
+
For each exact path, keep the raw `jq` presence/value result from each file;
|
|
64
|
+
do not inject defaults during this merge. Local presence overrides committed
|
|
65
|
+
presence per path. After that merge, resolve the current key before the legacy
|
|
66
|
+
key, then use default `1` for `monitor.thresholds.minEvents24h` or default `5`
|
|
67
|
+
for `monitor.thresholds.faultRatePct`. Current key wins over legacy key even
|
|
68
|
+
when its configured value is invalid.
|
|
69
|
+
|
|
70
|
+
Every configured threshold must be a finite JSON number. If the selected path
|
|
71
|
+
is null, a string, a boolean, an object, an array, or otherwise non-finite,
|
|
72
|
+
fail threshold collection and report the exact path and source without echoing
|
|
73
|
+
the invalid value; never fall through to a legacy value or default. Never quote
|
|
74
|
+
or report either whole config. The fixed `jq` projection itself must redact
|
|
75
|
+
invalid configured content: it emits only presence, validity, and a fixed type
|
|
76
|
+
classification, and includes the numeric `value` field only for a finite number.
|
|
77
|
+
For a valid resolution, the monitor report must include the resolved value and
|
|
78
|
+
source. Report only a validated numeric resolved value and one fixed source enum:
|
|
79
|
+
`local-current`, `committed-current`, `local-legacy`, `committed-legacy`, or
|
|
80
|
+
`default`.
|
|
26
81
|
|
|
27
82
|
## Orchestration: agent team
|
|
28
83
|
|
|
@@ -15,14 +15,69 @@ Spot-check application health, **audit observability completeness**, and **file
|
|
|
15
15
|
- `--all-gaps` — also file `recommended`-tier gaps (session replay, product analytics, etc.), not just `core`. Does not change anomaly thresholds.
|
|
16
16
|
- `max_candidates=<n>` — cap tickets filed this run (default 20; config `monitor.maxCandidates`).
|
|
17
17
|
|
|
18
|
-
##
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
18
|
+
## Monitor threshold compatibility
|
|
19
|
+
|
|
20
|
+
Before resolving anomaly thresholds, inspect the committed
|
|
21
|
+
`.lisa.config.json` and local `.lisa.config.local.json` separately with `jq`.
|
|
22
|
+
Use a literal, fixed-path projection that returns presence and value for only
|
|
23
|
+
these four exact paths; do not use `Read`, `cat`, interpolation, or a filter
|
|
24
|
+
that emits either entire config into agent context:
|
|
25
|
+
|
|
26
|
+
- `monitor.thresholds.minEvents24h`, then
|
|
27
|
+
`monitor.thresholds.sentryMinEvents24h`.
|
|
28
|
+
- `monitor.thresholds.faultRatePct`, then
|
|
29
|
+
`monitor.thresholds.xrayFaultRatePct`.
|
|
30
|
+
|
|
31
|
+
Run this fixed filter once with literal final argument `.lisa.config.json` and
|
|
32
|
+
once with literal final argument `.lisa.config.local.json` when the respective
|
|
33
|
+
file exists:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
jq 'def threshold($object; $name):
|
|
37
|
+
if ($object | has($name)) then
|
|
38
|
+
($object[$name] | type) as $type |
|
|
39
|
+
if $type == "number" then
|
|
40
|
+
if ($object[$name] | isfinite and (isnan | not)) then
|
|
41
|
+
{present: true, valid: true, type: "number", value: $object[$name]}
|
|
42
|
+
else
|
|
43
|
+
{present: true, valid: false, type: "non-finite-number"}
|
|
44
|
+
end
|
|
45
|
+
else
|
|
46
|
+
{present: true, valid: false, type: $type}
|
|
47
|
+
end
|
|
48
|
+
else
|
|
49
|
+
{present: false, valid: false, type: "missing"}
|
|
50
|
+
end;
|
|
51
|
+
(.monitor.thresholds | if type == "object" then . else {} end) as $t |
|
|
52
|
+
{
|
|
53
|
+
"monitor.thresholds.minEvents24h": threshold($t; "minEvents24h"),
|
|
54
|
+
"monitor.thresholds.sentryMinEvents24h": threshold($t; "sentryMinEvents24h"),
|
|
55
|
+
"monitor.thresholds.faultRatePct": threshold($t; "faultRatePct"),
|
|
56
|
+
"monitor.thresholds.xrayFaultRatePct": threshold($t; "xrayFaultRatePct")
|
|
57
|
+
}' .lisa.config.json
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
A nonzero `jq` result fails threshold collection; do not treat an uninspectable
|
|
61
|
+
present file as if it were absent.
|
|
62
|
+
|
|
63
|
+
For each exact path, keep the raw `jq` presence/value result from each file;
|
|
64
|
+
do not inject defaults during this merge. Local presence overrides committed
|
|
65
|
+
presence per path. After that merge, resolve the current key before the legacy
|
|
66
|
+
key, then use default `1` for `monitor.thresholds.minEvents24h` or default `5`
|
|
67
|
+
for `monitor.thresholds.faultRatePct`. Current key wins over legacy key even
|
|
68
|
+
when its configured value is invalid.
|
|
69
|
+
|
|
70
|
+
Every configured threshold must be a finite JSON number. If the selected path
|
|
71
|
+
is null, a string, a boolean, an object, an array, or otherwise non-finite,
|
|
72
|
+
fail threshold collection and report the exact path and source without echoing
|
|
73
|
+
the invalid value; never fall through to a legacy value or default. Never quote
|
|
74
|
+
or report either whole config. The fixed `jq` projection itself must redact
|
|
75
|
+
invalid configured content: it emits only presence, validity, and a fixed type
|
|
76
|
+
classification, and includes the numeric `value` field only for a finite number.
|
|
77
|
+
For a valid resolution, the monitor report must include the resolved value and
|
|
78
|
+
source. Report only a validated numeric resolved value and one fixed source enum:
|
|
79
|
+
`local-current`, `committed-current`, `local-legacy`, `committed-legacy`, or
|
|
80
|
+
`default`.
|
|
26
81
|
|
|
27
82
|
## Orchestration: agent team
|
|
28
83
|
|
|
@@ -15,14 +15,69 @@ Spot-check application health, **audit observability completeness**, and **file
|
|
|
15
15
|
- `--all-gaps` — also file `recommended`-tier gaps (session replay, product analytics, etc.), not just `core`. Does not change anomaly thresholds.
|
|
16
16
|
- `max_candidates=<n>` — cap tickets filed this run (default 20; config `monitor.maxCandidates`).
|
|
17
17
|
|
|
18
|
-
##
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
18
|
+
## Monitor threshold compatibility
|
|
19
|
+
|
|
20
|
+
Before resolving anomaly thresholds, inspect the committed
|
|
21
|
+
`.lisa.config.json` and local `.lisa.config.local.json` separately with `jq`.
|
|
22
|
+
Use a literal, fixed-path projection that returns presence and value for only
|
|
23
|
+
these four exact paths; do not use `Read`, `cat`, interpolation, or a filter
|
|
24
|
+
that emits either entire config into agent context:
|
|
25
|
+
|
|
26
|
+
- `monitor.thresholds.minEvents24h`, then
|
|
27
|
+
`monitor.thresholds.sentryMinEvents24h`.
|
|
28
|
+
- `monitor.thresholds.faultRatePct`, then
|
|
29
|
+
`monitor.thresholds.xrayFaultRatePct`.
|
|
30
|
+
|
|
31
|
+
Run this fixed filter once with literal final argument `.lisa.config.json` and
|
|
32
|
+
once with literal final argument `.lisa.config.local.json` when the respective
|
|
33
|
+
file exists:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
jq 'def threshold($object; $name):
|
|
37
|
+
if ($object | has($name)) then
|
|
38
|
+
($object[$name] | type) as $type |
|
|
39
|
+
if $type == "number" then
|
|
40
|
+
if ($object[$name] | isfinite and (isnan | not)) then
|
|
41
|
+
{present: true, valid: true, type: "number", value: $object[$name]}
|
|
42
|
+
else
|
|
43
|
+
{present: true, valid: false, type: "non-finite-number"}
|
|
44
|
+
end
|
|
45
|
+
else
|
|
46
|
+
{present: true, valid: false, type: $type}
|
|
47
|
+
end
|
|
48
|
+
else
|
|
49
|
+
{present: false, valid: false, type: "missing"}
|
|
50
|
+
end;
|
|
51
|
+
(.monitor.thresholds | if type == "object" then . else {} end) as $t |
|
|
52
|
+
{
|
|
53
|
+
"monitor.thresholds.minEvents24h": threshold($t; "minEvents24h"),
|
|
54
|
+
"monitor.thresholds.sentryMinEvents24h": threshold($t; "sentryMinEvents24h"),
|
|
55
|
+
"monitor.thresholds.faultRatePct": threshold($t; "faultRatePct"),
|
|
56
|
+
"monitor.thresholds.xrayFaultRatePct": threshold($t; "xrayFaultRatePct")
|
|
57
|
+
}' .lisa.config.json
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
A nonzero `jq` result fails threshold collection; do not treat an uninspectable
|
|
61
|
+
present file as if it were absent.
|
|
62
|
+
|
|
63
|
+
For each exact path, keep the raw `jq` presence/value result from each file;
|
|
64
|
+
do not inject defaults during this merge. Local presence overrides committed
|
|
65
|
+
presence per path. After that merge, resolve the current key before the legacy
|
|
66
|
+
key, then use default `1` for `monitor.thresholds.minEvents24h` or default `5`
|
|
67
|
+
for `monitor.thresholds.faultRatePct`. Current key wins over legacy key even
|
|
68
|
+
when its configured value is invalid.
|
|
69
|
+
|
|
70
|
+
Every configured threshold must be a finite JSON number. If the selected path
|
|
71
|
+
is null, a string, a boolean, an object, an array, or otherwise non-finite,
|
|
72
|
+
fail threshold collection and report the exact path and source without echoing
|
|
73
|
+
the invalid value; never fall through to a legacy value or default. Never quote
|
|
74
|
+
or report either whole config. The fixed `jq` projection itself must redact
|
|
75
|
+
invalid configured content: it emits only presence, validity, and a fixed type
|
|
76
|
+
classification, and includes the numeric `value` field only for a finite number.
|
|
77
|
+
For a valid resolution, the monitor report must include the resolved value and
|
|
78
|
+
source. Report only a validated numeric resolved value and one fixed source enum:
|
|
79
|
+
`local-current`, `committed-current`, `local-legacy`, `committed-legacy`, or
|
|
80
|
+
`default`.
|
|
26
81
|
|
|
27
82
|
## Orchestration: agent team
|
|
28
83
|
|
|
@@ -15,14 +15,69 @@ Spot-check application health, **audit observability completeness**, and **file
|
|
|
15
15
|
- `--all-gaps` — also file `recommended`-tier gaps (session replay, product analytics, etc.), not just `core`. Does not change anomaly thresholds.
|
|
16
16
|
- `max_candidates=<n>` — cap tickets filed this run (default 20; config `monitor.maxCandidates`).
|
|
17
17
|
|
|
18
|
-
##
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
18
|
+
## Monitor threshold compatibility
|
|
19
|
+
|
|
20
|
+
Before resolving anomaly thresholds, inspect the committed
|
|
21
|
+
`.lisa.config.json` and local `.lisa.config.local.json` separately with `jq`.
|
|
22
|
+
Use a literal, fixed-path projection that returns presence and value for only
|
|
23
|
+
these four exact paths; do not use `Read`, `cat`, interpolation, or a filter
|
|
24
|
+
that emits either entire config into agent context:
|
|
25
|
+
|
|
26
|
+
- `monitor.thresholds.minEvents24h`, then
|
|
27
|
+
`monitor.thresholds.sentryMinEvents24h`.
|
|
28
|
+
- `monitor.thresholds.faultRatePct`, then
|
|
29
|
+
`monitor.thresholds.xrayFaultRatePct`.
|
|
30
|
+
|
|
31
|
+
Run this fixed filter once with literal final argument `.lisa.config.json` and
|
|
32
|
+
once with literal final argument `.lisa.config.local.json` when the respective
|
|
33
|
+
file exists:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
jq 'def threshold($object; $name):
|
|
37
|
+
if ($object | has($name)) then
|
|
38
|
+
($object[$name] | type) as $type |
|
|
39
|
+
if $type == "number" then
|
|
40
|
+
if ($object[$name] | isfinite and (isnan | not)) then
|
|
41
|
+
{present: true, valid: true, type: "number", value: $object[$name]}
|
|
42
|
+
else
|
|
43
|
+
{present: true, valid: false, type: "non-finite-number"}
|
|
44
|
+
end
|
|
45
|
+
else
|
|
46
|
+
{present: true, valid: false, type: $type}
|
|
47
|
+
end
|
|
48
|
+
else
|
|
49
|
+
{present: false, valid: false, type: "missing"}
|
|
50
|
+
end;
|
|
51
|
+
(.monitor.thresholds | if type == "object" then . else {} end) as $t |
|
|
52
|
+
{
|
|
53
|
+
"monitor.thresholds.minEvents24h": threshold($t; "minEvents24h"),
|
|
54
|
+
"monitor.thresholds.sentryMinEvents24h": threshold($t; "sentryMinEvents24h"),
|
|
55
|
+
"monitor.thresholds.faultRatePct": threshold($t; "faultRatePct"),
|
|
56
|
+
"monitor.thresholds.xrayFaultRatePct": threshold($t; "xrayFaultRatePct")
|
|
57
|
+
}' .lisa.config.json
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
A nonzero `jq` result fails threshold collection; do not treat an uninspectable
|
|
61
|
+
present file as if it were absent.
|
|
62
|
+
|
|
63
|
+
For each exact path, keep the raw `jq` presence/value result from each file;
|
|
64
|
+
do not inject defaults during this merge. Local presence overrides committed
|
|
65
|
+
presence per path. After that merge, resolve the current key before the legacy
|
|
66
|
+
key, then use default `1` for `monitor.thresholds.minEvents24h` or default `5`
|
|
67
|
+
for `monitor.thresholds.faultRatePct`. Current key wins over legacy key even
|
|
68
|
+
when its configured value is invalid.
|
|
69
|
+
|
|
70
|
+
Every configured threshold must be a finite JSON number. If the selected path
|
|
71
|
+
is null, a string, a boolean, an object, an array, or otherwise non-finite,
|
|
72
|
+
fail threshold collection and report the exact path and source without echoing
|
|
73
|
+
the invalid value; never fall through to a legacy value or default. Never quote
|
|
74
|
+
or report either whole config. The fixed `jq` projection itself must redact
|
|
75
|
+
invalid configured content: it emits only presence, validity, and a fixed type
|
|
76
|
+
classification, and includes the numeric `value` field only for a finite number.
|
|
77
|
+
For a valid resolution, the monitor report must include the resolved value and
|
|
78
|
+
source. Report only a validated numeric resolved value and one fixed source enum:
|
|
79
|
+
`local-current`, `committed-current`, `local-legacy`, `committed-legacy`, or
|
|
80
|
+
`default`.
|
|
26
81
|
|
|
27
82
|
## Orchestration: agent team
|
|
28
83
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "2.217.
|
|
3
|
+
"version": "2.217.4",
|
|
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": "2.217.
|
|
3
|
+
"version": "2.217.4",
|
|
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": "2.217.
|
|
3
|
+
"version": "2.217.4",
|
|
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": "2.217.
|
|
3
|
+
"version": "2.217.4",
|
|
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": "2.217.
|
|
3
|
+
"version": "2.217.4",
|
|
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"
|
|
@@ -15,14 +15,69 @@ Spot-check application health, **audit observability completeness**, and **file
|
|
|
15
15
|
- `--all-gaps` — also file `recommended`-tier gaps (session replay, product analytics, etc.), not just `core`. Does not change anomaly thresholds.
|
|
16
16
|
- `max_candidates=<n>` — cap tickets filed this run (default 20; config `monitor.maxCandidates`).
|
|
17
17
|
|
|
18
|
-
##
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
18
|
+
## Monitor threshold compatibility
|
|
19
|
+
|
|
20
|
+
Before resolving anomaly thresholds, inspect the committed
|
|
21
|
+
`.lisa.config.json` and local `.lisa.config.local.json` separately with `jq`.
|
|
22
|
+
Use a literal, fixed-path projection that returns presence and value for only
|
|
23
|
+
these four exact paths; do not use `Read`, `cat`, interpolation, or a filter
|
|
24
|
+
that emits either entire config into agent context:
|
|
25
|
+
|
|
26
|
+
- `monitor.thresholds.minEvents24h`, then
|
|
27
|
+
`monitor.thresholds.sentryMinEvents24h`.
|
|
28
|
+
- `monitor.thresholds.faultRatePct`, then
|
|
29
|
+
`monitor.thresholds.xrayFaultRatePct`.
|
|
30
|
+
|
|
31
|
+
Run this fixed filter once with literal final argument `.lisa.config.json` and
|
|
32
|
+
once with literal final argument `.lisa.config.local.json` when the respective
|
|
33
|
+
file exists:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
jq 'def threshold($object; $name):
|
|
37
|
+
if ($object | has($name)) then
|
|
38
|
+
($object[$name] | type) as $type |
|
|
39
|
+
if $type == "number" then
|
|
40
|
+
if ($object[$name] | isfinite and (isnan | not)) then
|
|
41
|
+
{present: true, valid: true, type: "number", value: $object[$name]}
|
|
42
|
+
else
|
|
43
|
+
{present: true, valid: false, type: "non-finite-number"}
|
|
44
|
+
end
|
|
45
|
+
else
|
|
46
|
+
{present: true, valid: false, type: $type}
|
|
47
|
+
end
|
|
48
|
+
else
|
|
49
|
+
{present: false, valid: false, type: "missing"}
|
|
50
|
+
end;
|
|
51
|
+
(.monitor.thresholds | if type == "object" then . else {} end) as $t |
|
|
52
|
+
{
|
|
53
|
+
"monitor.thresholds.minEvents24h": threshold($t; "minEvents24h"),
|
|
54
|
+
"monitor.thresholds.sentryMinEvents24h": threshold($t; "sentryMinEvents24h"),
|
|
55
|
+
"monitor.thresholds.faultRatePct": threshold($t; "faultRatePct"),
|
|
56
|
+
"monitor.thresholds.xrayFaultRatePct": threshold($t; "xrayFaultRatePct")
|
|
57
|
+
}' .lisa.config.json
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
A nonzero `jq` result fails threshold collection; do not treat an uninspectable
|
|
61
|
+
present file as if it were absent.
|
|
62
|
+
|
|
63
|
+
For each exact path, keep the raw `jq` presence/value result from each file;
|
|
64
|
+
do not inject defaults during this merge. Local presence overrides committed
|
|
65
|
+
presence per path. After that merge, resolve the current key before the legacy
|
|
66
|
+
key, then use default `1` for `monitor.thresholds.minEvents24h` or default `5`
|
|
67
|
+
for `monitor.thresholds.faultRatePct`. Current key wins over legacy key even
|
|
68
|
+
when its configured value is invalid.
|
|
69
|
+
|
|
70
|
+
Every configured threshold must be a finite JSON number. If the selected path
|
|
71
|
+
is null, a string, a boolean, an object, an array, or otherwise non-finite,
|
|
72
|
+
fail threshold collection and report the exact path and source without echoing
|
|
73
|
+
the invalid value; never fall through to a legacy value or default. Never quote
|
|
74
|
+
or report either whole config. The fixed `jq` projection itself must redact
|
|
75
|
+
invalid configured content: it emits only presence, validity, and a fixed type
|
|
76
|
+
classification, and includes the numeric `value` field only for a finite number.
|
|
77
|
+
For a valid resolution, the monitor report must include the resolved value and
|
|
78
|
+
source. Report only a validated numeric resolved value and one fixed source enum:
|
|
79
|
+
`local-current`, `committed-current`, `local-legacy`, `committed-legacy`, or
|
|
80
|
+
`default`.
|
|
26
81
|
|
|
27
82
|
## Orchestration: agent team
|
|
28
83
|
|