Record net-kingdom's Emission Cadence declaration and fix the stale digest (INFO-WP-0029)
net-kingdom published the first source-owned declaration (116643f). It passes emission-review. Record it as feedback, and file its session-scoped-silence incompatibility as demand/EmissionActivityScope.md. T02 is done, and T04 is in progress until activity-core answers. The adoption brief sent owners the 0.1.0 draft digest, because the candidate promotion changed the standard's text after the digest was taken. The export manifest also hard-coded status "draft". The manifest now derives status and version from the standard, a test pins that, and the brief names the candidate digest b08b4d95fc4b0bd3. The wire schema is unchanged. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Assistant: claude-code Assistant-Model: opus Assistant-Process: 121421@bnt-lap001 Assistant-Session: 36f8657c-ebfa-4a2e-9ba0-bff06738f233
This commit is contained in:
parent
146e461355
commit
038677ab53
7 changed files with 213 additions and 7 deletions
47
demand/EmissionActivityScope.md
Normal file
47
demand/EmissionActivityScope.md
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
# Demand: Emission Cadence activity scope — silence while a source is not running
|
||||
|
||||
**Status:** proposed (change proposal to the Emission Cadence standard)
|
||||
**Date:** 2026-09-21
|
||||
**Source:** net-kingdom (source owner), domain `infotech`
|
||||
**Owner:** InfoTechCanon Emission Cadence standard (`standards/emission-cadence`)
|
||||
**Consumer evidence:** `net-kingdom/local-identity/emission-cadence-findings.md` (commit `116643f`)
|
||||
**Feedback:** `feedback/2026-09-21-net-kingdom-emission-cadence-declaration.md`
|
||||
**Workplan:** `INFO-WP-0029` (T04 records it; no design workplan exists yet)
|
||||
|
||||
---
|
||||
|
||||
## Demand signal
|
||||
|
||||
The first source-owned declaration came from a source that can emit only while
|
||||
an attended process runs: `local-identity serve`, plus operator-invoked CLI
|
||||
commands. For such a source, silence has two meanings. Silence while the
|
||||
process runs may be a finding. Silence while the process is not running
|
||||
carries no information. The contract cannot tell the two apart:
|
||||
|
||||
- `expected-rate` needs a floor. `expected_min: 0` is the only honest value,
|
||||
and with it silence means nothing.
|
||||
- `heartbeat-or-reconciliation` with a heartbeat assumes a process that can
|
||||
emit `nothing-to-report`. Outside a session no such process exists.
|
||||
|
||||
The consumer fell back to reconciliation only. That preserves correctness but
|
||||
leaves the observer unable to bound silence at all.
|
||||
|
||||
## Options named by the consumer
|
||||
|
||||
1. An **activity-scope** or session-bounded form. The source emits start/stop
|
||||
(or open/close) markers, and the cadence expectation applies only inside the
|
||||
bounded interval.
|
||||
2. An explicit statement in the standard that session-scoped sources are out
|
||||
of scope. Such sources would then declare reconciliation only, and observers
|
||||
would not evaluate their silence.
|
||||
|
||||
## Constraints on a disposition
|
||||
|
||||
- A new form changes the wire schema (`0.1`). Under the `0.x` rules that is
|
||||
allowed with migration guidance. Existing declarations stay valid only if the
|
||||
form is additive.
|
||||
- Declarations pinned before the change stay pinned to their digest. Stable
|
||||
promotion needs declarations against one fixed reading of the contract, so
|
||||
a schema change before stable resets which pin later evidence should use.
|
||||
- This demand is not accepted. Choosing between the options, or rejecting both,
|
||||
is a canon-owner decision.
|
||||
|
|
@ -27,7 +27,9 @@ and a declaration is never evidence that the emission actually happens.
|
|||
observer's.
|
||||
2. **The contract digest you implemented against**, so the declaration is pinned
|
||||
to a fixed reading of the contract rather than to whatever the canon says
|
||||
later. Current digest: `972c0b6701d1693f`
|
||||
later. Current digest: `b08b4d95fc4b0bd3`
|
||||
(candidate, document 0.2.0; `972c0b6701d1693f` was the 0.1.0 draft text and
|
||||
the same wire schema)
|
||||
(`info_tech_canon export-emission-contract <path.tar>` regenerates it).
|
||||
3. **Nothing else.** No deployment, no runtime proof, no conformance claim. A
|
||||
declaration is a statement of intended cadence.
|
||||
|
|
|
|||
|
|
@ -0,0 +1,95 @@
|
|||
---
|
||||
id: feedback/2026-09-21-net-kingdom-emission-cadence-declaration
|
||||
type: consumer-feedback
|
||||
status: reviewed
|
||||
date: "2026-09-21"
|
||||
consumer: net-kingdom
|
||||
consumer_domain: infotech
|
||||
canon_version: "0.7.0"
|
||||
artifacts:
|
||||
- standard/emission-cadence
|
||||
related_demand:
|
||||
- demand/EmissionActivityScope.md
|
||||
related_workplan:
|
||||
- INFO-WP-0029
|
||||
spawned_demand:
|
||||
- demand/EmissionActivityScope.md
|
||||
spawned_workplan: []
|
||||
---
|
||||
|
||||
# Feedback: first source-owned Emission Cadence declaration (local-identity audit log)
|
||||
|
||||
**Consumer:** net-kingdom
|
||||
**Canon version used:** 0.7.0; Emission Cadence document 0.2.0, wire schema 0.1
|
||||
**Artifacts exercised:** `infospace/schemas/emission-cadence.schema.yaml`,
|
||||
`standards/emission-cadence/InfoTechCanonEmissionCadenceStandard.md`
|
||||
**Related demand:** `demand/EmissionActivityScope.md`
|
||||
|
||||
Source: net-kingdom's reply to INFO-WP-0029-T02 (State Hub message
|
||||
`3b2db043-b910-4552-930f-65d87b475f3b`, thread `3432a831`), and the files it
|
||||
published at net-kingdom commit `116643f`:
|
||||
`local-identity/emission-cadence.yaml` and
|
||||
`local-identity/emission-cadence-findings.md`. The consumer's own findings file
|
||||
is the authoritative account. The sections below summarize it and do not
|
||||
restate it.
|
||||
|
||||
---
|
||||
|
||||
## Consumer purpose
|
||||
|
||||
Declare the intended cadence of the local-identity audit log (`serve/token`
|
||||
issuance, `revoke-token`) as load-bearing security evidence, so that an
|
||||
observer could read silence in that stream.
|
||||
|
||||
## Hits
|
||||
|
||||
- `heartbeat-or-reconciliation` with a `reconciliation` block. This expressed
|
||||
a local-count versus observed-count comparison without inventing a heartbeat
|
||||
the source does not emit.
|
||||
- `extensions`. These carried NetKingdom's evidence class, the
|
||||
rate-monitoring prohibition, and `completeness_claimed: false` without
|
||||
touching the generic contract.
|
||||
- The schema was sufficient for a valid declaration. The consumer found it
|
||||
`contract_valid` through its own profile tool.
|
||||
|
||||
## Friction
|
||||
|
||||
- `emission-review` could not be run by the consumer because
|
||||
`infospace-bench==0.1.0` is not installable from a package index. This is the
|
||||
packaging limitation SCOPE.md already records. It now costs an adopter a
|
||||
validation step.
|
||||
- `reconciliation` needs an observer that does not exist, so
|
||||
`compare_observed` is a declared reference with no feed behind it.
|
||||
|
||||
## Gaps
|
||||
|
||||
- **Session-scoped silence.** The source can emit only while an attended process
|
||||
runs. `expected-rate` has no meaningful floor (`expected_min: 0` makes
|
||||
silence meaningless), and a heartbeat outside a session does not exist.
|
||||
Neither form can say "silent because not running". Filed as
|
||||
`demand/EmissionActivityScope.md`.
|
||||
|
||||
## Drop candidates
|
||||
|
||||
None.
|
||||
|
||||
## Steward notes
|
||||
|
||||
- **Validated canon-side on 2026-09-22.** `info_tech_canon emission-review` on
|
||||
the declaration at `116643f` returned `ok: true`, `errors: []`,
|
||||
`operational_truth_assessed: false`.
|
||||
- **The pin was stale because of our brief, not because of the consumer.** The
|
||||
consumer pinned `972c0b6701d1693f` and labelled it document 0.2.0, as
|
||||
`docs/emission-cadence-adoption.md` instructed. That digest is the 0.1.0 draft
|
||||
bundle. The candidate promotion (`4d0851c`) changed the standard's text after
|
||||
the digest was taken, and the brief was not updated. The wire schema is
|
||||
identical in both bundles, so the declaration's validity is unaffected. The
|
||||
export manifest also hard-coded `status: draft`. It now reads status and
|
||||
version from the standard. The brief names the corrected candidate digest,
|
||||
`b08b4d95fc4b0bd3`.
|
||||
- **What this counts toward.** This is one source-owned declaration from an owner
|
||||
independent of this repository. It also records an incompatibility, which is
|
||||
the third element of the stable gate (standard §10). It is not a second
|
||||
declaration and not an observer result. The standard stays at candidate.
|
||||
- The NetKingdom security profile's rare-heartbeat MUST failure belongs to
|
||||
NetKingdom's profile. It is not a defect of the generic contract.
|
||||
|
|
@ -2,7 +2,7 @@
|
|||
# Normative canon artifacts must not depend on this file.
|
||||
directory: feedback
|
||||
purpose: Consumer reports on whether InfoTechCanon concepts provide utility
|
||||
updated: "2026-08-15"
|
||||
updated: "2026-09-22"
|
||||
judgments:
|
||||
- hits
|
||||
- friction
|
||||
|
|
@ -76,3 +76,25 @@ reports:
|
|||
- ITC-WP-0014
|
||||
- ITC-WP-0015
|
||||
- ADHOC-2026-08-15
|
||||
- id: feedback/2026-09-21-net-kingdom-emission-cadence-declaration
|
||||
path: feedback/2026-09-21-net-kingdom-emission-cadence-declaration.md
|
||||
date: "2026-09-21"
|
||||
consumer: net-kingdom
|
||||
consumer_domain: infotech
|
||||
status: reviewed
|
||||
canon_version: "0.7.0"
|
||||
artifacts:
|
||||
- standard/emission-cadence
|
||||
hits:
|
||||
- heartbeat-or-reconciliation (reconciliation)
|
||||
- extensions
|
||||
friction:
|
||||
- emission-review not runnable by adopter (infospace-bench not installable)
|
||||
- reconciliation with no existing observer feed
|
||||
gaps:
|
||||
- session-scoped silence (activity scope)
|
||||
drop_candidates: []
|
||||
related_demand:
|
||||
- demand/EmissionActivityScope.md
|
||||
related_workplan:
|
||||
- INFO-WP-0029
|
||||
|
|
|
|||
|
|
@ -72,10 +72,17 @@ def export_emission_bundle(root: Path, destination: Path) -> dict:
|
|||
"standards/emission-cadence/InfoTechCanonEmissionCadenceStandard.md",
|
||||
"standards/emission-cadence/examples/qonto-assistant.yaml"]
|
||||
files = {path: (root / path).read_bytes() for path in paths}
|
||||
manifest = {"contract": "emission-cadence/0.1", "status": "draft",
|
||||
# Status and version come from the standard itself, so a promotion cannot
|
||||
# leave the manifest describing an earlier maturity.
|
||||
standard = files[paths[1]].decode()
|
||||
header = re.match(r"---\n(.*?)\n---", standard, re.S)
|
||||
fields = dict(re.findall(r"^(status|version):\s*(\S+)", header.group(1) if header else "", re.M))
|
||||
manifest = {"contract": "emission-cadence/0.1", "status": fields.get("status"),
|
||||
"document_version": fields.get("version"),
|
||||
"files": {name: hashlib.sha256(data).hexdigest() for name, data in files.items()},
|
||||
"semantic_checks": ["unique source_id in sources"],
|
||||
"adoption_evidence": "Two independent source-owned implementations required; example does not count."}
|
||||
"adoption_evidence": ("Stable requires two source-owned declarations from independent owners "
|
||||
"and one observer result from a third party; example does not count.")}
|
||||
files["manifest.json"] = (json.dumps(manifest, sort_keys=True, indent=2) + "\n").encode()
|
||||
output = io.BytesIO()
|
||||
with tarfile.open(fileobj=output, mode="w", format=tarfile.USTAR_FORMAT) as archive:
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ import json
|
|||
from pathlib import Path
|
||||
import shutil
|
||||
import tarfile
|
||||
import tempfile
|
||||
|
||||
import pytest
|
||||
import yaml
|
||||
|
|
@ -92,6 +93,15 @@ def test_bundle_is_reproducible_and_refuses_corruption(tmp_path):
|
|||
export_emission_bundle(DEFAULT_INFOSPACE_ROOT, tmp_path)
|
||||
|
||||
|
||||
def test_bundle_manifest_reports_the_standards_own_status():
|
||||
standard = (DEFAULT_INFOSPACE_ROOT / "standards/emission-cadence/"
|
||||
"InfoTechCanonEmissionCadenceStandard.md").read_text()
|
||||
manifest = export_emission_bundle(DEFAULT_INFOSPACE_ROOT, Path(tempfile.mkdtemp()))["manifest"]
|
||||
assert f"status: {manifest['status']}\n" in standard
|
||||
assert f"version: {manifest['document_version']}\n" in standard
|
||||
assert "observer" in manifest["adoption_evidence"]
|
||||
|
||||
|
||||
def test_mapping_schema_and_explicit_ownership_are_enforced(corpus):
|
||||
from info_tech_canon.contracts import bound_artifact_errors
|
||||
mapping = corpus / "mappings/capability-anchors.yaml"
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ status: active
|
|||
owner: claude
|
||||
topic_slug: canon-optimization
|
||||
created: "2026-09-21"
|
||||
updated: "2026-09-21"
|
||||
updated: "2026-09-22"
|
||||
flavor: coordination
|
||||
state_hub_workstream_id: "d743e220-9d2d-52d8-8df3-880805269639"
|
||||
---
|
||||
|
|
@ -48,7 +48,7 @@ what is being asked cannot drift between recipients.
|
|||
|
||||
```task
|
||||
id: INFO-WP-0029-T02
|
||||
status: progress
|
||||
status: done
|
||||
priority: high
|
||||
state_hub_task_id: "845c27d1-5b66-5317-8abb-0a62eb0d9638"
|
||||
```
|
||||
|
|
@ -62,6 +62,9 @@ Ask for one source-owned declaration for an event class it already emits.
|
|||
Waiting for a reply is expected; this task tracks the ask, not the answer.
|
||||
|
||||
Sent 2026-09-21 as State Hub message `3432a831-b25f-4717-ad8b-cb19fb1b6633`.
|
||||
Answered the same day (`3b2db043`): a declaration was published at net-kingdom
|
||||
`116643f`, `local-identity/emission-cadence.yaml`, together with an
|
||||
incompatibility finding. It is recorded under T04.
|
||||
|
||||
## Ask a second, independent source
|
||||
|
||||
|
|
@ -100,7 +103,7 @@ of section 10 and defeat its purpose.
|
|||
|
||||
```task
|
||||
id: INFO-WP-0029-T04
|
||||
status: wait
|
||||
status: progress
|
||||
priority: medium
|
||||
state_hub_task_id: "4771ff59-264e-5917-a49d-8989b361b8ed"
|
||||
```
|
||||
|
|
@ -111,6 +114,26 @@ declaration cannot be expressed in either form, that is the finding, and it goes
|
|||
to the standard as a change proposal rather than being worked around in the
|
||||
declaration.
|
||||
|
||||
### Recorded so far — 2026-09-22
|
||||
|
||||
net-kingdom's declaration passes `emission-review` (`ok: true`). It is recorded
|
||||
as `feedback/2026-09-21-net-kingdom-emission-cadence-declaration.md`. Its
|
||||
incompatibility is that a session-scoped source cannot make its silence
|
||||
meaningful in either form. That finding goes to the standard as
|
||||
`demand/EmissionActivityScope.md` and was not worked around in the
|
||||
declaration.
|
||||
|
||||
Checking the pin exposed a canon-side defect. The brief quoted digest
|
||||
`972c0b6701d1693f`, which is the 0.1.0 draft bundle, because the candidate
|
||||
promotion changed the standard's text after the digest was taken. The export
|
||||
manifest also hard-coded `status: draft`. The manifest now reads status and
|
||||
version from the standard. A test pins that behaviour, and the brief names the
|
||||
candidate digest `b08b4d95fc4b0bd3`. The wire schema did not change, so the
|
||||
declaration stays valid.
|
||||
|
||||
This task stays in progress until activity-core's declaration (T03) arrives or
|
||||
the ask is withdrawn.
|
||||
|
||||
## Observer result
|
||||
|
||||
```task
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue