NAME
TODO - Roadmap, ecosystem, and help-wanted items for GDPR::IAB::TCFv2
STATUS
GDPR-IAB-TCFv2 entered maintenance mode on 2026-05-09 with the v0.400 release. The core parser, validator, and CMP-validator surfaces are considered feature-complete for IAB TCF v2.3.
In maintenance mode the maintainer commits to:
bug fixes,
security fixes,
CPAN-tester regression triage,
tracking IAB-spec updates (TCF v2.4 / v3 if and when they ship).
Larger feature work -- the three remaining roadmap phases below, the distribution items, and the sister-distribution ideas -- is now tracked as help-wanted issues on GitHub. Patches and PRs from the community are still welcome and will continue to be reviewed.
COMPLETED PHASES
The phases below shipped between v0.270 and v0.400. They are listed here for historical context only; details live in CHANGELOG.md and the linked PRs.
- Phase 0 -- Core legal-basis predicates
-
is_vendor_consent_allowed,is_vendor_legitimate_interest_allowed,is_vendor_allowed_for_flexible_purpose, plusstrictmode. - Phase 1 -- TCF v2.3 segments and parser robustness
-
Disclosed Vendors / Allowed Vendors segments, multi-segment safety,
has_vendor_disclosure,has_publisher_restrictions, thevendor_idfilter onTO_JSON, and the automated release workflow. - Phase 2 -- Declarative validator interface
-
GDPR::IAB::TCFv2::Validatorwithvalidate/validate_allandValidator::Result. - Phase 3 -- Alignment and cleanup
-
Purpose names normalized to TCF v2.3 wording; POD streamlined.
- Phase 4 -- Performance pass
-
Bitfield decode optimizations and golden-corpus benchmarks.
- Phase 5 -- CMP validator
-
GDPR::IAB::TCFv2::CMPValidatorwith file / JSON / URL loading, staleness warning, and integration into the main validator as a rule. - Phase 6 -- Structured failure reporting
-
Five sub-phases (6.1 -- 6.5) delivering
Validator::Reasoncodes,Validator::Failureobjects, the TCF LI carve-out, distinct publisher-restriction reasons, and per-call list overrides.
HELP WANTED -- ROADMAP PHASES
Three roadmap phases were originally planned for inclusion in this distribution but are now open for community contribution. Each is self-contained and can ship as an independent PR; pick one and open (or claim) the corresponding help-wanted + roadmap issue on GitHub.
Phase 7 -- GVL-Aware Validator
Bridge the IAB Global Vendor List schema to the Phase 2 validator so callers do not have to translate vendor entries by hand.
Scope:
from_gvl_vendor_entry($vendor_entry)-- accept a single GVL vendor entry ({ id, purposes, legIntPurposes, flexiblePurposes }) and return the keyword-argument list expected byValidator->new.from_gvl($gvl_doc, $vendor_id)-- look up the vendor in a parsed GVL document and return a fully configuredValidator; fail fast if the vendor ID is missing.Flexible GVL input: file path, raw JSON string, or pre-parsed hashref.
CLI integration:
iabtcfv2 validate --gvl path/to/gvl.json -v 32 ...should derive-C/-L/-Ffrom the GVL entry.Tests: golden GVL fixture covering vendors with and without flexible purposes; round-trip
from_gvl_vendor_entryagainst a hand-crafted entry.
Phase 8 -- Features, Special Features, Special Purposes
Extend the validator beyond standard purposes to cover the rest of the TCF taxonomy. Should consume the REASON_* codes introduced in Phase 6.
Scope:
Validator support for Special Features (opt-in, e.g. precise geolocation): require the bit in the TC string when listed.
Validator support for Features (vendor-declared): no consent required, but cross-check the vendor's GVL declaration once Phase 7 lands.
Validator support for Special Purposes: legitimate-interest-only by spec; check vendor declaration without requiring a consent bit.
Surface on the CLI as
--special-features/--features/--special-purposes(comma-separated, same shape as-C/-L).Tests: extend t/06-validator.t with subtests per category; extend t/10-cli-iabtcfv2.t with CLI subtests.
Phase 9 -- CLI Configuration Loading
Reduce CLI boilerplate by letting common flags come from the environment or a config file.
Scope:
Map a curated set of env vars to CLI flags:
IABTCFV2_VENDOR_ID,IABTCFV2_CONSENT_PURPOSES,IABTCFV2_LEGITIMATE_INTEREST_PURPOSES,IABTCFV2_FLEXIBLE_PURPOSES,IABTCFV2_MIN_POLICY_VERSION. Explicit CLI flags always win.Optional config-file discovery: .iabtcfv2rc in
$PWDor$HOME(plus.env-style loading if present). Documented precedence: CLI > env > file > built-in defaults.iabtcfv2 config(orvalidate --print-config) to dump the resolved configuration as JSON for debugging.**Tests:** a CLI subtest that sets the env vars, runs
validatewithout the matching flags, and asserts the same outcome as the explicit invocation.
Phase 10 -- Advanced Error Handling
Modernize exception handling across the library.
Scope:
Implement
GDPR::IAB::TCFv2::Errorexception objects.Overload stringification to provide clean messages while retaining metadata (code, file, line).
Refactor
croak/diecalls in the library to throw objects.Update CLI to catch objects and simplify its sanitization logic.
Phase 6 follow-up -- CMPValidator structured failures (non-blocking)
Round out Phase 6 by migrating GDPR::IAB::TCFv2::CMPValidator (Phase 5) onto the structured failure-reporting model the rest of the validator already uses. Today CMP-level failures are stringly-typed croaks; this item brings them onto Validator::Failure with stable machine-readable codes.
Scope:
Add a
REASON_CMP_*family toValidator::Reason:REASON_INVALID_CMP(CMP ID not in registry),REASON_CMP_DELETED(retired CMP,deletedDatehonored),REASON_CMP_UNKNOWN(registry loaded but ID unclassifiable). Updatereason_string()to cover them.Refactor
CMPValidator(or its consumer wrapper inside the mainValidatorrule) to emitValidator::Failureobjects with the matching codes instead of plain croaks.Backwards compat: the human-readable text emitted by
Validator::Resultstringification must stay the same so existing CLI output is unchanged.Tests: extend t/14-cmp-validator.t (and/or t/16-validator-failures.t) with subtests asserting each new code, reusing the fixed reference dates already in place for determinism.
HELP WANTED -- DISTRIBUTION
These items are about packaging the existing code, not about adding features.
Linux package artifacts (.deb and .rpm)
Wire up a GitHub Actions workflow that, on every v* tag, builds a .deb and a .rpm from the released tarball and uploads both as assets on the corresponding GitHub Release. Both packages are pure Perl (noarch / all), so a single Linux runner per format is enough; no build matrix, no cross-arch concerns.
Suggested toolchain:
.deb:
dh-make-perl --build --cpan-mirror=file:./against themake disttarball. Produceslibgdpr-iab-tcfv2-perl_VERSION_all.deb. Confirm the resultingdebian/controlpicks upbin/iabtcfv2as an executable and respects the METArecommends..rpm:
cpanspecon the tarball to produce a.spec, thenrpmbuild -bainside afedora:latestcontainer. Producesperl-GDPR-IAB-TCFv2-VERSION-1.noarch.rpm.Upload both via
gh release upload "$GITHUB_REF_NAME" *.deb *.rpm.
Out of scope (separate, larger efforts -- not part of this item): filing an ITP bug to ship the package via Debian proper, hosting a signed apt repo, or maintaining a Fedora COPR. The deliverable here is artifacts on the Release page, downloadable with wget + dpkg -i or dnf install ./perl-GDPR-IAB-TCFv2-VERSION-1.noarch.rpm.
Homebrew tap (macOS + Linux)
Stand up a self-hosted Homebrew tap repository (peczenyj/homebrew-tap) with a Formula/iabtcfv2.rb formula that installs the CLI from the released CPAN tarball. Users opt in with:
brew tap peczenyj/tap
brew install iabtcfv2
Maintenance contract: a small CI step on this repository's release event that opens a PR against the tap repo bumping the formula's url + sha256. Self-hosted (not homebrew-core), so no external review queue and no homebrew-core's "notable + stable + popular" gate.
Same formula works on Homebrew on Linux (Linuxbrew), so this single channel covers macOS plus a slice of Linux developer machines for free.
Snap package (Ubuntu / cross-distro Linux)
Author a snapcraft.yaml that packages bin/iabtcfv2 and the Perl runtime, and publish to snapcraft.io on every v* tag. Users install with:
sudo snap install iabtcfv2
Heads-up for the contributor: snaps run under confinement, so any file paths the CLI reads (config files, GVL JSON dumps) need to be inside the snap-allowed locations or a personal-files / system-files plug must be declared and connected. Path the release notes accordingly so first-time users do not hit a silent "file not found" inside the sandbox.
AUR package (Arch Linux)
Publish a PKGBUILD for Arch's user repository. The recipe is short -- makepkg drives a perl Makefile.PL && make && make install against the release tarball. Best handled by a community co-maintainer rather than this repo's CI; volunteer contributions welcome.
ECOSYSTEM -- SISTER DISTRIBUTIONS
The following ideas are intentionally separate CPAN distributions rather than features of this one. Each adds a runtime dependency on its host framework, so packaging them separately keeps GDPR::IAB::TCFv2's own deps lean.
Highest priority
GDPR::IAB::TCFv2::Validator::LIVR
LIVR rule-engine binding for JSON-shaped TC payloads.
GDPR::IAB::TCFv2::Validator::TypeTiny
Reusable Type::Tiny constraints (parameterized by purpose / vendor sets) for Moo, Moose, or pure-Perl callers that prefer type-level enforcement.
Plack::Middleware::GDPR::TCFv2
Plack middleware that decodes a TC string from a request header or cookie, attaches the parsed
GDPR::IAB::TCFv2object to$env, and short-circuits the response when consent is missing or invalid.
Nice to have
GDPR::IAB::TCFv2::Validator::Moose
Moose attribute traits and role-based validation for projects that already use Moose end-to-end.
GDPR::IAB::TCFv2::Validator::FormValidator
Data::FormValidatorprofile glue for legacy applications that drive business validation through DFV.-
A standalone parser for the legacy IAB TCF v1 / v1.1 consent string format (April 2018 -- August 2020, superseded by TCF v2.0). The wire format is unrelated to v2 -- different bit layout, no segment structure, smaller fixed core -- so it does not belong inside this distribution.
Audience is intentionally narrow: log spelunkers, audit teams, and the historically curious. A useful contribution would expose a similar surface to GDPR::IAB::TCFv2 (
Parse,TO_JSON, simple purpose / vendor predicates) without dragging in v2's validator machinery.
HOW TO CLAIM AN ITEM
Open a GitHub issue (or comment on the existing one) referencing the phase or sister-distribution name above. Include a rough scoping sketch: what API you are proposing, what tests you will add, and which existing module the work will touch.
Wait for a maintainer to assign the issue. This avoids duplicate effort and surfaces any spec questions early.
Follow the patching workflow in CONTRIBUTING.pod: branch from
devel, run the full test suite (prove -lr tplusAUTHOR_TESTING=1 prove -lr xt), open a PR.
OUT OF SCOPE
The following are intentionally not on the roadmap:
TCF v1 / v1.1 support inside this distribution. The two wire formats share nothing but the IAB acronym, so v1 belongs in a sibling distribution rather than as a code path here. See the GDPR::IAB::TCFv1 entry under "ECOSYSTEM -- SISTER DISTRIBUTIONS" if you are interested in claiming it.
Network-side discovery of CMP or GVL endpoints. The library accepts pre-loaded data; fetching is the caller's responsibility (or the optional
HTTP::Tinypath insideCMPValidator).Persistent caching of parsed strings. TC strings are cheap to parse; caching is a deployment concern, not a library concern.
SEE ALSO
GDPR::IAB::TCFv2, GDPR::IAB::TCFv2::Validator, GDPR::IAB::TCFv2::CMPValidator, CONTRIBUTING.pod, CHANGELOG.md.