Skip to content

[PLT.46] Publish the four Security packages and record package-level integration evidence - #176

Merged
deku2026 merged 3 commits into
mainfrom
task/plt-46
Oct 11, 2026
Merged

deku2026 merged 3 commits into
mainfrom
task/plt-46

Conversation

@deku2026

Copy link
Copy Markdown
Contributor

Publish the four ArcForges Security packages and record package-level real-integration evidence (WP-11.90 package acceptance). This is a selected row of the Final.md scope.

Claim: PLT.46 epoch 1 (w-deku-20261010-plt-46)

Task record: Design docs/planning/delivery/delivery-graph.json PLT.46. Coordinator ruling S52 (brief section 12) narrows it to the four Security packages: helper, broker and per-RID helper packaging is out of scope and not completed. Planning repair fix8 carries the record text, and this PR merges after fix8.

Commits

  • 4a5e1ee adds a new exact-row gitleaks block (S52(2)) for the successor Security.Secrets csproj digest lines in dependency-policy.json and in receipt plt-46-r1. No existing block changes and the any-receipt group is not widened. eng/test_dependency_policy.py registers the block, with positive and negative controls, and moves the active-digest pin while keeping the historical one.
  • d1bb49c: IsPackable on ArcForges.Security, Security.Audit, Security.Secrets and Security.CapabilityEnforcement, with the ArcForges.Contributions pack-metadata pattern (S52(3)): PackageReadmeFile, README/LICENSE/NOTICE pack items, None Remove Tests/** where a Tests folder exists, and a Description where one was missing. It has no PackageId, reference or version change. The commit also adds four rows to eng/packaging/packages.json, the reconciliation blob refreshes, the dependency input rebinding, the immutable receipt plt-46-r1 (chained from nat-11-r1 with an unchanged closure; reviewer w-deku-20261010-rev-plt-46) and the files.json row.
  • 61e11b7 records the pack and clean-consumer evidence in plt-46-r1.

ADP-07 supporting files (beyond the record writes)

  • .gitleaks.toml and eng/test_dependency_policy.py (S52(2)).
  • eng/test_desktop_rids.py: the active-receipt pin moves from nat-11-r1 to plt-46-r1, and the chain check now also covers gov-30-r1 (the NAT.11 D5 precedent). Intermediate commit d1bb49c fails this test, and 61e11b7 fixes it, so the history is not bisect-clean at that one commit.
  • The three Security READMEs carry factual packaging-status lines, because they ship as the package readmes.

Evidence (local, under CI conditions; hosted CI is authoritative)

  • Locked restore, format, a Release build, every pr-gate Python policy job, ArchitectureTests and the Security/Audit/Secrets/Capabilities suites.
  • A pack of the six projects from the exact commit: the nuspec dependency sets match the generated rows.
  • A local opt-in clean consumer, outside any checkout, with its own feed of only the owned ids. It ran a locked restore with warnings as errors, a JIT run and a Native AOT win-x64 publish and run, and the restored bytes equal the candidate bytes. Through the package boundary it exercised:
    • cross-boundary owner refusal through CapabilityEnforcementGate over the real CapabilityInvocationPipeline;
    • stale approval and lease revocation;
    • SecretBroker use without reveal;
    • a real AuditStore with the egress and lease sinks, read back, and a failing store refusing the transfer.
  • gitleaks (pinned image, WSL Docker, full history): 0.
  • Not proven:
    • The hosted candidate and the published bytes, until the main-push Publish NuGet run.
    • OS isolation, which is cross-referenced from PLT.45 (Windows). Linux is "blocked on a real Linux-kernel run of the PLT.45 profile, not proven". macOS is never claimed.
    • Durable audit of registry capabilities, because of a defect found here: AuditCapabilityId accepts only lowercase canonical keys, so the registry keys (for example IChatOperations.AppendUserMessage) fail closed. This is a WP-11 contract defect between the PLT.44 audit model and the registry/PLT.57 gate, and it is outside these writes. The coordinator assigns its fix before APP.03 composes durable audit with the gate. PLT.46 is therefore recorded delivered, not complete.

Notes

  • Pre-existing, not caused by this PR: a Windows-only test isolation race in TracePolicyTests (the process-wide ActivityListener). It passes on Linux and hosted CI runs Linux. Also pre-existing: the actionlint queue key in publish-nuget.yml.
  • Lockstep publication (RES-desktopplatform-package-inventory): the main-push Publish NuGet run publishes every package at one version.

🤖 Generated with Claude Code

deku2026 and others added 3 commits October 10, 2026 21:31
… lines

The PLT.46 IsPackable flip changes the ArcForges.Security.Secrets.csproj
SHA-256 to 7282dd20...bff. Its inputHashes lines (dependency-policy.json at
4 and 6 spaces; receipt plt-46-r1 at 6 spaces) are generic-api-key false
positives of the PLT.40 class. Under ruling S52(2) a new [[allowlists]]
block (targetRules generic-api-key, condition AND, regexTarget line) binds
exactly eng/policy/dependency-policy.json and
eng/policy/dependency-reviews/plt-46-r1.json to the two exact whole-line
regexes for the new digest. No existing block changes; the any-receipt
group is not widened.

eng/test_dependency_policy.py registers the block (count 5, exact tuple),
keeps the historical digest pins and adds the active one, checks the
actual csproj digest is one of them, allows the active line only in the
PLT.46 receipt, and adds positive controls (same key with another 64-hex
digest still fires; the same line under another path still fires) and
negative controls (swapped or altered keys, trailing text, indentation,
other rule). The actual files still carry the historical lines until the
admission commit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Enable packing for ArcForges.Security, ArcForges.Security.Secrets,
ArcForges.Security.Audit and ArcForges.Security.CapabilityEnforcement
with the ArcForges.Contributions pack metadata pattern (ruling S52(3)):
PackageReadmeFile, README/LICENSE/NOTICE.md pack items, test folders
removed from pack content and a Description where missing.
CapabilityEnforcement packs the parent Security README. Package IDs are
the existing assembly names.

Append the four managed rows to eng/packaging/packages.json with the
dependency sets generated by dotnet pack (Contracts.Foundation
1.0.0-ci.216.1 for all four, Microsoft.Data.Sqlite 10.0.12 for Audit).

Supporting files (ADP-07): factual packaging lines in the Security,
Security.Audit and Security.Secrets READMEs (they ship as package
readmes); the four csproj blobs in the active reconciliation inventory;
dependency-policy.json input hashes (four csproj files and
packages.json), review mirror and reviewReceipt; the new immutable
receipt eng/policy/dependency-reviews/plt-46-r1.json chained from
nat-11-r1 (reviewer w-deku-20261010-rev-plt-46, decision approved,
closure unchanged at 58 NuGet and 10 Python coordinates) and its
eng/provenance/files.json row. No lock, reference or version changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Correct the compilation, aot-trim, security-sbom and
runtime-performance-migration upgrade checks of the receipt added by
this change (and its mirror in eng/policy/dependency-policy.json) with
what actually ran; no dependency input, hash or closure changes.

- Pack at source commit d1bb49c (RepositoryCommit), version
  1.0.0-ci.local.46: the six packages match their catalogue rows, carry
  the AGPL-3.0-only expression, README, LICENSE and NOTICE.md, one
  lib/net10.0 assembly each and no ContentSandbox, Native, parser or
  LocalRpcBoundary content.
- One local opt-in clean consumer outside every checkout (source
  mapping to the candidate for the six owned IDs, lock and locked
  restore, warnings as errors): restored bytes equal the candidate,
  every external lock coordinate is in the receipt closure with the
  same content hash, and 136 of 136 checks pass under the JIT and as a
  Native AOT win-x64 executable (owner refusal at final validation,
  foreign capabilities, owner side without the gate, revision, lease
  and service-decision staleness between authorization and owner
  validation, mismatched and expired approvals, replay and withdrawn
  permission, egress, SecretBroker use without reveal, redaction and
  sibling denial including the opt-in Credential Manager round trip,
  and the durable AuditStore through EgressAuditSink and
  CapabilityLeaseEventAuditSink with a failing store refusing).
- Finding recorded: registry capability keys are not canonical audit
  capability keys, so the durable audit sinks refuse them and the gate
  composition fails closed for registry capabilities.
- OS isolation cross-referenced from PLT.45 (Windows); Linux blocked on
  a real Linux-kernel run of the PLT.45 profile, not proven; macOS not
  claimed.

Supporting file (ADP-07): eng/test_desktop_rids.py moves its active
receipt pin from nat-11-r1 to plt-46-r1 and keeps the GOV.30 receipt in
the checked predecessor chain (the NAT.11 e4c7ba5 precedent); without
it the hosted dependency job fails on the receipt added by this change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@deku2026

Copy link
Copy Markdown
Contributor Author

Independent review record: PLT.46 epoch 1. Reviewer w-deku-20261010-rev-plt-46 (Opus 5.5), an independent session that authored nothing.

Reviewed 61e11b7 for [PLT.46] epoch 1: approved.

Verified:

  • All 15 changed paths are record writes or ADP-07/S52 supporting files.
  • Receipt plt-46-r1 names this reviewer (decision approved, reviewedOn 2026-10-10), chains from nat-11-r1 (the receipt active on main), equals the policy mirror, and leaves the NuGet (58) and Python (10) closures unchanged. Only the four csproj files and packages.json changed as inputs.
  • The gitleaks block follows the S52(2)/S50(3) form.
  • The pack metadata is exactly the Contributions pattern. Package IDs equal the existing assembly names.
  • Gates re-run under CI conditions in a fresh clone: the pr-gate Python jobs, managed build and tests, and pack. I ran my own clean consumer and gitleaks; both are clean.

Non-blocking (for the record):

  • Durable audit defect. AuditCapabilityId accepts only lowercase canonical keys, so registry-key capabilities fail closed in the durable audit sinks behind the gate. I reproduced this independently. It is recorded honestly in plt-46-r1. PLT.46 is delivered, not complete. The coordinator must assign an owner before APP.03.
  • eng/test_desktop_rids.py is an ADP-07 supporting edit and is listed in the PR body.
  • ContentSandbox READMEs outside the writes still say "non-packable until PLT.46". Route them to fix8.
  • A pre-existing Windows-only TracePolicyTests isolation race (passes on Linux and in hosted CI).
  • The pre-existing actionlint queue key.

@deku2026
deku2026 merged commit fb8577c into main Oct 11, 2026
22 checks passed
@deku2026
deku2026 deleted the task/plt-46 branch October 12, 2026 01:27
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.

1 participant