Skip to content

feat: add generate-spec command#2937

Open
sobanieca-redocly wants to merge 28 commits into
mainfrom
feat/generate-spec-command
Open

feat: add generate-spec command#2937
sobanieca-redocly wants to merge 28 commits into
mainfrom
feat/generate-spec-command

Conversation

@sobanieca-redocly

@sobanieca-redocly sobanieca-redocly commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

What/Why/How?

Added new generate-spec command which will infer OAD basing on traffic data. To improve accuracy, there is option to use AI agents to improve results.

Reference

Testing

Screenshots (optional)

image

Check yourself

  • This PR follows the contributing guide
  • All new/updated code is covered by tests
  • Core code changed? - Tested with other Redocly products (internal contributions only)
  • New package installed? - Tested in different environments (browser/node)
  • Documentation update has been considered

Security

  • The security impact of the change has been considered
  • Code follows company security practices and guidelines

Note

Medium Risk
Large new surface area and --with-ai sends traffic samples to external CLIs, but refinement is gated by validation and AI failure falls back to the deterministic baseline without failing the command.

Overview
Introduces an experimental generate-spec CLI command that reads HAR/Kong/Nginx/Apache JSON/NDJSON traffic (same parsers as drift) and emits an OpenAPI 3.2 document.

Deterministic pipeline: path templating for ID-like segments, merged request/response schemas (oneOf, nullable unions), repeated shapes lifted to components/schemas, and conservative string format/enum inference. Flags include --server, --title, and -o.

Optional --with-ai: refines one operation at a time via local claude, codex, or cursor CLIs (isolated temp cwd, configurable concurrency). Accepts only refinements that preserve path/method/status codes and pass the built-in spec ruleset; otherwise keeps the baseline and falls back on total failure.

Also adds v2 docs, a minor changeset, CODEOWNERS, broad unit tests, and e2e coverage with stub AI binaries.

Reviewed by Cursor Bugbot for commit ad8c15f. Bugbot is set up for automated code reviews on this repo. Configure here.

@changeset-bot

changeset-bot Bot commented Jul 6, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: ad8c15f

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 3 packages
Name Type
@redocly/cli Minor
@redocly/openapi-core Minor
@redocly/respect-core Minor

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@github-actions

github-actions Bot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

Coverage Report

Status Category Percentage Covered / Total
🔵 Lines 71.79% (🎯 69%) 8612 / 11995
🔵 Statements 71.49% (🎯 69%) 8959 / 12531
🔵 Functions 76.47% (🎯 73%) 1707 / 2232
🔵 Branches 63.27% (🎯 61%) 5776 / 9129
File Coverage
File Stmts Branches Functions Lines Uncovered Lines
Changed Files
packages/cli/src/commands/generate-spec/components.ts 93.08% 77.77% 89.79% 94.14% 48, 250, 262, 267-274, 281, 366
packages/cli/src/commands/generate-spec/generator.ts 57.74% 50.95% 63.41% 56.37% 188, 195, 238-248, 251, 271, 337, 350, 352, 416, 423, 439-451, 461, 473, 481, 495-778
packages/cli/src/commands/generate-spec/index.ts 0% 0% 0% 0% 31-113
packages/cli/src/commands/generate-spec/samples.ts 85.13% 72.58% 100% 84.93% 43, 52, 71, 74, 83, 113, 123-127, 171
packages/cli/src/commands/generate-spec/value-inference.ts 93.33% 90% 100% 94.73% 49, 127, 133, 146
packages/cli/src/commands/generate-spec/ai/prompt.ts 92.85% 66.66% 100% 92.85% 41, 44
packages/cli/src/commands/generate-spec/ai/providers.ts 64.86% 43.33% 69.23% 64.86% 49-50, 57, 60-67, 72-77, 112, 118, 121, 147, 150, 162, 174-185, 191, 194, 211
packages/cli/src/commands/generate-spec/ai/refine.ts 97.2% 85.29% 100% 97.14% 103, 134, 138, 249
Generated in workflow #10768 for commit ad8c15f by the Vitest Coverage Report Action

Base automatically changed from feat/traffic-analysis to main July 7, 2026 10:58
@sobanieca-redocly
sobanieca-redocly force-pushed the feat/generate-spec-command branch from 2c94a80 to 6b62b28 Compare July 7, 2026 11:29
@sobanieca-redocly sobanieca-redocly changed the title feat: generate-spec command feat: add generate-spec command Jul 7, 2026
@github-actions

github-actions Bot commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

Performance Benchmark (Lower is Faster)

CLI Version Bundle Lint Check Config
cli-latest ▓ 1.00x (Fastest) ▓ 1.00x ± 0.01 ▓ 1.00x (Fastest)
cli-next ▓ 1.00x ± 0 ▓ 1.00x (Fastest) ▓ 1.00x ± 0.02

@sobanieca-redocly

Copy link
Copy Markdown
Contributor Author

@cursor review

Comment thread packages/cli/src/commands/generate-spec/index.ts
Comment thread packages/cli/src/commands/generate-spec/generator.ts Outdated
@sobanieca-redocly

Copy link
Copy Markdown
Contributor Author

@cursor review

Comment thread packages/cli/src/commands/generate-spec/samples.ts
Comment thread packages/cli/src/commands/generate-spec/generator.ts Outdated
@sobanieca-redocly

Copy link
Copy Markdown
Contributor Author

@cursor review

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Bugbot reviewed your changes and found no new issues!

2 issues from previous reviews remain unresolved.

Fix All in Cursor

Comment @cursor review or bugbot run to trigger another review on this PR

Reviewed by Cursor Bugbot for commit 956bf00. Configure here.

@sobanieca-redocly

Copy link
Copy Markdown
Contributor Author

@cursor review

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Bugbot reviewed your changes and found no new issues!

Comment @cursor review or bugbot run to trigger another review on this PR

Reviewed by Cursor Bugbot for commit 3a11b20. Configure here.

@sobanieca-redocly

Copy link
Copy Markdown
Contributor Author

@cursor review

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Bugbot reviewed your changes and found no new issues!

Comment @cursor review or bugbot run to trigger another review on this PR

Reviewed by Cursor Bugbot for commit d7ee556. Configure here.

@sobanieca-redocly

Copy link
Copy Markdown
Contributor Author

@cursor review

Comment thread packages/cli/src/commands/generate-spec/samples.ts
Comment thread packages/cli/src/commands/generate-spec/index.ts
error instanceof Error ? error.message : String(error)
}\n`
);
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Final lint drops refinements

Medium Severity

When --with-ai runs, refineSpecWithAi can accept and merge some operations, then fail on the final whole-document lint. The handler catches that error and writes the original baseline YAML, so successful per-operation refinements are discarded instead of being emitted.

Additional Locations (1)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 896fd97. Configure here.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Intentional. If the final whole-document lint fails, the merged document is invalid, and emitting an invalid description would be worse than falling back to the deterministic baseline — the only output we can guarantee. Each fragment already passed lint against the full component set at merge time, so a final-lint failure can only come from concurrent merge interactions; the warning tells the user why the fallback happened.

Comment thread .changeset/generate-spec-command.md Outdated
Comment thread packages/cli/src/commands/generate-spec/README.md Outdated
Comment thread packages/cli/src/commands/generate-spec/README.md Outdated
Comment thread packages/cli/src/commands/generate-spec/README.md Outdated
Comment thread packages/cli/src/commands/generate-spec/README.md Outdated
Comment thread packages/cli/src/commands/generate-spec/README.md Outdated
Comment thread docs/@v2/commands/generate-spec.md Outdated
Co-authored-by: Jacek Łękawa <164185257+JLekawa@users.noreply.github.com>
Comment thread docs/@v2/commands/generate-spec.md
Comment thread packages/cli/src/commands/generate-spec/generator.ts Outdated
Comment thread docs/@v2/commands/generate-spec.md
Comment thread packages/cli/src/commands/generate-spec/README.md
Comment thread packages/cli/src/commands/generate-spec/generator.ts Outdated
Comment thread packages/cli/src/commands/generate-spec/generator.ts
Comment thread packages/cli/src/commands/generate-spec/generator.ts Outdated
Comment thread packages/cli/src/commands/generate-spec/index.ts
Comment thread packages/cli/src/commands/generate-spec/ai/refine.ts
Comment thread packages/cli/src/commands/generate-spec/ai/prompt.ts Outdated
Comment thread packages/cli/src/commands/generate-spec/ai/prompt.ts Outdated
});
});

describe('generate-spec - AI refinement', () => {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can we test the prompt somehow? to avoid regression while editing

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added __tests__/prompt.test.ts — it snapshots the full system instructions and a built user prompt, so any prompt edit produces a reviewable snapshot diff (it already caught the 3.1 → 3.2 wording change).

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i was thinking more about a prompt quality check - eval harness or some kind of .md file with test cases

eval harness seems like overkill for a first iteration, but at least the test cases you leaned on when testing the agents' responses after the modification would be good to have

Comment thread packages/cli/src/commands/generate-spec/ai/prompt.ts Outdated
Comment thread packages/cli/src/commands/generate-spec/ai/prompt.ts
Comment thread packages/cli/src/commands/generate-spec/samples.ts
Comment thread packages/cli/src/commands/generate-spec/ai/prompt.ts
Comment thread packages/cli/src/commands/generate-spec/ai/refine.ts Outdated
Comment thread packages/cli/src/commands/generate-spec/README.md Outdated
}
return lines.join('\n');
})
.join('\n\n');

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Traffic content enables prompt injection

Medium Severity

--with-ai embeds recorded request and response bodies (and inferred operation YAML) directly into the user prompt with no structural delimiters or escaping. Malicious or crafted traffic can inject instructions that compete with the fixed system rules, affecting refinement output and potentially weakening safeguards described in the prompt.

Additional Locations (1)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit e9e957f. Configure here.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

True in principle, but delimiters or escaping can't prevent injection — the model reads the text either way. The defense is downstream: providers run with tools disabled or in a read-only sandbox from an empty temp directory, and a response is only merged if it keeps the path/method/statuses/operationId, parses as the expected fragment, does not redefine reserved components, and passes the spec lint. An injected instruction can at most corrupt the refinement of its own operation, which those checks reject back to the deterministic baseline. The README also warns that --with-ai sends traffic samples to the provider.

Comment thread packages/cli/src/commands/generate-spec/ai/refine.ts

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.

There are 3 total unresolved issues (including 2 from previous reviews).

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 4365a83. Configure here.

paths: { [options.path]: { [options.method]: fragment.operation } },
components: { schemas: { ...schemas, ...fragment.components } },
};
await lintDocumentSource(stringifyYaml(fragmentDocument), options.config);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale snapshot breaks parallel AI merge

Medium Severity

With default --ai-concurrency above 1, each refineOperation captures components.schemas and reserved names before the provider call. After other workers merge new or updated components, acceptance still uses that stale snapshot, so reserved-component rejection and per-operation lint can disagree with the live document and Object.assign can overwrite fresher shared schemas.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 4365a83. Configure here.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mostly a restatement of the documented concurrency trade-off, with one correction: the per-operation lint isn't stale — schemas is a live reference and the fragment document is built after the provider call, so lint sees all merges up to that point. The reserved-name list is intentionally fixed at prompt time because it must match what the model was told it may not touch. What remains is the documented last-merge-wins rule for shared components: merges are serialized on the event loop, the final whole-document lint guards the merged result, and --ai-concurrency 1 gives strictly sequential behavior. Making acceptance transactional would add locking/re-validation for an edge the final lint already covers.

Comment thread packages/cli/src/commands/generate-spec/components.ts
- Identifier-like path segments (numeric, UUID, ULID, CUID, prefixed and opaque tokens) become named path parameters.
- Body schemas are merged across all observations.
A property becomes optional as soon as one sample omits it.
- Alternative body shapes for the same operation are preserved as `oneOf` variants instead of being collapsed, and values observed as `null` produce type unions such as `["string", "null"]`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
- Alternative body shapes for the same operation are preserved as `oneOf` variants instead of being collapsed, and values observed as `null` produce type unions such as `["string", "null"]`.
- Alternative body shapes for the same operation are preserved as `oneOf` variants instead of being collapsed.
- Values observed as `null` produce type unions such as `["string", "null"]`.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Applied in dcb7ff6, thanks.

Comment on lines +32 to +34
The same entity is recognized when it appears as a list item and as a single resource, with different `required` sets, or with near-identical properties (at least 75% shared, with compatible types).
Components are named from the path entity, the enclosing property name, or `Error` for error responses.
A shape repeated only because its parent shape repeats stays inline.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
The same entity is recognized when it appears as a list item and as a single resource, with different `required` sets, or with near-identical properties (at least 75% shared, with compatible types).
Components are named from the path entity, the enclosing property name, or `Error` for error responses.
A shape repeated only because its parent shape repeats stays inline.
- The same entity is recognized when it appears as a list item and as a single resource, with different `required` sets, or with near-identical properties (at least 75% shared, with compatible types).
- Components are named from the path entity, the enclosing property name, or `Error` for error responses.
- A shape repeated only because its parent shape repeats stays inline.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Applied in dcb7ff6, thanks.

Comment on lines +36 to +39
When a string only ever takes a small set of identifier-like values with enough repetition (at least 4 observations, at most 5 distinct values, each seen twice on average) it becomes an `enum`.
Enums apply to body properties and query parameters.
Path parameters and nullable unions get formats only.
Evidence is pooled across all operations a shared component was observed in.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
When a string only ever takes a small set of identifier-like values with enough repetition (at least 4 observations, at most 5 distinct values, each seen twice on average) it becomes an `enum`.
Enums apply to body properties and query parameters.
Path parameters and nullable unions get formats only.
Evidence is pooled across all operations a shared component was observed in.
- When a string only ever takes a small set of identifier-like values with enough repetition it becomes an `enum`.
To trigger this conversion, the command needs at least 4 observations, at most 5 distinct values, each seen twice on average.
- Enums apply to body properties and query parameters.
- Path parameters and nullable unions get formats only.
- Evidence is pooled across all operations a shared component was observed in.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Applied in dcb7ff6, thanks.


## AI refinement

The description is refined one operation at a time, so prompt and response stay small no matter how large the recorded traffic or the resulting description is.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
The description is refined one operation at a time, so prompt and response stay small no matter how large the recorded traffic or the resulting description is.
The description is refined one operation at a time.
The prompt and response stay small regardless of the volume of recorded traffic or the resulting description's size.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Applied in dcb7ff6, thanks.

Comment on lines +45 to +46
Each prompt carries a single operation from the baseline, the component schemas it references, the names of the other components (reserved against collisions), and a capped, shape-diverse sample of the real exchanges recorded for that operation (grouped by status and body shape, selected round-robin so every observed payload variant is represented).
The AI is instructed to narrow types, add formats, enums, descriptions and examples, refine or add `components/schemas`, and model alternative payloads explicitly with `oneOf` (plus `discriminator`) and `allOf` composition.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Each prompt carries a single operation from the baseline, the component schemas it references, the names of the other components (reserved against collisions), and a capped, shape-diverse sample of the real exchanges recorded for that operation (grouped by status and body shape, selected round-robin so every observed payload variant is represented).
The AI is instructed to narrow types, add formats, enums, descriptions and examples, refine or add `components/schemas`, and model alternative payloads explicitly with `oneOf` (plus `discriminator`) and `allOf` composition.
Each prompt carries:
- a single operation from the baseline
- referenced component schemas
- names of the other components (reserved against collisions)
- a capped, shape-diverse sample of real exchanges recorded for that operation
The sample of exchanges is grouped by status and body shape, selected round-robin to represent every observed payload variant.
The AI:
- narrows types
- adds formats, enums, descriptions and examples
- refines or adds `components/schemas`
- models alternative payloads explicitly with `oneOf` (plus `discriminator`) and `allOf` composition

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Applied via your later split suggestions for these paragraphs (the "Each prompt carries:" and "The AI is instructed to:" lists) in dcb7ff6.

Comment on lines +77 to +78
> **Warning:** `--with-ai` sends samples of the recorded traffic (URLs, query strings, request and response bodies) to the selected AI provider.
> Make sure the traffic contains no secrets or personal data you are not allowed to share.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this be wrapped in a Markdoc admonition tag?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This README ships with the package on GitHub/npm rather than the docs site, so a Markdoc admonition tag would render as literal text there. Keeping the plain blockquote for now — when the command graduates from experimental and gets a docs/@v2 page, that page should use the admonition tag.

## AI refinement

The description is refined one operation at a time, so prompt and response stay small no matter how large the recorded traffic or the resulting description is.
Each prompt carries a single operation from the baseline, the component schemas it references, the names of the other components (reserved against collisions), and a capped, shape-diverse sample of the real exchanges recorded for that operation (grouped by status and body shape, selected round-robin so every observed payload variant is represented).

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Each prompt carries a single operation from the baseline, the component schemas it references, the names of the other components (reserved against collisions), and a capped, shape-diverse sample of the real exchanges recorded for that operation (grouped by status and body shape, selected round-robin so every observed payload variant is represented).
Each prompt carries:
- a single operation from the baseline
- component schemas it references
- names of other components (reserved against collisions)
- a capped, shape-diverse sample of the real exchanges recorded for that operation
The sample of exchanges is grouped by status and body shape, selected round-robin to represent every observed payload variant.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Applied in dcb7ff6, thanks.


The description is refined one operation at a time, so prompt and response stay small no matter how large the recorded traffic or the resulting description is.
Each prompt carries a single operation from the baseline, the component schemas it references, the names of the other components (reserved against collisions), and a capped, shape-diverse sample of the real exchanges recorded for that operation (grouped by status and body shape, selected round-robin so every observed payload variant is represented).
The AI is instructed to narrow types, add formats, enums, descriptions and examples, refine or add `components/schemas`, and model alternative payloads explicitly with `oneOf` (plus `discriminator`) and `allOf` composition.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
The AI is instructed to narrow types, add formats, enums, descriptions and examples, refine or add `components/schemas`, and model alternative payloads explicitly with `oneOf` (plus `discriminator`) and `allOf` composition.
The AI is instructed to:
- narrow types
- add formats, enums, descriptions and examples
- refine or add `components/schemas`
- model alternative payloads explicitly with `oneOf` (plus `discriminator`) and `allOf` composition.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Applied in dcb7ff6, thanks.

Each prompt carries a single operation from the baseline, the component schemas it references, the names of the other components (reserved against collisions), and a capped, shape-diverse sample of the real exchanges recorded for that operation (grouped by status and body shape, selected round-robin so every observed payload variant is represented).
The AI is instructed to narrow types, add formats, enums, descriptions and examples, refine or add `components/schemas`, and model alternative payloads explicitly with `oneOf` (plus `discriminator`) and `allOf` composition.

Up to `--ai-concurrency` operations (default 4) are refined in parallel, and every accepted refinement is merged back as it arrives, so operations prompted later see already-refined shared components.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Up to `--ai-concurrency` operations (default 4) are refined in parallel, and every accepted refinement is merged back as it arrives, so operations prompted later see already-refined shared components.
You can set the number of operations refined in parallel using `--ai-concurrency`.
The default value is `4`.
Every accepted refinement is merged back as it arrives: operations prompted later see already-refined shared components.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Applied in dcb7ff6, thanks.

- does not redefine reserved components (those used only by other operations)
- passes validation with the `spec` ruleset (checked against the description's full component set)

An operation whose refinement is rejected keeps its deterministic baseline (reported with the reason), components no operation references anymore are pruned, and the final document is linted again as a whole.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
An operation whose refinement is rejected keeps its deterministic baseline (reported with the reason), components no operation references anymore are pruned, and the final document is linted again as a whole.
An operation whose refinement is rejected keeps its deterministic baseline and the reason for rejection is reported).
Components that no operation references are pruned.
The final document is linted again as a whole.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Applied in dcb7ff6 (dropped the stray closing parenthesis after "reported"), thanks.

@vadyvas vadyvas left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

left a few comments, but overall it looks good, thanks 🔥

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants