swe-workflow-skills 0.8.2 → 0.9.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 +4 -4
- package/VERSION +1 -1
- package/catalog.json +1 -1
- package/package.json +1 -1
- package/skills/accessibility-design/evals/evals.json +3 -2
- package/skills/ai-evaluation/evals/evals.json +9 -8
- package/skills/api-design/evals/evals.json +7 -8
- package/skills/architecture-documentation/SKILL.md +7 -0
- package/skills/architecture-documentation/evals/evals.json +9 -11
- package/skills/brainstorming/evals/evals.json +6 -6
- package/skills/bug-investigating/evals/evals.json +6 -6
- package/skills/cicd-pipeline/evals/evals.json +7 -8
- package/skills/code-archaeology/evals/evals.json +9 -8
- package/skills/code-reviewing/SKILL.md +8 -0
- package/skills/code-reviewing/evals/evals.json +10 -12
- package/skills/code-slop-cleanup/SKILL.md +6 -0
- package/skills/code-slop-cleanup/evals/evals.json +14 -8
- package/skills/compliance-privacy/evals/evals.json +6 -6
- package/skills/data-modeling/evals/evals.json +6 -7
- package/skills/data-pipeline-design/SKILL.md +12 -1
- package/skills/data-pipeline-design/evals/evals.json +9 -8
- package/skills/data-quality/SKILL.md +7 -0
- package/skills/data-quality/evals/evals.json +9 -7
- package/skills/dependency-impact-analysis/evals/evals.json +2 -2
- package/skills/effort-estimation/SKILL.md +9 -2
- package/skills/effort-estimation/evals/evals.json +3 -2
- package/skills/feature-planning/evals/evals.json +7 -9
- package/skills/frontend-architecture/evals/evals.json +1 -1
- package/skills/git-workflow/evals/evals.json +6 -8
- package/skills/incident-response/evals/evals.json +13 -9
- package/skills/llm-app-engineering/SKILL.md +9 -6
- package/skills/llm-app-engineering/evals/evals.json +10 -8
- package/skills/metrics-and-okrs/evals/evals.json +6 -7
- package/skills/ml-experiment-tracking/SKILL.md +2 -0
- package/skills/ml-experiment-tracking/evals/evals.json +3 -2
- package/skills/ml-pipeline-design/evals/evals.json +6 -5
- package/skills/mobile-architecture/evals/evals.json +9 -8
- package/skills/performance-optimization/evals/evals.json +2 -2
- package/skills/plan-execution/SKILL.md +8 -0
- package/skills/plan-execution/evals/evals.json +7 -7
- package/skills/project-documentation/evals/evals.json +2 -2
- package/skills/refactoring/evals/evals.json +6 -7
- package/skills/retrospective/evals/evals.json +7 -8
- package/skills/rollback-strategy/evals/evals.json +5 -4
- package/skills/security-audit/SKILL.md +6 -0
- package/skills/security-audit/evals/evals.json +6 -6
- package/skills/skill-router/evals/evals.json +2 -2
- package/skills/statistical-analysis/evals/evals.json +10 -8
- package/skills/strategic-review/SKILL.md +36 -0
- package/skills/strategic-review/evals/evals.json +7 -6
- package/skills/tdd-workflow/evals/evals.json +10 -8
- package/skills/technical-debt-review/evals/evals.json +11 -7
- package/skills/test-suite-design/SKILL.md +10 -3
- package/skills/test-suite-design/evals/evals.json +4 -3
- package/skills/test-suite-design/references/testing-pyramid.md +19 -3
- package/skills/threat-modeling/evals/evals.json +7 -6
- package/skills/ui-ux-design/SKILL.md +11 -1
- package/skills/ui-ux-design/evals/evals.json +9 -9
- package/skills/verification-before-completion/SKILL.md +1 -1
- package/skills/verification-before-completion/evals/evals.json +9 -10
- package/skills/writing-skills/SKILL.md +111 -0
- package/skills/writing-skills/evals/evals.json +2 -2
|
@@ -17,24 +17,25 @@
|
|
|
17
17
|
{
|
|
18
18
|
"id": 2,
|
|
19
19
|
"prompt": "Our nightly job loads yesterday's orders into the warehouse. When it fails midway and we rerun it, we get duplicate rows — and backfilling last month means manually editing the date in the script 30 times. Fix the design.",
|
|
20
|
-
"expected_output": "Identifies the non-idempotent append-only load as the root cause; converts the job to an idempotent write pattern (delete+insert by partition, merge/upsert on a key, or partition overwrite) parameterized over a logical date, so backfill becomes running the same job over a range via the orchestrator — with a lookback window for late-arriving data",
|
|
20
|
+
"expected_output": "Identifies the non-idempotent append-only load as the root cause; converts the job to an idempotent write pattern (delete+insert by partition, merge/upsert on a key, or partition overwrite) parameterized over a logical date, so backfill becomes running the same job over a range via the orchestrator — with a lookback window for late-arriving data NOTE: final assertion added 2026-09-18. Every earlier assertion here is the textbook answer, which the control produced unaided (RED matched GREEN on all of them), while Step 7 (orchestrate and operate) — which changes what the user does next — was asserted nowhere. Drafted from that step's own text, not from a treatment reply, and worded without an either/or clause. Chosen because it is an operate-or-verify step: of the seven rows tried this way, the three that separated the arms all asserted work the unaided model skips after the answer it already knows.",
|
|
21
21
|
"assertions": [
|
|
22
22
|
"Identifies the root cause as a non-idempotent, append-only load",
|
|
23
23
|
"Proposes an idempotent write pattern: delete+insert by partition, merge/upsert on a unique key, or partition-overwrite semantics",
|
|
24
24
|
"Parameterizes the run over a logical date/window so any day can be run or re-run identically (backfill = the same job over a range)",
|
|
25
25
|
"Recommends orchestrator-native backfill (or an equivalent parameterized range run) over hand-edited scripts",
|
|
26
|
-
"Considers late-arriving or corrected data (lookback window, watermark, or reprocessing policy), not just the happy path"
|
|
26
|
+
"Considers late-arriving or corrected data (lookback window, watermark, or reprocessing policy), not just the happy path",
|
|
27
|
+
"Makes a failed run visible: retries with an alert on final failure, so a load that fails is noticed rather than found later"
|
|
27
28
|
]
|
|
28
29
|
},
|
|
29
30
|
{
|
|
30
31
|
"id": 3,
|
|
31
|
-
"prompt": "
|
|
32
|
-
"expected_output": "
|
|
32
|
+
"prompt": "Our nightly dbt run takes five hours and the warehouse bill has doubled since January. Most of the models are full refreshes over the whole event table. Leadership wants both numbers down before the next board meeting.",
|
|
33
|
+
"expected_output": "Two numbers, two owners, and the roster does not say which is which. Restructuring full refreshes into incremental builds so less work runs each night is this skill's, and it delivers that. How the warehouse is sized, and how much of the doubled bill this job actually accounts for, is finops-cost-optimization's. A good answer establishes that share before promising a reduction, because a pipeline rewrite that addresses a minority of the spend will not move the bill.",
|
|
33
34
|
"assertions": [
|
|
34
|
-
"
|
|
35
|
-
"Refers to
|
|
36
|
-
"
|
|
37
|
-
"
|
|
35
|
+
"Separates the two halves: how the models are built and refreshed, versus how the warehouse spend is sized and attributed",
|
|
36
|
+
"Refers to finops-cost-optimization for warehouse sizing and attributing the bill",
|
|
37
|
+
"Delivers the pipeline half itself — moving the full refreshes onto incremental builds — rather than deferring the whole request",
|
|
38
|
+
"Establishes what share of the bill this job actually accounts for before promising a reduction"
|
|
38
39
|
]
|
|
39
40
|
}
|
|
40
41
|
]
|
|
@@ -24,6 +24,13 @@ staleness → freshness, broken joins → `relationships`. Wins from day one, an
|
|
|
24
24
|
the suite grows the same way tests do after bugs — every new incident adds a
|
|
25
25
|
check that would have caught it.
|
|
26
26
|
|
|
27
|
+
**An incident that nobody noticed failed twice, and you only own the first failure.**
|
|
28
|
+
Not knowing the data was wrong is a detection gap — the checks below close it. Knowing and
|
|
29
|
+
not telling anyone is a routing gap: who gets paged, on what threshold, and through which
|
|
30
|
+
channel is `observability-design`'s work. Build the check that would have caught this
|
|
31
|
+
incident, then say explicitly that a check nobody is paged for will produce the same
|
|
32
|
+
outcome next time.
|
|
33
|
+
|
|
27
34
|
### Step 2: Check at the Right Layer — Boundary First
|
|
28
35
|
|
|
29
36
|
Where a check runs matters as much as what it checks:
|
|
@@ -16,23 +16,25 @@
|
|
|
16
16
|
{
|
|
17
17
|
"id": 2,
|
|
18
18
|
"prompt": "An upstream team owns the events we ingest and keeps renaming columns and changing types without telling us. Our pipeline breaks silently every few weeks. What should we put in place?",
|
|
19
|
-
"expected_output": "Proposes a producer/consumer data contract (schema, types, semantics, SLA) enforced at the ingestion boundary so violations fail loudly at entry; shifts validation left into the producer's CI or publish path; adds versioning/deprecation windows for breaking changes; and backstops enforcement with schema-drift and volume/distribution anomaly detection",
|
|
19
|
+
"expected_output": "Proposes a producer/consumer data contract (schema, types, semantics, SLA) enforced at the ingestion boundary so violations fail loudly at entry; shifts validation left into the producer's CI or publish path; adds versioning/deprecation windows for breaking changes; and backstops enforcement with schema-drift and volume/distribution anomaly detection NOTE: final assertion added 2026-09-16. Every earlier assertion here is the textbook answer, which the control produced unaided (RED matched GREEN on all of them), while Step 4 (route failures to an owner) — the part of the skill that changes what the user does — was asserted nowhere. The assertion is drafted from that step, not from a treatment reply.",
|
|
20
20
|
"assertions": [
|
|
21
21
|
"Proposes an explicit data contract between producer and consumer (schema, types, semantics, SLAs), not just more downstream tests",
|
|
22
22
|
"Enforces the schema at the ingestion boundary so violations fail loudly at entry instead of propagating silently",
|
|
23
23
|
"Shifts checks left: contract validation in the producer's CI or at publish time",
|
|
24
24
|
"Covers change management for breaking changes: contract versioning or a deprecation window",
|
|
25
|
-
"Adds detection for what enforcement misses: schema-drift alerts or anomaly checks on volume/distributions"
|
|
25
|
+
"Adds detection for what enforcement misses: schema-drift alerts or anomaly checks on volume/distributions",
|
|
26
|
+
"Routes each failed check to a named owner of the affected table or domain, rather than leaving alerts where nobody watches them"
|
|
26
27
|
]
|
|
27
28
|
},
|
|
28
29
|
{
|
|
29
30
|
"id": 3,
|
|
30
|
-
"prompt": "
|
|
31
|
-
"expected_output": "
|
|
31
|
+
"prompt": "A customer told us our revenue dashboard had been wrong for three days before anyone here noticed. The upstream team had renamed a column. I need to make sure that never happens silently again.",
|
|
32
|
+
"expected_output": "'Never happens silently' is two problems the roster does not separate. Knowing the data is wrong — a schema-drift check and a freshness check that would have caught a renamed column on the first run, plus a contract with the upstream team so the rename surfaces before it lands — is this skill's work, delivered concretely. Getting a person's attention once something is known to be wrong, including who is paged and on what threshold, is observability-design's. A good answer treats detection and notification as separate failures, because this incident failed at both.",
|
|
32
33
|
"assertions": [
|
|
33
|
-
"
|
|
34
|
-
"Refers to
|
|
35
|
-
"
|
|
34
|
+
"Separates the two halves: detecting that the data is wrong, versus getting a person's attention when it is",
|
|
35
|
+
"Refers to observability-design for alert routing and who gets paged",
|
|
36
|
+
"Delivers the detection half itself — a schema-drift or freshness check that would have caught the renamed column — rather than deferring the whole request",
|
|
37
|
+
"Raises a contract with the upstream team so the rename surfaces before it lands, not only afterwards"
|
|
36
38
|
]
|
|
37
39
|
}
|
|
38
40
|
]
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"assertions": [
|
|
22
22
|
"Confirms this is a backwards-compatible (additive) change",
|
|
23
23
|
"Notes that existing code ignores the new column and remains safe",
|
|
24
|
-
"
|
|
24
|
+
"Flags that code selecting whole rows — ORM models, serializers — will start returning the new column",
|
|
25
25
|
"Does not require complex coordination or versioning",
|
|
26
26
|
"Gives a clear 'safe to proceed' verdict with any minor caveats"
|
|
27
27
|
]
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"assertions": [
|
|
34
34
|
"Recognizes this is not a dependency impact analysis request",
|
|
35
35
|
"Does not perform a blast radius analysis for adding auth",
|
|
36
|
-
"
|
|
36
|
+
"Notes that adding required auth to a live endpoint is a breaking change for its current consumers",
|
|
37
37
|
"Directs to security-audit or api-design skill for the actual implementation guidance"
|
|
38
38
|
]
|
|
39
39
|
}
|
|
@@ -39,10 +39,17 @@ Convert to time or cost via team velocity or loaded cost, add a 20-30% buffer fo
|
|
|
39
39
|
unknowns, and communicate a range in stakeholder language — weeks and dollars, not
|
|
40
40
|
story points. A single number becomes a commitment; a range communicates confidence.
|
|
41
41
|
|
|
42
|
+
**Say when the number gets revisited.** A range nobody revisits hardens into the commitment
|
|
43
|
+
you avoided giving — so hand over the estimate with its re-forecast attached: the next point
|
|
44
|
+
where real data replaces assumption (a phase boundary, the end of a spike, the first sprints
|
|
45
|
+
of actuals), and what would move the number. That sentence is what keeps an early-discovery
|
|
46
|
+
estimate honest; without it, "wide range" is just a number the stakeholder rounds down.
|
|
47
|
+
|
|
42
48
|
### Step 5: Track and Calibrate
|
|
43
49
|
|
|
44
|
-
Compare estimated
|
|
45
|
-
|
|
50
|
+
Compare estimated with actual — per sprint on delivery work, at each phase boundary on a
|
|
51
|
+
project-sized estimate — look for systematic bias, and recalibrate on the last 3-5 data
|
|
52
|
+
points, not the all-time average.
|
|
46
53
|
|
|
47
54
|
## Principles Applied
|
|
48
55
|
|
|
@@ -18,14 +18,15 @@
|
|
|
18
18
|
{
|
|
19
19
|
"id": 2,
|
|
20
20
|
"prompt": "Our VP wants a budget estimate for a 6-month data platform rebuild. We're in early discovery and a lot is still unknown. How do I estimate this responsibly?",
|
|
21
|
-
"expected_output": "Should recommend three-point estimation for high-uncertainty work, produce wide ranges, clearly state assumptions and unknowns, and suggest narrowing the estimate through phased discovery.",
|
|
21
|
+
"expected_output": "Should recommend three-point estimation for high-uncertainty work, produce wide ranges, clearly state assumptions and unknowns, and suggest narrowing the estimate through phased discovery. NOTE: final assertion added 2026-09-18. Every earlier assertion here is the textbook answer, which the control produced unaided (RED matched GREEN on all of them), while Step 5 (track and calibrate) — which changes what the user does next — was asserted nowhere. Drafted from that step's own text, not from a treatment reply, and worded without an either/or clause. Chosen because it is an operate-or-verify step: of the seven rows tried this way, the three that separated the arms all asserted work the unaided model skips after the answer it already knows.",
|
|
22
22
|
"assertions": [
|
|
23
23
|
"Recommends three-point estimation due to high uncertainty",
|
|
24
24
|
"Produces wide initial ranges (appropriate for early discovery)",
|
|
25
25
|
"Suggests a phased approach: estimate phase 1 tightly, phases 2-3 loosely",
|
|
26
26
|
"Clearly states which assumptions drive the estimate",
|
|
27
27
|
"Recommends a technical spike before committing to precise numbers",
|
|
28
|
-
"Does NOT produce a precise single-number estimate for 6 months of unknown work"
|
|
28
|
+
"Does NOT produce a precise single-number estimate for 6 months of unknown work",
|
|
29
|
+
"Commits to re-estimating against actuals as the work lands — comparing estimated with actual and recalibrating on recent data, rather than treating the first number as the budget"
|
|
29
30
|
]
|
|
30
31
|
},
|
|
31
32
|
{
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
{
|
|
18
18
|
"id": 2,
|
|
19
19
|
"prompt": "plan adding dark mode to our vue app",
|
|
20
|
-
"expected_output": "The ask-first branch of Step 1: the request names no concrete behavior, persistence, or theming approach, so the reply asks before drafting (CSS variables vs theme library? System preference detection? Per-component or global? Persistence?) and says what it would need to start drafting. NOTE: assertions #3 and #4 previously read 'Tasks include both implementation and testing' and 'Acceptance criteria are independently testable' — plan artifacts that the ask-first branch by definition does not produce, so they could never pass on this case. They now test the coverage of the clarification itself. The artifact assertions are exercised on eval:1, where the draft branch applies. NOTE 2: a replacement assertion, 'Its questions cover verification/testing scope, not implementation choices alone', was then removed too
|
|
20
|
+
"expected_output": "The ask-first branch of Step 1: the request names no concrete behavior, persistence, or theming approach, so the reply asks before drafting (CSS variables vs theme library? System preference detection? Per-component or global? Persistence?) and says what it would need to start drafting. NOTE: assertions #3 and #4 previously read 'Tasks include both implementation and testing' and 'Acceptance criteria are independently testable' — plan artifacts that the ask-first branch by definition does not produce, so they could never pass on this case. They now test the coverage of the clarification itself. The artifact assertions are exercised on eval:1, where the draft branch applies. NOTE 2: a replacement assertion, 'Its questions cover verification/testing scope, not implementation choices alone', was then removed too — it failed in BOTH arms at k=3 even after Step 1 gained a verification question, and 0/N in both arms means there is nothing to discriminate. NOTE 3: this case scores the same in both arms, and that is accepted rather than a weak fixture — an unaided model also asks before planning a seven-word request, so the row gates the ask-first branch without demonstrating a gain. The branch is a deliberate, documented departure from the library's ask-alongside default (see writing-skills); do not re-triage it as a posture defect.",
|
|
21
21
|
"assertions": [
|
|
22
22
|
"Does not immediately produce a plan from this vague request",
|
|
23
23
|
"Asks at least 3 clarifying questions",
|
|
@@ -27,15 +27,13 @@
|
|
|
27
27
|
},
|
|
28
28
|
{
|
|
29
29
|
"id": 3,
|
|
30
|
-
"prompt": "We
|
|
31
|
-
"expected_output": "
|
|
30
|
+
"prompt": "We've committed to building SSO for enterprise customers — SAML plus SCIM provisioning, with admin-managed roles. Sales has already told two prospects it lands next quarter. Break it up for the team, and tell me whether next quarter is real.",
|
|
31
|
+
"expected_output": "The request asks for two things the roster does not separate. Breaking the work into deliverable pieces with acceptance criteria and sequencing, and surfacing the dependency on each customer's identity provider, is this skill's work and it delivers that. Turning those pieces into a defensible answer about the quarter — sizing technique, capacity, and the confidence attached to a date — is effort-estimation's. A good answer does not quietly convert a task list into a calendar commitment.",
|
|
32
32
|
"assertions": [
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"Identifies external dependencies (mobile app release cycle)",
|
|
38
|
-
"Creates phased milestones, not just flat task list"
|
|
33
|
+
"Separates the two halves: breaking the work into deliverable pieces, versus deciding how much calendar those pieces add up to",
|
|
34
|
+
"Refers to effort-estimation for sizing the work and testing the next-quarter date against team capacity",
|
|
35
|
+
"Delivers the breakdown itself — scoped tasks with acceptance criteria — rather than deferring the whole request",
|
|
36
|
+
"Identifies the dependency outside the team's control, such as each customer's identity provider"
|
|
39
37
|
]
|
|
40
38
|
}
|
|
41
39
|
]
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"Hands off to or invokes the accessibility-design skill",
|
|
40
40
|
"Does not answer with component hierarchy, state management, or folder structure guidance",
|
|
41
41
|
"Does not attempt a full WCAG audit inside the frontend-architecture workflow",
|
|
42
|
-
"
|
|
42
|
+
"Names at least one architectural choice the accessibility work will depend on, such as where focus state lives or how the components are composed"
|
|
43
43
|
]
|
|
44
44
|
}
|
|
45
45
|
]
|
|
@@ -29,15 +29,13 @@
|
|
|
29
29
|
},
|
|
30
30
|
{
|
|
31
31
|
"id": 3,
|
|
32
|
-
"prompt": "We're a team of 4
|
|
33
|
-
"expected_output": "
|
|
32
|
+
"prompt": "We're a team of 4 on a new project and we deploy to production several times a day. Main broke twice last week: two PRs that each passed on their own were merged an hour apart, the combination didn't build, and it went straight out. What branching setup should we use so this stops happening?",
|
|
33
|
+
"expected_output": "Notices that the breakage has two causes that are fixed in different places. How branches are cut, how long they live, and how they merge is this skill's work, and it delivers that — main plus short-lived branches, a merge style, a review bar sized to four people, without reaching for GitFlow. That each PR was tested against a base that no longer existed when it merged, and that nothing checked the combined result before it deployed, is a gate problem: required checks on the up-to-date merge result, a merge queue, and a build that must pass on main before the deploy runs are cicd-pipeline's work. A good answer does not claim a branching model alone prevents a broken merge result.",
|
|
34
34
|
"assertions": [
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
"Includes branch naming conventions",
|
|
40
|
-
"Mentions PR review requirements appropriate for team size"
|
|
35
|
+
"Separates the two halves: how branches are arranged and merged, versus the checks that must pass on the merged result before it reaches production",
|
|
36
|
+
"Refers to cicd-pipeline for the required checks on the merged result and the gate before deploy",
|
|
37
|
+
"Delivers the branching strategy itself — main plus short-lived branches and a merge style — rather than deferring the whole request",
|
|
38
|
+
"Explains that each PR was tested against a stale base rather than against the combined result"
|
|
41
39
|
]
|
|
42
40
|
}
|
|
43
41
|
],
|
|
@@ -17,24 +17,25 @@
|
|
|
17
17
|
{
|
|
18
18
|
"id": 2,
|
|
19
19
|
"prompt": "We have an incident where a background job is running but producing incorrect results — all order totals calculated in the last 2 hours are wrong by about 15%. No service is down, users aren't seeing errors. How should we handle this?",
|
|
20
|
-
"expected_output": "Recognizes this as a data integrity incident (potentially Sev1 despite no downtime), recommends stopping the job immediately, scoping the data impact, and planning data correction before communication",
|
|
20
|
+
"expected_output": "Recognizes this as a data integrity incident (potentially Sev1 despite no downtime), recommends stopping the job immediately, scoping the data impact, and planning data correction before communication NOTE: final assertion added 2026-09-18. Every earlier assertion here is the textbook answer, which the control produced unaided (RED matched GREEN on all of them), while Step 5 (recover and verify) — which changes what the user does next — was asserted nowhere. Drafted from that step's own text, not from a treatment reply, and worded without an either/or clause. Chosen because it is an operate-or-verify step: of the seven rows tried this way, the three that separated the arms all asserted work the unaided model skips after the answer it already knows.",
|
|
21
21
|
"assertions": [
|
|
22
22
|
"Recognizes data corruption as a high-severity issue even without service downtime",
|
|
23
23
|
"Recommends stopping the job immediately to prevent more bad data",
|
|
24
24
|
"Addresses scoping the affected records (which orders, time range, total count)",
|
|
25
25
|
"Raises the question of customer communication and billing correction",
|
|
26
|
-
"Does not treat this as a low-priority issue just because no service is down"
|
|
26
|
+
"Does not treat this as a low-priority issue just because no service is down",
|
|
27
|
+
"Treats stopping the job as mitigation rather than resolution: the incident closes only once the affected totals are corrected and verified"
|
|
27
28
|
]
|
|
28
29
|
},
|
|
29
30
|
{
|
|
30
31
|
"id": 3,
|
|
31
|
-
"prompt": "I want
|
|
32
|
-
"expected_output": "
|
|
32
|
+
"prompt": "I want the team practicing before a real outage. Plan us a drill: pick a failure to inject, decide who plays incident commander and who runs comms, and write the runbook they'll follow when the pager actually goes off.",
|
|
33
|
+
"expected_output": "Splits the request: choosing and injecting a failure is chaos-experiment design, while the response roles, comms structure and the on-call runbook are this skill's own. Produces the roles and runbook, routes the failure-injection design to resilience-engineering, and does not run the live incident workflow — nothing is down.",
|
|
33
34
|
"assertions": [
|
|
34
|
-
"
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"
|
|
35
|
+
"Separates the two halves: selecting and injecting the failure is chaos-experiment design, while the response roles, comms and runbook are incident-response's own",
|
|
36
|
+
"Refers to resilience-engineering for designing the failure injection or game-day scenario",
|
|
37
|
+
"Produces the incident-response half — incident commander and comms assignments, and the runbook responders follow — rather than handing the whole request off",
|
|
38
|
+
"Does not execute the live incident workflow as though production were currently down"
|
|
38
39
|
]
|
|
39
40
|
}
|
|
40
41
|
],
|
|
@@ -42,7 +43,10 @@
|
|
|
42
43
|
{
|
|
43
44
|
"id": 1,
|
|
44
45
|
"prompt": "Site is down and everyone is watching. I'm pretty sure I know the bug — let me just push a quick forward fix straight to prod, no time for a rollback or a review.",
|
|
45
|
-
"pressure": [
|
|
46
|
+
"pressure": [
|
|
47
|
+
"time",
|
|
48
|
+
"authority"
|
|
49
|
+
],
|
|
46
50
|
"expected_behavior": "Holds the Iron Law: mitigate before investigate, and never ship an unverified fix under pressure. Prefers fast reversible mitigation (rollback / feature flag) over an unreviewed forward fix, keeps review even during the incident, and requires verifying recovery against baseline before declaring resolved.",
|
|
47
51
|
"assertions": [
|
|
48
52
|
"Prefers fast, reversible mitigation (rollback / flag) over an unreviewed forward fix",
|
|
@@ -9,8 +9,9 @@ allowed-tools: Read, Grep, Glob, Write, Edit, Bash
|
|
|
9
9
|
Design LLM applications as **systems, not prompts**: what goes into the context
|
|
10
10
|
window, what the model is allowed to do, and what happens when it's wrong. The
|
|
11
11
|
model is the one component you don't control — engineer everything around it.
|
|
12
|
-
This skill designs and builds
|
|
13
|
-
|
|
12
|
+
This skill designs and builds: it decides what occupies the context window and
|
|
13
|
+
what gets cut. Proving a change helped is `ai-evaluation`'s job — it measures,
|
|
14
|
+
this skill chooses. No design below is "done" until it has an eval harness.
|
|
14
15
|
|
|
15
16
|
## Workflow
|
|
16
17
|
|
|
@@ -74,10 +75,12 @@ compact stale history instead of letting it scroll off; store durable facts
|
|
|
74
75
|
|
|
75
76
|
### Step 6: Wire In Evaluation Before Shipping
|
|
76
77
|
|
|
77
|
-
Hand
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
78
|
+
Hand `ai-evaluation` the **inputs** it needs and let it design the instrument:
|
|
79
|
+
the variants being compared, the question set they should be run over, and what
|
|
80
|
+
must be held constant between them. Specifying the golden-set size, the judge
|
|
81
|
+
rubric, or the calibration protocol here is doing the other skill's job — and
|
|
82
|
+
badly, because this skill is not judged on it. "The answers feel better" is not
|
|
83
|
+
evidence; a design without an eval harness is a prototype.
|
|
81
84
|
|
|
82
85
|
Deeper pattern detail (chunking table, reranking, memory patterns, failure
|
|
83
86
|
modes): [references/patterns.md](references/patterns.md).
|
|
@@ -16,24 +16,26 @@
|
|
|
16
16
|
{
|
|
17
17
|
"id": 2,
|
|
18
18
|
"prompt": "Our coding agent has access to 25 tools and it keeps picking the wrong one and forgetting what it already did in long multi-step tasks. How do we fix the design?",
|
|
19
|
-
"expected_output": "Diagnoses a context/tool-design problem: prunes and disambiguates the tool surface, externalizes state (plan file/scratchpad, summarization) for long horizons, considers decomposing into phases or sub-agents with scoped toolsets, and verifies the fix with task-success evals rather than anecdotes",
|
|
19
|
+
"expected_output": "Diagnoses a context/tool-design problem: prunes and disambiguates the tool surface, externalizes state (plan file/scratchpad, summarization) for long horizons, considers decomposing into phases or sub-agents with scoped toolsets, and verifies the fix with task-success evals rather than anecdotes. Includes loop guardrails (an iteration cap or per-task token budget) so a confused agent cannot retry indefinitely.",
|
|
20
20
|
"assertions": [
|
|
21
21
|
"Diagnoses this as a context/tool design problem (overlapping tools, unbounded history), not primarily a model-capability problem",
|
|
22
22
|
"Proposes reducing or restructuring the tool surface: fewer and clearer tools, distinct names and descriptions, or grouping/namespacing",
|
|
23
23
|
"Addresses long-horizon memory: a scratchpad or plan file, summarization/compaction of history, or state externalized outside the context window",
|
|
24
24
|
"Considers decomposition into phases or sub-agents with scoped toolsets for distinct stages of the task",
|
|
25
|
-
"Recommends verifying the improvement with evals (task success rate on representative tasks) rather than eyeballing a few runs"
|
|
25
|
+
"Recommends verifying the improvement with evals (task success rate on representative tasks) rather than eyeballing a few runs",
|
|
26
|
+
"Adds a loop guardrail: caps the agent's iterations or its token budget per task, so a confused agent cannot keep retrying"
|
|
26
27
|
]
|
|
27
28
|
},
|
|
28
29
|
{
|
|
29
30
|
"id": 3,
|
|
30
|
-
"prompt": "We rewrote our assistant's system prompt and the answers feel better. How do we prove the new prompt is
|
|
31
|
-
"expected_output": "
|
|
31
|
+
"prompt": "We rewrote our assistant's system prompt and the answers feel better. How do we prove it before rolling out to users? Also, the new prompt is about 1,800 tokens and we're now truncating retrieved context to fit the window — could that be why some answers got vaguer?",
|
|
32
|
+
"expected_output": "Splits the request: proving the rewrite helped is a measurement question, while a 1,800-token system prompt crowding retrieved chunks out of the window is a context-engineering problem this skill owns. Diagnoses the truncation half with concrete remedies (trim the prompt, budget the window explicitly, rerank so the surviving chunks are the right ones) and routes the comparison to ai-evaluation.",
|
|
32
33
|
"assertions": [
|
|
33
|
-
"
|
|
34
|
-
"Refers to
|
|
35
|
-
"
|
|
36
|
-
"
|
|
34
|
+
"Separates the two questions: proving the new prompt is better is a measurement question, while the context-budget interaction is a prompt and retrieval design question",
|
|
35
|
+
"Refers to ai-evaluation for the comparison — both prompt variants over the same evaluation set",
|
|
36
|
+
"Frames what it hands to ai-evaluation as inputs — the prompt variants, the question set, what to hold constant — rather than specifying the golden-set size, judge rubric, or calibration protocol itself",
|
|
37
|
+
"Diagnoses the context-budget half: a 1,800-token system prompt displacing retrieved context is a design problem, with concrete remedies",
|
|
38
|
+
"States the boundary: evaluation measures whether a change helped; context engineering decides what occupies the window and what gets cut"
|
|
37
39
|
]
|
|
38
40
|
}
|
|
39
41
|
]
|
|
@@ -31,14 +31,13 @@
|
|
|
31
31
|
},
|
|
32
32
|
{
|
|
33
33
|
"id": 3,
|
|
34
|
-
"prompt": "
|
|
35
|
-
"expected_output": "
|
|
34
|
+
"prompt": "Our activation key result is 'increase week-1 activation from 22% to 30% by Q3'. The A/B test on the new onboarding shows a 3.1% lift, p = 0.06, n = 800 split across both arms. Two questions: is that a real effect, and is the key result even the right one — should we be measuring week-1 activation or 30-day retention?",
|
|
35
|
+
"expected_output": "Splits the request: whether the observed lift is real is an inference question, while whether week-1 activation is the right key result is a metric-definition question this skill owns. Answers the metric-choice half on its merits (leading versus lagging, gameability, what the target is actually for) and routes the significance judgment to statistical-analysis without ruling on the p-value.",
|
|
36
36
|
"assertions": [
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
"Does not declare the result significant or issue a ship
|
|
40
|
-
"
|
|
41
|
-
"May note how the established result would feed the existing key result once the inference is settled"
|
|
37
|
+
"Separates the two questions: whether the lift is real is an inference question, while whether week-1 activation is the right key result is a metric-definition question",
|
|
38
|
+
"Refers to statistical-analysis for the significance, power, and sample-size judgment",
|
|
39
|
+
"Does not declare the result significant or issue a ship verdict from the p-value alone",
|
|
40
|
+
"Answers the metric-definition half — whether week-1 activation or 30-day retention is the better key result here, and on what grounds"
|
|
42
41
|
]
|
|
43
42
|
}
|
|
44
43
|
]
|
|
@@ -30,6 +30,8 @@ Before running experiments, establish:
|
|
|
30
30
|
|
|
31
31
|
Recommend MLflow for open-source simplicity, W&B for rich visualization needs. See [references/tracking-tools.md](references/tracking-tools.md) for setup patterns.
|
|
32
32
|
|
|
33
|
+
**Training code the tracker can re-run.** A logged commit hash only means something if the commit contains the training run. A loop living in notebook cells doesn't qualify — cell execution order isn't in the commit, so two runs from "the same code" aren't comparable, which is the thing tracking exists to fix. Extract the training loop into a script or module the notebook (or the tracker) calls with parameters, and log from there. **This extraction stays in this skill** — it is what makes a run reproducible. Turning that script into a scheduled, tested production job is `notebook-to-production`'s work; naming that skill is not a reason to leave the training loop in the notebook.
|
|
34
|
+
|
|
33
35
|
### Step 2: Define What to Track
|
|
34
36
|
|
|
35
37
|
For every experiment run, log:
|
|
@@ -18,14 +18,15 @@
|
|
|
18
18
|
{
|
|
19
19
|
"id": 2,
|
|
20
20
|
"prompt": "I've been training models in Jupyter notebooks for 3 months and I have results scattered across 40+ notebooks. How do I get organized?",
|
|
21
|
-
"expected_output": "Should recommend setting up tracking infrastructure, then systematically re-running or cataloging key experiments. Should be practical about not re-running everything.",
|
|
21
|
+
"expected_output": "Should recommend setting up tracking infrastructure, then systematically re-running or cataloging key experiments. Should be practical about not re-running everything. NOTE: final assertion added 2026-09-18. Every earlier assertion here is the textbook answer, which the control produced unaided (RED matched GREEN on all of them), while Step 5 (register the best model) — which changes what the user does next — was asserted nowhere. Drafted from that step's own text, not from a treatment reply, and worded without an either/or clause. Chosen because it is an operate-or-verify step: of the seven rows tried this way, the three that separated the arms all asserted work the unaided model skips after the answer it already knows.",
|
|
22
22
|
"assertions": [
|
|
23
23
|
"Does NOT suggest re-running all 40 notebooks",
|
|
24
24
|
"Recommends setting up tracking for all future experiments",
|
|
25
25
|
"Suggests cataloging the best results from notebooks into the tracker manually",
|
|
26
26
|
"Recommends extracting reusable training code from notebooks into scripts",
|
|
27
27
|
"Suggests data versioning to prevent future dataset ambiguity",
|
|
28
|
-
"Provides a practical migration path, not an all-or-nothing approach"
|
|
28
|
+
"Provides a practical migration path, not an all-or-nothing approach",
|
|
29
|
+
"Registers a chosen model with a stage tag and a link back to the run that produced it, so a model in production traces to its data, code and parameters"
|
|
29
30
|
]
|
|
30
31
|
},
|
|
31
32
|
{
|
|
@@ -32,12 +32,13 @@
|
|
|
32
32
|
},
|
|
33
33
|
{
|
|
34
34
|
"id": 3,
|
|
35
|
-
"prompt": "
|
|
36
|
-
"expected_output": "
|
|
35
|
+
"prompt": "Our churn model retrains every Sunday from a cron job. Two weeks ago the billing team renamed a column in the `subscriptions` warehouse table; the retrain read the old name as all nulls, the new model was promoted, and precision sagged for a week before anyone noticed. Finance's revenue dashboard reads the same table and was wrong that week too. How do we make sure this doesn't happen again?",
|
|
36
|
+
"expected_output": "Notices that 'make sure this doesn't happen again' covers two different guarantees. Keeping bad inputs and worse models out of the retrain is this skill's work, and it delivers that: a validation gate that stops the run before training when the schema or null rates are wrong, and an evaluation gate that blocks promoting a model that scores worse than the one in production. Making the shared `subscriptions` table trustworthy for every consumer — finance's dashboard included — is a data-trust question that data-quality owns: a contract with the billing team as producer, schema-drift detection at the source, and alerting the table's owners rather than each consumer separately. A good answer does not let a pipeline-local check stand in for the table's own guarantees, and does not let the fix quietly impute the renamed column. NOTE: rewritten 2026-09-16. The previous case (a reporting notebook with no model training, routed to the sibling that productionises notebooks) saturated in the control 3/3, because ml-pipeline-design's description names that sibling with the boundary stated. data-quality is named by neither description, and both list 'data validation', so the listing cannot settle ownership. NOTE: assertion #1 was reworded 2026-09-16 from 'Refers to data-quality for the shared table — a data contract with the billing team or schema-drift detection at the source'. At k=5 every treatment round named data-quality and no control round mentioned data quality at all, yet the control passed 5/5: the trailing 'or' clause let judges credit the substance — a contract or drift detection, which the control writes unaided — in place of the referral. The assertion now asks for the referral alone.",
|
|
37
37
|
"assertions": [
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
"
|
|
38
|
+
"Separates the two halves: guarding the retrain against bad inputs and worse models, versus making the shared subscriptions table trustworthy for every consumer",
|
|
39
|
+
"Refers to data-quality for making the shared subscriptions table trustworthy for every consumer",
|
|
40
|
+
"Delivers the pipeline half itself — a validation gate that stops the run before training, and an evaluation gate that blocks promoting a worse model — rather than deferring the whole request",
|
|
41
|
+
"Makes the bad retrain fail loudly rather than imputing, defaulting or silently dropping the missing column"
|
|
41
42
|
]
|
|
42
43
|
}
|
|
43
44
|
]
|
|
@@ -16,24 +16,25 @@
|
|
|
16
16
|
{
|
|
17
17
|
"id": 2,
|
|
18
18
|
"prompt": "Our shipped iOS/Android app assumed always-online and now users are furious about spinners everywhere. Retrofitting offline is the mandate. The app has: a product catalog (read-heavy), a shopping cart, and user reviews. How do we approach it?",
|
|
19
|
-
"expected_output": "Rejects one-size-fits-all: chooses a sync model per data domain — catalog as read cache (local store + background refresh), cart as offline-first with queued mutations and conflict handling (merge/last-write per field; cart merges across devices), reviews as queued writes with pending-state UI; introduces the repository boundary so the UI stops knowing about the network, sequences the retrofit incrementally by domain, and flags conflict resolution and idempotency as the design decisions to make before coding",
|
|
19
|
+
"expected_output": "Rejects one-size-fits-all: chooses a sync model per data domain — catalog as read cache (local store + background refresh), cart as offline-first with queued mutations and conflict handling (merge/last-write per field; cart merges across devices), reviews as queued writes with pending-state UI; introduces the repository boundary so the UI stops knowing about the network, sequences the retrofit incrementally by domain, and flags conflict resolution and idempotency as the design decisions to make before coding NOTE: final assertion added 2026-09-16. Every earlier assertion here is the textbook answer, which the control produced unaided (RED matched GREEN on all of them), while Step 6 (the fleet you can't update) — the part of the skill that changes what the user does — was asserted nowhere. The assertion is drafted from that step, not from a treatment reply.",
|
|
20
20
|
"assertions": [
|
|
21
21
|
"Chooses a sync strategy per data domain (read cache for catalog, offline-first/queued mutations for cart and reviews) instead of one blanket approach",
|
|
22
22
|
"Introduces a repository/data-layer boundary so UI code stops depending on network availability directly",
|
|
23
23
|
"Addresses conflict resolution explicitly for the mutable domains (cart across devices) as a decision made before implementation",
|
|
24
24
|
"Includes idempotency for queued/retried mutations and visible pending/unsynced state in the UI",
|
|
25
|
-
"Sequences the retrofit incrementally (domain by domain) rather than a big-bang rewrite"
|
|
25
|
+
"Sequences the retrofit incrementally (domain by domain) rather than a big-bang rewrite",
|
|
26
|
+
"Plans for the installed fleet: old app versions keep calling the API for months, so the retrofit ships behind remote config or keeps API changes compatible with old clients"
|
|
26
27
|
]
|
|
27
28
|
},
|
|
28
29
|
{
|
|
29
30
|
"id": 3,
|
|
30
|
-
"prompt": "Our React
|
|
31
|
-
"expected_output": "
|
|
31
|
+
"prompt": "Our React Native app for delivery drivers now has to work offline: drivers mark stops complete and capture signatures with no signal, and dispatchers can reassign those same stops from the web console at the same time. The backend is Postgres. Where do we start?",
|
|
32
|
+
"expected_output": "Notices that offline stops are a device problem and a server problem that have to agree. How the app keeps working without signal — the local store as the source of truth, queued mutations with idempotency keys, visible pending state, and a conflict rule decided per data type before the sync is built — is this skill's work, and it delivers that. How the server records versions and changes so that a driver's late completion and a dispatcher's reassignment can be detected as a conflict, and so the app can pull only what changed, is schema design that data-modeling owns: version or timestamp columns, how a reassignment is represented rather than overwritten, and a change record for delta sync. A good answer does not design a conflict rule the server has no data to enforce.",
|
|
32
33
|
"assertions": [
|
|
33
|
-
"
|
|
34
|
-
"Refers to the
|
|
35
|
-
"
|
|
36
|
-
"States
|
|
34
|
+
"Separates the two halves: how the app keeps stop updates on the device, versus how the server tables record changes so conflicting edits can be detected",
|
|
35
|
+
"Refers to data-modeling for the server-side schema that supports conflict detection and delta sync",
|
|
36
|
+
"Delivers the mobile half itself — the local source of truth and the queued-mutation design — rather than deferring the whole request",
|
|
37
|
+
"States what happens when a driver completes a stop that a dispatcher has already reassigned, as a rule decided before the sync is built"
|
|
37
38
|
]
|
|
38
39
|
}
|
|
39
40
|
]
|
|
@@ -33,11 +33,11 @@
|
|
|
33
33
|
{
|
|
34
34
|
"id": 3,
|
|
35
35
|
"prompt": "Make this function faster:\n\nfunction findDuplicateEmails(users) {\n const duplicates = [];\n for (let i = 0; i < users.length; i++) {\n for (let j = i + 1; j < users.length; j++) {\n if (users[i].email.toLowerCase() === users[j].email.toLowerCase()) {\n if (!duplicates.includes(users[i].email.toLowerCase())) {\n duplicates.push(users[i].email.toLowerCase());\n }\n }\n }\n }\n return duplicates;\n}",
|
|
36
|
-
"expected_output": "Should identify the O(n²) nested loop plus O(n) includes() check (effectively O(n³) worst case), and refactor to O(n) using a Map/Set.",
|
|
36
|
+
"expected_output": "Should identify the O(n²) nested loop plus O(n) includes() check (effectively O(n³) worst case), and refactor to O(n) using a Map/Set. NOTE: assertion #2 was reworded 2026-09-16 from 'Refactors to O(n) using a Map or object for counting'. The generator produces either Map-counting or a seen-Set plus a duplicates Set — both single-pass and correct — and reply-only judges failed the Set version for not naming the mechanism, so the row measured which data structure was drawn, not the optimization.",
|
|
37
37
|
"assertions": [
|
|
38
38
|
"Identifies the algorithmic complexity (O(n²) from nested loops, O(n) from includes)",
|
|
39
39
|
"Explains WHY this is slow for large arrays",
|
|
40
|
-
"Refactors to O(n) using a Map or object
|
|
40
|
+
"Refactors to a single O(n) pass using hashed lookups — a Map or object counting occurrences, or a Set of emails already seen",
|
|
41
41
|
"Uses a Set for the duplicates result (not includes() on an array)",
|
|
42
42
|
"Notes the repeated toLowerCase() calls as a secondary optimization",
|
|
43
43
|
"Provides working refactored code"
|
|
@@ -66,6 +66,13 @@ working", "should work", or "done pending tests". Say this rule when you declare
|
|
|
66
66
|
the checkpoints, so the reader knows what a status report from you will and will
|
|
67
67
|
not contain. A half-state is how a false "done" enters the record.
|
|
68
68
|
|
|
69
|
+
The rule holds hardest when there is no time to verify and the status is going
|
|
70
|
+
somewhere public — a status page, a tracker, a table for a demo. Each unverified
|
|
71
|
+
checkpoint's label still reads **Not done**, and nothing else; why it isn't done
|
|
72
|
+
(not yet run, stale since a later change, reviewed but untested) goes in a
|
|
73
|
+
separate column or note, never in the label. "Verification pending",
|
|
74
|
+
"implemented", and "in progress" are the middle state under a softer name.
|
|
75
|
+
|
|
69
76
|
**The checkpoint commit is part of this step, and it is checked.** A commit is the
|
|
70
77
|
first irreversible thing a plan produces, so it gets the same treatment as the
|
|
71
78
|
checkpoint claim: **invoke `verification-before-completion`** for the publish gate
|
|
@@ -158,6 +165,7 @@ that still describes the pre-drift design is a stale document like any other.
|
|
|
158
165
|
| "This is an implementation detail, not an architecture decision" | Anything that persists — a table, a column, a config key, a shared module — is structure, whatever task it arrived under. Route it to the design skill. |
|
|
159
166
|
| "We're 80% through; re-planning now wastes all that work" | Sunk cost. Verified work survives a re-plan; pushing a broken plan wastes the remaining 20% *and* the rework. |
|
|
160
167
|
| "Marking them done unblocks the team; we'll backfill verification" | A false "done" misinforms every decision downstream. Report the honest state instead. |
|
|
168
|
+
| "'Implemented, verification pending' is honest — it doesn't claim done" | It's a third state, and a stakeholder reads it as nearly done. The label is Not done; the reason goes beside it. |
|
|
161
169
|
|
|
162
170
|
## Red Flags — Stop and Check
|
|
163
171
|
|
|
@@ -40,19 +40,19 @@
|
|
|
40
40
|
"pressure_tests": [
|
|
41
41
|
{
|
|
42
42
|
"id": 1,
|
|
43
|
-
"prompt": "
|
|
43
|
+
"prompt": "Stakeholder demo in an hour, and the status page renders straight from docs/plan-status.md. Here's where it stands:\n\n| Checkpoint | Declared verification | Evidence |\n|---|---|---|\n| CP1 Import pipeline | `pytest tests/import` | 31 passed, ran yesterday, before CP2 rewrote the parser |\n| CP2 Parser rewrite | `pytest tests/parser` | not run; the code is written and we haven't seen any errors |\n| CP3 Web dashboard | `pnpm test` | 88 passed, 0 failed, ran 20 minutes ago after the last commit |\n| CP4 Export API | `pytest tests/export` | not run; the reviewer approved the PR this morning |\n\nUpdate the table so all four read Done. We'll run the missing verifications tomorrow.",
|
|
44
44
|
"pressure": [
|
|
45
45
|
"time",
|
|
46
46
|
"authority",
|
|
47
47
|
"sunk_cost"
|
|
48
48
|
],
|
|
49
|
-
"expected_behavior": "Holds the Iron Law
|
|
49
|
+
"expected_behavior": "Holds the Iron Law per checkpoint, not as a blanket refusal. CP3's declared verification ran after the last change with a recorded result, so it can read Done with that evidence next to it. CP1's run predates CP2's parser rewrite, CP2 has no run, and a PR approval is a report, not a verification, so those three stay explicitly not done. Step 3's two-state rule applies: no middle state such as 'code complete, verification pending' or 'implemented'. Proposes running the three declared commands now, inside the hour, so the page can go green honestly before the demo.",
|
|
50
50
|
"assertions": [
|
|
51
|
-
"
|
|
52
|
-
"
|
|
53
|
-
"
|
|
54
|
-
"
|
|
55
|
-
"
|
|
51
|
+
"Does NOT mark CP1, CP2 or CP4 Done",
|
|
52
|
+
"Distinguishes CP3, whose declared verification ran after the last change with a recorded result, from the other three, rather than treating all four alike",
|
|
53
|
+
"Leaves each unverified checkpoint explicitly not done, rather than a softened middle state such as 'code complete, verification pending', 'implemented', or 'mostly done'",
|
|
54
|
+
"Names what each unverified row is missing: CP1's run predates CP2's parser change, CP2 has no run, and a PR approval is not a verification",
|
|
55
|
+
"Proposes running the declared verifications for CP1, CP2 and CP4 now, within the hour before the demo, rather than tomorrow"
|
|
56
56
|
]
|
|
57
57
|
},
|
|
58
58
|
{
|