What this is¶
You feed manifest-identity the export files your providers already produce: a record of every identity in an account, an organization, a cluster, a project, or a tenant at one moment. It keeps every import and never edits an old one. When you open the inventory, it works out each identity's situation at that moment: compare the newest import with the history, add what people have recorded, and show the result. No status is ever stored, so no status can go stale or be quietly changed; the answer is recomputed from the evidence every time you ask.
Beside that observed record it keeps a second one that no export can supply: what each identity is supposed to hold, said by a named person, for a period, with an owner. The difference between the two records is what the product exists to show, and the review campaigns exist to put each difference in front of the person who can answer it.
People supply what the files cannot: who owns this identity, which one is suspicious, which one was reviewed and found fine, which access was meant. Each of those records is saved with who said it and when, and the same database action that saves it also writes the audit line, so a decision cannot exist without its record. Reports and exports come from the same computation the screen shows, so they cannot disagree with it. And in version one the tool never connects to any provider: files come in, reports go out, and nothing else moves.
What it does¶
Each feature in three lines: what it does, why it is built that way, and what proves it.
- Reads seven providers natively and any other through a table. AWS from its two export files, GitHub, Google Cloud, Azure and Entra, and Okta from one document each assembled from the provider's own API objects, Kubernetes from one kubectl dump, Active Directory from a document of the directory cmdlets' objects or from the SharpHound collector's zip, which adds who can obtain what through a control right; every other provider from a spreadsheet of who holds what, read through a mapping of its own columns. Each provider's vocabulary ends at its parser and the rest of the product never learns it, so the seventh provider is a parser and not a rewrite (D-071, D-076, D-079 to D-084). Proven by one test file per provider and a generated sample estate for each, imported by the demo.
- Derives every identity's state at read time. Owner, last use, second factor, what it holds now and what it can obtain, through which group or trust, and the findings that follow, computed from the whole history every time. Its credentials are read in nine kinds (access key, password, certificate, signing certificate, client secret, token, SSH key, Kerberos key, API key), each with its age and last use, and each identity is classified from their shape as a person, a service, a workload, an application, a group, a role, an external identity, or unknown (D-056). Nothing derived is stored, so nothing can drift or be edited (D-006). Proven by the derivation and finding suites and by the sample estates producing every finding.
- Twenty findings, each with its reason. Administrator equivalence
judged by capability rather than name, escalation paths, keys past
their age, identities nobody uses, trusts open to the world, groups
nobody owns. Each names the rule it applied and the evidence, because
a finding a reviewer cannot check is a rumor. Proven by
test_findings.pyandtest_privilege.py. - Access as it actually arrives. A grant records its route, hop by
hop, through a membership, a trust, a delegation, and its mode:
standing, eligible, or session. The page separates what an identity
holds now from what it can obtain, which is what makes just-in-time
access reviewable rather than invisible (1.6). Proven by
test_paths.py. - Relationships and definitions as things to authorize. A trust
into a role is a door someone can authorize; a custom policy or role
is a definition someone can authorize at a version, and one that
changes afterwards names what it gained (1.6, 1.7). Proven by
test_delta.pyandtest_role_definitions.py. - The authorization record. What an identity may hold, written by
a named person from the session and never from a form, with an owner
who is never a lone individual, an expiry the clock enforces with no
job, and a reason; append-only, superseded rather than edited,
revoked with a reason rather than deleted (D-073). Proven by
test_authorizations.pyand the matrix walk. - Two doors into that record. A form that prefills from what is
observed, and a file door that reads an organization's own
spreadsheet of approvals through a mapping of its columns, with a dry
run that shows how the system read it before anything is written
(D-074). Proven by
test_csv_import.pyandtest_from_observed.py. - The delta, stored nowhere. Nine classes of difference between
held and authorized, each carrying the time each side was last heard
from, because a stale side makes a difference look like agreement.
Proven by
test_delta.pyand the mutation that removes the central comparison. - Review campaigns driven by the calendar, the delta, or expiry. A
frozen population, one decision per item with no bulk certification,
recommendations with their reasons, the changes since the last
certification, insufficient evidence as a recorded outcome, and an
evidence export with the audit chain's head in it (D-039, 1.8).
Proven by
test_campaigns.py. - Alerts that are records first. A revocation recommended, an
authorization approaching expiry, a difference for an owner to
answer: each recorded, each delivery recorded per recipient, sent
through one interface that records rather than sends until a
provider is chosen, a failed delivery recorded as failed (1.9).
Proven by
test_alerts.py. - A read-only API under integration tokens. Identities from a
cursor, the delta, and a change feed over the audit record, so a
ticketing or monitoring system follows decisions as they happen;
tokens are minted once, revocable, and budgeted each (1.10). Proven
by
test_api.py. - Governance on identities and groups. Owners, purposes, flags, and
attestations, attributed and audited, clearable, with an assigned
owner answering the unowned finding and a disagreement with the
provider's tag surfaced (D-019). Proven by
test_governance.py. - Scoped authority. A user holds a role at a place in the provider
tree and can act on that place and everything beneath it, so an
operator for one account is not an operator for another (D-072).
Proven by
test_scope.pyand the mutation that widens the check. - A page proven by use. One document, no build step, every value
rendered as text under a content policy that forbids inline script;
the detail opens beside the list, every list has a skeleton and an
empty state, both themes pass a contrast check computed from the
stylesheet's own tokens, and a real browser drives it in the
pipeline (D-036, D-075, D-077). Proven by
test_frontend.pyandtest_browser.py. - Reports and exports that cannot disagree with the screen. The
self-contained risk report, CSV and JSON with the spreadsheet exit
neutralized, and the per-campaign evidence export, all from the same
computation the page shows (D-040). Proven by
test_reports.py. - Sample estates, generated and checked. One per native provider,
three months each, built to trigger every finding and every class of
difference, regenerated by a test so the shipped files and the
generator cannot drift; nothing about anyone's real estate is ever
published. Proven by
test_sample_data.py. - A demo that shows the day after. The demo command writes the
authorized record the way an administrator would have, through the
same doors, so the delta shows every class of difference with
believable counts and the campaign carries a mix of recommendations
(D-085). Proven by
test_demo.py, which also holds that a second run writes nothing.
What it is not¶
Stated as firmly as what it is, so the tool is not asked to be something else:
- Not a provisioning tool. It never grants, revokes, or writes anything to any provider; a revocation it recommends becomes a work item for a person (D-024).
- Not a connector. In version one it holds no provider credential and never connects; files come in and reports go out.
- Not a secrets manager, an identity provider, a security information and event management system, or a ticket system. It feeds all of them through its exports and its read API, and it replaces none of them.
- Not a judge. It recommends with its reasons and a named person decides, every time.