@codyswann/lisa 3.31.2 → 3.31.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/all/copy-overwrite/scripts/lisa-floor-collisions.mjs +1 -1
- package/all/copy-overwrite/scripts/lisa-gates.mjs +1 -1
- package/dist/cli/doctor-apply-freshness.js +1 -1
- package/dist/cli/doctor-worktree-hygiene.d.ts +1 -1
- package/dist/cli/doctor-worktree-hygiene.js +1 -1
- package/dist/core/apply-receipt.js +1 -1
- package/dist/core/guard-capabilities.d.ts +2 -2
- package/dist/core/guard-capabilities.js +2 -2
- package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
- package/dist/core/lisa-owned-hash-ledger.js +6 -0
- package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
- package/dist/core/lisa-owned-provenance.js +3 -3
- package/dist/core/upstream-evidence-manifest.js +22 -22
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/dist/migrations/ensure-lisa-postinstall.d.ts +1 -1
- package/dist/migrations/ensure-lisa-postinstall.js +1 -1
- package/dist/strategies/copy-overwrite.d.ts +1 -1
- package/dist/strategies/copy-overwrite.js +1 -1
- package/dist/utils/yaml.js +1 -1
- package/eslint-plugin-code-organization/README.md +1 -1
- package/expo/copy-overwrite/scripts/classify-maestro-failures.mjs +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-detect-tooling/SKILL.md +1 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-drive-pr-to-merge/SKILL.md +3 -3
- package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/SKILL.md +1 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +2 -2
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-notion/SKILL.md +2 -2
- package/plugins/lisa/rules/reference/claim-time-guards.md +1 -1
- package/plugins/lisa/skills/lisa-detect-tooling/SKILL.md +1 -1
- package/plugins/lisa/skills/lisa-drive-pr-to-merge/SKILL.md +3 -3
- package/plugins/lisa/skills/lisa-secrets-access/SKILL.md +1 -1
- package/plugins/lisa/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +2 -2
- package/plugins/lisa/skills/lisa-setup-notion/SKILL.md +2 -2
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-detect-tooling/SKILL.md +1 -1
- package/plugins/lisa-agy/skills/lisa-drive-pr-to-merge/SKILL.md +3 -3
- package/plugins/lisa-agy/skills/lisa-secrets-access/SKILL.md +1 -1
- package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +2 -2
- package/plugins/lisa-agy/skills/lisa-setup-notion/SKILL.md +2 -2
- 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/rules/reference/claim-time-guards.md +1 -1
- package/plugins/lisa-copilot/skills/lisa-detect-tooling/SKILL.md +1 -1
- package/plugins/lisa-copilot/skills/lisa-drive-pr-to-merge/SKILL.md +3 -3
- package/plugins/lisa-copilot/skills/lisa-secrets-access/SKILL.md +1 -1
- package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +2 -2
- package/plugins/lisa-copilot/skills/lisa-setup-notion/SKILL.md +2 -2
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/rules/claim-time-guards-reference.mdc +1 -1
- package/plugins/lisa-cursor/skills/lisa-detect-tooling/SKILL.md +1 -1
- package/plugins/lisa-cursor/skills/lisa-drive-pr-to-merge/SKILL.md +3 -3
- package/plugins/lisa-cursor/skills/lisa-secrets-access/SKILL.md +1 -1
- package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +2 -2
- package/plugins/lisa-cursor/skills/lisa-setup-notion/SKILL.md +2 -2
- 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/rules/reference/claim-time-guards.md +1 -1
- package/plugins/src/base/skills/lisa-detect-tooling/SKILL.md +1 -1
- package/plugins/src/base/skills/lisa-drive-pr-to-merge/SKILL.md +3 -3
- package/plugins/src/base/skills/lisa-secrets-access/SKILL.md +1 -1
- package/plugins/src/base/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +2 -2
- package/plugins/src/base/skills/lisa-setup-notion/SKILL.md +2 -2
- package/scripts/lisa-assert-eas-profile.mjs +1 -1
- package/typescript/copy-overwrite/scripts/check-nightly-e2e-health.mjs +7 -7
- package/typescript/copy-overwrite/scripts/check-skipped-required-checks.mjs +4 -4
- package/typescript/copy-overwrite/scripts/nightly-e2e-suites.schema.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "3.31.
|
|
3
|
+
"version": "3.31.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": "3.31.
|
|
3
|
+
"version": "3.31.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": "3.31.
|
|
3
|
+
"version": "3.31.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": "3.31.
|
|
3
|
+
"version": "3.31.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": "3.31.
|
|
3
|
+
"version": "3.31.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
|
# Claim-Time Guards
|
|
2
2
|
|
|
3
|
-
Two guards that run when build-intake claims a ready item. Both come from
|
|
3
|
+
Two guards that run when build-intake claims a ready item. Both come from acmeorgb's hand-rolled `sprint-loop` and both address failures actually observed there — an item built twice because it had already shipped, and a loop burning cycles re-attempting an item that was never going to succeed.
|
|
4
4
|
|
|
5
5
|
It is a **single vendor-neutral contract** consumed by all three build-intake skills (`lisa-github-build-intake`, `lisa-jira-build-intake`, `lisa-linear-build-intake`). Each arm cites this slug in its claim step rather than growing its own copy, exactly as the arms cite `leaf-only-lifecycle`, `repo-scope-split`, `rejection-detection`, and `claim-archaeology`. One slug is what keeps a guard that fires on GitHub from being absent on Linear.
|
|
6
6
|
|
|
@@ -57,7 +57,7 @@ Discovery only works if "what does this run" can be answered from shell text wit
|
|
|
57
57
|
|
|
58
58
|
**`$( )` restarts the quoting context.** In `"$(printf '%s' "$JSON" | node -e '…')"`, quotes inside the substitution pair among themselves. A flat scanner falls out of phase on the first one and starts reporting the payload's own string literals.
|
|
59
59
|
|
|
60
|
-
Against Lisa and the three
|
|
60
|
+
Against Lisa and the three AcmeOrgD repositories, what survives is `gitleaks`, `jq`, `gtimeout` and `eas` — every one a real, undeclared invocation, with no false positives.
|
|
61
61
|
|
|
62
62
|
## What it will not do
|
|
63
63
|
|
|
@@ -162,7 +162,7 @@ ends in between — turns exhausted, job timeout, or you concluding the work whi
|
|
|
162
162
|
checks are still pending — the latch stays off and nothing restores it. The PR is
|
|
163
163
|
left WORSE OFF THAN IF THIS SKILL HAD NEVER RUN: it has lost the mechanism that
|
|
164
164
|
merges it while no agent is watching, and the run reports success. Measured on
|
|
165
|
-
`
|
|
165
|
+
`acmeorgc/frontend#282`, the latch went off 14s before the fix commit and the
|
|
166
166
|
PR sat 26 minutes after going green, against ~3 minutes for PRs this skill never
|
|
167
167
|
touched.
|
|
168
168
|
|
|
@@ -364,7 +364,7 @@ Ancestry proves your code is *in* the merged branch; it does **not** prove
|
|
|
364
364
|
anything deployed. GitHub can **suppress the `on: push` event for a merge commit
|
|
365
365
|
created by auto-merge or a bot token** (`GITHUB_TOKEN`), so the deploy workflow
|
|
366
366
|
fires **zero** runs — no run, not even a `startup_failure` — while the ancestry
|
|
367
|
-
check above stays green. Incident of record:
|
|
367
|
+
check above stays green. Incident of record: AcmeOrgD/frontend **TUN-186** (PR #67)
|
|
368
368
|
merged to `dev` via auto-merge; the merge commit `1b3f836` produced **no**
|
|
369
369
|
`deploy.yml` run, and only the next human push `d1fe18c` (which carries `1b3f836`
|
|
370
370
|
as an ancestor) actually shipped it. **Never report shipped on ancestry alone.**
|
|
@@ -423,7 +423,7 @@ of section 2 are diagnose-only).
|
|
|
423
423
|
|
|
424
424
|
Linear's GitHub integration completes a linked Issue on merge to **any** branch
|
|
425
425
|
— branch-name linkage alone triggers it, even when the PR body carries only the
|
|
426
|
-
non-closing `Linear: <ID>` reference form (incident of record:
|
|
426
|
+
non-closing `Linear: <ID>` reference form (incident of record: AcmeOrgD backend
|
|
427
427
|
PR #207 merged to `dev`; TUN-256 auto-completed and had to be manually
|
|
428
428
|
reverted). Run this step **as soon as the PR reports `MERGED`**, before the
|
|
429
429
|
deploy-run verification above can terminate the flow — a `blocked:deploy`
|
|
@@ -239,7 +239,7 @@ An org secret defaults to `--visibility private`. `all` reaches public repositor
|
|
|
239
239
|
```json
|
|
240
240
|
"propagating": [
|
|
241
241
|
"LINEAR_API_KEY",
|
|
242
|
-
{ "name": "NPM_TOKEN", "targets": ["
|
|
242
|
+
{ "name": "NPM_TOKEN", "targets": ["AcmeOrgD", "AcmeOrgD/wiki"] }
|
|
243
243
|
]
|
|
244
244
|
```
|
|
245
245
|
|
|
@@ -248,8 +248,8 @@ export function installAwsProfiles(bundle, options = {}) {
|
|
|
248
248
|
// Refuse to write a profile name the operator already uses outside our block.
|
|
249
249
|
//
|
|
250
250
|
// AWS does not error on a duplicate `[profile x]` — it resolves one and
|
|
251
|
-
// ignores the other. So writing `
|
|
252
|
-
// `
|
|
251
|
+
// ignores the other. So writing `acmeorgd-dev` next to an operator's existing SSO
|
|
252
|
+
// `acmeorgd-dev` would silently run some calls as the wrong identity, which is
|
|
253
253
|
// worse than either winning outright. Merging protects their sections from
|
|
254
254
|
// being deleted; this protects them from being shadowed.
|
|
255
255
|
//
|
|
@@ -51,7 +51,7 @@ Print instructions for the user:
|
|
|
51
51
|
|
|
52
52
|
The user picks a stable identifier for this workspace. Two options:
|
|
53
53
|
|
|
54
|
-
- **Workspace name** (human-readable, e.g., `
|
|
54
|
+
- **Workspace name** (human-readable, e.g., `AcmeOrgB`). Easy to recognize, can be ambiguous if a workspace is renamed in Notion. Recommended.
|
|
55
55
|
- **Workspace UUID** (returned by Notion's API). Stable but opaque.
|
|
56
56
|
|
|
57
57
|
Default to the workspace name. After the user stores the token (Step 4), Step 5's `/users/me` call surfaces the actual `bot.workspace_name`; if it differs from what the user typed (capitalization, trailing whitespace), prompt to confirm.
|
|
@@ -60,7 +60,7 @@ Default to the workspace name. After the user stores the token (Step 4), Step 5'
|
|
|
60
60
|
WORKSPACE=$(jq -r '.notion.workspaceId // empty' .lisa.config.json 2>/dev/null)
|
|
61
61
|
if [ -z "$WORKSPACE" ]; then
|
|
62
62
|
# Prompt the user — accept any non-empty string. They pick the slug; we just store it.
|
|
63
|
-
read -p "Workspace identifier (any stable slug, e.g. '
|
|
63
|
+
read -p "Workspace identifier (any stable slug, e.g. 'acme-org-b'): " WORKSPACE
|
|
64
64
|
fi
|
|
65
65
|
```
|
|
66
66
|
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
* ## Why this does not use `JSON.parse`, and does not read one profile
|
|
22
22
|
*
|
|
23
23
|
* `eas.json` is not required to be strict JSON — trailing commas are common
|
|
24
|
-
* and EAS accepts them. A real consumer file (`
|
|
24
|
+
* and EAS accepts them. A real consumer file (`acmeorgb/frontend-v2`)
|
|
25
25
|
* has one on line 16, so a strict parse would crash this guard on the very
|
|
26
26
|
* repository the standard was extracted from.
|
|
27
27
|
*
|
|
@@ -73,8 +73,8 @@
|
|
|
73
73
|
* because it is the right vocabulary. What is NOT kept is gemini's
|
|
74
74
|
* `unknown`-passes-with-a-warning: that is a fail-open path, and here `unknown`
|
|
75
75
|
* fails once bootstrap closes. The bypass model and the context-pinning
|
|
76
|
-
* discipline come from
|
|
77
|
-
*
|
|
76
|
+
* discipline come from acmeorgd (TUN-525 / TUN-402). The job-name filter comes from
|
|
77
|
+
* acmeorga's `nightly-e2e-lib.sh`, whose unbounded bootstrap is what §4 of the
|
|
78
78
|
* contract time-boxes.
|
|
79
79
|
*
|
|
80
80
|
* @module scripts/check-nightly-e2e-health
|
|
@@ -549,7 +549,7 @@ export function validateSuites(raw) {
|
|
|
549
549
|
days > BOOTSTRAP_ABSOLUTE_MAX_DAYS
|
|
550
550
|
) {
|
|
551
551
|
throw new GateConfigError(
|
|
552
|
-
`${where}: \`grace_days\` must be a number in (0, ${BOOTSTRAP_ABSOLUTE_MAX_DAYS}]. A grace that outlives the bootstrap ceiling IS
|
|
552
|
+
`${where}: \`grace_days\` must be a number in (0, ${BOOTSTRAP_ABSOLUTE_MAX_DAYS}]. A grace that outlives the bootstrap ceiling IS acmeorga's forever-bootstrap, whatever it is called — rejected rather than clamped, so widening it is a reviewable act.`
|
|
553
553
|
);
|
|
554
554
|
}
|
|
555
555
|
}
|
|
@@ -695,7 +695,7 @@ export function assessSuite(suite, observation, context) {
|
|
|
695
695
|
// `platform: android` leaves the iOS job skipped while the run still
|
|
696
696
|
// concludes `success`. Read as a run conclusion alone, that filtered
|
|
697
697
|
// dispatch cleared a required merge gate for an arm that never executed —
|
|
698
|
-
//
|
|
698
|
+
// acmeorga's trap, a suite declaring itself green on evidence it never
|
|
699
699
|
// gathered. The same shape reaches the CRON path: with
|
|
700
700
|
// `require_prerequisites: false` and no EXPO_TOKEN, every job skips and the
|
|
701
701
|
// run is still `success`.
|
|
@@ -829,7 +829,7 @@ export function resolveBootstrap(until, maxDays, now) {
|
|
|
829
829
|
const days = (parsed - now.getTime()) / 86_400_000;
|
|
830
830
|
if (days > maxDays) {
|
|
831
831
|
throw new GateConfigError(
|
|
832
|
-
`\`bootstrap_until\` (${until}) is ${Math.ceil(days)} days out, beyond \`bootstrap_max_days\` (${maxDays}). A bootstrap window that can be extended by editing one string is
|
|
832
|
+
`\`bootstrap_until\` (${until}) is ${Math.ceil(days)} days out, beyond \`bootstrap_max_days\` (${maxDays}). A bootstrap window that can be extended by editing one string is acmeorga's forever-bootstrap: a suite that never runs passes forever. Raise the cap deliberately, in the same review, or bring the date in.`
|
|
833
833
|
);
|
|
834
834
|
}
|
|
835
835
|
return Object.freeze({
|
|
@@ -849,7 +849,7 @@ export function resolveBootstrap(until, maxDays, now) {
|
|
|
849
849
|
* audited bypass. Neither is proportionate to the routine act of adding a
|
|
850
850
|
* suite, and both teach people that the gate is something to get around.
|
|
851
851
|
*
|
|
852
|
-
* What keeps this from becoming
|
|
852
|
+
* What keeps this from becoming acmeorga's forever-bootstrap is the ANCHOR.
|
|
853
853
|
* The window is not a date somebody picks; it is `first_seen + grace_days`,
|
|
854
854
|
* and `first_seen` MAY NOT BE IN THE FUTURE. A future anchor would make this a
|
|
855
855
|
* hand-typed expiry under another name, extendable by one string edit forever —
|
|
@@ -1279,7 +1279,7 @@ export function formatReport(verdict, context) {
|
|
|
1279
1279
|
* implied. The reporter asks it separately and on purpose: closing a tracking
|
|
1280
1280
|
* issue is a stronger claim than letting a pull request through — it announces
|
|
1281
1281
|
* that a suite is healthy — and it is the one action that must never fire on a
|
|
1282
|
-
* run that skipped part of itself.
|
|
1282
|
+
* run that skipped part of itself. acmeorga's trap, in their words: *one spec
|
|
1283
1283
|
* reporting success would close the tracking issue while the failures that
|
|
1284
1284
|
* opened it went unrun.* Asking the question here means a future loosening of
|
|
1285
1285
|
* row 26 cannot silently re-open that hole.
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* check-skipped-required-checks — refuse a required status check that satisfies
|
|
7
7
|
* without proving anything.
|
|
8
8
|
*
|
|
9
|
-
* Shipped by Lisa (copy-overwrite). Generalized from
|
|
9
|
+
* Shipped by Lisa (copy-overwrite). Generalized from acmeorgd's TUN-402 guard: the
|
|
10
10
|
* logic is Lisa's and gets updated fleet-wide, the two REVIEWED SNAPSHOTS it
|
|
11
11
|
* rests on are per-repo and live in `.github/required-checks.json` (create-only,
|
|
12
12
|
* yours to edit).
|
|
@@ -88,7 +88,7 @@
|
|
|
88
88
|
* nobody ever ran.
|
|
89
89
|
*
|
|
90
90
|
* This is measured, not theoretical, in at least two repositories in this
|
|
91
|
-
* portfolio —
|
|
91
|
+
* portfolio — acmeorgd (`🔍 Quality Checks / 🧪 Run E2E Tests`, TUN-402) and gemini
|
|
92
92
|
* (ruleset 14297996 requiring `🔍 Quality Checks / 🎭 Playwright E2E Tests`,
|
|
93
93
|
* which `ci.yml` skipped unconditionally, so the ruleset enforced nothing).
|
|
94
94
|
*
|
|
@@ -108,7 +108,7 @@
|
|
|
108
108
|
* That mutual policing has one blind spot, and `--remote` exists for it: two
|
|
109
109
|
* snapshots in one repo can only catch each other drifting from the CODE.
|
|
110
110
|
* Neither can see the ruleset itself change in the admin console — which is
|
|
111
|
-
* exactly how
|
|
111
|
+
* exactly how acmeorgd's list silently went from ten contexts to eleven, with every
|
|
112
112
|
* test still green, because the "independent" transcription was made from the
|
|
113
113
|
* same reading at the same moment.
|
|
114
114
|
*
|
|
@@ -1032,7 +1032,7 @@ export function fetchLiveRequiredContexts(ruleset) {
|
|
|
1032
1032
|
* Diffs the committed snapshot against the live ruleset, in BOTH directions.
|
|
1033
1033
|
*
|
|
1034
1034
|
* Both directions matter. A context added in the admin console makes the
|
|
1035
|
-
* snapshot UNDER-detect (
|
|
1035
|
+
* snapshot UNDER-detect (acmeorgd's ten-to-eleven drift, unnoticed for a day with
|
|
1036
1036
|
* every test green). A context removed there makes it OVER-detect, and the
|
|
1037
1037
|
* obvious fix for a false alarm is to weaken the guard.
|
|
1038
1038
|
*
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
"type": "number",
|
|
52
52
|
"exclusiveMinimum": 0,
|
|
53
53
|
"maximum": 30,
|
|
54
|
-
"description": "How many days after `first_seen` this suite's grace window lasts. Default 14. Requires `first_seen` — a grace length with no anchor forgives nothing and reads as though it forgives everything. Bounded by the same ceiling as the bootstrap window (`bootstrap_max_days`, hard ceiling 30): per-suite grace spends from the same forgiveness budget, and a grace that could outlive that ceiling is
|
|
54
|
+
"description": "How many days after `first_seen` this suite's grace window lasts. Default 14. Requires `first_seen` — a grace length with no anchor forgives nothing and reads as though it forgives everything. Bounded by the same ceiling as the bootstrap window (`bootstrap_max_days`, hard ceiling 30): per-suite grace spends from the same forgiveness budget, and a grace that could outlive that ceiling is acmeorga's forever-bootstrap wearing a per-suite hat."
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
57
|
},
|