# Provider Desk > Paste the Go source of a Terraform provider resource and get it registry-ready: > audit the schema and CRUD contract, design the acceptance tests, write the > registry documentation page, and clear the pre-publish checklist — four lanes > over one file. Live at https://provider-desk.skillsafe.ai/ · API tutorial at https://provider-desk.skillsafe.ai/api.html ## What it is for A `terraform-plugin-framework` resource is a small amount of Go with a large number of ways to be subtly wrong. The defects that hurt are not compile errors — they are a `tfsdk` tag that does not match a schema attribute (a Value Conversion Error at apply time, on the practitioner's machine), an `Optional`+`Computed` attribute with no `UseStateForUnknown` (every plan shows a change forever), a `Read` that never calls `resp.State.RemoveResource` (a deleted object can never be recreated), a `Configure` with no nil `ProviderData` guard (`terraform validate` panics), or a token attribute that is not `Sensitive` (the value is printed in plan output and stored in CI logs). Provider Desk reads the Go for those, then runs the lane you pick. ## The free lane — no account, no credits, no network The browser parses the paste before anything is sent anywhere. It is a lexical reader, not a compiler: it masks the *contents* of comments, string literals, raw strings and rune literals while preserving their length and every newline, then brace-matches on the masked copy. A closing brace inside a `MarkdownDescription`, a quote inside a struct tag, or an apostrophe in a comment therefore cannot end an attribute early — which is the failure mode of every regex-only reader of Go. It reports: the framework in use (`terraform-plugin-framework`, `terraform-plugin-sdk/v2`, or both mixed), the Go type, the Terraform type suffix read off `resp.TypeName`, every schema attribute with its Required / Optional / Computed / Sensitive flags and its plan modifiers, the model struct and its `tfsdk` tags, which lifecycle methods exist, and what the acceptance test file contains. From that it decides a **fifteen-check table** entirely client-side — framework, schema, model-to-schema parity, CRUD coverage, import support, `Configure` wiring, diagnostics discipline, state writes, drift handling, attribute legality, unknown pinning, secret sensitivity, documentation, acceptance tests, registry naming — and raises **numbered flags** (`PD01`…`PD38`), each with a severity, a line number and a statement of what actually breaks. There is also a live edit delta: after a run, the flag set at that moment becomes a baseline, and every subsequent keystroke is re-counted for free — cleared, still open, or introduced by your edits. Fixing the code never costs a second run. ## The four lanes All four take the same work object — the pasted Go — and run in the order a person actually works: inspect, verify, publish. - **schema** — audit the resource. An attribute-by-attribute verdict, a lifecycle method table, the breaking changes a fix would introduce, an ordered plan, and the corrected `.go` file. Grounded in `@hashicorp/provider-resources`. - **tests** — design the acceptance suite. The test plan step by step, the attribute assertions, a `CheckDestroy` implementation, the `ImportState` step with its id format and `ImportStateVerify` ignore list, HCL fixtures per step, and the complete `_test.go` file. Grounded in `@hashicorp/provider-test-patterns`. - **docs** — write the registry page. Front matter, prose sections, the Required / Optional / Read-Only schema table generated from the real schema, worked HCL examples and the import section, as a ready-to-commit Markdown page. Grounded in `@hashicorp/provider-docs`. - **release** — clear the checklist. The semver decision with the specific change that drove it, the changelog entry, a pre-publish checklist, release-build issues, the registry manifest and the signing status. Grounded in `@hashicorp/push-to-registry`. Every lane's result carries a handoff row offering all three other lanes in pipeline order — the lane the model recommended is highlighted, never required, because the pipeline is a constant of the app and not a field of the reply. When a lane emitted a corrected file, that corrected file is what the next lane reads, not the original paste — and the paste it replaced is kept, so one button puts it back. The corrected file is also shown as a line-level diff against what you pasted, changed lines first, so a two-hundred-line file is not an assertion you have to take on trust. ## Accountability Every flag the free reader raised is sent with the run, and the model must return exactly one `coverage_check` entry per flag id — `confirmed`, `set-aside` or `superseded`, each with a reason. A flag the model never mentions is displayed to you as **not accounted for**, above the answer, with a count. The reader is allowed to be wrong and the model is allowed to say so, but neither is allowed to be silent. ## The contract One JSON object per run. The envelope is identical across all four lanes: `lane`, `lane_inferred`, `title`, `posture` (`registry-ready` | `fix-first` | `not-shippable`), `verdict`, `framework`, `resource_type`, `summary`, `assumptions`, `open_questions`, `findings[]`, `coverage_check[]`, `artifact`, `next_lane`, `body`. Only `body` differs per lane. The full field-by-field contract, with one worked example per lane in eight languages, is at `/api.html`. ## Cost and privacy The reader, the check table, the edit delta and the four bundled example runs are free and need no account. A real lane run is metered and costs credits; the app shows the reservation before you press the button and disables the button rather than letting you hit a 402. Pasted source is sent to the model only when you run a lane — the reader never leaves your browser. ## Sources Provider Desk is a derived work built on four `@hashicorp/agent-skills` agent skills: `provider-resources`, `provider-test-patterns`, `provider-docs` and `push-to-registry`. It is not affiliated with, endorsed by, or operated by HashiCorp. Terraform is a registered trademark of HashiCorp.