Skip to content

fix(release,dif): resync changelog and harden logistic controls - #998

Merged
seonghobae merged 18 commits into
mainfrom
fix/release-resync-current-review-971
Aug 25, 2026
Merged

fix(release,dif): resync changelog and harden logistic controls#998
seonghobae merged 18 commits into
mainfrom
fix/release-resync-current-review-971

Conversation

@seonghobae

@seonghobae seonghobae commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Closes #958.
Supersedes #971 and incorporates the former #959 logistic-DIF lane as one current-review landing unit.

Release-resync scope

  • remove stale docs/changelog.d/release-0.8.0-cut.md;
  • regenerate CHANGELOG.md so post-cut fragments appear once under Unreleased;
  • preserve the released ## [0.8.0] - 2026-08-17 section.

Logistic-DIF control hardening

The inherited #959 slice established callback-free semantic-control admission before caller response/group materialization and before compiled-core discovery while keeping logistic-regression, Mantel-Haenszel, purification, BH, effect-size, convergence and result arithmetic Rust-owned.

A compatibility pass found an over-narrowed public/native domain in that inherited implementation: exact numpy.bool_ was rejected even though the historical public bool conversion accepted it.

Test-first compatibility remediation

  • RED a8621145ddce90b3267b3e9a2a85ff7ee54a7b5e: prove exact numpy.bool_ control compatibility for unpurified and purified logistic DIF, with exact built-in primitives at the Rust boundary.
  • GREEN da8cd3ef23a7b489d83e387473ee19000b2fbbe9: admit exact built-in/NumPy Boolean controls, keep max_rounds >= 1, keep min_anchor_items >= 0, and continue rejecting subclasses/protocol providers before callbacks.
  • Regression alignment 7bc9277249c575794404ad4d68ca79900d91dfb0: align inherited negative tests with the authoritative native domains and use numpy.bool_ in the supported-NumPy dispatch proof.
  • Exact-current public-surface proof 09f6269fd6f6e8bdb80a37feaec994776ab3f7ea: verify the hardened package-level DIF aliases resolve to the same current implementations; this successor is test-only and does not change statistical behavior.
  • Merge-forward 50d7c9d820c25caf2fd5954c2ca5359f9b1cb3f3: merge current main to resolve the accumulated changelog-fragment (CHANGELOG.md, regenerated via scripts/render_changelog_fragments.py --update from the merged docs/changelog.d/*.md set) and package-init (python/fast_mlsirm/__init__.py, combining this branch's DIF control-safety install with main's independently landed exposure control-safety install) conflicts.
  • Trust-boundary correction f25c9a78eb6151342198942292972bc2d0873d11: a Devin AI review on this PR found that the wrappers admitted max_iter=0 at the Python boundary (minimum=0), even though the native logistic_sweep (crates/mlsirm-core/src/dif.rs) rejects max_iter == 0 with "max_iter must be >= 1", and this module's own doctoring already documented max_iter as a positive usize control. A zero cap therefore cleared validation, materialized caller arrays, and only failed deep inside the compiled core. Raised the minimum to 1 for both safe_logistic_dif and safe_logistic_dif_purified so rejection happens before data materialization or core discovery, and updated/added regressions accordingly.
  • Idempotency guard a706bc96519659ca4643b84c0305fe1af4aa63d5: made _dif_control_safety.install() a no-op on repeated calls (marker-attribute guard on the wrapper functions, matching the established _icc_control_safety.py precedent) so re-importing or re-installing the package cannot stack another validation layer onto an already-hardened dif module.
  • Merge-forward b4cdb8799369cede50486123d8e11f5f13c0f1d0: merge current main (through PR fix(ci): pin grm-recovery rust toolchain and align metadata scalar test #1324's CI-contract-drift fixes — the grm-recovery Rust toolchain pin and the metadata string-subclass normalization test) to keep this branch tracking the protected base with no further conflicts.
  • Merge-forward 666bd4c8f36ffb32a75b4fc497a37f3ac0815f68: merge current main (through the v0.9.0 release cut and subsequent independently-merged PRs) to keep this branch tracking the protected base with no further conflicts.
  • Merge-forward 2 6cb730cec8c10d35d8f9250574a16f23b5ada93c: merge current main combining this branch's DIF control-safety install with main's newly landed CAT administration (fix(cat): seal administration evidence before NumPy protocols #1345) and fitstats S-X² (fix(fitstats): seal S-X² scalar control admission #1029) installs in python/fast_mlsirm/__init__.py; CHANGELOG.md regenerated from the merged fragment set.

No statistical formula, estimand, BH behavior, purification arithmetic, or result schema changed.

Verification boundary

Protected base: main@f5d6189227545b42d3f384b4728c8d6f611063c7.
Exact current head: 6cb730cec8c10d35d8f9250574a16f23b5ada93c, open, non-Draft and mergeable pending review/checks.

Every predecessor-head check/review is historical after each merge-forward. Evaluate exact-current-head repository CI/security/static analysis plus every protected central coverage/review/package/SBOM/provenance requirement before merge. No force-push, review dismissal, self-approval, or gate weakening is used.

claude added 3 commits August 17, 2026 11:41
PRs merged after the v0.8.0 release-cut PR (#966) added new
docs/changelog.d fragments without re-running the renderer, and the
already-released release-0.8.0-cut.md fragment was left in place,
duplicating the 0.8.0 section under Unreleased. Delete the stale
fragment and re-render so render_changelog_fragments.py --check passes
again, unblocking the v0.8.0 release-tag dispatch.
Ten more PRs merged into main after this fix's original commit, each
adding docs/changelog.d fragments without re-running the renderer.
Re-run render_changelog_fragments.py --update so --check passes again
and the v0.8.0 release-tag dispatch is no longer blocked.
@coderabbitai

coderabbitai Bot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 5f8170c8-cbfd-489f-b5c6-d397ae7a13ac

📥 Commits

Reviewing files that changed from the base of the PR and between 04d0bc2 and 40b8aa8.

📒 Files selected for processing (2)
  • CHANGELOG.md
  • docs/changelog.d/release-0.8.0-cut.md
💤 Files with no reviewable changes (1)
  • docs/changelog.d/release-0.8.0-cut.md

Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review.


📝 Walkthrough

Walkthrough

The changelog now documents new validation and safety behavior for item banks, equating, workflows, metadata, scoring, agreement statistics, and parallel analysis. It also removes the former unreleased 0.8.0 release-cut notes.

Changes

Changelog updates

Layer / File(s) Summary
Unreleased behavior and security notes
CHANGELOG.md
The Unreleased section records evidence binding, equating controls, fail-closed contextual effects, retry behavior, metadata safety, integer validation, and parallel-analysis safeguards.
Release-cut note removal
CHANGELOG.md
The former unreleased [0.8.0] release-cut notes were removed.

Estimated code review effort: 1 (Trivial) | ~5 minutes

Merge Risk: ⚪ Minimal · up to 40b8a

This PR only removes a stale changelog fragment and regenerates CHANGELOG.md without changing product or runtime behavior; no actionable merge-blocking risk remains beyond normal checks.

Possibly related PRs

Suggested reviewers: claude

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately identifies the changelog resynchronization and references the documented control hardening changes.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/release-resync-current-review-971

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Copy link
Copy Markdown
Contributor Author

@opencode-agent Please review exact current head 40b8aa8fff661647d3de8ed2de9def03f680ec89 against live main, with fresh coverage/docstring evidence. Do not transfer predecessor #971 review/check results. This PR is documentation/changelog-only and branch protection currently requires an approval from someone other than the last pusher.

Copy link
Copy Markdown
Contributor Author

@cwl-noema-review Please independently review exact current head 40b8aa8fff661647d3de8ed2de9def03f680ec89 against live main. This lane is changelog-only; verify the released 0.8.0 section is preserved, stale release-cut material is removed, and current Unreleased fragments are represented once. Do not transfer predecessor #971 evidence.

@opencode-agent opencode-agent Bot 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.

Pull request overview

OpenCode cannot approve yet because required coverage evidence did not pass.

Review outcome

1. HIGH .github/workflows/opencode-review.yml:1 - Coverage evidence did not prove required test/docstring evidence

  • Problem: The required coverage-evidence job result was failure, so OpenCode cannot establish approval sufficiency for this head.

  • Root cause: Automated approval is only valid when the same-head coverage-evidence job proves supported repository test suites passed and configured docstring gates passed or were advisory, or reports not applicable because no supported source files or package manifests exist. Missing, failed, skipped, unavailable, or unsupported-tooling test evidence is a blocker.

  • Fix: Install or configure the repository test/docstring evidence tooling when source files or package manifests exist, rerun the current-head coverage-evidence job, and approve only after it reports success with required evidence or explicit no-source not-applicable evidence.

  • Regression test: Keep the approval branch checking needs.coverage-evidence.result == success before posting APPROVE, and publish REQUEST_CHANGES when coverage-evidence blocker states such as cancelled, skipped, failed, unsupported-tooling, or below-100 evidence are present.

  • Result: REQUEST_CHANGES

  • Reason: coverage-evidence result was failure, so required test/docstring evidence was not proven for current head 40b8aa8fff661647d3de8ed2de9def03f680ec89.

  • Head SHA: 40b8aa8fff661647d3de8ed2de9def03f680ec89

  • Workflow run: 32213311198

  • Workflow attempt: 1

Coverage evidence

Coverage evidence job did not run or did not publish coverage evidence.

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Changed file: CHANGELOG.md"]
  S1 --> I1["repository behavior"]
  I1 --> R1["Review risk: Changed file: CHANGELOG.md"]
  R1 --> V1["required checks"]
  Evidence --> S2["Docs: release-0.8.0-cut.md"]
  S2 --> I2["operator or user guidance"]
  I2 --> R2["Review risk: Docs: release-0.8.0-cut.md"]
  R2 --> V2["docs review"]
Loading

@opencode-agent

Copy link
Copy Markdown
Contributor

OpenCode Review Overview

  • Head SHA: 40b8aa8fff661647d3de8ed2de9def03f680ec89
  • Workflow run: 32213311198
  • Workflow attempt: 1
  • Gate result: REQUEST_CHANGES (approval step)

Pull request overview

OpenCode cannot approve yet because required coverage evidence did not pass.

Review outcome

1. HIGH .github/workflows/opencode-review.yml:1 - Coverage evidence did not prove required test/docstring evidence

  • Problem: The required coverage-evidence job result was failure, so OpenCode cannot establish approval sufficiency for this head.

  • Root cause: Automated approval is only valid when the same-head coverage-evidence job proves supported repository test suites passed and configured docstring gates passed or were advisory, or reports not applicable because no supported source files or package manifests exist. Missing, failed, skipped, unavailable, or unsupported-tooling test evidence is a blocker.

  • Fix: Install or configure the repository test/docstring evidence tooling when source files or package manifests exist, rerun the current-head coverage-evidence job, and approve only after it reports success with required evidence or explicit no-source not-applicable evidence.

  • Regression test: Keep the approval branch checking needs.coverage-evidence.result == success before posting APPROVE, and publish REQUEST_CHANGES when coverage-evidence blocker states such as cancelled, skipped, failed, unsupported-tooling, or below-100 evidence are present.

  • Result: REQUEST_CHANGES

  • Reason: coverage-evidence result was failure, so required test/docstring evidence was not proven for current head 40b8aa8fff661647d3de8ed2de9def03f680ec89.

  • Head SHA: 40b8aa8fff661647d3de8ed2de9def03f680ec89

  • Workflow run: 32213311198

  • Workflow attempt: 1

Coverage evidence

Coverage evidence job did not run or did not publish coverage evidence.

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Changed file: CHANGELOG.md"]
  S1 --> I1["repository behavior"]
  I1 --> R1["Review risk: Changed file: CHANGELOG.md"]
  R1 --> V1["required checks"]
  Evidence --> S2["Docs: release-0.8.0-cut.md"]
  S2 --> I2["operator or user guidance"]
  I2 --> R2["Review risk: Docs: release-0.8.0-cut.md"]
  R2 --> V2["docs review"]
Loading

@opencode-agent
opencode-agent Bot disabled auto-merge August 19, 2026 04:58

Copy link
Copy Markdown
Contributor Author

@opencode-agent review
@cwl-noema-review review

Fresh re-review request: ContextualWisdomLab/.github#1136 has merged, fixing the central coverage-evidence bug (_install_trusted_uv() target-triple validation) that caused the prior REQUEST_CHANGES verdict on this PR. Please re-review exact current head 40b8aa8fff661647d3de8ed2de9def03f680ec89 — the underlying infrastructure blocker is now resolved on .github main. Do not transfer evidence from any prior head.


Generated by Claude Code

Copy link
Copy Markdown
Contributor Author

@opencode-agent Please re-review unchanged exact head 40b8aa8fff661647d3de8ed2de9def03f680ec89 using the current central workflow. The current formal REQUEST_CHANGES is coverage-only and came from run 32213311198 before the central trusted-uv verification fix landed. ContextualWisdomLab/.github protected main now contains #1136 at 9e9f59f3ac1e96a960c021b131d768c238f4c21a, correcting the release binary's actual uv 0.12.1 (x86_64-unknown-linux-gnu) version output. Reacquire same-head coverage/review evidence; do not transfer the frozen predecessor workflow result.

@seonghobae
seonghobae enabled auto-merge (squash) August 19, 2026 10:16

Copy link
Copy Markdown
Contributor Author

@opencode-agent Please re-review unchanged exact head 40b8aa8fff661647d3de8ed2de9def03f680ec89 against live main@04d0bc21a2a20693bcf16108cd76d394fe844d23. Repository CI, Security Scan, CodeQL, and Semgrep are terminal-success on this exact tree. The current formal CHANGES_REQUESTED is central coverage run 32213311198, from before .github main advanced to 9e9f59f3ac1e96a960c021b131d768c238f4c21a (fix(ci): verify trusted uv target-triple output (#1136), 2026-08-19T09:24:32Z), which directly repairs the trusted-uv materialization boundary that blocked review before target-repository code execution. Please regenerate same-head coverage/formal review evidence under the current central contract; do not carry the prior infrastructure verdict forward.

@opencode-agent
opencode-agent Bot disabled auto-merge August 19, 2026 12:16
@seonghobae
seonghobae enabled auto-merge (squash) August 19, 2026 13:09
@opencode-agent
opencode-agent Bot disabled auto-merge August 19, 2026 13:58

Copy link
Copy Markdown
Contributor Author

@opencode-agent review
@cwl-noema-review review

Re-dispatch unchanged exact head 40b8aa8fff661647d3de8ed2de9def03f680ec89 under central .github@bbedc1a51ec1a2421f129955c629b3cd0507a4ec. Repository CI, Security Scan, CodeQL, and Semgrep are terminal-success and inline threads are empty. The sole formal CHANGES_REQUESTED came from central coverage run 32213311198 before #1136's trusted-uv correction; central main now also includes #1140's OIDC permission repair for scheduler callers. Generate fresh same-head coverage/formal review evidence without transferring the old infrastructure verdict.

@seonghobae seonghobae closed this Aug 19, 2026
@seonghobae seonghobae reopened this Aug 19, 2026
@seonghobae seonghobae closed this Aug 19, 2026
@seonghobae seonghobae reopened this Aug 19, 2026
@seonghobae
seonghobae marked this pull request as draft August 19, 2026 18:31
@seonghobae
seonghobae marked this pull request as ready for review August 19, 2026 18:31
@seonghobae

Copy link
Copy Markdown
Contributor Author

@opencode-agent review
@cwl-noema-review review

Re-review exact current head 40b8aa8fff661647d3de8ed2de9def03f680ec89 against protected main base 04d0bc21a2a20693bcf16108cd76d394fe844d23; disregard stale coverage-era review states. The release synchronization patch passes python scripts/render_changelog_fragments.py --check CHANGELOG.md and git diff --check on the exact head. Please confirm the changelog aggregate remains authoritative before merge.

@seonghobae
seonghobae enabled auto-merge (squash) August 20, 2026 04:35
* test(dif): expose executable logistic controls

* fix(dif): normalize controls before data and Rust

* fix(dif): install hardened public DIF adapters

* docs(changelog): record logistic DIF control boundary

* docs(doctoring): trace logistic DIF control trust boundary

* fix(changelog): classify logistic DIF control boundary

---------

Co-authored-by: Claude <noreply@anthropic.com>
@seonghobae

Copy link
Copy Markdown
Contributor Author

@opencode-agent review
@cwl-noema-review review

Re-review updated exact current head 3beb7c48b3669feaa5405ff0016283026f4a7d? against protected main base 04d0bc21a2a20693bcf16108cd76d394fe844d23; this head includes the merged logistic-DIF child. Use current source and Checks only. The exact-head changelog renderer check and git diff --check pass.

@opencode-agent
opencode-agent Bot disabled auto-merge August 24, 2026 15:15
…rrent-review-971

Pulls in #1324 (grm-recovery toolchain pin + metadata scalar test
realignment), now merged to main, resolving the two pre-existing CI
regressions this branch had been carrying independently of its own
diff. Regenerated CHANGELOG.md via
scripts/render_changelog_fragments.py --update to resolve the
conflict from the merged fragment set.
@opencode-agent

Copy link
Copy Markdown
Contributor

Scheduled review-feedback autofix for this PR head.

  • Head SHA: a706bc96519659ca4643b84c0305fe1af4aa63d5

@seonghobae
seonghobae enabled auto-merge (squash) August 24, 2026 15:27
@seonghobae seonghobae closed this Aug 25, 2026
auto-merge was automatically disabled August 25, 2026 01:42

Pull request was closed

@seonghobae seonghobae reopened this Aug 25, 2026
@seonghobae seonghobae closed this Aug 25, 2026
@seonghobae seonghobae reopened this Aug 25, 2026
# Conflicts:
#	python/fast_mlsirm/__init__.py
@seonghobae

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 25, 2026

Copy link
Copy Markdown
Contributor
⚠️ Action not completed

Review rate limited.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@seonghobae
seonghobae enabled auto-merge August 25, 2026 05:27
seonghobae added a commit that referenced this pull request Aug 25, 2026
Pin the baseline to protected main@9c12eab1 (v0.9.0). The open-PR queue
collapsed from 74 to 6 since the previous snapshot; replace the stale PR
table with the current six lanes (#1363, #1345, #1279, #1029, #1005, #998)
including their merge-forward state. Update gap-matrix evidence columns for
landed work: automatic Rust backend (#951/#1070), crossed multiple-membership
(#1014), the Figma design-boundary ADR now at docs/adr/0016 via merged
#1130, and cross-engine conformance (#1082) after #1077 closed as completed.
No production code, formula, estimator, or release surface changed.
@opencode-agent
opencode-agent Bot disabled auto-merge August 25, 2026 05:49
@seonghobae

Copy link
Copy Markdown
Contributor Author

Merge-forward 2: combined this branch's DIF control-safety install with main's newly landed CAT administration (#1345) and fitstats S-X² (#1029) installs in python/fast_mlsirm/__init__.py; CHANGELOG.md regenerated from the merged fragment set (--check passes). Merge commit 6cb730ce; predecessor-head reviews/checks are historical.

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Devin Review found 1 new potential issue.

Open in Devin Review

Comment thread python/fast_mlsirm/_dif_control_safety.py
@seonghobae
seonghobae merged commit 897e1c7 into main Aug 25, 2026
37 of 38 checks passed
@seonghobae
seonghobae deleted the fix/release-resync-current-review-971 branch August 25, 2026 10:36
seonghobae added a commit that referenced this pull request Aug 25, 2026
* fix(release): resync CHANGELOG fragments after v0.8.0 cut

PRs merged after the v0.8.0 release-cut PR (#966) added new
docs/changelog.d fragments without re-running the renderer, and the
already-released release-0.8.0-cut.md fragment was left in place,
duplicating the 0.8.0 section under Unreleased. Delete the stale
fragment and re-render so render_changelog_fragments.py --check passes
again, unblocking the v0.8.0 release-tag dispatch.

* fix(release): re-render CHANGELOG fragments for v0.8.0 aggregate

Ten more PRs merged into main after this fix's original commit, each
adding docs/changelog.d fragments without re-running the renderer.
Re-run render_changelog_fragments.py --update so --check passes again
and the v0.8.0 release-tag dispatch is no longer blocked.

* fix(dif): harden logistic and purification controls (#959)

* test(dif): expose executable logistic controls

* fix(dif): normalize controls before data and Rust

* fix(dif): install hardened public DIF adapters

* docs(changelog): record logistic DIF control boundary

* docs(doctoring): trace logistic DIF control trust boundary

* fix(changelog): classify logistic DIF control boundary

---------

Co-authored-by: Claude <noreply@anthropic.com>

* test(dif): preserve native zero-iteration and NumPy bool domains

* fix(dif): preserve native control compatibility

* test(dif): align regressions with native control domains

* test(dif): prove hardened package aliases on landing lane

* fix(dif): reject max_iter=0 before native discovery in logistic DIF wrappers

safe_logistic_dif and safe_logistic_dif_purified normalized max_iter with
minimum=0, admitting zero at the Python boundary even though the native
logistic_sweep (crates/mlsirm-core/src/dif.rs) rejects max_iter == 0 with
"max_iter must be >= 1", and the module's own doctoring already documented
max_iter as a positive usize control. A zero cap therefore cleared control
validation, materialized caller response/group arrays, and dispatched to
the compiled core before failing there instead of being rejected up front
(Devin AI review finding on PR #998).

Raise the minimum to 1 for both wrappers so the rejection happens before
data materialization or core discovery, matching the documented and
native domains. Updated the compatibility regressions accordingly: the
former zero-iteration dispatch proofs now use the true minimum (1), and
new regressions prove max_iter=0 is rejected before core discovery for
both logistic_dif and logistic_dif_purified.

* fix(release): resync changelog after current main

* fix(dif): make control installer idempotent

* feat(interaction-map): own residual factorization in Rust

* test(interaction-map): seal evidence and resource admission

* fix(interaction-map): seal evidence before Rust

* test(interaction-map): bound native resource requests

* fix(interaction-map): bound native workspaces

* fix(interaction-map): reject oversized axis controls before data

* test(interaction-map): reject maximal axis request before data

* docs(interaction-map): record bounded evidence admission

* test(interaction-map): require shape-consistent empty map

* test(interaction-map): require coherent empty rectangle

* fix(interaction-map): normalize empty complete-case rectangle

* docs(interaction-map): record empty complete-case contract

* feat(interaction-map): expose coverage and cell evidence

* test(interaction-map): reject NaN model expectations

* test(interaction-map): reject nonfinite expected evidence in Rust

* fix(interaction-map): reject NaN model expectations

* fix(interaction-map): require finite expected evidence

* docs(changelog): record finite interaction-map expectations

* test(interaction-map): preserve observed infinity rejection in Rust

* fix(interaction-map): reject infinite observed evidence in Rust

* docs(changelog): align interaction-map missingness parity

* chore: normalize composed public exports

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: ci-cd CI, GitHub Actions, checks, release, or supply chain area: security Security boundary, hardening, or vulnerability prevention priority: medium Normal-priority or P2 work status: needs-review Open pull request requiring current-head review or checks type: bug Defect or incorrect behavior

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Harden logistic DIF controls before data/native discovery

2 participants