Context
This is an observation task, not an implementation task. It produces evidence (issue comments), not code. Nothing in src/, docs/, or the CLI changes as a result of closing it.
The goal is to learn where a coding agent actually gets stuck when handed bare Gesso, before anyone writes an Agent Skill (SKILL.md) for it. A SKILL.md written from guesswork does not just fail to help — it permanently fixes the guesswork in place. It is worse than stale documentation, because an agent that loads a skill treats its contents as authoritative and stops reading the docs that would have corrected it.
Measured starting conditions (working tree at c9f988c, 731 tracked files):
- There is no agent-facing entry point for consumers. No
skills/ and no resources/boost/ directory exists; git ls-files | grep -i 'skill\|boost\|agent' returns exactly one file, the root AGENTS.md (153 lines). That file is contributor-facing — its first line is # Repository guide for coding agents and it documents composer ci, PSR-4 layout, and PHPStan levels. An agent installing Gesso into an application gets nothing from it.
docs/ is 54 markdown files and 10,926 lines. Of that, docs/superpowers/ is 12 files and 3,194 lines (29% of the corpus) of internal implementation plans and design specs (docs/superpowers/plans/2026-08-03-sdk-exercise-coverage.md alone is 820 lines). An agent grepping docs/ for an answer will hit these, and they read as authoritative product documentation.
README.md is 271 lines and the Features list is 14 bullets (README.md:29-42), each pointing at a different subsystem.
- The onboarding path is bimodal:
docs/quickstarts/laravel.md is 22 lines, docs/setup.md is 837 lines. There is nothing in between.
Current behavior
An agent configuring Gesso has to pick among four separate configuration surfaces with overlapping keys, and nothing tells it which one applies:
| Surface |
Size |
Source |
| PHPUnit extension parameters |
26 distinct parameter name="…" values documented in docs/*.md |
read at src/PHPUnit/OpenApiCoverageExtension.php:281-1200 |
| Laravel config file |
13 top-level keys |
src/Laravel/config.php:9-102 |
| Environment variables |
4 (OPENAPI_BASELINE_GENERATE, OPENAPI_COMMON_KEYS, OPENAPI_CONSOLE_OUTPUT, OPENAPI_VALIDATION_OUTPUT) |
grep over src/ |
| CLI long flags |
49 distinct |
src/Cli/, src/Coverage/CoverageMergeCommand.php, src/Laravel/Commands/ |
At least four keys exist on two surfaces at once — spec_base_path, strip_prefixes, acknowledged_unvalidatable_schemes, enforce_discriminator — and the repository's own config file documents that the user is responsible for keeping them in sync:
// src/Laravel/config.php:15-18
// Prefixes removed from registered Laravel route URIs before comparing
// them with OpenAPI paths. Keep this aligned with the PHPUnit extension's
// `strip_prefixes` parameter so static parity and runtime validation agree.
'strip_prefixes' => [],
This is not hypothetical. In studio-design/studio-api (a gesso ^2.0 consumer), the published config/gesso.php carries a hand-written comment instructing the developer to keep spec_base_path and strip_prefixes manually synchronized with phpunit.xml. A human hit this and wrote himself a note. An agent will hit the same fork with less context.
Two more places an agent can plausibly go wrong, both verifiable in the tree:
- Publishing the config requires
php artisan vendor:publish --tag=gesso (docs/quickstarts/laravel.md:5); the tag is GessoServiceProvider::CONFIG_KEY (src/Laravel/GessoServiceProvider.php:15), and a LEGACY_CONFIG_KEY = 'openapi-contract-testing' still exists one line below (:16).
- Five example applications exist (
examples/{core,laravel,pest,psr7,symfony}) but the quickstart links to the Laravel one by GitHub URL rather than by repository path, so an agent working locally may not find it.
Proposed change
Run three representative tasks against bare Gesso v2.4 — documentation only, no SKILL.md, no injected hints — with a coding agent, and record what happens.
Tasks:
- Green field: install Gesso into a new Laravel application and get one passing contract test.
- Diagnosis: given an existing failing contract test, identify the root cause and fix it.
- Coverage: find an operation the suite does not cover and add a test for it.
For each task, record:
- Every configuration file the agent wrote to, and whether that was the correct surface for the setting (
config/gesso.php vs. phpunit.xml extension parameter vs. env var vs. CLI flag).
- Every CLI flag and extension parameter the agent invented — flags that do not exist in the 49 real ones, parameters absent from the 26 real ones.
- Every case of the agent misreading output: coverage percentages,
gesso doctor diagnostics, validation failure text, exit codes.
- Which
docs/ page the agent opened, in what order, how many times, and whether it landed in docs/superpowers/ (an internal plan) and treated it as product documentation.
- Where the agent gave up, looped, or asked the human.
Report format: one comment per task on this issue, each containing the task prompt verbatim, the agent/model used, a chronological log of the failure points above, and total turns to completion (or the point of abandonment). Raw transcripts attached or linked.
Compatibility
No compatibility surface defined in docs/versioning.md is touched. This issue adds no public symbol, no CLI flag or exit code, no PHPUnit extension parameter, no env var, no Artisan command, and no versioned wire format. It produces issue comments only. Not breaking. No migration required.
Dependencies and sequencing
This observation runs now. It is a measurement of Gesso as released in v2.4.0, and it stays valid as a record of that state regardless of what v3 changes.
Authoring SKILL.md itself must not start until the v3 configuration-unification and CLI-flag-unification work is frozen. If v3 renames configuration keys or consolidates the four surfaces above into one, a skill written today documents key names that will not exist — and it will be believed anyway. The observation is the input; the skill is a later, separately-tracked deliverable that is blocked on that freeze.
Acceptance criteria
Context
This is an observation task, not an implementation task. It produces evidence (issue comments), not code. Nothing in
src/,docs/, or the CLI changes as a result of closing it.The goal is to learn where a coding agent actually gets stuck when handed bare Gesso, before anyone writes an Agent Skill (
SKILL.md) for it. ASKILL.mdwritten from guesswork does not just fail to help — it permanently fixes the guesswork in place. It is worse than stale documentation, because an agent that loads a skill treats its contents as authoritative and stops reading the docs that would have corrected it.Measured starting conditions (working tree at
c9f988c, 731 tracked files):skills/and noresources/boost/directory exists;git ls-files | grep -i 'skill\|boost\|agent'returns exactly one file, the rootAGENTS.md(153 lines). That file is contributor-facing — its first line is# Repository guide for coding agentsand it documentscomposer ci, PSR-4 layout, and PHPStan levels. An agent installing Gesso into an application gets nothing from it.docs/is 54 markdown files and 10,926 lines. Of that,docs/superpowers/is 12 files and 3,194 lines (29% of the corpus) of internal implementation plans and design specs (docs/superpowers/plans/2026-08-03-sdk-exercise-coverage.mdalone is 820 lines). An agent greppingdocs/for an answer will hit these, and they read as authoritative product documentation.README.mdis 271 lines and the Features list is 14 bullets (README.md:29-42), each pointing at a different subsystem.docs/quickstarts/laravel.mdis 22 lines,docs/setup.mdis 837 lines. There is nothing in between.Current behavior
An agent configuring Gesso has to pick among four separate configuration surfaces with overlapping keys, and nothing tells it which one applies:
parameter name="…"values documented indocs/*.mdsrc/PHPUnit/OpenApiCoverageExtension.php:281-1200src/Laravel/config.php:9-102OPENAPI_BASELINE_GENERATE,OPENAPI_COMMON_KEYS,OPENAPI_CONSOLE_OUTPUT,OPENAPI_VALIDATION_OUTPUT)src/src/Cli/,src/Coverage/CoverageMergeCommand.php,src/Laravel/Commands/At least four keys exist on two surfaces at once —
spec_base_path,strip_prefixes,acknowledged_unvalidatable_schemes,enforce_discriminator— and the repository's own config file documents that the user is responsible for keeping them in sync:This is not hypothetical. In
studio-design/studio-api(agesso ^2.0consumer), the publishedconfig/gesso.phpcarries a hand-written comment instructing the developer to keepspec_base_pathandstrip_prefixesmanually synchronized withphpunit.xml. A human hit this and wrote himself a note. An agent will hit the same fork with less context.Two more places an agent can plausibly go wrong, both verifiable in the tree:
php artisan vendor:publish --tag=gesso(docs/quickstarts/laravel.md:5); the tag isGessoServiceProvider::CONFIG_KEY(src/Laravel/GessoServiceProvider.php:15), and aLEGACY_CONFIG_KEY = 'openapi-contract-testing'still exists one line below (:16).examples/{core,laravel,pest,psr7,symfony}) but the quickstart links to the Laravel one by GitHub URL rather than by repository path, so an agent working locally may not find it.Proposed change
Run three representative tasks against bare Gesso v2.4 — documentation only, no
SKILL.md, no injected hints — with a coding agent, and record what happens.Tasks:
For each task, record:
config/gesso.phpvs.phpunit.xmlextension parameter vs. env var vs. CLI flag).gesso doctordiagnostics, validation failure text, exit codes.docs/page the agent opened, in what order, how many times, and whether it landed indocs/superpowers/(an internal plan) and treated it as product documentation.Report format: one comment per task on this issue, each containing the task prompt verbatim, the agent/model used, a chronological log of the failure points above, and total turns to completion (or the point of abandonment). Raw transcripts attached or linked.
Compatibility
No compatibility surface defined in
docs/versioning.mdis touched. This issue adds no public symbol, no CLI flag or exit code, no PHPUnit extension parameter, no env var, no Artisan command, and no versioned wire format. It produces issue comments only. Not breaking. No migration required.Dependencies and sequencing
This observation runs now. It is a measurement of Gesso as released in v2.4.0, and it stays valid as a record of that state regardless of what v3 changes.
Authoring
SKILL.mditself must not start until the v3 configuration-unification and CLI-flag-unification work is frozen. If v3 renames configuration keys or consolidates the four surfaces above into one, a skill written today documents key names that will not exist — and it will be believed anyway. The observation is the input; the skill is a later, separately-tracked deliverable that is blocked on that freeze.Acceptance criteria
docs/pages read with visit counts.docs/superpowers/and whether it acted on it as if it were product documentation.