audit-provider
Audit a GO Feature Flag OpenFeature provider against the conformance specification and emit a PASS/FAIL/N-A report. Use when asked to audit, validate, or check conformance of a GO Feature Flag provider in any language.
ソース情報
- リポジトリ
- thomaspoignant/go-feature-flag
- ソースの最終更新活動
- 2026年9月14日 14:54
- 検出された SKILL.md の言語
- 英語
- スター
- 2,109
- フォーク
- 216
インストール方法
デフォルトでは、最初にソースを確認する Prompt が選択されています。直接コマンドに切り替えるか、ローカルコピーをダウンロードすることもできます。
ソースファイルを確認
インストールを決める前に、SKILL.md と SkillsMP に表示されている付属ファイルをお読みください。
SKILL.md を表示中
SKILL.md
ソースの指示 · 読み取り専用プレビュー- name
- audit-provider
- description
- Audit a GO Feature Flag OpenFeature provider against the conformance specification and emit a PASS/FAIL/N-A report. Use when asked to audit, validate, or check conformance of a GO Feature Flag provider in any language.
# Audit a GO Feature Flag provider
Produce a conformance report for one provider against
[the specification](https://gofeatureflag.org/specification/openfeature-provider)
(`website/src/pages/specification/openfeature-provider.md` in this repo).
The specification is the source of requirements, verdict rules and report format. This skill
is only the *method*. If the two disagree, the specification wins.
Read the whole specification before auditing anything. In particular, Appendix C.1 defines
`PASS`/`FAIL`/`N/A` and the rules for **vacuous** and **accidental** satisfaction; do not
invent your own.
## Step 1 — Establish identity and tiers
Before reading any implementation code, determine:
| Question | Decides |
| --- | --- |
| Which language, and where is the source? | Where to read |
| Which evaluation modes does it support? | `Remote` / `In-process` tiers |
| Does it embed the engine via WebAssembly, or link it directly? | `WASM` tier, or N/A for all of §10 |
| Does the language's OpenFeature SDK have a Tracking API? | §14 applicability |
| Does it cache remote evaluations? | §17 applicability, and `GOFF-COLL-023` |
State the tier set in the report header. Every later `N/A` must trace back to it. A Go
provider is `N/A` for §10 because it links the engine directly — that is conformant, not a gap.
## Step 2 — Locate everything you will read
**Three sources, not one.** Missing the second and third is the most common way an audit
reaches wrong conclusions.
**a. The provider itself.** In this repository:
- `openfeature/providers/python-provider/gofeatureflag_python_provider/`
- `openfeature/providers/kotlin-provider/` *(client-side; out of scope for spec 1.0)*
External, via `gh api "repos/<repo>/contents/<path>" --jq '.content' | base64 -d`:
| Language | Repo | Base path |
| --- | --- | --- |
| .NET | `open-feature/dotnet-sdk-contrib` | `src/OpenFeature.Providers.GOFeatureFlag/` |
| Java | `open-feature/java-sdk-contrib` | `providers/go-feature-flag/` |
| JavaScript | `open-feature/js-sdk-contrib` | `libs/providers/go-feature-flag/` |
| Go | `open-feature/go-sdk-contrib` | `providers/go-feature-flag/` |
List files first with `git/trees/<branch>?recursive=1`. Quote the URL — `?` is a zsh glob.
**b. Delegated dependencies.** Identify, from the manifest, anything the provider defers
behaviour to — most often a generic OFREP client — and **locate its pinned source on disk
before you start**. Per §1.7 the provider owns that behaviour, so a defect there is a finding
against the provider. Where the pinned source lives:
| Language | Typically |
| --- | --- |
| Python | `~/.cache/uv/archive-v0/*/`, or the active virtualenv's `site-packages/` |
| JavaScript | `node_modules/`, or the sibling `libs/shared/` in a monorepo |
| Java | `~/.m2/repository/`, or fetch the source from the dependency's own repo |
| .NET | `~/.nuget/packages/<pkg>/<version>/lib/` |
| Go | `$(go env GOMODCACHE)/<module>@<version>/` |
**c. The language's OpenFeature SDK.** Needed to resolve §1.5 deferrals — the canonical
object type, the `ErrorCode` enum, how provider status transitions are derived from thrown
errors. Same locations as (b).
## Step 3 — Read in this order
Each stage establishes facts the next depends on.
1. **Options / configuration** — canonical names, defaults, which options exist. Gives §3.
2. **Provider entry point** — metadata, lifecycle ordering, hook registration, `track()`.
Gives §2, §4, §12, §14.
3. **Evaluators** — type checks, reason handling, error mapping, flag lookup. Gives §6, §11, §9.3.
4. **HTTP / API layer** — endpoints, auth, ETag, 304 and status mapping, URL construction.
Gives §9.1, §15, `GOFF-IP-003`. **If remote mode is delegated, §8 comes from the dependency
located in Step 2b, not from the provider.**
5. **Engine host** — WASM ABI or direct linkage; pooling, trap handling. Gives §10.
6. **Hooks** — enrichment nesting, collector gating. Gives §7.1, §12.
7. **Event publisher and event models** — wire field names, flush, buffer policy. Gives §13.
8. **Tests and fixtures** — see Step 5.
## Step 4 — Run the targeted checks
Run these deliberately. They are not a summary of the specification; they are the specific
places where every audit so far has found real defects, and several are invisible unless you
go looking.
| Check | Why |
| --- | --- |
| Trace a `304` carrying **no** `ETag` header, line by line | Wiped the flag map in three of five providers; one also killed polling permanently |
| Trace a `200` with a valid but **empty** body | Wipes flags *and* pins the ETag, so the empty state never recovers |
| Check whether the 304 path is *structurally* distinct from a 200 | `GOFF-IP-007` requires a sentinel or distinct type, not an empty response object |
| Grep the failed-evaluation boolean's serialised name | One provider sends `defaultValue`; the server reads `default` and records failures as successes |
| Check whether the enrichment hook **merges** or **replaces** `gofeatureflag` | Replacing destroys caller-supplied `flagList` and `currentDateTime` |
| Check whether a trapped engine instance is returned to a pool | Every audited provider reused poisoned instances |
| Grep every declared option for a read site | Two providers had options that do nothing |
| Check whether a lock is held across the collector HTTP call | Couples flag-evaluation latency to collector availability |
| Check the timeout actually applied on each transport | One provider silently used a dependency's 5 s default for remote and its own 10 s elsewhere |
| Diff the provider's fixtures against Appendix B canon | They were byte-identical once; nothing enforces it |
WASM tier only: check the length argument passed to `evaluate` is the UTF-8 **byte** length.
This is unfalsifiable in languages whose strings are already byte-oriented — record it as PASS
with that reasoning rather than skipping it silently.
## Step 5 — Read the tests as evidence, not as proof
Tests are the fastest route to a provider's *intended* behaviour, and a rich source of two
finding classes the requirement list cannot express on its own:
- **Tests that assert non-conformant behaviour.** After establishing each `FAIL`, grep the
suite for an assertion encoding it. A green suite pinning a defect means the behaviour was
deliberate and remediation must change the test too. Report the test alongside the finding.
- **Tests that are commented out or skipped.** These mark behaviour the maintainers know is
wrong or unstable. Note them where they touch a requirement.
Never treat a passing test as evidence that a requirement is met — it may assert the wrong
thing. Cite the implementation.
## Step 6 — Code over docs
**Never accept documentation as evidence of behaviour.** Every finding cites a source location
for *code*, not for a comment, README, or docstring.
During the audits that produced this specification, every provider's documentation was wrong
about that provider:
- a JSDoc `@default 120000` for a value no code path assigns, leaving the feature off by default
- an option declared in the type, documented in the README, asserted in tests, never read
- a README stating a hook is registered in one mode, contradicting code that registers it in both
- a Javadoc default of `1000 ms` against a constant of `60000 ms`
- an options comment claiming the default mode is `REMOTE` where the code says `INPROCESS`
- agent instructions describing an architecture removed several releases ago
Report contradictions per Appendix C.2. This class matters disproportionately for a repository
that other agents will read: an agent following stale instructions implements against a
superseded API.
## Step 7 — Assign verdicts and report
Verdict rules are in Appendix C.1 — including vacuous and accidental satisfaction, which you
must apply rather than improvise. Report format is Appendix C.2, including the per-requirement
table and the two extra finding classes.
Cover **every** requirement identifier. Do not sample.
Do not soften a Critical because it is unlikely, and do not inflate a Minor because it is easy
to fix. Severity is defined by consequence, and it is what the maintainer triages on.
## Scope
Audit **one** provider per run. Comparative claims ("better than the Java one") belong in
Appendix D of the specification, not in a single provider's report.
GitHubで見る