mirror of
https://github.com/garrytan/gstack.git
synced 2026-11-01 22:45:02 +01:00
Merge gsta-96-completeness-wording (#3425) into gsta-96-preamble-hoist
plan-ceo-review's parity cap moves 1.0999 -> 1.1006 for the approved COMPLETENESS IS COVERAGE bullet (Garry 2026-10-25: "do it", parity caps to measured size; applied by GStack Minder). Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
This commit is contained in:
commit
c9804fc681
7 files changed
+25
-13
No files matched your search
+8
-6
@@ -12,7 +12,7 @@
|
||||
|
||||
### Tests
|
||||
- `test/helpers/skill-startup.ts` (new): `readSkillStartup` (SKILL.md with the shared file spliced in at its pointer, the reading order a skill sees) and `readSkillEffective` (each preamble section once, with this skill's variant applied). Tests that assert preamble rules are in context, E2E fixture extractors, workflow-judge bundles and install checks read these instead of SKILL.md alone; judge bundles keep their pre-hoist content.
|
||||
- `test/helpers/carve-guards.ts`: parity caps for ship, review, autoplan, spec, land-and-deploy, design-consultation, plan-devex-review, plan-ceo-review, office-hours and plan-eng-review raised to their measured unions (owner-approved, Garry 2026-10-25: "do it"), each with its reason. The union now includes the shared file, and office-hours and plan-eng-review count their own copies of shared sections twice until a follow-up dedupes them.
|
||||
- `test/helpers/carve-guards.ts`: parity caps for ship, review, autoplan, spec, land-and-deploy, design-consultation, plan-devex-review, plan-ceo-review, office-hours and plan-eng-review raised to their measured unions (owner-approved, Garry 2026-10-25: "do it"), each with its reason. The union now includes the shared file; plan-ceo-review's cap (1.1006) also covers the 106-byte COMPLETENESS IS COVERAGE bullet from the completeness rewording below. office-hours and plan-eng-review count their own copies of shared sections twice until a follow-up dedupes them.
|
||||
- `test/fixtures/skill-md-size-allowlist.json`: 63 pins lowered and 26 deleted (now within the 100,000-character limit). None raised. The deferral note (owner Garry, revisit 2026-11-15) is retired here and in `test/skill-md-size-guard.test.ts`.
|
||||
- `test/section-manifest-consistency.test.ts`: the generated-orphan check exempts the shared `sections/preamble.md` only when the skill's SKILL.md carries the "Shared preamble (load first)" pointer, because that file renders from `scripts/resolvers/preamble-hoist.ts` rather than a section template; it still must carry the AUTO-GENERATED header, and the generation freshness check covers its content. `test/paid-pr-profile.test.ts` covers the planner change.
|
||||
- `test/preamble-hoist.test.ts` (new): tier 1 output is unchanged, and a tier 2+ SKILL.md with its `sections/preamble.md` applied holds exactly the pre-hoist preamble; the pointer opens the preamble, precedes the start command and names the shared file's id. `test/gen-skill-docs-checks.test.ts` checks that each host renders one shared preamble, beside every pointer and under the id the pointer names.
|
||||
@@ -24,13 +24,15 @@
|
||||
**The Completeness Principle now asks for complete coverage with minimal code.** Every tier-2+ skill's preamble said "the complete thing is the goal", and ETHOS.md told models to "always prefer A" because "the 70-line delta costs seconds". Models read that as permission to write more code, which is the "50-line job arriving as 400" complaint (GSTA-93). Coverage of the requirement is still non-negotiable; code beyond it is no longer a virtue.
|
||||
|
||||
### Changed
|
||||
- **`scripts/resolvers/preamble/generate-completeness-section.ts`**: the default section reads "Complete coverage, minimal code": recommend full coverage of the requirement (tests, edge cases, error paths) and no code beyond it, prefer the smaller diff at equal coverage, and add no checks for impossible states. Unrelated work stays separate scope. The `Completeness: X/10` scoring rule and the GPT-5.6 Sol variant are unchanged. The section is 5 characters shorter, so every regenerated skill shrinks and 89 size pins go down.
|
||||
- **`ETHOS.md`**: "Completeness is cheap ... always prefer A" becomes "Complete coverage, minimal code": completeness is measured in coverage, not lines; at equal coverage choose the smaller diff; no speculative abstractions, impossible-state checks or unneeded refactors. A new anti-pattern names the impossible-state fallback.
|
||||
- `review/specialists/simplification.md` and `CLAUDE.md` quote the new house rule instead of "If A is 70 lines more, choose A".
|
||||
- **`scripts/resolvers/preamble/generate-completeness-section.ts`**: the default section reads "Complete coverage, minimal code": recommend full coverage of the requirement (tests, edge cases, error paths) and no code beyond it, prefer the smaller diff at equal coverage, and add no checks for impossible states. Unrelated work stays separate scope. The `Completeness: X/10` scoring rule and the GPT-5.6 Sol variant are unchanged. The section is 3 characters shorter, so every regenerated skill shrinks and 89 size pins go down.
|
||||
- **`ETHOS.md`**: "Completeness is cheap ... always prefer A" becomes "Complete coverage, minimal code": completeness is measured in coverage, not lines; at equal coverage choose the smaller diff; no speculative abstractions, impossible-state checks or unneeded refactors. A new anti-pattern names the impossible-state fallback. Section 1's opener now says "When covering the whole requirement costs minutes more than the shortcut, cover it. Every time. Complete means complete coverage, not more code.", and "How They Work Together" says Boil the Ocean means "cover the whole requirement with the least code" instead of "do the complete thing".
|
||||
- **`plan-ceo-review/SKILL.md.tmpl`**: the Philosophy bullet "COMPLETENESS IS CHEAP: AI makes 70 LOC seconds. Prefer complete ~150 LOC over 90% ~80 LOC. Boil the ocean." becomes "COMPLETENESS IS COVERAGE": cover the whole requirement (tests, edge cases, error paths) rather than a 90% shortcut, add no code beyond the accepted scope (so SCOPE EXPANSION and SELECTIVE EXPANSION still build what the user accepted), and choose the smaller diff at equal coverage. plan-ceo-review is under the 100,000-character limit on every host and has no size pin, so it grows about 100 characters without a pin change.
|
||||
- `review/specialists/simplification.md` quotes the new house rule instead of "If A is 70 lines more, choose A", and `CLAUDE.md` restates it in place of "Completeness is cheap ... the complete thing is the goal".
|
||||
|
||||
### Tests
|
||||
- `test/model-overlays.test.ts` asserts the new default wording ("Complete coverage, minimal code.", "prefer the smaller diff").
|
||||
- `test/fixtures/skill-md-size-allowlist.json`: 89 pins lowered by 3 characters each. None raised.
|
||||
- `test/model-overlays.test.ts` asserts the new default wording ("Complete coverage, minimal code.", "prefer the smaller diff") and checks, one sentence per rule, that the section still states full coverage of the requirement with no code beyond it, the smaller diff only at equal coverage, no checks for impossible states, and that unrelated work is separate scope that never excuses a gap.
|
||||
- `test/ceo-workflow-clarity.test.ts` checks that the plan-ceo-review Philosophy bullet still asks for the whole requirement over a 90% shortcut, no code beyond the accepted scope and the smaller diff at equal coverage, and that "COMPLETENESS IS CHEAP" and "~150 LOC" stay gone.
|
||||
- `test/fixtures/skill-md-size-allowlist.json`: 89 pins lowered by 3 characters each. None raised; the plan-ceo-review rewording touches no pinned skill.
|
||||
|
||||
### Gate integrity
|
||||
- No threshold, budget, timeout, trial count, case kind or assertion weakened. The section heading "Completeness Principle — Boil the Ocean" is unchanged, so every skip list that names it still matches.
|
||||
|
||||
@@ -37,8 +37,8 @@ The last 10% of completeness that teams used to skip? It costs seconds now.
|
||||
"Don't boil the ocean" was the right advice when engineering time was the
|
||||
bottleneck. That era is over. AI-assisted coding makes the marginal cost of
|
||||
completeness near-zero, so the old caution has quietly turned into an excuse.
|
||||
When the complete implementation costs minutes more than the shortcut — do the
|
||||
complete thing. Every time.
|
||||
When covering the whole requirement costs minutes more than the shortcut, cover
|
||||
it. Every time. Complete means complete coverage, not more code.
|
||||
|
||||
**Ocean, lakes first:** The ocean is the destination — 100% test coverage for a
|
||||
module, full feature implementation, all edge cases, complete error paths. You
|
||||
@@ -179,7 +179,7 @@ against, and gstack's countermeasure for each, lives in
|
||||
|
||||
## How They Work Together
|
||||
|
||||
Boil the Ocean says: **do the complete thing.**
|
||||
Boil the Ocean says: **cover the whole requirement with the least code.**
|
||||
Search Before Building says: **know what exists before you decide what to build.**
|
||||
Honest Work says: **the proof is the work, and a report is a claim until re-executed.**
|
||||
|
||||
|
||||
@@ -218,7 +218,7 @@ Make this plan extraordinary. Match posture:
|
||||
* SELECTIVE EXPANSION: Harden current scope; neutrally offer each expansion's opportunity, effort and risk. Accepted items govern later sections; rejected ones go to "NOT in scope."
|
||||
* HOLD SCOPE: Preserve scope; trace failures, edge cases, error paths, tests and observability.
|
||||
* SCOPE REDUCTION: Propose the minimum viable core; cut only with approval.
|
||||
* COMPLETENESS IS CHEAP: AI makes 70 LOC seconds. Prefer complete ~150 LOC over 90% ~80 LOC. Boil the ocean.
|
||||
* COMPLETENESS IS COVERAGE: Prefer the approach that covers the whole requirement (tests, edge cases, error paths) over a 90% shortcut, add no code beyond the accepted scope, and at equal coverage choose the smaller diff.
|
||||
Approval is required for each scope change. Raise concerns in Step 0, then commit: no arguing for less in EXPANSION, silent SELECTIVE additions/cuts, or scope restored to REDUCTION.
|
||||
Review only. Do not change code or implement.
|
||||
|
||||
|
||||
@@ -64,7 +64,7 @@ Make this plan extraordinary. Match posture:
|
||||
* SELECTIVE EXPANSION: Harden current scope; neutrally offer each expansion's opportunity, effort and risk. Accepted items govern later sections; rejected ones go to "NOT in scope."
|
||||
* HOLD SCOPE: Preserve scope; trace failures, edge cases, error paths, tests and observability.
|
||||
* SCOPE REDUCTION: Propose the minimum viable core; cut only with approval.
|
||||
* COMPLETENESS IS CHEAP: AI makes 70 LOC seconds. Prefer complete ~150 LOC over 90% ~80 LOC. Boil the ocean.
|
||||
* COMPLETENESS IS COVERAGE: Prefer the approach that covers the whole requirement (tests, edge cases, error paths) over a 90% shortcut, add no code beyond the accepted scope, and at equal coverage choose the smaller diff.
|
||||
Approval is required for each scope change. Raise concerns in Step 0, then commit: no arguing for less in EXPANSION, silent SELECTIVE additions/cuts, or scope restored to REDUCTION.
|
||||
Review only. Do not change code or implement.
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ import { describe, expect, test } from 'bun:test';
|
||||
import { readFileSync } from 'node:fs';
|
||||
import { resolve } from 'node:path';
|
||||
import { readWorkflowJudgeInput } from './helpers/workflow-judge-input';
|
||||
import { expectMentions } from './helpers/prompt-structure';
|
||||
import { expectAbsent, expectMentions } from './helpers/prompt-structure';
|
||||
|
||||
const root = resolve(import.meta.dir, '..');
|
||||
const compact = (text: string) => text.replace(/\s+/g, ' ').trim();
|
||||
@@ -93,3 +93,11 @@ for (const source of sources) describe(`CEO clarity routing — ${source.label}`
|
||||
expectMentions(opening, [['do not', 'another', 'handoff']], 'opening');
|
||||
});
|
||||
});
|
||||
|
||||
describe('CEO completeness posture', () => {
|
||||
test('the Philosophy bullet measures completeness in coverage, not code', () => {
|
||||
const philosophy = readFileSync(resolve(root, 'plan-ceo-review/SKILL.md.tmpl'), 'utf8').split('## Philosophy')[1]!.split('## Prime Directives')[0]!;
|
||||
expectMentions(philosophy, [['whole requirement', '90% shortcut', 'no code beyond', 'equal coverage', 'smaller diff']], 'philosophy');
|
||||
expectAbsent(philosophy, ['COMPLETENESS IS CHEAP', '~150 LOC'], 'philosophy');
|
||||
});
|
||||
});
|
||||
@@ -191,7 +191,7 @@ export const CARVE_GUARDS: Record<string, CarveGuard> = {
|
||||
mustContain: ['SCOPE EXPANSION', 'SELECTIVE EXPANSION', 'HOLD SCOPE', 'SCOPE REDUCTION'],
|
||||
// Default-on Codex outside-voice (codexPreflight block + CODEX_MODE branch
|
||||
// prose replacing the smaller opt-in question) lands this ~5.2% over baseline.
|
||||
maxSizeRatio: 1.0999, // + the Aside probe's failure reason; measured 1.0803 + Oct 10 multi-agent wave PR D1 (reality rows): 0A/0B block in the skeleton, the Reality rows required output, the Completion Summary row and the checklist row; measured 165,042 / 151,747 = 1.0876 (2026-10-10). + GSTA-96 shared-preamble hoist (owner-approved raise, Garry 2026-10-25: "do it"): the union now holds sections/preamble.md, so a fresh invocation reads the pointer plus the shared file; measured 166,899 / 151,747 = 1.0999 (2026-10-25). Before: 1.088.
|
||||
maxSizeRatio: 1.1006, // + the Aside probe's failure reason; measured 1.0803 + Oct 10 multi-agent wave PR D1 (reality rows): 0A/0B block in the skeleton, the Reality rows required output, the Completion Summary row and the checklist row; measured 165,042 / 151,747 = 1.0876 (2026-10-10). + GSTA-96 shared-preamble hoist (owner-approved raise, Garry 2026-10-25: "do it"): the union now holds sections/preamble.md, so a fresh invocation reads the pointer plus the shared file; measured 166,899 / 151,747 = 1.0999 (2026-10-25). + GSTA-96 completeness rewording (#3425, Garry 2026-10-25: "1/ yes fix this") merged into the hoist (#3434): the COMPLETENESS IS COVERAGE bullet replaces COMPLETENESS IS CHEAP, +106 bytes under the same "do it" (parity caps to measured size); measured 167,012 / 151,747 = 1.1006 (2026-10-26). Before: 1.088.
|
||||
},
|
||||
'plan-eng-review': {
|
||||
skill: 'plan-eng-review',
|
||||
|
||||
@@ -14,6 +14,7 @@ import { CLAUDE_JUDGE_EVAL_MODEL } from '../lib/eval-model';
|
||||
import { readOverlay } from '../scripts/resolvers/model-overlay';
|
||||
import { generateCompletenessSection } from '../scripts/resolvers/preamble/generate-completeness-section';
|
||||
import { generateSetupCommand } from '../scripts/resolvers/utility';
|
||||
import { expectMentions } from './helpers/prompt-structure';
|
||||
|
||||
describe('model-overlay-fable-5', () => {
|
||||
function makeCtx(model: string): TemplateContext {
|
||||
@@ -121,6 +122,7 @@ describe('GPT-5.6 Sol model profile', () => {
|
||||
expect(generic).toContain('make your best judgment and proceed');
|
||||
expect(completeness).toContain('Complete coverage, minimal code.');
|
||||
expect(completeness).toContain('prefer the smaller diff');
|
||||
expectMentions(completeness, [['full coverage', 'requirement', 'error paths', 'no code beyond'], ['equal coverage', 'smaller diff'], ['no checks', 'impossible states'], ['unrelated', 'separate scope', 'never', 'gap']], 'default completeness section');
|
||||
});
|
||||
|
||||
test('terse mode still suppresses the completeness section for Sol', () => {
|
||||
|
||||
Reference in new issue
Block a user