Skip to content

v0.5.0 I3 slice 6b: documentation and completion record - #225

Merged
michaelegner merged 2 commits into
mainfrom
i3-slice6b-docs-and-completion-record
Sep 22, 2026
Merged

michaelegner merged 2 commits into
mainfrom
i3-slice6b-docs-and-completion-record

Conversation

@michaelegner

Copy link
Copy Markdown
Owner

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's
completion 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 missing
    workload_kind field to the WorkloadRef field list (currently only lists id, type, namespace, name); add the "namespace is identity context, not a locality qualification" disclaimer (already
    present in the code's own docstring, contracts.py:248-250, but absent from this doc); add a
    precedence-is-a-tiebreak-not-conflict-resolution sentence to the conflict paragraph.
  • docs/opentelemetry.md (after ## Bounded runtime identity observations (I3), ~line 70): new
    subsection documenting §9.7's observation-context/temporal-compatibility rule — the last_seen/
    capturedAt inclusive-window checks and the DEPLOYMENT_ENVIRONMENT_MISMATCH/
    DEPLOYMENT_TEMPORAL_MISMATCH outcomes — currently entirely undocumented despite this being the
    rule's natural home; add a one-line note that k8s.namespace.name/k8s.cluster.uid consistency
    attributes are correlation inputs only, never a locality claim.
  • docs/ingestion.md (new subsection alongside "Kubernetes adapter", ~line 50): document the Path
    B 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.md too).
  • 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 the get_service_dependencies row/description (~line 44) with the
    DeploymentClaim/DeploymentResolution/WorkloadRef shapes actually returned, the outcome
    vocabulary (CONFLICT/AMBIGUOUS/UNRESOLVED), and an explicit sentence that I3 added zero new
    MCP 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 for
    app/api/architecture_intelligence.py with one sentence naming DEPLOYED_AS/WorkloadRef/
    reconciliation and pointing to graph-model.md/mcp.md — currently this doc has zero I3 mentions
    at all.
  • docs/canonical-model.md: no change — already adequately covers what's in its scope (entity/id
    shapes), correctly defers the rest.
  • ROADMAP.md: no change — confirmed the delivered slice 5a/5b split and direct-envelope
    retirement 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, following
docs/specifications/0.5.0/i2-completion-record.md's established structure exactly (confirmed this
is a genuine two-increment repo convention, not a one-off, via i1-completion-record.md's matching
shape):

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.md and ROADMAP.md were re-confirmed to need
no 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 merge
commit dbf066b593b8b19f18596a0be27dc2724885cdbc as the pinned candidate revision, verified against
the exact SHA via the GitHub API (not gh pr checks), per this repo's own established convention for
avoiding 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.py and service_workload_mapping.py (not explicitly named in
the 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):

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

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
Copilot AI lite review requested due to automatic review settings September 22, 2026 21:11

Copy link
Copy Markdown
Owner Author

Reviewed head b926b3a. CI and CodeQL are green. I see one completion-record blocker plus two small factual cleanups:

  • The exit statement says that at pinned candidate dbf066b “all six” slices are present, including the 6b documentation/completion-record split. But dbf066b is PR v0.5.0 I3 slice 6a: deterministic qualification (§21 matrix closure, §22 fixture) #224 and explicitly predates this 6b PR. Keep it as the qualified implementation candidate, but distinguish that from I3 becoming COMPLETE only with this 6b record/docs; don’t claim 6b is present at the pinned candidate revision.
  • The “eight sequential PRs … plus one spec amendment” count is stale now that slice 6 is also split: the table has nine delivery PRs including this one, plus the amendment.
  • “Both fixture families use … import_kubernetes_source throughout” overstates the hand-built unit fixtures, which are in-memory/pure-function fixtures rather than persisted through the real importer.

I found no other blocking issues in the documentation changes.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 Low severity

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.md capturing 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 WorkloadRef shape 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.

Comment thread docs/graph-model.md Outdated
Comment thread docs/mcp.md Outdated
Comment on lines +31 to +33
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") | — |
Comment on lines +48 to +55
**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
@michaelegner

Copy link
Copy Markdown
Owner Author

Review of head b926b3a

Previous blockers: none (first review round).

Fixes for head f574d1e:

  1. Copilot + user's own review: 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's own review: 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's own review (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 v0.5.0 I3 slice 6a: deterministic qualification (§21 matrix closure, §22 fixture) #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's own review: "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.

Required evidence: uv run pytest tests/unit -> 1815 passed (unchanged, doc-only PR); uv run pytest tests/integration -> 405 passed (unchanged); ruff check/format --check clean.

Exit condition: approve once these five fixes are confirmed to resolve the recorded blockers, unless the fixes themselves introduce a material regression.

Copy link
Copy Markdown
Owner Author

Re-reviewed head f574d1e. The previous completion-record blocker and the Copilot findings are resolved, and CI/CodeQL are green. I found one remaining factual cleanup in the new fixture-provenance wording: it now says no integration test writes Kubernetes or Service facts via raw Cypher, but the deployment integration suites deliberately create OBSERVED_ONLY Service stubs with MERGE (s:Service ...). Please narrow that claim to declared Services/Kubernetes facts imported through the real paths. Minor formatting nit: the CurrentKubernetesWorkload code span is split across a source newline and renders as CurrentKubernetes Workload. No other blocking issues found.

@michaelegner
michaelegner merged commit 571220b into main Sep 22, 2026
13 checks passed
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.

2 participants