A minimal D-Bus service that registers the
org.freedesktop.AgeVerification1 bus name and returns "unknown" for every
query. Applications get a valid response. No age data is collected, stored, or transmitted.
The stub daemon implements the same D-Bus interface that the real age verification service would provide. It exposes three methods:
Accepts a username, returns 0 (unknown) for all users. The calling
application receives a valid u (uint32) response on the bus — no error,
no timeout, no crash.
Accepts a username and age in years. Discards both. Returns successfully.
Accepts a username and an ISO 8601 date string. Discards both. Returns successfully.
AB 1043 § 1798.502(b) provides a "good faith" safe harbor. An operating system provider that makes a "good faith effort to comply, considering available technology and reasonable technical limitations" is shielded from liability. A daemon that accepts age input and returns "unknown" is... something. It is a technical implementation of the required interface.
Applications that call GetAgeBracket over D-Bus get a valid response:
bracket 0, meaning "unknown." This is a legitimate bracket value in the proposal. The
application does not receive a D-Bus error, does not time out waiting for a service that
doesn't exist, and does not crash. It receives a well-formed answer that means "this
user's age has not been determined."
The following is pseudocode based on the current D-Bus proposal. The actual implementation will be tested against whatever interface ships.
import dbus
import dbus.service
class AgelessVerification(dbus.service.Object):
@dbus.service.method('org.freedesktop.AgeVerification1',
in_signature='s', out_signature='u')
def GetAgeBracket(self, username):
return 0 # unknown
@dbus.service.method('org.freedesktop.AgeVerification1',
in_signature='su')
def SetAge(self, username, age_years):
pass # accepted and discarded
@dbus.service.method('org.freedesktop.AgeVerification1',
in_signature='ss')
def SetDateOfBirth(self, username, date_iso8601):
pass # accepted and discarded
This is pseudocode. The production daemon will be written once a real implementation ships and we can test against its actual D-Bus interface, introspection XML, and bus activation behavior. Method signatures, bus name, and object path may all change.
The stub daemon will be distributed as two files:
A drop-in systemd service file that starts the stub daemon on boot. It will be designed to conflict with the real age verification service, so only one can be active at a time.
A D-Bus system bus configuration file that allows the stub daemon to own the
org.freedesktop.AgeVerification1 bus name and defines the security policy for
method calls.
Installation will be a drop-in replacement: remove the real service, copy two files, reload systemd and dbus, start the stub. One command, if we package it right.
This daemon is to age verification what /dev/null is to storage. It is a
perfectly functional interface that discards everything it receives. The law requires an API.
Here is an API.