How to

How to build a policy attestation tracker

An auditor asks for evidence that everyone read the security policy, and the answer is a spreadsheet and some emails. Here is the model behind a tracker, the prompts to build it, and what it takes to run it.

The short answer

A policy attestation tracker needs four things: versioned policies with an effective date, assignment rules that target the right population, an attestation record tied to a specific version, and a completion report that distinguishes not yet due from overdue. The detail that makes it audit-grade is the version binding. An attestation that says someone accepted "the security policy" proves nothing if the policy has since changed, so every record must name the exact version and the date it was accepted.

attestations.helix-app.ai

Attestations

2

Waiting on you

94%

Completed, in scope

31

Outstanding, not yet due

11

Overdue

Policy Version In scope Completed Overdue
Information security v4.2 412 387 11
Acceptable use v2.0 412 401 0
Code of conduct v3.1 412 409 0
Data handling v1.4 96 71 4
Trading policy v2.2 38 38 0
A sketch of the completion view. Outstanding-but-not-yet-due and overdue are separate columns, because collapsing them makes the percentage meaningless the week after a policy is published.

What matters here

  • An attestation tracker is four parts: versioned policies, assignment rules, version-bound attestation records, and completion reporting.
  • Bind each attestation to a policy version. An attestation against a document that has since changed is not evidence.
  • Assign by rule, not by list. New joiners and role changes have to pick up the right policies automatically.
  • Distinguish not yet due from overdue in every report. Collapsing them makes the completion figure meaningless.
  • Track time to attest as well as completion. A policy that takes six weeks to reach 90% has a distribution problem, not a compliance one.
  • The report is the deliverable. If exporting evidence for a period takes more than one click, the tracker has not saved anyone anything.

Who this is for

You run compliance, security or people operations. You already have policies. What you want is to know who has accepted which version, to chase the rest automatically, and to export the evidence without assembling it by hand.

How it works in practice

What happens when a policy is published, and what an auditor gets at the end.

  1. 1

    A version is published, not edited

    With an effective date and a note of what changed, so existing attestations stay bound to the version they were made against.

  2. 2

    Only material changes force re-attestation

    A flag per version. A typo fix should not send 400 people back to a document.

  3. 3

    Assignment runs continuously, not once

    Rules over department, role, location and employment type, so joiners and internal movers pick up what they need automatically.

  4. 4

    People accept a specific version, on a specific date

    With the statement text they agreed to recorded alongside it. Immutable once made.

  5. 5

    Chasing happens on a schedule

    Reminders before the due date, manager notified after it.

  6. 6

    The evidence export is one click

    Every person in scope, the version, the timestamp and the statement, as a file an auditor can read without explanation.

What an attestation tracker is made of

An attestation tracker is not a mailing list with a read receipt. It is four parts, and the first one is what makes the record hold up.

Versioned policies

Each policy with a version, an effective date, the document itself, an owner, a review cycle, and whether a new version requires re-attestation from everyone or only from new joiners.

Assignment rules

Who must attest, expressed as conditions over department, role, location and employment type, evaluated continuously so joiners and movers are picked up automatically.

Attestation records

Person, policy, exact version, timestamp, and how they attested. Immutable once made, because an editable attestation is not evidence.

Completion reporting

By policy, by version, by team, separating completed, outstanding within the window, and overdue. Exportable for a period in one click.

These prompts start from a Helix project, which is what handles sign-in, credentials and hosting. Start with Helix

The prompts

Paste these into Claude Code, Codex or Cursor in order. Each one leaves you with something that runs, so you can stop after any step.

  1. Versions, because that is what makes it evidence

    Publishing rather than editing, and choosing when re-attestation is warranted.

    In this Helix project, build me a policy attestation tracker.
    
    Policies have versions, and versions are never edited. Each version has a
    number, an effective date, the document, a summary of what changed from
    the previous one, who published it and when.
    
    Add a flag per version saying whether it requires everyone to re-attest,
    or only people who have never attested. That flag is what keeps this
    proportionate. A typo correction should not send four hundred people back
    to a document, and forcing it destroys engagement with the ones that
    matter.
    
    Show the summary of changes to anyone re-attesting. People deserve to know
    what is different, and a written summary field is enough.
    
    Flag policies past their review date, and any version with no effective
    date set.
    
    I sign in through Helix, so do not build a login page. Read the signed-in
    user from the runtime. And do not put any key or connection string in the
    code: if this needs to reach another system, tell me and I will create the
    connection in my workspace.

    Worth knowing. An attestation against a document that has since changed proves nothing. Binding it to a version number and effective date is what makes it evidence.

  2. Assign by rule, continuously

    Because a generated list is stale the day after you generate it.

    Now assignment. Write rules over person attributes: department, role, level,
    location, employment type. Each rule says which policy applies and how
    many days somebody has, counted from the later of the version's effective
    date and that person's start date.
    
    Evaluate those rules continuously rather than at publish time. A new
    joiner picks up every policy they need, and someone changing role picks up
    the new ones. A one-off assignment list is stale the day after it is
    generated, and joiners and movers are exactly the people most likely to be
    missed.
    
    Let me see, per version, the current assigned population and how it was
    derived, so I can check a rule before publishing.
    
    And handle leavers: their outstanding attestations close as not applicable
    rather than sitting overdue forever and quietly ruining the report.
  3. Collect it in a way that holds up

    The record, and getting people to make it.

    An attestation records the person, the exact policy version, the timestamp,
    the method, and the statement text they accepted. Immutable once created.
    
    The page shows the policy, requires the person to reach the end before the
    accept action is enabled, and states plainly what they are attesting to.
    
    Support optional comprehension questions per version, configurable, with
    answers recorded. Use them for the few policies where it matters rather
    than everywhere.
    
    Notify on assignment, remind on a schedule before the due date, then
    notify the person's manager once it passes.
    
    Give everyone a personal view of what they owe, what is outstanding, and
    what they have already accepted with the version and date.
    
    And do not allow an attestation to be made on somebody's behalf. If a
    paper process is genuinely needed, record it as a separate evidence type
    with the document attached and a note of who recorded it.

    Worth knowing. Recording the exact statement text alongside the timestamp is what makes the record defensible. What people accepted matters as much as when.

  4. The reports that are the reason to build it

    Three states, never two, and a one-click export.

    Report completion by policy, version, department and manager, and always
    separate three states: completed, outstanding but not yet due, and
    overdue. Collapsing the last two into one outstanding figure makes the
    completion percentage meaningless the week after a policy is published.
    
    Give managers a view of their own team's outstanding items.
    
    Report time to attest, as a median and a distribution per version. A
    policy that takes six weeks to reach ninety percent has a distribution
    problem rather than a compliance one, and that is a different fix.
    
    Then the export: every person in scope for a period, the policy version,
    the attestation timestamp, and the statement accepted. One click, as a
    file an auditor can read without explanation.
    
    Plus an exceptions view of people who have never attested to something
    assigned to them, and a per-person history of every version they have ever
    accepted, which is what gets requested when one individual becomes the
    subject of a question.
  5. Connect it to real systems

    The step that turns a working prototype into something with your data in it.

    Now connect it to the systems we actually run, so it works on real data
    rather than the rows you seeded.
    
    Anything in angle brackets is a placeholder. Swap it for whatever we use
    instead, and have the app name the connection it wants rather than assume
    a vendor, so changing my mind later is a config change and not a rewrite.
    
    <Workday>. Read department, role, level, location and start date,
    evaluated continuously so joiners are never missed.
    
    <Okta>. Authenticate every attestation, which is what makes the record
    evidence rather than a claim.
    
    <Google Drive>. Hold each policy version, so an attestation points at
    exactly what was accepted.
    
    <Slack>. Remind before the due date and escalate to a manager after it.
    
    <Vanta>. Push completion evidence in as it happens, so nobody exports the
    same attestation record twice.
    
    <Gmail>. Send the attestation request and the reminders, timestamped
    against the due date.
    
    <Snowflake>. Keep the historical record queryable, so a per-person history
    survives a policy being retired.
    
    Only write where I have said to write. Everything else is read only.
    
    Do not write a key, a token or a connection string anywhere in the code,
    and do not ask me to paste one. Tell me which connections you need and I
    will create each as an authentication in my Helix workspace. Reference
    them by alias.

    Worth knowing. Every name in angle brackets is a placeholder for whatever you run. Helix holds the credential as a workspace authentication, so the app references an alias and never the secret itself.

  6. Ship it

    The last step of every build: a URL, and the right people on it.

    Deploy my app.

    Worth knowing. Your assistant runs helix deploy underneath and the app comes back as a URL. An attestation is only evidence if the identity behind it is verified, which is exactly what Access Control and SSO give you. Set it before sharing.

What it connects to

Assignment has to be continuous, which means reading the org rather than a list somebody exported.

  • Workday

    Read department, role, level, location and start date, evaluated continuously so joiners are never missed.

  • Okta

    Authenticate every attestation, which is what makes the record evidence rather than a claim.

  • Google Drive

    Hold each policy version, so an attestation points at exactly what was accepted.

  • Slack

    Remind before the due date and escalate to a manager after it.

  • Vanta

    Push completion evidence in as it happens, so nobody exports the same attestation record twice.

  • Gmail

    Send the attestation request and the reminders, timestamped against the due date.

  • Snowflake

    Keep the historical record queryable, so a per-person history survives a policy being retired.

Each line says whether the app reads, writes or both. Anything not described as writing should be read only.

Named systems are the ones most teams actually run, not a list of the only ones that work. Swap in whatever you use.

Each connection is an authentication in your Helix workspace, referenced by alias. The app names the connection it wants and never holds the credential, so nothing here ends up in your code and any of it can be rotated or revoked without a redeploy.

Running it for real

The build gets you a working tracker. Its output is evidence, and evidence has to be attributable, so identity and access control are the core of the design.

AI Deployment

Get it to a URL people can open

One command takes the app from your assistant to a live address, so the people who need it get a link rather than instructions for running it locally.

App Security

Put your identity provider in front of it

An attestation is only evidence if the identity behind it is verified. SSO means every record is tied to an authenticated person rather than a typed name, which is the difference between a record and a claim.

App Security

Connect the system of record with managed credentials

Pulling the current staff list and role attributes from an HR system keeps assignment accurate. Granting that access to the app rather than pasting a key into it means it can be rotated or revoked without a redeploy.

App Registry

Put a name on it

Every app carries a named owner and an entry IT can see, so the tool does not become nobody's problem when the person who built it changes role.

Cost Management

Know what it costs to run

Per-app spend visibility, with budgets and caps, so an internal tool cannot quietly become a line item nobody can explain.

Questions people ask

What is a policy attestation tracker?

It holds versioned policies, works out who must accept each one from rules over role and department, records each acceptance against a specific version, and produces the completion evidence an audit asks for.

Why must an attestation be bound to a policy version?

Because a record saying someone accepted "the security policy" proves nothing once the policy has changed. Binding the record to a version number and effective date is what makes it evidence rather than a note.

Should every policy change trigger re-attestation?

No, and forcing it destroys engagement. Make it a flag per version: material changes require everyone to re-attest, and minor corrections apply only to people who have never attested. A typo fix should not send 400 people back to a document.

How should policies be assigned to people?

By rules over department, role, location and employment type, evaluated continuously rather than as a one-off list. A generated list is stale the day after, and new joiners and internal movers are exactly the people most likely to be missed.

What should a completion report show?

Three states, never two: completed, outstanding but not yet due, and overdue. Collapsing the last two into a single outstanding figure makes the completion percentage meaningless the week after a policy is published.

Can I build this without an engineering team?

Yes. The prompts here are written for Claude Code, Codex or Cursor and stage the build. The judgement calls are your assignment rules and which versions genuinely warrant re-attestation.

Last reviewed September 2026.

Build it, then run it properly

Helix is the governed runtime for AI-built apps. Deploy what you build, put SSO in front of it, connect it to your systems with managed credentials, and give it a named owner.