cellenium 0.1.0__tar.gz
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.
- cellenium-0.1.0/.claude/bin/checklist.js +114 -0
- cellenium-0.1.0/.claude/commands/testflow/artifact.md +9 -0
- cellenium-0.1.0/.claude/commands/testflow/checklist/before-startup.md +7 -0
- cellenium-0.1.0/.claude/commands/testflow/checklist/cruising.md +7 -0
- cellenium-0.1.0/.claude/commands/testflow/checklist/fordec.md +12 -0
- cellenium-0.1.0/.claude/commands/testflow/checklist/landing.md +7 -0
- cellenium-0.1.0/.claude/commands/testflow/evaluator.md +10 -0
- cellenium-0.1.0/.claude/commands/testflow/executor.md +10 -0
- cellenium-0.1.0/.claude/commands/testflow/locator-writer.md +10 -0
- cellenium-0.1.0/.claude/commands/testflow/prd-reader.md +10 -0
- cellenium-0.1.0/.claude/commands/testflow/test-spec.md +8 -0
- cellenium-0.1.0/.claude/commands/testflow/web.md +11 -0
- cellenium-0.1.0/.claude/commands/testflow/writer.md +10 -0
- cellenium-0.1.0/.claude/skills/checklist/before-startup/SKILL.md +70 -0
- cellenium-0.1.0/.claude/skills/checklist/cruising/SKILL.md +70 -0
- cellenium-0.1.0/.claude/skills/checklist/emergency/fordec/SKILL.md +164 -0
- cellenium-0.1.0/.claude/skills/checklist/landing/SKILL.md +68 -0
- cellenium-0.1.0/.claude/skills/testflow/artifact/SKILL.md +126 -0
- cellenium-0.1.0/.claude/skills/testflow/evaluator/SKILL.md +112 -0
- cellenium-0.1.0/.claude/skills/testflow/executor/SKILL.md +97 -0
- cellenium-0.1.0/.claude/skills/testflow/locator-writer/SKILL.md +126 -0
- cellenium-0.1.0/.claude/skills/testflow/prd-reader/SKILL.md +86 -0
- cellenium-0.1.0/.claude/skills/testflow/test-spec/SKILL.md +102 -0
- cellenium-0.1.0/.claude/skills/testflow/web/SKILL.md +195 -0
- cellenium-0.1.0/.claude/skills/testflow/writer/SKILL.md +97 -0
- cellenium-0.1.0/.claude/test/install.test.js +110 -0
- cellenium-0.1.0/.env.example +8 -0
- cellenium-0.1.0/.gitignore +11 -0
- cellenium-0.1.0/LICENSE +7 -0
- cellenium-0.1.0/PKG-INFO +224 -0
- cellenium-0.1.0/README.md +205 -0
- cellenium-0.1.0/pyproject.toml +37 -0
- cellenium-0.1.0/src/cellenium/__init__.py +0 -0
- cellenium-0.1.0/src/cellenium/ai/__init__.py +0 -0
- cellenium-0.1.0/src/cellenium/ai/agents/__init__.py +0 -0
- cellenium-0.1.0/src/cellenium/ai/agents/vision/__init__.py +0 -0
- cellenium-0.1.0/src/cellenium/ai/agents/vision/config/agents.yaml +10 -0
- cellenium-0.1.0/src/cellenium/ai/agents/vision/config/tasks.yaml +15 -0
- cellenium-0.1.0/src/cellenium/ai/agents/vision/crew.py +33 -0
- cellenium-0.1.0/src/cellenium/ai/agents/vision/schemas.py +41 -0
- cellenium-0.1.0/src/cellenium/ai/agents/vision/skills/evaluator/SKILL.md +14 -0
- cellenium-0.1.0/src/cellenium/ai/agents/vision/skills/vision/SKILL.md +19 -0
- cellenium-0.1.0/src/cellenium/ai/agents/vision/tools/vision.py +167 -0
- cellenium-0.1.0/src/cellenium/ai/config.py +17 -0
- cellenium-0.1.0/src/cellenium/ai/tools/__init__.py +0 -0
- cellenium-0.1.0/src/cellenium/ai/tools/image_encoder.py +10 -0
- cellenium-0.1.0/src/cellenium/engine/__init__.py +0 -0
- cellenium-0.1.0/src/cellenium/engine/manager.py +48 -0
- cellenium-0.1.0/src/cellenium/engine/page_engine.py +79 -0
- cellenium-0.1.0/src/cellenium/functions/__init__.py +0 -0
- cellenium-0.1.0/src/cellenium/functions/locators.py +38 -0
- cellenium-0.1.0/src/cellenium/functions/logger.py +44 -0
- cellenium-0.1.0/src/cellenium/functions/sheets.py +71 -0
- cellenium-0.1.0/src/cellenium/settings.py +26 -0
- cellenium-0.1.0/tests/e2e/conftest.py +12 -0
- cellenium-0.1.0/tests/e2e/test_google_search.py +17 -0
- cellenium-0.1.0/tests/test_google_sheet_locators.py +78 -0
- cellenium-0.1.0/tests/test_page_engine.py +52 -0
- cellenium-0.1.0/tests/test_settings.py +40 -0
- cellenium-0.1.0/uv.lock +3896 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
const fs = require('node:fs');
|
|
5
|
+
const os = require('node:os');
|
|
6
|
+
const path = require('node:path');
|
|
7
|
+
|
|
8
|
+
const PACKAGE_ROOT = path.resolve(__dirname, '..');
|
|
9
|
+
const FEATURE = 'checklist';
|
|
10
|
+
// Each skill is independent; fordec is the standalone emergency skill.
|
|
11
|
+
// `relPath` is where the skill lives under skills/checklist/ in this repo;
|
|
12
|
+
// it installs flat as skills/checklist/<name> regardless of source nesting.
|
|
13
|
+
const SKILLS = [
|
|
14
|
+
{ name: 'before-startup', relPath: 'before-startup' },
|
|
15
|
+
{ name: 'cruising', relPath: 'cruising' },
|
|
16
|
+
{ name: 'landing', relPath: 'landing' },
|
|
17
|
+
{ name: 'fordec', relPath: 'emergency/fordec' },
|
|
18
|
+
];
|
|
19
|
+
|
|
20
|
+
function filesMatch(left, right) {
|
|
21
|
+
return (
|
|
22
|
+
fs.existsSync(left) &&
|
|
23
|
+
fs.existsSync(right) &&
|
|
24
|
+
fs.readFileSync(left).equals(fs.readFileSync(right))
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function installSkills({ projectRoot = process.cwd(), global = false, force = false } = {}) {
|
|
29
|
+
const target = global
|
|
30
|
+
? path.join(os.homedir(), '.claude', 'skills', FEATURE)
|
|
31
|
+
: path.join(path.resolve(projectRoot), '.claude', 'skills', FEATURE);
|
|
32
|
+
const unchanged = [];
|
|
33
|
+
const pending = [];
|
|
34
|
+
|
|
35
|
+
for (const { name: skill, relPath } of SKILLS) {
|
|
36
|
+
const source = path.join(PACKAGE_ROOT, 'skills', FEATURE, relPath);
|
|
37
|
+
const destination = path.join(target, skill);
|
|
38
|
+
const sourceSkill = path.join(source, 'SKILL.md');
|
|
39
|
+
const destinationSkill = path.join(destination, 'SKILL.md');
|
|
40
|
+
|
|
41
|
+
if (!fs.existsSync(destination)) {
|
|
42
|
+
pending.push({ destination, source, skill });
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (filesMatch(sourceSkill, destinationSkill)) {
|
|
47
|
+
unchanged.push(skill);
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (!force) {
|
|
52
|
+
throw new Error(
|
|
53
|
+
`Refusing to overwrite existing skill: ${skill}. Re-run with --force to replace it.`,
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
pending.push({ destination, source, skill });
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
fs.mkdirSync(target, { recursive: true });
|
|
61
|
+
for (const { destination, source } of pending) {
|
|
62
|
+
fs.rmSync(destination, { force: true, recursive: true });
|
|
63
|
+
fs.cpSync(source, destination, { recursive: true });
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return {
|
|
67
|
+
installed: pending.map(({ skill }) => skill),
|
|
68
|
+
target,
|
|
69
|
+
unchanged,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function printHelp() {
|
|
74
|
+
process.stdout.write(`Checklist skills installer (before-startup, cruising, landing, fordec)\n\nUsage:\n fordec-checklist [--global] [--force]\n\nOptions:\n --global Install into ~/.claude/skills/testflow instead of ./.claude/skills/testflow\n --force Replace skills with local modifications\n --help Show this help\n --version Show the package version\n`);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function run(argv = process.argv.slice(2)) {
|
|
78
|
+
const known = new Set(['--force', '--global', '--help', '-h', '--version', '-v']);
|
|
79
|
+
const unknown = argv.find((argument) => !known.has(argument));
|
|
80
|
+
if (unknown) {
|
|
81
|
+
throw new Error(`Unknown option: ${unknown}`);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (argv.includes('--help') || argv.includes('-h')) {
|
|
85
|
+
printHelp();
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (argv.includes('--version') || argv.includes('-v')) {
|
|
90
|
+
const { version } = require('../../package.json');
|
|
91
|
+
process.stdout.write(`${version}\n`);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const result = installSkills({
|
|
96
|
+
force: argv.includes('--force'),
|
|
97
|
+
global: argv.includes('--global'),
|
|
98
|
+
});
|
|
99
|
+
const installed = result.installed.length
|
|
100
|
+
? `Installed: ${result.installed.join(', ')}`
|
|
101
|
+
: 'All skills already match this package.';
|
|
102
|
+
process.stdout.write(`${installed}\nClaude Code skills directory: ${result.target}\n`);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if (require.main === module) {
|
|
106
|
+
try {
|
|
107
|
+
run();
|
|
108
|
+
} catch (error) {
|
|
109
|
+
process.stderr.write(`${error.message}\n`);
|
|
110
|
+
process.exitCode = 1;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
module.exports = { installSkills, run };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: artifact
|
|
3
|
+
description: Turn a PRD or specification into traceable pytest tests, execute them, and evaluate their quality through the complete TestFlow pipeline.
|
|
4
|
+
argument-hint: <PRD/spec path and test target>
|
|
5
|
+
command: /testflow:artifact
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Invoke the Skill tool with `skill: "testflow:artifact"` before doing anything else.
|
|
9
|
+
Pass `$ARGUMENTS` as the pipeline input and complete every reachable TestFlow stage.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: before-startup
|
|
3
|
+
description: System readiness check before building tests. Use before starting TestFlow or writing any test to verify that the repository, toolchain, browsers, configuration, external services, test infrastructure, baseline, and inputs are healthy and ready for test creation.
|
|
4
|
+
command: /before-startup
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Invoke the Skill tool with `skill: "testflow:before-startup"` before doing anything else.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cruising
|
|
3
|
+
description: In-flight check while tests are being built. Use after any TestFlow stage, after writing or changing tests, or before a commit or PR to verify that everything is in place and to hunt for critical errors and potential bugs in the tests, locators, fixtures, and observed product behavior.
|
|
4
|
+
command: /cruising
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Invoke the Skill tool with `skill: "testflow:cruising"` before doing anything else.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: fordec
|
|
3
|
+
description: |
|
|
4
|
+
Software incident and emergency decision cycle using the aviation-derived FORDEC model:
|
|
5
|
+
Facts, Options, Risks & Benefits, Decision, Execution, Check.
|
|
6
|
+
Use when a production outage, failed deploy, broken main branch,
|
|
7
|
+
data corruption, security incident, or other consequential engineering
|
|
8
|
+
problem needs a clear, time-aware choice, assigned actions, and active reassessment.
|
|
9
|
+
command: /fordec
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
Invoke the Skill tool with `skill: "testflow:fordec"` before doing anything else.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: landing
|
|
3
|
+
description: Final production-readiness checklist. Use before final PR approval, merge, release, or production deployment to verify the final state, compare land and go-around options, make an explicit decision, define or perform the authorized execution, and check production signals with rollback triggers.
|
|
4
|
+
command: /landing
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Invoke the Skill tool with `skill: "testflow:landing"` before doing anything else.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: evaluator
|
|
3
|
+
description: Evaluate pytest tests against requirements, specifications, implementation contracts, and execution evidence.
|
|
4
|
+
argument-hint: <requirements, tests, and execution results>
|
|
5
|
+
command: /testflow:evaluator
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Invoke the Skill tool with `skill: "testflow:evaluator"`
|
|
9
|
+
before doing anything else. Pass `$ARGUMENTS` as the evaluation
|
|
10
|
+
scope and return the coverage matrix, evidence-backed findings, residual risks, and verdict.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: executor
|
|
3
|
+
description: Run repository-native pytest commands, preserve exact evidence, and classify collection, environment, test, and product failures.
|
|
4
|
+
argument-hint: <test paths, node IDs, or markers>
|
|
5
|
+
command: /testflow:executor
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Invoke the Skill tool with `skill: "testflow:executor"` before doing anything else.
|
|
9
|
+
Pass `$ARGUMENTS` as the requested test selection and report exact commands,
|
|
10
|
+
results, failure classifications, and verdict.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: locator-writer
|
|
3
|
+
description: Discover stable Playwright locators, validate the target elements, and upsert them into the configured Google Sheets Page Object Model.
|
|
4
|
+
argument-hint: <page, screen, and required elements>
|
|
5
|
+
command: /testflow:locator-writer
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Invoke the Skill tool with `skill: "testflow:locator-writer"`
|
|
9
|
+
before doing anything else. Pass `$ARGUMENTS` as the UI target and element requirements.
|
|
10
|
+
Preview updates before replacing existing non-empty sheet rows.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: prd-reader
|
|
3
|
+
description: Extract testable, traceable pytest requirements from a PRD, feature brief, ticket, or acceptance criteria.
|
|
4
|
+
argument-hint: <PRD path, issue, or requirements>
|
|
5
|
+
command: /testflow:prd-reader
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Invoke the Skill tool with `skill: "testflow:prd-reader"`
|
|
9
|
+
before doing anything else. Pass `$ARGUMENTS` as the product
|
|
10
|
+
source and return the requirement matrix without running downstream stages.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: test-spec
|
|
3
|
+
description: Convert requirements and technical specifications into a complete, traceable pytest test specification.
|
|
4
|
+
argument-hint: <requirements/spec path and target>
|
|
5
|
+
command: /testflow:test-spec
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Invoke the Skill tool with `skill: "testflow:test-spec"` before doing anything else. Pass `$ARGUMENTS` as specification context and return the test strategy, cases, file plan, environment contract, and traceability map.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: web
|
|
3
|
+
description: Explore a live web application in a real browser to discover and document reproducible potential bugs with evidence.
|
|
4
|
+
argument-hint: <URL, scope, role, and optional PRD/spec>
|
|
5
|
+
command: /testflow:web
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Invoke the Skill tool with `skill: "testflow:web"`
|
|
9
|
+
before doing anything else. Pass `$ARGUMENTS` as the exploration charter.
|
|
10
|
+
Use a real browser, preserve safety boundaries,
|
|
11
|
+
and return verified findings plus regression-test candidates without modifying application code.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: writer
|
|
3
|
+
description: Implement approved test cases as deterministic, behavior-focused pytest tests that follow repository conventions.
|
|
4
|
+
argument-hint: <test specification and target>
|
|
5
|
+
command: /testflow:writer
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Invoke the Skill tool with `skill: "testflow:writer"`
|
|
9
|
+
before doing anything else. Pass `$ARGUMENTS` as the
|
|
10
|
+
approved test specification, write the pytest tests, and return collection plus targeted execution evidence.
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: before-startup
|
|
3
|
+
description: System readiness check before building tests. Use before starting TestFlow or writing any test to verify that the repository, toolchain, browsers, configuration, external services, test infrastructure, baseline, and inputs are healthy and ready for test creation.
|
|
4
|
+
disable-model-invocation: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Before Startup — Ready to Build Tests
|
|
8
|
+
|
|
9
|
+
Purpose: prove the system is healthy and ready to build tests before any test is designed or written. A test built on a broken environment produces failures that say nothing about the product.
|
|
10
|
+
|
|
11
|
+
## Workflow position
|
|
12
|
+
|
|
13
|
+
**1 of 3 — run first.** Use once before TestFlow (`prd-reader` → `test-spec` → `locator-writer` → `writer` → `executor` → `evaluator`) or any manual test work starts. When the verdict is **READY TO BUILD TESTS**, continue with `cruising` while tests are built. Use `landing` for the final check.
|
|
14
|
+
|
|
15
|
+
## How to run
|
|
16
|
+
|
|
17
|
+
Check every item from fresh command output and observed files. Memory and phrases such as "should be installed" are not evidence. Discover the real commands from the repository (`pyproject.toml`, `uv.lock`, CI workflow, README) before running them.
|
|
18
|
+
|
|
19
|
+
Do not fix anything silently. For each FAIL, give the exact fix command or action. Run only non-destructive setup (for example `uv sync --frozen` or `playwright install chromium`) when the user agrees. Never print secret values. Report only whether a secret is present and valid.
|
|
20
|
+
|
|
21
|
+
## 1. Repository
|
|
22
|
+
|
|
23
|
+
1. **Branch and working tree:** report the current branch, every modified or untracked file, and any merge, rebase, or cherry-pick in progress. Separate existing user work from work for this task.
|
|
24
|
+
2. **Integration state:** fetch the remote and report divergence from the integration branch. Do not assume it is `main`.
|
|
25
|
+
|
|
26
|
+
## 2. Toolchain and dependencies
|
|
27
|
+
|
|
28
|
+
3. **Python:** confirm the active interpreter matches the version `pyproject.toml` requires.
|
|
29
|
+
4. **Locked dependencies:** confirm the lockfile and environment agree (for example `uv sync --frozen` succeeds with no changes) and that `pytest`, its plugins (such as `pytest-xdist`), and `playwright` import.
|
|
30
|
+
5. **Browsers:** confirm the required Playwright browser is installed and launches. Run a headless launch smoke check, not just a file lookup.
|
|
31
|
+
|
|
32
|
+
## 3. Configuration and secrets
|
|
33
|
+
|
|
34
|
+
6. **Environment variables:** confirm `.env` exists and that every variable the settings contract requires is set and non-empty. List names only.
|
|
35
|
+
7. **Credentials:** confirm required credential files (such as `credentials.json`) exist, parse, and contain the expected fields. Confirm they are ignored by Git.
|
|
36
|
+
8. **Settings import:** import the settings module and confirm validation passes with no missing or malformed fields.
|
|
37
|
+
|
|
38
|
+
## 4. External services
|
|
39
|
+
|
|
40
|
+
9. **Application under test:** confirm the target URL or service responds with the expected page or status from this machine.
|
|
41
|
+
10. **Locator source:** for UI work, confirm the Google Sheet is reachable with the service account and that every worksheet/screen required by the target flow can be read directly.
|
|
42
|
+
11. **AI and model services:** when vision or LLM components are used, confirm the configured model and API key work with a minimal call.
|
|
43
|
+
|
|
44
|
+
## 5. Test infrastructure
|
|
45
|
+
|
|
46
|
+
12. **Collection:** `pytest --collect-only` completes with zero import, syntax, or fixture errors.
|
|
47
|
+
13. **Fixtures and engine:** shared fixtures and `conftest.py` import, and a browser session can be opened and torn down cleanly with no leaked processes.
|
|
48
|
+
14. **Output paths:** screenshot, report, and artifact directories exist and are writable.
|
|
49
|
+
|
|
50
|
+
## 6. Baseline
|
|
51
|
+
|
|
52
|
+
15. **Lint:** run the blocking CI lint command and report the result.
|
|
53
|
+
16. **Existing suite:** run the existing tests and record every pre-existing failure with its cause. New failures must be distinguishable from this baseline later.
|
|
54
|
+
|
|
55
|
+
## 7. Inputs for building tests
|
|
56
|
+
|
|
57
|
+
17. **Requirements:** the PRD, ticket, spec, or acceptance criteria exist and are readable.
|
|
58
|
+
18. **Target and data:** the flow, module, or endpoint under test is identified, and the required test accounts, data, and permissions are available.
|
|
59
|
+
19. **Blocking unknowns:** list any open product question that would change an expected result. An unresolved one is a FAIL for the affected scope.
|
|
60
|
+
|
|
61
|
+
## Report format
|
|
62
|
+
|
|
63
|
+
Output:
|
|
64
|
+
|
|
65
|
+
1. a `Area | # | item | PASS/FAIL/N-A | evidence` table;
|
|
66
|
+
2. a **Fixes** list: the exact command or action for every FAIL;
|
|
67
|
+
3. a **Baseline** line: pre-existing failures that are accepted;
|
|
68
|
+
4. the verdict **READY TO BUILD TESTS** or **NOT READY: <failing items>**.
|
|
69
|
+
|
|
70
|
+
A FAIL is a hard stop. Never start building tests past one silently.
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cruising
|
|
3
|
+
description: In-flight check while tests are being built. Use after any TestFlow stage, after writing or changing tests, or before a commit or PR to verify that everything is in place and to hunt for critical errors and potential bugs in the tests, locators, fixtures, and observed product behavior.
|
|
4
|
+
disable-model-invocation: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Cruising — Everything in Place, No Hidden Bugs
|
|
8
|
+
|
|
9
|
+
Purpose: while tests are being built, confirm that every piece is in place and catch critical errors and potential bugs before they harden into the suite.
|
|
10
|
+
|
|
11
|
+
## Workflow position
|
|
12
|
+
|
|
13
|
+
**2 of 3 — repeat while building tests.** Use after `before-startup` returns **READY TO BUILD TESTS**. Run it after each TestFlow stage (`prd-reader`, `test-spec`, `locator-writer`, `writer`, `executor`), after any manual test change, and before every commit or PR. Hand off to `landing` only when cruising returns **ON COURSE** with no open CRITICAL findings.
|
|
14
|
+
|
|
15
|
+
## How to run
|
|
16
|
+
|
|
17
|
+
First name the checkpoint: the TestFlow stage just finished, `TEST CHANGE`, `COMMIT`, or `PR`. Then run all four sections. Use command output, file paths with line numbers, and observed behavior. Green tests alone are not evidence that nothing is wrong.
|
|
18
|
+
|
|
19
|
+
Report findings; do not silently rewrite code. When the user asks for fixes, route each finding to the stage that owns it (`prd-reader`, `test-spec`, `locator-writer`, `writer`, `executor`) and run cruising again afterward.
|
|
20
|
+
|
|
21
|
+
## 1. Everything in place
|
|
22
|
+
|
|
23
|
+
1. **Working tree:** run `git status` and account for every changed or untracked file, including partial output from earlier or interrupted runs. Nothing unexplained may remain.
|
|
24
|
+
2. **Stage outputs:** every completed stage has its output. That means `PRD-*` requirements, `TST-*` cases with file plan, verified locators, and test files at the planned paths. Stable IDs are preserved across handoffs.
|
|
25
|
+
3. **Traceability:** every `PRD-*` requirement maps to at least one `TST-*` case, every `TST-*` case maps to a test function, and no test exists without a requirement.
|
|
26
|
+
4. **Locators:** every logical element the tests use exists in the correct Google Sheet worksheet/screen and resolves on the live page.
|
|
27
|
+
5. **Fixtures and data:** every fixture, test-data file, account, and environment variable the new tests need exists and is wired in.
|
|
28
|
+
6. **System still healthy:** recheck the `before-startup` critical items: dependencies, browser launch, settings import, and target reachability. An environment that has since degraded is a FAIL.
|
|
29
|
+
|
|
30
|
+
## 2. Collection and execution
|
|
31
|
+
|
|
32
|
+
7. **Collection:** `pytest --collect-only` is clean, and each new test is collected exactly once.
|
|
33
|
+
8. **Targeted run:** run the new and changed tests and report the exact command, exit code, and pass/fail/skip counts.
|
|
34
|
+
9. **Failure classification:** classify every failure as **product bug**, **test bug**, or **environment**. Use evidence: traceback, screenshot, and log. An environment failure is an invalid run, not a verdict.
|
|
35
|
+
10. **Flakiness:** rerun each failing or newly passing test at least once, and also under the CI parallel mode (for example `-n auto --dist loadscope`). Any result that differs between runs is a finding.
|
|
36
|
+
11. **Baseline drift:** compare the full-suite result with the `before-startup` baseline. Any new failure outside the changed tests is a finding.
|
|
37
|
+
|
|
38
|
+
## 3. Critical errors (hard stop)
|
|
39
|
+
|
|
40
|
+
Any item here is **CRITICAL**:
|
|
41
|
+
|
|
42
|
+
12. **Broken suite:** syntax, import, collection, or fixture-setup errors, plus blocking CI lint errors.
|
|
43
|
+
13. **Tests that cannot fail:** missing assertions, `assert True`, assertions on the wrong object, broad `except` that swallows failures, and `skip`/`xfail` without a stated reason and ticket.
|
|
44
|
+
14. **Leaks and cleanup:** browser sessions or processes not torn down (no `finally`/fixture teardown), and temp data or files left behind.
|
|
45
|
+
15. **Secrets and safety:** credentials, tokens, or `.env` values in code, logs, screenshots, or reports, and tests that write to production data or modify the shared Google Sheet unintentionally.
|
|
46
|
+
16. **Wrong target:** tests pointed at the wrong environment, URL, or account.
|
|
47
|
+
|
|
48
|
+
## 4. Potential bugs
|
|
49
|
+
|
|
50
|
+
Scan the new and changed tests, fixtures, and helpers, and report each finding with `file:line`:
|
|
51
|
+
|
|
52
|
+
17. **Fragile selectors:** index-based XPath, auto-generated classes, text that changes, and selectors matching more than one element.
|
|
53
|
+
18. **Timing:** `sleep` instead of explicit waits, missing waits after navigation or actions, and race-prone assertions.
|
|
54
|
+
19. **Isolation:** shared mutable state, order dependence, and fixtures with the wrong scope for parallel execution.
|
|
55
|
+
20. **Hardcoding:** URLs, credentials, dates, locale, or time-zone assumptions inside tests instead of config or fixtures.
|
|
56
|
+
21. **Coverage gaps:** boundaries, negative paths, empty or invalid input, and error states from `test-spec` that are missing or only partially asserted.
|
|
57
|
+
22. **Correctness slips:** copy-paste errors in IDs, parameters, or expected values, wrong exception types, unhandled `None`, and tests whose name does not match what they assert.
|
|
58
|
+
23. **Product bugs observed:** any application defect seen during runs, with reproduction steps and evidence, marked as a regression-test candidate.
|
|
59
|
+
|
|
60
|
+
## Report format
|
|
61
|
+
|
|
62
|
+
Output:
|
|
63
|
+
|
|
64
|
+
1. `Checkpoint: <stage | TEST CHANGE | COMMIT | PR>`;
|
|
65
|
+
2. an **In place** table: `# | item | PASS/FAIL/N-A | evidence`;
|
|
66
|
+
3. a **Run** line: commands, exit codes, counts, and flaky tests;
|
|
67
|
+
4. a **Findings** table: `severity (CRITICAL/MAJOR/MINOR) | file:line | issue | evidence | owning stage / fix`;
|
|
68
|
+
5. the verdict **ON COURSE** or **HOLD: <CRITICAL findings and failing items>**.
|
|
69
|
+
|
|
70
|
+
Any CRITICAL finding or FAIL is a hard stop. Fix it or escalate it; never continue building past one silently.
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: fordec
|
|
3
|
+
description: "Software incident and emergency decision cycle using the aviation-derived FORDEC model: Facts, Options, Risks & Benefits, Decision, Execution, Check. Use when a production outage, failed deploy, broken main branch, data corruption, security incident, or other consequential engineering problem needs a clear, time-aware choice, assigned actions, and active reassessment."
|
|
4
|
+
disable-model-invocation: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# FORDEC — Software Incident Decision Cycle
|
|
8
|
+
|
|
9
|
+
Use FORDEC to turn an uncertain, consequential engineering situation into an explicit, reviewable decision:
|
|
10
|
+
|
|
11
|
+
1. **Facts**
|
|
12
|
+
2. **Options**
|
|
13
|
+
3. **Risks & Benefits**
|
|
14
|
+
4. **Decision**
|
|
15
|
+
5. **Execution**
|
|
16
|
+
6. **Check & Monitor**
|
|
17
|
+
|
|
18
|
+
FORDEC is a decision aid, not a substitute for the team's incident-response process, runbooks, on-call escalation policy, security or legal obligations, or the judgment of the incident commander. The responsible human remains the decision owner.
|
|
19
|
+
|
|
20
|
+
## Workflow position
|
|
21
|
+
|
|
22
|
+
**Off-sequence — run on demand.** `before-startup`, `cruising`, and `landing` cover planned work. Use `fordec` whenever something goes wrong at any point: a production incident, a failed or partial deploy, a red main branch blocking the team, a suspected data loss, a leaked secret, or a regression discovered after merge. Return to the planned checklist only after this cycle reaches a stable state.
|
|
23
|
+
|
|
24
|
+
## Severity and containment gate
|
|
25
|
+
|
|
26
|
+
Before beginning the full cycle:
|
|
27
|
+
|
|
28
|
+
1. Classify impact: users affected, revenue or SLA exposure, data integrity or loss, security or privacy exposure, and whether the problem is spreading.
|
|
29
|
+
2. If damage is ongoing, contain first using the established, reversible lever: roll back the deploy, disable the feature flag, stop the job or queue consumer, shift or drain traffic, revoke and rotate an exposed credential, put the system in maintenance or read-only mode, or follow the runbook step.
|
|
30
|
+
3. Do not delay a required containment action to complete FORDEC. Stabilize first, then use the shortest useful cycle.
|
|
31
|
+
4. Declare the incident through the team's channel if it meets the threshold. State the incident commander (decision owner), the available decision time, and any limits on access or authority.
|
|
32
|
+
5. Preserve evidence before it disappears: logs, metrics snapshots, failing request IDs, the deployed revision, and the state of affected data.
|
|
33
|
+
|
|
34
|
+
Never invent runbook steps, system limits, root causes, or compliance requirements. Use observed evidence and the team's documented procedures. When an unknown could change the safe course, mark it clearly and pull in the owning team or a specialist.
|
|
35
|
+
|
|
36
|
+
## Operating rules
|
|
37
|
+
|
|
38
|
+
- Run **F → O → R → D → E → C** in order. Do not choose a fix before comparing its risks and benefits.
|
|
39
|
+
- Separate observations (what the logs, metrics, and tests show) from hypotheses about the cause.
|
|
40
|
+
- Mitigation comes before root cause. Restore service first; investigate afterward.
|
|
41
|
+
- Prefer the safest reversible action when evidence or time is limited: rollback beats hotfix, flag-off beats code change, pause beats delete.
|
|
42
|
+
- Include rollback, hold, freeze deploys, and escalate as options whenever they are viable.
|
|
43
|
+
- Use all available resources: dashboards, logs, traces, alerts, error trackers, git history, CI results, runbooks, owning teams, and vendors' status pages.
|
|
44
|
+
- Invite an independent challenge before the Decision when time permits. The person who wrote or deployed the change should not be the only one testing the diagnosis.
|
|
45
|
+
- Use closed-loop communication: assign a named owner, require acknowledgment, and confirm completion in the incident channel.
|
|
46
|
+
- A material new fact, failed assumption, or breached threshold invalidates the current decision. Stop and restart at **Facts**.
|
|
47
|
+
- Never treat a green deploy, a passing CI run, or a quiet alert channel as proof that the system is healthy.
|
|
48
|
+
|
|
49
|
+
## Time-pressure modes
|
|
50
|
+
|
|
51
|
+
Choose the shortest mode that preserves safety:
|
|
52
|
+
|
|
53
|
+
- **Full FORDEC** — the system is stable or degraded but contained. Gather evidence, compare realistic fixes, coordinate owners, and define monitoring.
|
|
54
|
+
- **Rapid FORDEC** — users are impacted now. State only the decisive facts, two or three feasible options, the dominant risk and benefit of each, the decision, immediate assignments, and the next check.
|
|
55
|
+
- **Immediate action** — delay is actively increasing damage (data being corrupted, secret being exploited, outage spreading). Execute the established containment lever first, announce it in the incident channel, then perform Rapid FORDEC once the bleeding stops.
|
|
56
|
+
|
|
57
|
+
Time pressure permits compression, not omission of ownership, rollback readiness, or reassessment.
|
|
58
|
+
|
|
59
|
+
## F — FACTS
|
|
60
|
+
|
|
61
|
+
Establish what is true now:
|
|
62
|
+
|
|
63
|
+
1. **Symptom** — what is failing, since when, error rates and latency vs. baseline, affected endpoints, services, jobs, regions, tenants, or user segments, and the alert or report that triggered the response.
|
|
64
|
+
2. **Change correlation** — recent deploys, merges, config or flag changes, migrations, infrastructure or dependency updates, and third-party incidents in the window before onset. Identify the exact running revision.
|
|
65
|
+
3. **Evidence quality** — label each material statement as **OBSERVED**, **REPORTED**, **INFERRED**, or **UNKNOWN**, with its source (dashboard, log query, trace, test, user report). Resolve conflicts where possible.
|
|
66
|
+
4. **Blast radius and trend** — what still works, what is degraded or down, whether data is being written incorrectly, and whether the situation is stable, improving, or worsening.
|
|
67
|
+
5. **Time** — SLA or SLO burn rate, queue backlogs, disk or quota exhaustion, certificate or token expiry, retry storms, and any point after which data becomes unrecoverable or rollback is no longer clean.
|
|
68
|
+
6. **Constraints** — change freezes, access or permission limits, migrations that cannot be reversed, compliance or disclosure obligations, and unavailable tooling.
|
|
69
|
+
7. **People and resources** — incident commander, on-call engineers, code owners of the affected area, communications owner, and vendor or platform support.
|
|
70
|
+
8. **Objective** — the safety outcome to protect first (data integrity, security, user trust), then the service outcome to restore.
|
|
71
|
+
|
|
72
|
+
Do not hide a missing fact inside an assumption. If it cannot be resolved in time, carry it into Risks & Benefits as uncertainty.
|
|
73
|
+
|
|
74
|
+
## O — OPTIONS
|
|
75
|
+
|
|
76
|
+
List only feasible courses:
|
|
77
|
+
|
|
78
|
+
1. Generate distinct actions, not variations in wording. Typical candidates: roll back to the last known-good revision, disable a feature flag or config, revert the offending commit and redeploy, forward-fix with a hotfix, scale or reroute traffic, pause jobs or consumers, restore or repair data, fail over, hold and gather more evidence, or escalate.
|
|
79
|
+
2. State what each option requires (access, build and deploy time, approvals, data steps), how quickly it can take effect, and any condition that makes it unavailable — for example, a migration that makes rollback unsafe.
|
|
80
|
+
3. Eliminate an option if it violates a hard constraint, depends on unavailable access, or risks making data loss or exposure worse.
|
|
81
|
+
4. Keep the list short enough to compare under incident workload. Do not manufacture alternatives to reach a count.
|
|
82
|
+
5. Identify a fallback for any option whose failure would leave no safe course, such as a hotfix that fails CI or a rollback that fails on schema mismatch.
|
|
83
|
+
|
|
84
|
+
## R — RISKS & BENEFITS
|
|
85
|
+
|
|
86
|
+
Compare every remaining option against the same criteria:
|
|
87
|
+
|
|
88
|
+
- user and business impact reduced, and how quickly;
|
|
89
|
+
- credible failure modes and worst credible consequence (extended outage, data loss, duplicated side effects, security exposure);
|
|
90
|
+
- likelihood, severity, blast radius, and uncertainty;
|
|
91
|
+
- time to deploy and time until the effect is visible in metrics;
|
|
92
|
+
- reversibility and point of no return (schema changes, emitted events, sent emails, external API calls, deleted data);
|
|
93
|
+
- untested code paths: a hotfix that skipped review or tests carries risk the rollback does not;
|
|
94
|
+
- compatibility with live data, in-flight requests, caches, queued messages, and older clients;
|
|
95
|
+
- workload and coordination demand on the people involved;
|
|
96
|
+
- mitigations, warning signs, and remaining risk after mitigation.
|
|
97
|
+
|
|
98
|
+
Use qualitative ratings only when their meaning is explicit. Never collapse an uncertain high-consequence risk into an unsupported "low risk" label. Name the assumption most likely to invalidate each option.
|
|
99
|
+
|
|
100
|
+
## D — DECISION
|
|
101
|
+
|
|
102
|
+
Make the choice explicit before acting:
|
|
103
|
+
|
|
104
|
+
1. Name the selected option and why its benefits outweigh its risks under the current facts.
|
|
105
|
+
2. Name the decision owner and any approval required (code owner, security, data owner, release manager).
|
|
106
|
+
3. Record rejected options and the decisive reason for rejecting each.
|
|
107
|
+
4. State accepted residual risks, their owners, and the fallback course.
|
|
108
|
+
5. Define success criteria in measurable terms (error rate, latency, queue depth, failing test now passing), abort thresholds, escalation triggers, and the next decision point.
|
|
109
|
+
6. Record meaningful dissent. Resolve safety-critical disagreement through the incident commander or escalation path; do not manufacture consensus.
|
|
110
|
+
|
|
111
|
+
If no option is acceptably safe, decide to **HOLD**, **ROLL BACK**, or **ESCALATE** rather than disguising uncertainty as permission to ship a fix.
|
|
112
|
+
|
|
113
|
+
## E — EXECUTION
|
|
114
|
+
|
|
115
|
+
Translate the Decision into coordinated action:
|
|
116
|
+
|
|
117
|
+
1. Sequence actions so that containment, data integrity, and security come before full recovery, cleanup, or root-cause work.
|
|
118
|
+
2. Assign each action to a named owner with a deadline or trigger, and post it in the incident channel.
|
|
119
|
+
3. Specify communications: status page, affected customers or internal teams, stakeholders to update, and the handover if the incident outlives the shift.
|
|
120
|
+
4. Confirm critical commands by readback. Double-check the target environment, revision, and scope before any destructive or irreversible command (database writes, deletes, force pushes, credential revocation).
|
|
121
|
+
5. Prepare the rollback or fallback before crossing a point of no return. Take a backup or snapshot before data repair.
|
|
122
|
+
6. Execute only the selected course and only within granted authority. Require explicit user approval for destructive or production-affecting actions unless an established runbook already authorizes them.
|
|
123
|
+
7. Keep a timestamped log of actions taken for the postmortem.
|
|
124
|
+
8. If execution exposes a material new fact or cannot proceed as planned, stop improvising and reopen FORDEC.
|
|
125
|
+
|
|
126
|
+
## C — CHECK
|
|
127
|
+
|
|
128
|
+
Verify outcomes and keep monitoring:
|
|
129
|
+
|
|
130
|
+
1. Compare observed results with the Decision's success criteria. Report actual values from metrics, logs, and tests, not "looks fixed" or "deployed successfully."
|
|
131
|
+
2. Confirm that assigned actions completed, communications were sent, and no affected service, job, tenant, or data set was missed.
|
|
132
|
+
3. For each important risk, define the signal, expected state, threshold, observation window, owner, and response.
|
|
133
|
+
4. Watch for secondary effects: retry backlogs draining, cache stampedes, delayed jobs catching up, and data written during the incident window.
|
|
134
|
+
5. At the next decision point, explicitly choose one: continue monitoring, modify, roll back, hand over, escalate, close the incident, or restart FORDEC.
|
|
135
|
+
6. Once stable, capture follow-ups: root-cause investigation, regression test for the failure, data repair verification, and a postmortem owner and date.
|
|
136
|
+
|
|
137
|
+
The Check phase is continuous. A changed context starts a new cycle with new Facts; it does not merely append a note to the old decision.
|
|
138
|
+
|
|
139
|
+
## Team challenge
|
|
140
|
+
|
|
141
|
+
When another competent engineer is available and time permits:
|
|
142
|
+
|
|
143
|
+
1. Give them the raw signals (graphs, logs, error samples, the diff) before sharing your preferred diagnosis.
|
|
144
|
+
2. Ask for an independent diagnosis, an overlooked option, and the strongest reason the preferred fix could fail.
|
|
145
|
+
3. Reconcile the two mental models and record unresolved disagreement.
|
|
146
|
+
4. Let any participant call **STOP** when an assumption fails or execution diverges from the Decision.
|
|
147
|
+
|
|
148
|
+
For a solo decision, perform the same challenge explicitly: "What evidence would prove my diagnosis wrong?" and "What safer, more reversible option have I not considered?"
|
|
149
|
+
|
|
150
|
+
## Response format
|
|
151
|
+
|
|
152
|
+
Lead with any immediate containment action. Then output:
|
|
153
|
+
|
|
154
|
+
1. `Mode: FULL FORDEC | RAPID FORDEC | IMMEDIATE ACTION` and `Severity: <level and impact summary>`
|
|
155
|
+
2. `Incident commander: <person or role> | Decision time: <deadline or window> | Running revision: <sha/version>`
|
|
156
|
+
3. a **Facts** table: `fact | status (OBSERVED/REPORTED/INFERRED/UNKNOWN) | source | relevance`;
|
|
157
|
+
4. an **Options** table: `option | requirements | benefits | risks | reversibility`;
|
|
158
|
+
5. a **Decision** line: selected option, rationale, residual risk, and required approval;
|
|
159
|
+
6. an **Execution** table: `priority | action | owner | trigger/deadline | confirmation`;
|
|
160
|
+
7. a **Check** table: `signal | expected state | threshold | window | owner | response`;
|
|
161
|
+
8. a **Follow-ups** list: root cause, regression test, data verification, postmortem owner;
|
|
162
|
+
9. a verdict: **EXECUTE**, **HOLD**, **ROLL BACK**, or **ESCALATE**, followed by the next decision point.
|
|
163
|
+
|
|
164
|
+
In Rapid mode, compress each section to the decisive content. Never omit the Decision, owner, immediate assignments, rollback path, or next Check.
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: landing
|
|
3
|
+
description: Final production-readiness checklist. Use before final PR approval, merge, release, or production deployment to verify the final state, compare land and go-around options, make an explicit decision, define or perform the authorized execution, and check production signals with rollback triggers.
|
|
4
|
+
disable-model-invocation: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Landing — Final Production Decision
|
|
8
|
+
|
|
9
|
+
Purpose: make the last pre-production decision deliberately.
|
|
10
|
+
|
|
11
|
+
Green checks are inputs, not the decision. The final cycle must expose the weakest evidence, compare landing with a go-around, state who accepts residual risk, and define how production will be monitored.
|
|
12
|
+
|
|
13
|
+
## Workflow position
|
|
14
|
+
|
|
15
|
+
**3 of 3 — run last.** Use after `before-startup` returned **READY TO BUILD TESTS** and the latest `cruising` check returned **ON COURSE** with no open CRITICAL findings, when the completed change awaits final approval, merge, release, or deployment. This is the terminal production-readiness check.
|
|
16
|
+
|
|
17
|
+
## How to run
|
|
18
|
+
|
|
19
|
+
Run the sections in order against the final branch state. Evidence must come from the actual final diff, branch-tip validation, observed end-to-end behavior, repository rules, and deploy configuration. Do not merge, release, or deploy unless the user has authorized that action. If new facts appear during Execution or Check, stop and restart the checklist.
|
|
20
|
+
|
|
21
|
+
## Current state
|
|
22
|
+
|
|
23
|
+
1. **Uncomfortable truth** — name the part of the change with the weakest evidence and the question you most hope nobody asks. "Nothing" is a FAIL. Prove it safe or record it as residual risk with an owner.
|
|
24
|
+
2. **Final state** — identify the exact branch tip and re-read the complete final diff adversarially. Confirm documented invariants for every touched area against what was built, not the original plan.
|
|
25
|
+
3. **Validation evidence** — report build, typecheck, lint, full-suite, and relevant targeted-test results from the final state. Identify every changed branch that no test or manual run executed.
|
|
26
|
+
4. **Operational evidence** — report the production-like end-to-end run, concrete failure signals, expected logs or metrics, affected user surfaces and jobs, data compatibility, rollback mechanism, and point of no return.
|
|
27
|
+
5. **Deployment readiness** — list indexes, TTL policies, rules, variables, secrets, migrations, scheduled work, notifications, manual steps, and exact ordering constraints. State what happens if code arrives before infrastructure.
|
|
28
|
+
|
|
29
|
+
## Options
|
|
30
|
+
|
|
31
|
+
6. **Landing choices** — list the viable courses supported by the facts: land as-is, land through a staged or controlled rollout, fix and repeat the cycle, reduce scope, defer the change, or go around. Do not manufacture equivalence: eliminate any option that violates a hard invariant.
|
|
32
|
+
7. **Simpler option** — explicitly test whether half the code, fewer abstractions, an existing dependency or pattern, or a narrower change satisfies the requirement with less production exposure.
|
|
33
|
+
8. **Recovery options** — identify plain revert, feature or configuration disablement, forward fix, data repair, traffic shift, and full go-around. Mark unavailable recovery paths clearly.
|
|
34
|
+
|
|
35
|
+
## Risks and benefits
|
|
36
|
+
|
|
37
|
+
9. **Option comparison** — for each option, state user benefit, delivery benefit, operational burden, reversibility, blast radius, and the cost of delay. A vague "low risk" or "faster" is not evidence.
|
|
38
|
+
10. **Hidden-bug audit** — assess never-executed handlers, fallbacks, retries, edge inputs, oversized and duplicate inputs, swallowed errors, idempotency, races, overlapping schedules, clock skew, time zones, and page boundaries. Name what happens for every reachable case.
|
|
39
|
+
11. **Avoided-test audit** — name the test omitted because setup was hard or failure was likely. Run it, select an option that removes the exposure, or record the risk with an owner.
|
|
40
|
+
12. **Simplicity audit** — challenge one-caller indirection, speculative flags and modes, new packages or patterns, hard-to-explain modules, dead code, debug output, scaffolding, tombstone names, and TODOs without tickets. State the present requirement that justifies anything retained.
|
|
41
|
+
13. **Deployment risk** — assess live-data and in-flight-client compatibility, infra-before-code hazards, rollback after writes or emitted events, observability delay, and every point after which a go-around becomes harder.
|
|
42
|
+
|
|
43
|
+
## Decision
|
|
44
|
+
|
|
45
|
+
14. **Land or go around** — select one option and state why its benefits outweigh its risks. Record approver, residual risks and owners, prerequisites, success criteria, rollback threshold, and any point of no return. If a hard gate lacks evidence, the decision is **GO-AROUND**.
|
|
46
|
+
15. **Authorization boundary** — distinguish approval of the readiness decision from authorization to merge, release, or deploy. Never infer production authorization from a request to review.
|
|
47
|
+
|
|
48
|
+
## Execution
|
|
49
|
+
|
|
50
|
+
16. **Execute the authorized course** — complete required fixes and validation, then follow the exact approved merge, release, infrastructure, migration, and deployment order. Use the selected rollout controls and prepare the rollback commands before crossing the point of no return. If authorization stops at review, produce the execution plan without performing the release.
|
|
51
|
+
|
|
52
|
+
## Verification
|
|
53
|
+
|
|
54
|
+
17. **Immediate verification** — after every executed step, verify the expected revision, environment, service health, user-visible behavior, data state, scheduled work, and required infrastructure. Report observed values, not "deployed successfully."
|
|
55
|
+
18. **Monitor and decide again** — define each signal, baseline, observation window, threshold, owner, and response. A breached threshold triggers the selected rollback or go-around and restarts this checklist with the new facts.
|
|
56
|
+
|
|
57
|
+
## Report format
|
|
58
|
+
|
|
59
|
+
Output:
|
|
60
|
+
|
|
61
|
+
1. a `Section | # | item | PASS/FAIL/N-A | evidence` table;
|
|
62
|
+
2. an **Options** table: `option | benefits | risks | reversibility`;
|
|
63
|
+
3. a **Decision** line: **LAND**, **STAGED LANDING**, or **GO-AROUND**, with rationale, approver, and residual-risk owners;
|
|
64
|
+
4. an **Execution** line: authorized actions completed or the exact pending plan;
|
|
65
|
+
5. a **Check** table: `signal | expected | threshold | window | owner | response`;
|
|
66
|
+
6. the verdict **CLEAR TO LAND** or **GO-AROUND: <failing items or unblock conditions>**.
|
|
67
|
+
|
|
68
|
+
A FAIL is a hard stop. Never land past one silently. An honest go-around is cheaper than an incident.
|