carlos / platform Public

provision: root-read census overlay for the placement shim (census ruling zddr3, #272)

Adds the zddr3 overlay: the exec shim's and VerifyPlacement's reads as
accepted-legacy rows, three refreshed legacy rows, and census-ruling
removals of placementLive and Manager.startIn. The legacy seal is
re-pinned beside the zddr3 load.

Narrow format changes:
- An @removed row owned by H3 loads only when its basis starts with
  census-ruling-; H3 is still never a kept owner for an authority,
  hint or diagnostic row.
- A still-declared unit may be retired only by an H3 census-ruling-
  removal, and only when the current scan finds no reads in it. The
  basis text is never evidence. Every other removal of a still-declared
  or still-classified unit fails as before, and a retired unit that
  reads again is an unclassified root read.

rev3=census-ruling-zddr3
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude agent, operated by paul@keymail.dev ee603636f034c96bfd104cf70ada2e3dfa4f5c38 parent f4f9547
4 files changed, +208 −2
  • internal/cgroup/shim_linux.go +10 −0
  • internal/provision/plan14_legacy_identity_test.go +54 −0
  • internal/provision/plan14_root_reads_test.go +103 −2
  • internal/provision/testdata/plan14-root-reads-zddr3.tsv +41 −0

CI passed — run details

CI log
=== gate ===
cd launchctx && go vet ./... && go test ./... -count=1
ok  	amadan.net/carlos/platform.git/launchctx	0.012s
?   	amadan.net/carlos/platform.git/launchctx/controlname	[no test files]
?   	amadan.net/carlos/platform.git/launchctx/wireid	[no test files]
go vet ./...
gofmt -l .: clean
go test ./... -count=1 -timeout 30m
ok  	github.com/carlosframework/platform	342.055s
?   	github.com/carlosframework/platform/cmd/changelog	[no test files]
ok  	github.com/carlosframework/platform/cmd/console	3.105s
ok  	github.com/carlosframework/platform/cmd/moveprobe	92.214s
ok  	github.com/carlosframework/platform/cmd/zddprobe	0.383s
ok  	github.com/carlosframework/platform/internal/activator	227.795s
ok  	github.com/carlosframework/platform/internal/agentsock	0.022s
ok  	github.com/carlosframework/platform/internal/alerting	0.005s
ok  	github.com/carlosframework/platform/internal/analytics	0.020s
ok  	github.com/carlosframework/platform/internal/appconfig	2.296s
ok  	github.com/carlosframework/platform/internal/apperr	0.074s
ok  	github.com/carlosframework/platform/internal/applog	0.129s
ok  	github.com/carlosframework/platform/internal/awsinv	0.004s
ok  	github.com/carlosframework/platform/internal/boxchoice	0.005s
ok  	github.com/carlosframework/platform/internal/boxid	0.886s
?   	github.com/carlosframework/platform/internal/boxid/boxidtest	[no test files]
?   	github.com/carlosframework/platform/internal/boxid/internal/signtest	[no test files]
ok  	github.com/carlosframework/platform/internal/boxvolumes	0.010s
ok  	github.com/carlosframework/platform/internal/caps	0.013s
ok  	github.com/carlosframework/platform/internal/certwarm	0.002s
ok  	github.com/carlosframework/platform/internal/cgroup	0.694s
ok  	github.com/carlosframework/platform/internal/changelog	0.299s
ok  	github.com/carlosframework/platform/internal/clamd	0.054s
?   	github.com/carlosframework/platform/internal/cliflag	[no test files]
ok  	github.com/carlosframework/platform/internal/console	363.595s
?   	github.com/carlosframework/platform/internal/controlname	[no test files]
?   	github.com/carlosframework/platform/internal/controlsock	[no test files]
ok  	github.com/carlosframework/platform/internal/dbdoor	6.438s
ok  	github.com/carlosframework/platform/internal/dbdoor/dbdoortest	0.011s
ok  	github.com/carlosframework/platform/internal/dbverify	0.005s
ok  	github.com/carlosframework/platform/internal/dnsrec	0.004s
ok  	github.com/carlosframework/platform/internal/docsite	0.005s
ok  	github.com/carlosframework/platform/internal/domains	2.127s
ok  	github.com/carlosframework/platform/internal/doorkey	0.006s
ok  	github.com/carlosframework/platform/internal/economics	0.004s
ok  	github.com/carlosframework/platform/internal/edge	26.154s
?   	github.com/carlosframework/platform/internal/edgeproof	[no test files]
ok  	github.com/carlosframework/platform/internal/edgesfile	0.009s
ok  	github.com/carlosframework/platform/internal/fleetapi	0.126s
ok  	github.com/carlosframework/platform/internal/gate	1.657s
ok  	github.com/carlosframework/platform/internal/genselect	0.021s
ok  	github.com/carlosframework/platform/internal/geo	0.013s
ok  	github.com/carlosframework/platform/internal/geoip	0.034s
ok  	github.com/carlosframework/platform/internal/host	96.157s
ok  	github.com/carlosframework/platform/internal/hostactors	0.472s
ok  	github.com/carlosframework/platform/internal/hostbox	2.149s
ok  	github.com/carlosframework/platform/internal/hostclaim	0.499s
ok  	github.com/carlosframework/platform/internal/hostevidence	0.012s
ok  	github.com/carlosframework/platform/internal/hostexec	4.686s
ok  	github.com/carlosframework/platform/internal/hostfence	0.036s
ok  	github.com/carlosframework/platform/internal/hostfiles	10.436s
ok  	github.com/carlosframework/platform/internal/hostfloor	0.012s
ok  	github.com/carlosframework/platform/internal/hostguard	1.004s
ok  	github.com/carlosframework/platform/internal/hostops	1.433s
?   	github.com/carlosframework/platform/internal/hostops/fencerelease	[no test files]
ok  	github.com/carlosframework/platform/internal/hostops/internal/fencerelease	0.014s
ok  	github.com/carlosframework/platform/internal/hostquarantine	0.012s
ok  	github.com/carlosframework/platform/internal/hostrelocate	0.467s
ok  	github.com/carlosframework/platform/internal/hostresolve	0.141s
ok  	github.com/carlosframework/platform/internal/hostwrite	0.013s
ok  	github.com/carlosframework/platform/internal/infraview	0.012s
ok  	github.com/carlosframework/platform/internal/instancectl	1.819s
ok  	github.com/carlosframework/platform/internal/instanceexec	2.719s
ok  	github.com/carlosframework/platform/internal/instancefs	0.017s
ok  	github.com/carlosframework/platform/internal/instancekey	0.014s
ok  	github.com/carlosframework/platform/internal/instanceupdates	0.018s
ok  	github.com/carlosframework/platform/internal/layout	1.418s
ok  	github.com/carlosframework/platform/internal/lease	9.444s
ok  	github.com/carlosframework/platform/internal/lease/leasetest	0.019s
ok  	github.com/carlosframework/platform/internal/ledger	0.025s
ok  	github.com/carlosframework/platform/internal/mail	0.181s
ok  	github.com/carlosframework/platform/internal/maintenance	0.086s
ok  	github.com/carlosframework/platform/internal/maintenanceexec	5.515s
ok  	github.com/carlosframework/platform/internal/maintenanceguard	0.071s
ok  	github.com/carlosframework/platform/internal/metrics	0.005s
ok  	github.com/carlosframework/platform/internal/moves	20.936s
ok  	github.com/carlosframework/platform/internal/moves/archive	0.741s
ok  	github.com/carlosframework/platform/internal/objstore	0.183s
ok  	github.com/carlosframework/platform/internal/ops	0.164s
ok  	github.com/carlosframework/platform/internal/park	0.204s
ok  	github.com/carlosframework/platform/internal/privatefile	0.008s
ok  	github.com/carlosframework/platform/internal/provision	11.981s
ok  	github.com/carlosframework/platform/internal/publicrelease	0.007s
?   	github.com/carlosframework/platform/internal/regionname	[no test files]
ok  	github.com/carlosframework/platform/internal/registry	3.981s
ok  	github.com/carlosframework/platform/internal/relay	7.229s
ok  	github.com/carlosframework/platform/internal/release	19.937s
ok  	github.com/carlosframework/platform/internal/rollout	3.620s
ok  	github.com/carlosframework/platform/internal/rolloutwords	0.003s
ok  	github.com/carlosframework/platform/internal/rootaws	0.006s
ok  	github.com/carlosframework/platform/internal/rootparticipation	0.008s
ok  	github.com/carlosframework/platform/internal/rootstate	0.025s
ok  	github.com/carlosframework/platform/internal/s3compat	0.005s
ok  	github.com/carlosframework/platform/internal/safefile	0.004s
ok  	github.com/carlosframework/platform/internal/schedule	2.275s
ok  	github.com/carlosframework/platform/internal/sim/hostlife	9.015s
ok  	github.com/carlosframework/platform/internal/sim/litestreamfacts	3.906s
ok  	github.com/carlosframework/platform/internal/status	0.042s
ok  	github.com/carlosframework/platform/internal/steering	0.006s
ok  	github.com/carlosframework/platform/internal/stopevidence	0.298s
ok  	github.com/carlosframework/platform/internal/svcrole	0.002s
ok  	github.com/carlosframework/platform/internal/telemetry	0.004s
ok  	github.com/carlosframework/platform/internal/termfence	0.004s
ok  	github.com/carlosframework/platform/internal/tunnelclient	0.004s
ok  	github.com/carlosframework/platform/internal/unixdial	0.002s
ok  	github.com/carlosframework/platform/internal/updatewords	0.004s
ok  	github.com/carlosframework/platform/internal/usage	0.006s
ok  	github.com/carlosframework/platform/internal/version	0.002s
ok  	github.com/carlosframework/platform/internal/vet	1.549s
=== cross ===
--- shard 0 of 5 ---
cross-compiling darwin/arm64
--- shard 1 of 5 ---
cross-compiling darwin/amd64
--- shard 2 of 5 ---
cross-compiling linux/arm64
--- shard 3 of 5 ---
cross-compiling windows/amd64
--- shard 4 of 5 ---
cross-compiling windows/arm64
=== minio-contract ===
minio contract: arm64, minio RELEASE.2025-09-07T16-13-09Z, mc RELEASE.2025-08-13T08-35-41Z
  minio: downloading https://github.com/minio/minio/releases/download/RELEASE.2025-09-07T16-13-09Z/minio.linux-arm64.RELEASE.2025-09-07T16-13-09Z
  minio: downloaded, digest verified
  mc: downloading https://github.com/minio/mc/releases/download/RELEASE.2025-08-13T08-35-41Z/mc.linux-arm64.RELEASE.2025-08-13T08-35-41Z
  mc: downloaded, digest verified
  minio healthy on 127.0.0.1:20999
Added `local` successfully.
Bucket created successfully `local/contract-bucket`.
Bucket created successfully `local/denied-bucket`.
Created policy `contract-only` successfully.
Added user `scopeduser` successfully.
Attached Policies: [contract-only]
To User: scopeduser
  buckets and scoped user ready
=== RUN   TestDeliveredContractMinio
=== RUN   TestDeliveredContractMinio/put
=== RUN   TestDeliveredContractMinio/get_round-trips_the_body
=== RUN   TestDeliveredContractMinio/list_shows_the_key
=== RUN   TestDeliveredContractMinio/head_and_list_agree_on_the_version
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_its_own_object
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_its_own_object/not_by_PutObjectTagging
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_its_own_object/and_not_by_x-amz-tagging_on_upload
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/not_by_CreateMultipartUpload
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/not_by_CopyObject_with_a_REPLACE_tagging_directive
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/but_multipart_itself_is_allowed
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/and_copy_itself_is_allowed
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/a_POST-policy_forged_tag_with_a_matching_version_is_still_not_a_verdict
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/and_an_ordinary_tagged-with-something-else_upload_is_allowed
=== RUN   TestDeliveredContractMinio/delete_removes_it
=== RUN   TestDeliveredContractMinio/cross-bucket_denial
--- PASS: TestDeliveredContractMinio (0.02s)
    --- PASS: TestDeliveredContractMinio/put (0.00s)
    --- PASS: TestDeliveredContractMinio/get_round-trips_the_body (0.00s)
    --- PASS: TestDeliveredContractMinio/list_shows_the_key (0.00s)
    --- PASS: TestDeliveredContractMinio/head_and_list_agree_on_the_version (0.00s)
    --- PASS: TestDeliveredContractMinio/the_app_cannot_tag_its_own_object (0.00s)
        --- PASS: TestDeliveredContractMinio/the_app_cannot_tag_its_own_object/not_by_PutObjectTagging (0.00s)
        --- PASS: TestDeliveredContractMinio/the_app_cannot_tag_its_own_object/and_not_by_x-amz-tagging_on_upload (0.00s)
    --- PASS: TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route (0.01s)
        --- PASS: TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/not_by_CreateMultipartUpload (0.00s)
        --- PASS: TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/not_by_CopyObject_with_a_REPLACE_tagging_directive (0.00s)
        --- PASS: TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/but_multipart_itself_is_allowed (0.00s)
        --- PASS: TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/and_copy_itself_is_allowed (0.00s)
        --- PASS: TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/a_POST-policy_forged_tag_with_a_matching_version_is_still_not_a_verdict (0.00s)
        --- PASS: TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/and_an_ordinary_tagged-with-something-else_upload_is_allowed (0.00s)
    --- PASS: TestDeliveredContractMinio/delete_removes_it (0.00s)
    --- PASS: TestDeliveredContractMinio/cross-bucket_denial (0.00s)
PASS
ok  	github.com/carlosframework/platform/internal/objstore	0.022s
=== RUN   TestT4StorageProbeMinio
2026/10/13 17:51:21 moves: T4: STORE: list: operation error S3: ListObjectsV2, https response error StatusCode: 403, RequestID: 18DE282E7FD6B25A, HostID: 7c420053e0fbcd7f41653fdd92ffa2802c903d05303b1aa15adc2e8bb65d183f, api error SignatureDoesNotMatch: The request signature we calculated does not match the signature you provided. Check your key and signing method.
--- PASS: TestT4StorageProbeMinio (0.01s)
PASS
ok  	github.com/carlosframework/platform/internal/host	0.021s
minio contract: PASS
diff --git a/internal/cgroup/shim_linux.go b/internal/cgroup/shim_linux.go
index f35f7214e..ec66620ed 100644
--- a/internal/cgroup/shim_linux.go
+++ b/internal/cgroup/shim_linux.go
@@ -381,6 +381,16 @@ func parseShimErr(line string) (op string, errno int, ok bool) {
// fds, which are keep, keep+1 and keep+2. It writes nothing to fds 0 to 2.
// A failure before placement is confirmed writes "P <step>: <error>" and
// returns 125; tenant code has not run.
+//
+// Plan 14 root-read census, census ruling zddr3: the shim, its probe and
+// the parent-side start read only
+//
+// the agent's own delegated cgroup subtree (including its scratch probe child), /proc/self, and pipes to and from its own parent, running as carlos
+//
+// On that basis their reads are accepted-legacy rows
+// (internal/provision/testdata/plan14-root-reads-zddr3.tsv). If the shim
+// ever runs as root, or reads anything outside that boundary, it stops
+// being legacy and needs the Plan 14 owner's ruling.
func runShim(args []string) int {
if len(args) != 3 {
return 125
diff --git a/internal/provision/plan14_legacy_identity_test.go b/internal/provision/plan14_legacy_identity_test.go
index f96fea929..c0d52099d 100644
--- a/internal/provision/plan14_legacy_identity_test.go
+++ b/internal/provision/plan14_legacy_identity_test.go
@@ -194,3 +194,57 @@ func TestPlan14Fix5OverlayPreservesLegacySeal(t *testing.T) {
t.Fatal("unexpected legacy seal", seal)
}
}
+
+// Census ruling zddr3 (#272): the placement shim's overlay, loaded after fix6.
+func TestPlan14Zddr3OverlayPreservesLegacySeal(t *testing.T) {
+ root := censusRoot(t)
+ inv := rootReadInventory{Entries: map[string]classifiedRootRead{}, Coverage: map[string]string{}}
+ for i, name := range []string{"plan14-root-reads.tsv", "plan14-root-reads-moves.tsv", "plan14-root-reads-merge.tsv", "plan14-root-reads-fix1.tsv", "plan14-root-reads-fix2.tsv", "plan14-root-reads-merge3.tsv", "plan14-root-reads-fix4.tsv", "plan14-root-reads-fix5.tsv", "plan14-root-reads-fix6.tsv"} {
+ if err := loadRootReadInventory(root+"/internal/provision/testdata/"+name, &inv, i > 0); err != nil {
+ t.Fatal(err)
+ }
+ }
+ if errs := checkRootReadLegacy(inv, "65dba959f80cc47e9fd99be145ba8b24bb3b37ffaf77b47d1b9cc3e01da14b47"); len(errs) != 0 {
+ t.Fatal(errs)
+ }
+ original := make(map[string]bool, len(inv.Legacy))
+ for hash := range inv.Legacy {
+ original[hash] = true
+ }
+ if err := loadRootReadInventory(root+"/internal/provision/testdata/plan14-root-reads-zddr3.tsv", &inv, true); err != nil {
+ t.Fatal(err)
+ }
+ for hash := range original {
+ if !inv.Legacy[hash] {
+ t.Fatalf("zddr3 removed original freeze %s", hash)
+ }
+ }
+ if len(inv.Legacy) != len(original)+13 {
+ t.Fatal("census ruling zddr3 permits exactly thirteen new frozen declarations")
+ }
+ // Census ruling zddr3 seal: ten shim and VerifyPlacement rows plus three
+ // refreshed legacy rows (openCleanupAt, StartWorkerStaged, spawnChildFrom).
+ const seal = "c748e02bfe907a009ef42eb544b1a44fe813f4f7c13e454be3980aec4fade568"
+ if errs := checkRootReadLegacy(inv, seal); len(errs) != 0 {
+ t.Fatal(errs)
+ }
+ for key, e := range inv.Entries {
+ if strings.HasPrefix(key, "internal/cgroup/shim_linux.go:") || strings.HasPrefix(key, "internal/cgroup/verify_linux.go:") {
+ if e.Class != "legacy" || e.Task != "accepted-legacy" || !strings.HasPrefix(e.Basis, "accepted-legacy;rev3=census-ruling-zddr3;") {
+ t.Fatalf("wrong zddr3 disposition: %+v", e)
+ }
+ }
+ }
+ for _, key := range []string{"internal/cgroup/cgroup_linux.go:placementLive", "internal/cgroup/cgroup.go:Manager.startIn"} {
+ if !strings.HasPrefix(inv.Removed[key], "H3;census-ruling-zddr3: ") {
+ t.Fatalf("%s lost its census-ruling removal", key)
+ }
+ if _, present := inv.Entries[key]; present {
+ t.Fatalf("%s still classified", key)
+ }
+ }
+ inv.Legacy[strings.Repeat("0", 64)] = true
+ if errs := checkRootReadLegacy(inv, seal); len(errs) == 0 {
+ t.Fatal("unapproved legacy fingerprint accepted")
+ }
+}
diff --git a/internal/provision/plan14_root_reads_test.go b/internal/provision/plan14_root_reads_test.go
index 4f2a404c4..e51bd4792 100644
--- a/internal/provision/plan14_root_reads_test.go
+++ b/internal/provision/plan14_root_reads_test.go
@@ -16,6 +16,7 @@ import (
"os"
"os/exec"
"path/filepath"
+ "reflect"
"sort"
"strings"
"testing"
@@ -436,7 +437,11 @@ func loadRootReadInventory(path string, inv *rootReadInventory, delta bool) erro
}
inv.Legacy[col[1]] = true
case "@removed":
- if len(col) != 5 || !rootReadKeptTask(col[3]) || strings.TrimSpace(col[4]) == "" {
+ // H3 may own a removal only under a recorded census ruling (census
+ // ruling zddr3); it never becomes a kept owner for an authority,
+ // hint or diagnostic row, so rootReadKeptTask stays unchanged.
+ owned := rootReadKeptTask(col[3]) || (len(col) == 5 && col[3] == "H3" && strings.HasPrefix(col[4], "census-ruling-"))
+ if len(col) != 5 || !owned || strings.TrimSpace(col[4]) == "" {
return fmt.Errorf("%s:%d: removal needs owner and basis", path, i+1)
}
key = col[1] + ":" + col[2]
@@ -640,6 +645,12 @@ func TestPlan14RootReadCensus(t *testing.T) {
if err = loadRootReadInventory(filepath.Join(root, "internal/provision/testdata/plan14-root-reads-fix6.tsv"), &inv, true); err != nil {
t.Fatal(err)
}
+ if err = loadRootReadInventory(filepath.Join(root, "internal/provision/testdata/plan14-root-reads-zddr3.tsv"), &inv, true); err != nil {
+ t.Fatal(err)
+ }
+ // Census ruling zddr3 (#272): the exec shim's accepted-legacy rows and the
+ // three refreshed legacy rows add thirteen frozen declarations.
+ seal = "c748e02bfe907a009ef42eb544b1a44fe813f4f7c13e454be3980aec4fade568"
errs := append(compareRootReads(got, inv), checkRootReadLegacy(inv, seal)...)
errs = append(errs, checkRootReadDeclarations(got, inv)...)
if len(errs) > 0 {
@@ -685,6 +696,82 @@ func TestPlan14RootReadCensusRejectsDrift(t *testing.T) {
}
}
+// Census ruling zddr3: H3 owns a removal only with a census-ruling basis,
+// and never owns an authority row.
+func TestPlan14RemovedH3NeedsCensusRuling(t *testing.T) {
+ for name, tc := range map[string]struct {
+ row string
+ load bool
+ }{
+ "ruling": {"@removed\tinternal/cgroup/cgroup.go\tManager.startIn\tH3\tcensus-ruling-zddr3: placement moved into the shim.", true},
+ "no ruling": {"@removed\tinternal/cgroup/cgroup.go\tManager.startIn\tH3\tplacement moved into the shim.", false},
+ "inner": {"@removed\tinternal/cgroup/cgroup.go\tManager.startIn\tH3\tsee census-ruling-zddr3", false},
+ "authority": {"internal/cgroup/cgroup.go\tManager.startIn\tauthority\tH3\tcensus-ruling-zddr3\tfile:Open@1\t" + strings.Repeat("a", 64), false},
+ "other owner": {"@removed\tinternal/cgroup/cgroup.go\tManager.startIn\tH4\tcensus-ruling-zddr3: placement moved into the shim.", false},
+ } {
+ t.Run(name, func(t *testing.T) {
+ path := filepath.Join(t.TempDir(), "overlay.tsv")
+ if err := os.WriteFile(path, []byte(tc.row+"\n"), 0o644); err != nil {
+ t.Fatal(err)
+ }
+ inv := rootReadInventory{Entries: map[string]classifiedRootRead{}, Coverage: map[string]string{}}
+ err := loadRootReadInventory(path, &inv, true)
+ if tc.load && err != nil {
+ t.Fatal(err)
+ }
+ if !tc.load && err == nil {
+ t.Fatal("row loaded without a census-ruling basis or kept owner")
+ }
+ })
+ }
+}
+
+// Census ruling zddr3: an H3 census-ruling removal retires a still-declared
+// unit only while the scan finds no read in it. Every other removal of a
+// still-declared unit fails as before, and a retired unit that reads again
+// is an unclassified root read that needs a fresh classification.
+func TestPlan14RetiredDeclarationNeedsNoReads(t *testing.T) {
+ e := classifiedRootRead{rootReadEntry: rootReadEntry{File: "internal/cgroup/cgroup.go", Unit: "Manager.startIn", Kinds: "file:Open@40", Digest: strings.Repeat("a", 64)}, Class: "legacy", Task: "accepted-legacy", Basis: "accepted-legacy;rev3=J1;basis=placement"}
+ key := e.File + ":" + e.Unit
+ body := strings.Repeat("b", 64)
+ inv := rootReadInventory{Entries: map[string]classifiedRootRead{}, Coverage: map[string]string{}, Legacy: map[string]bool{rootReadLegacyFingerprint(e): true}, Frozen: map[string]classifiedRootRead{key: e}, Removed: map[string]string{key: "H3;census-ruling-zddr3: no longer reads"}}
+ present := []string{"removed legacy declaration still present " + key}
+
+ // Still declared, no reads: retired.
+ quiet := rootReadScan{Declarations: map[string]string{key: body}}
+ if errs := checkRootReadDeclarations(quiet, inv); len(errs) != 0 {
+ t.Fatal(errs)
+ }
+ if errs := compareRootReads(quiet, inv); len(errs) != 0 {
+ t.Fatal(errs)
+ }
+
+ // (a) Still declared and still reading: the census-ruling basis does not help.
+ reading := rootReadScan{Entries: []rootReadEntry{{File: e.File, Unit: e.Unit, Kinds: "file:Open@40", Digest: body}}, Declarations: map[string]string{key: body}}
+ if errs := checkRootReadDeclarations(reading, inv); !reflect.DeepEqual(errs, present) {
+ t.Fatalf("retired unit with reads: %v", errs)
+ }
+ // Re-reading: the retired entry gives no silent pass.
+ if errs := compareRootReads(reading, inv); !reflect.DeepEqual(errs, []string{"unclassified root read " + key + " file:Open@40"}) {
+ t.Fatalf("retired unit reading again: %v", errs)
+ }
+
+ // (b) Any removal that is not H3 with a census-ruling basis fails as before.
+ for _, removal := range []string{"C; removed obsolete delegate after reviewed root authority conversion", "E4;census-ruling-zddr3: no longer reads", "H3;no longer reads", "H3; census-ruling-zddr3: no longer reads"} {
+ inv.Removed[key] = removal
+ if errs := checkRootReadDeclarations(quiet, inv); !reflect.DeepEqual(errs, present) {
+ t.Fatalf("%q retired a still-declared unit: %v", removal, errs)
+ }
+ }
+
+ // Still classified: fails even with no reads.
+ inv.Removed[key] = "H3;census-ruling-zddr3: no longer reads"
+ inv.Entries[key] = e
+ if errs := checkRootReadDeclarations(quiet, inv); !reflect.DeepEqual(errs, present) {
+ t.Fatalf("classified unit retired: %v", errs)
+ }
+}
+
func TestPlan14LegacyFreezeRequiresReclassification(t *testing.T) {
e := classifiedRootRead{rootReadEntry: rootReadEntry{File: "internal/host/old.go", Unit: "oldRootRead", Kinds: "registry:Unit@10", Digest: strings.Repeat("a", 64)}, Class: "legacy", Task: "accepted-legacy", Basis: "accepted-legacy;rev3=J1;basis=root-route"}
key := e.File + ":" + e.Unit
@@ -744,7 +831,11 @@ func checkRootReadDeclarations(scan rootReadScan, inv rootReadInventory) []strin
current, classified := inv.Entries[key]
removal := inv.Removed[key]
if removal != "" {
- if exists || classified {
+ // Census ruling zddr3: an H3 census-ruling removal may retire a
+ // unit that is still declared only when this scan finds no read in
+ // it. The basis text is never evidence; the scan is.
+ retired := exists && strings.HasPrefix(removal, "H3;census-ruling-") && !rootReadScanned(scan, key)
+ if (exists && !retired) || classified {
errs = append(errs, "removed legacy declaration still present "+key)
}
continue
@@ -768,3 +859,13 @@ func checkRootReadDeclarations(scan rootReadScan, inv rootReadInventory) []strin
sort.Strings(errs)
return errs
}
+
+// rootReadScanned reports whether the scan has a read entry for the unit.
+func rootReadScanned(scan rootReadScan, key string) bool {
+ for _, e := range scan.Entries {
+ if e.File+":"+e.Unit == key {
+ return true
+ }
+ }
+ return false
+}
diff --git a/internal/provision/testdata/plan14-root-reads-zddr3.tsv b/internal/provision/testdata/plan14-root-reads-zddr3.tsv
new file mode 100644
index 000000000..5e3d78289
--- /dev/null
+++ b/internal/provision/testdata/plan14-root-reads-zddr3.tsv
@@ -0,0 +1,41 @@
+# Plan 14 census ruling zddr3 (#272): the agent's exec shim replaces clone3 placement. Its reads, and the reads of the parent-side start and VerifyPlacement, are accepted legacy because they stay within the agent's own delegated cgroup subtree (including its scratch probe child), /proc/self, and pipes to and from its own parent, running as carlos.
+# If the shim ever runs as root or reads outside that boundary it stops being legacy and needs the Plan 14 owner's ruling. Earlier overlays are immutable.
+@legacy 47342b08763898bff8f58e91a39c63d8f376e68202a1343465ff7bd8a2ab7cf2 internal/cgroup/shim_linux.go joinCgroup legacy accepted-legacy accepted-legacy;rev3=census-ruling-zddr3;basis=Census ruling zddr3: Openat of cgroup.procs relative to the validated dir fd is the same class as the accepted-legacy Manager.startIn and placementLive under fix1-merge-review (existing agent delegated-cgroup management remains legacy); no root decision; no registry, /data, release or claim reads. Boundary: the agent's own delegated cgroup subtree (including its scratch probe child), /proc/self, and pipes to and from its own parent, running as carlos. file:Openat@47 fc7b193b461306cd596cf052be09e7f00dd6c13685e1febc7fd930a8b4146ea0
+internal/cgroup/shim_linux.go joinCgroup legacy accepted-legacy accepted-legacy;rev3=census-ruling-zddr3;basis=Census ruling zddr3: Openat of cgroup.procs relative to the validated dir fd is the same class as the accepted-legacy Manager.startIn and placementLive under fix1-merge-review (existing agent delegated-cgroup management remains legacy); no root decision; no registry, /data, release or claim reads. Boundary: the agent's own delegated cgroup subtree (including its scratch probe child), /proc/self, and pipes to and from its own parent, running as carlos. file:Openat@47 fc7b193b461306cd596cf052be09e7f00dd6c13685e1febc7fd930a8b4146ea0
+@legacy 08551c090f04d40d1013baee16200faf9ebf7b1b9948ef8f84fc695a23276718 internal/cgroup/shim_linux.go verifyCgroup legacy accepted-legacy accepted-legacy;rev3=census-ruling-zddr3;basis=Census ruling zddr3: the Fstat of the dir fd and the Lstat of /sys/fs/cgroup plus expected are identity checks that keep placement inside the subtree; they tighten it and widen no trust; the ReadFile of /proc/self/cgroup is the same class as the accepted-legacy Manager.startIn and placementLive under fix1-merge-review (existing agent delegated-cgroup management remains legacy); no root decision; no registry, /data, release or claim reads. Boundary: the agent's own delegated cgroup subtree (including its scratch probe child), /proc/self, and pipes to and from its own parent, running as carlos. file:Fstat@376,file:Lstat@441,file:ReadFile@67 3cfeb2e9c2ccbf65372ddb5a639c3a10a72e5532211c6507d56343e5e98f4e5b
+internal/cgroup/shim_linux.go verifyCgroup legacy accepted-legacy accepted-legacy;rev3=census-ruling-zddr3;basis=Census ruling zddr3: the Fstat of the dir fd and the Lstat of /sys/fs/cgroup plus expected are identity checks that keep placement inside the subtree; they tighten it and widen no trust; the ReadFile of /proc/self/cgroup is the same class as the accepted-legacy Manager.startIn and placementLive under fix1-merge-review (existing agent delegated-cgroup management remains legacy); no root decision; no registry, /data, release or claim reads. Boundary: the agent's own delegated cgroup subtree (including its scratch probe child), /proc/self, and pipes to and from its own parent, running as carlos. file:Fstat@376,file:Lstat@441,file:ReadFile@67 3cfeb2e9c2ccbf65372ddb5a639c3a10a72e5532211c6507d56343e5e98f4e5b
+@legacy f3c761d0e8d81cb908229d3512a39cb968a5dadb0fb8185d82741eae0ed86eff internal/cgroup/shim_linux.go runProbe legacy accepted-legacy accepted-legacy;rev3=census-ruling-zddr3;basis=Census ruling zddr3: the ReadFile of /proc/self/cgroup is the same class as the accepted-legacy Manager.startIn and placementLive under fix1-merge-review (existing agent delegated-cgroup management remains legacy); no root decision; no registry, /data, release or claim reads. Boundary: the agent's own delegated cgroup subtree (including its scratch probe child), /proc/self, and pipes to and from its own parent, running as carlos. file:ReadFile@35 5356bb77d65caf264da4536608cd925c7e68ed466aa25e5ab007b43eae56fe8f
+internal/cgroup/shim_linux.go runProbe legacy accepted-legacy accepted-legacy;rev3=census-ruling-zddr3;basis=Census ruling zddr3: the ReadFile of /proc/self/cgroup is the same class as the accepted-legacy Manager.startIn and placementLive under fix1-merge-review (existing agent delegated-cgroup management remains legacy); no root decision; no registry, /data, release or claim reads. Boundary: the agent's own delegated cgroup subtree (including its scratch probe child), /proc/self, and pipes to and from its own parent, running as carlos. file:ReadFile@35 5356bb77d65caf264da4536608cd925c7e68ed466aa25e5ab007b43eae56fe8f
+@legacy 3e0187927a2d63bb61bd0c158712bfb74abdee75e52b1a2380812d3fb77ae3c9 internal/cgroup/shim_linux.go Manager.startViaShimBy legacy accepted-legacy accepted-legacy;rev3=census-ruling-zddr3;basis=Census ruling zddr3: the Fstatfs of the opened cgroup dir is one of the identity checks that keep placement inside the subtree; they tighten it and widen no trust; the Open of that dir is the same class as the accepted-legacy Manager.startIn and placementLive under fix1-merge-review (existing agent delegated-cgroup management remains legacy); no root decision; no registry, /data, release or claim reads. Boundary: the agent's own delegated cgroup subtree (including its scratch probe child), /proc/self, and pipes to and from its own parent, running as carlos. file:Fstatfs@699,file:Open@455 d218799999581dbd6fe80b5906891b6f2d1e033d6c33423836175429d33f407a
+internal/cgroup/shim_linux.go Manager.startViaShimBy legacy accepted-legacy accepted-legacy;rev3=census-ruling-zddr3;basis=Census ruling zddr3: the Fstatfs of the opened cgroup dir is one of the identity checks that keep placement inside the subtree; they tighten it and widen no trust; the Open of that dir is the same class as the accepted-legacy Manager.startIn and placementLive under fix1-merge-review (existing agent delegated-cgroup management remains legacy); no root decision; no registry, /data, release or claim reads. Boundary: the agent's own delegated cgroup subtree (including its scratch probe child), /proc/self, and pipes to and from its own parent, running as carlos. file:Fstatfs@699,file:Open@455 d218799999581dbd6fe80b5906891b6f2d1e033d6c33423836175429d33f407a
+@legacy 95d1d262f694c674484b3a6729def30201a23ecdd3b7321d001da0bbd47fe128 internal/cgroup/shim_linux.go runShim legacy accepted-legacy accepted-legacy;rev3=census-ruling-zddr3;basis=Census ruling zddr3: the Fstatfs of the dir fd is one of the identity checks that keep placement inside the subtree; they tighten it and widen no trust; the tenant Exec is the same act as the agent's existing tenant spawn and the spec arrives from its own parent over the pipe; the Read of the release byte from the parent pipe is the same class as the accepted-legacy Manager.startIn and placementLive under fix1-merge-review (existing agent delegated-cgroup management remains legacy); no root decision; no registry, /data, release or claim reads. Boundary: the agent's own delegated cgroup subtree (including its scratch probe child), /proc/self, and pipes to and from its own parent, running as carlos. file:Exec@3014,file:Fstatfs@1305,file:Read@1927 8f164d8c1f0681064813ad4bf9e1850da0b270f9970f47e025b549b05e763a6d
+internal/cgroup/shim_linux.go runShim legacy accepted-legacy accepted-legacy;rev3=census-ruling-zddr3;basis=Census ruling zddr3: the Fstatfs of the dir fd is one of the identity checks that keep placement inside the subtree; they tighten it and widen no trust; the tenant Exec is the same act as the agent's existing tenant spawn and the spec arrives from its own parent over the pipe; the Read of the release byte from the parent pipe is the same class as the accepted-legacy Manager.startIn and placementLive under fix1-merge-review (existing agent delegated-cgroup management remains legacy); no root decision; no registry, /data, release or claim reads. Boundary: the agent's own delegated cgroup subtree (including its scratch probe child), /proc/self, and pipes to and from its own parent, running as carlos. file:Exec@3014,file:Fstatfs@1305,file:Read@1927 8f164d8c1f0681064813ad4bf9e1850da0b270f9970f47e025b549b05e763a6d
+@legacy 4b87c9076f8511fa2b55735368daa56bec6bbac3d4f183a97e3d83e4bb14ab6c internal/cgroup/shim_linux.go Manager.startShimCore legacy accepted-legacy accepted-legacy;rev3=census-ruling-zddr3;basis=Census ruling zddr3: the ReadAll and ReadBytes on the shim's status pipe are the same class as the accepted-legacy Manager.startIn and placementLive under fix1-merge-review (existing agent delegated-cgroup management remains legacy); no root decision; no registry, /data, release or claim reads. Boundary: the agent's own delegated cgroup subtree (including its scratch probe child), /proc/self, and pipes to and from its own parent, running as carlos. file:ReadAll@4798,file:ReadAll@5531,file:ReadBytes@3682 6f8213988e3058c6a28ecb2ab6163a0707559370c10def0bff6c11df145e5d37
+internal/cgroup/shim_linux.go Manager.startShimCore legacy accepted-legacy accepted-legacy;rev3=census-ruling-zddr3;basis=Census ruling zddr3: the ReadAll and ReadBytes on the shim's status pipe are the same class as the accepted-legacy Manager.startIn and placementLive under fix1-merge-review (existing agent delegated-cgroup management remains legacy); no root decision; no registry, /data, release or claim reads. Boundary: the agent's own delegated cgroup subtree (including its scratch probe child), /proc/self, and pipes to and from its own parent, running as carlos. file:ReadAll@4798,file:ReadAll@5531,file:ReadBytes@3682 6f8213988e3058c6a28ecb2ab6163a0707559370c10def0bff6c11df145e5d37
+@legacy 09b132e3d911ff8377041f276aeb9302fa5061b15b471695246ab6802004baec internal/cgroup/shim_linux.go readFull legacy accepted-legacy accepted-legacy;rev3=census-ruling-zddr3;basis=Census ruling zddr3: the Read of the spec from the parent pipe is the same class as the accepted-legacy Manager.startIn and placementLive under fix1-merge-review (existing agent delegated-cgroup management remains legacy); no root decision; no registry, /data, release or claim reads. Boundary: the agent's own delegated cgroup subtree (including its scratch probe child), /proc/self, and pipes to and from its own parent, running as carlos. file:Read@70 18102503e2e905c6d2f66bf283a1771b040901453da54de6b38187482bfb35f0
+internal/cgroup/shim_linux.go readFull legacy accepted-legacy accepted-legacy;rev3=census-ruling-zddr3;basis=Census ruling zddr3: the Read of the spec from the parent pipe is the same class as the accepted-legacy Manager.startIn and placementLive under fix1-merge-review (existing agent delegated-cgroup management remains legacy); no root decision; no registry, /data, release or claim reads. Boundary: the agent's own delegated cgroup subtree (including its scratch probe child), /proc/self, and pipes to and from its own parent, running as carlos. file:Read@70 18102503e2e905c6d2f66bf283a1771b040901453da54de6b38187482bfb35f0
+@legacy ca4a93ae17133c7672ab2c32d1c648d5fc1e3d51d22dd54447f832aa1798921c internal/cgroup/shim_linux.go cloexecFrom legacy accepted-legacy accepted-legacy;rev3=census-ruling-zddr3;basis=Census ruling zddr3: the ReadDir of /proc/self/fd is the same class as the accepted-legacy Manager.startIn and placementLive under fix1-merge-review (existing agent delegated-cgroup management remains legacy); no root decision; no registry, /data, release or claim reads. Boundary: the agent's own delegated cgroup subtree (including its scratch probe child), /proc/self, and pipes to and from its own parent, running as carlos. file:ReadDir@247 2616633acc24c5f94832c1908a5d1cb982331fb32596f8d1cfc9abb883607d7d
+internal/cgroup/shim_linux.go cloexecFrom legacy accepted-legacy accepted-legacy;rev3=census-ruling-zddr3;basis=Census ruling zddr3: the ReadDir of /proc/self/fd is the same class as the accepted-legacy Manager.startIn and placementLive under fix1-merge-review (existing agent delegated-cgroup management remains legacy); no root decision; no registry, /data, release or claim reads. Boundary: the agent's own delegated cgroup subtree (including its scratch probe child), /proc/self, and pipes to and from its own parent, running as carlos. file:ReadDir@247 2616633acc24c5f94832c1908a5d1cb982331fb32596f8d1cfc9abb883607d7d
+@legacy e92f485cac500d854b9ba8a49cf4eb16f8b5779970b91435b0cc1893713557f1 internal/cgroup/shim_linux.go ignoredSignals legacy accepted-legacy accepted-legacy;rev3=census-ruling-zddr3;basis=Census ruling zddr3: the ReadFile of /proc/self/status is the same class as the accepted-legacy Manager.startIn and placementLive under fix1-merge-review (existing agent delegated-cgroup management remains legacy); no root decision; no registry, /data, release or claim reads. Boundary: the agent's own delegated cgroup subtree (including its scratch probe child), /proc/self, and pipes to and from its own parent, running as carlos. file:ReadFile@53 2137cd40a78ffa3d19ba3791c97ad50b7faf029fa778ebd419ea66516603f063
+internal/cgroup/shim_linux.go ignoredSignals legacy accepted-legacy accepted-legacy;rev3=census-ruling-zddr3;basis=Census ruling zddr3: the ReadFile of /proc/self/status is the same class as the accepted-legacy Manager.startIn and placementLive under fix1-merge-review (existing agent delegated-cgroup management remains legacy); no root decision; no registry, /data, release or claim reads. Boundary: the agent's own delegated cgroup subtree (including its scratch probe child), /proc/self, and pipes to and from its own parent, running as carlos. file:ReadFile@53 2137cd40a78ffa3d19ba3791c97ad50b7faf029fa778ebd419ea66516603f063
+@legacy b7e7496ed98ddf3ec9adfc3e6e776a20e81b38fae822e304e9f8e5ea5e1be656 internal/cgroup/verify_linux.go Manager.VerifyPlacement legacy accepted-legacy accepted-legacy;rev3=census-ruling-zddr3;basis=Census ruling zddr3: the Statfs of the delegated root, the scratch child's memory.max and the __cgprobe self-exec of /proc/self/exe are all under the agent's own delegated root. Boundary: the agent's own delegated cgroup subtree (including its scratch probe child), /proc/self, and pipes to and from its own parent, running as carlos. file:Command@1475,file:ReadFile@2227,file:Statfs@714 932c2d38e3fa6b24a7724f2a72155d248540fb0f82d76362e04b8804f198c636
+internal/cgroup/verify_linux.go Manager.VerifyPlacement legacy accepted-legacy accepted-legacy;rev3=census-ruling-zddr3;basis=Census ruling zddr3: the Statfs of the delegated root, the scratch child's memory.max and the __cgprobe self-exec of /proc/self/exe are all under the agent's own delegated root. Boundary: the agent's own delegated cgroup subtree (including its scratch probe child), /proc/self, and pipes to and from its own parent, running as carlos. file:Command@1475,file:ReadFile@2227,file:Statfs@714 932c2d38e3fa6b24a7724f2a72155d248540fb0f82d76362e04b8804f198c636
+@legacy 22beb37296952b24cf000b4b3f6379a3e7f61761f6c9fd7237083a0a72bb1ebf internal/cgroup/cleanup_linux.go Manager.openCleanupAt legacy accepted-legacy accepted-legacy;rev3=census-ruling-zddr3;basis=Census ruling zddr3: changed legacy row; its OpenFile is the same class as the accepted-legacy Manager.startIn and placementLive under fix1-merge-review (existing agent delegated-cgroup management remains legacy); no root decision; no registry, /data, release or claim reads. Boundary: the agent's own delegated cgroup subtree (including its scratch probe child), /proc/self, and pipes to and from its own parent, running as carlos. file:OpenFile@302 dd1825275361cddc52d34652f5030d3c74d04081e823e1bc2c34c90d9abeeddd
+internal/cgroup/cleanup_linux.go Manager.openCleanupAt legacy accepted-legacy accepted-legacy;rev3=census-ruling-zddr3;basis=Census ruling zddr3: changed legacy row; its OpenFile is the same class as the accepted-legacy Manager.startIn and placementLive under fix1-merge-review (existing agent delegated-cgroup management remains legacy); no root decision; no registry, /data, release or claim reads. Boundary: the agent's own delegated cgroup subtree (including its scratch probe child), /proc/self, and pipes to and from its own parent, running as carlos. file:OpenFile@302 dd1825275361cddc52d34652f5030d3c74d04081e823e1bc2c34c90d9abeeddd
+@legacy b2323851f8abd44a94b29e78db9bf5bb80a1247e6172d74232c4fbae4e2c5572 internal/activator/backend_exec.go ExecBackend.StartWorkerStaged legacy accepted-legacy accepted-legacy;rev3=census-ruling-zddr3;basis=Census ruling zddr3: changed legacy row (comment-only change describing the shim placement); the same class as the accepted-legacy Manager.startIn and placementLive under fix1-merge-review (existing agent delegated-cgroup management remains legacy); no root decision; no registry, /data, release or claim reads. Boundary: the agent's own delegated cgroup subtree (including its scratch probe child), /proc/self, and pipes to and from its own parent, running as carlos. file:Command@3507,registry:Args@227,registry:Args@378,registry:Host@1388,registry:Host@2610,registry:Host@3629,registry:Host@369,registry:Host@4515,registry:Host@473,registry:Host@589,registry:Host@685,whole:Route@1148,whole:Route@1692,whole:Route@2238,whole:Route@3459,whole:Route@3590,whole:Route@4356,whole:Route@4446 f6e9b917b370986421fbc258dc95a723a6f4fb55bbd18b13f061129aa36ea89e
+internal/activator/backend_exec.go ExecBackend.StartWorkerStaged legacy accepted-legacy accepted-legacy;rev3=census-ruling-zddr3;basis=Census ruling zddr3: changed legacy row (comment-only change describing the shim placement); the same class as the accepted-legacy Manager.startIn and placementLive under fix1-merge-review (existing agent delegated-cgroup management remains legacy); no root decision; no registry, /data, release or claim reads. Boundary: the agent's own delegated cgroup subtree (including its scratch probe child), /proc/self, and pipes to and from its own parent, running as carlos. file:Command@3507,registry:Args@227,registry:Args@378,registry:Host@1388,registry:Host@2610,registry:Host@3629,registry:Host@369,registry:Host@4515,registry:Host@473,registry:Host@589,registry:Host@685,whole:Route@1148,whole:Route@1692,whole:Route@2238,whole:Route@3459,whole:Route@3590,whole:Route@4356,whole:Route@4446 f6e9b917b370986421fbc258dc95a723a6f4fb55bbd18b13f061129aa36ea89e
+@legacy 6a1b077906f03ba5b111c525310be6b60aff1b294d3ddaec6bcf84f1364838d5 internal/activator/backend_exec.go ExecBackend.spawnChildFrom legacy accepted-legacy accepted-legacy;rev3=census-ruling-zddr3;basis=Census ruling zddr3: changed legacy row (comment-only change describing the shim placement); the same class as the accepted-legacy Manager.startIn and placementLive under fix1-merge-review (existing agent delegated-cgroup management remains legacy); no root decision; no registry, /data, release or claim reads. Boundary: the agent's own delegated cgroup subtree (including its scratch probe child), /proc/self, and pipes to and from its own parent, running as carlos. file:Command@9682,registry:Host@10964,registry:Host@11058,registry:Host@164,registry:Host@3773,registry:Host@3828,registry:Host@3908,registry:Host@4006,registry:Host@4127,whole:Route@10079,whole:Route@11355,whole:Route@11447,whole:Route@1602,whole:Route@1864,whole:Route@193,whole:Route@4321,whole:Route@6392,whole:Route@8365,whole:Route@9628 2ca8591aed976f81f770a3fdc96499393d59936ede24cb42a79f5aa3dd017ae8
+internal/activator/backend_exec.go ExecBackend.spawnChildFrom legacy accepted-legacy accepted-legacy;rev3=census-ruling-zddr3;basis=Census ruling zddr3: changed legacy row (comment-only change describing the shim placement); the same class as the accepted-legacy Manager.startIn and placementLive under fix1-merge-review (existing agent delegated-cgroup management remains legacy); no root decision; no registry, /data, release or claim reads. Boundary: the agent's own delegated cgroup subtree (including its scratch probe child), /proc/self, and pipes to and from its own parent, running as carlos. file:Command@9682,registry:Host@10964,registry:Host@11058,registry:Host@164,registry:Host@3773,registry:Host@3828,registry:Host@3908,registry:Host@4006,registry:Host@4127,whole:Route@10079,whole:Route@11355,whole:Route@11447,whole:Route@1602,whole:Route@1864,whole:Route@193,whole:Route@4321,whole:Route@6392,whole:Route@8365,whole:Route@9628 2ca8591aed976f81f770a3fdc96499393d59936ede24cb42a79f5aa3dd017ae8
+@remove internal/cgroup/cgroup_linux.go placementLive
+@removed internal/cgroup/cgroup_linux.go placementLive H3 census-ruling-zddr3: placement verification moved into the agent's exec shim; its reads are accepted-legacy rows in this overlay.
+@remove internal/cgroup/cgroup.go Manager.startIn
+@removed internal/cgroup/cgroup.go Manager.startIn H3 census-ruling-zddr3: no longer reads; cgroup placement moved into the agent's exec shim (accepted-legacy rows in this overlay).
+# Envelopes, census ruling zddr3: each changed root source envelope below is accepted only because the units inside it are the ones listed above; boundary: the agent's own delegated cgroup subtree (including its scratch probe child), /proc/self, and pipes to and from its own parent, running as carlos.
+@coverage . f1e899cdd021baecbf67a2458be91fcf82baa0510f0af863942f7f510cce9519
+@coverage cmd/zddprobe ba4960a38c316deb4032b5569bf7ed9aa3c762262e560b351f43c73fbc3a64e2
+@coverage internal/activator aaa8f424e27268dcc8c53cacc711cbbd6bab1b96f5905523bca609fa22a7abe4
+@coverage internal/cgroup 6fbf28661b36f73d612e4af02efbccd6a6567be3d2a987de6178fd407f8eaaac
+@coverage internal/host 834daf0443763909fe447fb029891d129ac9e178c8bace1915cf6e5f25b5f68f
+@coverage internal/instancectl 0a4b786ac0b7eb01285fb51bc2711abd87e53eaf33e6d881a6cc3a8683289416
+@coverage internal/rolloutwords 0ec71bcebe6e5573ef8bb3e520228bc7f1fdb02feab0788d8cad3a1f2997b02e
+@coverage internal/status f1b105f9144165c6a03ffc7d06f60fe4b9de74454ba540a9c5909e72b7e6b67e