Skip to content

feat(sdlc): contrast the phase record against the Core catalogue - #118

Merged
beyondnetPeru merged 2 commits into
developfrom
feat/cp-02-core-catalog-contrast
Aug 3, 2026
Merged

feat(sdlc): contrast the phase record against the Core catalogue#118
beyondnetPeru merged 2 commits into
developfrom
feat/cp-02-core-catalog-contrast

Conversation

@beyondnetPeru

Copy link
Copy Markdown
Contributor

Advances CP-02 (P0).

The finding

The Tracker had two artifact vocabularies that never met:

  • /phase-artifact-profiles — derived from the Core, read-only. Nothing operational consulted it: searching for IPhaseArtifactProfileSource returned its own definition, DI, the sync service, and that one endpoint.
  • Sdlc/PhaseArtifact — the record people actually fill. Items starts empty and SetItem accepts any type string.

A phase could therefore be completed end to end with artifacts the Core does not declare, and no surface would say so. That is CP-02's own Risk line verbatim: the Tracker looks like it governs the SDLC while governing a copy of the standard.

The change

GetPhaseArtifact resolves the phase's catalogue through the same seam the read-only endpoint reads — a second copy here would have rebuilt the defect — and returns a coreCatalog block.

It reports, it does not enforce. T-056: what a gate demands is tenant configuration, not engine code. Nothing rejects an item, changes a status, or blocks a phase.

Both directions are stated (Artifacts[].Present and UnknownItemKinds), because reporting only the declared side would let a record full of off-standard items look complete. And the two absences are kept apart: no catalogue for the phase omits the block rather than returning an empty one — "the standard was not available" is not "the standard asks for nothing here".

Scope, stated rather than implied

  • construction / QA / release only. Discovery and Design keep bespoke verticals and are not covered; the generic path is SdlcPhases.GenericGatePhases.
  • Criterion 2 is unstarted. There is no per-tenant required/optional/not-applicable override on this catalogue, and the handler takes no tenant. That is the other half of CP-02's title, and the row stays PENDING because of it.
  • ScorecardEvaluator and the GateSubmission path still do not read this source, so criterion 3 is partial.

Verification

5 new tests, covering both directions, the report-don't-enforce property, provenance in the payload, the case-insensitive match (a case difference must not invent a false gap), and no-catalogue ≠ empty-catalogue.

The full suite shows 10 failures — all of which also fail on a clean worktree at HEAD (baseline 22, environment-dependent persistence/integration tests). Nothing fails only because of this change; measured in a worktree, not assumed.

🤖 Generated with Claude Code

Advances CP-02.

The Tracker had TWO artifact vocabularies that never met. `/phase-artifact-profiles`
is derived from the Core, and nothing operational consulted it: grep for
`IPhaseArtifactProfileSource` returned its own definition, DI, the sync service and
that one endpoint. Meanwhile the record people actually fill starts with `Items`
empty and `SetItem` accepts any `type` string at all.

So a phase could be completed end to end with artifacts the Core does not declare,
and no surface would say so. That is CP-02's Risk verbatim: the Tracker looks like
it governs the SDLC while governing a copy of the standard.

`GetPhaseArtifact` now resolves the phase's catalogue through the SAME seam the
read-only endpoint reads -- a second copy here would have rebuilt the defect -- and
returns a `coreCatalog` block.

It REPORTS, it does not enforce. T-056: what a gate demands is tenant configuration,
not engine code. Nothing rejects an item, changes a status or blocks a phase. Both
directions are stated, because reporting only the declared side would let a record
full of off-standard items look complete.

Two absences are kept apart: no catalogue for the phase omits the block rather than
returning an empty one. "The standard was not available" is not "the standard asks
for nothing here", and the second is the kind of confident emptiness a governance
surface must never produce.

Scope, stated rather than implied:
  - construction/QA/release only. Discovery and Design keep bespoke verticals and
    are NOT covered -- the generic path is `SdlcPhases.GenericGatePhases`.
  - criterion 2 (per-tenant required/optional/not-applicable) is UNSTARTED. There
    is no tenant override on this catalogue and the handler takes no tenant.
  - `ScorecardEvaluator` and the `GateSubmission` path still do not read the source.

Verified: 5 new tests pass; full suite shows 10 failures, all of which also fail on
a clean worktree at HEAD (baseline 22, environment-dependent persistence/integration
tests). Nothing fails only because of this change -- measured, not assumed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@beyondnetPeru
beyondnetPeru changed the base branch from main to develop August 3, 2026 13:51
Not part of CP-02; found because this PR first targeted main and the
root-cleanliness guard rejected an unauthorized root folder.

`.codex/config.toml` carries an absolute path to one developer's machine
(`/Users/.../evolith_tracker/src`), so it was never shareable. It rode in on a
`git add -A` in a5f719c and has been on develop and every branch off it since;
main has never seen it, which is why nothing complained until now.

Removed from the index and added to .gitignore so it cannot return. Left on
disk -- it is a working local config, just not the repository's business.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@beyondnetPeru
beyondnetPeru merged commit ccc490a into develop Aug 3, 2026
6 checks passed
@beyondnetPeru
beyondnetPeru deleted the feat/cp-02-core-catalog-contrast branch August 3, 2026 14:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant