What It Does

The stub daemon implements the same D-Bus interface that the real age verification service would provide. It exposes three methods:

GetAgeBracket

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.

SetAge

Accepts a username and age in years. Discards both. Returns successfully.

SetDateOfBirth

Accepts a username and an ISO 8601 date string. Discards both. Returns successfully.

Why It Works

Legal

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.

Practical

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."

Planned Implementation

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

Pseudocode only

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.

Installation

The stub daemon will be distributed as two files:

Systemd Service Unit

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.

D-Bus Configuration

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.

The Point

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.