feat: the symmetric power of a surface is a topological manifold - #4285
Conversation
Concatenate a family of unordered tuples along a finite pairwise disjoint family of sets, show it is an open embedding when the sets are open, produce the family a given tuple needs in a Hausdorff space, and assemble the charted structure on `Sym α n` over `Fin n → K`. Co-Authored-By: Claude Code <noreply@github.com>
There was a problem hiding this comment.
🟡 correctness — request_changes claude/claude-opus-5
The concatenation, its range description, the Hausdorff separation and the chart assembly are all faithful, and the ChartedSpace instance is exactly what is proven. But the new module's title and two docstrings assert a topological manifold, which is strictly stronger than the ChartedSpace structure established, and the advertised non-vacuity check does not establish what its docstring says.
TauCeti/Geometry/Manifold/SymmetricPower.lean:13— The module title ("is a topological manifold"), line 17 ("This is the statement thatSym^g(Σ)is a topological2g-manifold") and the instance docstring at line 102 claim more than is proven: onlyChartedSpace (Fin n → K) (Sym α n)is established. No second countability is assumed (the hypotheses admit e.g. an uncountable disjoint union of copies of ℂ, which is T2 and charted by ℂ), and Hausdorffness ofSym α nis never proven either. Fix: Retitle to the charted-space claim and add the caveat the repo already uses verbatim elsewhere: that this is aChartedSpacestructure only, and that the topological-manifold reading needs global hypotheses (second countability) plus T2 ofSym α n, none of which are assumed here.TauCeti/Geometry/Manifold/SymmetricPower.lean:109—noncomputable example : ChartedSpace (Fin n → K) (Sym K n) := inferInstanceis stated under the very typeclass hypotheses it claims to witness, so its docstring "The hypotheses are satisfiable" is false: it would typecheck even if no type satisfiedNormedField + IsAlgClosed + ProperSpace. Fix: Instantiate at a concrete field —noncomputable example (n : ℕ) : ChartedSpace (Fin n → ℂ) (Sym ℂ n) := inferInstance(importingMathlib.Analysis.Complex.Polynomial.BasicforComplex.isAlgClosed) — or reword the docstring to say only that the instance applies withα := K.
Reply in this thread to contest a finding; that re-runs only this rubric and posts an answer here. (To fix it, just push a commit — that re-reviews on its own. To contest again after an answer, post a NEW reply rather than editing an old one.)
claude/claude-opus-5 · 212s · 15 in / 15.7k out tokens · reviewing this diff · rubric
There was a problem hiding this comment.
🟡 reuse — request_changes claude/claude-opus-5
The new family-indexed sumSubtype API clones the existing two-set appendSubtype API declaration for declaration (12 pairs, same proofs) and leaves that API with zero consumers. Two proofs also re-derive located lemmas: IsOpenQuotientMap.isOpenMap_iff (already used twice in this repo) and Mathlib's OpenPartialHomeomorph.isOpenEmbedding_restrict.
TauCeti/Data/Sym/Family.lean:73—sumSubtypeand its lemmas are a strict generalisation (ι := Fin 2) of the existingappendSubtypeAPI, cloned declaration for declaration with the same proofs:appendSubtype/sumSubtype(Data/Sym/Disjoint.lean:52),coe_appendSubtype/coe_sumSubtype(:56),appendSubtype_ofFn/sumSubtype_ofFn(:72),mem_union_of_mem_appendSubtype/exists_mem_of_mem_sumSubtype(:78),filter_mem_map_val_add/filter_mem_coe_sumSubtype(:89),card_filter_mem_appendSubtype/card_filter_mem_sumSubtype(:104),appendSubtype_injective/sumSubtype_injective(:112),exists_appendSubtype_eq/exists_sumSubtype_eq(:130),mem_range_appendSubtype/mem_range_sumSubtype(:165), pluscontinuous_appendSubtype/isOpenMap_appendSubtype/isOpenEmbedding_appendSubtype(Topology/Sym/Disjoint.lean:65,71,81). After this PR the two-set version has no consumer anywhere. Fix: Delete the two-set concatenation sections (Data/Sym/Disjoint.lean:48-171 and Topology/Sym/Disjoint.lean:61-84 — keep theofFn_mapsections, whichisOpenEmbedding_coeffEquiv_comp_ofFn_mapstill uses) and repoint the docs that name them: Analysis/Polynomial/SymmetricPower.lean:190 ("a general tuple is split into such groups byTauCeti.Sym.isOpenEmbedding_appendSubtype" — the splitting actually used is nowisOpenEmbedding_sumSubtype), Topology/Sym/Disjoint.lean:18,21,45 and Data/Sym/Disjoint.lean:19,28-33. If theProdform is wanted, keepappendSubtypeas a definition and derive its lemmas from thesumSubtypeones rather than re-proving them.TauCeti/Topology/Sym/Family.lean:108—isOpenMap_sumSubtypere-derivesIsOpenQuotientMap.isOpenMap_iffby hand: the 8-linecalccomputingsumSubtype '' W = ofFn '' (regroup '' (q ⁻¹' W))viaSet.image_preimage_eq _ hq.surjectiveandSet.image_compis exactly that lemma's proof. Fix: Replace the body withrw [isOpenQuotientMap_piMap_ofFn.isOpenMap_iff, sumSubtype_comp_piMap_ofFn hn e]; exact isOpenMap_ofFn.comp (isOpenMap_regroup hU e), mirroringisOpenMap_mapandisOpenMap_append.TauCeti/Geometry/Manifold/SymmetricPower.lean:61—isOpenEmbedding_chartRestrictreproves continuity, injectivity and openness of a chart restricted to an open subset of its source; Mathlib already has the restriction to the source, and the inclusion of an open subset is an open embedding. Fix:e.isOpenEmbedding_restrict.comp ⟨.inclusion hVs, by rw [Set.range_inclusion]; exact isOpen_induced hVo⟩(the composite is defeq tofun x : ↥V => e ↑x), deleting the hand proof.TauCeti/Topology/Sym/Family.lean:73— The private homeomorphismRis the same construction as the newpiFinSumHomeomorph: both are(piCurryHomeomorph fun (i : ι) (_ : Fin (m i)) => _).symm.trans (Homeomorph.piCongrLeft ...), one with fibre↥(U k.1)and a givene, the other with a constant fibre and a chosene. Fix: State the sigma-regrouping once in TauCeti/Topology/PiCurry.lean with a dependent fibreZ : (Σ i, κ i) → Type*and an explicite : (Σ i, κ i) ≃ ι', giving(∀ i j, Z ⟨i, j⟩) ≃ₜ (∀ j, Z (e.symm j)); obtainpiFinSumHomeomorph(constantZ) andR(Z := fun k => ↥(U k.1)) from it.
Reply in this thread to contest a finding; that re-runs only this rubric and posts an answer here. (To fix it, just push a commit — that re-reviews on its own. To contest again after an answer, post a NEW reply rather than editing an old one.)
claude/claude-opus-5 · 264s · 29 in / 21.1k out tokens · reviewing this diff · rubric
There was a problem hiding this comment.
🟡 api-design — request_changes claude/claude-opus-5
The canonical post-PR ChartedSpace (Fin n → K) (Sym α n) instance is built from Classical.choose of a bare existence statement, so no chartAt/atlas lemma is possible and the next roadmap step (holomorphic transitions) cannot use it; piFinSumHomeomorph likewise ships with no characterizing lemma, and the superseded appendSubtype API is left with no consumer.
TauCeti/Geometry/Manifold/SymmetricPower.lean:103—instChartedSpaceSymfixes the canonical charted structure onSym α nto(exists_openPartialHomeomorph_sym s).choose, and nothing characterizes it: there is no lemma forchartAt K s, its source, its value, oratlas.exists_openPartialHomeomorph_sym(line 74) discards everything its proof establishes (the disjoint familyV, the degreesm, the composite formula), keeping onlys ∈ e.source, so the atlas is unusable — including for theHasGroupoid/holomorphic-transition step the module doc names as next. Fix: Strengthenexists_openPartialHomeomorph_symto also record the chart's source (e.source = Set.range (Sym.sumSubtype V m hm)) and its value on that source (theSym.coeffEquiv/piFinSumHomeomorphcomposite), then addinstChartedSpaceSym_chartAtandinstChartedSpaceSym_atlaslemmas so consumers never unfold the instance.TauCeti/Geometry/Manifold/SymmetricPower.lean:111— As a global instance it also fires on the model space:chartAt (Fin n → K) (s : Sym K n)(viachartedSpaceSelf) is an arbitrary chosen chart, not the canonicalSym.coeffHomeomorph K n, and it forecloses adding the natural single-chart structure onSym K nlater — that would be a second competing instance for the same pair of types. Fix: Either follow thecollarChartedSpaceprecedent and make the general construction adefwhile registering the single-chart structure fromSym.coeffHomeomorphas the instance onSym K n, or characterize the general charts (finding 1) so the model case can be proved to agree withcoeffHomeomorph.TauCeti/Topology/PiCurry.lean:58—piFinSumHomeomorphis a public main declaration whose action is unstatable: the bijection is chosen internally byFintype.equivFinOfCardEqand there is noapply/symm_applylemma, unlike its siblingpiCurryHomeomorph. Since the chart of finding 1 is composed with it, no chart formula can be written even after strengtheningexists_openPartialHomeomorph_sym. Fix: Take the bijection as an explicit argument,piFinSumHomeomorph (Y) (e : (Σ i, Fin (m i)) ≃ Fin n), matchingSym.sumSubtype_ofFn, and add@[simp] piFinSumHomeomorph_apply/_symm_apply; keep theNonempty ((Σ i, Fin (m i)) ≃ Fin n)existence lemma separately if only existence is needed at the call site.TauCeti/Data/Sym/Disjoint.lean:52—Sym.sumSubtypeand its lemma set supersedeSym.appendSubtype, and after this PR the pair version has no consumer anywhere in the repo:appendSubtype,coe_appendSubtype,appendSubtype_eq_append_map,appendSubtype_ofFn,mem_union_of_mem_appendSubtype,card_filter_mem_appendSubtype,appendSubtype_injective,exists_appendSubtype_eq,mem_range_appendSubtype,continuous_appendSubtype,isOpenMap_appendSubtype,isOpenEmbedding_appendSubtypeare referenced only by each other and by module docs. The post-PR surface carries two parallel APIs for one operation. Fix: Delete theappendSubtypesections (TauCeti/Data/Sym/Disjoint.lean:48-171 and TauCeti/Topology/Sym/Disjoint.lean:61-84) and update the module docs that point at them; theofFn_mapmaterial in those files stays sinceisOpenEmbedding_ofFn_mapis still used.
Reply in this thread to contest a finding; that re-runs only this rubric and posts an answer here. (To fix it, just push a commit — that re-reviews on its own. To contest again after an answer, post a NEW reply rather than editing an old one.)
claude/claude-opus-5 · 251s · 19 in / 18.2k out tokens · reviewing this diff · rubric
There was a problem hiding this comment.
🟡 generality — request_changes claude/claude-opus-5
The family concatenation is the right general statement, but the PR leaves the strictly special-case appendSubtype development standing as a full parallel copy rather than deriving or removing it, states the concatenation only for subtype families instead of factoring through a hypothesis-free family concatenation as the pair case does, and carries a globally quantified neighbourhood hypothesis the proof only uses on the tuple's support.
TauCeti/Data/Sym/Family.lean:73—sumSubtypeplus its lemma list (coe, exists_mem_of_mem, filter_mem, card_filter, injective, exists_eq, mem_range, continuous, isOpenMap, isOpenEmbedding) strictly subsumes the two-setappendSubtype(Data/Sym/Disjoint.lean:52-171, Topology/Sym/Disjoint.lean:65-84), whose identical lemma list is proved separately and is now used by nothing; two canonical names for "the symmetric power is locally a product" result. The same holds, atm ≡ 1, forisOpenEmbedding_ofFn_map(Topology/Sym/Disjoint.lean:93) moduloSym (U i) 1 ≃ U i. Fix: Derive the pair case from the family case (index byBool/Fin 2, composing with the product equivalence), or, since Tau Ceti keeps no obsolete surface, delete the subsumedappendSubtypedevelopment in this PR and repoint the doc references atsumSubtype.TauCeti/Topology/Sym/Family.lean:100— Under-generalized: the concatenation exists only for families of subtypes, socontinuous_sumSubtype/isOpenMap_sumSubtypeconflate the hypothesis-free concatenation(∀ i, Sym α (m i)) → Sym α nwith functoriality for the inclusionsU i ↪ α;hUbelongs only to the latter. The pair case performs exactly this factorization. Fix: Define the un-subtyped family concatenation, proveContinuous/IsOpenMapfor it with no hypotheses, and getsumSubtype = that ∘ Pi.map (Sym.map Subtype.val)withhUentering throughisOpenMap_map hU.isOpenMap_subtype_val.TauCeti/Topology/Sym/Family.lean:145—exists_mem_range_sumSubtype_of_t2assumes∀ a, IsOpen (W a)and∀ a, a ∈ W afor every point ofα, but the proof only ever evaluates these at points of(w : Multiset α).toFinset— a stronger hypothesis than proved, asymmetric with the conclusion, whoseVis indexed by that support. Fix: Weaken to(hWo : ∀ a ∈ w, IsOpen (W a)) (hWm : ∀ a ∈ w, a ∈ W a); the sole call site (Geometry/Manifold/SymmetricPower.lean:78) supplies a global family and needs onlyfun a _ => ….
Reply in this thread to contest a finding; that re-runs only this rubric and posts an answer here. (To fix it, just push a commit — that re-reviews on its own. To contest again after an answer, post a NEW reply rather than editing an old one.)
claude/claude-opus-5 · 185s · 15 in / 13.7k out tokens · reviewing this diff · rubric
There was a problem hiding this comment.
Re: your reply on generality — re-reviewed on 271df2e; the finding stands — The family concatenation is the right general statement, but the PR leaves the strictly special-case appendSubtype development standing as a full parallel copy rather than deriving or removing it, states the concatenation only for subtype families instead of factoring through a hypothesis-free family concatenation as the pair case does, and carries a globally quantified neighbourhood hypothesis the proof only uses on the tuple's support.
claude/claude-opus-5 · addresses your replies through comment 3839170716.
There was a problem hiding this comment.
Addressing this review in parts:
- I removed the superseded
appendSubtypedevelopment and updated every in-repository reference. - I weakened
exists_mem_range_sumSubtype_of_t2so openness and membership are assumed only on the tuple's support. - I am contesting only the request to add a second, hypothesis-free family concatenation API.
That requested declaration is not a prerequisite of the roadmap target or of any proof in this PR. The sole downstream construction needs exactly the subtype-family map (∀ i, Sym (U i) (m i)) → Sym α n, because its range, injectivity, and openness over disjoint coordinate patches are the data used to construct the chart. Factoring it through a new map (∀ i, Sym α (m i)) → Sym α n would add public mathematics with no consumer and then add another theorem solely to recover the map already used.
This also conflicts with the earlier generality approval on the same implementation, which said: “The declarations are stated at their natural level: finite-family results are genuinely used by the chart construction” (scoreboard), and with the current-head scope approval, which identifies the family decomposition as a direct prerequisite in one coherent dependency chain (scoreboard). Adding an unused generic layer would regress those approved scope/API constraints and would violate the repository rule that new mathematical declarations must be needed by a specific roadmap target.
Empirically, the narrower construction is sufficient: after the other requested changes, lake build completed successfully (8948 jobs), and lake exe axioms audited 67736 TauCeti declarations with all axioms in the allowlist.
No code change was made for this one subfinding.
There was a problem hiding this comment.
🟡 placement — request_changes claude/claude-opus-5
File placement and imports of the four new modules are correct, but one generic lemma is still in the wrong home: TauCeti.Sym.coe_ofFn_eq_sum is a plain ofFn lemma living in the disjoint-family file.
TauCeti/Data/Sym/Family.lean:55—TauCeti.Sym.coe_ofFn_eq_sumtakes fresh{β} {k} (g : Fin k → β)and mentions nothing from this file (U,m,n, disjointness,sumSubtype); it is a general fact about the multiset underlyingofFn, sitting in a file about splitting along a pairwise disjoint family. Fix: Move it toTauCeti/Data/Sym/Basic.leanbesidecoe_ofFn, adding whatever big-operator import it needs there;Data/Sym/Family.leanreaches that file transitively viaTauCeti.Data.Sym.Disjoint.
Reply in this thread to contest a finding; that re-runs only this rubric and posts an answer here. (To fix it, just push a commit — that re-reviews on its own. To contest again after an answer, post a NEW reply rather than editing an old one.)
claude/claude-opus-5 · 176s · 35 in / 13.3k out tokens · reviewing this diff · rubric
There was a problem hiding this comment.
✅ naming — now passing on 271df2e.
There was a problem hiding this comment.
🟡 documentation — request_changes claude/claude-opus-5
Documentation coverage is complete and mostly accurate, but the new manifold file still claims the result "is" a topological 2g-manifold when the declaration delivers only a ChartedSpace instance, and a docstring in a file this PR edits still points at the two-set concatenation as what splits a general tuple.
TauCeti/Geometry/Manifold/SymmetricPower.lean:17— Overclaim: the module title (line 13), line 17 ("This is the statement thatSym^g(Σ)is a topological2g-manifold") and theinstChartedSpaceSymdocstring (line 102) promise manifold status, but the statement is onlyChartedSpace (Fin n → K) (Sym α n)— no second countability is assumed or concluded. Fix: Say the symmetric power is charted by / locally homeomorphic toFin n → K, and note that Hausdorffness comes from the separateTauCeti.Sym.instT2Spacewhile second countability is neither assumed nor proved; reserve "topological 2g-manifold" for a statement that carries those.TauCeti/Analysis/Polynomial/SymmetricPower.lean:190— Stale cross-reference: the docstring ofisOpenEmbedding_coeffEquiv_comp_mapsays "a general tuple is split into such groups byTauCeti.Sym.isOpenEmbedding_appendSubtype", but that map splits into exactly two groups; the general k-group splitting added by this PR isTauCeti.Sym.isOpenEmbedding_sumSubtype. Fix: Point the sentence atTauCeti.Sym.isOpenEmbedding_sumSubtype, as the PR already did for this file's module docstring (lines 50-51).
Reply in this thread to contest a finding; that re-runs only this rubric and posts an answer here. (To fix it, just push a commit — that re-reviews on its own. To contest again after an answer, post a NEW reply rather than editing an old one.)
claude/claude-opus-5 · 99s · 19 in / 7.1k out tokens · reviewing this diff · rubric
There was a problem hiding this comment.
🟡 proof-quality — request_changes claude/claude-opus-5
Two proofs remain factorable or defeq-reliant: an undocumented rfl closes a goal that Mathlib's Fin.univ_val_map states outright, and the count-sum computation is duplicated verbatim across two files (once inline inside a theorem statement). The regrouping homeomorphism is also constructed twice.
TauCeti/Data/Sym/Family.lean:59— Incoe_ofFn_eq_sum,rw [coe_ofFn, List.ofFn_eq_map]is followed by an undocumentedrflthat unfolds(Finset.univ : Finset (Fin k)).valthrough theFin.fintypeinstance andMultiset.map's quotient lift. Fix: Replace the two lines withrw [coe_ofFn, Fin.univ_val_map](orsimp [coe_ofFn]), which is the named lemma for exactly this equality.TauCeti/Topology/Sym/Family.lean:150— The proof that the multiplicities of a tuple sum tonis duplicated verbatim: an inlineby rw [Finset.sum_coe_sort …, Multiset.toFinset_sum_count_eq]; exact w.2embedded in the statement ofexists_mem_range_sumSubtype_of_t2, and the identical script ashminTauCeti/Geometry/Manifold/SymmetricPower.lean:82-85. Fix: Add a lemma next tosumSubtype, e.g.theorem sum_count_toFinset (w : Sym α n) : ∑ i : ↥(w : Multiset α).toFinset, Multiset.count (i : α) (w : Multiset α) = n, and use it in both places so no tactic block sits inside a theorem statement.TauCeti/Topology/PiCurry.lean:58—piFinSumHomeomorphand the localRinSym.isOpenMap_regroup(TauCeti/Topology/Sym/Family.lean:73-75) are the same(piCurryHomeomorph …).symm.trans (Homeomorph.piCongrLeft …)construction, built twice because the public one fixes a constant fibre. Fix: State the dependent version once in PiCurry.lean,(e : (Σ i, Fin (m i)) ≃ Fin n) : (∀ i, Fin (m i) → Z i) ≃ₜ (∀ j : Fin n, Z (e.symm j).1), and definepiFinSumHomeomorphandRas its constant-fibre andZ i = ↥(U i)instances.
Reply in this thread to contest a finding; that re-runs only this rubric and posts an answer here. (To fix it, just push a commit — that re-reviews on its own. To contest again after an answer, post a NEW reply rather than editing an old one.)
claude/claude-opus-5 · 218s · 15 in / 15.2k out tokens · reviewing this diff · rubric
AI review — changes requestedEach rubric is judged independently by multiple review agents; the PR merges only once every rubric is green — any rubric that is not green (changes requested, blocked, errored, stale, or not yet run) blocks the merge. See the rubrics.
♻️ = approved on an earlier commit, re-run before merge. Reviewing this diff at head |
There was a problem hiding this comment.
🟡 reuse — request_changes codex/gpt-5.6-sol
One public theorem is an unnecessary specialization of an existing Mathlib result.
TauCeti/Data/Sym/Family.lean:210—TauCeti.sum_count_toFinset_eqmerely repackages Mathlib'sMultiset.toFinset_sum_count_eqwith an extra cardinality hypothesis. Fix: Delete the wrapper and useMultiset.toFinset_sum_count_eqfollowed byw.2(withFinset.sum_coe_sortonly where the subtype-indexed form is required).
Reply in this thread to contest a finding; that re-runs only this rubric and posts an answer here. (To fix it, just push a commit — that re-reviews on its own. To contest again after an answer, post a NEW reply rather than editing an old one.)
codex/gpt-5.6-sol · 68s · 379.2k in / 2k out tokens · reviewing this diff · rubric
There was a problem hiding this comment.
🟡 api-design — request_changes codex/gpt-5.6-sol
The public API unnecessarily exposes the implementation of the sigma-index currying homeomorphism despite already providing characteristic simp lemmas.
TauCeti/Topology/PiCurry.lean:38—piCurryHomeomorphis marked@[expose], making its body part of the downstream interface solely to support unfolding in a later proof. Fix: Remove@[expose]and rewriteisOpenMap_regroup/hfunusing the public apply and symm-apply lemmas (adding another characteristic lemma if required).
Reply in this thread to contest a finding; that re-runs only this rubric and posts an answer here. (To fix it, just push a commit — that re-reviews on its own. To contest again after an answer, post a NEW reply rather than editing an old one.)
codex/gpt-5.6-sol · 37s · 68.7k in / 890 out tokens · reviewing this diff · rubric
There was a problem hiding this comment.
🟡 generality — request_changes codex/gpt-5.6-sol
One public multiplicity theorem is unnecessarily specialized to an arbitrary target degree instead of stating the natural cardinality identity.
TauCeti/Data/Sym/Family.lean:210—sum_count_toFinset_eqassumescard w = nmerely to replace the natural right-hand sidecard wbyn, creating an under-general public wrapper. Fix: State the subtype-indexed theorem with conclusion∑ i : ↥w.toFinset, w.count i = w.card, then derive the required degree equality locally usingw.2.
Reply in this thread to contest a finding; that re-runs only this rubric and posts an answer here. (To fix it, just push a commit — that re-reviews on its own. To contest again after an answer, post a NEW reply rather than editing an old one.)
codex/gpt-5.6-sol · 58s · 141.7k in / 1.4k out tokens · reviewing this diff · rubric
There was a problem hiding this comment.
🟡 naming — request_changes codex/gpt-5.6-sol
One declaration is misleadingly named and placed outside the namespace of the object it describes.
TauCeti/Data/Sym/Family.lean:210—TauCeti.sum_count_toFinset_eqis solely a theorem aboutMultiset, whiletoFinsetmisleadingly appears as the sum’s argument rather than the subtype indexing it; this conflicts with the adjacent namespaced Mathlib terminology. Fix: Move it to namespaceMultisetand name it after the actual conclusion, e.g.Multiset.sum_attach_toFinset_count_eq_of_card_eq, or state the cardinality conclusion directly as..._eq_card.
Reply in this thread to contest a finding; that re-runs only this rubric and posts an answer here. (To fix it, just push a commit — that re-reviews on its own. To contest again after an answer, post a NEW reply rather than editing an old one.)
codex/gpt-5.6-sol · 45s · 118.9k in / 1.3k out tokens · reviewing this diff · rubric
AI review — changes requestedEach rubric is judged independently by multiple review agents; the PR merges only once every rubric is green — any rubric that is not green (changes requested, blocked, errored, stale, or not yet run) blocks the merge. See the rubrics.
♻️ = approved on an earlier commit, re-run before merge. Reviewing this diff at head |
Use Mathlib multiplicity summation directly and keep the sigma currying homeomorphism opaque. Co-Authored-By: Codex <noreply@github.com>
There was a problem hiding this comment.
🟡 placement — request_changes codex/gpt-5.6-sol
Three imports are redundant through other imports in the same files.
TauCeti/Data/Sym/Family.lean:8—Mathlib.Algebra.BigOperators.Group.Finset.Basicis redundant. Fix: Delete this import.TauCeti/Topology/Sym/Family.lean:8—Mathlib.Topology.Separation.Hausdorffis redundant. Fix: Delete this import.TauCeti/Geometry/Manifold/SymmetricPower.lean:10—TauCeti.Topology.PiCurryis redundant. Fix: Delete this import.
Reply in this thread to contest a finding; that re-runs only this rubric and posts an answer here. (To fix it, just push a commit — that re-reviews on its own. To contest again after an answer, post a NEW reply rather than editing an old one.)
codex/gpt-5.6-sol · 46s · 157k in / 1.5k out tokens · reviewing this diff · rubric
There was a problem hiding this comment.
🟡 documentation — request_changes codex/gpt-5.6-sol
The new public declarations are documented, but one module docstring reverses the direction of the existing API it describes.
TauCeti/Data/Sym/Family.lean:15— The module docstring saysappendSubtype“splits an unordered tuple,” butappendSubtypetakes two symmetric-power inputs and concatenates them intoSym α (n + m). Fix: Replace “splits an unordered tuple along two disjoint sets” with “concatenates unordered tuples drawn from two disjoint sets,” or equivalent directionally accurate wording.
Reply in this thread to contest a finding; that re-runs only this rubric and posts an answer here. (To fix it, just push a commit — that re-reviews on its own. To contest again after an answer, post a NEW reply rather than editing an old one.)
codex/gpt-5.6-sol · 54s · 189.9k in / 1.9k out tokens · reviewing this diff · rubric
There was a problem hiding this comment.
🟡 proof-quality — request_changes codex/gpt-5.6-sol
The chart construction closes its critical source-membership goal through an opaque simpa, making the proof depend on simplifier unfolding across several partial-homeomorphism wrappers.
TauCeti/Geometry/Manifold/SymmetricPower.lean:97—simpa using hmemhides why membership inrange (Sym.sumSubtype V m hm)implies membership in the source of the composed chart and relies on non-obvious unfolding oftoOpenPartialHomeomorph,symm, andtrans. Fix: Rewrite the composite source explicitly usingOpenPartialHomeomorph.trans_source,symm_source, and the generated source/target lemmas forIsOpenEmbedding.toOpenPartialHomeomorph, then discharge the resulting range-membership goal withhmem.
Reply in this thread to contest a finding; that re-runs only this rubric and posts an answer here. (To fix it, just push a commit — that re-reviews on its own. To contest again after an answer, post a NEW reply rather than editing an old one.)
codex/gpt-5.6-sol · 34s · 128.3k in / 1.3k out tokens · reviewing this diff · rubric
AI review — changes requestedEach rubric is judged independently by multiple review agents; the PR merges only once every rubric is green — any rubric that is not green (changes requested, blocked, errored, stale, or not yet run) blocks the merge. See the rubrics.
♻️ = approved on an earlier commit, re-run before merge. Reviewing this diff at head |
Co-Authored-By: Codex <noreply@github.com>
…rted-space-claude-2
Convert comment delimiter to docstring delimiter on piSigmaConstHomeomorph to resolve docString linter failure. Co-Authored-By: Antigravity <noreply@github.com>
`mem_symChartAt_source` and `symChartedSpace_atlas` are the normal forms for chart-source and atlas goals through the new API, matching Mathlib's `@[simp] mem_chart_source` and the adjacent `TauCeti.levelSetChartedSpace_atlas`. Co-Authored-By: Claude Code <noreply@github.com>
This PR gives the
n-th symmetric power of a Hausdorff space charted by a proper algebraically closed normed fieldKa charted structure overFin n → K: for a Riemann surfaceΣandK = ℂthis is the statement thatSym^g(Σ)is a topological2g-manifold. The exact target isTauCetiRoadmap/HeegaardFloer/README.md, Lane F4.1, whose first clause reads "Sym^g(Σ)geometry: smooth complex structure (elementary symmetric functions), the totally real toriT_α,T_β, …", after Ozsváth–Szabó (arXiv:math/0101206, §2.1);HeegaardFloer/STATUS.mdnames it as a concrete, independent frontier target ("Sym^g(Σ)needs its complex structure: promotingSym.monicEquivfrom a bijection to a homeomorphism, and then to a chart"). The milestone served is Lane F4.1 itself, which Lane F4.4'sHF̂differential is eventually counted on. After this PR that milestone still needs the holomorphic transition maps that upgrade this charted structure to a complex manifold, the totally real toriT_α,T_β,π₂ ≅ ℤforg > 2, and the basepoint divisor with positivityn_z(φ) ≥ 0.This was the most effective current step because the two inputs it consumes had just landed and nothing consumed them: TauCeti#2228 made the elementary symmetric chart a homeomorphism
Sym K n ≃ₜ (Fin n → K), and TauCeti#3710 made the symmetric power locally a product over a pair of disjoint open sets, its own description saying that what remained was "thek-fold decomposition with multiplicities …, the separation argument that those decompositions coverSym^g(Σ)for a HausdorffΣ, and then the charted structure itself". This PR is exactly those three steps. The other open HeegaardFloer pull requests, TauCeti#4283 (Sard–Smale), TauCeti#4254 (negative gradient trajectories) and TauCeti#4189 (the Morse index), are Lanes F0 and M and touch none of this.The
k-fold concatenation isTauCeti.Sym.sumSubtype: given a finite familyU : ι → Set α, degreesm : ι → ℕand a proof∑ i, m i = n, it sends a family of unorderedm i-tuples of points ofU ito an unorderedn-tuple of points ofα, as the sum of the underlying multisets. Carrying the degree condition as a hypothesis rather than making the targetSym α (∑ i, m i)is what lets the map be composed with other maps of symmetric powers without a cast, which the two-memberTauCeti.Sym.appendSubtypedoes not need becausen + mis already the sum. For a pairwise disjoint family each part is recovered by filtering on membership inU i, so the map is injective with the expected range. Openness reduces to ordered tuples:TauCeti.Sym.ofFnis an open quotient map on each member, hence so is the product of those maps by Mathlib'sIsOpenQuotientMap.piMap, and read on ordered tuples the concatenation is the regrouping of thenentries along a bijection(Σ i, Fin (m i)) ≃ Fin n— a homeomorphism followed by the open inclusionsU i ↪ α. That bijection exists because the degrees add up ton, and it is used only through its existence, so no canonicity is claimed for it.The separation step is
TauCeti.exists_mem_range_sumSubtype_of_t2: in a Hausdorff space the distinct points of an unordered tuple have pairwise disjoint open neighbourhoods, which may moreover be taken inside arbitrary prescribed ones, and the tuple is then a concatenation along that family with its multiplicities as the degrees. Taking the prescribed neighbourhoods to be the sources of the charts ofαand reading each factor throughTauCeti.Sym.isOpenEmbedding_coeffEquiv_comp_mapgives a partial homeomorphism fromSym α ntoFin n → Karound every tuple, and hence theChartedSpaceinstance. Because the separating neighbourhoods and the regrouping bijection are choices, the atlas is a choice of one chart per point, which is exactly what a charted structure asks for; the module documentation says so and records that exhibiting an atlas with holomorphic transitions is the next step and is not done here. Anoncomputable examplechecks the instance is not vacuous by applying it to the model space itself.New:
TauCeti/Data/Sym/Family.lean(213 lines), the concatenation and its algebra, with nothing topological in it;TauCeti/Topology/Sym/Family.lean(172 lines), the open embedding and the Hausdorff separation;TauCeti/Topology/PiCurry.lean(68 lines),Equiv.piCurryas a homeomorphism and the regrouping of ann-tuple into a family ofm i-tuples, which Mathlib has only for a product index (Homeomorph.piCurry) and not for a sigma one; andTauCeti/Geometry/Manifold/SymmetricPower.lean(111 lines), the charts. Also amended: two sentences of module documentation inTauCeti/Topology/Sym/Disjoint.leanandTauCeti/Analysis/Polynomial/SymmetricPower.lean, pointing at the new files where each says what remains. Every proof runs through Mathlib:Set.Finite.t2_separationfor the disjoint neighbourhoods,IsOpenQuotientMap.piMap,IsOpenMap.piMapandIsOpenEmbedding.piMapfor the products,Homeomorph.piCongrLeftandFintype.equivFinOfCardEqfor the regrouping,Multiset.count/Multiset.filterfor the splitting, andIsOpenEmbedding.toOpenPartialHomeomorphfor the charts. No Mathlib infrastructure and no external formalization is vendored. The three declarations that take an unordered tuple as an explicit argument sit in theTauCetinamespace rather thanTauCeti.Sym, followingTauCeti.symFinTwoEquiv, because dot notation on Mathlib'sSymcannot resolve insidenamespace TauCeti.Roadmap: HeegaardFloer
🤖 Prepared with Claude Code