Skip to content

refactor(breakdown, kernelforge): delete what eleven over-gate functions re-checked - #2052

Merged
ZhengGong-amd merged 12 commits into
mainfrom
lean/shafeng/cc20-breakdown-flydsl
Oct 21, 2026
Merged

ZhengGong-amd merged 12 commits into
mainfrom
lean/shafeng/cc20-breakdown-flydsl

Conversation

@fengshaoyi-amd

@fengshaoyi-amd fengshaoyi-amd commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

What this does

Eleven functions in the session breakdown and in the FlyDSL rewrite pipeline were over the code-metrics gate. This PR brings each one under every limit it broke, mostly by deleting what it re-checked: alias keys and fallbacks for a producer that no longer exists, guards on inputs whose only caller already guarantees them, keyword arguments no caller passes, second reads of a value already read, and two pairs of helpers that always ran together. What is left of the three long FlyDSL retry loops moves onto one object per loop that owns that loop's state.

Production code: +727 / −1,070 (net −343) across 11 files. The code-metrics baseline loses 21 entries and gains none.

This continues the complexity cleanup of #2024 and #2026. The two areas share one PR to save a review round; the eight commits read one at a time, and each commit message lists what it deleted and why that is safe.

Commit Module Production lines Baseline entries removed
aee0efb project framework attempt rows through one field table breakdown/recorder/framework_event.py (also event_fields.py, conc_sweep_event.py, schema.py) +98 / −155 3
fb39c96 mirror kernel backend attempts as the controller reports them breakdown/recorder/instrument.py +20 / −113 2
26a702c render the kernel lifecycle off the rollup's guarantees breakdown/reporters/_renderers/kernel_lifecycle.py +83 / −111 2
ef65434 read V6 metadata and validation from one source each breakdown/collectors/v6.py +79 / −70 4
7decb4b normalize critic reviews without re-narrowing their inputs breakdown/critic_reviews.py +62 / −77 2
d3c8a7d bring the rewrite KB warm start under the complexity gate rewrite_by_flydsl/kb.py +101 / −132 3
e87f0bc bring rewrite apply-back under the complexity gate rewrite_by_flydsl/applyback.py +125 / −198 3
119920d bring rewrite driver preparation under the complexity gate rewrite_by_flydsl/flydsl_rewrite_driver_preparation.py +157 / −212 2

breakdown/ is under src/hyperloom/inference_optimizer/, rewrite_by_flydsl/ under src/kernelforge/.

Gate numbers per function

Measured with the gate's own tools (ruff C901, complexipy, function lines), base → head. Limits are 20, 30 and 80; bold values were over the limit at base.

Function Cyclomatic Cognitive Lines
FrameworkEventRecorder.record_attempt 17 → 7 68 → 14 111 → 22
assemble_framework_ext 8 → 4 26 → 22 93 → 68
_mirror_backend_attempts_to_kernel_timeline 13 → 4 53 → 13 119 → 41
kernel_lifecycle.render 17 → 5 59 → 20 156 → 79
collect_v6_metadata 3 → 3 32 → 14 90 → 62
_validation_from_timeline 5 → 3 35 → 17 88 → 69
normalize_framework_reviews 9 → 8 37 → 23 133 → 70
try_flydsl_kb_warmstart (nesting 7 → under 5) 18 → 7 71 → 12 169 → 61
generate_applyback_patch 19 → 7 33 → 6 209 → 37
_validate_worktree_changes 17 → 14 35 → 29 78 → 62
prepare_rewrite_driver 18 → 6 37 → 7 231 → 44

Across the 11 touched production files: C901 total 563 → 528 and cognitive total 1,103 → 915. Functions over a gate limit: cognitive 10 → 0, length 12 → 2 (the two left are functions this PR does not change).

FrameworkEventRecorder.record_proposal_review stays in the baseline for its 12 keyword parameters. They are the recorder's call interface, and an object built only to pass them under the limit would be a parameter bag.

New names

  • Tables instead of hand-written blocks: _ATTEMPT_FIELDS, _ATTEMPT_BLOCKS and _CONFIG_DELTA for framework attempt rows; _VERDICT_DECISIONS and _UTIL_COLUMNS in the kernel-lifecycle renderer; _ACTION_ROUTES for critic reviews.
  • Helpers that each name one job: event_fields.text (replaces the private copy in conc_sweep_event), _texts and _text_rows, _session_block, _attribution, _kernel_tables, _specialist_authors_source, _ruling. Two pairs of helpers that always ran together became one each: _publishable_staged_paths and _restore_write_boundary.
  • One object per FlyDSL retry loop, with the loop's phases as its methods:
    • _Trials (KB warm start) owns the survivors, the references and the search deadline that the trial loop used to thread through nested blocks. reject, measure and settle update them.
    • _DriverAuthoring (driver preparation) owns the failure the next prompt reports, the attempt count and the last preflight. run, _seed_stage, _author and _failure read and update them.
    • _CleanRoomAttempts (apply-back) is frozen and holds the four inputs that both the retry loop (run) and one attempt's integration (_integrate) read. It is the closest of the three to a parameter carrier; without it, _integrate takes seven parameters.

Observable effect

Nothing an operator sees changes. Breakdown JSON, reports, rewrite results, apply-back patches, audit trees and log lines are the same for every input the repo's own callers produce.

The differences below are reachable only by input that no caller in the repo produces:

  • Kernel timeline mirror. It no longer accepts the alias keys of the retired GEAK journey replay, and it no longer writes a pre-dispatch row for a result with an empty attempts list. Its only producer, KernelPhase._record_kernel_rewrite_controller_timeline, sends neither. An adopted attempt whose micro speedup is exactly 0.0 is now recorded with speedup None, as every other attempt with a 0.0 speedup already was. That would be a KEEP at a −100% gain, which the controller does not produce.
  • FrameworkEventRecorder.record_attempt. It no longer takes ts= or accepted_kernels=; no caller passes either. A row is always stamped with the record time, and V6FrameworkAttempt drops accepted_kernels, which no writer ever filled.
  • Narrowing at the breakdown collectors. normalize_framework_reviews expects review and emit to be dicts, which its one caller already ensures. _validation_from_timeline and _baseline_from_timeline require source_ids, which their one caller always passes.
  • try_flydsl_kb_warmstart.
    • It no longer takes top_k; no caller passes it.
    • stop_at_unix=None raises TypeError instead of meaning "no deadline". The default, infinity, is what means no deadline now.
    • A non-positive stop_at_unix stops the search at once. The runner always passes the search stop, a positive timestamp derived from the run deadline.
  • max_attempts below 1 now runs no attempt instead of one.
    • Apply-back reports the out-of-time failure. The CLI flag is IntRange(min=1) and the request default is 2.
    • Driver preparation reports a failed preparation. The runner never sets its max_attempts, so it is the default of 3.
  • prepare_rewrite_driver given an initial preflight that passed would seed the first prompt with that preflight's detail. The runner calls it only after that preflight failed.

Checklist

  • Description: above.
  • Linked issue(s): none.
  • Tests:
    • Eight new tests (four parametrized) go through the public entry points of driver preparation, apply-back and the KB warm start. They cover paths no existing test ran, so the changed lines clear the 80% diff-coverage gate. Every new test also passes against the base modules, so they pin existing behaviour. One existing test drops the top_k=3 it passed.
    • On Windows, at the branches' original base, the 43 test files that reach the breakdown modules give the same results on the base code and on this code: 1,429 passed and the same 10 Windows-only failures. The 18 test files that reach the FlyDSL modules match the same way: 531 passed and the same 4 Windows-only failures (symlinks and workspace paths).
    • Linux CI on this PR is the authority: every test shard passes, with main merged in at 73b01c0.
    • The FlyDSL commits were also run differentially against the previous code, with no difference:
      • KB warm start: 8,000 generated scenarios.
      • Apply-back: 300 validation scenarios and 200 end-to-end scenarios on real git worktrees.
      • Driver preparation: 600 scenarios, including agent timeouts and errors.
  • Size/complexity triggers crossed:
    • 1,797 changed production lines is over the 1,000-line budget, so this carries size-exception. The reasons: two areas share one review round, the eight commits each change one module and read on their own, and the net is −343.
    • No added or changed function crosses a gate limit. kernel_lifecycle.render (79 lines), _DriverAuthoring.run (79) and _CleanRoomAttempts.run (78) sit close to the 80-line trigger; each is the one loop that owns its state.
    • framework_event.py (1,044 → 986 lines), conc_sweep_event.py (1,038 → 1,034) and applyback.py (933 → 860) stay over the 800-line module warning, and each gets shorter.
  • If this simplifies or refactors:
    • Mechanisms removed:
      • Alias-key normalisation for the retired GEAK journey replay, and _to_bool.
      • A second derivation of the framework and its version.
      • Three reads of the ledger's adoptions block.
      • Re-narrowing of inputs the caller already narrowed.
      • Two hand-rolled grouping loops (now group_rows) and a duplicated text coercion.
      • Two helper pairs folded into one each.
      • Dead stores, unreachable fallbacks and unused keywords.
    • Contract preserved: every in-repo caller and all persisted data.
    • Tests: as above.
  • Observable effect: see the section above.
  • Breaking changes: none for in-repo callers or persisted data. The dropped keywords (top_k, ts=, accepted_kernels=) belong to internal functions and had no caller.
  • Single concern: bringing these eleven functions under the gate.
  • Root cause upstream: not applicable.

Known merge interactions

Gate

scripts/code_metrics.py --base-ref origin/main passes: 0 new, 0 worse, 0 out-of-date entries. Baseline: −21 entries, +0. ruff check and ruff format --check are clean on the touched files.

fengshaoyi-amd and others added 8 commits October 20, 2026 14:55
… table

FrameworkEventRecorder.record_attempt spelled out every field of an
attempt row as its own statement: nineteen text fields, three tri-state
booleans, three text lists and six blocks, each block a hand-written dict
of the same few coercions. The row is now driven by two tables,
_ATTEMPT_FIELDS for the flat fields and _ATTEMPT_BLOCKS for the blocks,
and the measured-against stack shares its server-argument and environment
fields with config_delta through _CONFIG_DELTA instead of repeating them
in _stack. Every field keeps its coercion, and a field the caller did not
pass is still absent from the row.

Deleted, because no caller of record_attempt passes them:
- accepted_kernels, which V6FrameworkAttempt drops as well;
- the ts= override, so the row is always stamped with the record time.

assemble_framework_ext groups attempts by proposal and proposals by run
with group_rows, the package's grouping primitive, instead of two
hand-rolled setdefault loops. Every proposal and run row has its own id,
since each writer returns early on an empty key.

conc_sweep_event's local text coercion moves to event_fields as text,
beside text_or_none, so the two recorders share one copy.

The code-metrics baseline drops record_attempt (cognitive complexity and
function length) and assemble_framework_ext (function length).

Co-authored-by: Cursor <cursoragent@cursor.com>
… reports them

_mirror_backend_attempts_to_kernel_timeline normalised its input as if it
could arrive in any shape the retired GEAK journey replay produced: alias
keys for most fields (id, speedup, started_at/created_at/ts, ended_at,
duration_sec/elapsed_sec/elapsed_s, error_message, optimized_path,
optimized_file, compile_passed, correctness_passed, integration_id,
candidate.task_group, verification.best_artifact_path), a pre-dispatch
row for a result with no attempts, status, decision, run-id and speedup
fallbacks, and _to_bool for spelled-out booleans.

Its only producer, KernelPhase._record_kernel_rewrite_controller_timeline,
sends one attempt per settled controller row with an attempt_id, the
backend, a lower-cased non-empty status, an upper-case decision constant,
the micro speedup, error and error_class, plus the kernel name and the
adopted attempt's id. It sends none of the aliases, never an empty
attempts list, and sets proposal.decision and verification.micro_speedup
to the attempt's own values.

The mirror now hands those fields to KernelRewriteRun and LaneRunFields,
whose row() normalizes every field of a kernel_rewrites row, and keeps
only what that producer relies on: no recorder or no kernel id records
nothing, attempts must be a list of dicts, the adopted backend is the
attempt verification names, and an unmeasured 0.0 speedup is still
recorded as None. _to_bool and the to_float import go with it.

The code-metrics baseline drops the function (cognitive complexity and
function length).

Co-authored-by: Cursor <cursoragent@cursor.com>
…rantees

kernel_lifecycle.render re-checked fields kernel_rows always fills: every
row it returns has a non-empty kernel_id, a string name and a
final_decision from a closed set, and a kernel with a lane summary is one
the rollup has already marked selected. The "—" fallbacks on kernel_id
and final_decision, the "or ''" on name and the GEAK and Forge terms of
the actionable test are gone; a kernel is actionable when it was
selected or a gate verdict reached it.

The three verdict decisions come from one table instead of three copies
of the same Decision block, the verdict counts from one Counter instead of
four filtered lists, and the bw% and compute% columns from one table
instead of two flags checked in two places. The markdown tables move into
_kernel_tables, which reads only the detected kernels.

render's only input is the breakdown, and every row it reads comes out of
kernel_rows, so the section is unchanged for any breakdown.

The code-metrics baseline drops render (cognitive complexity and function
length).

Co-authored-by: Cursor <cursoragent@cursor.com>
…each

collect_v6_metadata derived versions.framework and
versions.framework_version from the workload a second time, with the same
coercion task_config had just applied; they now read task_config. The
session block moves into _session_block, where the recovery mapping is
narrowed with _mapping rather than a hand-written copy of it, and image_id
loses an "if image" branch that returned the None the split already gives
an empty image.

_validation_from_timeline read the ledger's adoptions block three times;
it now reads it once. The per-source attribution split and its _bucket
helper move into _attribution, beside _bucket_of.

_validation_from_timeline and _baseline_from_timeline accepted
source_ids=None and guarded every write to it, but their one caller,
collect_v6_outcome, always passes a list, so the parameter is required.

The metadata and outcome sections are unchanged.

The code-metrics baseline drops collect_v6_metadata and
_validation_from_timeline (cognitive complexity and function length).

Co-authored-by: Cursor <cursoragent@cursor.com>
…eir inputs

normalize_framework_reviews narrowed request, review and emit with
_mapping, although its one caller, record_critic_iteration, passes review
and emit through its own _dict and calls request.get() before the call,
and request is only read through _safe_get, which accepts any value.
Those three calls are gone. judge_bundle keeps its _mapping: it comes
straight from read_json and nothing checks it first.

Also deleted: the "or ''" on a proposal's msg_id, which the
comprehension's own filter already rules out, and the trailing None and
[] arguments to _first, which already returns None when nothing qualifies
and whose result _string_list already turns into [].

The fixed action-to-arm branches become one table, and the candidate a
proposal names is resolved in one place: _candidate_id now takes the
payload and params and checks the Framework Agent id before the
candidate's own references, as the inline lookup around it did. The
specialist's source-or-config rule and the critic's ruling fields move
into _specialist_authors_source and _ruling.

The rows are unchanged, key order included.

The code-metrics baseline drops normalize_framework_reviews (cognitive
complexity and function length).

Co-authored-by: Cursor <cursoragent@cursor.com>
…lexity gate

try_flydsl_kb_warmstart was over the gate on cognitive complexity (71),
length (169 lines) and nesting depth (7). The candidate trials now run on
one _Trials object whose reject, measure and settle methods own the state
the loop used to thread through nested blocks: the survivors, the
references and the search deadline. The function keeps the read, the
admission checks and the deadline handling (cognitive 12, 61 lines).

Deleted, and why each is safe:
- The top_k keyword. Its only production caller (runner.py) never passes
  it, so the warm start always read warmstart_policy.top_k() candidates.
- stop_at_unix=None (or <= 0) meaning "no deadline", with the matching
  None branch in _stage_timeout. The production caller always passes the
  run's search stop, a positive unix timestamp; the default is now
  infinity, which bounds nothing.
- The (speedup, -index) tie-break. Survivors are appended in rank order
  and max() returns the first maximal item, so the winner is the same.
- The plan.candidates check before turning "hit" into
  "candidates_rejected": _read_top_candidates reports "hit" only when it
  returns candidates.

Kernel writes, validation and benchmark calls and attempt records happen
in the same order: a differential run against the previous code over 8000
generated scenarios found no difference.

Co-authored-by: Cursor <cursoragent@cursor.com>
…gate

generate_applyback_patch (cognitive 33, 209 lines) and
_validate_worktree_changes (cognitive 35) were over the gate. The
clean-room attempt loop now runs on _CleanRoomAttempts: run owns each
attempt's pristine worktree, its cleanup and the retry decision, and
_integrate runs the agent, validates what it changed and publishes it.
generate_applyback_patch keeps the request checks and the reference copy.

Deleted, and why each is safe:
- The placeholder result for a loop that never ran, and the separate
  out-of-time return on the first attempt: the result before any attempt
  is now the out-of-time one, which is what the first attempt returned
  when there was no time to start it.
- The math.isfinite branch around the baseline import timeout: min() with
  the 60 s import ceiling already turns an unbounded remaining time
  into 60.
- The "failed without diagnostics" fallback: both failure handlers always
  set a non-empty error text.
- The retryable flag, replaced by one check of the error against the two
  failures a fresh attempt cannot fix, and the max(1, ...) clamps on
  attempts_left, which is at least 1 inside the loop.
- _staged_paths and _reject_unpublishable_paths, folded into
  _publishable_staged_paths: both call sites listed the staged paths,
  refused an empty list and checked the same forbidden paths.
- The attempt counter in the pre-commit loop, replaced by for/else.

A max_attempts below 1 now runs no attempt and reports the out-of-time
failure; the CLI (IntRange(min=1)) and the request default (2) never
pass one. Worktree setup, validation, agent calls, failure snapshots and
cleanup run in the same order: differential runs against the previous
code (300 validation and 200 end-to-end scenarios on real git worktrees)
found no difference.

Co-authored-by: Cursor <cursoragent@cursor.com>
…plexity gate

prepare_rewrite_driver was over the gate on cognitive complexity (37) and
length (231 lines). Its authoring loop now runs on _DriverAuthoring, which
holds the caller's original driver, the audit directory and the failure
the next prompt reports; run, _seed_stage, _author and _failure are its
phases. prepare_rewrite_driver keeps the independence checks, the
invocation-spec read and the audit setup.

Deleted, and why each is safe:
- The prior_failure assignments in the agent timeout and error handlers:
  every path after an authoring turn overwrites prior_failure or returns
  before the next prompt is built, so those messages never reached the
  agent or the final error.
- max(1, max_attempts): the runner never sets DriverPreparation's
  max_attempts, so it is always the default of 3.
- The "not initial_preflight.ok" condition on seeding the first prompt
  with the preflight detail: the runner calls prepare_rewrite_driver only
  after that preflight failed.
- _unexpected_stage_outputs and _clean_unexpected_outputs, folded into
  _restore_write_boundary: their one caller always ran them around
  _restore_evidence, so the three steps are now one call that returns
  what crossed the write boundary.

Audit files, driver writes and restores, preflight calls and results are
unchanged: a differential run against the previous code over 600
generated scenarios, including agent timeouts and errors, found no
difference.

Co-authored-by: Cursor <cursoragent@cursor.com>
@fengshaoyi-amd fengshaoyi-amd added the size-exception Waives the PR diff budget; added by a maintainer with a reason in the PR description label Oct 20, 2026
@github-actions

github-actions Bot commented Oct 20, 2026 •

Copy link
Copy Markdown

Code metrics gate: PASSED

Judged: the 15 files this change touches. Files it does not touch never fail it; anything found there is listed under Outside this change for information.

Dimension Limit New Worse Baseline out of date Baseline entries vs base
Cyclomatic complexity fails > 20 0 0 0 55 +0
Cognitive complexity fails > 30 0 0 0 203 -10
Function length (lines) fails > 80 0 0 0 346 -10
Nested block depth fails > 5 0 0 0 20 -1
Parameter count fails > 5 0 0 0 95 +0
Module length (lines) warns > 800, fails > 1200 0 0 0 49 +0
Duplicated lines per file fails > 0 0 0 0 96 +0
Dead code (vulture) fails > 0 0 0 0 2 +0
Check Findings Effect
Comments 0
English only 0
Production code imports test code 0
Repeated literals 0
A1 Private name of another package 0
A8 Flag argument 0
A9 Tuple return 0
A10 Raw vocabulary comparison 0
A11 Hidden global write 0
A12 Pure forwarder 0
A12 Single-implementation abstraction 0

Module length warning: over 800 lines, within the 1200-line failure limit (not failing): 3

Module Lines Limit
src/hyperloom/inference_optimizer/breakdown/recorder/conc_sweep_event.py 1034 warns > 800
src/hyperloom/inference_optimizer/breakdown/recorder/framework_event.py 986 warns > 800
src/kernelforge/rewrite_by_flydsl/applyback.py 860 warns > 800

Already over at the base (backlog, not this change's): 1

Unit Dimension Base Now
src/hyperloom/inference_optimizer/breakdown/schema.py:1 Module length (lines) 2709 2708
107 findings in files this change does not touch

Outside this change (informational): 107

Unit Dimension Baseline Now
src/hyperloom/orchestrator/state/shared_state.py resolve_graded_comparison Cognitive complexity absent 34
src/hyperloom_kb/collect/mapping.py _experience Cognitive complexity absent 31
src/hyperloom_kb/schema.py FieldDeclaration.__post_init__ Cognitive complexity absent 32
src/kernelforge/cli/forge_loop_command.py _prepare_measurement_driver Cognitive complexity absent 36
src/kernelforge/cli/forge_loop_command.py _read_kb_warm_start Cognitive complexity absent 40
src/kernelforge/cli/forge_loop_command.py forge_loop Cognitive complexity absent 31
src/kernelforge/loop/runner.py IterationLoop._collect_session_candidate Cognitive complexity absent 44
src/kernelforge/loop/runner.py IterationLoop._rule_on_attempt Cognitive complexity absent 38
src/hyperloom/inference_optimizer/cli/__init__.py _reexport_session_environment Function length (lines) absent 111
src/hyperloom/inference_optimizer/cli/__init__.py _resolve_agent_lineup Function length (lines) absent 89
src/hyperloom/inference_optimizer/cli/__init__.py _resolve_run_topology Function length (lines) absent 92
src/hyperloom/inference_optimizer/cli/__init__.py _resume_session Function length (lines) absent 170
src/hyperloom/inference_optimizer/cli/__init__.py _seed_fresh_session Function length (lines) absent 164
src/hyperloom/inference_optimizer/multi_node/cli.py _restart_multinode Function length (lines) absent 107
src/hyperloom/inference_optimizer/multi_node/scripts/launch_multinode.py _build_parser Function length (lines) absent 84
src/hyperloom/inference_optimizer/multi_node/scripts/launch_multinode.py _spawn_rank_actors Function length (lines) absent 84
src/hyperloom_kb/sync.py GlobalSync.pull Function length (lines) absent 84
src/kernelforge/cli/forge_loop_command.py _RunReporter.build_result Function length (lines) absent 92
src/kernelforge/cli/forge_loop_command.py _prepare_measurement_driver Function length (lines) absent 136
src/kernelforge/cli/forge_loop_command.py _read_kb_warm_start Function length (lines) absent 149
src/kernelforge/loop/runner.py IterationLoop._close_iteration Function length (lines) absent 117
src/kernelforge/loop/runner.py IterationLoop._collect_session_candidate Function length (lines) absent 185
src/kernelforge/loop/runner.py IterationLoop._implementer_history Function length (lines) absent 112
src/kernelforge/loop/runner.py IterationLoop._rule_on_attempt Function length (lines) absent 102
src/kernelforge/loop/runner.py IterationLoop._source_attempt Function length (lines) absent 175

...and 82 more; the job log lists every row.

Verdict computed by the gate scripts in /home/runner/work/_temp/code-metrics-gate, not by this tree's copy.

Thresholds and sources: [tool.hyperloom.code_metrics] in pyproject.toml. Tools: complexipy 8.0.1, jscpd 5.4.1, ruff 0.16.2, vulture 2.16.

…akdown-flydsl

Co-authored-by: Cursor <cursoragent@cursor.com>

# Conflicts:
#	scripts/code_metrics_baseline.txt
…akdown-flydsl

Co-authored-by: Cursor <cursoragent@cursor.com>

# Conflicts:
#	src/kernelforge/rewrite_by_flydsl/applyback.py
#	src/kernelforge/rewrite_by_flydsl/flydsl_rewrite_driver_preparation.py
@fengshaoyi-amd

Copy link
Copy Markdown
Contributor Author

/review

@github-actions

Copy link
Copy Markdown

Automated review started for head 1273401. Progress: https://github.com/AMD-AGI/Hyperloom/actions/runs/39413579400

@github-actions

Copy link
Copy Markdown

Automated review: no verdict applied -- the review job ended with result 'failure'. Comment /review to retry. Run: https://github.com/AMD-AGI/Hyperloom/actions/runs/39413579400

…akdown-flydsl

Co-authored-by: Cursor <cursoragent@cursor.com>

@ZhengGong-amd ZhengGong-amd left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Approved

…akdown-flydsl

Co-authored-by: Cursor <cursoragent@cursor.com>

# Conflicts:
#	scripts/code_metrics_baseline.txt
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size-exception Waives the PR diff budget; added by a maintainer with a reason in the PR description

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants