Repository navigation
Restrict --tfm all to package discovery - #9915
Conversation
#9904 declared library --package ... --tfm all as one Library aggregate Table. The intent of --tfm all is narrower: package discovery in the manner of a package explorer, listing archive content across every framework by path without acquiring assembly metadata. Selecting one Library, or introspecting sections, across several frameworks has no meaningful answer. Package file inventory now owns --tfm all as package-only discovery. library ... --tfm all and package ... --library --tfm all fail before acquisition and name package <id> --tfm all instead. Output shapes replaces the aggregate Table contract with that rule, section cardinality no longer gives --tfm all a Library row unit, and Package library scope records that #9833 retires the --tfm all Library routes and makes Package's default Library hierarchy honor --tfm all. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018t8FB3ipLLs41ECJvLVNfu
Round 1 review found that the package-discovery rule left assembly- reading package sections and type/member package targets unplanned, and that it assigned the all-framework population to Package library scope, which excludes Package selection. Compile selection owns target requests and already issues the binary-free available-slice inventory, so it now owns --tfm all: not a target request, selecting no projection, showing every available slice in the default hierarchy. Any request that consumes a selected projection or reads an assembly fails before acquisition, including library, type, and member package targets, package --library, and package sections such as SourceLink, Signals, and Package Info's selected-framework facts. The other documents now cross-reference that owner, and the #9833 adoption list names every route. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018t8FB3ipLLs41ECJvLVNfu
Round 1 reconciliation (candidate
|
| Finding | Disposition |
|---|---|
F1. "Never acquires assembly metadata" and "valid only on package discovery" conflict with package sections that still read every DLL under --tfm all. Examples: -S @SourceLink (8 libraries, PDB rows), -S Signals, and Package Info's selected-TFM facts. type --package P --tfm all fails after acquisition instead. None of these was in the adoption list. |
Accepted. The rule now states its admission criterion. A request that consumes a selected compile projection or reads an assembly fails before acquisition and names package <id> --tfm all. That covers library/type/member package targets, package --library, and assembly-reading package sections (SourceLink, Signals, Package Info's selected-framework facts). Sections that read only archive entries or package metadata are admitted. The #9833 adoption list names every route. |
F2. The all-framework population was assigned to package-library-scope.md, which excludes Package selection and the native Package Tree. package-file-inventory.md's own scope is Files. |
Accepted. Compile selection owns target requests and already issues the binary-free available-slice inventory, so it now owns --tfm all:
|
Non-blocking observations:
- Duplicate restatement:
output-shapes.mdnow carries a one-sentence cross-reference instead of repeating the rule. - Stale current-mechanics docs:
integrations.md,inspection-space.md,assembly-inspection-query.md, and thecli-row-selection.mdexclusion lists go stale once Package Library population: one compile view, explicit RID implementation, no whole-package fallback #9833 removes the code. - Code strings: the CLI help at
LibraryAddressCommandDefinitions.cs:464and the error strings atLibraryCommand.cs:3780-3817also change in that adoption.
Next: round 2 on 293acad56.
Generated by Claude Code
Round 2 review found that compile selection disclaims CLI behavior and rendering, so it could not own cross-command admission; that the assembly-read test left framework-selecting metadata sections such as Dependencies and Dependency Hierarchy unclassified; and that find, extensions, diff, and depends were missing from the covered routes. All-frameworks package discovery is now the focused owner. It consumes compile selection's existing available-slice inventory without changing that contract, which is restored. Its admission table classifies every route: the default hierarchy (including tool packages), Files, Dependencies, manifest-only sections, and Package Info without its selected-framework fields are admitted; --library, Dependency Hierarchy, assembly- or PDB-reading sections, categories containing them, and every non-package command fail before acquisition. Its adoption section lists the observed current behaviors. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018t8FB3ipLLs41ECJvLVNfu
Round 2 reconciliation (candidate
|
| Finding | Disposition |
|---|---|
| B1. Compile selection's Composition section disclaims CLI behavior and rendering. It also has no inventory-only request and doesn't cover tool packages. So it could not own command admission, error text or hierarchy rendering, which repeats F2 at a different owner. | Accepted. A new focused owner, All-frameworks package discovery, owns --tfm all. It consumes compile selection's existing available-slice inventory without changing that contract. The compile-selection edit is reverted, and the other four docs now only cross-reference the new owner. |
B2. The "reads an assembly" test is the wrong criterion. -S Dependencies --tfm all returns 0 rows because it filters by the literal all. -S "Dependency Hierarchy" --tfm all throws an internal exception. Neither section was classified. |
Accepted. Admission now fails anything that "needs one selected framework, or reads an assembly or a PDB". The owner's admission table covers:
|
B3. find, extensions, diff and depends accept --tfm all today and weren't in the covered list or the adoption list. |
Accepted. Every command with a package target other than package fails before acquisition and names package <id> --tfm all. The adoption section lists the observed find, extensions and diff behavior. |
Non-blocking observations:
- Package Info: resolved as "the section without its selected-framework fields".
- Validation site: the adoption now says Package Library population: one compile view, explicit RID implementation, no whole-package fallback #9833 adds one shared pre-acquisition check. Today
libraryandtyperecogniseallat separate sites. - Tool packages: the hierarchy shows every tool slice by path.
- Stale current-mechanics docs: named in the owner's adoption section for Package Library population: one compile view, explicit RID implementation, no whole-package fallback #9833 to retire.
package-library-scope.mdparagraph: reordered so "Observed results" refers to the archive search again.
Next: round 3 on 64ae94b46.
Generated by Claude Code
Round 3 review found that Package Info still admitted ecosystem and selected-status fields that read assemblies for a selected framework, and that the --tfm all default Tree overlapped the Package children document, whose rows promise --library paths the default framework would reject. Package Info now omits every field that needs a selected framework or reads an assembly, named explicitly. The --tfm all default Tree is a discovery projection this owner defines, grouped by framework in descending priority with tool slices from Package Info tool measurements; each row carries its framework so following it adds --tfm. Package library scope records that boundary in one sentence. The admission table adds archive-and-metadata sections, package query, and workspace, and the adoption section corrects the depends, member, and workspace observations and names two more stale documents. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018t8FB3ipLLs41ECJvLVNfu
Round 3 reconciliation (candidate
|
| Finding | Disposition |
|---|---|
R3-B1. Package Info still admitted fields that read assemblies for a selected framework: Ecosystem Dependencies and Ecosystem Dependency Status (the rollup of the Ecosystem Dependencies section, which fails), and Selected-TFM Status. |
Accepted. Package Info now omits every field that needs a selected framework or reads an assembly, and lists them: Selected TFM, Selected-TFM Status, the selected-TFM folder/library count/size measurements, Ecosystem Dependencies and Ecosystem Dependency Status. |
R3-B2. The --tfm all default Tree overlapped the Package children document owned by package-library-scope.md. Its rows promise package P --library <path> navigation, and the default framework rejects other frameworks' paths. |
Accepted. The --tfm all default Tree is now a discovery projection the new owner defines, not the children document.
|
Non-blocking observations:
- Taken: section rows. A row for "sections that read only archive entries or package metadata" replaces the "manifest-only" label.
- Taken: tool-slice owner. It is now linked, and the projection owns its own order.
- Taken: adoption bullet corrected. Package-mode
dependsalready fails before acquisition. Type-modedepends,memberandworkspaceaccept--tfm all, andpackage queryreturns zero matches. - Taken:
package queryclassified. It fails before acquisition because it evaluates assemblies.workspaceis added to the failing commands. - Taken: stale docs.
cli-architecture.mdandfind-search-service.mdare added to the adoption's stale-docs list. - Not taken:
docs/overview.mdauthority entry. That file is release-managed, so its owner entry rides release preparation. The recent package-domain owners also have none. - Not taken:
--libraryerror text. The row's "names the section or flag" stands, and the frame wording was mine.
Next: round 4 on 1e2ec9ea9.
Generated by Claude Code
Round 4 review found that the discovery projection owned only the default Tree, so JSON, row formats, Count, and --rows still came from the selected-framework children document; and that admitted sections still ran the package-wide binary-signal scan, whose binary_signals result Package Info JSON emits. The projection is now a Hierarchy of candidate-asset rows with framework, role, and path cells under framework context nodes ordered by TfmResolver priority. Every format and terminal of the default request lowers those rows, and an empty inventory returns the typed no-Library state. Admitted sections run without the binary-signal scan, and Package Info excludes binary_signals. Package library scope scopes its children-document sentence to requests without --tfm all, and the adoption names the scan site, the QuerySpace declaration, and two more documents. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018t8FB3ipLLs41ECJvLVNfu
Round 4 reconciliation (candidate
|
| Finding | Disposition |
|---|---|
R4-B1. The discovery projection owned only the default Tree. Under --tfm all, JSON, the envelope, row formats, Count and --rows were still bound to the selected-framework children document. On main they report target_framework: netstandard2.1, Count 2, and netstandard2.1-only TSV. |
Accepted. The admission row is now "default request, in every format and terminal". The projection is a Hierarchy under Section shapes:
--tree, JSON, the envelope, TSV, JSONL and table output lower the same rows, Count counts them and --rows windows them. package-library-scope.md's children-document sentence is now scoped to requests without --tfm all. The adoption names the QuerySpace producer declaration, cli-reference.md and primary-subject-views.md. |
R4-B2. Admitted sections still run the package-wide binary-signal scan (PackageInspector.InspectAsync, scanBinarySignals), which opens every DLL and PDB. Package Info JSON emits the result as binary_signals. |
Accepted. Admitted sections now produce their ordinary results without the binary-signal scan, and Package Info excludes binary_signals and every member derived from it. Adoption records the scan site, and #9833 skips the scan under --tfm all. |
Non-blocking observations, taken:
- Rank: named as
TfmResolverpriority. - Empty inventory: stated.
NoCompileAssetsnon-claim: clarified. Under--tfm all, such a package shows the empty state and is not searched.
Next: round 5 on 586a27d88. Round 6 is the checkpoint.
Generated by Claude Code
Round 5 review found that the empty-group sentence dropped a slice's real candidates when the slice also had a marker, and left marker-only frameworks visible in the Tree but absent from flat formats and Count. Every candidate is now a row whatever markers its slice has, and each explicit empty-group marker is itself a ref row at ref/<tfm>/_._, so every framework appears in every lowering. The empty state applies to an empty compile and tool inventory, the producer's placement and lack of a Browser consumer are stated, and Package library scope scopes its navigation sentence to requests without --tfm all. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018t8FB3ipLLs41ECJvLVNfu
Round 5 reconciliation (candidate
|
| Finding | Disposition |
|---|---|
R5-B1. "A slice with an explicit empty group … contributes no rows" had two effects. It dropped real candidates from a slice that also has a marker, which compile selection allows. It also left marker-only frameworks in the Tree but absent from flat formats and Count. System.Linq@4.3.0 has 11 marker-only slices and 4 real ones: the Tree would show 15 frameworks, while TSV and Count would reflect 4. |
Accepted. Every candidate is a row, whatever markers its slice also has. Each explicit empty-group marker is itself a row with role ref and archive path ref/<tfm>/_._, so every framework appears in every lowering and in Count. |
Non-blocking observations:
- Taken: empty state. It now applies to an empty compile and tool inventory.
- Taken: producer placement. The producer sits beside the Package children producer with its own QuerySpace declaration. It has no Browser/Wasm consumer, because Inspect Web has no
--tfm allgesture. - Taken:
--librarynavigation. Inpackage-library-scope.md, "Without--tfm all," now scopes the navigation sentence. - Left: binary-scan adoption bullet. It is slightly broad, since the lightweight Target Frameworks path and cache hits don't rescan. The contract is unaffected.
- Left: Audit Findings not named. The "reads an assembly or a PDB" criterion already classifies it.
Next: round 6 on 40e1e8282, which is the six-round checkpoint.
Generated by Claude Code
Round 6 reconciliation (candidate
|
| Finding | Disposition |
|---|---|
R6-B1. The rule "every row is followed with --tfm <framework> --library <path>" contradicts the row population. Rows include lib candidates shadowed by a real ref asset, and _._ marker rows, and neither is a valid --library target. On Microsoft.CSharp@4.7.0, --tfm netstandard2.0 --library lib/netstandard2.0/Microsoft.CSharp.dll and --tfm net45 --library ref/net45/_._ both exit 1. The lib-shadowing half was latent since round 4, and round 5's marker rows made the conflict unavoidable. |
Accepted, not yet fixed. Proposed one-sentence edit: a row is followed with --tfm <framework> --library <path> only when its path is in that framework's selected compile projection, or it is a tool row. Marker rows and shadowed or suppressed candidates are listed for discovery only. The R5-B1 population is kept, and compile selection is unchanged. |
Non-blocking, left:
- The marker path is rebuilt in the inventory's framework spelling, not the archive's exact casing.
lib/<tfm>/_._-only frameworks are not compile slices, so the projection omits them (-S Filesstill shows them).
The PR has reached the repository's six-round checkpoint, so I'm stopping here for a decision on further rounds.
Generated by Claude Code
Round 6 review found that the projection promised every row could be followed with --tfm <framework> --library <path>, while its population includes marker rows and lib candidates that a real ref asset shadows, neither of which --library accepts. Only a row in its framework's selected compile projection, or a tool row, carries that navigation; marker rows and shadowed or suppressed candidates are listed for discovery only. Marker paths are stated in the inventory's framework spelling. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018t8FB3ipLLs41ECJvLVNfu
|
The maintainer approved continuing past the six-round checkpoint.
Round 7 review is starting on Generated by Claude Code |
Round 7 review found that Package Info tool measurements gates `-S "Package Info" --tfm all` on the selected-TFM fields that the new owner omits, with no cross-reference or adoption entry. Package Info tool measurements now records that its CLI all gate's selected-TFM assertions change with the All-frameworks package discovery adoption under #9833, while its download and cold/warm assertions remain. The new owner's adoption lists the current Package Info behavior and that gate, and a tool slice without a Library is a row so it stays visible in every format. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018t8FB3ipLLs41ECJvLVNfu
Round 7 reconciliation (candidate
|
| Finding | Disposition |
|---|---|
B1. package-info-tool-measurements.md has a required gate, PackageCommand_DeclaredToolUsesAggregateToolMeasurementsColdAndWarm, that runs -S "Package Info" --tfm all and asserts the selected-TFM fields. The new owner omits those fields under --tfm all, without a cross-reference or an adoption entry. |
Accepted. The tool-measurements owner now records, below its gate table, that the CLI all gate's selected-TFM assertions change with the All-frameworks discovery adoption under #9833. Its download and cold/warm assertions are unchanged. The new owner's Adoption section lists current Package Info behavior (selected fields and Ecosystem Dependencies are kept) and that gate. |
Non-blocking, taken: a tool slice without a Library is now a row with role tool and its slice directory path, so it stays visible in every format. That mirrors the R5-B1 marker fix.
Next: round 8 on 44c1fdd33.
Generated by Claude Code
Round 8 review found that --platform, local-file, and other non-package targets accept --tfm all under three gated tests while the exact claim says only package accepts it, and that two owners name a library --package --tfm all audit test as a gate. Following the maintainer's direction that --tfm all is only for package, non-package targets now fail before acquisition and say so; the adoption records the three gates and the CLI row selection gate row it replaces. The Untrusted data threat model and Assembly audit gates join the adoption's retirement list. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018t8FB3ipLLs41ECJvLVNfu
Round 8 reconciliation (candidate
|
| Finding | Disposition |
|---|---|
B1. Non-package targets (--platform, a local file) accept --tfm all, under three gated tests: BodyShapesSectionTests.TfmAll_StaysOutsideTheDeclaration, LibraryCommand_TfmAll_PlatformRouteRetainsSingleShapeOutput and LibraryCommand_TfmAll_LocalFileRetainsSingleShapeOutput. cli-row-selection.md also records a gate row for them. The exact claim says only package accepts --tfm all, but the table didn't classify these routes. |
Accepted, following the maintainer's direction that --tfm all should only be on package. A new admission row says any command with a non-package target fails before acquisition and states that --tfm all applies only to package. Adoption records the three gates and the row-selection gate row, which the #9833 adoption replaces with rejection gates. |
B2. untrusted-data-threat-model.md and assembly-audit.md name LibraryCommand_TfmAll_PreservesHealthyIdentifierAuditResults as a per-framework audit gate, and Adoption didn't list them. |
Accepted. Both are now in Adoption's retirement list. |
Next: round 9 on 7cfd2108a.
Generated by Claude Code
Round 9 review found that Artifact acquisition and workspaces gates package --library --tfm all as a supported route through two test cases, while the new owner fails it before acquisition. That owner now records beside its gate that both all-framework cases become rejection gates, and the discovery owner's adoption lists the current behavior, the gate owner, and the Command transition model all-TFM row. A sweep of every document for --tfm all spellings found no other owner; the remaining all-framework mentions describe router platform discovery, which this change does not touch. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018t8FB3ipLLs41ECJvLVNfu
Round 9 reconciliation (candidate
|
| Finding | Disposition |
|---|---|
B1. artifact-acquisition-and-workspaces.md gates package --library --tfm all as a supported route. One gate is the all-framework case of PackageCommand_ExplicitTfmPreservesSelectionAndUsesCompatibleArtifactRoles; the other is the all-frameworks case of PackageCommand_LocalInspectionSelectionPreservesSupportedShapes. Adoption didn't name that doc. |
Accepted. That owner now records beside its gate that both cases become rejection gates under the new owner. The discovery owner's Adoption lists the current behavior and the gate owner. It also adds the command-transition-model.md all-TFM row, which was non-blocking in the review. |
Sweep: to stop finding these one per round, I searched every doc, skill and the README for --tfm all, all-framework, all-TFM, TfmAll, AllTfm and 'all'.
- Every remaining owner is now referenced by the new doc.
- The leftover "all-framework" mentions in
cli-platform-type-routing.mdandmember-inspection-planning-and-metadata-projection.mdare a different thing: the router's installed-framework platform search. This change doesn't affect them.
Next: round 10 on 9c1c8fed1.
Generated by Claude Code
Round 10 review found that a tool-slice row without a Library counted as a followable tool row, although its slice directory path is no --library target. Navigation now applies to tool Library rows, and tool-slice rows without a Library join markers and shadowed or suppressed candidates as discovery-only rows. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018t8FB3ipLLs41ECJvLVNfu
Round 10 reconciliation (candidate
|
| Finding | Disposition |
|---|---|
R10-B1. A tool-slice row without a Library was both followable (it is a "tool row") and implicitly discovery-only (its directory path is no --library target). |
Accepted. Navigation now applies to tool Library rows. Tool-slice rows without a Library join markers and shadowed or suppressed candidates as discovery-only rows. |
Non-blocking, noted for #9833:
- Several
--tfm alltests are not named in any doc; they retire with the IL-reading paths. - The
--libraryerror wording is governed by the owner's row ("names the section or flag").
Next: round 11 on 2564cd8ac.
Generated by Claude Code
Round 11 reconciliation (candidate
|
Part of #9833 under #9240. This corrects #9904 and supersedes the document-only rule from #3885.
Summary
--tfm allis package discovery, in the manner of NuGet Package Explorer. It lists archive content across every framework by path and never touches the IL reader. Introspection across several frameworks has no meaningful answer, so--tfm allis accepted only bypackage. Every request that needs one selected framework, or reads an assembly or PDB, fails before acquisition.Design basis:
Changes
package-tfm-all-discovery.md(new owner)binary_signalsfields.--library, Dependency Hierarchy, assembly- or PDB-reading sections, and categories containing them fail.package queryfails.packagecommand with a package target fails and namespackage <id> --tfm all.--platform, local file, project) fails.framework,roleandpathcells, under framework context nodes ordered byTfmResolverpriority._._markers are rows. Tool slices come from Package Info tool measurements, and a tool slice without a Library is also a row.--rowsobserve the same rows.--tfm <framework> --library <path>. The rest are discovery-only.--tfm alldescriptions and gates retire under Package Library population: one compile view, explicit RID implementation, no whole-package fallback #9833: integrations, inspection space, assembly inspection query, CLI row selection, CLI architecture, find search service, untrusted data threat model, assembly audit, artifact acquisition, command transition model, CLI reference and primary subject views.output-shapes.md: the Declare library --tfm all as one Library aggregate Table #9904 aggregate Table contract is replaced by a cross-reference.section-cardinality.md:--tfm allhas no Library row unit.package-file-inventory.md: "--tfm alladds no predicate", and admission is deferred to the new owner.package-library-scope.md: the children document is scoped to requests without--tfm all, and the--tfm allLibrary routes are retired rather than repopulated.package-info-tool-measurements.md: the CLIallgate's selected-TFM assertions change with the adoption.artifact-acquisition-and-workspaces.md: its two all-framework gate cases become rejection gates.Not in this PR:
NoCompileAssetsLibrary population decision (Package Library population: one compile view, explicit RID implementation, no whole-package fallback #9833 and Package library scope).Validation
npx markdownlint-clion all seven changed files: clean.--tfm all. The remaining "all-framework" mentions describe the router's installed-framework platform search, which this change does not touch.🤖 Generated with Claude Code
https://claude.ai/code/session_018t8FB3ipLLs41ECJvLVNfu