v0.5.0 I3 slice 6b: documentation and completion record - #225
Conversation
Closes I3's §24 documentation requirements (graph-model.md, opentelemetry.md, ingestion.md, evidence.md, mcp.md, architecture.md - only the docs with a real, confirmed gap; canonical-model.md and ROADMAP.md needed no change, already accurate) and adds the I3 completion record required by §25's Definition of Done. docs/graph-model.md: WorkloadRef's field list was missing workload_kind; the "namespace is identity context, not locality" disclaimer and the precedence-is-a- tiebreak-not-conflict-resolution nuance were both absent. docs/opentelemetry.md: the §9.7 observation-context/temporal-compatibility rule (last_seen/capturedAt window checks, the two new mismatch outcomes) was entirely undocumented despite this being its natural home. docs/ingestion.md: the Path B mapping-artifact format had no documentation home anywhere in the repo (confirmed absent from docs/configuration.md too). docs/evidence.md: Path C evidence reachability is itself gated by observation-context compatibility - now stated explicitly, tying into the doc's existing reachability discussion. docs/mcp.md: get_service_dependencies's DeploymentClaim/DeploymentResolution/ WorkloadRef shapes and outcome vocabulary were never documented, and the "I3 adds zero new MCP tools" design decision was never stated explicitly (the fact itself was documented, the reasoning wasn't). docs/architecture.md: had zero DEPLOYED_AS/WorkloadRef vocabulary anywhere; added a one-sentence pointer from the existing API-surface table row. docs/specifications/0.5.0/i3-completion-record.md: new, following i2-completion- record.md's established structure - run identity (all 9 PRs, spec through slice 6a), fixture identities, immutable qualification identity (pinned to slice 6a's own already-merged, CI-verified SHA dbf066b, per this record's own stated reasoning for why - mirrors I2's own precedent for the same problem), the full regression suite, a §21/§25 Definition-of-Done evidence table, disclosed limitations (including the Path B rule-id asymmetry), the I4/I5 handoff, and the corrected I3 exit statement. Test evidence: uv run pytest tests/unit -> 1815 passed (unchanged, doc-only PR); uv run pytest tests/integration -> 405 passed (unchanged); ruff check/format clean. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BEyW1QKTxJy1K3eyPB93zJ
|
Reviewed head
I found no other blocking issues in the documentation changes. |
There was a problem hiding this comment.
Copilot review overview
🟡 Changes recommended
The new completion record contains a few factual/formatting inaccuracies (PR count/splits, missing PR identifier, and a broken constant name due to line-wrapped inline code) that should be corrected before merging.
Get a fresh assessment by requesting another Copilot review.
Review effort: Lite
Findings: 5
Open (5)
What changed in this PR
This PR completes v0.5.0 I3 slice 6b by updating repository documentation to reflect the finalized DEPLOYED_AS / runtime-identity reconciliation behavior and by adding the I3 increment completion record under docs/specifications/0.5.0/.
Changes:
- Add
docs/specifications/0.5.0/i3-completion-record.mdcapturing I3’s pinned candidate revision, qualification evidence, fixture digests, and DoD evidence mapping. - Document previously-undocumented I3 semantics across core reference docs (Path B mapping artifact format, Path C observation-context/temporal compatibility, MCP deployment-claim projection, and
WorkloadRefshape notes). - Add cross-doc linkages from the architecture overview to the detailed I3 contract docs (
graph-model.md,mcp.md).
| File | Description |
|---|---|
| docs/specifications/0.5.0/i3-completion-record.md | New I3 completion record: run identity, pinned artifacts, regression evidence, DoD mapping, and limitations/handoff. |
| docs/opentelemetry.md | Adds the I3 observation-context/temporal compatibility rule documentation for Path C. |
| docs/mcp.md | Documents how I3 deployment claims/resolutions appear via existing MCP tools (no new tools added). |
| docs/ingestion.md | Documents the Path B Service↔Workload mapping artifact YAML shape and validation rules. |
| docs/graph-model.md | Updates DEPLOYED_AS/WorkloadRef documentation (adds workload_kind, clarifies namespace semantics, and precedence vs conflict). |
| docs/evidence.md | Notes that Path C evidence reachability is gated by observation-context compatibility, including for convenience evidence lookups. |
| docs/architecture.md | Extends API surface documentation to point readers to the I3 deployment reconciliation docs. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| I3 was delivered as eight sequential PRs (spec + six implementation slices, one of which split into | ||
| 5a/5b) plus one spec amendment, each independently reviewed and merged, per §23's six suggested | ||
| implementation slices: |
| | Slice 5a | Public adapter consolidation, REST parity | `08d352616ff7a38b937f5deddd9db46f27073612` | #221 | | ||
| | Slice 5b | Deployment public exposure | `5b7561bd238f2849bc459026b2b577a4fea91eab` | #222 | | ||
| | Slice 6a | Deterministic qualification (§21 matrix, §22 fixture) | `dbf066b593b8b19f18596a0be27dc2724885cdbc` | #224 | | ||
| | Slice 6b | Documentation and this completion record | (this PR; merge commit will differ — see "Immutable qualification identity") | — | |
| **Reconciliation rule identity** (frozen since slice 1, unchanged since): `DEPLOYMENT_RECONCILIATION_ | ||
| RULE_ID = "service-workload-reconciliation"`, `reconciliation_rule_version = 1` | ||
| (`app/architecture_intelligence/contracts.py`, `app/architecture_intelligence/ | ||
| deployment_projection.py`). **Runtime identity normalization rule** (frozen since slice 2): | ||
| `normalization_rule_id = "otel-runtime-identity-observation"`, `normalization_rule_version = 1` | ||
| (`app/provenance/model.py`). **Canonicalization version** (bumped 1→2 in slice 5b to bind the mapping | ||
| digest into snapshot identity): `_CANONICALIZATION_VERSION = 2` | ||
| (`app/architecture_intelligence/repository.py`). |
…er fixes Review fixes for head b926b3a: 1. Copilot + user: docs/graph-model.md and docs/mcp.md both listed WorkloadRef's fields as (id, type, workload_kind, name, namespace), but the real contract (app/architecture_intelligence/contracts.py) declares name before workload_kind. Fixed both to (id, type, name, workload_kind, namespace). 2. Copilot: DEPLOYMENT_RECONCILIATION_RULE_ID's inline code span was split across a markdown source line break, rendering the constant name with a literal space in it. Fixed to keep the whole span on one line. 3. Copilot + user: the completion record's "Run identity" intro sentence said "eight sequential PRs ... one of which split into 5a/5b" - stale now that slice 6 also split into 6a/6b. Fixed to "nine ... two of which split". The slice 6b table row's PR column also still showed a placeholder ("-") instead of this PR's real number - fixed to #225. 4. User (blocking): the exit statement said "at the pinned candidate revision (dbf066b), all six slices are present" including 6b's own split - but dbf066b is PR #224's merge and predates this PR entirely. Rewrote to clearly separate the pinned *implementation* candidate (dbf066b, through slice 6a - all code/test changes) from I3's own completion, which additionally requires this PR's documentation and the record itself, with zero further code changes on top of that candidate. 5. User: "both fixture families use ... import_kubernetes_source ... throughout" overstated the hand-built unit-level fixtures, which are pure in-memory PathResolutionResult/CurrentKubernetesWorkload constructions that never touch Neo4j. Fixed to distinguish them from the integration-level fixtures that do go through the real importer. Test evidence: uv run pytest tests/unit -> 1815 passed (unchanged, doc-only PR); uv run pytest tests/integration -> 405 passed (unchanged); ruff check/format clean. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BEyW1QKTxJy1K3eyPB93zJ
|
Review of head Previous blockers: none (first review round). Fixes for head
Required evidence: Exit condition: approve once these five fixes are confirmed to resolve the recorded blockers, unless the fixes themselves introduce a material regression. |
|
Re-reviewed head |

v0.5.0 I3 slice 6b — documentation and completion record.
Per
docs/specifications/0.5.0/i3-runtime-identity-reconciliation.md§23, this is I3's final PR:the §24 documentation updates and the §25 completion record. PR 6a (the qualification half - §21
matrix closure, §22 frozen fixture) is already merged as PR #224 (
dbf066b), which this PR'scompletion record cites as its pinned candidate revision.
Retained Plan
(Same governing plan session as PR #224 — see that PR's own "Retained Plan" section for the full
slice-6 plan and PR-6a/6b split rationale. Reproduced here is exactly the "PR 6b" portion of that
plan, from
/home/michael/.claude/plans/plan-for-slice-6-precious-valley.md.)PR 6b — Documentation and completion record
§24 documentation updates (only the docs with a real, confirmed gap)
docs/graph-model.md(## DEPLOYED_AS (v0.5.0 I3)section, ~line 41): add the missingworkload_kindfield to theWorkloadReffield list (currently only listsid, type, namespace, name); add the "namespaceis identity context, not a locality qualification" disclaimer (alreadypresent in the code's own docstring,
contracts.py:248-250, but absent from this doc); add aprecedence-is-a-tiebreak-not-conflict-resolution sentence to the conflict paragraph.
docs/opentelemetry.md(after## Bounded runtime identity observations (I3), ~line 70): newsubsection documenting §9.7's observation-context/temporal-compatibility rule — the
last_seen/capturedAtinclusive-window checks and theDEPLOYMENT_ENVIRONMENT_MISMATCH/DEPLOYMENT_TEMPORAL_MISMATCHoutcomes — currently entirely undocumented despite this being therule's natural home; add a one-line note that
k8s.namespace.name/k8s.cluster.uidconsistencyattributes are correlation inputs only, never a locality claim.
docs/ingestion.md(new subsection alongside "Kubernetes adapter", ~line 50): document the PathB mapping-artifact format (
app.sources.service_workload_mapping's YAML shape —apiVersion,kind,metadata.id/revision,mappings[].mappingId/serviceId/kubernetesSourceId/clusterUid/ workload{apiGroup,kind,namespace,name}), supported workload kinds, and the unknown-field/no-templating/no-remote-ref rejection rules from spec §8.1 — this has no documentation home anywhere
in the repo today (confirmed absent from
docs/configuration.mdtoo).docs/evidence.md: one note that Path C evidence reachability is itself gated by observation-context/temporal compatibility (§9.7), tying into the doc's existing reachability discussion.
docs/mcp.md: expand theget_service_dependenciesrow/description (~line 44) with theDeploymentClaim/DeploymentResolution/WorkloadRefshapes actually returned, the outcomevocabulary (
CONFLICT/AMBIGUOUS/UNRESOLVED), and an explicit sentence that I3 added zero newMCP tools (the "exactly 3 tools" fact is already documented generally; the "why still 3 for this new
capability" reasoning is not).
docs/architecture.md: extend the existing API-surface table row forapp/api/architecture_intelligence.pywith one sentence namingDEPLOYED_AS/WorkloadRef/reconciliation and pointing to
graph-model.md/mcp.md— currently this doc has zero I3 mentionsat all.
docs/canonical-model.md: no change — already adequately covers what's in its scope (entity/idshapes), correctly defers the rest.
ROADMAP.md: no change — confirmed the delivered slice 5a/5b split and direct-enveloperetirement match what the v0.5.0 roadmap entry already states; §24's own trigger ("only if
implementation changes the already-planned I3 scope") doesn't apply.
I3 completion record
New file
docs/specifications/0.5.0/i3-completion-record.md, followingdocs/specifications/0.5.0/i2-completion-record.md's established structure exactly (confirmed thisis a genuine two-increment repo convention, not a one-off, via
i1-completion-record.md's matchingshape):
qualification. I5 and I6 remain required") reproduced verbatim.
→ docs(v0.5): consolidate public Architecture Knowledge adapters #218 (spec amendment, Draft 0.3→0.4) → v0.5.0 I3 slice 4: observed path (Path C) #220 (slice 4) → v0.5.0 I3 slice 5a: public adapter consolidation and REST parity #221 (slice 5a) → v0.5.0 I3 slice 5b: deployment public exposure #222 (slice 5b) → v0.5.0 I3 slice 6a: deterministic qualification (§21 matrix closure, §22 fixture) #224
(slice 6a) → this PR (slice 6b), with each row's real merge SHA.
tests/fixtures/deployment/i3-cross-source/fixture, with its content digests.dbf066b,cited only after it merged and was independently CI-verified, avoiding the self-reference problem
I2's own record disclosed); governing spec blob SHA;
contracts.py/deployment_reconciliation.py/deployment_projection.py/deployment_repository.py/service_workload_mapping.pyblob SHAs;rule/schema version constants; fixture digests; CI run links (verified via the GitHub API against
the exact SHA).
ruff check/format --check/pytest tests/unit/pytest tests/integrationcounts at the pinned candidate revision, run fresh.§25 bullet, citing the exact test file/function proving it.
disclosures, plus the Path B rule-id-asymmetry disclosure carried over from PR v0.5.0 I3 slice 6a: deterministic qualification (§21 matrix closure, §22 fixture) #224.
slices and the final regression counts — explicitly not release qualification, I5/I6 still required.
Reconciliation
Completed As Planned
Both the §24 documentation updates and the I3 completion record were delivered exactly as scoped in
the retained plan, with no deviation in scope or approach. All six flagged docs were updated with the
specific content the plan named;
docs/canonical-model.mdandROADMAP.mdwere re-confirmed to needno change immediately before finalizing (no drift since the original research pass). The completion
record follows
i2-completion-record.md's structure section-for-section, citing PR #224's mergecommit
dbf066b593b8b19f18596a0be27dc2724885cdbcas the pinned candidate revision, verified againstthe exact SHA via the GitHub API (not
gh pr checks), per this repo's own established convention foravoiding ambient-HEAD re-derivation.
Deviations & Justification
None. This was a self-contained documentation/record task with no code touched, so no implementation
surprises arose. The completion record's "immutable qualification identity" table additionally pins
blob SHAs for
deployment_repository.pyandservice_workload_mapping.py(not explicitly named inthe plan's own text) since the record's own format — mirroring I2's — calls for every load-bearing
module cited elsewhere in the record to have a pinned blob SHA, not just the three named in the plan.
Specification Questions Discovered
None. No genuinely unstated semantic decision arose — this PR restates and documents already-frozen
behavior, it doesn't interpret anything new.
Deferred Work
None remaining for I3 itself. I4, I5, and I6 are separate, not-yet-started increments/gates per the
parent specification and ROADMAP.md.
Test/Qualification Evidence
At this PR's head (documentation-only + one new file, no production or test code touched):
uv run ruff format .— 340 files left unchanged (clean)uv run ruff check .— all checks passeduv run pytest tests/unit— 1815 passed (unchanged from PR v0.5.0 I3 slice 6a: deterministic qualification (§21 matrix closure, §22 fixture) #224's own count)uv run pytest tests/integration— 405 passed (unchanged from PR v0.5.0 I3 slice 6a: deterministic qualification (§21 matrix closure, §22 fixture) #224's own count)Remaining Limitations
Reproduced from the completion record's own "Limitations and unsupported constructs" section: no live
Kubernetes client, no fuzzy/name-similarity matching, no fourth MCP tool, no locality semantics, no
container/sidecar canonical entities, multi-Service-per-Workload not modeled, Path B's disclosed
rule-id asymmetry, and the §22 fixture's contradictory scenarios covering Path A-vs-B/Path A-vs-C
specifically (the full pairwise matrix is covered separately by hand-built §21.4 unit tests). I5 still
owns two-system release qualification; this record's own qualification bar is I3's narrower,
increment-scoped one.
With this PR, I3 is complete per its own §25 Definition of Done — not release qualification; I5 and
I6 remain required per the parent specification.
🤖 Generated with Claude Code
https://claude.ai/code/session_01BEyW1QKTxJy1K3eyPB93zJ