Finish KG-WP-0003: stream completeness and live qonto observation

Classify evidence as load-bearing or attributive, draft the emission-cadence
declaration for Taxonomy, treat silence as a stream finding, keep completeness
separate from record richness, forbid immune memory as a state plane, and make
containment proposals reconstructable to their origin. Observe real
qonto-assistant audit events; deny-class completeness stays unknown until the
source publishes a heartbeat.

Assistant: grok
Assistant-Session: 01a05ef1-9e5a-70f2-b0ff-0b05d6b38ae9
This commit is contained in:
tegwick 2026-09-02 00:11:57 +02:00
parent c85646dc3c
commit 9daea96c43
35 changed files with 2023 additions and 138 deletions

View file

@ -4,11 +4,11 @@ type: workplan
title: "Evidence completeness and live observation"
domain: infotech
repo: kings-guard
status: ready
status: finished
owner: kings-guard
topic_slug: netkingdom
created: "2026-08-29"
updated: "2026-08-29"
updated: "2026-09-01"
source_review: history/2026-08-29-layer-model-v0.7-scope-intent-review.md
standard: net-kingdom/canon/standards/security-layer-model_v0.7.md
state_hub_workstream_id: "a6c1c760-1386-58fa-9392-d9c3c4dadc41"
@ -51,7 +51,7 @@ T08 agent-principal conformance checks (after T05)
```task
id: KG-WP-0003-T01
status: todo
status: done
priority: high
state_hub_task_id: "dd660dbf-9148-5f35-aa4a-74deb10e6f8a"
```
@ -70,11 +70,17 @@ Done when:
reasoning recorded;
- tests cover both classes.
**Done 2026-09-01:** `DeclaredEvidenceSource` on the genome and `evidence_class`
on `ImmuneObservation`. The adapter copies the source declaration and refuses
to infer class from event contents. qonto `audit.deny` / `audit.heartbeat` are
load-bearing; `audit.allow` is attributive, with reasoning in the fixture.
`tests/test_evidence_class.py` covers both classes.
## Task: Draft the emission-cadence declaration and hand it to Taxonomy
```task
id: KG-WP-0003-T02
status: todo
status: done
priority: high
state_hub_task_id: "5b66aec0-a753-5039-bcbe-bc69cf1ad13e"
```
@ -104,11 +110,19 @@ Done when:
- it is sent to gate-house and to the Taxonomy repositories for ownership, and
the handover is recorded.
**Done 2026-09-01:** Draft at `specs/EmissionCadenceDeclaration.md`, worked
example against `qonto-assistant`, both forms specified, genome-adjacent
rationale stated, `GH-WP-0002-T04` / `approval-engine/cadence.yaml` cited as
the heartbeat reference. Runtime consumer is
`src/kings_guard/fixtures/qonto_assistant_cadence.json` (draft-shaped, not a
fork). Handover messages sent to `gate-house`, `net-kingdom`, and
`info-tech-canon`.
## Task: Evaluate the stream, not only the observation
```task
id: KG-WP-0003-T03
status: todo
status: done
priority: high
state_hub_task_id: "2cd878c0-8b70-5f2b-9f82-c4d74df5833c"
```
@ -127,11 +141,17 @@ Done when:
not its contents;
- no Tooling contact is introduced; the source publishes its own stream.
**Done 2026-09-01:** `PostureEvaluator.evaluate_stream` / `evaluate_with_stream`
compare a declared cadence to arrived events. Unmet rate, missing heartbeat,
and reconciliation divergence emit `stream:*` findings, distinct from content
findings, and a `stream_completeness` signal. No Tooling client. Tests in
`tests/test_stream.py`.
## Task: Carry stream completeness in the posture output
```task
id: KG-WP-0003-T04
status: todo
status: done
priority: high
state_hub_task_id: "73367acf-d888-5acc-ae85-7231a9cbe9fe"
```
@ -149,11 +169,17 @@ Done when:
- a posture derived from an incomplete stream can never read as more trustworthy
than one derived from a complete one.
**Done 2026-09-01:** `PostureAssessment` carries `stream_completeness` and
`completeness_reason` separately from `confidence_score`. Rationale states
completeness in words. `assessment_trust_key` orders completeness above
richness, so a 95-from-degraded stream cannot outrank a 70-from-complete one.
`tests/test_completeness.py`.
## Task: State and test that immune memory is not a state plane
```task
id: KG-WP-0003-T05
status: todo
status: done
priority: medium
state_hub_task_id: "d7ed9faf-58ee-59a1-ad1e-b2fcf817317f"
```
@ -171,11 +197,16 @@ Done when:
- a test asserts the constraint rather than leaving it to prose;
- the constraint is reflected in the `Direction of Evolution` stage-5 entry.
**Done 2026-09-01:** `ImmuneMemoryEntry.runtime_input_for_other_layers` is
`forbidden`. `specs/ImmuneContracts.md` states the rule. `tests/test_immune_memory.py`
asserts the evaluator does not take memory as input and that INTENT stage 5
keeps the constraint.
## Task: Make containment proposals reconstructable to their origin
```task
id: KG-WP-0003-T06
status: todo
status: done
priority: medium
state_hub_task_id: "98326ed2-ee5f-58ce-9f99-429e621117a6"
```
@ -192,11 +223,18 @@ Done when:
- `docs/AdjacentSystemBoundary.md` states the expectation on the receiving side;
- the authority boundary remains explicit and no value widens authority.
**Done 2026-09-01:** `EffectorRequest` carries originating observation and
signal ids, stream completeness, and a restrictive direction. Authority
boundaries in use remain `advisory_only` and `metadata_only`. Applied
`gate-house/docs/contracts/posture-findings-return.md` through this task.
`docs/AdjacentSystemBoundary.md` rule 7 states the receiving-side expectation.
`tests/test_effector_origin.py`.
## Task: Observe qonto-assistant in operation
```task
id: KG-WP-0003-T07
status: todo
status: done
priority: high
state_hub_task_id: "ae516be8-5199-5f81-b47f-7843b5993f97"
```
@ -220,11 +258,20 @@ Done when:
- the fixture is retained as a regression case rather than deleted;
- gate-house is told that step four is staffed, with what was found.
**Done 2026-09-01:** Real events from `qonto-assistant.audit.AuditLogger` via
`CapabilityService` (allow + deny) reach the evaluator. Mapping confirmed:
`request_id`, `capability``resource_scope`, `decision`, `protocol` hold.
Corrections reported to `qonto-assistant`: `AuditEvent` still omits
`identity_binding` and `egress_destination`; no heartbeat is published yet, so
deny-class completeness is unknown. Fixture retained. Output stays advisory.
gate-house notified that §12 step four is staffed for this lane.
`tests/test_live_qonto_observation.py`; `python3 -m kings_guard.main --pilot qonto-assistant --live`.
## Task: Check the agent-principal rules that can be checked
```task
id: KG-WP-0003-T08
status: todo
status: done
priority: medium
state_hub_task_id: "e7003fb3-2e7c-5440-b489-b619b3f0c65d"
```
@ -243,6 +290,11 @@ Done when:
`layer.yaml`, honestly, rather than implied to be checked;
- `make check-layer` stays green.
**Done 2026-09-01:** `scripts/check_layer_conformance.py` scans for standing
credential files and secret literals (rule 1). Rule 3 is `tests/test_immune_memory.py`.
`layer.yaml` `agent_principal_rule_checks` records rule 2 as assertion and
rule 4 as mixed. `make check-layer` green; `pyproject.toml` `dependencies = []`.
## Success criteria
1. Every task above is `done`.
@ -252,3 +304,21 @@ Done when:
5. The emission-cadence draft has been handed to Taxonomy and the handover
recorded.
6. gate-house has been told that §12's fourth step is staffed.
## Residuals
No leftover kings-guard work is parked only in prose. Source-side follow-ups
were sent as coordination messages, not new workplans here:
- `qonto-assistant` — emit `identity_binding` and `egress_destination` on
`AuditEvent` if they become known; publish the cadence declaration and a
deny-class heartbeat. Until then deny-class completeness stays unknown.
- Taxonomy (`net-kingdom`, `info-tech-canon`) — take ownership of
`specs/EmissionCadenceDeclaration.md`. kings-guard will consume what they
publish and will not fork it.
- `secrets-engine` secret-use evidence contract — assented as a proposed
Lifecycle surface; observation stays at zero until it ships. Not a WP-0003
residual.
Pre-existing open intake `KG-IN-0002` (architecture vocabulary sweep) is
unrelated and remains open.