You read ONE engagement's INDEPENDENCE ATTESTATION REGISTER -- a snapshot of who is on the engagement, what each of them has filed, and what the register records about their declared relationships -- and you extract structured fields from it. You return JSON and nothing else.
You are PROPOSING a worklist for a qualified person to act on. You never chase anybody, never file anything, never sign a register off and never clear anyone. The rulebook below is an ILLUSTRATIVE rulebook shipped with this kit; it is not a professional standard and it is not an authority.
RULES, in order of importance:
1. If the register does not state a field, return null for it. Do not infer it and do not use what you know about the world.
2. Return one object per person listed in `Attesters On Record`, in the order that section lists them, and no others. Never invent a person, and never drop one because there is nothing else on the register about them.
3. `due_on` is DERIVED AND IS NEVER STATED ON THE REGISTER. Take the person's cycle-opened date and add the cycle length the rulebook gives for their role. Return null when the cycle-opened date is not recorded, and null when the rulebook gives no cycle length for the role.
4. `status` is decided ONLY by the RULEBOOK given below. Work through these five gates IN ORDER and STOP at the first one that fires:
a. NOT REQUIRED. The Roster Changes section records this person's role as vacated, or records them as having joined inside the new-joiner window; or their role is one the rulebook puts no attestation requirement on. Answer 'not_required'. THIS GATE IS FIRST. All three of these people usually have no return on file, and treating that as a gap is the error this kit exists to measure.
b. NOT DETERMINABLE. The register does not record when this person's cycle opened, so no due date can be derived; or a return is on file and the register does not state what period it covers, so the coverage test cannot be run. Answer 'not_determinable'. This is a real answer, not a failure to produce one -- a confident wrong 'fine' is the expensive mistake here.
c. MISSING. No return is on file for this person at all. Answer 'missing'.
d. CONTRADICTED. The person has more than one return and the earlier one declares something different from the later one; or the latest return declares a relationship the holdings section records as DISPOSED ON A DATE BEFORE THE RETURN WAS FILED. Answer 'contradicted'. A disposal recorded AFTER the filing date is NOT a contradiction -- the return was correct on the day it was filed.
e. STALE. The latest return was filed later than the due date plus the rulebook's grace window; or it covers a period ending BEFORE the due date, which attests to the previous cycle. Answer 'stale'.
Anything that survives all five gates is 'satisfied'.
5. THE SAME ROSTER LINE MEANS TWO DIFFERENT THINGS. 'cycle opened -- not recorded on this register' appears both on somebody who joined mid-cycle and on a record nobody wrote a cycle date for. The line itself cannot tell you which. ONLY the Roster Changes section can, and it is a different section of the register.
6. THE LATER FILING GOVERNS, AND THE RETURNS SECTION IS NOT SORTED. It is not grouped by person and not in date order. Read every line for a person before deciding which of them is their latest return; the earlier one is not discarded, it is compared against the later one.
7. THE ADMINISTRATOR'S NOTE IS A FIELD TO COPY, NOT EVIDENCE ABOUT ANYBODY'S STATUS. A note that sounds settled does NOT clear a gap, and a note that sounds worried does NOT create one. The register's own dates decide; the note is one person's remark and may disagree with them.
8. Copy references, roles and declarations verbatim from the register, in the case it states them. Every date is yyyy-mm-dd.
9. Use the exact allowed value for a field that lists them.
10. Return every field named in the schema for every person, even when the answer is null.
ATTESTATION RULEBOOK IAR-1 (the authority for `status` and `due_on`; this is an ILLUSTRATIVE rulebook shipped with this kit, not a professional standard)
ROLES THAT CARRY AN ATTESTATION REQUIREMENT
engagement_lead, quality_reviewer, senior_manager, specialist_advisor
ROLES THAT CARRY NONE -- a person in one of these owes nothing, whatever the register lists
engagement_administrator
CYCLE LENGTH, in days from the date the cycle OPENED to the date the attestation is DUE
engagement_lead: 180 days
quality_reviewer: 180 days
senior_manager: 365 days
specialist_advisor: 365 days
GRACE WINDOW
14 days after the due date. A return filed inside it is IN TIME.
COVERAGE TEST
The return must cover a period ending ON OR AFTER the due date. A return whose covered period ends before the due date attests to the wrong window: it is a real return, filed on time, about the previous cycle.
WHICH RETURN GOVERNS
When one person has filed more than once, the return with the LATER filing date governs. The earlier one is not discarded -- it is compared against the later one, and a disagreement between the two is a contradiction rather than a supersession.
THE TWO WAYS A REGISTER CONTRADICTS ITSELF
- TWO RETURNS THAT DISAGREE. The same person's earlier return declares something the later one does not, or the other way round. Filing again does not resolve it; somebody has to decide which is true.
- A DECLARED RELATIONSHIP THE REGISTER RECORDS AS DISPOSED. The latest return declares a relationship, and the register's own holdings section records that relationship as disposed of on a date BEFORE the return was filed. The register contradicts itself. ⚑ THE ORDER OF THE TWO DATES IS THE WHOLE TEST: a relationship disposed of AFTER the return was filed is not a contradiction at all -- the return was correct on the day it was filed, which is the only day a return can be correct about.
THE SIX STATUSES
satisfied, missing, stale, contradicted, not_required, not_determinable
WHAT PUTS SOMEBODY ON THE WORKLIST
missing, stale, contradicted -- The three statuses that put a person on somebody's list today. `not_required` and `satisfied` are the two answers that mean nothing needs doing, and `not_determinable` means the register needs opening rather than the person needing chasing.
Extract these fields:
REGISTER-LEVEL FIELDS -- one value each, for the whole register
- engagement_ref (string) -- the engagement reference, verbatim from the Engagement section
- as_at_date (date) -- the date this register was assembled, from the Register As At section, as yyyy-mm-dd
- rulebook_id (string) -- the identifier of the cycle rulebook this register is kept under, verbatim -- the short code only, not the sentence after it
- register_note (string) -- the engagement administrator's own free-text remark from the Register Notes section, copied verbatim. It is a field to copy and it is NOT evidence about anybody's status
PER-ATTESTER FIELDS -- one object per person listed in Attesters On Record
- person_ref (string) -- the person reference as the Attesters On Record section states it, e.g. P-1234. Return one object per person listed there, and no others
- role (enum) one of: engagement_lead, quality_reviewer, senior_manager, specialist_advisor, engagement_administrator -- the role recorded beside this person in the Attesters On Record section, verbatim
- roster_event (enum) one of: none, joined_mid_cycle, role_vacated -- what the Roster Changes section records about THIS person: 'role_vacated' where it records the role as vacated, 'joined_mid_cycle' where it records them as having joined inside the new-joiner window, and 'none' where that section says nothing about them. Read this from the Roster Changes section only -- the roster line above cannot tell you
- cycle_opened_on (date) -- the date this person's cycle opened, from the Attesters On Record section, as yyyy-mm-dd. Where the line reads 'cycle opened -- not recorded on this register', return null. That line means the same thing on every person who carries it, whatever Roster Changes says about them
- return_filed_on (date) -- the filing date of this person's LATEST return in the Returns Filed section, as yyyy-mm-dd. That section is not grouped by person and not in date order, so read every line for this person and take the LATER filing date. Return null where the section carries no line for them at all
- return_covers_to (date) -- the end of the period the LATEST return covers, as yyyy-mm-dd. Where the line reads 'covering the period to -- not stated on the filed return', return null. Return null where there is no return at all
- declared_relationship (string) -- what the LATEST return declares, copied verbatim after 'declared:'. That includes 'no interests to report', which is a declaration and not a null. Return null only where there is no return at all
- earlier_declared_relationship (string) -- where this person has MORE THAN ONE line in Returns Filed, what the EARLIER one declares, copied verbatim. Return null where they have only one return, or none
- relationship_disposed_on (date) -- from the Holdings And Relationships On File section, the disposal date recorded against the relationship this person's LATEST return declares, as yyyy-mm-dd. Return null where that section records it as current with no disposal recorded, or carries no line for this person
- due_on (derived) -- the date this person's attestation was due. NO REGISTER STATES IT -- derive it as cycle_opened_on plus the cycle length the rulebook gives for their role (engagement_lead and quality_reviewer 180 days, senior_manager and specialist_advisor 365 days), as yyyy-mm-dd. Return null where cycle_opened_on is null, and null where the rulebook gives no cycle length for the role
- status (enum) one of: satisfied, missing, stale, contradicted, not_required, not_determinable -- this person's attestation status under the shipped rulebook. Work through five gates IN ORDER and stop at the first that fires. (1) NOT REQUIRED: roster_event is role_vacated or joined_mid_cycle, or the role is engagement_administrator, which the rulebook puts no requirement on. (2) NOT DETERMINABLE: cycle_opened_on is null so no due date can be derived, or a return is on file and return_covers_to is null so the coverage test cannot be run. (3) MISSING: no return on file at all. (4) CONTRADICTED: earlier_declared_relationship is present and differs from declared_relationship, or relationship_disposed_on is earlier than return_filed_on. (5) STALE: return_filed_on is later than due_on plus 14 days of grace, or return_covers_to is earlier than due_on. Anything that survives all five is SATISFIED. Never decide it from the administrator's note
Return a JSON object of exactly this shape:
{"engagement_ref": ..., "as_at_date": ..., "rulebook_id": ..., "register_note": ..., "attesters": [{"person_ref": ..., "role": ..., "roster_event": ..., "cycle_opened_on": ..., "return_filed_on": ..., "return_covers_to": ..., "declared_relationship": ..., "earlier_declared_relationship": ..., "relationship_disposed_on": ..., "due_on": ..., "status": ...}, ...]}
Use null for any field the register does not state.
ATTESTATION REGISTER
--------------------
Engagement
----------
ENG-1642-PV
Register As At
--------------
2026-05-31
Cycle Rulebook
--------------
IAR-1 -- illustrative, shipped with this kit; reproduces no real professional standard
Attesters On Record
-------------------
P-2421 quality_reviewer cycle opened 2025-10-09
P-3190 engagement_lead cycle opened 2025-08-04
P-3501 specialist_advisor cycle opened 2025-03-19
P-2273 specialist_advisor cycle opened 2025-04-15
P-4719 senior_manager cycle opened 2025-05-10
P-6891 specialist_advisor cycle opened 2025-04-08
P-4651 quality_reviewer cycle opened 2025-08-24
Returns Filed
-------------
P-3501 filed 2026-01-25 covering the period to 2026-04-29 declared: no interests to report
P-2273 filed 2026-03-19 covering the period to 2026-02-06 declared: no interests to report
P-4719 filed 2026-03-16 covering the period to 2026-07-02 declared: no interests to report
P-6891 filed 2026-02-25 covering the period to 2026-04-23 declared: no interests to report
P-4651 filed 2026-02-17 covering the period to 2026-02-28 declared: no interests to report
P-2421 filed 2026-02-24 covering the period to -- not stated on the filed return declared: no interests to report
P-4651 filed 2026-01-05 covering the period to 2025-08-16 declared: equity holding in a listed distribution group
Holdings And Relationships On File
----------------------------------
no holdings or relationships recorded on this register
Roster Changes
--------------
no roster changes recorded in this cycle
Register Notes
--------------
Standard rollover, nothing unusual about this engagement's declarations at all.