feat(core-consent): scaffold package with types, IConsent, withConsent brand wrapper

- Add packages/core-consent with ConsentCategory, ConsentState,
  UserConsentState types and IConsent interface
- Add withConsent wrapper attaching __consentChecked brand at bind time;
  unit tests assert brand attachment and factory passthrough
- Add ConsentChecked<F> type to core-shared/conformance/brands.ts and
  isConsentChecked helper to brand-runtime.ts
- Extend FeatureManifest with requiresConsent?: readonly string[] field
- Extend assertFeatureConformance to require __consentChecked brand when
  requiresConsent.length > 0; synthetic fixture tests cover pass/fail cases
- Propagate __consentChecked in withSpan PROPAGATED_BRANDS so the outermost
  binding carries the brand

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-19 10:40:40 +00:00
parent f5d08dc84a
commit 9cb2fa321c
20 changed files with 410 additions and 27 deletions

View File

@@ -0,0 +1,22 @@
import type { ConsentCategory, UserConsentState } from "./consent-types";
/**
* Vendor-neutral consent management interface.
*
* Feature binders that receive a consent instance operate through this
* interface. Concrete implementations (Payload-backed, in-memory, etc.) are
* wired at DI bind time and never imported by feature packages directly.
*/
export interface IConsent {
/** Synchronous check — true when the subject has granted the category. */
isGranted(category: ConsentCategory): boolean;
/** Record a consent grant for the given category. */
grant(category: ConsentCategory): Promise<void>;
/** Record a consent withdrawal for the given category. */
withdraw(category: ConsentCategory): Promise<void>;
/** Return the full list of per-category consent states. */
getCategories(): UserConsentState[];
}