@codyswann/lisa 2.200.0 → 2.202.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/README.md +22 -10
- 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-automation-status/SKILL.md +1 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-doctor/SKILL.md +56 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-validate-issue/SKILL.md +28 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-validate-ticket/SKILL.md +28 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-validate-issue/SKILL.md +27 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-automations/SKILL.md +12 -4
- package/plugins/lisa/.codex-plugin/skills/lisa-tear-down-automations/SKILL.md +2 -2
- package/plugins/lisa/rules/eager/factory-model.md +36 -0
- package/plugins/lisa/rules/reference/factory-model.md +87 -0
- package/plugins/lisa/skills/lisa-automation-status/SKILL.md +1 -0
- package/plugins/lisa/skills/lisa-doctor/SKILL.md +56 -0
- package/plugins/lisa/skills/lisa-github-validate-issue/SKILL.md +28 -1
- package/plugins/lisa/skills/lisa-jira-validate-ticket/SKILL.md +28 -1
- package/plugins/lisa/skills/lisa-linear-validate-issue/SKILL.md +27 -0
- package/plugins/lisa/skills/lisa-setup-automations/SKILL.md +13 -5
- package/plugins/lisa/skills/lisa-tear-down-automations/SKILL.md +3 -3
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-automation-status/SKILL.md +1 -0
- package/plugins/lisa-agy/skills/lisa-doctor/SKILL.md +56 -0
- package/plugins/lisa-agy/skills/lisa-github-validate-issue/SKILL.md +28 -1
- package/plugins/lisa-agy/skills/lisa-jira-validate-ticket/SKILL.md +28 -1
- package/plugins/lisa-agy/skills/lisa-linear-validate-issue/SKILL.md +27 -0
- package/plugins/lisa-agy/skills/lisa-setup-automations/SKILL.md +13 -5
- package/plugins/lisa-agy/skills/lisa-tear-down-automations/SKILL.md +3 -3
- 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/eager/factory-model.md +36 -0
- package/plugins/lisa-copilot/rules/reference/factory-model.md +87 -0
- package/plugins/lisa-copilot/skills/lisa-automation-status/SKILL.md +1 -0
- package/plugins/lisa-copilot/skills/lisa-doctor/SKILL.md +56 -0
- package/plugins/lisa-copilot/skills/lisa-github-validate-issue/SKILL.md +28 -1
- package/plugins/lisa-copilot/skills/lisa-jira-validate-ticket/SKILL.md +28 -1
- package/plugins/lisa-copilot/skills/lisa-linear-validate-issue/SKILL.md +27 -0
- package/plugins/lisa-copilot/skills/lisa-setup-automations/SKILL.md +13 -5
- package/plugins/lisa-copilot/skills/lisa-tear-down-automations/SKILL.md +3 -3
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/rules/factory-model-reference.mdc +92 -0
- package/plugins/lisa-cursor/rules/factory-model.mdc +41 -0
- package/plugins/lisa-cursor/skills/lisa-automation-status/SKILL.md +1 -0
- package/plugins/lisa-cursor/skills/lisa-doctor/SKILL.md +56 -0
- package/plugins/lisa-cursor/skills/lisa-github-validate-issue/SKILL.md +28 -1
- package/plugins/lisa-cursor/skills/lisa-jira-validate-ticket/SKILL.md +28 -1
- package/plugins/lisa-cursor/skills/lisa-linear-validate-issue/SKILL.md +27 -0
- package/plugins/lisa-cursor/skills/lisa-setup-automations/SKILL.md +13 -5
- package/plugins/lisa-cursor/skills/lisa-tear-down-automations/SKILL.md +3 -3
- 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/eager/factory-model.md +36 -0
- package/plugins/src/base/rules/reference/factory-model.md +87 -0
- package/plugins/src/base/skills/lisa-automation-status/SKILL.md +1 -0
- package/plugins/src/base/skills/lisa-doctor/SKILL.md +56 -0
- package/plugins/src/base/skills/lisa-github-validate-issue/SKILL.md +28 -1
- package/plugins/src/base/skills/lisa-jira-validate-ticket/SKILL.md +28 -1
- package/plugins/src/base/skills/lisa-linear-validate-issue/SKILL.md +27 -0
- package/plugins/src/base/skills/lisa-setup-automations/SKILL.md +13 -5
- package/plugins/src/base/skills/lisa-tear-down-automations/SKILL.md +3 -3
- package/ui/index.html +151 -25
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Lisa
|
|
2
2
|
|
|
3
|
-
Lisa is governance-as-code for AI-assisted software development
|
|
3
|
+
Lisa turns a repository into a set of **software factories** — agent-operated production lines (Research → Plan → Implement → Verify) that build, verify, and ship software with as few humans as possible. Underneath the factories, Lisa is governance-as-code for AI-assisted software development: one set of standards, workflows, and quality gates applies identically whether the work is done by a human, by an AI agent on a laptop, or by a scheduled job — distributed to every project as a versioned dependency, and to every major coding agent platform (Claude Code, Codex, Cursor, OpenCode, Antigravity, Copilot) from one source.
|
|
4
4
|
|
|
5
5
|
> **How to read this README**
|
|
6
6
|
>
|
|
@@ -11,17 +11,29 @@ Lisa is governance-as-code for AI-assisted software development. It makes one se
|
|
|
11
11
|
|
|
12
12
|
## What Lisa is
|
|
13
13
|
|
|
14
|
-
Lisa wears
|
|
14
|
+
Lisa wears four faces from a single package:
|
|
15
15
|
|
|
16
|
+
- **A factory operator.** Scheduled intake agents watch queues of ready work, adversarially gate what enters the pipeline, and run each item through Research → Plan → Implement → Verify without a human in the loop.
|
|
16
17
|
- **A standards engine.** It applies a curated set of configs, CI workflows, git hooks, and project rules into a target repository and keeps them current as the package updates.
|
|
17
|
-
- **An operating system for coding agents.** It ships the skills, commands, agent roles, rules, and hooks that define *how* an AI agent investigates, builds, reviews, ships, and verifies work — and it delivers that same content to
|
|
18
|
+
- **An operating system for coding agents.** It ships the skills, commands, agent roles, rules, and hooks that define *how* an AI agent investigates, builds, reviews, ships, and verifies work — and it delivers that same content to every supported agent runtime from one source.
|
|
18
19
|
- **A configuration library.** Projects can consume Lisa's linting, testing, and TypeScript presets directly, per technology stack, without adopting the rest.
|
|
19
20
|
|
|
20
|
-
All
|
|
21
|
+
All four are versioned together, so "how we build software here" upgrades by bumping one dependency.
|
|
21
22
|
|
|
22
23
|
> **Prompt for your coding agent**
|
|
23
24
|
> "Give me a one-paragraph tour of this repository's top-level layout: where the apply/template engine lives, where the agent plugin content is authored, and where the shared config presets are exported. Read the source and cite paths."
|
|
24
25
|
|
|
26
|
+
## The factory model
|
|
27
|
+
|
|
28
|
+
Lisa's purpose is to run four **factories** in your project — production lines operated by agents, not people — so that **non-technical people can create scalable software** by describing outcomes while the factories supply the engineering discipline. **Research** creates PRDs. **Plan** turns a PRD into ordered work units. **Implement** turns work units into quality software — tests, code, UI, APIs, infrastructure. **Verify** issues a go/no-go by using the software the way a human would, and files any failures straight back into Implement as build-ready tickets, so the loop heals itself.
|
|
29
|
+
|
|
30
|
+
Humans don't work inside a factory. Handoff happens outside, at the **gates**: agents, humans, and automations submit inputs, and an intake agent adversarially evaluates each one — is it high-quality and unambiguous, and does the factory have the tooling *and provable access to that tooling* to execute it? The intake agent tries to resolve gaps itself first; what it genuinely can't resolve, it rejects and raises to a human rather than guessing.
|
|
31
|
+
|
|
32
|
+
Three loops keep the pipeline fed without anyone asking: **QA** explores the product like a first-time user and files bugs, **Product Planning** ideates PRDs, and **Monitoring** audits observability signals and files regressions. Everything runs on the coding agent's native scheduler, and by default the loops' outputs enter the gates pickup-ready — the adversarial intake is the quality control, not a human triager. Executed properly, end users have zero direct contact with coding agents: they see the tracker, the PRDs, and the shipped software.
|
|
33
|
+
|
|
34
|
+
> **Prompt for your coding agent**
|
|
35
|
+
> "Explain how this project's factory pipeline is wired right now: which automations exist and on what cadence, what each gate checks before admitting work, and where a human is still required. Read the installed automations and intake skills — don't guess."
|
|
36
|
+
|
|
25
37
|
## Core principles
|
|
26
38
|
|
|
27
39
|
These are the durable ideas. Everything concrete descends from them.
|
|
@@ -79,12 +91,12 @@ The supported stacks, setup flags, and exact invocation evolve as the project gr
|
|
|
79
91
|
|
|
80
92
|
## The work lifecycle
|
|
81
93
|
|
|
82
|
-
Lisa organizes a piece of work as a pipeline of specialized agent roles. Conceptually
|
|
94
|
+
Lisa organizes a piece of work as a pipeline of specialized agent roles — the factories, seen from inside. Conceptually a work item moves through five stages:
|
|
83
95
|
|
|
84
|
-
1. **Understand** — investigate the codebase and the problem, produce a spec or PRD.
|
|
85
|
-
2. **Plan** — decompose the spec into ordered work items in your tracker.
|
|
86
|
-
3. **Build** — take one item from spec to a merged PR: a team of agents implements, reviews, and ships it.
|
|
87
|
-
4. **Prove** — deploy, verify the behavior in the target environment with real evidence, and turn a passing manual check into a regression test.
|
|
96
|
+
1. **Understand** *(the Research factory)* — investigate the codebase and the problem, produce a spec or PRD.
|
|
97
|
+
2. **Plan** *(the Plan factory)* — decompose the spec into ordered work items in your tracker.
|
|
98
|
+
3. **Build** *(the Implement factory)* — take one item from spec to a merged PR: a team of agents implements, reviews, and ships it.
|
|
99
|
+
4. **Prove** *(the Verify factory)* — deploy, verify the behavior in the target environment with real evidence, and turn a passing manual check into a regression test.
|
|
88
100
|
5. **Learn** — after shipping, mine the work for edge cases and friction and fold accepted learnings back into the standards.
|
|
89
101
|
|
|
90
102
|
Most people invoke only the first stages explicitly; the rest run as nested sub-flows. The same logic runs whether you trigger it by hand or a scheduled job triggers it unattended.
|
|
@@ -94,7 +106,7 @@ Most people invoke only the first stages explicitly; the rest run as nested sub-
|
|
|
94
106
|
|
|
95
107
|
### Unattended and batch work
|
|
96
108
|
|
|
97
|
-
Lisa can watch a queue of ready work and dispatch each item through the lifecycle on its own, which is what makes it usable as a scheduled operator.
|
|
109
|
+
Lisa can watch a queue of ready work and dispatch each item through the lifecycle on its own, which is what makes it usable as a scheduled operator. A standard automation fleet covers the pipeline movers (PRD intake, ticket intake, queue repair) and the three feeding loops (exploratory QA, product ideation, observability monitoring); Lisa can also recover queues that are stuck and report whether the fleet is healthy.
|
|
98
110
|
|
|
99
111
|
> **Prompt for your coding agent**
|
|
100
112
|
> "Which commands let this Lisa scan a work queue, dispatch ready items, repair stuck ones, and report on scheduled-automation health? Show me how I'd point one at my queue and what it expects in configuration."
|
package/package.json
CHANGED
|
@@ -95,7 +95,7 @@
|
|
|
95
95
|
"ws": ">=8.20.1"
|
|
96
96
|
},
|
|
97
97
|
"name": "@codyswann/lisa",
|
|
98
|
-
"version": "2.
|
|
98
|
+
"version": "2.202.0",
|
|
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": {
|
|
@@ -23,6 +23,7 @@ Inspect only the Lisa automation fleet for the current project:
|
|
|
23
23
|
- `intake-tickets`
|
|
24
24
|
- `exploratory-bugs` when the current stack supports `exploratory-qa`
|
|
25
25
|
- `exploratory-prds`
|
|
26
|
+
- `monitor`
|
|
26
27
|
|
|
27
28
|
Resolve the expected project identifier, fleet naming prefix, queue arguments, cadence, and stack-support rules from the same contract used by `setup-automations` and `tear-down-automations`. Do **not** invent a second source of truth for fleet naming or queue resolution.
|
|
28
29
|
|
|
@@ -291,6 +291,62 @@ without turning the base doctor into a second `lisa-wiki-doctor`.
|
|
|
291
291
|
- Never require a wiki plugin surface when `wiki/` is absent.
|
|
292
292
|
- Never let wiki-specific checks downgrade unrelated non-wiki repositories.
|
|
293
293
|
|
|
294
|
+
### Upstream Lisa change-history diagnosis
|
|
295
|
+
|
|
296
|
+
A failing or warning check has two possible causes: the project drifted, or **Lisa itself changed
|
|
297
|
+
upstream** since this project last updated. Doctor must distinguish them instead of blaming the
|
|
298
|
+
project by default. Whenever findings need explanation — and always before proposing repairs —
|
|
299
|
+
pull Lisa's own git history and read what actually changed:
|
|
300
|
+
|
|
301
|
+
1. **Resolve the version window.** Determine the project's installed Lisa version (the
|
|
302
|
+
`@codyswann/lisa` entry in `package.json`/lockfile, or the plugin version stamp on the active
|
|
303
|
+
runtime) and the latest published version (`npm view @codyswann/lisa version`, or the update
|
|
304
|
+
check's cached result).
|
|
305
|
+
2. **Pull the upstream history for that window** (read-only; no clone required when `gh` is
|
|
306
|
+
available):
|
|
307
|
+
|
|
308
|
+
```bash
|
|
309
|
+
gh api "repos/CodySwannGT/lisa/compare/v<installed>...v<latest>" \
|
|
310
|
+
--paginate --slurp \
|
|
311
|
+
--jq '{total_commits: .[0].total_commits, files: [.[0].files[]?.filename], commits: [.[].commits[]? | .commit.message | split("\n")[0]]}'
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
`--paginate` fetches every page of commits, and `--slurp` gathers those pages into a single
|
|
315
|
+
array before `--jq` runs — without `--slurp`, `--jq` applies per page and prints one JSON object
|
|
316
|
+
per page instead of one merged result. `total_commits` and `files` only need the first page
|
|
317
|
+
(files are capped at 300 and not repeated on later pages); `commits` flattens across all pages.
|
|
318
|
+
|
|
319
|
+
The compare endpoint paginates commits (250 without `--paginate`) and only lists changed files
|
|
320
|
+
on the first page, capped at 300 total — a large version window can silently drop commits or
|
|
321
|
+
files. If `total_commits` or the file count looks truncated, re-run with the
|
|
322
|
+
`application/vnd.github.diff` accept header (`gh api ... -H "Accept: application/vnd.github.diff"`)
|
|
323
|
+
to pull the full patch text, or fall back to the shallow-clone `git log` below. When completeness
|
|
324
|
+
still can't be established, say so in the finding and mark it `WARN` rather than attributing
|
|
325
|
+
drift with unverified confidence.
|
|
326
|
+
|
|
327
|
+
Fallbacks, in order: `gh api repos/CodySwannGT/lisa/commits?path=<template-path>` for a
|
|
328
|
+
path-scoped view — note this endpoint has no way to bound results to the `v<installed>..v<latest>`
|
|
329
|
+
window, so treat its output as best-effort context only, not authoritative attribution; a shallow
|
|
330
|
+
clone (`git clone --filter=blob:none --no-checkout` then `git log v<installed>..v<latest> --
|
|
331
|
+
<paths>`), which *is* bounded to the window and should be preferred for definitive attribution; or
|
|
332
|
+
the local marketplace/plugin cache checkout when the runtime has one. If none are reachable, or
|
|
333
|
+
only the unbounded path-scoped fallback is reachable, report the gap as a `WARN`-level
|
|
334
|
+
observability note — never fail the audit because history was unavailable or incomplete.
|
|
335
|
+
3. **Scope the reading to what the finding touches.** Filter the commit list to the paths that
|
|
336
|
+
generate the failing surface: the detected stacks' template dirs (`typescript/`, `expo/`, …),
|
|
337
|
+
`plugins/src/base/` for skills/hooks/rules, `scripts/` for governance scripts, and the shipped
|
|
338
|
+
config factories (`src/configs/`). A finding about a lint rule failure reads the lint-config
|
|
339
|
+
commits, not the whole log.
|
|
340
|
+
4. **Attribute the finding.** When the upstream history shows Lisa changed the contract (a
|
|
341
|
+
tightened lint rule, a renamed check context, a new required config key), say so in `Observed:`
|
|
342
|
+
with the commit subject/version, and let `Remediation:` point at the sanctioned adoption path
|
|
343
|
+
(e.g. `lisa update` + re-apply, a documented config opt-out) rather than hand-editing managed
|
|
344
|
+
files. When history shows no relevant upstream change, the project drifted — remediate on the
|
|
345
|
+
project side.
|
|
346
|
+
|
|
347
|
+
This history pull is part of doctor's read-only contract: it reads Lisa's repository, never writes
|
|
348
|
+
to it, and repair suggestions stay suggestions.
|
|
349
|
+
|
|
294
350
|
## Output contract
|
|
295
351
|
|
|
296
352
|
The final report must:
|
|
@@ -96,6 +96,7 @@ Each gate is tagged with a fixed `category` and a `product_relevant` boolean. Ca
|
|
|
96
96
|
| F2 Parent sub-issue exists and is the right type | `structural` | false |
|
|
97
97
|
| F3 Linked issues exist | `structural` | false |
|
|
98
98
|
| F4 Required labels populated | `structural` | false |
|
|
99
|
+
| F5 Required external access provable | `technical` | true |
|
|
99
100
|
|
|
100
101
|
Category values are the same fixed set as `lisa-jira-validate-ticket`:
|
|
101
102
|
|
|
@@ -257,6 +258,31 @@ For each entry in `links`, run `gh issue view <number> --repo <link-org>/<link-r
|
|
|
257
258
|
|
|
258
259
|
Per `Phase 5` of `lisa-github-write-issue`, every issue MUST carry: `type:<issue_type>`, `status:<status>`, `priority:<priority>`. If any are missing from the spec / live issue, FAIL with the missing label name.
|
|
259
260
|
|
|
261
|
+
#### F5 — Required external access provable
|
|
262
|
+
|
|
263
|
+
The factory-gate rule: an input must not enter the pipeline unless the current runtime can actually
|
|
264
|
+
reach every external surface the work requires. Enumerate the surfaces this issue depends on:
|
|
265
|
+
|
|
266
|
+
- artifact links in the body (documents, designs, dashboards, spreadsheets, recordings),
|
|
267
|
+
- systems named by the description, acceptance criteria, or Validation Journey ("read the CloudWatch
|
|
268
|
+
alarms", "pull the copy from the Google Doc", "check the Sentry issues"),
|
|
269
|
+
- tooling the work plainly implies (a deploy target, a database, a third-party API).
|
|
270
|
+
|
|
271
|
+
For each surface, prove **read** access from the current runtime with the cheapest read-only probe
|
|
272
|
+
through the sanctioned access layer: the matching MCP tool or `lisa-*-access` skill, CLI auth
|
|
273
|
+
(`aws sts get-caller-identity`, `gh auth status`, vendor equivalents), or an authenticated fetch of
|
|
274
|
+
the linked artifact. Attempt to resolve a gap before failing — an alternate substrate, a configured
|
|
275
|
+
access layer, a keychain credential — mirroring the intake agent's discover-first duty.
|
|
276
|
+
|
|
277
|
+
- `PASS` — every required surface is provably readable.
|
|
278
|
+
- `N/A` — the issue needs nothing beyond the repository and the tracker itself.
|
|
279
|
+
- `FAIL` — a required surface is unreachable after the resolution attempt. Name the exact surface
|
|
280
|
+
and what was probed. Intake callers must route this to `blocked` + human escalation with the
|
|
281
|
+
missing access spelled out — an input the factory cannot execute never enters the factory.
|
|
282
|
+
|
|
283
|
+
Probes are read-only and bounded (seconds, not minutes, per surface); never mutate the external
|
|
284
|
+
system, and never invent or ask for credentials inline.
|
|
285
|
+
|
|
260
286
|
## Execution
|
|
261
287
|
|
|
262
288
|
1. Parse `$ARGUMENTS`. If it's an issue ref, fetch via `gh issue view --json` and derive the spec fields — including `build_ready` (label set contains `status:ready`) and `child_refs` (native sub-issues plus body task-list / `Blocked by #<n>` parentage, resolved as in `lisa-github-read-issue`) so S15 can classify the issue. Otherwise parse the YAML spec.
|
|
@@ -294,6 +320,7 @@ Output is a single fenced text block. Callers parse it; do not add free-form pro
|
|
|
294
320
|
- [PASS|FAIL|N/A] F2 Parent sub-issue exists and is the right type — <one-line reason>
|
|
295
321
|
- [PASS|FAIL|N/A] F3 Linked issues exist — <one-line reason>
|
|
296
322
|
- [PASS|FAIL|N/A] F4 Required labels populated — <one-line reason>
|
|
323
|
+
- [PASS|FAIL|N/A] F5 Required external access provable — <one-line reason>
|
|
297
324
|
|
|
298
325
|
### Verdict: PASS | FAIL
|
|
299
326
|
### Failures: <count>
|
|
@@ -313,7 +340,7 @@ The verdict is `PASS` if every applicable gate is `PASS`. Any `FAIL` makes the v
|
|
|
313
340
|
|
|
314
341
|
Same shape and meaning as `lisa-jira-validate-ticket` so downstream PRD-intake skills (Notion, Confluence, Linear, GitHub) can format comments uniformly:
|
|
315
342
|
|
|
316
|
-
- **gate**: the gate ID (`S1`–`S15`, `F1`–`
|
|
343
|
+
- **gate**: the gate ID (`S1`–`S15`, `F1`–`F5`).
|
|
317
344
|
- **category**: the gate's fixed category from the table.
|
|
318
345
|
- **product_relevant**: matches the gate's table entry. `false` means the failure is an internal data-quality problem the caller should fix without bothering product.
|
|
319
346
|
- **what**: plain-language, product-readable.
|
|
@@ -93,6 +93,7 @@ Each gate is tagged with a fixed `category` and a `product_relevant` boolean. Ca
|
|
|
93
93
|
| F2 Epic parent exists and is an Epic | `structural` | false |
|
|
94
94
|
| F3 Linked tickets exist | `structural` | false |
|
|
95
95
|
| F4 Required custom fields populated | `structural` | false |
|
|
96
|
+
| F5 Required external access provable | `technical` | true |
|
|
96
97
|
|
|
97
98
|
Category values are drawn from this fixed set:
|
|
98
99
|
|
|
@@ -246,6 +247,31 @@ For each entry in `links`, invoke `lisa-atlassian-access` `operation: read-ticke
|
|
|
246
247
|
|
|
247
248
|
Use the same project-issue-type-metadata lookup from F1 (via `lisa-atlassian-access`) to learn required custom fields for the issue type. Any required custom field not provided in the spec: FAIL.
|
|
248
249
|
|
|
250
|
+
#### F5 — Required external access provable
|
|
251
|
+
|
|
252
|
+
The factory-gate rule: an input must not enter the pipeline unless the current runtime can actually
|
|
253
|
+
reach every external surface the work requires. Enumerate the surfaces this item depends on:
|
|
254
|
+
|
|
255
|
+
- artifact links in the body (documents, designs, dashboards, spreadsheets, recordings),
|
|
256
|
+
- systems named by the description, acceptance criteria, or Validation Journey ("read the CloudWatch
|
|
257
|
+
alarms", "pull the copy from the Google Doc", "check the Sentry issues"),
|
|
258
|
+
- tooling the work plainly implies (a deploy target, a database, a third-party API).
|
|
259
|
+
|
|
260
|
+
For each surface, prove **read** access from the current runtime with the cheapest read-only probe
|
|
261
|
+
through the sanctioned access layer: the matching MCP tool or `lisa-*-access` skill, CLI auth
|
|
262
|
+
(`aws sts get-caller-identity`, `gh auth status`, vendor equivalents), or an authenticated fetch of
|
|
263
|
+
the linked artifact. Attempt to resolve a gap before failing — an alternate substrate, a configured
|
|
264
|
+
access layer, a keychain credential — mirroring the intake agent's discover-first duty.
|
|
265
|
+
|
|
266
|
+
- `PASS` — every required surface is provably readable.
|
|
267
|
+
- `N/A` — the item needs nothing beyond the repository and the tracker itself.
|
|
268
|
+
- `FAIL` — a required surface is unreachable after the resolution attempt. Name the exact surface
|
|
269
|
+
and what was probed. Intake callers must route this to `blocked` + human escalation with the
|
|
270
|
+
missing access spelled out — an input the factory cannot execute never enters the factory.
|
|
271
|
+
|
|
272
|
+
Probes are read-only and bounded (seconds, not minutes, per surface); never mutate the external
|
|
273
|
+
system, and never invent or ask for credentials inline.
|
|
274
|
+
|
|
249
275
|
## Execution
|
|
250
276
|
|
|
251
277
|
1. Parse `$ARGUMENTS`. If it's a ticket key, fetch the ticket via `lisa-atlassian-access` `operation: read-ticket` and derive the spec from the fetched fields — including `build_ready` (label set contains `status:ready`) and `child_refs` (sub-tasks plus `is blocked by` parentage, resolved as in `lisa-jira-read-ticket`) so S15 can classify the ticket. When the fetched description is ADF, walk the document tree and extract section headings from ADF `heading` nodes, then collect the text between heading nodes for section-specific gates. If the fetched description is a single paragraph containing literal Markdown/wiki heading markers, treat that as a formatting failure rather than accepting substring matches. Otherwise parse the YAML spec.
|
|
@@ -283,6 +309,7 @@ Output is a single fenced text block. Callers parse it; do not add free-form pro
|
|
|
283
309
|
- [PASS|FAIL|N/A] F2 Epic parent exists and is an Epic — <one-line reason>
|
|
284
310
|
- [PASS|FAIL|N/A] F3 Linked tickets exist — <one-line reason>
|
|
285
311
|
- [PASS|FAIL|N/A] F4 Required custom fields populated — <one-line reason>
|
|
312
|
+
- [PASS|FAIL|N/A] F5 Required external access provable — <one-line reason>
|
|
286
313
|
|
|
287
314
|
### Verdict: PASS | FAIL
|
|
288
315
|
### Failures: <count>
|
|
@@ -301,7 +328,7 @@ The verdict is `PASS` if and only if every applicable gate is `PASS`. Any `FAIL`
|
|
|
301
328
|
|
|
302
329
|
### Failure-detail fields
|
|
303
330
|
|
|
304
|
-
- **gate**: the gate ID (`S1`–`S15`, `F1`–`
|
|
331
|
+
- **gate**: the gate ID (`S1`–`S15`, `F1`–`F5`).
|
|
305
332
|
- **category**: the gate's fixed category from the table above. Callers use this to label or filter comments — `product-clarity`, `acceptance-criteria`, `design-ux`, `scope`, `dependency`, `data`, `technical`, or `structural`.
|
|
306
333
|
- **product_relevant**: matches the gate's table entry. `false` means the failure is an internal data-quality problem (e.g., the agent built a malformed spec, an issue type is invalid in the project) and the caller should fix it without bothering the product team. `true` means the PRD needs product input to resolve.
|
|
307
334
|
- **what**: plain-language description of the issue. No gate IDs, no JIRA jargon, no engineering shorthand. A product owner reading this on a Notion comment should understand what is unclear and why.
|
|
@@ -94,6 +94,7 @@ Each gate is tagged with a fixed `category` and a `product_relevant` boolean. Ca
|
|
|
94
94
|
| F2 Project parent exists and is in same team | `structural` | false |
|
|
95
95
|
| F3 Linked items exist | `structural` | false |
|
|
96
96
|
| F4 Required labels exist (or can be created) | `structural` | false |
|
|
97
|
+
| F5 Required external access provable | `technical` | true |
|
|
97
98
|
|
|
98
99
|
Category values are the same fixed set as `lisa-jira-validate-ticket`:
|
|
99
100
|
|
|
@@ -253,6 +254,31 @@ For each entry in `relations`, call `lisa-linear-access operation: get-issue` to
|
|
|
253
254
|
|
|
254
255
|
For each label referenced (`status:*`, `component:<name>`, `prd-*`), confirm via `lisa-linear-access operation: list-issue-labels` (or `lisa-linear-access operation: list-project-labels` for Project labels) that it exists OR is creatable. Linear labels are team-scoped or workspace-scoped; flag if the requested scope is wrong.
|
|
255
256
|
|
|
257
|
+
#### F5 — Required external access provable
|
|
258
|
+
|
|
259
|
+
The factory-gate rule: an input must not enter the pipeline unless the current runtime can actually
|
|
260
|
+
reach every external surface the work requires. Enumerate the surfaces this item depends on:
|
|
261
|
+
|
|
262
|
+
- artifact links in the body (documents, designs, dashboards, spreadsheets, recordings),
|
|
263
|
+
- systems named by the description, acceptance criteria, or Validation Journey ("read the CloudWatch
|
|
264
|
+
alarms", "pull the copy from the Google Doc", "check the Sentry issues"),
|
|
265
|
+
- tooling the work plainly implies (a deploy target, a database, a third-party API).
|
|
266
|
+
|
|
267
|
+
For each surface, prove **read** access from the current runtime with the cheapest read-only probe
|
|
268
|
+
through the sanctioned access layer: the matching MCP tool or `lisa-*-access` skill, CLI auth
|
|
269
|
+
(`aws sts get-caller-identity`, `gh auth status`, vendor equivalents), or an authenticated fetch of
|
|
270
|
+
the linked artifact. Attempt to resolve a gap before failing — an alternate substrate, a configured
|
|
271
|
+
access layer, a keychain credential — mirroring the intake agent's discover-first duty.
|
|
272
|
+
|
|
273
|
+
- `PASS` — every required surface is provably readable.
|
|
274
|
+
- `N/A` — the item needs nothing beyond the repository and the tracker itself.
|
|
275
|
+
- `FAIL` — a required surface is unreachable after the resolution attempt. Name the exact surface
|
|
276
|
+
and what was probed. Intake callers must route this to `blocked` + human escalation with the
|
|
277
|
+
missing access spelled out — an input the factory cannot execute never enters the factory.
|
|
278
|
+
|
|
279
|
+
Probes are read-only and bounded (seconds, not minutes, per surface); never mutate the external
|
|
280
|
+
system, and never invent or ask for credentials inline.
|
|
281
|
+
|
|
256
282
|
## Execution
|
|
257
283
|
|
|
258
284
|
1. Parse `$ARGUMENTS`. If it's an identifier, fetch the item and derive the spec from the fetched fields — including `build_ready` (label set contains `status:ready`) and `child_refs` (sub-issues, project-member issues, plus `blocked_by` parentage, resolved as in `lisa-linear-read-issue`) so S15 can classify the item. Otherwise parse the YAML spec.
|
|
@@ -290,6 +316,7 @@ Output is a single fenced text block. Callers parse it; do not add free-form pro
|
|
|
290
316
|
- [PASS|FAIL|N/A] F2 Project parent exists and is in same team — <one-line reason>
|
|
291
317
|
- [PASS|FAIL|N/A] F3 Linked items exist — <one-line reason>
|
|
292
318
|
- [PASS|FAIL|N/A] F4 Required labels exist (or can be created) — <one-line reason>
|
|
319
|
+
- [PASS|FAIL|N/A] F5 Required external access provable — <one-line reason>
|
|
293
320
|
|
|
294
321
|
### Verdict: PASS | FAIL
|
|
295
322
|
### Failures: <count>
|
|
@@ -28,18 +28,20 @@ create them; invoke the runtime's automation tool with the spec below.
|
|
|
28
28
|
|
|
29
29
|
## Parameters
|
|
30
30
|
|
|
31
|
-
- `auto-start-prds` (default **
|
|
31
|
+
- `auto-start-prds` (default **true**) — passed as `prd_ready` to the **exploratory-prds**
|
|
32
32
|
automation. `true` → ideated PRDs are created `prd-ready` (auto-picked-up by PRD intake); `false` →
|
|
33
33
|
created as drafts for human review. When `true`, `/lisa:project-ideation` still checks the configured
|
|
34
34
|
PRD queue before writing: existing `prd-ready`, `prd-in-review`, `prd-blocked`, unresolved
|
|
35
35
|
`prd-ticketed`, or unresolved source-reader pressure can intentionally turn the automation cycle into
|
|
36
36
|
a blocked/idle outcome instead of creating another ready PRD.
|
|
37
|
-
- `auto-start-tickets` (default **
|
|
37
|
+
- `auto-start-tickets` (default **true**) — passed as `ready` to the **exploratory-bugs**
|
|
38
38
|
automation. `true` → filed bug/usability tickets are created build-ready (auto-picked-up by ticket
|
|
39
39
|
intake); `false` → created in the backlog for human triage.
|
|
40
40
|
|
|
41
|
-
|
|
42
|
-
|
|
41
|
+
The defaults are autonomous by design — the factory model wants inputs flowing through the gates
|
|
42
|
+
without a human between the loops and the pipeline. Pass `false` explicitly to opt a project into
|
|
43
|
+
human triage. The two flags affect **only** the two exploratory automations; the intake gates'
|
|
44
|
+
adversarial validation remains the quality control either way.
|
|
43
45
|
|
|
44
46
|
## The automations to create
|
|
45
47
|
|
|
@@ -62,6 +64,7 @@ report the exact conflicting path(s).
|
|
|
62
64
|
| **intake-tickets** | `/lisa:intake <build queue>` (e.g. `github intake_mode=build`) | every **10 minutes** |
|
|
63
65
|
| **exploratory-bugs** | `/lisa-<stack>:exploratory-qa ready=<auto-start-tickets>` | **once a day** |
|
|
64
66
|
| **exploratory-prds** | `/lisa:project-ideation prd_ready=<auto-start-prds>` | **once a day** |
|
|
67
|
+
| **monitor** | `/lisa:monitor` | **once a day** |
|
|
65
68
|
|
|
66
69
|
For a Codex `rrule`: every 60 min → `FREQ=HOURLY;INTERVAL=1`; every 10 min →
|
|
67
70
|
`FREQ=MINUTELY;INTERVAL=10`; once a day → `FREQ=DAILY;INTERVAL=1`.
|
|
@@ -92,6 +95,11 @@ place (same names) rather than creating duplicates.
|
|
|
92
95
|
- **exploratory-bugs** is created only when the project ships an `exploratory-qa` command (the
|
|
93
96
|
`expo` / `rails` / `harper-fabric` stacks). If the project has no `lisa-exploratory-qa` skill/command, skip that
|
|
94
97
|
automation and note it — do not invent a command that doesn't exist.
|
|
98
|
+
- **monitor** is created unconditionally: `/lisa:monitor` resolves the connected observability
|
|
99
|
+
providers itself and reports gaps (per its `monitor.gapTiers` config) rather than failing when a
|
|
100
|
+
provider is absent, so an unconnected project gets gap findings instead of a broken automation.
|
|
101
|
+
Its findings become tracker tickets, feeding the pipeline at the build gate like every other
|
|
102
|
+
input.
|
|
95
103
|
- If the runtime has no native scheduler, or the intake queues can't be resolved from config, stop
|
|
96
104
|
and report what's missing rather than guessing.
|
|
97
105
|
- For Codex, if the durable checkout cannot be created, fetched, or verified as a non-bare Git work
|
|
@@ -21,9 +21,9 @@ removes them with its **native** scheduling mechanism.
|
|
|
21
21
|
|
|
22
22
|
## Scope (remove only what setup created)
|
|
23
23
|
|
|
24
|
-
- Remove the
|
|
24
|
+
- Remove the six automations `/setup-automations` creates for the current project, matched by the
|
|
25
25
|
stable `lisa-auto-<project>-` name prefix: `intake-repair`, `intake-prd`, `intake-tickets`,
|
|
26
|
-
`exploratory-bugs`, `exploratory-prds`.
|
|
26
|
+
`exploratory-bugs`, `exploratory-prds`, `monitor`.
|
|
27
27
|
- **Never** remove automations for a different project, or any non-Lisa automation (e.g. unrelated
|
|
28
28
|
crawlers/ingestors). Match strictly on the `lisa-auto-<project>-` prefix for THIS project; when in
|
|
29
29
|
doubt about an automation's ownership, leave it and report it rather than deleting it.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# The Factory Model (load-bearing)
|
|
2
|
+
|
|
3
|
+
This project runs as a set of **software factories** — agent-operated production lines with as few
|
|
4
|
+
humans as possible. You are factory machinery, not a chat assistant. Four factories: **Research**
|
|
5
|
+
(creates PRDs) → **Plan** (PRDs → work units) → **Implement** (work units → quality software) →
|
|
6
|
+
**Verify** (go/no-go by using the software like a human; failures become build-ready tickets that
|
|
7
|
+
flow straight back into Implement).
|
|
8
|
+
|
|
9
|
+
The rules that follow from this:
|
|
10
|
+
|
|
11
|
+
1. **Humans are not inside the factories.** Never pause mid-flow to ask a human whether to proceed.
|
|
12
|
+
All handoff happens at the **gates** — the ready-role flips (`prd-ready`, `status:ready`) plus
|
|
13
|
+
intake's adversarial validation.
|
|
14
|
+
2. **The gate is adversarial.** An input enters a factory only when it is high-quality,
|
|
15
|
+
unambiguous, and the factory has the tooling *and provable access to that tooling* to execute it
|
|
16
|
+
(validator gate F5). Try to discover the answers to gaps first; what you genuinely cannot
|
|
17
|
+
resolve, reject to `blocked` and raise to a human with the exact missing thing named.
|
|
18
|
+
3. **Everything runs on schedule.** The intake, QA, Product Planning, and Monitoring loops run as
|
|
19
|
+
native automations (Claude Routines / Codex Automations). Every flow must therefore work
|
|
20
|
+
headless: no interactive prompts, idempotent re-runs, clean exits on empty queues.
|
|
21
|
+
4. **Quality is enforced, not requested.** The skills, hooks, quality checks, and guardrails exist
|
|
22
|
+
to keep the software enterprise-grade and maintainable. Never weaken a gate to get work through
|
|
23
|
+
it — fix the work.
|
|
24
|
+
5. **Write outward for a non-technical operator.** The goal of the factory setup is to let
|
|
25
|
+
non-technical people create scalable software. Everything that crosses a gate outward — blocked
|
|
26
|
+
reasons, clarifying questions, ticket descriptions, verification reports — must be readable by
|
|
27
|
+
someone who does not code; they own product intent, the factories own the engineering.
|
|
28
|
+
6. **Every supported coding agent is a first-class operator.** Claude Code, Codex, Cursor,
|
|
29
|
+
OpenCode, Antigravity, Copilot — behavior must stay in parity, and anything persisted for
|
|
30
|
+
agents must be visible to all of them.
|
|
31
|
+
|
|
32
|
+
End state: end users have zero direct contact with coding agents — they interact with the tracker,
|
|
33
|
+
the PRD source, and the shipped software.
|
|
34
|
+
|
|
35
|
+
Full reference (factory ↔ Lisa surface mapping, loop details, human exterior gates):
|
|
36
|
+
[reference/factory-model.md](../reference/factory-model.md).
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# The Factory Model
|
|
2
|
+
|
|
3
|
+
Lisa's purpose is to run **software factories** in the host project: agent-operated production
|
|
4
|
+
lines that research, plan, implement, and verify software with as few humans as possible. This
|
|
5
|
+
reference maps the model onto the concrete Lisa surfaces so agents act on it rather than around it.
|
|
6
|
+
|
|
7
|
+
## Who this is for
|
|
8
|
+
|
|
9
|
+
The goal of the factory setup is to let **non-technical people create scalable, enterprise-grade
|
|
10
|
+
software** by describing outcomes; the factories supply the engineering discipline. This lowers the
|
|
11
|
+
floor without capping the ceiling — engineers get leverage from the same machinery — and it is why
|
|
12
|
+
the validation gates carry product-readable failure text (`product_relevant`, plain-language
|
|
13
|
+
`what`/`recommendation` fields): the person standing at the gate does not read stack traces. Every
|
|
14
|
+
outward-facing artifact an agent produces (blocked reasons, clarifying questions, tickets,
|
|
15
|
+
verification reports, console copy) is written for that operator.
|
|
16
|
+
|
|
17
|
+
## The four factories
|
|
18
|
+
|
|
19
|
+
| Factory | Creates | Lisa surface | Gate (input signal) |
|
|
20
|
+
|---|---|---|---|
|
|
21
|
+
| **Research** | PRDs | `/lisa:research`, `/lisa:project-ideation` | Prompts and ideation are the main entry points |
|
|
22
|
+
| **Plan** | Work units (epics, stories, tickets, tasks) | `/lisa:plan` → the `*-to-tracker` pipeline | PRD flipped to `prd-ready`, claimed by PRD intake |
|
|
23
|
+
| **Implement** | Quality software (tests, code, UI, APIs, infrastructure) | `/lisa:implement` → build flows | Work unit flipped to `status:ready`, claimed by build intake |
|
|
24
|
+
| **Verify** | A go/no-go decision | `/lisa:verify-prd` (PRD level), `/lisa:verify` (change level) | Shipped PRD rolled up by intake |
|
|
25
|
+
|
|
26
|
+
Verify's no-go path is deliberate: failures re-open the PRD as `ticketed` with **build-ready** fix
|
|
27
|
+
tickets that flow straight back into Implement — never `blocked`. The loop is self-healing.
|
|
28
|
+
|
|
29
|
+
## The gates
|
|
30
|
+
|
|
31
|
+
Handoff happens **outside** the factories. Agents, humans, and automations submit inputs; the
|
|
32
|
+
intake agent (`/lisa:intake`, the `*-prd-intake` / `*-build-intake` agents) adversarially evaluates
|
|
33
|
+
each one:
|
|
34
|
+
|
|
35
|
+
- **Quality**: the validation gates (three-audience description, Gherkin acceptance criteria,
|
|
36
|
+
Validation Journey, structure, scope).
|
|
37
|
+
- **Executability**: the factory must have the tooling *and provable read access to that tooling*
|
|
38
|
+
for everything the input requires — linked documents, dashboards, cloud resources, third-party
|
|
39
|
+
APIs (validator gate **F5 — Required external access provable**). An input the factory cannot
|
|
40
|
+
execute never enters the factory.
|
|
41
|
+
- **Discover-first duty**: intake tries to resolve gaps itself (alternate substrates, configured
|
|
42
|
+
access layers, searching for the missing context). What it genuinely cannot resolve it rejects —
|
|
43
|
+
`blocked` plus a human-needed marker, with clarifying questions or the exact missing access named.
|
|
44
|
+
|
|
45
|
+
## The loops
|
|
46
|
+
|
|
47
|
+
Three schedules feed the pipeline continuously, created by `/lisa:setup-automations` on the
|
|
48
|
+
runtime's native scheduler (Claude Routines, Codex Automations):
|
|
49
|
+
|
|
50
|
+
| Loop | Automation | Feeds | Cadence |
|
|
51
|
+
|---|---|---|---|
|
|
52
|
+
| QA | `exploratory-bugs` (`/lisa:exploratory-qa`) | Implement gate (bug tickets) | daily |
|
|
53
|
+
| Product Planning | `exploratory-prds` (`/lisa:project-ideation`) | Research/Plan gate (PRDs) | daily |
|
|
54
|
+
| Monitoring | `monitor` (`/lisa:monitor`) | Implement gate (regression tickets) | daily |
|
|
55
|
+
|
|
56
|
+
Plus the pipeline movers: `intake-prd` (hourly), `intake-tickets` (every 10 minutes),
|
|
57
|
+
`intake-repair` (hourly). **Autonomy is the default**: `auto-start-prds` and `auto-start-tickets`
|
|
58
|
+
default to `true`, so loop outputs enter the gates pickup-ready and the adversarial intake is the
|
|
59
|
+
quality control. Projects opt into human triage by passing `false`.
|
|
60
|
+
|
|
61
|
+
## Where humans stand
|
|
62
|
+
|
|
63
|
+
Humans act only at explicit exterior gates:
|
|
64
|
+
|
|
65
|
+
- flipping a draft they chose to hold back to `prd-ready` / `status:ready`,
|
|
66
|
+
- approving protected deployments (`github.environments.require_approval`),
|
|
67
|
+
- reviewing low-confidence learning PRs (auto-merge off),
|
|
68
|
+
- answering what intake rejected and raised.
|
|
69
|
+
|
|
70
|
+
Inside a flow, never pause to ask a human whether to proceed — the invocation was the authorization.
|
|
71
|
+
Headless discipline follows: no interactive prompts, idempotent re-runs, clean exits on empty
|
|
72
|
+
queues, and loud, specific failures when something is genuinely blocking.
|
|
73
|
+
|
|
74
|
+
## Quality and parity
|
|
75
|
+
|
|
76
|
+
Everything else Lisa installs — skills, hooks, quality checks, guardrails, CI gates, rulesets —
|
|
77
|
+
exists to enforce enterprise-grade quality and verification standards that keep the software
|
|
78
|
+
maintainable. Never weaken a gate to get work through it; fix the work, or raise the
|
|
79
|
+
risk-acceptance decision to a human.
|
|
80
|
+
|
|
81
|
+
Every supported coding agent is a first-class factory operator: Claude Code, Codex, Cursor,
|
|
82
|
+
OpenCode, Antigravity (agy), Copilot. Behavior stays in parity across them, and anything persisted
|
|
83
|
+
for agents (rules, learnings, configuration) must be visible to all of them from a single source of
|
|
84
|
+
truth.
|
|
85
|
+
|
|
86
|
+
End state: end users have zero direct contact with coding agents. They interact with the tracker,
|
|
87
|
+
the PRD source, and the shipped software — the factories do the rest.
|
|
@@ -23,6 +23,7 @@ Inspect only the Lisa automation fleet for the current project:
|
|
|
23
23
|
- `intake-tickets`
|
|
24
24
|
- `exploratory-bugs` when the current stack supports `exploratory-qa`
|
|
25
25
|
- `exploratory-prds`
|
|
26
|
+
- `monitor`
|
|
26
27
|
|
|
27
28
|
Resolve the expected project identifier, fleet naming prefix, queue arguments, cadence, and stack-support rules from the same contract used by `setup-automations` and `tear-down-automations`. Do **not** invent a second source of truth for fleet naming or queue resolution.
|
|
28
29
|
|
|
@@ -291,6 +291,62 @@ without turning the base doctor into a second `lisa-wiki-doctor`.
|
|
|
291
291
|
- Never require a wiki plugin surface when `wiki/` is absent.
|
|
292
292
|
- Never let wiki-specific checks downgrade unrelated non-wiki repositories.
|
|
293
293
|
|
|
294
|
+
### Upstream Lisa change-history diagnosis
|
|
295
|
+
|
|
296
|
+
A failing or warning check has two possible causes: the project drifted, or **Lisa itself changed
|
|
297
|
+
upstream** since this project last updated. Doctor must distinguish them instead of blaming the
|
|
298
|
+
project by default. Whenever findings need explanation — and always before proposing repairs —
|
|
299
|
+
pull Lisa's own git history and read what actually changed:
|
|
300
|
+
|
|
301
|
+
1. **Resolve the version window.** Determine the project's installed Lisa version (the
|
|
302
|
+
`@codyswann/lisa` entry in `package.json`/lockfile, or the plugin version stamp on the active
|
|
303
|
+
runtime) and the latest published version (`npm view @codyswann/lisa version`, or the update
|
|
304
|
+
check's cached result).
|
|
305
|
+
2. **Pull the upstream history for that window** (read-only; no clone required when `gh` is
|
|
306
|
+
available):
|
|
307
|
+
|
|
308
|
+
```bash
|
|
309
|
+
gh api "repos/CodySwannGT/lisa/compare/v<installed>...v<latest>" \
|
|
310
|
+
--paginate --slurp \
|
|
311
|
+
--jq '{total_commits: .[0].total_commits, files: [.[0].files[]?.filename], commits: [.[].commits[]? | .commit.message | split("\n")[0]]}'
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
`--paginate` fetches every page of commits, and `--slurp` gathers those pages into a single
|
|
315
|
+
array before `--jq` runs — without `--slurp`, `--jq` applies per page and prints one JSON object
|
|
316
|
+
per page instead of one merged result. `total_commits` and `files` only need the first page
|
|
317
|
+
(files are capped at 300 and not repeated on later pages); `commits` flattens across all pages.
|
|
318
|
+
|
|
319
|
+
The compare endpoint paginates commits (250 without `--paginate`) and only lists changed files
|
|
320
|
+
on the first page, capped at 300 total — a large version window can silently drop commits or
|
|
321
|
+
files. If `total_commits` or the file count looks truncated, re-run with the
|
|
322
|
+
`application/vnd.github.diff` accept header (`gh api ... -H "Accept: application/vnd.github.diff"`)
|
|
323
|
+
to pull the full patch text, or fall back to the shallow-clone `git log` below. When completeness
|
|
324
|
+
still can't be established, say so in the finding and mark it `WARN` rather than attributing
|
|
325
|
+
drift with unverified confidence.
|
|
326
|
+
|
|
327
|
+
Fallbacks, in order: `gh api repos/CodySwannGT/lisa/commits?path=<template-path>` for a
|
|
328
|
+
path-scoped view — note this endpoint has no way to bound results to the `v<installed>..v<latest>`
|
|
329
|
+
window, so treat its output as best-effort context only, not authoritative attribution; a shallow
|
|
330
|
+
clone (`git clone --filter=blob:none --no-checkout` then `git log v<installed>..v<latest> --
|
|
331
|
+
<paths>`), which *is* bounded to the window and should be preferred for definitive attribution; or
|
|
332
|
+
the local marketplace/plugin cache checkout when the runtime has one. If none are reachable, or
|
|
333
|
+
only the unbounded path-scoped fallback is reachable, report the gap as a `WARN`-level
|
|
334
|
+
observability note — never fail the audit because history was unavailable or incomplete.
|
|
335
|
+
3. **Scope the reading to what the finding touches.** Filter the commit list to the paths that
|
|
336
|
+
generate the failing surface: the detected stacks' template dirs (`typescript/`, `expo/`, …),
|
|
337
|
+
`plugins/src/base/` for skills/hooks/rules, `scripts/` for governance scripts, and the shipped
|
|
338
|
+
config factories (`src/configs/`). A finding about a lint rule failure reads the lint-config
|
|
339
|
+
commits, not the whole log.
|
|
340
|
+
4. **Attribute the finding.** When the upstream history shows Lisa changed the contract (a
|
|
341
|
+
tightened lint rule, a renamed check context, a new required config key), say so in `Observed:`
|
|
342
|
+
with the commit subject/version, and let `Remediation:` point at the sanctioned adoption path
|
|
343
|
+
(e.g. `lisa update` + re-apply, a documented config opt-out) rather than hand-editing managed
|
|
344
|
+
files. When history shows no relevant upstream change, the project drifted — remediate on the
|
|
345
|
+
project side.
|
|
346
|
+
|
|
347
|
+
This history pull is part of doctor's read-only contract: it reads Lisa's repository, never writes
|
|
348
|
+
to it, and repair suggestions stay suggestions.
|
|
349
|
+
|
|
294
350
|
## Output contract
|
|
295
351
|
|
|
296
352
|
The final report must:
|