Skip to content

[TARGET] Fix round-trip reconstruction of targets with canonicalizer-generated feature.* attrs - #18883

Merged
tqchen merged 3 commits into
apache:mainfrom
mshr-h:fix-target-reconstruction
Mar 7, 2026
Merged

tqchen merged 3 commits into
apache:mainfrom
mshr-h:fix-target-reconstruction

Conversation

@mshr-h

@mshr-h mshr-h commented Mar 6, 2026

Copy link
Copy Markdown
Contributor

Fix #18882

TargetNode::ToConfig() exports all target attrs, including derived feature.* fields set by target canonicalizers. However, TargetInternal::FromConfig() rejects these keys during schema validation because they are not declared in the target kind schema. This breaks round-tripping exported configs through Target(config).

This PR strips feature.* keys from the config before ConfigSchema::Resolve, then merges them back afterward. Canonicalizer output is authoritative — if the canonicalizer re-emits a feature.* key, it overwrites the preserved value. Unknown non-feature.* keys continue to fail validation as before.

Changes:

  • src/target/target.cc: Extract and re-merge feature.* keys around schema resolution in FromConfig()
  • tests/cpp/target_test.cc: Add tests for single-target round-trip, nested-host round-trip, and continued rejection of unknown non-feature keys

…generated `feature.*` attrs

`TargetNode::ToConfig()` exports all target attrs, including derived `feature.*` fields set by target canonicalizers. However, `TargetInternal::FromConfig()` rejects these keys during schema validation because they are not declared in the target kind schema. This breaks round-tripping exported configs through `Target(config)`.

This PR strips `feature.*` keys from the config before `ConfigSchema::Resolve`, then merges them back afterward. Canonicalizer output is authoritative — if the canonicalizer re-emits a `feature.*` key, it overwrites the preserved value. Unknown non-`feature.*` keys continue to fail validation as before.

Changes:
- src/target/target.cc: Extract and re-merge `feature.*` keys around schema resolution in `FromConfig()`
- tests/cpp/target_test.cc: Add tests for single-target round-trip, nested-host round-trip, and continued rejection of unknown non-feature keys
@gemini-code-assist

Copy link
Copy Markdown
Contributor

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request addresses a critical bug preventing the reliable serialization and deserialization of target configurations that include dynamically generated feature.* attributes. By carefully managing these attributes during the configuration parsing process, it ensures that targets can be exported and reconstructed without data loss or validation errors, thereby improving the robustness of target management.

Highlights

  • Fix for Target Round-Trip Reconstruction: Resolved an issue where TargetNode::ToConfig() exported canonicalizer-generated feature.* attributes, but TargetInternal::FromConfig() rejected them during schema validation, preventing successful round-trip reconstruction of targets.
  • Handling of feature.* Attributes: Implemented a mechanism in TargetInternal::FromConfig() to temporarily strip feature.* keys from the configuration before schema resolution and then merge them back afterward. This ensures these canonicalizer-owned metadata fields are preserved.
  • Canonicalizer Output Priority: The fix prioritizes the canonicalizer's output for feature.* keys; if the canonicalizer re-emits a feature.* key, it overwrites any preserved value, maintaining the canonicalizer's authority.
  • Validation of Unknown Keys: Confirmed that unknown keys not prefixed with feature.* will continue to cause validation failures, upholding strict schema validation for non-canonicalizer-generated attributes.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Changelog
  • src/target/target.cc
    • Modified TargetInternal::FromConfig() to extract feature.* keys before schema resolution and re-merge them afterward, giving priority to canonicalizer output.
    • Updated step numbering in comments to reflect the new logic.
  • tests/cpp/target_test.cc
    • Added RoundTripCanonicalizerFeatures test to verify single-target round-trip preservation of feature.* attributes.
    • Added RoundTripCanonicalizerFeaturesNestedHost test to ensure feature.* attributes are preserved in nested host targets during round-trip.
    • Added UnknownNonFeatureKeyStillFails test to confirm that unknown non-feature.* keys continue to fail schema validation as expected.
Activity
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@gemini-code-assist gemini-code-assist Bot 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.

Code Review

This pull request fixes an issue with round-trip reconstruction of targets that have feature.* attributes generated by canonicalizers. The approach of temporarily removing these attributes before schema validation and adding them back afterward is sound. The new tests are comprehensive, covering the main functionality, a nested host scenario, and a negative case. I have a couple of suggestions to improve code efficiency and test readability.

Comment thread src/target/target.cc Outdated
Comment thread tests/cpp/target_test.cc Outdated
mshr-h and others added 2 commits March 7, 2026 01:05
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
@mshr-h
mshr-h marked this pull request as ready for review March 6, 2026 17:07
@tqchen
tqchen merged commit c0a305d into apache:main Mar 7, 2026
11 checks passed
@mshr-h
mshr-h deleted the fix-target-reconstruction branch March 7, 2026 04:43
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.

[Bug] Target(config) rejects canonicalizer-generated feature.* attrs exported by Target::ToConfig()

2 participants