Agent skill

Gram Audit Logging

by speakeasy-api in speakeasy-api/gram

Concepts, external interfaces, and conventions for Gram's audit logging subsystem — the internal Go API for recording actor/action/subject events and the /rpc/auditlogs.

AGPL-3.0Auto-check passedBackend & APIs

Install Gram Audit Logging

skills CLI
$ npx skills add speakeasy-api/gram --skill gram-audit-logging -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install speakeasy-api/gram gram-audit-logging --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/speakeasy-api/gram.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/gram-audit-logging .claude/skills/gram-audit-logging && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
gram-audit-logging
GitHub stars
272
Token cost
~5.5k tokens
SKILL.md length
2,232 words
Files
1
Skills in repo
39
Repo updated
First seen
Licence
AGPL-3.0

At a glance

Concepts, external interfaces, and conventions for Gram's audit logging subsystem — the internal Go API for recording actor/action/subject events and the /rpc/auditlogs.

  • Works in 6 steps: Open the service's impl.go and locate… → After the primary repo writes succeed… → Build the actor from… → …
  • Backend & APIs work in your project
  • SKILL.md covers Concepts and terminology, Server, Server-client contract and Jobs to be done, plus 3 more sections
  • Calls mise and go

What it does

Gram Audit Logging is an agent skill from speakeasy-api/gram. Concepts, external interfaces, and conventions for Gram's audit logging subsystem — the internal Go API for recording actor/action/subject events and the /rpc/auditlogs. management API that exposes them. Activate whenever the task involves recording or exposing audit events (adding or changing audit coverage on a service, introducing a new audited subject or action, writing tests that assert an event was recorded, changing how entries are displayed or filtered).

Its SKILL.md is about 5.5k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Backend & APIs. The repository describes itself as: Securely scale AI usage across your organization. A single stack to Connect, Secure, Observe and Distribute agents, MCPs, and Skills within your company. The licence is AGPL-3.0.

When your agent uses it

  • Backend & APIs work in your project

Example prompts

  • “/gram-audit-logging”

Workflow steps

6 steps, taken from the first numbered list in SKILL.md.

  1. Open the service's impl.go and locate the handler. Confirm the handler already uses a transaction; if not, wrap the repo calls in…
  2. After the primary repo writes succeed and before Commit, call the subject's audit.Log with a populated LogEvent. Pass the same dbtx the…
  3. Build the actor from contextvalues.GetAuthContext(ctx) — typically urn.NewPrincipal(urn.PrincipalTypeUser, authCtx.UserID), plus…
  4. For updates, populate the typed snapshot fields (SnapshotBefore / SnapshotAfter) with the pre- and post-mutation state. For creates and…
  5. Treat audit-log failures as oops.CodeUnexpected. Audit logging is not optional — if it fails, fail the request.
  6. Add a test that asserts the event was recorded (see "How to assert audit events in tests" below).

What it can do on your machine

Read from SKILL.md and the folder at commit ad78247. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • mise
    • go

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Gram Audit Logging loads about 5.5k tokens when it runs. Until then it costs about 122 tokens; SKILL.md has 2,232 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~122
When it runs · the whole SKILL.md, loaded when a task matches
~5.5k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from speakeasy-api/gram at commit ad78247, republished under its AGPL-3.0 licence (© speakeasy-api). 2,232 words, ~5,474 tokens.

Download SKILL.mdSave it as .claude/skills/gram-audit-logging/SKILL.md (or your agent's skills folder).
name
gram-audit-logging
description
Concepts, external interfaces, and conventions for Gram's audit logging subsystem — the internal Go API for recording actor/action/subject events and the `/rpc/auditlogs.*` management API that exposes them. Activate whenever the task involves recording or exposing audit events (adding or changing audit coverage on a service, introducing a new audited subject or action, writing tests that assert an event was recorded, changing how entries are displayed or filtered).
metadata.relevant_files
server/internal/audit/**/*.go, server/internal/audit/**/*.sql, server/design/auditlogs/**

Audit logging is how Gram records who did what to which resource. Every meaningful mutation on a project- or org-scoped resource is expected to produce one audit entry per affected row, written inside the same database transaction as the mutation so events can't drift from the state they describe. Entries are exposed to Gram users through the auditlogs management API.

Concepts and terminology

Actor. The principal that caused the event — a urn.Principal carrying a type (user, role, service account) and an id, with optional display name and slug for human rendering.

Subject. The resource the event is about — identified by a subject type (e.g. remote_mcp_server, access_role) and a subject id.

Action. What happened to the subject. Each subject declares its own set of actions, typically one per mutating verb on the subject's life cycle.

Before/after snapshot. Optional opaque JSON payloads describing the subject's state. Populated on updates, left empty on creates and deletes unless the snapshot is independently useful.

Metadata. Optional JSON bag for contextual fields that are not part of the subject's state.

Scoping. Every entry belongs to exactly one organization and zero or one projects. Org-scoped subjects (roles, members) carry no project id; project-scoped subjects carry the project UUID.

Atomicity. Audit entries are written inside the same database transaction as the mutation they describe, so the state and the record of the state commit together or not at all.

Outbox event. Every audit entry also publishes a typed webhook event to the outbox (same transaction). The event type is subject-specific — e.g. audit_log.deployment_event_v1 for deployment actions, audit_log.project_event_v1 for project actions — allowing webhook subscribers to filter by subject domain rather than receiving all audit activity under the single legacy audit_log.created type. The _v1 suffix signals the version; new event definitions must use this suffix. All subject event vars are declared in server/internal/outbox/events/audit_log.go.

Server

Audit logging lives in server/internal/audit/ with its management-API surface defined in server/design/auditlogs/. Callers are other services whose handlers emit events; the auditlogs Goa service reads them back.

Conventions

Where types live. The package-private subjectType string type and every subjectType* constant live in server/internal/audit/events.go. The public Action string type and the marshalAuditPayload snapshot helper live in the same file. The subject-type const block is kept alphabetised.

Subject type naming. Subject type values are short snake_case strings (e.g. remote_mcp_server, access_role). Constants follow the subjectType<Name> pattern.

Action naming. Values follow <subject-slug>:<verb> (e.g. remote-mcp:create, access_role:update). Verbs are typically create / update / delete; subjects may add feature-specific verbs (toolset:attach_oauth_proxy).

Subject files. One Go file per subject under server/internal/audit/, named after the subject in plural form (e.g. remotemcpservers.go, toolsets.go). Each file owns that subject's Action* constants, its Log*Event payload structs, and its Log* functions. Do not merge subjects into a shared file.

Log*Event and Log* naming. One Log<Verb>Event struct plus one Log<Verb> function per action, declared in the subject file. Log* functions take (ctx, dbtx repo.DBTX, event Log*Event) error so the audit insert is atomic with the caller's mutation. Internally each Log* function constructs a repo.InsertAuditLogParams and then calls l.log(ctx, dbtx, auditEntry{Params: entry, OutboxEvent: events.<Subject>}) — it does not call repo.New(dbtx).InsertAuditLog directly.

Subject identifier fields. Event structs carry the subject's identifier as a URN type, not a raw uuid.UUID. Field name is <Subject>URN (e.g. KeyURN urn.APIKey, McpServerURN urn.McpServer), and the Log* function populates SubjectID from event.<Subject>URN.ID.String(). If no URN type exists yet, add one under server/internal/urn/ before introducing the event struct — see server/internal/urn/api_key.go for the template.

Snapshot fields. Update event structs declare snapshot fields as <Subject>SnapshotBefore / <Subject>SnapshotAfter with concrete pointer types (e.g. *types.Toolset, *types.McpServer). Do not use any or bare SnapshotBefore / SnapshotAfter — the typed form keeps marshalAuditPayload callers honest about the shape being persisted. Pass the view through directly unless a specific field on the type needs stripping for size or sensitivity reasons (see toolsets.go for the one clone-and-strip case).

Per-row events for bulk mutations. A single bulk SQL statement that touches N rows of an audited subject produces N audit entries — one per row — not one entry that covers the batch. This is what makes the audit log a faithful reconstruction of each subject's life cycle and what lets auditlogs.list filter to a specific subject id. The most common place this gets missed is cascading soft-deletes that fan out from a parent delete; see "How to audit a cascading delete of child resources" under "Jobs to be done".

Non-generated files
FilePurpose
server/design/auditlogs/design.goGoa design for the auditlogs service. Regenerates server/gen/auditlogs/ and server/gen/http/auditlogs/ via mise run gen:goa-server.
server/internal/audit/<subject>.goOne file per subject (e.g. access.go, remotemcpservers.go, toolsets.go).
server/internal/audit/audittest/helpers.goTest helpers other packages use to assert audit events.
server/internal/audit/audittest/queries.sqlSQLc queries backing the test helpers. Regenerates server/internal/audit/audittest/repo/ via mise run gen:sqlc-server.
server/internal/audit/events.goTop-level declarations shared across every subject.
server/internal/audit/logger.goLogger type, auditEntry struct, and the internal l.log() method that inserts the DB row then calls appendToOutbox.
server/internal/audit/outbox.goappendToOutbox — translates the inserted audit row into an AuditLogCreatedPayload and publishes to the outbox under the subject-specific event def.
server/internal/auditapi/impl.goImplementation of the /rpc/auditlogs.* Goa service (reads). Lives in its own package to keep the audit writer surface free of auth/sessions and mv so any service can call audit.Log* without import cycles.
server/internal/audit/queries.sqlSQLc queries for the audit log table. Regenerates server/internal/audit/repo/ via mise run gen:sqlc-server.
server/internal/auditapi/{setup_test,list_test,listfacets_test}.goTests for the auditlogs management API.
server/internal/outbox/events/audit_log.goPer-subject *outbox.EventDef vars (e.g. events.Deployment, events.Project). Add a new var here when introducing a new audited subject.
Generated files

Files under server/gen/** and any repo/ subdirectory carry a DO NOT EDIT header.

PathGenerator
server/gen/auditlogs/, server/gen/http/auditlogs/mise run gen:goa-server from server/design/auditlogs/design.go.
server/internal/audit/audittest/repo/mise run gen:sqlc-server from server/internal/audit/audittest/queries.sql (separate stanza in server/database/sqlc.yaml).
server/internal/audit/repo/mise run gen:sqlc-server from server/internal/audit/queries.sql (via the audit stanza in server/database/sqlc.yaml).
server/internal/outbox/events/catalog_gen.go, catalog_gen.yamlmise run gen:webhooks-server from server/cmd/gen-webhooks. Run after adding a new event def to audit_log.go.

Server-client contract

Audit entries are surfaced to Gram users through a small, fixed set of endpoints. New actions and subject types appear automatically — facets are computed from the rows that exist, so there is no registration step outside the Go code.

HTTP routes (design: server/design/auditlogs/design.go):

  • GET /rpc/auditlogs.list — paginated list; supports cursor, project_slug, actor_id, and action filters.
  • GET /rpc/auditlogs.listFacets — returns the set of actors and actions that actually appear, for UI facet pickers.

Generated client surfaces — regenerated by mise run gen:goa-server then mise run gen:sdk:

  • TypeScript SDK: client/dashboard/src/sdk/src/funcs/auditlogs*.ts, client/dashboard/src/sdk/src/react-query/auditlogs*.ts, plus models under client/dashboard/src/sdk/src/models/.
  • CLI bindings: server/gen/http/cli/gram/cli.go.

Jobs to be done

How to audit a handler in a service

When a handler mutates a resource whose subject already has Action*/Log* definitions, the handler opts in by calling the existing Log* function. The call has to happen inside the same dbtx as the mutation so the audit row and the state it describes commit together.

  1. Open the service's impl.go and locate the handler. Confirm the handler already uses a transaction; if not, wrap the repo calls in s.db.Begin(ctx) → defer o11y.NoLogDefer(rollback) → dbtx.Commit(ctx).
  2. After the primary repo writes succeed and before Commit, call the subject's audit.Log<Verb> with a populated Log<Verb>Event. Pass the same dbtx the repo writes used so the audit row commits atomically with them.
  3. Build the actor from contextvalues.GetAuthContext(ctx) — typically urn.NewPrincipal(urn.PrincipalTypeUser, authCtx.UserID), plus authCtx.Email for ActorDisplayName. Principal types live in server/internal/urn. Fill in the subject-specific identifier fields (subject id, display name, slug) from the repo row you just wrote.
  4. For updates, populate the typed snapshot fields (<Subject>SnapshotBefore / <Subject>SnapshotAfter) with the pre- and post-mutation state. For creates and deletes, leave them nil unless the snapshot is independently useful.
  5. Treat audit-log failures as oops.CodeUnexpected. Audit logging is not optional — if it fails, fail the request.
  6. Add a test that asserts the event was recorded (see "How to assert audit events in tests" below).
Show full SKILL.md (974 more words)Show less
How to audit a cascading delete of child resources

Use this when deleting a parent resource also soft-deletes child rows of an independently audited subject (e.g. deleting an mcp_server cascades to its mcp_endpoints). The parent's Log<Verb> is not enough — every affected child row must produce its own audit entry under the child subject's action.

  1. Make the cascade query return the affected rows. SQLc queries scoped by parent id should be :many with RETURNING * so the caller can iterate the deleted children. If the existing query is :exec, change it and regenerate (mise run gen:sqlc-server).
  2. In the parent handler, after the cascade query succeeds and inside the same dbtx, loop over the returned rows and call the child subject's audit.Log<Verb> once per row. Populate the child's URN, display name, and slug from the returned row — not from the parent.
  3. Emit the parent's audit.Log<Verb> after the per-child loop so cause precedes effect in the timeline. Both still commit atomically with the cascade.
  4. In tests, capture baseline counts for both the parent and the child action, exercise the handler, and assert the child count grew by exactly the number of cascaded rows. A single +1 assertion on the parent action will not catch a regression where the per-child events stop being emitted.
How to add a new action to an existing subject

Use this when the subject already has a file but you're introducing a new verb.

  1. In the subject's file, add an Action<Subject><Verb> constant alongside the existing ones.
  2. Add a Log<Subject><Verb>Event struct with the fields the caller needs to supply. At minimum: OrganizationID, ProjectID (zero value for org-scoped subjects), Actor, ActorDisplayName, ActorSlug, plus the subject URN (<Subject>URN urn.<Subject>) and any additional display name / slug fields the subject needs. Updates additionally carry typed snapshot fields (<Subject>SnapshotBefore / <Subject>SnapshotAfter with concrete pointer types — e.g. *types.<Subject>).
  3. Add a Log<Subject><Verb> function that translates the event into repo.InsertAuditLogParams, passes any snapshots through marshalAuditPayload (which handles nil internally), then calls l.log(ctx, dbtx, auditEntry{Params: entry, OutboxEvent: events.<Subject>}). Do not call repo.New(dbtx).InsertAuditLog directly — l.log does that and also handles the outbox publication.
  4. Call the new function from the handler as described under "How to audit a handler in a service".

No schema change, no codegen step — facet queries pick up the new action automatically.

How to add a new audited subject

Use this when introducing an entirely new kind of resource that doesn't map onto any existing subject file.

  1. Add a subjectType<Name> constant to events.go.
  2. Add a new var <Subject> = outbox.NewEventDef[events.AuditLogCreatedPayload]("audit_log.<subject>_event_v1", "...") to server/internal/outbox/events/audit_log.go. Use the _v1 suffix. Then run mise run gen:webhooks-server to update catalog_gen.go and catalog_gen.yaml.
  3. Create server/internal/audit/<subject>.go following the subject-file convention, and populate it with the Action* constants, Log*Event structs, and Log* functions. Each Log* function passes auditEntry{Params: entry, OutboxEvent: events.<Subject>} to l.log.
  4. Call the new Log* functions from the owning service's handlers.
How to update an existing action or subject
  1. Renaming an Action value is a breaking change for consumers of auditlogs.list that filter on action strings. Avoid it; add a new action and dual-write if a behaviour rename is needed.
  2. Adding a new field to a Log*Event struct is safe — update every call site (exhaustruct will flag missed ones).
  3. Changing the shape of the snapshot payload (the concrete type referenced by <Subject>SnapshotBefore / <Subject>SnapshotAfter) is safe for new rows only; old rows retain the old shape. If consumers parse snapshots, version the payload inside the JSON.
  4. Do not edit the string values of subjectType* constants; the same breakage argument as action renames applies.
How to assert audit events in tests

Use audittest helpers in the service's test package — do not query the audit tables directly.

  1. Capture a baseline count with audittest.AuditLogCountByAction(ctx, conn, audit.Action<Foo>).
  2. Exercise the handler.
  3. Assert after == before + 1 (or the expected delta).
  4. For snapshot correctness, fetch the row with audittest.LatestAuditLogByAction and decode Metadata, BeforeSnapshot, or AfterSnapshot with audittest.DecodeAuditData.

Relevant mise tasks

TaskPurpose
mise run gen:goa-serverRegenerate server/gen/auditlogs/** whenever you edit server/design/auditlogs/design.go.
mise run gen:sdkRegenerate the TypeScript SDK and CLI bindings after a Goa design change.
mise run gen:sqlc-serverRegenerate server/internal/audit/repo/ and audittest/repo/. Run whenever you change queries.sql in either place. Requires mise run infra:start (sqlc connects to the local Postgres to type-check queries).
mise run gen:webhooks-serverRegenerate catalog_gen.go and catalog_gen.yaml after adding a new event def to server/internal/outbox/events/audit_log.go.
mise run lint:servergolangci-lint including exhaustruct — keep struct literals complete when adding fields to Log*Event.
mise run test:serverRuns the full server test suite. Takes the same arguments as go test (e.g. ./internal/audit/... ./internal/remotemcp/...).

Maintaining this skill

This file documents conventions that evolve over time. Adding a new action, subject, or filter is already covered by "Jobs to be done" — those don't require skill edits. Structural changes do. Update this skill in the same commit when you make any of the following kinds of changes:

  • Reorganising per-subject files (moving away from one-file-per-subject, merging subjects, renaming the plural convention).
  • Renaming or reshaping Log*Event fields, or changing the Log* function signature.
  • Replacing marshalAuditPayload or changing how snapshots are encoded.
  • Moving audit code out of server/internal/audit/.
  • Changing how facets are computed — today they derive from row data with no registration; if that changes, the "no registration step" claim stops being true.
  • Adding a new audit-relevant mise task that belongs on the cheat sheet.
  • Introducing a new top-level concept (a new principal type for actors, a new kind of subject scoping beyond org/project, etc.).

Cross-references

  • gram-management-api — the auditlogs service is itself a management API; adding a new endpoint or filter follows that skill's flow.
  • gram-rbac — access_role, access_member, and other RBAC mutations are audited via server/internal/audit/access.go.
  • golang — oops error wrapping, slog logging, transaction patterns, and the black-box setup_test.go convention used by audit tests and service tests.
  • postgresql — when adding or changing SQLc queries in audit/queries.sql or audittest/queries.sql.
  • mise-tasks — when modifying the generator scripts under .mise-tasks/gen/.

© speakeasy-api, AGPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .agents/skills/gram-audit-logging of speakeasy-api/gram.

Open the folder on GitHubat commit ad78247

Compare with similar skills

Gram Audit Logging next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Gram Audit Logging compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Gram Audit Logging this skillspeakeasy-api/gram272—~5.5kAutomated safety check: PassAGPL-3.0
Infer Conventionsanonaddy/anonaddy4.9k5 repos~3.1kAutomated safety check: PassMIT
Durable Objectscloudflare/skills3k2 repos~1.5kAutomated safety check: PassApache-2.0
Design An Interfacefossasia/eventyay-interpretation1.6k9 repos~842Automated safety check: PassApache-2.0
Coding Directivesgreenpau/caddy-security2.3k—~4.1kAutomated safety check: PassApache-2.0
Octo LoopMininglamp-OSS/octo-cli918—~2.3kAutomated safety check: PassApache-2.0

Similar skills

  • Infer Conventions

    anonaddy/anonaddy

    A skill your agent uses to analyze how a Laravel application is actually written and record its conventions as shared rules.

    4.9k GitHub starsUsed in 5 repos~3.1k tokens
    Backend & APIsAuto-check passed
  • Durable Objects

    cloudflare/skills

    Official

    Build, debug, or review Cloudflare Durable Objects code for persistent state and coordination.

    3k GitHub starsUsed in 2 repos~1.5k tokens
    Backend & APIsAuto-check passed
  • Design An Interface

    fossasia/eventyay-interpretation

    Generate multiple radically different interface designs for a module using parallel sub-agents.

    1.6k GitHub starsUsed in 9 repos~842 tokens
    Backend & APIsAuto-check passed
  • Coding Directives

    greenpau/caddy-security

    Implement or review caddy-security Go code, Caddy modules, parsers, lifecycle, and HTTP delegation.

    2.3k GitHub stars~4.1k tokensUpdated 2 days ago
    Backend & APIsAuto-check passed
  • Octo Loop

    Mininglamp-OSS/octo-cli

    A skill your agent uses when operating the Octo Loop control plane through the octo-cli loop commands: reading or writing Fleet tasks, comments, metadata, projects, and labels; dispatching work to…

    918 GitHub stars~2.3k tokensUpdated 9 days ago
    Backend & APIsAuto-check passed
  • Zalo Agent

    PhucMPham/zalo-agent-cli

    Automate Zalo messaging, Official Account (OA), and MCP server integration via zalo-agent-cli.

    163 GitHub stars~2.3k tokensUpdated 1 mo ago
    Backend & APIsAuto-check passed

More from speakeasy-api/gram

All 39 skills in this repo
  • Gram Playwright CLI

    speakeasy-api/gram

    A skill your agent uses when automating the Gram dashboard in a browser, capturing screenshots, inspecting pages.

    272 GitHub stars~3.4k tokensUpdated today
    Auto-check passed
  • Transactional Email

    speakeasy-api/gram

    A skill your agent uses when adding, changing, restyling, reviewing, validating, or previewing a Gram/Speakeasy transactional email, in Go or in LMX/MJML — a template<name.go, a TemplateKey…

    272 GitHub stars~4.7k tokensUpdated today
    Auto-check passed
  • Admin Shadcn

    speakeasy-api/gram

    A skill your agent uses when adding, changing, or styling UI in client/admin (the Gram admin dashboard) that touches shadcn/ui — a button, dialog, table, sidebar, badge, select, tabs, tooltip, card…

    272 GitHub stars~1k tokensUpdated today
    Auto-check passed
  • A skill your agent uses when adding, editing, reviewing, testing, or locating a reviewed skill distributed with the Platform MCP plugin; triggers include "Platform MCP skill", "platformmcpskills"…

    272 GitHub stars~2.2k tokensUpdated today
    Auto-check passed
  • Clickhouse

    speakeasy-api/gram

    A skill your agent uses when changing or reviewing Gram ClickHouse schemas, migrations, queries, inserts, access principals, bootstrap SQL, Cloud compatibility, partial migration failures, or…

    272 GitHub stars~3.2k tokensUpdated today
    Auto-check passed
  • Feature Flag

    speakeasy-api/gram

    A skill your agent uses when gating a feature behind a flag, dogfooding or gradually rolling out a change, choosing between productfeatures and PostHog feature flags, adding or checking a product…

    272 GitHub stars~2.6k tokensUpdated today
    Auto-check passed

Questions about Gram Audit Logging

What does Gram Audit Logging do?

Concepts, external interfaces, and conventions for Gram's audit logging subsystem — the internal Go API for recording actor/action/subject events and the /rpc/auditlogs. Gram Audit Logging is an agent skill from speakeasy-api/gram. Concepts, external interfaces, and conventions for Gram's audit logging subsystem — the internal Go API for recording actor/action/subject events and the /rpc/auditlogs.

When should I use Gram Audit Logging?

Gram Audit Logging fits situations like: backend & APIs work in your project.

How do I install Gram Audit Logging in Claude Code?

Run `npx skills add speakeasy-api/gram --skill gram-audit-logging -a claude-code`. Or copy the skill folder (.agents/skills/gram-audit-logging in speakeasy-api/gram) into .claude/skills/gram-audit-logging in your project. Claude Code loads it when a task matches its description.

How do I install Gram Audit Logging in Codex?

Run `npx skills add speakeasy-api/gram --skill gram-audit-logging -a codex`. Or copy the skill folder (.agents/skills/gram-audit-logging in speakeasy-api/gram) into .agents/skills/gram-audit-logging in your project. Codex loads it when a task matches its description.

Can I use Gram Audit Logging in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add speakeasy-api/gram --skill gram-audit-logging -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/gram-audit-logging, .gemini/skills/gram-audit-logging, .github/skills/gram-audit-logging and .opencode/skills/gram-audit-logging in your project.

What does Gram Audit Logging need to run?

Going by SKILL.md and its folder, Gram Audit Logging needs the command-line tools its instructions call (mise and go).

Does Gram Audit Logging access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Gram Audit Logging safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Gram Audit Logging use?

Gram Audit Logging is published under the AGPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Gram Audit Logging use?

About 5.5k tokens (SKILL.md is roughly 22k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Gram Audit Logging?

Skills that share tags, products or a category with Gram Audit Logging: Infer Conventions (anonaddy/anonaddy, 4.9k stars), Durable Objects (cloudflare/skills, 3k stars), Design An Interface (fossasia/eventyay-interpretation, 1.6k stars) and Coding Directives (greenpau/caddy-security, 2.3k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Gram Audit Logging?

speakeasy-api (a GitHub organization) maintains it in speakeasy-api/gram, which has 272 GitHub stars. The repository holds 39 skills in this directory. The repository was last updated on October 8, 2026.

Source: speakeasy-api/gram on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.