// Simple numbering for non-book documents #let equation-numbering = "(1)" #let callout-numbering = "1" #let subfloat-numbering(n-super, subfloat-idx) = { numbering("1a", n-super, subfloat-idx) } // Theorem configuration for theorion // Simple numbering for non-book documents (no heading inheritance) #let theorem-inherited-levels = 0 // Theorem numbering format (can be overridden by extensions for appendix support) // This function returns the numbering pattern to use #let theorem-numbering(loc) = "1.1" // Default theorem render function #let theorem-render(prefix: none, title: "", full-title: auto, body) = { if full-title != "" and full-title != auto and full-title != none { strong[#full-title.] h(0.5em) } body } // Some definitions presupposed by pandoc's typst output. #let content-to-string(content) = { if content.has("text") { content.text } else if content.has("children") { content.children.map(content-to-string).join("") } else if content.has("body") { content-to-string(content.body) } else if content == [ ] { " " } } #let horizontalrule = line(start: (25%,0%), end: (75%,0%)) #let endnote(num, contents) = [ #stack(dir: ltr, spacing: 3pt, super[#num], contents) ] #show terms.item: it => block(breakable: false)[ #text(weight: "bold")[#it.term] #block(inset: (left: 1.5em, top: -0.4em))[#it.description] ] // Some quarto-specific definitions. #show raw.where(block: true): set block( fill: luma(230), width: 100%, inset: 8pt, radius: 2pt ) #let block_with_new_content(old_block, new_content) = { let fields = old_block.fields() let _ = fields.remove("body") if fields.at("below", default: none) != none { // TODO: this is a hack because below is a "synthesized element" // according to the experts in the typst discord... fields.below = fields.below.abs } block.with(..fields)(new_content) } #let empty(v) = { if type(v) == str { // two dollar signs here because we're technically inside // a Pandoc template :grimace: v.matches(regex("^\\s*$")).at(0, default: none) != none } else if type(v) == content { if v.at("text", default: none) != none { return empty(v.text) } for child in v.at("children", default: ()) { if not empty(child) { return false } } return true } } // Subfloats // This is a technique that we adapted from https://github.com/tingerrr/subpar/ #let quartosubfloatcounter = counter("quartosubfloatcounter") #let quarto_super( kind: str, caption: none, label: none, supplement: str, position: none, subcapnumbering: "(a)", body, ) = { context { let figcounter = counter(figure.where(kind: kind)) let n-super = figcounter.get().first() + 1 set figure.caption(position: position) [#figure( kind: kind, supplement: supplement, caption: caption, { show figure.where(kind: kind): set figure(numbering: _ => { let subfloat-idx = quartosubfloatcounter.get().first() + 1 subfloat-numbering(n-super, subfloat-idx) }) show figure.where(kind: kind): set figure.caption(position: position) show figure: it => { let num = numbering(subcapnumbering, n-super, quartosubfloatcounter.get().first() + 1) show figure.caption: it => block({ num.slice(2) // I don't understand why the numbering contains output that it really shouldn't, but this fixes it shrug? [ ] it.body }) quartosubfloatcounter.step() it counter(figure.where(kind: it.kind)).update(n => n - 1) } quartosubfloatcounter.update(0) body } )#label] } } // callout rendering // this is a figure show rule because callouts are crossreferenceable #show figure: it => { if type(it.kind) != str { return it } let kind_match = it.kind.matches(regex("^quarto-callout-(.*)")).at(0, default: none) if kind_match == none { return it } let kind = kind_match.captures.at(0, default: "other") kind = upper(kind.first()) + kind.slice(1) // now we pull apart the callout and reassemble it with the crossref name and counter // when we cleanup pandoc's emitted code to avoid spaces this will have to change let old_callout = it.body.children.at(1).body.children.at(1) let old_title_block = old_callout.body.children.at(0) let children = old_title_block.body.body.children let old_title = if children.len() == 1 { children.at(0) // no icon: title at index 0 } else { children.at(1) // with icon: title at index 1 } // TODO use custom separator if available // Use the figure's counter display which handles chapter-based numbering // (when numbering is a function that includes the heading counter) let callout_num = it.counter.display(it.numbering) let new_title = if empty(old_title) { [#kind #callout_num] } else { [#kind #callout_num: #old_title] } let new_title_block = block_with_new_content( old_title_block, block_with_new_content( old_title_block.body, if children.len() == 1 { new_title // no icon: just the title } else { children.at(0) + new_title // with icon: preserve icon block + new title })) align(left, block_with_new_content(old_callout, block(below: 0pt, new_title_block) + old_callout.body.children.at(1))) } // 2023-10-09: #fa-icon("fa-info") is not working, so we'll eval "#fa-info()" instead #let callout(body: [], title: "Callout", background_color: rgb("#dddddd"), icon: none, icon_color: black, body_background_color: white) = { block( breakable: false, fill: background_color, stroke: (paint: icon_color, thickness: 0.5pt, cap: "round"), width: 100%, radius: 2pt, block( inset: 1pt, width: 100%, below: 0pt, block( fill: background_color, width: 100%, inset: 8pt)[#if icon != none [#text(icon_color, weight: 900)[#icon] ]#title]) + if(body != []){ block( inset: 1pt, width: 100%, block(fill: body_background_color, width: 100%, inset: 8pt, body)) } ) } // arxivai — Quarto Typst template partial. // Replaces Quarto's default `article()` with the arxivai preprint layout. // Both packages are importable from raw ```{=typst}``` blocks in the body: // #arxivai.operation-box(...) #arxivai.app-figure(...) #lettreai.badge(...) #import "lettreai.typ" as lettreai #import "arxivai.typ" as arxivai // --------------------------------------------------------------------------- // Re-theme Quarto's automatic callouts (same contract as lettreai: block // nesting kept structurally identical to Quarto's default so the crossref // figure show rule in definitions.typ keeps working). // --------------------------------------------------------------------------- #let callout( body: [], title: "Callout", background_color: rgb("#dddddd"), icon: none, icon_color: black, body_background_color: white, ) = { let accent = if icon_color == black { lettreai.colors.oxford-blue } else { icon_color } block( breakable: false, fill: lettreai.tint(accent, 0.94), stroke: (left: 3pt + accent, rest: 0.5pt + lettreai.tint(accent, 0.5)), width: 100%, radius: 3pt, block( inset: 1pt, width: 100%, below: 0pt, block( fill: lettreai.tint(accent, 0.84), width: 100%, inset: 8pt, )[#if icon != none [#text(accent, weight: 900)[#icon] ]#text(fill: lettreai.shade(accent, 0.25), weight: 700)[#title]]) + if (body != []) { block( inset: 1pt, width: 100%, block(fill: body_background_color, width: 100%, inset: 8pt, body)) } ) } // --------------------------------------------------------------------------- // arXiv preprint article — same signature contract as Quarto's default, // extended with keywords and running-title. // --------------------------------------------------------------------------- #let article( title: none, subtitle: none, authors: none, keywords: (), running-title: none, book: false, date: none, abstract-title: none, abstract: none, thanks: none, cols: 1, lang: "en", region: "US", font: none, fontsize: 10.5pt, title-size: 1.7em, subtitle-size: 1.15em, heading-family: none, heading-weight: "bold", heading-style: "normal", heading-color: black, heading-line-height: 0.65em, mathfont: none, codefont: none, linestretch: 1, sectionnumbering: none, linkcolor: none, citecolor: none, filecolor: none, toc: false, toc_title: none, toc_depth: none, toc_indent: 1.5em, doc, ) = { // PDF metadata. set document(title: title) set document( author: authors.map(a => lettreai.to-string(a.name)).join(", ", last: " & "), ) if authors != none and authors != () set document( keywords: keywords.map(k => lettreai.to-string(k)), ) if keywords != none and keywords != () set par(justify: true, leading: linestretch * 0.65em) set text(lang: lang, region: region, size: fontsize) show math.equation: set text(font: mathfont) if mathfont != none set heading(numbering: sectionnumbering) // Running header + footer; book mode gets chapter-aware heads and the // O'Reilly outer-margin geometry. let rt = if running-title != none { running-title } else if title != none { title } else { [] } set page( header: if book { arxivai.book-header() } else { arxivai.arxiv-header(rt) }, footer: if book { arxivai.book-footer() } else { arxivai.arxiv-footer() }, ) set page(margin: arxivai.book-margin) if book // Resolve fonts: explicit Quarto fonts win, else theme defaults. let resolved-font = if font != none { font } else { lettreai.body-font } let resolved-code = if codefont != none { codefont } else { lettreai.mono-font } let resolved-heading-color = if heading-color != black { heading-color } else { lettreai.colors.oxford-blue } let resolved-link = if linkcolor != none { rgb(lettreai.to-string(linkcolor)) } else { lettreai.colors.oxford-blue } // Paint everything with the shared theme, then the figure rules. show: lettreai.theme-rules.with( fonts: resolved-font, code-font: resolved-code, heading-color: resolved-heading-color, link-color: resolved-link, ) show: arxivai.arxiv-figure-rules // Book chapter rule is the innermost show, so it transforms level-1 // headings FIRST (inner rules apply first), replacing them with chapter // openers before the theme's h1 rule could wrap them in a container. // Synthetic non-outlined headings (e.g. the outline's own title) are // excluded inside book-heading-rules. show: doc2 => if book { arxivai.book-heading-rules(doc2) } else { doc2 } show ref: set text(fill: rgb(lettreai.to-string(citecolor))) if citecolor != none // Preprint front matter. arxivai.arxiv-title-block( title: title, subtitle: subtitle, authors: authors, date: date, ) if abstract != none { arxivai.arxiv-abstract( abstract, abstract-title: if abstract-title == none { [Abstract] } else { abstract-title }, ) } arxivai.arxiv-keywords(keywords) // Book mode: the front matter is a title page of its own. if book { pagebreak(weak: true) } // Optional table of contents (its own page in book mode). if toc { block(above: 0.5em, below: 2em, lettreai.lettreai-outline( title: if toc_title == none { auto } else { toc_title }, depth: toc_depth, indent: toc_indent, )) if book { pagebreak(weak: true) } } if cols > 1 { columns(cols, doc) } else { doc } } #import "@preview/fontawesome:0.5.0": * #let brand-color = (:) #let brand-color-background = (:) #let brand-logo = (:) #set page( paper: "a4", margin: (x: 2.4cm,y: 2.6cm,), numbering: "1", columns: 1, ) #show: doc => article( title: [Reconstructing Ancient Conic Sundials from 3D Scans], subtitle: [A Research Programme in Construction Geometry, Measurement, and Literate Coding], authors: ( ( name: [Gerd Graßhoff], affiliation: [Humboldt-Universität zu Berlin, Deutsches Museum], email: [gerd.grasshoff\@hu-berlin.de], orcid: [0000-0002-4450-357X] ), ), keywords: ([conic sundial],[3D reconstruction],[literate coding],[Berlin Sundial Project],[construction proportions],[computational archaeology],[AI research agents],), running-title: [Sundial Reconstruction Programme], abstract: [The Berlin Sundial Project preserves photogrammetric 3D surface models of ancient Greek and Roman conic sundials. The overarching research task is to recover, from these high-resolution meshes, the original construction proportions in which the instruments were designed: the geographical #emph[klima], the cone opening, and the scale factor. This paper establishes the epistemological and computational architecture of that programme. It defines the four interdependent layers of the workflow --- theoretical geometry, automated feature perception, measurement consensus on physical stones, and literate coding as an executable specification for AI agents. We provide a systematic review of the drafts developed on the research volume through June 2026, recording what each established, identifying contradictions in earlier models, and documenting the governing corrections: that seasonal meridian marks determine the cone independently of latitude, that engraved hour lines on real stones are circular arcs rather than mathematical generators, and that chisel groove notches lie within the scan noise floor. ], abstract-title: "Abstract", font: ("Source Sans 3",), sectionnumbering: "1.1", toc: true, toc_title: [Table of contents], toc_depth: 3, doc, ) #block[ #callout( body: [ Supplement S1 to the Ancient Sundials repository (Berlin Sundial Collaboration, ancient-sundials.lettre.ai). This draft documents the programme behind the repository's measurement panel and astronomical picture. It is a preprint draft and has not been peer reviewed. Where a figure in the repository differs from a figure here, the repository, which is rebuilt from the current database, is authoritative. Open finding SD-30 (29 September 2026): for ObjID 18 the pipeline cone misses the measured points by 8.9 mm, where verified cones fit within 0.39 to 0.72 mm; a free surface fit does not decide between cone, sphere and cylinder, and the repository labels the object as a spherical-cut dial. Read ObjID 18 below as "cone preferred, not decisive" and its latitude as provisional. Open finding SD-29: the measurement pipeline assumes a cone. The surface fit finds 80 cones, 28 spheres and 5 cylinders among the 113 detected objects, so cone-specific quantities hold only for objects classified as cones. ] , title: [ Supplement S1 ] , background_color: rgb("#dae6fb") , icon_color: rgb("#0758E5") , icon: fa-info() , body_background_color: white ) ] = The Core Problem: Reconstruction versus Surface Fitting Ancient Greek and Roman conic sundials represent sophisticated instruments of mathematical astronomy carved into marble or limestone blocks @gibbs1976@schaldach2006. When archaeologists recover these objects, they are typically weathered fragments: vertices are chipped, mounting bases are broken, and the original gnomon rod has disappeared. High-resolution 3D surface photogrammetry (NXS and GLB point clouds with sub-millimetre sampling) captures the physical morphology of these fragments in exquisite detail @bsdp2014dialface18. However, raw 3D data do not explain themselves. #arxivai.concept-box(title: [The reconstruction standard])[ A computational reconstruction of an ancient sundial is not a surface fit to a point cloud. It is the deductive recovery of the intended construction proportions in the maker's own design vocabulary — the klima ratio $s : g$, the opening $rho = tan alpha$, and the scale $d$ — grounded in an explicit error model that attributes discrepancies to ancient artisan error rather than blurring them into an unweighted average. ] Naive geometric regression --- such as fitting an unconstrained cone or sphere to all surface points --- collapses when applied to damaged fragments. A blind least-squares fit on short arcs produces unstable cone axes, misclassifies dial types, and leaves the intended geographical latitude undetermined. To recover the maker's design, computational algorithms must be constrained by the domain theory of ancient gnomonics. = The Four-Layer Architecture of the Programme The reconstruction programme is organized into four hierarchical knowledge layers. Each layer answers a distinct research question, consumes inputs from the layer below, and produces verified outputs for the layer above. #arxivai.method-box(title: [The four-layer hierarchy])[ 1. Theory: What is the ideal geometric instrument, and what can be recovered? 2. Perception: How do we extract physical chisel grooves from noisy 3D meshes? 3. Measurement: How do we derive defended construction proportions from real stones? 4. Method: How do we orchestrate autonomous AI agents to execute the analysis reproducibly? ] == Layer 1: Theoretical Construction Geometry The theoretical foundation is established in the keystone geometry paper @grasshoff2026conic. It proves that on a conic dial whose nodus lies on the polar axis: - Every seasonal shadow path is an exact circle orthogonal to the cone axis. - The equinoctial circle invariant $ell_E = d$ anchors the physical scale. - The solstitial noon marks obey the workshop rule $x = tan alpha tan epsilon$, generating the triplet $ell_W : ell_E : ell_S =\(1 + x\)^(- 1): 1 :\(1 - x\)^(- 1)$. - The apex-free marking ratio $Q =\(L_S - L_W\)\/\(L_S - L_E\)$ recovers $alpha$, $A$, and $d$ in closed form independently of latitude $phi$. == Layer 2: Automated Feature Perception The perception layer extracts physical features from dense 3D meshes without human operator bias. It operates across three distinct levels: + #strong[The Physical Groove:] A chisel cut of width $2$--$3 thin upright(m m)$ and depth $1$--$4 thin upright(m m)$. + #strong[The Feature Point:] The medial centreline coordinate extracted along cross-sectional slices of the selection band. + #strong[The Geometric Primitive:] 3D circular arcs and lines fitted to extracted centrelines. == Layer 3: Measurement and Consensus Estimation The measurement layer applies the theoretical framework to individual physical artifacts, exemplified by Dialface ObjID 18 (British Museum inv. 2547) @grasshoff2026measurement@bsdp2014dialface18 and ObjID 126 (Delos) @grasshoff2026objid126. Rather than seeking a single global fit, this layer evaluates multiple independent #strong[construction witnesses]: - #strong[Witness 1 (Front Plane):] The dressed upper front face cut perpendicular to the cone axis, yielding $phi$ relative to the base. - #strong[Witness 2 (Cone Axis):] The spatial tilt of the fitted cone axis against the seating plane. - #strong[Witness 3 (Solstitial Hour Division):] The half-day arc $H$ of the solstitial day-lines, calibrated by the equinoctial standard $H_E = 90^compose$. A hierarchical model separates photogrammetric measurement noise from the artisan's stonecutting realization spread $tau$. When a witness deviates significantly (e.g.~$> 4 sigma$), a leave-one-out rule identifies it as an isolated ancient construction error rather than corrupting the consensus. == Layer 4: Literate Coding and Agentic Orchestration The methodological layer governs how computational research is conducted. Using literate programming extended to AI agents, a single Quarto document functions as the #emph[executable specification] against which AI agents plan, execute, and refine code in a closed feedback loop. = Review of Drafts on the Research Volume The working drafts of the programme reside on the project volume `2025Berlin` under `ai-sundial3d/arxiv/`. An editorial audit reveals substantial progress alongside critical theoretical corrections that have shaped the final bundle. == The Geometry Draft and the Latitude Uncoupling The initial draft of #emph[Construction Geometry of the Conic Sundial with Horizontal Gnomon] (12 June 2026) established the forward shadow equations and the $Q$-formula. However, it contained an internal contradiction: - Section 6 asserted the equinox invariant $ell_E\/d = 1$. - Section 7 tabulated $ell_E\/d = cos phi$, mixing the conic dial's axial coordinate with the vertical gnomon's horizontal shadow. - A proposition claimed that the solstice ratio $ell_S\/ell_W$ served as a monotone latitude diagnostic. The revised geometry paper @grasshoff2026conic eliminates this equivocation. The noon-mark triplet on a conic dial is strictly independent of latitude $phi$. Rotational symmetry about the polar axis ensures that the relative axial positions of the three noon marks depend solely on $alpha$ and $epsilon$. Latitude $phi$ enters the stone only through the hour division of the solstitial day-lines and the orientation of the dressed block faces. == The Measurement Draft for ObjID 18 (BM 2547) #emph[Geometrical Measurement of an Ancient Conic Sundial from a 3D Surface Model] (11 June 2026) provides the empirical demonstration on the British Museum marble fragment @grasshoff2026measurement: - #strong[Consensus Latitude:] $phi = 41.45^compose$ ($68 %$ CI $\[41.16^compose\,41.75^compose\]$), corresponding to $s = 53\;02$ for $g = 60$, matching Ptolemy's Hellespont and Rome klimata. - #strong[Noon Triplet:] $ell_W : ell_E : ell_S = 12 : 15 : 20$ (within $0.6 sigma$), confirming the Hellenistic workshop ratio $x = 1\/4$. - #strong[Error Diagnosis:] The summer solstice hour division deviates by $14 sigma$, definitively identified as an isolated ancient carving error, corroborated by a $4.9 %$ compression of the equinoctial hour division. - #strong[Hour Lines as Circular Arcs:] The eleven engraved hour lines are circular arcs with radii between $113 thin upright(m m)$ and $280 thin upright(m m)$ (fit RMS $0.20$--$0.71 thin upright(m m)$), whereas straight generator models leave large systematic residuals of $2.2$--$7.6 thin upright(m m)$ RMS. == The Delos Draft for ObjID 126 #emph[The Cone Geometry of ObjID 126 (Delos)] (12 June 2026) analyses an exceptionally well-preserved dial from the Delos Archaeological Museum @grasshoff2026objid126: - #strong[Direct Cone Surface Fit:] Direct orthogonal-distance regression on 3,345 points yields half-angle $alpha = 34.3^compose$ (RMS $0.39 thin upright(m m)$). - #strong[Equinoctial Calibration:] The engraved equinoctial arc $H_E = 94.74^compose plus.minus 0.31^compose$ exceeds the theoretical $90^compose$ by $+ 5.27 %$, providing the engraver's unit scale factor to correct the solstitial arcs. - #strong[$epsilon$-Free Inversion:] Pairing each solstitial circle's placement with its own division confirms the Delos klima independently of epoch obliquity. == Feature Detection: Evolution from Depth to Medial Filtering #emph[Automated Feature Detection on Ancient Conic Sundial Fragments] (30 March 2026, amended 11 June 2026) introduced cross-sectional profile analysis @grasshoff2026detection: - #strong[The Depth Estimator Failure:] Early implementations sought the feature point as the minimum depth ($upright(a r g m i n)_z$) of each cross-section. Empirical noise analysis demonstrated that surface weathering and scan noise ($plus.minus 0.3 thin upright(m m)$) exceed the depth of the groove notch, causing depth minimizers to jump erratically to the boundary of the selection window. - #strong[Medial Line Estimation:] The robust feature point is the medial centreline of the selection band, which provides an unbiased estimator of the groove axis. == Model Optimization: Multi-Stage Nonlinear Estimation #emph[Automated Model Optimization for Sundial Feature Detectors] establishes the nonlinear parameter estimation framework following Bard @bard1974: - Compares Trust Region Reflective (TRF), Nelder-Mead simplex, and L-BFGS-B joint optimization over the 7 fundamental cone parameters. - Solves the partial-arc bias problem on fragmented day-lines by enforcing coaxiality with the robust direct surface cone fit. == Literate Coding Methodology The methodology drafts (April and June 2026) formalize the three levels of operation in AI-assisted scientific discovery @grasshoff2026literate: - Demonstrates how an AI agent operating with IDE tools (sub-agents, skills, MCP servers) uses the research paper as a living specification to prevent hallucinations and ensure mathematical consistency. = Literate Coding: Executable Specifications for AI Agents When computational tasks are delegated to AI coding agents, standard prompt-based workflows fail because the domain theory is separated from the code. The agent may generate mathematically plausible Python code that fits a geometric primitive while violating the physical principles of ancient gnomonics. #arxivai.concept-box(title: [Principle of Complexity Reduction])[ Before delegating an analytical task to an AI agent, construct a single literate document that embeds the complete mathematical derivations, data formats, quantitative success criteria, and runnable code blocks. The document is the agent's complete and bounded world. ] The methodology distinguishes three operational levels: + #strong[Level 1 (Reference Background under Permanent Revision):] The Quarto paper contains the authoritative domain theory. When higher-level execution uncovers an anomaly (e.g.~that straight lines fail to fit hour lines), the domain theory is revised, updating the agent's reference substrate. + #strong[Level 2 (Structured Planning Substrate):] The AI agent reads the literate specification to formulate an execution plan. Every computational step must cite a specific equation or constraint ID from the document. + #strong[Level 3 (Autonomous Agentic Action & Validation):] The agent executes the code, checks results against quantitative thresholds, and logs iterations. #arxivai.operation-box( title: [Autonomous Sundial Feature Inversion], question: [Recover cone parameters $(alpha, d, phi)$ from 3D point cloud of ObjID 18], steps: ( (agent: "mesh-ingest", does: [Loads PLY point cloud BSDP0300 and verifies mm coordinate frame]), (agent: "groove-extractor", does: [Computes cross-section slices and extracts medial centrelines across 14 feature bands]), (agent: "surface-cone-fitter", does: [Fits unlabelled right circular cone by orthogonal distance regression, yielding $alpha = 34.4 degree$]), (agent: "apex-free-inverter", does: [Extracts noon marks $P_S, P_E, P_W$, computes marking ratio $Q = 1.395$, and inverts apex $A$ and scale $d$]), (agent: "witness-consensus", does: [Combines front plane, cone axis, and winter hour division into consensus $phi = 41.45 degree$, flagging summer division at $14 sigma$]), ), latency: "1.8 s", answer: [$alpha = 34.40 degree plus.minus 0.09 degree$, $d = 101.3 plus.minus 0.4 " mm"$, $phi = 41.45 degree plus.minus 0.30 degree$ ($s = 53;02$), workshop rule $x = 1:4$ ($12:15:20$)], ) = Lessons Learned and Epistemic Standards The systematic review of the sundial bundle establishes five core methodological rules that govern all subsequent papers in the series: + #strong[Latitude is Uncoupled from Noon Marks:] No pipeline may attempt to invert meridian marks alone for latitude $phi$. + #strong[Hour Lines are Empirically Tested as Arcs:] Feature detectors must evaluate both straight line and circular arc model classes. + #strong[Medial Filtering Replaces Depth Minima:] Groove extraction on weathered stone relies on medial windowing rather than $upright(a r g m i n)_z$. + #strong[Discordant Features are Attributed as Historical Errors:] Significant outliers are isolated via leave-one-out testing and cataloged as ancient craftsmanship errors rather than blurred by global smoothing. + #strong[No Unverified Corpus Claims:] Every quantitative claim must cite a specific museum accession number (e.g.~British Museum inv. 2547) and a reproducible pipeline script. = The Sundial Publication Bundle #ref(, supplement: [Table]) summarizes the complete publication bundle comprising the ai-sundial3d reconstruction programme. #figure([ #table( columns: (23.53%, 23.53%, 23.53%, 29.41%), align: (left,left,left,center,), table.header([Paper ID], [Title], [Core Contribution], [Status],), table.hline(), [#strong[P1]], [#emph[Construction Geometry of the Conic Sundial] @grasshoff2026conic], [Forward projection, $Q$-formula, noon triplet, marking sufficiency], [#strong[Complete]], [#strong[P2]], [#emph[Automated Feature Detection on Sundial Fragments] @grasshoff2026detection], [3-level groove model, cross-section slicing, medial line extraction], [#strong[Complete]], [#strong[P3]], [#emph[Automated Model Optimization for Feature Detectors] @grasshoff2026optimization], [Nonlinear parameter estimation, Bard framework, TRF/L-BFGS-B], [#strong[Complete]], [#strong[P4]], [#emph[Literate Coding with AI Agents] @grasshoff2026literate], [3-level executable specification, agent orchestration loop], [#strong[Complete]], [#strong[P5]], [#emph[Geometrical Measurement of ObjID 18] @grasshoff2026measurement], [Full empirical deduction on BM inv. 2547, witness consensus], [#strong[Draft]], [#strong[P6]], [#emph[The Cone Geometry of ObjID 126 (Delos)] @grasshoff2026objid126], [Direct surface cone fit, $H_E$ calibration, $epsilon$-free latitude], [#strong[Draft]], ) ], caption: figure.caption( position: top, [ The comprehensive publication bundle for the ancient conic sundial reconstruction programme. ]), kind: "quarto-float-tbl", supplement: "Table", ) = Conclusion The recovery of ancient conic sundials from 3D scan data demonstrates how rigorous domain theory, robust feature perception, and literate agentic workflows combine into a cohesive scientific programme. By replacing naive mesh regression with the exact proportional geometry of Hellenistic astronomy, fragmentary stone artifacts can be reconstructed with mathematical certainty, shedding new light on the metrological practices of the ancient world. #heading(level: 1, numbering: none)[References] #bibliography(("references.bib"))