@codyswann/lisa 2.282.0 → 2.284.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 (78) hide show
  1. package/all/create-only/.lisa/DEPENDENCY_DECISIONS.md +175 -0
  2. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  3. package/dist/core/upstream-evidence-manifest.js +28 -2
  4. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  5. package/package.json +1 -1
  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-task-decomposition/SKILL.md +26 -0
  9. package/plugins/lisa/rules/eager/dependency-decision-records.md +32 -0
  10. package/plugins/lisa/rules/eager/dependency-trust-classes.md +43 -0
  11. package/plugins/lisa/rules/reference/dependency-decision-records.md +140 -0
  12. package/plugins/lisa/rules/reference/dependency-trust-classes.md +243 -0
  13. package/plugins/lisa/skills/lisa-task-decomposition/SKILL.md +26 -0
  14. package/plugins/lisa-agy/plugin.json +1 -1
  15. package/plugins/lisa-agy/skills/lisa-task-decomposition/SKILL.md +26 -0
  16. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  17. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  18. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  19. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  20. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  21. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  22. package/plugins/lisa-copilot/rules/eager/dependency-decision-records.md +32 -0
  23. package/plugins/lisa-copilot/rules/eager/dependency-trust-classes.md +43 -0
  24. package/plugins/lisa-copilot/rules/reference/dependency-decision-records.md +140 -0
  25. package/plugins/lisa-copilot/rules/reference/dependency-trust-classes.md +243 -0
  26. package/plugins/lisa-copilot/skills/lisa-task-decomposition/SKILL.md +26 -0
  27. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  28. package/plugins/lisa-cursor/rules/dependency-decision-records-reference.mdc +145 -0
  29. package/plugins/lisa-cursor/rules/dependency-decision-records.mdc +37 -0
  30. package/plugins/lisa-cursor/rules/dependency-trust-classes-reference.mdc +248 -0
  31. package/plugins/lisa-cursor/rules/dependency-trust-classes.mdc +48 -0
  32. package/plugins/lisa-cursor/skills/lisa-task-decomposition/SKILL.md +26 -0
  33. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  34. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  35. package/plugins/lisa-expo-agy/plugin.json +1 -1
  36. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  37. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  38. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  39. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  40. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  41. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  42. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  43. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  44. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  45. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  46. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  47. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  48. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  49. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  50. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  51. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  52. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  53. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  55. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  56. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  60. package/plugins/lisa-rails-agy/plugin.json +1 -1
  61. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  62. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  63. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  64. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  65. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  66. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  67. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  68. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  69. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  70. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  71. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  72. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  73. package/plugins/src/base/rules/eager/dependency-decision-records.md +32 -0
  74. package/plugins/src/base/rules/eager/dependency-trust-classes.md +43 -0
  75. package/plugins/src/base/rules/reference/dependency-decision-records.md +140 -0
  76. package/plugins/src/base/rules/reference/dependency-trust-classes.md +243 -0
  77. package/plugins/src/base/skills/lisa-task-decomposition/SKILL.md +26 -0
  78. package/ui/index.html +195 -43
@@ -0,0 +1,145 @@
1
+ ---
2
+ description: "Dependency Decisions"
3
+ alwaysApply: false
4
+ ---
5
+
6
+ # Dependency Decisions
7
+
8
+ Lisa already governs dependency *mechanics* — pinning, audit gates, override
9
+ resolution, duplicate detection. What those mechanics cannot tell anyone is
10
+ **why** a dependency is in the project at all, what capability it owns, how much
11
+ blast radius it has, or what would fail if a bad update shipped. Dependency
12
+ decision records close that gap: they turn dependency posture into decisions an
13
+ operator can read, instead of package-manager trivia only an engineer can
14
+ interpret.
15
+
16
+ ## Where the record lives
17
+
18
+ The governed record is the markdown file `.lisa/DEPENDENCY_DECISIONS.md` in the
19
+ host project.
20
+
21
+ It is distributed through Lisa's `all/create-only` template surface, so:
22
+
23
+ - Every project that runs `lisa apply` receives the scaffold, regardless of
24
+ stack — the record is stack-independent because dependency posture is.
25
+ - The strategy is **create-only**: Lisa seeds the file once and never overwrites
26
+ it. Host projects own their content outright, and Lisa upstream never carries
27
+ a copy of any host project's private dependency inventory.
28
+ - It lives in the cold `.lisa/` directory rather than an auto-loaded rules tree,
29
+ so a long record is never injected raw into every session. Agents read the
30
+ entry they need, when they need it.
31
+
32
+ Markdown is deliberate. The record's primary audience is the product gate, where
33
+ a non-technical operator has to make a keep/replace/escalate judgment. A machine
34
+ format would serve tooling and fail that reader.
35
+
36
+ ## What an entry must name
37
+
38
+ Each material-dependency entry names nine things, in this order. Every label
39
+ leads with the operator's question and keeps the technical term in parentheses,
40
+ because the record's primary reader is looking for an answer, not a term:
41
+
42
+ - **Why we keep it** — plain-language reason, written for a non-technical
43
+ reader, leading with the outcome it protects. This is deliberately the FIRST
44
+ bullet: an entry that opens with a version range opens with exactly the
45
+ package-manager trivia this record exists to replace.
46
+ - **What it is (dependency)** — package or service, plus the version range in
47
+ use.
48
+ - **What it does for us (owned capability)** — the single capability the
49
+ dependency is responsible for. A dependency with no nameable capability is
50
+ either not material, or is doing too much and should be split in the record.
51
+ - **Why we believe it's safe (trust basis)** — the evidence that it will still
52
+ be maintained and safe next quarter: maintainer, release cadence,
53
+ security-response history, breadth of adoption, whether the version is pinned.
54
+ - **What breaks if this is compromised (exposure)** — what it can reach and what
55
+ breaks when it misbehaves: build-time versus runtime, and whether it touches
56
+ user data, secrets, the network, or CI credentials.
57
+ - **What it would take to replace (replacement cost)** — the honest effort to
58
+ remove or swap it, what would need rewriting, and whether a viable alternative
59
+ exists today.
60
+ - **What would catch a bad update (detection evidence)** — the named check that
61
+ would **fail** if an update broke the owned capability: a test, suite,
62
+ workflow, or monitor. "Nothing would catch it" is a legitimate and high-value
63
+ answer.
64
+ - **Who owns this and how often we recheck (owner / review cadence)** — who is
65
+ accountable, and how often the entry gets re-read.
66
+ - **Last reviewed** — ISO `YYYY-MM-DD` date of the most recent actual review.
67
+
68
+ ## When to escalate
69
+
70
+ The record exists to produce decisions, so three states are escalations rather
71
+ than to-dos. Raise them to an owner instead of leaving them recorded:
72
+
73
+ - Detection evidence says "nothing would catch it" — the capability is trusted
74
+ blind.
75
+ - `Last reviewed` predates the dependency's last major upgrade — the record
76
+ describes software no longer running.
77
+ - The trust basis names no maintainer, owner, or release history.
78
+
79
+ An entry full of `_Not yet decided_` is not an escalation; it is unstarted work.
80
+ These three are escalations precisely because someone already looked and the
81
+ answer was bad.
82
+
83
+ ## What counts as material
84
+
85
+ Material means: if this dependency vanished, broke, or shipped a hostile update,
86
+ a user would notice, or replacing it would cost real time. Test frameworks,
87
+ linters, HTTP clients, ORMs, auth libraries, UI toolkits, and build tooling are
88
+ usually material. Transitive packages and single-function utilities usually are
89
+ not — record the direct dependency that owns the capability, not everything
90
+ underneath it.
91
+
92
+ Do not attempt to record the whole lockfile. An exhaustive record decays into
93
+ noise and stops being read, which is worse than a short record that is true.
94
+
95
+ ## Maintenance
96
+
97
+ Update the relevant entry in the same change that adds a material dependency,
98
+ upgrades one across a major version, or removes one. Refresh `Last reviewed`
99
+ whenever someone actually re-reads an entry, even when nothing else changes — a
100
+ stale date is the signal that the record has drifted from reality.
101
+
102
+ When detection evidence fails for a dependency, treat the entry as the first
103
+ place to look and the first place to correct: either the evidence was wrong
104
+ about what it protects, or the exposure was understated.
105
+
106
+ ## Entry format
107
+
108
+ Entries are uniform and appendable by design, because a later seeding pass adds
109
+ them mechanically rather than by rewriting the document:
110
+
111
+ - An entry is a level-3 heading (`### <name>`) followed by the nine field
112
+ bullets in the fixed order above.
113
+ - Entries live under `## Records`, the final section of the file, and new
114
+ entries are appended to its end. A `###` heading inside `## Records` is always
115
+ an entry, never guidance — that scoping is what makes the section safe to
116
+ parse and append to.
117
+ - `_Not yet decided_` is the reserved marker for a field nobody has answered
118
+ yet. Never leave a field blank and never guess: a blank field is
119
+ indistinguishable from an overlooked one, and a guess is a wrong answer that
120
+ nobody re-checks.
121
+
122
+ Note that `_Not yet decided_` and "nothing would catch it" are different
123
+ statements. The first means nobody has looked. The second is a finding — a real
124
+ capability with no detection evidence behind it.
125
+
126
+ ## Scaffold, not inventory
127
+
128
+ The seeded file is a scaffold: field structure, guidance, and one clearly marked
129
+ worked example so an operator can see the intended shape. The example is meant
130
+ to be replaced or deleted once real entries exist. Lisa does not pre-populate a
131
+ host project's dependency inventory — only the project knows which of its
132
+ dependencies are material.
133
+
134
+ ## Agent parity
135
+
136
+ The record is a governed markdown artifact, not a runtime behavior, so every
137
+ supported coding agent — Claude Code, Codex, Cursor, OpenCode, Antigravity, and
138
+ Copilot — reaches it identically through the shared rules mirror and the same
139
+ `.lisa/DEPENDENCY_DECISIONS.md` path in the host project. There is no per-agent
140
+ enforcement surface to diverge.
141
+
142
+ The documented gap, uniform across all six runtimes: no agent runtime enforces
143
+ that entries stay accurate or current. Nothing blocks a commit whose dependency
144
+ change skips the record, and nothing fails when `Last reviewed` goes stale.
145
+ Freshness is carried by this rule and by review, not by a hook or a lint gate.
@@ -0,0 +1,37 @@
1
+ ---
2
+ description: "Dependency Decisions (load-bearing)"
3
+ alwaysApply: true
4
+ ---
5
+
6
+ # Dependency Decisions (load-bearing)
7
+
8
+ Material dependencies are recorded as decisions, not lockfile trivia. The
9
+ governed record is `.lisa/DEPENDENCY_DECISIONS.md`, seeded once by `lisa apply`
10
+ from the `all/create-only` template surface and never overwritten afterward.
11
+
12
+ A *material* dependency is one that owns a user-visible capability or would cost
13
+ real time to replace. Each record entry must name, in this order: why we keep it
14
+ in plain language, what it is, its owned capability, trust basis, exposure,
15
+ replacement cost, detection evidence, owner/review cadence, and last-reviewed
16
+ date. Field labels lead with the operator's question and keep the technical term
17
+ in parentheses. "Why we keep it" comes first on purpose — an entry that opens
18
+ with a version range opens with the trivia the record exists to replace.
19
+
20
+ When you add, upgrade across a major version, or remove a material dependency,
21
+ update its entry in the same change. When you cannot name the detection evidence
22
+ that would fail if an update broke the owned capability, write "nothing would
23
+ catch it" rather than inventing a check — the gap is the finding.
24
+
25
+ Write every entry so a non-technical operator can tell why the dependency is
26
+ kept and what evidence would detect a bad update. Lead with the outcome it
27
+ protects, not the mechanism.
28
+
29
+ Entries are repeatable blocks appended under `## Records`, so a seeding script
30
+ can add one without rewriting the file. An honest gap is written as
31
+ `_Not yet decided_` — never left blank.
32
+
33
+ Escalate, rather than just recording, when detection evidence says "nothing
34
+ would catch it", when `Last reviewed` predates the dependency's last major
35
+ upgrade, or when the trust basis names no maintainer or owner.
36
+
37
+ Full prose: [reference/dependency-decision-records.md](dependency-decision-records-reference.mdc).
@@ -0,0 +1,248 @@
1
+ ---
2
+ description: "Dependency Trust Classes"
3
+ alwaysApply: false
4
+ ---
5
+
6
+ # Dependency Trust Classes
7
+
8
+ Without named classes, every third-party package sits in one implicit bucket:
9
+ "we installed it, so presumably it's fine." That bucket makes a payment SDK and
10
+ a code formatter look identical at review time, and it forces every dependency
11
+ conversation to re-argue trust from first principles.
12
+
13
+ Trust classes fix that. Each class states, in plain language, **why we can trust
14
+ that kind of dependency**, and names **the one event that would trigger human
15
+ review**. A dependency's class is the answer to the
16
+ "Why we believe it's safe (trust basis)" field in
17
+ `.lisa/DEPENDENCY_DECISIONS.md` — the record says what
18
+ this dependency is and what would catch a bad update; the class says what bar it
19
+ had to clear to be here at all.
20
+
21
+ Exactly one class per dependency. If two seem to fit, take the lower-trust one —
22
+ the requirements are strictly stronger, and being over-careful about a formatter
23
+ costs a review cycle while being under-careful about an auth client costs users.
24
+
25
+ ## The five review inputs
26
+
27
+ Every class fixes the same five inputs. What changes between classes is how
28
+ demanding each one is:
29
+
30
+ - **Capability owner** — who is accountable when this breaks. A role for
31
+ high-trust classes; a named person for low-trust ones, because "the platform
32
+ team" cannot be paged at 2am.
33
+ - **Update cadence** — how often the entry is re-read and the version re-judged.
34
+ - **Detection evidence** — the named check that fails if an update breaks the
35
+ owned capability. Stronger classes demand evidence *we* own, not upstream's
36
+ test suite.
37
+ - **Replacement-cost threshold** — the point past which the cost itself is the
38
+ finding. High replacement cost is acceptable in a high-trust class and is an
39
+ escalation in a low-trust one.
40
+ - **Product/human ratification** — whether a human has to say yes before the
41
+ dependency is added, upgraded, or kept. This is the gate, and it is deliberate
42
+ that the lower-trust and higher-exposure classes carry it.
43
+
44
+ ## The six classes
45
+
46
+ ### 1. Mature ecosystem primitive
47
+
48
+ **Why we can trust it:** so many other projects depend on it that a bad release
49
+ is usually found, reported, and fixed by someone else before it reaches us. It
50
+ has an identifiable maintaining organization, a published release cadence, and a
51
+ documented process for handling security reports. Trust here comes from the size
52
+ of the crowd standing in front of us, not from us having read the code.
53
+
54
+ Examples in kind: a language's canonical test runner, a foundation-maintained
55
+ linter, a mainstream UI framework.
56
+
57
+ - **Capability owner:** a role or team is sufficient.
58
+ - **Update cadence:** re-read at each major upgrade, and at least every 12
59
+ months.
60
+ - **Detection evidence:** an existing CI check must fail if the owned capability
61
+ breaks. Naming an upstream test suite is acceptable here and only here.
62
+ - **Replacement-cost threshold:** high replacement cost is accepted. That is the
63
+ bargain — we take deep coupling in exchange for the crowd's scrutiny.
64
+ - **Ratification:** not required to add or to take a minor/patch upgrade.
65
+
66
+ **Human review is triggered when:** maintainership changes hands or the project
67
+ is archived, or a security advisory goes unfixed past the project's own
68
+ published response window. Either event removes the crowd, which was the whole
69
+ basis for the trust — reclassify rather than re-trust.
70
+
71
+ ### 2. Fast-moving standard implementation
72
+
73
+ **Why we can trust it:** it is the standard implementation of a protocol, spec,
74
+ or platform we have deliberately decided not to own — a cloud SDK, an API
75
+ client, a framework tracking a moving platform. We trust the *standard*; we do
76
+ not trust the release we happen to be on, because the project moves faster than
77
+ our review cycle does. Trust here is conditional on us keeping up.
78
+
79
+ - **Capability owner:** a named team that owns staying current.
80
+ - **Update cadence:** re-read at every minor upgrade, and no less than
81
+ quarterly. A dependency in this class going quiet for a year is itself a
82
+ finding.
83
+ - **Detection evidence:** an automated test **we** own that exercises the owned
84
+ capability. Upstream's suite does not count — it tests their contract, not our
85
+ use of it.
86
+ - **Replacement-cost threshold:** replacement cost must stay moderate. Keep the
87
+ coupling behind our own boundary so a forced migration is a rewrite of the
88
+ boundary, not of the application.
89
+ - **Ratification:** required for any major upgrade that changes user-visible
90
+ behavior.
91
+
92
+ **Human review is triggered when:** two consecutive major versions ship that we
93
+ did not adopt inside the cadence window. At that point we are pinned to
94
+ unsupported software and the decision — catch up, replace, or accept the
95
+ exposure — belongs to a human.
96
+
97
+ ### 3. Build/development tool
98
+
99
+ **Why we can trust it:** it never runs in production and never touches customer
100
+ data. If it ships a bad update, developers notice within one build, and the
101
+ worst case is lost engineering time rather than a user-visible failure. The
102
+ blast radius is what earns the trust, not the maintainer.
103
+
104
+ - **Capability owner:** a role or team is sufficient.
105
+ - **Update cadence:** re-read at each major upgrade, and at least every 12
106
+ months.
107
+ - **Detection evidence:** the build, lint, or test job the tool powers. It fails
108
+ loudly and immediately, which is the point.
109
+ - **Replacement-cost threshold:** high cost is accepted — swapping a build tool
110
+ is disruptive but never urgent.
111
+ - **Ratification:** not required.
112
+
113
+ **Human review is triggered when:** the tool gains reach it did not have —
114
+ running in production, reading secrets, or reading CI credentials. The moment
115
+ that happens the blast-radius argument is void: reclassify it as a
116
+ runtime-critical service client and apply that class's requirements immediately.
117
+
118
+ ### 4. Runtime-critical service client
119
+
120
+ **Why we can trust it:** honestly, we mostly don't. This class covers anything
121
+ that reaches users, their data, or money in production — payment SDKs, auth
122
+ libraries, database drivers, service clients on the request path. Even a mature,
123
+ well-run project lands in this class if a bad update reaches production, because
124
+ maturity does not shrink blast radius. Trust here is bought with our own
125
+ evidence and a human's signature, not the vendor's reputation.
126
+
127
+ - **Capability owner:** a named accountable person, not a team.
128
+ - **Update cadence:** re-judged at every version change. Versions are pinned
129
+ exactly, so upgrades are always deliberate.
130
+ - **Detection evidence:** an integration or end-to-end test that exercises the
131
+ real capability, **plus** a production monitor that would notice failure in
132
+ the wild. "Nothing would catch it" is not an acceptable answer in this class —
133
+ it is a blocker.
134
+ - **Replacement-cost threshold:** replacement cost must be written down, never
135
+ `_Not yet decided_`. If nobody can estimate it, we do not know how trapped we
136
+ are, and that unknown is the finding.
137
+ - **Ratification:** **product/human ratification is required** before adding the
138
+ dependency and before any major upgrade.
139
+
140
+ **Human review is triggered when:** any version changes, any security advisory
141
+ is published, or the vendor has a service incident. Every one of those is a
142
+ human decision in this class — that is what makes it the strictest.
143
+
144
+ ### 5. Thin wrapper suitable for in-house ownership
145
+
146
+ **Why we can trust it:** it is small enough that we could read all of it in an
147
+ afternoon and own it outright. Safety is not really the question; whether it is
148
+ earning its keep is. A dependency we could write in a day still costs us a
149
+ supply-chain entry, a transitive tree, and an upgrade obligation forever.
150
+
151
+ - **Capability owner:** the team that would inherit the code if we in-housed it.
152
+ If no team will claim it, do not add it.
153
+ - **Update cadence:** re-read at every upgrade — there should be few.
154
+ - **Detection evidence:** our own unit tests covering the wrapped behavior. They
155
+ are cheap here precisely because the surface is small, and they are what makes
156
+ in-housing a one-day job later instead of a rewrite.
157
+ - **Replacement-cost threshold:** roughly one day. Under it, the default is to
158
+ in-house the code rather than take the dependency.
159
+ - **Ratification:** **required to keep it** when replacement cost is under the
160
+ threshold. Note the inversion: the human signs off on the *exception* — taking
161
+ a dependency we could trivially own — not on the removal.
162
+
163
+ **Human review is triggered when:** the package goes unmaintained, or its
164
+ transitive dependency tree grows larger than the code it wraps. Either way we
165
+ are now carrying more supply chain than capability, and in-housing should be
166
+ reconsidered on purpose.
167
+
168
+ ### 6. Temporary/experimental dependency
169
+
170
+ **Why we can trust it:** we don't, and we say so. This class exists so a spike,
171
+ a prototype, or a stopgap can move fast without silently becoming permanent. It
172
+ is admitted on a clock: a written expiry date and a named exit — replace,
173
+ in-house, promote to another class, or remove.
174
+
175
+ - **Capability owner:** the person who introduced it, by name. Ownership does
176
+ not transfer to a team while the dependency is in this class.
177
+ - **Update cadence:** reviewed at the stated expiry date, which is at most one
178
+ quarter out. No expiry date means it does not belong in this class.
179
+ - **Detection evidence:** "nothing would catch it" is tolerated **only** while
180
+ exposure stays out of production. The moment it reaches production, the
181
+ runtime-critical requirements apply.
182
+ - **Replacement-cost threshold:** must be low by construction. Anything
183
+ expensive to remove is not temporary — it is a permanent dependency wearing a
184
+ temporary label, and it should be classified honestly on day one.
185
+ - **Ratification:** **required to extend past the expiry date** or to promote it
186
+ into any other class. An expiry that slides without a human saying yes is how
187
+ a prototype becomes production.
188
+
189
+ **Human review is triggered when:** the expiry date passes, or the dependency
190
+ starts running in production or touching user data — whichever happens first.
191
+
192
+ ## Ratification, summarized
193
+
194
+ Ratification is not a formality; it is the point where a human owns the residual
195
+ risk. Required for:
196
+
197
+ - **Runtime-critical service client** — to add, and for every major upgrade.
198
+ - **Temporary/experimental dependency** — to extend past expiry or to promote.
199
+ - **Thin wrapper suitable for in-house ownership** — to keep it rather than
200
+ in-house it.
201
+ - **Fast-moving standard implementation** — for a major upgrade that changes
202
+ user-visible behavior.
203
+
204
+ Not required for mature ecosystem primitives or build/development tools on
205
+ routine adds and upgrades. Those two classes are where the crowd and the blast
206
+ radius do the work a human would otherwise have to do.
207
+
208
+ ## Naming a class at planning time
209
+
210
+ A work item that proposes adding a new material dependency must, before it is
211
+ buildable, name the dependency's trust class and state that it will update the
212
+ `.lisa/DEPENDENCY_DECISIONS.md` entry in the same change. This is enforced at
213
+ decomposition time by the `lisa-task-decomposition` skill, which rejects a work
214
+ unit proposing a material dependency with no named class.
215
+
216
+ The class is what makes the rest of the ticket reviewable: it tells the reviewer
217
+ which evidence to demand and whether a human has to ratify before the work
218
+ starts, rather than discovering both at the end.
219
+
220
+ Naming a class is not a formality either. If nobody can pick one, that is the
221
+ finding — an unclassifiable dependency is usually one nobody has thought about,
222
+ and it should be resolved before the work item is accepted rather than after the
223
+ package is installed.
224
+
225
+ ## Reclassification
226
+
227
+ Trust classes describe the dependency as it is used today, not as it was
228
+ introduced. When exposure changes — a build tool starts running in production, a
229
+ prototype ships to users, a thin wrapper grows a large transitive tree — move it
230
+ to the correct class and apply the new requirements immediately. Update the
231
+ `Last reviewed` date on the record entry when you do.
232
+
233
+ Reclassifying downward (to a lower-trust class) is never a demotion of the
234
+ dependency. It is an admission that its blast radius grew, which is a fact about
235
+ us, not about the maintainers.
236
+
237
+ ## Agent parity
238
+
239
+ Trust classes are a governed markdown rule and a decomposition-time expectation,
240
+ not a runtime behavior, so Claude Code, Codex, Cursor, OpenCode, Antigravity,
241
+ and Copilot all reach them identically through the shared rules mirror and the
242
+ same `lisa-task-decomposition` skill.
243
+
244
+ The documented gap, uniform across all six runtimes: no agent runtime enforces
245
+ that a dependency carries a correct class. Nothing fails a build when a package
246
+ is installed with no class named, and nothing detects that a build tool quietly
247
+ started running in production. Classification is carried by this rule, the
248
+ decomposition skill, and review — not by a hook or a lint gate.
@@ -0,0 +1,48 @@
1
+ ---
2
+ description: "Dependency Trust Classes (load-bearing)"
3
+ alwaysApply: true
4
+ ---
5
+
6
+ # Dependency Trust Classes (load-bearing)
7
+
8
+ Every material dependency belongs to exactly one **trust class**. The class is
9
+ the answer to the decision record's "Why we believe it's safe (trust basis)"
10
+ field in `.lisa/DEPENDENCY_DECISIONS.md` — it says why we can trust a *kind* of
11
+ dependency, so each entry does not re-argue trust from scratch.
12
+
13
+ The six classes, from most to least self-evidently trustworthy:
14
+
15
+ 1. **Mature ecosystem primitive** — so widely used that other people hit the
16
+ breakage first.
17
+ 2. **Fast-moving standard implementation** — the standard implementation of
18
+ something we refuse to own, but it changes faster than we do.
19
+ 3. **Build/development tool** — never runs in production; a bad update costs
20
+ developer time, not users.
21
+ 4. **Runtime-critical service client** — reaches users, data, or money directly,
22
+ so it is the least trusted regardless of how mature it is.
23
+ 5. **Thin wrapper suitable for in-house ownership** — small enough that we could
24
+ own the code, so the question is whether it earns its keep, not whether it is
25
+ safe.
26
+ 6. **Temporary/experimental dependency** — not trusted at all; admitted on a
27
+ clock with a written expiry date and a named exit.
28
+
29
+ Each class fixes five review inputs: capability owner, update cadence, detection
30
+ evidence, replacement-cost threshold, and whether product/human ratification is
31
+ required. Higher exposure and lower trust buy stronger evidence and mandatory
32
+ ratification, not weaker: runtime-critical service clients always need human
33
+ ratification to add or major-upgrade; temporary dependencies need it to live
34
+ past their expiry date; thin wrappers need it to be kept rather than in-housed.
35
+
36
+ Every class also names one **human-review trigger** — the observable event that
37
+ takes the decision away from the agent. A class definition that cannot say what
38
+ would trigger human review is not finished.
39
+
40
+ A work item that proposes adding a new material dependency must name the
41
+ dependency's trust class and update its `.lisa/DEPENDENCY_DECISIONS.md` entry in
42
+ the same change. A proposal with no named class is not ready to build.
43
+
44
+ Reclassify — do not quietly re-trust — when a dependency's exposure changes: a
45
+ build tool that gains runtime reach or reads CI credentials becomes a
46
+ runtime-critical service client, and its stronger requirements apply immediately.
47
+
48
+ Full prose: [reference/dependency-trust-classes.md](dependency-trust-classes-reference.mdc).
@@ -74,6 +74,31 @@ Each task must have a verification method. Choose the most appropriate:
74
74
  - Prefer independent tasks that can run in parallel where possible
75
75
  - Flag external dependencies (other teams, services, permissions, data) that may block progress
76
76
 
77
+ ### 4.5. Classify Any New Material Dependency
78
+
79
+ Step 4 maps dependencies *between tasks*. This step covers third-party
80
+ dependencies a task proposes to **add**.
81
+
82
+ A dependency is **material** if its failure, disappearance, or bad update would
83
+ break something a user can see, or would cost real time to replace. If a work
84
+ unit proposes adding one, the work unit must, before it is buildable:
85
+
86
+ 1. **Name its trust class** — exactly one of: mature ecosystem primitive,
87
+ fast-moving standard implementation, build/development tool, runtime-critical
88
+ service client, thin wrapper suitable for in-house ownership, or
89
+ temporary/experimental dependency. See the `dependency-trust-classes` rule
90
+ for what each class means and why it is trusted.
91
+ 2. **State the class's required evidence** — the detection evidence that class
92
+ demands, and whether product/human ratification is required before the work
93
+ starts. Runtime-critical service clients and expiry extensions on temporary
94
+ dependencies always require ratification; a work unit that needs it and does
95
+ not say so is not ready.
96
+ 3. **Include updating `.lisa/DEPENDENCY_DECISIONS.md`** in its acceptance
97
+ criteria, so the record entry lands in the same change as the dependency.
98
+
99
+ If nobody can pick a class, that is the finding — resolve it before accepting
100
+ the work unit, not after the package is installed.
101
+
77
102
  ### 5. Determine Execution Order
78
103
 
79
104
  - Place foundational tasks first (types, schemas, interfaces, shared utilities)
@@ -121,6 +146,7 @@ Map each task to the skills needed to complete it. This enables delegation to sp
121
146
  - Every task must have at least one acceptance criterion that can be empirically verified
122
147
  - Do not create tasks that cannot be verified -- if you cannot define how to prove it is done, the task is not well-scoped
123
148
  - Every Task / Bug / Sub-task / Improvement is scoped to exactly one repo -- if the work spans repos, split into per-repo work units under a shared parent Story (see step 1.5)
149
+ - Any task proposing a new material dependency names its trust class, states that class's required evidence and whether human ratification is needed, and updates `.lisa/DEPENDENCY_DECISIONS.md` in the same change (see step 4.5) -- a proposed material dependency with no named class is not ready to build
124
150
  - Keep tasks ordered so that no task references work that has not been completed by a prior task
125
151
  - Flag any task that requires access, permissions, or external input not yet available
126
152
  - Prefer more small tasks over fewer large tasks -- smaller tasks are easier to verify and less risky to fail
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.282.0",
3
+ "version": "2.284.0",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.282.0",
3
+ "version": "2.284.0",
4
4
  "description": "Expo and React Native-specific skills, agents, rules, and MCP servers.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.282.0",
3
+ "version": "2.284.0",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.282.0",
3
+ "version": "2.284.0",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.282.0",
3
+ "version": "2.284.0",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.282.0",
3
+ "version": "2.284.0",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.282.0",
3
+ "version": "2.284.0",
4
4
  "description": "Harper/Fabric-specific Lisa rules for TypeScript component apps.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.282.0",
3
+ "version": "2.284.0",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.282.0",
3
+ "version": "2.284.0",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.282.0",
3
+ "version": "2.284.0",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.282.0",
3
+ "version": "2.284.0",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.282.0",
3
+ "version": "2.284.0",
4
4
  "description": "NestJS-specific skills and migration write-protection hooks.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.282.0",
3
+ "version": "2.284.0",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.282.0",
3
+ "version": "2.284.0",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.282.0",
3
+ "version": "2.284.0",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"