@antoneeo/kb-agentic-skill 1.13.0 → 1.15.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/CHANGELOG.md +81 -0
- package/README.md +30 -1
- package/gemini-extension.json +6 -6
- package/package.json +51 -51
- package/skills/kb-agentic-skill/ENFORCEMENT.md +33 -16
- package/skills/kb-agentic-skill/SKILL.md +288 -274
- package/skills/kb-agentic-skill/dispatch.md +39 -1
- package/skills/kb-agentic-skill/distillation.md +38 -7
- package/skills/kb-agentic-skill/guides.md +16 -12
- package/skills/kb-agentic-skill/reconciliation.md +22 -0
- package/skills/kb-agentic-skill/review.md +80 -3
- package/skills/kb-agentic-skill/scripts/sdlc_check.py +46 -28
- package/skills/kb-agentic-skill/scripts/sdlc_core.py +293 -4
- package/skills/kb-agentic-skill/templates.md +17 -9
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,87 @@
|
|
|
2
2
|
|
|
3
3
|
Every significant change to this skill is recorded here.
|
|
4
4
|
|
|
5
|
+
## [1.15.0] - 2026-09-12
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
- **F-047: one row asserts one thing.** Field report: a bundled claim row
|
|
9
|
+
("X, and also Y") made the checker's remedies point in opposite directions —
|
|
10
|
+
the collision message told the author to merge rows that assert different
|
|
11
|
+
things, and the state-grammar message denied a multi-successor `SUPERSEDED`
|
|
12
|
+
that every documented site also denied. The collision message is now
|
|
13
|
+
narrow-first and proposes a merge only where a single assertion is shared;
|
|
14
|
+
the grammar message states the form it accepts; and a plurality hint
|
|
15
|
+
(notes tier, never the exit code) flags a row that reads as more than one
|
|
16
|
+
claim. NOT demonstrated: a pre-registered blind A/B of the citation-scope
|
|
17
|
+
rule on the field's own row returned NULL (3/3 correct in both arms —
|
|
18
|
+
ceiling effect, the row names its off-topic subject explicitly), and the
|
|
19
|
+
Diary records it as such.
|
|
20
|
+
- **F-053: kb had no human-approval rule.** "Never auto-accept a devPNT
|
|
21
|
+
proposal: present the preview and wait for explicit confirmation" existed in
|
|
22
|
+
both sibling packages and nowhere in this one — invisible because the only
|
|
23
|
+
battery assertion sat inside a test that skips every lens without a
|
|
24
|
+
`hybrid.md`, which is exactly the lens that lacked the rule. The rule is now
|
|
25
|
+
in kb's Hybrid block, and the battery test that pins it skips no lens and
|
|
26
|
+
goes red when the rule is stripped from a whole-lens copy.
|
|
27
|
+
- **F-053: the authoring-floor pointer reached one lens of three.** It is now
|
|
28
|
+
in this contract too, before the instruction to write the analysis — where
|
|
29
|
+
the rule can still change what gets written, rather than at the design-review
|
|
30
|
+
gate one phase too late.
|
|
31
|
+
|
|
32
|
+
### Added
|
|
33
|
+
- **The shared spine gains the capability floor, the delegation boundary and
|
|
34
|
+
`benefit`** (F-048, F-049, F-050 — see the code lens's changelog for the
|
|
35
|
+
reasoning; the files are byte-identical across the three packages).
|
|
36
|
+
|
|
37
|
+
### Read cost
|
|
38
|
+
- This lens's mandatory contract GREW **+7.1%** (27,516 -> 29,471 B): it
|
|
39
|
+
received the spine's new doctrine and the two rules above, and no diet. The
|
|
40
|
+
Hybrid seam was measured for extraction and DECLINED — kb's block is 299 B
|
|
41
|
+
against a 1,282 B pointer, so moving it would grow the file it should shrink.
|
|
42
|
+
|
|
43
|
+
## [1.14.1] - 2026-09-06
|
|
44
|
+
|
|
45
|
+
### Fixed
|
|
46
|
+
- **F-046 shipped a hook that wired nowhere.** `wireRemindHookInto` used the
|
|
47
|
+
ORIENT hook's opt-out marker (`orient-hook-wired`) as its own. That file is
|
|
48
|
+
present on every machine that ever installed the skill, so the installer read
|
|
49
|
+
it as "the user opted out of the per-turn reminder" and never wrote the hook —
|
|
50
|
+
for everyone. Two smaller faults in the same function: the marker was checked
|
|
51
|
+
BEFORE testing whether the hook was already present, and no marker was ever
|
|
52
|
+
written after a successful wire, so the real opt-out could never arm. The hook
|
|
53
|
+
now has its own `remind-hook-wired` marker, checked after the presence test and
|
|
54
|
+
written only on success. Regression pinned in `scripts/test_clients.js` (red
|
|
55
|
+
against 1.32.0: an orient-marked machine got no hook).
|
|
56
|
+
|
|
57
|
+
## [1.14.0] - 2026-09-06
|
|
58
|
+
|
|
59
|
+
### Added
|
|
60
|
+
- **F-046: the protocol reaches every turn (`remind`, UserPromptSubmit, wired by
|
|
61
|
+
default).** `orient` fires once at session start and decays; a session that
|
|
62
|
+
never loads the skill never had the protocol at all. Measured 2026-09-06: a
|
|
63
|
+
release ran against a `GUIDE_release.md` the session never consulted, because
|
|
64
|
+
`SKILL.md` -- where the duty is written -- had not been read. `remind` prints
|
|
65
|
+
ONE constant line at every prompt, and its first duty is that one: decide
|
|
66
|
+
whether the skill governs the work in front of you and, if it does, LOAD it
|
|
67
|
+
once. The carrier is kb's F-041 item B, LIFTED into the shared spine rather
|
|
68
|
+
than duplicated, so all three lenses share one machine; each lens declares its
|
|
69
|
+
own line in `set_profile(remind_line=...)`. Installing the package wires it
|
|
70
|
+
machine-wide on Claude Code alongside the orientation hook, never instead of
|
|
71
|
+
it; removing the hook entry is a standing opt-out. Per-turn cost disclosed and
|
|
72
|
+
accepted by the owner (`vision/rulings.md` r19, the "no ceremony ratchet"
|
|
73
|
+
Non-Goal's second door), and bounded to stay flat by a contract the new shared
|
|
74
|
+
`scripts/test_remind.py` guards: constant text, zero reads, one line under 500
|
|
75
|
+
characters, argv ignored whole, always exit 0.
|
|
76
|
+
|
|
77
|
+
### Changed
|
|
78
|
+
- **`guides.md` said something false about code guides.** It claimed `stale`
|
|
79
|
+
works unchanged for `source_kind: code` because "the code-excerpt snapshot
|
|
80
|
+
drifts when the code changes". A snapshot is a frozen copy and never drifts:
|
|
81
|
+
freshness is NOT mechanized there, and the duty is the author's twice -- when
|
|
82
|
+
you MODIFY code a comprehension guide describes, and when you merely READ one
|
|
83
|
+
before trusting it. Measured 2026-09-06: the guided module had gained 388
|
|
84
|
+
lines and lost 71 across four commits with `stale` silent.
|
|
85
|
+
|
|
5
86
|
## [1.13.0] - 2026-09-05
|
|
6
87
|
|
|
7
88
|
Spine-only release: `review.md` updated byte-identical across the family
|
package/README.md
CHANGED
|
@@ -37,7 +37,7 @@ Deliberately absent: any per-node coverage or completion state. `gaps:` says wha
|
|
|
37
37
|
- **Independent review, twice**: the design before it is implemented, the result before it is declared done — fresh-context subagent > one-shot run > a declared self-pass, 3 rounds max, one log line each, and a PASS is invalid on "found nothing".
|
|
38
38
|
- **Question discipline**: a question is legal only when the agent searched first, names the search with its result, and names the decision it unblocks; otherwise it proceeds on a declared assumption, batched.
|
|
39
39
|
- **Operative guides + agent-global KB**: distil user-provided indications into source-faithful `GUIDE_*.md` (`source_kind: document`) — verbatim snapshot plus hash, so drift is detected mechanically.
|
|
40
|
-
- **Mechanical checks**: `check`, `validate`, `index`, `graph`, `corpus`, `claim-id`, `anchor`, `export`, `import`, `stale` (spine staleness plus `## claims` -- superseded-cited documents, expired `valid` windows, superseded derivation chains), plus the spine's `mark`/`gate`/`plan`/`orient`/`migrate`. The graph and corpus checks verify spans against the stored extraction, recompute every id, refuse cycles and unreachable nodes, and enforce `CONTESTED` symmetry.
|
|
40
|
+
- **Mechanical checks**: `check`, `validate`, `index`, `graph`, `corpus`, `claim-id`, `anchor`, `export`, `import`, `stale` (spine staleness plus `## claims` -- superseded-cited documents, expired `valid` windows, superseded derivation chains), plus the spine's `mark`/`benefit`/`gate`/`plan`/`orient`/`migrate`. `benefit` reports what the review gates have already caught, beside what the doctrine costs to read; it always exits 0 and carries no verdict. The graph and corpus checks verify spans against the stored extraction, recompute every id, refuse cycles and unreachable nodes, and enforce `CONTESTED` symmetry.
|
|
41
41
|
- **Installed support files**: Claude, Codex, Gemini and Google Antigravity receive the full skill folder — `SKILL.md`, `templates.md`, `taxonomy.md`, `distillation.md`, `reconciliation.md`, `guides.md`, `vision.md`, `elicitation.md`, `review.md`, `dispatch.md`, `routing.md`, `ENFORCEMENT.md`, and the validator's two files, `scripts/sdlc_check.py` + `scripts/sdlc_core.py` (the core is the family's shared spine — copy both, or neither).
|
|
42
42
|
|
|
43
43
|
## Installation
|
|
@@ -115,3 +115,32 @@ Triage, the Vision Gate, the review gates, the guide router, question discipline
|
|
|
115
115
|
Created by **Antonio Pinto** ([GitHub](https://github.com/Antoneeo)).
|
|
116
116
|
|
|
117
117
|
MIT (c) 2026 Antonio Pinto.
|
|
118
|
+
|
|
119
|
+
## Which model to run it on
|
|
120
|
+
|
|
121
|
+
The skill names **capability tiers**, never providers — a model name in doctrine
|
|
122
|
+
rots at the next release. The binding is yours to make, and the rule is one line:
|
|
123
|
+
|
|
124
|
+
> **A session's floor is the highest floor among the roles it performs itself.**
|
|
125
|
+
|
|
126
|
+
Authoring a governed artifact — the vision, the analysis, the use cases, the
|
|
127
|
+
threat model — is a **deep-tier** role: its output is judgement, and nothing
|
|
128
|
+
downstream scores it. So a session that will DESIGN wants your strongest model.
|
|
129
|
+
A session that only executes an already-approved plan, or does small maintenance,
|
|
130
|
+
can sit a tier lower. The cheapest tier is the wrong choice for the main session
|
|
131
|
+
whatever the task, because the failure there is not a wrong answer — it is
|
|
132
|
+
**silently not applying the process**: a triage never run, a router verdict
|
|
133
|
+
declared without the lookup, a gate nobody noticed. That failure is invisible to
|
|
134
|
+
every check in here.
|
|
135
|
+
|
|
136
|
+
**The reviewer's tier is not automatically yours.** On some clients a subagent
|
|
137
|
+
inherits the session's model; on others it takes one from its own definition, so
|
|
138
|
+
a strong session can be reviewed by a weak one — and a weak session can buy a
|
|
139
|
+
strong review. Set it deliberately; the
|
|
140
|
+
`model` column in the review log is where the choice becomes visible.
|
|
141
|
+
|
|
142
|
+
**Avoid one combination**: authoring below the floor AND reviewing below the floor
|
|
143
|
+
on the same unit. One disclosed weakness is a disclosed weakness; two is an
|
|
144
|
+
artifact nobody competent ever read. Where your client offers nothing better, the
|
|
145
|
+
review still runs and both facts are recorded — a disclosed worst case beats
|
|
146
|
+
skipping the review.
|
package/gemini-extension.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "kb-agentic-skill",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "Knowledge-Base & Document-First protocol with risk triage, Vision governance, signal distillation and optional devPNT integration.",
|
|
5
|
-
"author": "Antonio Pinto (https://github.com/Antoneeo)"
|
|
6
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "kb-agentic-skill",
|
|
3
|
+
"version": "1.15.0",
|
|
4
|
+
"description": "Knowledge-Base & Document-First protocol with risk triage, Vision governance, signal distillation and optional devPNT integration.",
|
|
5
|
+
"author": "Antonio Pinto (https://github.com/Antoneeo)"
|
|
6
|
+
}
|
package/package.json
CHANGED
|
@@ -1,51 +1,51 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@antoneeo/kb-agentic-skill",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "Knowledge-Base & Document-First protocol for Claude Code, Gemini CLI, Google Antigravity and Codex with risk triage, Vision governance, signal distillation and optional devPNT integration.",
|
|
5
|
-
"keywords": [
|
|
6
|
-
"claude-code",
|
|
7
|
-
"claude-skill",
|
|
8
|
-
"gemini-cli",
|
|
9
|
-
"skill",
|
|
10
|
-
"knowledge-base",
|
|
11
|
-
"documentation",
|
|
12
|
-
"ai-agent"
|
|
13
|
-
],
|
|
14
|
-
"author": "Antonio Pinto (https://github.com/Antoneeo)",
|
|
15
|
-
"license": "MIT",
|
|
16
|
-
"publishConfig": {
|
|
17
|
-
"access": "public"
|
|
18
|
-
},
|
|
19
|
-
"bin": {
|
|
20
|
-
"kb-agentic-init": "scripts/init.js",
|
|
21
|
-
"kb-agentic-install-skill": "scripts/postinstall.js"
|
|
22
|
-
},
|
|
23
|
-
"scripts": {
|
|
24
|
-
"postinstall": "node scripts/postinstall.js",
|
|
25
|
-
"preuninstall": "node scripts/preuninstall.js"
|
|
26
|
-
},
|
|
27
|
-
"files": [
|
|
28
|
-
"skills/kb-agentic-skill/SKILL.md",
|
|
29
|
-
"skills/kb-agentic-skill/templates.md",
|
|
30
|
-
"skills/kb-agentic-skill/taxonomy.md",
|
|
31
|
-
"skills/kb-agentic-skill/guides.md",
|
|
32
|
-
"skills/kb-agentic-skill/vision.md",
|
|
33
|
-
"skills/kb-agentic-skill/distillation.md",
|
|
34
|
-
"skills/kb-agentic-skill/reconciliation.md",
|
|
35
|
-
"skills/kb-agentic-skill/elicitation.md",
|
|
36
|
-
"skills/kb-agentic-skill/review.md",
|
|
37
|
-
"skills/kb-agentic-skill/dispatch.md",
|
|
38
|
-
"skills/kb-agentic-skill/routing.md",
|
|
39
|
-
"skills/kb-agentic-skill/portability.md",
|
|
40
|
-
"skills/kb-agentic-skill/ENFORCEMENT.md",
|
|
41
|
-
"skills/kb-agentic-skill/scripts/sdlc_check.py",
|
|
42
|
-
"skills/kb-agentic-skill/scripts/sdlc_core.py",
|
|
43
|
-
"gemini-extension.json",
|
|
44
|
-
"README.md",
|
|
45
|
-
"CHANGELOG.md",
|
|
46
|
-
"scripts/lib.js",
|
|
47
|
-
"scripts/init.js",
|
|
48
|
-
"scripts/postinstall.js",
|
|
49
|
-
"scripts/preuninstall.js"
|
|
50
|
-
]
|
|
51
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@antoneeo/kb-agentic-skill",
|
|
3
|
+
"version": "1.15.0",
|
|
4
|
+
"description": "Knowledge-Base & Document-First protocol for Claude Code, Gemini CLI, Google Antigravity and Codex with risk triage, Vision governance, signal distillation and optional devPNT integration.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"claude-code",
|
|
7
|
+
"claude-skill",
|
|
8
|
+
"gemini-cli",
|
|
9
|
+
"skill",
|
|
10
|
+
"knowledge-base",
|
|
11
|
+
"documentation",
|
|
12
|
+
"ai-agent"
|
|
13
|
+
],
|
|
14
|
+
"author": "Antonio Pinto (https://github.com/Antoneeo)",
|
|
15
|
+
"license": "MIT",
|
|
16
|
+
"publishConfig": {
|
|
17
|
+
"access": "public"
|
|
18
|
+
},
|
|
19
|
+
"bin": {
|
|
20
|
+
"kb-agentic-init": "scripts/init.js",
|
|
21
|
+
"kb-agentic-install-skill": "scripts/postinstall.js"
|
|
22
|
+
},
|
|
23
|
+
"scripts": {
|
|
24
|
+
"postinstall": "node scripts/postinstall.js",
|
|
25
|
+
"preuninstall": "node scripts/preuninstall.js"
|
|
26
|
+
},
|
|
27
|
+
"files": [
|
|
28
|
+
"skills/kb-agentic-skill/SKILL.md",
|
|
29
|
+
"skills/kb-agentic-skill/templates.md",
|
|
30
|
+
"skills/kb-agentic-skill/taxonomy.md",
|
|
31
|
+
"skills/kb-agentic-skill/guides.md",
|
|
32
|
+
"skills/kb-agentic-skill/vision.md",
|
|
33
|
+
"skills/kb-agentic-skill/distillation.md",
|
|
34
|
+
"skills/kb-agentic-skill/reconciliation.md",
|
|
35
|
+
"skills/kb-agentic-skill/elicitation.md",
|
|
36
|
+
"skills/kb-agentic-skill/review.md",
|
|
37
|
+
"skills/kb-agentic-skill/dispatch.md",
|
|
38
|
+
"skills/kb-agentic-skill/routing.md",
|
|
39
|
+
"skills/kb-agentic-skill/portability.md",
|
|
40
|
+
"skills/kb-agentic-skill/ENFORCEMENT.md",
|
|
41
|
+
"skills/kb-agentic-skill/scripts/sdlc_check.py",
|
|
42
|
+
"skills/kb-agentic-skill/scripts/sdlc_core.py",
|
|
43
|
+
"gemini-extension.json",
|
|
44
|
+
"README.md",
|
|
45
|
+
"CHANGELOG.md",
|
|
46
|
+
"scripts/lib.js",
|
|
47
|
+
"scripts/init.js",
|
|
48
|
+
"scripts/postinstall.js",
|
|
49
|
+
"scripts/preuninstall.js"
|
|
50
|
+
]
|
|
51
|
+
}
|
|
@@ -102,7 +102,7 @@ Semantics: exit code 2 + message on stderr ⇒ the write is blocked and the mess
|
|
|
102
102
|
- The paths in `--protected` are prefixes relative to the project root, separated by `;`.
|
|
103
103
|
- `ai_docs/`, `tests/` and `test/` are always excluded from blocking.
|
|
104
104
|
- The hook assumes the working directory is the project root (standard behavior of Claude Code hooks).
|
|
105
|
-
- **Hybrid/devPNT projects**: add `--hybrid` to the gate command. Governed designs live in the devPNT DB, so the gate also unlocks when an approved E-TDD shadow (`ai_docs/solutions/SHADOW_*tdd*.md`, exported before implementation —
|
|
105
|
+
- **Hybrid/devPNT projects**: add `--hybrid` to the gate command. Governed designs live in the devPNT DB, so the gate also unlocks when an approved E-TDD shadow (`ai_docs/solutions/SHADOW_*tdd*.md`, exported before implementation — in this package that clause is the whole statement of the duty; the sibling lenses keep it in their `hybrid.md`, which kb does not have) is present. Without the flag the gate would block legitimate governed work. The flag is deliberately explicit: never auto-detected.
|
|
106
106
|
|
|
107
107
|
## 4. SessionStart hook (orientation, recommended default)
|
|
108
108
|
|
|
@@ -202,20 +202,28 @@ Gemini CLI — wire the same command into its startup-hook mechanism if present;
|
|
|
202
202
|
- **Hybrid/devPNT projects**: add `--hybrid` — the hook then appends a one-line pointer to run `devpnt_mcp_get_bootstrap` for the Master Plan / Knowledge Layer and does not replicate them; the filesystem orientation (router + handoff + README) still emits.
|
|
203
203
|
- Like the CI gate (§2), if you copied `sdlc_check.py` into the repo, the hook references that copy — keep it current when you update the skill.
|
|
204
204
|
|
|
205
|
-
### Per-turn reminder: `remind` (UserPromptSubmit --
|
|
206
|
-
|
|
207
|
-
`orient` fires once, at session start; a long session drifts after it
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
the
|
|
205
|
+
### Per-turn reminder: `remind` (UserPromptSubmit -- wired by default)
|
|
206
|
+
|
|
207
|
+
`orient` fires once, at session start; a long session drifts after it, and a session
|
|
208
|
+
that never loads the skill never had the protocol at all. Measured (F-046, 2026-09-06):
|
|
209
|
+
a release ran against a `GUIDE_release.md` the session never consulted, because
|
|
210
|
+
`SKILL.md` -- where the duty is written -- had not been read. `sdlc_check.py remind` prints
|
|
211
|
+
ONE constant line at every prompt, and its first duty is that one: decide whether the
|
|
212
|
+
skill governs the work in front of you and, if it does, load it once.
|
|
213
|
+
|
|
214
|
+
Cost: 443 characters, ~75 tokens per prompt, paid on every turn including
|
|
215
|
+
trivial ones. That is admissible only because the owner accepted it explicitly
|
|
216
|
+
(`ai_docs/vision/rulings.md` r19, the "no ceremony ratchet" Non-Goal's second door) --
|
|
217
|
+
and the acceptance was for a FLAT cost. Hence the contract, guarded by
|
|
218
|
+
`scripts/test_remind.py`: the line is **constant and reads nothing** (so nothing repo-
|
|
219
|
+
or session-controlled rides into the agent's context through it, and the cost cannot
|
|
220
|
+
grow with the session), it is **one line under 500 characters**, and it **can never
|
|
221
|
+
break a prompt** (argv ignored whole, always exit 0). A trivial turn pays a yes/no
|
|
222
|
+
judgement, never a load.
|
|
223
|
+
|
|
224
|
+
Installing the package wires it machine-wide on Claude Code, alongside the orientation
|
|
225
|
+
hook and never instead of it; **removing that hook entry is a standing opt-out.** To
|
|
226
|
+
wire it by hand:
|
|
219
227
|
|
|
220
228
|
```json
|
|
221
229
|
{
|
|
@@ -225,7 +233,7 @@ the validator path is machine-specific, same rule as the orientation hook above)
|
|
|
225
233
|
"hooks": [
|
|
226
234
|
{
|
|
227
235
|
"type": "command",
|
|
228
|
-
"command": "python \"C
|
|
236
|
+
"command": "python \"C:\Users\<user>\.claude\skills\kb-agentic\scripts\sdlc_check.py\" remind"
|
|
229
237
|
}
|
|
230
238
|
]
|
|
231
239
|
}
|
|
@@ -253,3 +261,12 @@ It aggregates the three test files (`test_plan.py` + `test_session_start.py` + `
|
|
|
253
261
|
**Optional CI** (same shape as §2, not mandatory): add a `run:` step invoking the `unittest discover` command above.
|
|
254
262
|
|
|
255
263
|
**T10 note:** if you copied `sdlc_check.py` and the `test_*.py` battery into the repo for CI, that copy is authoritative — keep it current when you update the skill.
|
|
264
|
+
|
|
265
|
+
## `benefit` is a report, never a CI gate
|
|
266
|
+
|
|
267
|
+
`sdlc_check.py benefit` reports what the review gates caught and what the
|
|
268
|
+
doctrine costs to read. It always exits 0 and emits no warning: **never wire
|
|
269
|
+
it into CI**. It is the criterion by which future units are judged, and a
|
|
270
|
+
measurement that can fail a build becomes a target -- a targeted measurement
|
|
271
|
+
stops measuring. Run it when deciding whether a proposed rule is worth its
|
|
272
|
+
ceremony, not on every push.
|