From d8e3cb976deaa8b6d95c6d50a80e17b8ff6b90ef Mon Sep 17 00:00:00 2001 From: James Maes Date: Wed, 14 Oct 2026 07:52:48 -0500 Subject: [PATCH] chore: stand-ins are removed with the first QQQ RC that ships #1172 and #1182 (RC.8) Co-Authored-By: Claude Opus 5.5 --- README.md | 6 +++--- .../com/kingsrook/qbits/secureddata/CoreAuditBridge.java | 2 +- .../kingsrook/qbits/secureddata/CoreFieldAccessBridge.java | 2 +- .../secureddata/standin/AuditValueProtectorInterface.java | 2 +- .../qbits/secureddata/standin/ClassifiedValueKeySource.java | 2 +- .../qbits/secureddata/standin/ClassifiedValueTokens.java | 2 +- .../com/kingsrook/qbits/secureddata/standin/DMLType.java | 2 +- .../qbits/secureddata/standin/FieldAccessDecision.java | 2 +- .../qbits/secureddata/standin/FieldAccessEvent.java | 2 +- .../qbits/secureddata/standin/FieldAccessEventType.java | 2 +- .../qbits/secureddata/standin/FieldAccessOutcome.java | 2 +- .../secureddata/standin/FieldAccessResolverInterface.java | 2 +- .../qbits/secureddata/standin/FieldAccessTier.java | 2 +- .../kingsrook/qbits/secureddata/standin/FieldMaskStyle.java | 2 +- .../qbits/secureddata/standin/ProtectedAuditValues.java | 2 +- .../qbits/secureddata/CoreFieldAccessBridgeIT.java | 2 +- 16 files changed, 18 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index fd0c0c3..76f6226 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ Java 21, Maven wrapper 3.9.11, **QQQ 4.1.0-RC.6**. RC.6 supplies core classifications, AI metadata, client channels, table-feature permissions and the UI API extension points. These are used directly; the UI API and its contract test are part of the main build. The installed middleware jar provides `UiApiContract`, but no `UiApiContractAssertions` facade, so the contract test calls that released API directly. -Field access (#1172) and audit-value protection (#1182) are not in RC.6. Field-access stand-ins and `CoreFieldAccessBridge` remain marked for RC.7. RC.6 **does not enforce field tiers**. Integration tests can use `4.1.0-SECUREDATA-SNAPSHOT`. +Field access (#1172) and audit-value protection (#1182) are not in RC.6. Field-access stand-ins and `CoreFieldAccessBridge` remain until the first QQQ RC that ships both #1172 and #1182 (expected RC.8). RC.6 **does not enforce field tiers**. Integration tests can use `4.1.0-SECUREDATA-SNAPSHOT`. ## Install and register @@ -243,11 +243,11 @@ Each is read from a JVM property or the environment and is never logged. Losing ### Core hooks -Audit-value protection (QRun-IO/qqq#1182) and the wipe audit flag need core classes that are not in RC.6. On RC.6 the qbit uses marked stand-ins (`removeBy=RC.7`), writes value-free wipe audit details itself, and core does not tokenise ordinary audits. Run the build with `-Dqqq.snapshot.version=4.1.0-SECUREDATA-SNAPSHOT` to exercise the real hooks, including the section 15 canary and wipe-proof tests (`RetentionProofTest`), which skip themselves when the hooks are absent. +Audit-value protection (QRun-IO/qqq#1182) and the wipe audit flag need core classes that are not in RC.6. On RC.6 the qbit uses marked stand-ins (`removeBy=RC.8`), writes value-free wipe audit details itself, and core does not tokenise ordinary audits. Run the build with `-Dqqq.snapshot.version=4.1.0-SECUREDATA-SNAPSHOT` to exercise the real hooks, including the section 15 canary and wipe-proof tests (`RetentionProofTest`), which skip themselves when the hooks are absent. ## Remaining phases -RC.6 migration is complete; field-access compatibility types remain until RC.7. Phase (g) remains. +RC.6 migration is complete; field-access and audit-token compatibility types remain until RC.8. ## License diff --git a/src/main/java/com/kingsrook/qbits/secureddata/CoreAuditBridge.java b/src/main/java/com/kingsrook/qbits/secureddata/CoreAuditBridge.java index f37aea1..bbb4a57 100644 --- a/src/main/java/com/kingsrook/qbits/secureddata/CoreAuditBridge.java +++ b/src/main/java/com/kingsrook/qbits/secureddata/CoreAuditBridge.java @@ -43,7 +43,7 @@ import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData; /******************************************************************************* ** A single reflection boundary for #1182, failing closed for incompatible hooks. *******************************************************************************/ -// STAND-IN(core=QRun-IO/qqq#1182, removeBy=RC.7) +// STAND-IN(core=QRun-IO/qqq#1182, removeBy=RC.8) public final class CoreAuditBridge { private static final String TOKENS = "com.kingsrook.qqq.backend.core.actions.permissions.fieldaccess."; diff --git a/src/main/java/com/kingsrook/qbits/secureddata/CoreFieldAccessBridge.java b/src/main/java/com/kingsrook/qbits/secureddata/CoreFieldAccessBridge.java index b299aed..dd2a424 100644 --- a/src/main/java/com/kingsrook/qbits/secureddata/CoreFieldAccessBridge.java +++ b/src/main/java/com/kingsrook/qbits/secureddata/CoreFieldAccessBridge.java @@ -40,7 +40,7 @@ import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData; /******************************************************************************* ** The only boundary between the temporary field-access API and unreleased core. *******************************************************************************/ -// STAND-IN(core=QRun-IO/qqq#1172, removeBy=RC.7) +// STAND-IN(core=QRun-IO/qqq#1172, removeBy=RC.8) public final class CoreFieldAccessBridge { private static final String PACKAGE = "com.kingsrook.qqq.backend.core.actions.permissions.fieldaccess."; diff --git a/src/main/java/com/kingsrook/qbits/secureddata/standin/AuditValueProtectorInterface.java b/src/main/java/com/kingsrook/qbits/secureddata/standin/AuditValueProtectorInterface.java index 42f74f9..a58cfd8 100644 --- a/src/main/java/com/kingsrook/qbits/secureddata/standin/AuditValueProtectorInterface.java +++ b/src/main/java/com/kingsrook/qbits/secureddata/standin/AuditValueProtectorInterface.java @@ -32,7 +32,7 @@ import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData; /******************************************************************************* ** Application hook for audit tokens and effective classification. Never return plain values. *******************************************************************************/ -// STAND-IN(core=QRun-IO/qqq#1182, removeBy=RC.7) +// STAND-IN(core=QRun-IO/qqq#1182, removeBy=RC.8) public interface AuditValueProtectorInterface { /******************************************************************************* diff --git a/src/main/java/com/kingsrook/qbits/secureddata/standin/ClassifiedValueKeySource.java b/src/main/java/com/kingsrook/qbits/secureddata/standin/ClassifiedValueKeySource.java index db81ced..f6e72ef 100644 --- a/src/main/java/com/kingsrook/qbits/secureddata/standin/ClassifiedValueKeySource.java +++ b/src/main/java/com/kingsrook/qbits/secureddata/standin/ClassifiedValueKeySource.java @@ -28,7 +28,7 @@ import java.util.Optional; /******************************************************************************* ** Supplies instance keys and optional per-record, per-field shreddable keys. *******************************************************************************/ -// STAND-IN(core=QRun-IO/qqq#1182, removeBy=RC.7) +// STAND-IN(core=QRun-IO/qqq#1182, removeBy=RC.8) public interface ClassifiedValueKeySource { /******************************************************************************* diff --git a/src/main/java/com/kingsrook/qbits/secureddata/standin/ClassifiedValueTokens.java b/src/main/java/com/kingsrook/qbits/secureddata/standin/ClassifiedValueTokens.java index 8e85052..41dd7ee 100644 --- a/src/main/java/com/kingsrook/qbits/secureddata/standin/ClassifiedValueTokens.java +++ b/src/main/java/com/kingsrook/qbits/secureddata/standin/ClassifiedValueTokens.java @@ -40,7 +40,7 @@ import com.kingsrook.qqq.backend.core.utils.ValueUtils; /******************************************************************************* ** Shared, versioned audit/email value tokens. The MAC input is UTF-8. *******************************************************************************/ -// STAND-IN(core=QRun-IO/qqq#1182, removeBy=RC.7) +// STAND-IN(core=QRun-IO/qqq#1182, removeBy=RC.8) public final class ClassifiedValueTokens { diff --git a/src/main/java/com/kingsrook/qbits/secureddata/standin/DMLType.java b/src/main/java/com/kingsrook/qbits/secureddata/standin/DMLType.java index af749e4..e6d1d68 100644 --- a/src/main/java/com/kingsrook/qbits/secureddata/standin/DMLType.java +++ b/src/main/java/com/kingsrook/qbits/secureddata/standin/DMLType.java @@ -23,7 +23,7 @@ package com.kingsrook.qbits.secureddata.standin; /******************************************************************************* ** RC.6's nested DMLType is package-private; #1182 makes it public. *******************************************************************************/ -// STAND-IN(core=QRun-IO/qqq#1182, removeBy=RC.7) +// STAND-IN(core=QRun-IO/qqq#1182, removeBy=RC.8) public enum DMLType { INSERT, UPDATE, DELETE, OTHER diff --git a/src/main/java/com/kingsrook/qbits/secureddata/standin/FieldAccessDecision.java b/src/main/java/com/kingsrook/qbits/secureddata/standin/FieldAccessDecision.java index 27358cc..a071d3a 100644 --- a/src/main/java/com/kingsrook/qbits/secureddata/standin/FieldAccessDecision.java +++ b/src/main/java/com/kingsrook/qbits/secureddata/standin/FieldAccessDecision.java @@ -26,7 +26,7 @@ package com.kingsrook.qbits.secureddata.standin; /******************************************************************************* ** A resolver decision; the reason must never contain a field value. *******************************************************************************/ -// STAND-IN(core=QRun-IO/qqq#1172, removeBy=RC.7): copy of com.kingsrook.qqq.backend.core.actions.permissions.fieldaccess.FieldAccessDecision; delete when the pin moves to RC.7. +// STAND-IN(core=QRun-IO/qqq#1172, removeBy=RC.8): copy of com.kingsrook.qqq.backend.core.actions.permissions.fieldaccess.FieldAccessDecision; delete when the pin moves to the first QQQ RC with #1172 and #1182 (RC.8). public record FieldAccessDecision(FieldAccessTier tier, FieldMaskStyle maskStyle, String reason, boolean exactMatchAllowed) { public static final FieldAccessDecision FULL = new FieldAccessDecision(FieldAccessTier.FULL, null, null); diff --git a/src/main/java/com/kingsrook/qbits/secureddata/standin/FieldAccessEvent.java b/src/main/java/com/kingsrook/qbits/secureddata/standin/FieldAccessEvent.java index 58c4ecb..f731129 100644 --- a/src/main/java/com/kingsrook/qbits/secureddata/standin/FieldAccessEvent.java +++ b/src/main/java/com/kingsrook/qbits/secureddata/standin/FieldAccessEvent.java @@ -30,7 +30,7 @@ import java.util.List; /******************************************************************************* ** Value-free audit notification. Primary key samples contain at most 50 keys. *******************************************************************************/ -// STAND-IN(core=QRun-IO/qqq#1172, removeBy=RC.7): copy of com.kingsrook.qqq.backend.core.actions.permissions.fieldaccess.FieldAccessEvent; delete when the pin moves to RC.7. +// STAND-IN(core=QRun-IO/qqq#1172, removeBy=RC.8): copy of com.kingsrook.qqq.backend.core.actions.permissions.fieldaccess.FieldAccessEvent; delete when the pin moves to the first QQQ RC with #1172 and #1182 (RC.8). public class FieldAccessEvent { private FieldAccessEventType type; diff --git a/src/main/java/com/kingsrook/qbits/secureddata/standin/FieldAccessEventType.java b/src/main/java/com/kingsrook/qbits/secureddata/standin/FieldAccessEventType.java index 87be7d3..496ae57 100644 --- a/src/main/java/com/kingsrook/qbits/secureddata/standin/FieldAccessEventType.java +++ b/src/main/java/com/kingsrook/qbits/secureddata/standin/FieldAccessEventType.java @@ -26,7 +26,7 @@ package com.kingsrook.qbits.secureddata.standin; /******************************************************************************* ** Kinds of field access reported to the resolver. *******************************************************************************/ -// STAND-IN(core=QRun-IO/qqq#1172, removeBy=RC.7): copy of com.kingsrook.qqq.backend.core.actions.permissions.fieldaccess.FieldAccessEventType; delete when the pin moves to RC.7. +// STAND-IN(core=QRun-IO/qqq#1172, removeBy=RC.8): copy of com.kingsrook.qqq.backend.core.actions.permissions.fieldaccess.FieldAccessEventType; delete when the pin moves to the first QQQ RC with #1172 and #1182 (RC.8). public enum FieldAccessEventType { VIEW, EXACT_MATCH_FILTER, DENIED diff --git a/src/main/java/com/kingsrook/qbits/secureddata/standin/FieldAccessOutcome.java b/src/main/java/com/kingsrook/qbits/secureddata/standin/FieldAccessOutcome.java index 199d128..0297ab8 100644 --- a/src/main/java/com/kingsrook/qbits/secureddata/standin/FieldAccessOutcome.java +++ b/src/main/java/com/kingsrook/qbits/secureddata/standin/FieldAccessOutcome.java @@ -26,7 +26,7 @@ package com.kingsrook.qbits.secureddata.standin; /******************************************************************************* ** Outcome of an exact-match search. *******************************************************************************/ -// STAND-IN(core=QRun-IO/qqq#1172, removeBy=RC.7): copy of com.kingsrook.qqq.backend.core.actions.permissions.fieldaccess.FieldAccessOutcome; delete when the pin moves to RC.7. +// STAND-IN(core=QRun-IO/qqq#1172, removeBy=RC.8): copy of com.kingsrook.qqq.backend.core.actions.permissions.fieldaccess.FieldAccessOutcome; delete when the pin moves to the first QQQ RC with #1172 and #1182 (RC.8). public enum FieldAccessOutcome { MATCH, NO_MATCH, REFUSED diff --git a/src/main/java/com/kingsrook/qbits/secureddata/standin/FieldAccessResolverInterface.java b/src/main/java/com/kingsrook/qbits/secureddata/standin/FieldAccessResolverInterface.java index 9acca83..93b2a01 100644 --- a/src/main/java/com/kingsrook/qbits/secureddata/standin/FieldAccessResolverInterface.java +++ b/src/main/java/com/kingsrook/qbits/secureddata/standin/FieldAccessResolverInterface.java @@ -30,7 +30,7 @@ import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData; /******************************************************************************* ** Session-aware policy, reveal grants and value-free access notifications. *******************************************************************************/ -// STAND-IN(core=QRun-IO/qqq#1172, removeBy=RC.7): copy of com.kingsrook.qqq.backend.core.actions.permissions.fieldaccess.FieldAccessResolverInterface; delete when the pin moves to RC.7. +// STAND-IN(core=QRun-IO/qqq#1172, removeBy=RC.8): copy of com.kingsrook.qqq.backend.core.actions.permissions.fieldaccess.FieldAccessResolverInterface; delete when the pin moves to the first QQQ RC with #1172 and #1182 (RC.8). public interface FieldAccessResolverInterface { /******************************************************************************* diff --git a/src/main/java/com/kingsrook/qbits/secureddata/standin/FieldAccessTier.java b/src/main/java/com/kingsrook/qbits/secureddata/standin/FieldAccessTier.java index 2c13a92..6cd36d8 100644 --- a/src/main/java/com/kingsrook/qbits/secureddata/standin/FieldAccessTier.java +++ b/src/main/java/com/kingsrook/qbits/secureddata/standin/FieldAccessTier.java @@ -27,7 +27,7 @@ import com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperat /******************************************************************************* ** Effective field access, ordered from least to most restrictive. *******************************************************************************/ -// STAND-IN(core=QRun-IO/qqq#1172, removeBy=RC.7): copy of com.kingsrook.qqq.backend.core.actions.permissions.fieldaccess.FieldAccessTier; delete when the pin moves to RC.7. +// STAND-IN(core=QRun-IO/qqq#1172, removeBy=RC.8): copy of com.kingsrook.qqq.backend.core.actions.permissions.fieldaccess.FieldAccessTier; delete when the pin moves to the first QQQ RC with #1172 and #1182 (RC.8). public enum FieldAccessTier { FULL, REVEALABLE, MASKED, HIDDEN; diff --git a/src/main/java/com/kingsrook/qbits/secureddata/standin/FieldMaskStyle.java b/src/main/java/com/kingsrook/qbits/secureddata/standin/FieldMaskStyle.java index 25531d1..f0f3862 100644 --- a/src/main/java/com/kingsrook/qbits/secureddata/standin/FieldMaskStyle.java +++ b/src/main/java/com/kingsrook/qbits/secureddata/standin/FieldMaskStyle.java @@ -26,7 +26,7 @@ package com.kingsrook.qbits.secureddata.standin; /******************************************************************************* ** Presentation rules for a restricted value. *******************************************************************************/ -// STAND-IN(core=QRun-IO/qqq#1172, removeBy=RC.7): copy of com.kingsrook.qqq.backend.core.actions.permissions.fieldaccess.FieldMaskStyle; delete when the pin moves to RC.7. +// STAND-IN(core=QRun-IO/qqq#1172, removeBy=RC.8): copy of com.kingsrook.qqq.backend.core.actions.permissions.fieldaccess.FieldMaskStyle; delete when the pin moves to the first QQQ RC with #1172 and #1182 (RC.8). public enum FieldMaskStyle { AUTO, EMAIL, LAST_4, FIRST_LAST, FULL diff --git a/src/main/java/com/kingsrook/qbits/secureddata/standin/ProtectedAuditValues.java b/src/main/java/com/kingsrook/qbits/secureddata/standin/ProtectedAuditValues.java index 73dc40c..f795bfd 100644 --- a/src/main/java/com/kingsrook/qbits/secureddata/standin/ProtectedAuditValues.java +++ b/src/main/java/com/kingsrook/qbits/secureddata/standin/ProtectedAuditValues.java @@ -24,7 +24,7 @@ package com.kingsrook.qbits.secureddata.standin; /******************************************************************************* ** Tokens and a value-free message supplied before an audit is inserted. *******************************************************************************/ -// STAND-IN(core=QRun-IO/qqq#1182, removeBy=RC.7) +// STAND-IN(core=QRun-IO/qqq#1182, removeBy=RC.8) public record ProtectedAuditValues(String oldToken, String newToken, String message) { } diff --git a/src/test/java/com/kingsrook/qbits/secureddata/CoreFieldAccessBridgeIT.java b/src/test/java/com/kingsrook/qbits/secureddata/CoreFieldAccessBridgeIT.java index bc56526..ab548fb 100644 --- a/src/test/java/com/kingsrook/qbits/secureddata/CoreFieldAccessBridgeIT.java +++ b/src/test/java/com/kingsrook/qbits/secureddata/CoreFieldAccessBridgeIT.java @@ -78,7 +78,7 @@ class CoreFieldAccessBridgeIT { available = false; } - Assumptions.assumeTrue(available, "QQQ RC.7 field-access core is not on this classpath"); + Assumptions.assumeTrue(available, "QQQ field-access core (#1172) is not on this classpath"); } -- 2.54.0