Access control¶
category:access = category-defining behavior (an ACS must do this at all). capability:access.* = selected when capabilities-coverage.yaml declares the slug applicable. Event/command names are the canonical PQ taxonomy (Pq.Adapters.Framework/pq-events.yaml).
Generated from the matrix
26 scenarios, from Matrix v9. See Adapter Acceptance Tests for how a scenario is written, what the waves mean, and which verdicts a run can record.
| Scenario | Purpose | Stimulus | Wave |
|---|---|---|---|
| AAT-ACCESS-CREDENTIAL-01 | A synced card is granted access at an authorized door. | human | 2 |
| AAT-ACCESS-CREDENTIAL-02 | A card with no grant to the door is denied. | human | 2 |
| AAT-ACCESS-CREDENTIAL-03 | An unknown (unenrolled) card is denied and surfaced as unknown. | human | 2 |
| AAT-ACCESS-CREDENTIAL-04 | Deleting a credential stops it working at the device. | human | 2 |
| AAT-ACCESS-CREDENTIAL-05 | A credential update is applied in place, not by duplicate. | pq | 1 |
| AAT-ACCESS-CREDENTIAL-06 | A synchronized PIN with an even number of digits authenticates at the device. | human | 2 |
| AAT-ACCESS-CREDENTIAL-07 | A synchronized PIN with an odd number of digits authenticates at the device. | human | 2 |
| AAT-ACCESS-CARD-FORMATS-01 | A card in a supported format is decoded to the expected PQ number. | human | 2 |
| AAT-ACCESS-SYNC-MODE-01 | A single credential change takes the sync path the device supports. | pq | 1 |
| AAT-ACCESS-SYNC-MODE-02 | A sync of one changed credential costs no other credential its access. | human | 2 |
| AAT-ACCESS-RESET-RESTORE-01 | A reset clears the device tables and re-pushes the whole dataset. | pq | 1 |
| AAT-ACCESS-RESET-RESTORE-02 | Credentials work again on the device after a reset. | human | 2 |
| AAT-ACCESS-DOUBLE-SYNC-01 | Running sync twice with unchanged input is a no-op on the PQ side. | pq | 1 |
| AAT-ACCESS-DOUBLE-SYNC-02 | A repeated sync leaves the device's credential set working. | human | 2 |
| AAT-ACCESS-SCHEDULES-01 | A schedule the device enforces denies access outside its window. | human | 2 |
| AAT-ACCESS-ACCESS-LEVELS-01 | An access-level binding grants exactly the access points it covers, and no others. | human | 2 |
| AAT-ACCESS-HOLIDAYS-01 | A synced holiday calendar changes schedule behavior on the device. | human | 2 |
| AAT-ACCESS-ANTIPASSBACK-01 | A second entry without an intervening exit is denied on antipassback. | human | 2 |
| AAT-ACCESS-DOOR-CONTROL-01 | A strike release from PQ opens the door momentarily and is confirmed. | pq | 1 |
| AAT-ACCESS-DOOR-CONTROL-02 | A permanent-open (unlock) command holds the door open until cancelled. | pq | 1 |
| AAT-ACCESS-DOOR-CONTROL-03 | Deadbolt lock/unlock is exposed where the protocol has a real lock actuator. | pq | 1 |
| AAT-ACCESS-DOOR-CONTROL-04 | A forced-open door is reported and its clear is reported. | human | 3 |
| AAT-ACCESS-DOOR-CONTROL-05 | A held-open (door-open-too-long) condition is reported and clears. | human | 3 |
| AAT-ACCESS-READER-MODE-01 | Disabling a reader from PQ stops it granting access. | human | 2 |
| AAT-ACCESS-OWNERSHIP-01 | Synchronization leaves credentials PQ does not own working. | human | 2 |
| AAT-ACCESS-CASCADE-01 | Deleting a person stops every one of their credentials working, not just the first. | human | 2 |
Credential management + access events (category-defining)¶
AAT-ACCESS-CREDENTIAL-01¶
A synced card is granted access at an authorized door.
| Applies when | category:access |
| Stimulus | human · wave 2 |
| Capability | access.credential_management |
| Hardware | A reader and a physical card matching AAT-Card-1. |
| Preconditions | person_with_card_and_door_access |
| Depends on | AAT-ACCESS-CREDENTIAL-05, AAT-ACCESS-DOUBLE-SYNC-01 |
Given. AAT-Tester-1 holds AAT-Card-1, authorized for the door and synced to the device.
When. The user presents AAT-Card-1 at the door reader.
Then. Access is granted and PQ attributes it to the right person and door.
PQ-visible behavior. pq.event.access.granted on the door/reader Thing naming AAT-Tester-1 and the credential; the strike releases.
Physical acts.
present_credential— the reader of the door the credential is authorized for (credential: the synchronized AAT card)
Steps.
AAT-ACCESS-CREDENTIAL-02¶
A card with no grant to the door is denied.
| Applies when | category:access |
| Stimulus | human · wave 2 |
| Capability | access.credential_management |
| Hardware | A reader and the card. |
| Preconditions | person_without_door_access |
| Depends on | AAT-ACCESS-CREDENTIAL-05, AAT-ACCESS-DOUBLE-SYNC-01 |
Given. AAT-Tester-1 holds AAT-Card-1 synced but with no access level for the door.
When. The user presents AAT-Card-1 at the door reader.
Then. Access is denied for lack of authorization.
PQ-visible behavior. pq.event.access.denied (or .denied.invalid) on the door, attributed to AAT-Tester-1 where the protocol reports identity; the strike does not release.
Physical acts.
present_credential— the reader of the modeled door (credential: the synchronized AAT card, which holds no grant to that door)
Steps.
- stimulus: present_credential
expect:
- type=pq.event.access.denied;thing={door}
reject:
- type=pq.event.access.granted;thing={door}
timeout: 120
AAT-ACCESS-CREDENTIAL-03¶
An unknown (unenrolled) card is denied and surfaced as unknown.
| Applies when | category:access |
| Stimulus | human · wave 2 |
| Capability | access.credential_management |
| Hardware | A reader and a card not enrolled in PQ. |
| Preconditions | door_modeled |
| Depends on | AAT-CROSS-CUTTING-UNIVERSAL-07 |
Given. A card the device does not know is used at the reader.
When. The user presents a PQ-unknown card at the door reader.
Then. Access is denied and PQ reports an unknown credential.
PQ-visible behavior. pq.event.access.denied.unknown on the door; where the protocol reports the card number it appears in the payload (card_display) — this is also how the runner captures physical card numbers.
Physical acts.
present_credential— the reader of the modeled door (credential: any card that is not enrolled in PQ)
Steps.
- stimulus: present_credential
expect:
- type=pq.event.access.denied.unknown;thing={door}
timeout: 120
AAT-ACCESS-CREDENTIAL-04¶
Deleting a credential stops it working at the device.
| Applies when | capability:access.credential_management |
| Stimulus | human · wave 2 |
| Capability | access.credential_management |
| Hardware | A reader and the card. |
| Preconditions | person_with_card_and_door_access |
| Depends on | AAT-ACCESS-CREDENTIAL-05, AAT-ACCESS-CASCADE-01 |
Given. AAT-Card-1 currently grants access at the door.
When. The credential is removed in PQ and the sync completes, then the card is presented.
Then. The card no longer grants access.
PQ-visible behavior. After the delete syncs (pq.event.access.credential.deleted / sync fact), presenting AAT-Card-1 yields pq.event.access.denied.unknown (or .invalid), not granted.
Physical acts.
present_credential— the reader of the door the credential used to open (credential: the AAT card deleted in PQ)
Steps.
- command: pq.command.access.synchronize
on: {root}
expect:
- type=pq.event.access.synchronization.completed;thing={root}
timeout: 600
- stimulus: present_credential
expect:
- type=pq.event.access.denied;thing={door}
reject:
- type=pq.event.access.granted;thing={door}
timeout: 120
AAT-ACCESS-CREDENTIAL-05¶
A credential update is applied in place, not by duplicate.
| Applies when | capability:access.credential_management |
| Stimulus | pq · wave 1 |
| Capability | access.credential_management |
| Preconditions | person_with_card_and_door_access |
Given. AAT-Card-1 is synced to the device.
When. A property of the credential/person is changed in PQ and re-synced.
Then. The device record is updated, not duplicated.
PQ-visible behavior. The sync reports an in-place update (no second device record for AAT-Tester-1); credential count on the device is unchanged. (Full-only panels reload the set — assert no duplication.)
Steps.
- command: pq.command.access.synchronize
on: {root}
expect:
- type=pq.event.access.synchronization.completed;thing={root}
timeout: 600
What the steps cannot decide. That the record was updated rather than duplicated is a count in the sync facts, not a record on the timeline; the steps prove the synchronization completed.
AAT-ACCESS-CREDENTIAL-06¶
A synchronized PIN with an even number of digits authenticates at the device.
| Applies when | capability:access.credential_management |
| Stimulus | human · wave 2 |
| Capability | access.credential_management |
| Hardware | A device path that authenticates numeric PIN credentials. |
| Preconditions | adapter_connected |
| Depends on | AAT-ACCESS-CREDENTIAL-05 |
| Since | Matrix v4 |
Given. The adapter declares numeric PIN credential support and the AAT person holds a PIN with an even digit count, synchronized to the device.
When. The PIN is entered at the device keypad.
Then. It authenticates and is attributed to its enrolled person.
PQ-visible behavior. The entry produces its access or keypad event attributed to the enrolled person — the device accepted the value as stored. Adapters without numeric PIN support record n_a.
Physical acts.
enter_pin— keypad Thing (credential: the AAT even-digit PIN)
Steps.
- stimulus: enter_pin
expect:
- type=pq.event.access.granted|pq.event.intrusion;thing={keypad}
timeout: 120
AAT-ACCESS-CREDENTIAL-07¶
A synchronized PIN with an odd number of digits authenticates at the device.
| Applies when | capability:access.credential_management |
| Stimulus | human · wave 2 |
| Capability | access.credential_management |
| Hardware | A device path that authenticates numeric PIN credentials. |
| Preconditions | adapter_connected |
| Depends on | AAT-ACCESS-CREDENTIAL-05 |
| Since | Matrix v4 |
Given. The adapter declares numeric PIN credential support and the AAT person holds a PIN with an odd digit count, synchronized to the device.
When. The PIN is entered at the device keypad.
Then. It authenticates and is attributed to its enrolled person.
PQ-visible behavior. The entry produces its access or keypad event attributed to the enrolled person. This is the case that catches encoding defects: protocols that pack digits two per byte need a filler nibble for an odd count, and a wrong filler stores a different value than the one enrolled — invisible until someone actually types it. Adapters whose PIN encoding has no parity sensitivity still run it; those without numeric PIN support record n_a.
Physical acts.
enter_pin— keypad Thing (credential: the AAT odd-digit PIN)
Steps.
- stimulus: enter_pin
expect:
- type=pq.event.access.granted|pq.event.intrusion;thing={keypad}
timeout: 120
Card formats¶
AAT-ACCESS-CARD-FORMATS-01¶
A card in a supported format is decoded to the expected PQ number.
| Applies when | capability:access.card_formats |
| Stimulus | human · wave 2 |
| Capability | access.card_formats |
| Hardware | A card of the format under test. |
| Preconditions | person_with_card_and_door_access |
| Depends on | AAT-ACCESS-CREDENTIAL-05 |
Given. The device accepts the card format AAT-Card-1 is encoded in.
When. The user presents AAT-Card-1.
Then. The number PQ reads matches the enrolled canonical number.
PQ-visible behavior. pq.event.access.granted carries the same credential/number that was enrolled — facility code and bit length decode per the documented format.
Physical acts.
present_credential— the reader of the modeled door (credential: the AAT card encoded in the format under test)
Steps.
What the steps cannot decide. The verdict is the equality of the number in the event payload with the enrolled canonical number, which the filter does not read; the steps prove the presentation was granted.
Sync mode¶
AAT-ACCESS-SYNC-MODE-01¶
A single credential change takes the sync path the device supports.
| Applies when | capability:access.sync_mode |
| Stimulus | pq · wave 1 |
| Capability | access.sync_mode |
| Preconditions | person_with_card_and_door_access |
| Since | Matrix v5 |
Given. The device's update capability is known (in-place vs full reload).
When. A single credential changes and a sync runs.
Then. The sync completes on the path the device supports.
PQ-visible behavior. The synchronization completes and its PQ-side facts show the path taken: an in-place device moves only the changed record, a full-only device reloads the whole set. This half proves what PQ sent; that the reload cost no other credential its access is AAT-ACCESS-SYNC-MODE-02.
Steps.
- command: pq.command.access.synchronize
on: {root}
expect:
- type=pq.event.access.synchronization.completed;thing={root}
timeout: 600
What the steps cannot decide. Which path the sync took is read from its facts, not from a record shape; the steps prove it completed.
AAT-ACCESS-SYNC-MODE-02¶
A sync of one changed credential costs no other credential its access.
| Applies when | capability:access.sync_mode |
| Stimulus | human · wave 2 |
| Capability | access.sync_mode |
| Hardware | A reader and a second card synchronized to the same door. |
| Preconditions | person_with_card_and_door_access |
| Depends on | AAT-ACCESS-SYNC-MODE-01 |
| Since | Matrix v5 |
Given. A second AAT credential holds access to the same door and one credential has just been re-synced.
When. The untouched credential is presented at the reader after that sync.
Then. It still grants — the sync path lost no collateral record.
PQ-visible behavior. pq.event.access.granted for the untouched credential at the door after the sync. Only the device decides whether the record survived the reload, so behavior is the evidence.
Physical acts.
present_credential— the reader of the door both credentials are authorized for (credential: the AAT card that was not changed in the sync)
Steps.
Reset & restore¶
AAT-ACCESS-RESET-RESTORE-01¶
A reset clears the device tables and re-pushes the whole dataset.
| Applies when | capability:access.reset_and_restore |
| Stimulus | pq · wave 1 |
| Capability | access.reset_and_restore |
| Preconditions | person_with_card_and_door_access |
| Since | Matrix v5 |
Given. The device holds a synced credential set.
When. pq.command.access.synchronize.reset runs.
Then. The clear is confirmed and a fresh full synchronization follows it.
PQ-visible behavior. The reset command succeeds and a synchronization follows it that completes with the full set re-sent. This half proves what PQ sent; that the panel accepted the reload is AAT-ACCESS-RESET-RESTORE-02. NOTE: wiping every credential off a panel currently raises no audit event — pq.event.access.credential.deleted.all exists in the taxonomy but the reset path does not emit it, so a customer's audit trail shows a synchronization and never the wipe that preceded it. Until that is closed, the scenario asserts the sync, not the wipe.
Steps.
- command: pq.command.access.synchronize.reset
on: {root}
expect:
- kind=commandResult;result=success;thing={root}
- type=pq.event.access.synchronization.completed;thing={root}
order: sequence
timeout: 900
AAT-ACCESS-RESET-RESTORE-02¶
Credentials work again on the device after a reset.
| Applies when | capability:access.reset_and_restore |
| Stimulus | human · wave 2 |
| Capability | access.reset_and_restore |
| Hardware | A reader and the card. |
| Preconditions | person_with_card_and_door_access |
| Depends on | AAT-ACCESS-RESET-RESTORE-01 |
| Since | Matrix v5 |
Given. A reset has cleared the device and the full set has been re-pushed.
When. The synchronized card is presented at the reader after the reset.
Then. It grants — the reloaded dataset is live on the device.
PQ-visible behavior. pq.event.access.granted at the door for the AAT card after the reset completes. Whether the re-pushed record actually landed is the device's answer, given by the door opening.
Physical acts.
present_credential— the reader of the door the credential is authorized for (credential: the AAT card re-pushed by the reset)
Steps.
Double-sync safety¶
AAT-ACCESS-DOUBLE-SYNC-01¶
Running sync twice with unchanged input is a no-op on the PQ side.
| Applies when | capability:access.double_sync_safety |
| Stimulus | pq · wave 1 |
| Capability | access.double_sync_safety |
| Preconditions | person_with_card_and_door_access |
| Since | Matrix v5 |
Given. The credential set is synced and unchanged.
When. pq.command.access.synchronize runs a second time with identical input.
Then. The second sync completes with nothing to do — no error, no second round of writes.
PQ-visible behavior. The second synchronization completes without failure and its facts show no records added or re-sent (idempotent Transform). That the device set survived the repeat is AAT-ACCESS-DOUBLE-SYNC-02.
Steps.
- command: pq.command.access.synchronize
on: {root}
expect:
- type=pq.event.access.synchronization.completed;thing={root}
timeout: 600
- command: pq.command.access.synchronize
on: {root}
expect:
- type=pq.event.access.synchronization.completed;thing={root}
timeout: 600
What the steps cannot decide. That the second run wrote nothing is a count in its facts; the steps prove both runs completed without failure.
AAT-ACCESS-DOUBLE-SYNC-02¶
A repeated sync leaves the device's credential set working.
| Applies when | capability:access.double_sync_safety |
| Stimulus | human · wave 2 |
| Capability | access.double_sync_safety |
| Hardware | A reader and the card. |
| Preconditions | person_with_card_and_door_access |
| Depends on | AAT-ACCESS-DOUBLE-SYNC-01 |
| Since | Matrix v5 |
Given. The same input has been synchronized twice.
When. The synchronized card is presented at the reader after the second sync.
Then. It grants exactly as before — the repeat neither dropped nor duplicated the record.
PQ-visible behavior. pq.event.access.granted at the door, once, for the AAT card. A duplicated or clobbered device record shows up here as a denial or a doubled event; the device's own tables are not readable back, so behavior carries the verdict.
Physical acts.
present_credential— the reader of the door the credential is authorized for (credential: the AAT card synchronized twice)
Steps.
Schedules / time profiles¶
AAT-ACCESS-SCHEDULES-01¶
A schedule the device enforces denies access outside its window.
| Applies when | capability:access.schedules_time_profiles |
| Stimulus | human · wave 2 |
| Capability | access.schedules_time_profiles |
| Hardware | A reader and a card; a schedule window that can be tested. |
| Preconditions | person_with_card_and_door_access |
| Depends on | AAT-ACCESS-CREDENTIAL-05 |
Given. AAT-Card-1's grant is bound to a time schedule and synced.
When. The user presents the card outside the scheduled window.
Then. Access is denied for being out of schedule.
PQ-visible behavior. pq.event.access.denied.schedule at the door when presented outside the window; granted inside it.
Physical acts.
present_credential— the reader of the door the schedule-bound grant covers (credential: the schedule-bound AAT card, presented outside its window)
Steps.
- stimulus: present_credential
expect:
- type=pq.event.access.denied.schedule;thing={door}
reject:
- type=pq.event.access.granted;thing={door}
timeout: 120
Access levels / groups¶
AAT-ACCESS-ACCESS-LEVELS-01¶
An access-level binding grants exactly the access points it covers, and no others.
| Applies when | capability:access.access_levels_groups |
| Stimulus | human · wave 2 |
| Capability | access.access_levels_groups |
| Topology | 2× door / partition on distinct addresses |
| Hardware | Two access points a credential can be exercised at. |
| Preconditions | person_with_card_and_door_access, two_access_points_modeled |
| Depends on | AAT-ACCESS-CREDENTIAL-05, AAT-CROSS-CUTTING-COMMAND-TARGETING-01 |
| Since | Matrix v8 |
Given. AAT-Tester-1's access level covers access point A but not access point B.
When. The user exercises AAT-Card-1 at A, then at B.
Then. A grants, B denies.
PQ-visible behavior. pq.event.access.granted at A and pq.event.access.denied at B — the level binding flows through person.Devices, not a static mask. The unit of authorization is the access point (access_point: true), not the door: a panel that authorizes users per partition or floor models those as access points too (MODEL-002), and they carry this scenario exactly as doors do. Restricting it to doors would leave an intrusion panel's per-partition authorization — the mechanism most prone to being faked with a static bitmask — untested.
Physical acts.
present_credential— the readers serving the covered access point and the uncovered one, in turn (credential: the synchronized AAT card)
Steps.
- stimulus: present_credential
expect:
- type=pq.event.access.granted;thing={door}
timeout: 120
- stimulus: present_credential
expect:
- type=pq.event.access.denied;thing={door2}
reject:
- type=pq.event.access.granted;thing={door2}
timeout: 120
Holidays¶
AAT-ACCESS-HOLIDAYS-01¶
A synced holiday calendar changes schedule behavior on the device.
| Applies when | capability:access.holidays |
| Stimulus | human · wave 2 |
| Capability | access.holidays |
| Hardware | A reader, the card, and a schedule whose holiday variant differs from the day's normal rule. |
| Preconditions | person_with_card_and_door_access |
| Depends on | AAT-ACCESS-CREDENTIAL-05, AAT-ACCESS-SCHEDULES-01 |
| Since | Matrix v5 |
Given. A holiday calendar is synced, a schedule references it, and the current day is a holiday it defines.
When. The card bound to that schedule is presented on the holiday.
Then. The decision follows the holiday variant of the schedule.
PQ-visible behavior. The access decision on the holiday follows the holiday rule rather than the weekday rule (granted or denied as the rule says), which is the only proof the calendar reached the device — the panel decides on its own calendar and does not hand it back.
Physical acts.
present_credential— the reader of the door the schedule-bound grant covers, on a holiday the calendar defines (credential: the schedule-bound AAT card)
Steps.
What the steps cannot decide. Which decision is correct depends on the holiday rule, so the direction of the outcome — and not its mere arrival — carries the verdict; the step only proves the panel decided.
Antipassback¶
AAT-ACCESS-ANTIPASSBACK-01¶
A second entry without an intervening exit is denied on antipassback.
| Applies when | capability:access.antipassback |
| Stimulus | human · wave 2 |
| Capability | access.antipassback |
| Hardware | An APB-configured reader pair. |
| Preconditions | person_with_card_and_door_access |
| Depends on | AAT-ACCESS-CREDENTIAL-05 |
Given. An APB zone is configured and AAT-Tester-1 has entered.
When. The user presents the card to enter again without exiting.
Then. Access is denied for antipassback violation.
PQ-visible behavior. pq.event.access.denied.antipassback on the second entry; a clear via pq.command.access.antipassback.clear restores normal entry.
Physical acts.
present_credential— the entry reader of the APB zone, twice without an intervening exit (credential: the synchronized AAT card)
Steps.
- stimulus: present_credential
expect:
- type=pq.event.access.granted;thing={door}
timeout: 120
- stimulus: present_credential
expect:
- type=pq.event.access.denied.antipassback;thing={door}
timeout: 120
Door control¶
AAT-ACCESS-DOOR-CONTROL-01¶
A strike release from PQ opens the door momentarily and is confirmed.
| Applies when | category:access |
| Stimulus | pq · wave 1 |
| Capability | access.door_control |
| Preconditions | door_modeled |
Given. A door with a controllable strike is modeled.
When. An operator issues pq.command.access.open on the door.
Then. The strike releases briefly and PQ observes the release.
PQ-visible behavior. pq.event.access.door.unsecured.remote on the door, then relock; command outcome confirmed.
Steps.
- command: pq.command.access.open
on: {door}
expect:
- type=pq.event.access.door.unsecured.remote;thing={door}
timeout: 30
AAT-ACCESS-DOOR-CONTROL-02¶
A permanent-open (unlock) command holds the door open until cancelled.
| Applies when | capability:access.door_control |
| Stimulus | pq · wave 1 |
| Capability | access.door_control |
| Preconditions | door_modeled |
Given. A door is modeled and secured.
When. An operator issues pq.command.access.open.permanent, then pq.command.access.lock.
Then. The door holds unsecured, then returns to secured on the closing command.
PQ-visible behavior. pq.event.access.door.unsecured.remote persisting after open.permanent, then pq.event.access.door.secured.remote after the closing command.
Steps.
- command: pq.command.access.open.permanent
on: {door}
expect:
- type=pq.event.access.door.unsecured.remote;thing={door}
timeout: 30
- command: pq.command.access.close
on: {door}
expect:
- type=pq.event.access.door.secured.remote;thing={door}
timeout: 30
AAT-ACCESS-DOOR-CONTROL-03¶
Deadbolt lock/unlock is exposed where the protocol has a real lock actuator.
| Applies when | capability:access.door_control |
| Stimulus | pq · wave 1 |
| Capability | access.door_control |
| Preconditions | door_modeled |
Given. The door has a lock/deadbolt actuator distinct from the strike.
When. An operator issues pq.command.access.lock then pq.command.access.unlock.
Then. The lock engages and disengages with matching PQ events.
PQ-visible behavior. pq.event.access.door.locked.remote then pq.event.access.door.unlocked.remote. If the device has no real lock actuator (strike only), this is n_a (not_supported_by_protocol), not failed.
Steps.
- command: pq.command.access.lock
on: {door}
expect:
- type=pq.event.access.door.locked.remote;thing={door}
timeout: 30
- command: pq.command.access.unlock
on: {door}
expect:
- type=pq.event.access.door.unlocked.remote;thing={door}
timeout: 30
AAT-ACCESS-DOOR-CONTROL-04¶
A forced-open door is reported and its clear is reported.
| Applies when | capability:access.door_control |
| Stimulus | human · wave 3 |
| Capability | access.door_control |
| Hardware | A door with a monitored contact. |
| Preconditions | door_modeled |
| Depends on | AAT-ACCESS-DOOR-CONTROL-01 |
Given. A door with a position/contact sensor is secured.
When. The user forces the door open without a valid grant, then closes it.
Then. PQ reports the forced condition and its clear.
PQ-visible behavior. pq.event.access.door.forced on the forced open, then pq.event.access.door.forced.cleared on close — both routed.
Physical acts.
open_door— the modeled door with a monitored contact, opened without a grant and closed again
Steps.
- stimulus: open_door
expect:
- type=pq.event.access.door.forced;thing={door}
timeout: 120
- stimulus: open_door
restore: True
expect:
- type=pq.event.access.door.forced.cleared;thing={door}
timeout: 120
AAT-ACCESS-DOOR-CONTROL-05¶
A held-open (door-open-too-long) condition is reported and clears.
| Applies when | capability:access.door_control |
| Stimulus | human · wave 3 |
| Capability | access.door_control |
| Hardware | A door with a monitored contact. |
| Preconditions | door_modeled |
| Depends on | AAT-ACCESS-DOOR-CONTROL-01 |
Given. A door with a position sensor and held-open timer.
When. The user holds the door open past the timeout, then closes it.
Then. PQ reports held-open and its clear.
PQ-visible behavior. pq.event.access.door.held after the timeout, then pq.event.access.door.held.cleared on close.
Physical acts.
hold_door— the modeled door with a monitored contact, held past its held-open timeout
Steps.
- stimulus: hold_door
expect:
- type=pq.event.access.door.held;thing={door}
timeout: 180
- stimulus: hold_door
restore: True
expect:
- type=pq.event.access.door.held.cleared;thing={door}
timeout: 120
Reader mode / enable¶
AAT-ACCESS-READER-MODE-01¶
Disabling a reader from PQ stops it granting access.
| Applies when | capability:access.reader_mode_enable |
| Stimulus | human · wave 2 |
| Capability | access.reader_mode_enable |
| Hardware | A reader and the card. |
| Preconditions | person_with_card_and_door_access |
| Depends on | AAT-CROSS-CUTTING-UNIVERSAL-03, AAT-ACCESS-CREDENTIAL-05 |
Given. AAT-Card-1 normally grants at the reader.
When. An operator issues pq.command.access.disable on the reader, then presents the card.
Then. The disabled reader does not grant; re-enabling restores it.
PQ-visible behavior. After disable, presenting AAT-Card-1 yields no grant (denied/locked or no reaction per protocol); pq.command.access.enable restores pq.event.access.granted.
Physical acts.
present_credential— the disabled reader, and the same reader again after it is re-enabled (credential: the synchronized AAT card)
Steps.
- command: pq.command.access.disable
on: {reader}
expect:
- kind=commandResult;result=success;thing={reader}
timeout: 30
- stimulus: present_credential
reject:
- type=pq.event.access.granted;thing={door}
timeout: 60
- command: pq.command.access.enable
on: {reader}
expect:
- kind=commandResult;result=success;thing={reader}
timeout: 30
- stimulus: present_credential
expect:
- type=pq.event.access.granted;thing={door}
timeout: 120
Synchronization ownership and cascade¶
AAT-ACCESS-OWNERSHIP-01¶
Synchronization leaves credentials PQ does not own working.
| Applies when | capability:access.credential_management |
| Stimulus | human · wave 2 |
| Capability | access.credential_management |
| Hardware | A credential on the device that PQ did not create and that can be exercised. |
| Preconditions | person_with_card_and_door_access, foreign_record_on_device |
| Depends on | AAT-ACCESS-CREDENTIAL-05 |
| Since | Matrix v4 |
Given. The device holds a working credential PQ did not create — an installer-entered user whose PIN or card is known and exercisable — alongside the synchronized AAT records.
When. A synchronization runs, including one that removes an AAT credential.
Then. The foreign credential still authenticates afterwards.
PQ-visible behavior. After the sync, using the foreign credential still produces its granted/armed event, while the removed AAT credential no longer does. Wiping a record PQ does not own is irreversible damage on a customer panel, which is why this is verified by using the credential rather than by trusting the sync report — the report only says what PQ intended.
Physical acts.
use_credential— the reader or keypad the foreign credential belongs to (credential: the credential on the device that PQ did not create)
Steps.
- command: pq.command.access.synchronize
on: {root}
expect:
- type=pq.event.access.synchronization.completed;thing={root}
timeout: 600
- stimulus: use_credential
expect:
- type=pq.event.access.granted|pq.event.intrusion.disarmed
timeout: 180
AAT-ACCESS-CASCADE-01¶
Deleting a person stops every one of their credentials working, not just the first.
| Applies when | capability:access.credential_management |
| Stimulus | human · wave 2 |
| Capability | access.credential_management |
| Hardware | A reader and keypad, plus the physical credentials. |
| Preconditions | person_with_card_and_door_access |
| Depends on | AAT-ACCESS-CREDENTIAL-05 |
| Since | Matrix v4 |
Given. The AAT person holds more than one credential — card and PIN — all synchronized and all proven working.
When. The person is deleted in PQ and synchronization runs.
Then. Every one of that person's credentials is refused.
PQ-visible behavior. Each credential in turn now yields a denial rather than a grant. A single leftover credential means a departed employee still gets in, so every credential the person held is exercised — testing only one would miss exactly the defect this scenario exists to catch.
Physical acts.
use_credential— the reader or keypad each credential belongs to (credential: every credential the deleted AAT person held, in turn)
Steps.
- command: pq.command.access.synchronize
on: {root}
expect:
- type=pq.event.access.synchronization.completed;thing={root}
timeout: 600
- stimulus: use_credential
expect:
- type=pq.event.access.denied
reject:
- type=pq.event.access.granted
timeout: 180
What the steps cannot decide. Every credential the person held is exercised in turn; the step covers one presentation, so the runner repeats it per credential and the verdict holds only when all of them were refused.