feat(sdlc): contrast the phase record against the Core catalogue - #118
Merged
Conversation
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>
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 forIPhaseArtifactProfileSourcereturned its own definition, DI, the sync service, and that one endpoint.Sdlc/PhaseArtifact— the record people actually fill.Itemsstarts empty andSetItemaccepts anytypestring.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
GetPhaseArtifactresolves the phase's catalogue through the same seam the read-only endpoint reads — a second copy here would have rebuilt the defect — and returns acoreCatalogblock.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[].PresentandUnknownItemKinds), 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
SdlcPhases.GenericGatePhases.PENDINGbecause of it.ScorecardEvaluatorand theGateSubmissionpath 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