brainstorming
brainstorming
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or planning anything new, in software or out of it (a talk, a business, a renovation).
snowflake-access-guardianAudit Snowflake effective access and produce a safe least-privilege change packet. Trace account-role inheritance, primary and secondary roles, managed-access schemas, ownership, direct-to-user/PUBLIC grants, orphaned principals, and existing-versus-future-grant conflicts. Use when access is unexpectedly broad or denied, a role graph needs review, or an aut…
Independent GitHub snapshot · Automated classification · Original documentation governs
Turn a sanitized Snowflake authorization inventory into an evidence-backed
effective-access trace and a dry-run remediation packet. This is the focused
Snowflake counterpart to a generic RBAC explainer: it catches the failure modes
that make enterprise reviews expensive—role inheritance that was not followed,
direct user and PUBLIC grants, abandoned grantees, ownership control, managed
access semantics, secondary-role assumptions, and future-grant precedence.
NOT_PROVEN, never an inferred denial.This skill's analyzer is offline and deliberately has no authentication flow.
If live Snowflake evidence is collected, use the organization's approved
Snowflake session/authentication process; never put its credentials in the
inventory or report. Use Write only to save a sanitized report or
approved local change packet; never to apply Snowflake mutations.
GRANT, REVOKE, GRANT OWNERSHIP, ALTER USER, or policy changes.ACCOUNTADMIN or automatically grant MANAGE GRANTS to get
a more complete snapshot. MANAGE GRANTS can administer grants and is not a
read-only privilege, even when this collector executes only SHOW statements.OWNERSHIP as a separate
high-risk decision. Never auto-generate executable mutation SQL.Establish the principal, target object, privilege, evidence timestamp, review period, and whether the question is about a primary-role or secondary-role session. Read authorization-model.md for path and evidence rules.
Collect the delayed account-wide baseline with a role holding Snowflake's
SNOWFLAKE.SECURITY_VIEWER database role. Preserve the receipt unchanged:
python3 "${CLAUDE_SKILL_DIR}/scripts/collect_snowflake_evidence.py" \
--surface access --connection <existing-readonly-profile> \
--output ./snowflake-access-historical.json
Collect current evidence only for the declared review scope. Capture the session context without changing roles, then collect grants to and grants of each account role, target-user roles, involved database roles, and paired database/schema future grants:
python3 "${CLAUDE_SKILL_DIR}/scripts/collect_snowflake_evidence.py" \
--surface access-session --connection <profile> --output ./session.json
python3 "${CLAUDE_SKILL_DIR}/scripts/collect_snowflake_evidence.py" \
--surface access-role-current --role DATA_READER \
--connection <profile> --output ./role-current.json
python3 "${CLAUDE_SKILL_DIR}/scripts/collect_snowflake_evidence.py" \
--surface access-role-parents --role DATA_READER \
--connection <profile> --output ./role-parents.json
python3 "${CLAUDE_SKILL_DIR}/scripts/collect_snowflake_evidence.py" \
--surface access-future-database --database ANALYTICS \
--connection <profile> --output ./future-database.json
python3 "${CLAUDE_SKILL_DIR}/scripts/collect_snowflake_evidence.py" \
--surface access-future-schema --schema ANALYTICS.CURATED \
--connection <profile> --output ./future-schema.json
Selectors accept only supported one-part or two-part unquoted identifiers;
quoted/multipart identifiers need a separately reviewed collection path.
Each scoped SHOW uses one Snowflake pipe statement that emits both the
allowlisted rows and its execution context. Invocations may use different
physical sessions; the analyzer requires equivalent account, user, primary
role, role type, and secondary-role state. Saved/offline access JSON is not
accepted as current evidence.
Read current-evidence-contract.md
for every surface and the schema 2.0 bundle. Permission errors, missing
declared selectors, a missing current PUBLIC role receipt, cap hits, or an
unpaired schema receipt remain blockers.
At the controlled local collection boundary, assemble the bundle and record its canonical digest separately. Analyze the exact same bundle with that digest:
python3 "${CLAUDE_SKILL_DIR}/scripts/analyze_access_evidence.py" \
--input ./snowflake-access-bundle.json --print-input-sha256
python3 "${CLAUDE_SKILL_DIR}/scripts/analyze_access_evidence.py" \
--input ./snowflake-access-bundle.json \
--trusted-input-sha256 sha256:<separately-recorded-digest> \
--out ./snowflake-access-report.json
The receipt analyzer validates templates, selectors, sources, row counts,
caps, Snowflake observation timestamps, request-derived coverage, equivalent
authorization contexts, and the bundle digest before invoking the graph
analyzer. The matching digest is an operator assertion of byte identity, not
authentication; computing it from an untrusted copy creates no trust.
analyze_access.py remains a diagnostic path for legacy sanitized
inventories, but it cannot establish receipted completeness.
For each finding, distinguish observed, not proven, and needs live verification. Resolve managed-access, ownership, and future-grant findings with managed-access-and-future-grants.md. The report must retain direct-user paths and every ownership path separately; ownership is control-plane authority, not routine access.
Produce a dry-run change packet: current path, intended path, exact proposed principal/privilege/object edge, approver, executor, precondition, reversal, and residual risk. Proposed SQL may be described as a review artifact, but it is not executed by this skill.
Require positive and negative verification before an authorized operator applies anything. Use verification-and-rollback.md for receipt fields and rollback boundary. When database- and schema-level future grants overlap, report effective schema precedence and test a disposable object; do not summarize the conflict as a generic duplicate.
NOT_PROVEN, not denied.PUBLIC, through an orphaned grantee, or
through a role chain that should be reviewed?USE SECONDARY ROLES ALL? NONE or an explicit role list does not activate it.OWNERSHIP grant need explicit approval?USAGE, policies, shares,
SHOW GRANTS, current secondary-role mode, and a real allowed/denied operation?Return a JSON report plus a human-readable change packet containing:
OBJECT_PRIVILEGE_PATH_PROVEN/NOT_PROVEN status;
this never certifies complete access without separate container/policy checks;object_privilege_path_supported and positive_access_claim_supported
booleans; the latter also requires a matching positive behavior receipt;PROVEN/NOT_PROVEN status.| Condition | Response |
|---|---|
| Credential-bearing field appears | Stop; remove it and rerun with metadata only. |
| Role or user is absent from inventory | Mark path NOT_PROVEN; do not create or delete a principal. |
Account Usage disagrees with SHOW GRANTS | Treat live/current evidence as a separate reconciliation; record lag and scope. |
Current SHOW visibility is incomplete | Record the collector role and block absence claims; never grant MANAGE GRANTS automatically. |
| Receipt lacks a separate matching bundle digest | Report UNTRUSTED, suppress graph claims, and block completeness. |
| Any receipt lacks same-statement context or a fresh server observation | Suppress graph claims and recollect live. |
| Database future receipt lacks the target schema receipt | Block precedence and completeness claims. |
| Managed schema lacks grantor/owner evidence | Stop remediation proposal until MANAGE GRANTS and ownership are verified. |
| Future grants overlap | Reconcile schema precedence and test a disposable object before approval. |
| Ownership or PUBLIC access is involved | Require named security/data owner approval and an independent rollback path. |
Put ALICE, ANALYTICS.CURATED.ORDERS, and SELECT in the schema 2.0
bundle's request, then run analyze_access_evidence.py. A result such as
ALICE -> ANALYST -> DATA_READER is a positively supported path; a missing path
never unblocks an absence or denial claim.
For “revoke everything suspicious,” report direct-user/PUBLIC/orphan findings, future-grant precedence, and the required positive/negative tests. Keep changes as a dry-run packet for the authorized operator.
The four linked references contain the maintained decision detail and official Snowflake primary sources; load only those relevant to the current finding.