// 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: [Geometrical Measurement of an Ancient Conic Sundial from a 3D Surface Model], subtitle: [Construction Witnesses, Consensus Estimation, and the Proportions of Dialface ObjID 18 (British Museum inv. 2547)], 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 photogrammetry],[ObjID 18],[British Museum inv. 2547],[construction witnesses],[consensus estimation],[Ptolemy shadow table],[Hellenistic horology],), running-title: [Sundial Measurement ObjID 18], abstract: [We measure the engraved line network and the dressed faces of the conic sundial fragment Dialface ObjID 18 (British Museum, inv. 2547) from a photogrammetric 3D surface model, and deduce the construction values of the instrument in their historically meaningful form: as proportions of the ancient shadow-table (klima) tradition. The analysis is organized around the #emph[construction dependency] of the dial: each measurable feature realizes one construction parameter, and the latitude proportion $s : g$ enters the artifact along three separate construction paths --- the dressing of the upper front plane, the elevation of the cone axis, and the hour division of the solstitial day-lines, the latter calibrated by the equinoctial design invariant $H_E = 90^compose$ and made obliquity-free by pairing each circle's placement with its own division. These paths furnish independent #emph[witnesses] of $s : g$, combined by a joint measurement-level bootstrap (full witness covariance) and a hierarchical model whose profile-likelihood interval separates measurement noise from the artisan's stonecutting spread; discordant witnesses are excluded only by a declared leave-one-out rule ($> 4 sigma$) and reported as construction-error candidates. For ObjID 18 the result is $phi = 41.45^compose$, $68 %$ CI $\[41.16^compose\,41.75^compose\]$ ($s = 53\;02$ for $g = 60$\; the ratios $8 : 9$ and $9 : 10$ are admissible, and the klima entries Hellespont and Rome of Ptolemy's shadow table lie in range), while the hour division of the summer day-line deviates at $14 sigma$ --- a localized ancient construction error. The axial distances of the three day-lines stand in the proportion $ell_W : ell_E : ell_S = 12 : 15 : 20$ (within $0.6 sigma$), equivalent to the workshop rule $tan alpha tan epsilon = 1 : 4$. The engraved hour lines are circular arcs (radii $113$--$280 thin upright(m m)$), not straight generators. ], 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 S5 to the Ancient Sundials repository (Berlin Sundial Collaboration, ancient-sundials.lettre.ai). This draft documents a worked example for the object page of ObjID 18. 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. ] , title: [ Supplement S5 ] , background_color: rgb("#dae6fb") , icon_color: rgb("#0758E5") , icon: fa-info() , body_background_color: white ) ] = Goal and Methodological Approach The construction geometry of conic sundials with a nodus on the polar axis is developed analytically in the companion keystone paper @grasshoff2026conic: the dialface is the concave inner surface of a right circular cone whose axis is aligned with the celestial rotation axis; the shadow of the nodus traces, for each fixed solar declination, an exact circle on the cone perpendicular to the axis (a #emph[day-line]); and hour lines connect shadow positions of equal seasonal hour across the year. The companion paper establishes that ancient dialmakers designed such instruments #emph[proportionally]: - The latitude enters as the klima shadow ratio $sigma_E = s_(upright(e q))\/g = tan phi$ (equinoctial noon shadow per vertical gnomon of $g = 60$ parts). - The cone opening enters as the ratio $rho = R_(upright(r i m))\/H = tan alpha$. - The seasonal noon marks enter as ratios of their axial distances $ell$ from the apex, anchored by the equinox invariant $ell_E = d$. This paper performs the inverse, empirical deduction for one specific artifact: Dialface ObjID 18 (British Museum inv. 2547; published photogrammetric model BSDP0300) @bsdp2014dialface18. #arxivai.concept-box(title: [The three principles of empirical deduction])[ 1. Construction Witnesses: Every measurable feature that realizes a design input is treated as an independent witness. 2. Invariant Calibration: Design invariants (such as $H_E = 90 degree$) calibrate the artisan's engraved angular unit. 3. Consensus and Error Attribution: Witnesses are combined by joint maximum likelihood; significant outliers are isolated as localized historical errors rather than blurred by global averaging. ] The artifact, a marble conic dial fragment held by the British Museum (inv. 2547), preserves eleven hour lines, three day-lines --- equinoctial (#emph[Equi]), summer solstitial (#emph[SuSo]), and winter solstitial (#emph[WiSo]) --- and several dressed faces of the block. #ref(, supplement: [Figure]) displays the 3D surface model with the fitted feature network. #figure([ #box(image("fig_overview.png")) ], caption: figure.caption( position: bottom, [ Surface model of Dialface ObjID 18 (British Museum inv. 2547) with the fitted feature network: hour-line arcs (blue, with on-surface extrapolations), day-line circles (orange), medial groove centrelines (yellow), and all 33 curve-to-curve intersections (red: preserved; white: extrapolated). ]), kind: "quarto-float-fig", supplement: "Figure", ) = The Construction Dependency of the Witnesses #ref(, supplement: [Figure]) traces the construction of the conic dial from its four fundamental design inputs --- the klima proportion $s : g$, the epoch obliquity $epsilon$, the cone opening $rho = tan alpha$, and the scale unit $d$ --- through the physical stonecutting acts to the measurable features on the artifact. #figure([ #box(image("fig_construction_dag.png")) ], caption: figure.caption( position: bottom, [ Construction dependency graph of the conic sundial. Top: design inputs; middle: stonecutting acts in historical sequence; bottom: measured witnesses and consistency checks. Carmine edges carry the latitude proportion $s : g$\; slate edges carry obliquity $epsilon$\; bronze edges carry cone opening $rho$\; grey edges carry scale $d$. ]), kind: "quarto-float-fig", supplement: "Figure", ) The latitude proportion $s : g$ enters the artifact along three structurally independent paths: + #strong[The Upper Front Plane:] Dressed at inclination $90^compose - phi$ relative to the base (cut orthogonal to the cone axis). + #strong[The Cone Axis:] Elevated by $phi$ above the horizontal seating plane. + #strong[The Hour Division of the Solstitial Day-Lines:] Whose angular span obeys $cos H = - tan phi tan delta$. Because these stonecutting acts were performed separately, craftsmanship errors remain strictly local: a carving error in dividing the summer hour line cannot corrupt the front plane or the axis tilt. The equinoctial hour division ($15^compose\/upright(h)$ at all latitudes) and the day-line spacings ($ell_(S\,W)\/d$) depend only on $rho$ and $epsilon$ and serve as internal consistency checks. = The Measurement Chain on ObjID 18 == Step 1: Empirical Point Cloud and Noise Floor The measurement basis is the photogrammetric surface model BSDP0300 (497,694 vertices, millimetre coordinate frame), fourteen hand-curated point selections (PLY) of the engraved features (eleven hour lines with 509--967 points, three day-lines with 377--1,483 points), and seven plane selections of the dressed block faces. The feature selections lie on the model surface within $0.08 thin upright(m m)$ (median $0.03 thin upright(m m)$). Detrended cross-sectional residuals scatter with standard deviation $sigma_0 = plus.minus 0.3 thin upright(m m)$, which defines the physical noise floor. == Step 2: Medial Feature Centrelines Each selection is sliced into orthogonal cross-sections at $2.0 thin upright(m m)$ intervals. The groove centreline is extracted using the medial-line filter ($beta = 0.5$), yielding 9--37 centreline coordinates per feature. == Step 3: Circle and Arc Models All curved features are fitted as 3D circles using orthogonal distance regression: - #strong[Hour lines and long day-lines] ($gt.eq 120^compose$ span) receive #strong[free-plane] fits. - #strong[The winter day-line] ($102^compose$ span, 9 centres) receives a #strong[coaxial fit] constrained to the global cone axis to eliminate partial-arc bias. #ref(, supplement: [Table]) summarizes the fitted circle parameters. #figure([ #table( columns: (17.39%, 17.39%, 21.74%, 21.74%, 21.74%), align: (left,left,center,center,center,), table.header([Feature Name], [Model Class], [Fitted Radius $r$ \[mm\]], [Fit RMS \[mm\]], [Centre Count],), table.hline(), [Day-line Summer (#emph[SuSo])], [Free Plane Circle], [$120.31 plus.minus 0.50$], [$1.13$], [37], [Day-line Equinox (#emph[Equi])], [Free Plane Circle], [$106.06 plus.minus 0.24$], [$0.76$], [35], [Day-line Winter (#emph[WiSo])], [Coaxial Circle], [$67.63 plus.minus 1.78$], [$3.37$], [9], [Hour lines 1--11], [Free 3D Arcs], [$113.2$--$280.2$], [$0.20$--$0.71$], [12--24], ) ], caption: figure.caption( position: top, [ Circle and arc model parameters for Dialface ObjID 18 (bootstrap standard deviations). ]), kind: "quarto-float-tbl", supplement: "Table", ) #arxivai.concept-box(title: [Empirical finding: Hour lines are circular arcs])[ Straight line generator models leave large bow-shaped residuals of 2.2--7.6 mm RMS. Circular arcs fit the extracted centrelines at 0.20--0.71 mm RMS, with radii symmetrically distributed about the meridian (280 mm at noon, decreasing to 113 mm at the outer lines). ] #figure([ #box(image("fig_residual_bow.png")) ], caption: figure.caption( position: bottom, [ Straight-line versus circular-arc residuals for HourLine 11. The straight line model leaves a $plus.minus 13 thin upright(m m)$ bow; the circular arc reduces residuals below $1 thin upright(m m)$. ]), kind: "quarto-float-fig", supplement: "Figure", ) #figure([ #box(image("fig_hourline_arcs.png")) ], caption: figure.caption( position: bottom, [ Fitted arc radius per hour line on ObjID 18 (left), symmetric about the noon line (HourLine 6), and fit RMS comparison (right, logarithmic scale). ]), kind: "quarto-float-fig", supplement: "Figure", ) == Step 4: Direct Surface Cone Fit and Intersections Fitting an unlabelled right circular cone directly to all 3,345 feature points by orthogonal distance regression yields the global cone parameters: half-angle $alpha = 34.30^compose plus.minus 0.08^compose$ (RMS $0.39 thin upright(m m)$). Intersections between the 11 hour arcs and 3 day circles are computed as closest-pair points in $bb(R)^3$. All $11 times 3 = 33$ intersection points are recovered with a mean curve-to-curve gap of $1.27 thin upright(m m)$ (#ref(, supplement: [Figure])). #figure([ #box(image("fig_cone_fit.png")) ], caption: figure.caption( position: bottom, [ Day-line radii versus axial position with the fitted cone generatrix and extrapolated apex. ]), kind: "quarto-float-fig", supplement: "Figure", ) == Step 5: Dressed Reference Planes of the Block The dressed block faces are planar within $0.37$--$0.75 thin upright(m m)$ RMS: - The #strong[back face] is orthogonal to the meridian plane within $0.27^compose$. - The #strong[upper front face] is orthogonal to the cone axis within $0.82^compose$, so its inclination from horizontal directly embodies $90^compose - phi$. - The #strong[bottom seating face] defines the horizontal reference plane. = Ratio Compatibility Intervals Ancient dialmakers worked with simple whole-number ratios. A measured value $m plus.minus sigma$ is reported as its #strong[ratio compatibility interval]: the set of all irreducible fractions $p : q$ ($q lt.eq 16$) within two standard uncertainties of $m$, ordered by closeness in $sigma$: $ \[thin r_1\,r_2\,dots.h med\(m plus.minus sigma\)thin\]. $ A ratio within $1 sigma$ (bold) is fully compatible; between $1 sigma$ and $2 sigma$ is marginally compatible; outside $2 sigma$ is excluded (#ref(, supplement: [Figure])). #figure([ #box(image("fig_ratio_intervals.png")) ], caption: figure.caption( position: bottom, [ Ratio compatibility intervals of measured proportions for ObjID 18. Red bands: $plus.minus 1 sigma$ (thick) and $plus.minus 2 sigma$ (thin). Gold ticks: denominators $q lt.eq 10$\; grey ticks: $11 lt.eq q lt.eq 16$. ]), kind: "quarto-float-fig", supplement: "Figure", ) = The Latitude Proportion: Witnesses and Consensus == The Four Latitude Witnesses #ref(, supplement: [Table]) catalogs the four independent witnesses of the latitude proportion measured on ObjID 18. #figure([ #table( columns: (23.53%, 23.53%, 29.41%, 23.53%), align: (left,left,center,left,), table.header([Witness Name], [Construction Act], [Measured $phi$], [Empirical Basis],), table.hline(), [1. Cone axis vs.~seat], [Tilt of cone axis], [$41.85^compose$], [Day-line normals against bottom seating plane], [2. Upper front face], [Dressing of front plane], [$41.11^compose$], [Plane regression, 12,829 points], [3. Summer division ($epsilon$-free)], [Scribing of summer day-line], [$57.14^compose$], [$tan phi = tan alpha thin\|cos tilde(H)_S\|\/x_S$], [4. Winter division ($epsilon$-free)], [Scribing of winter day-line], [$39.63^compose$], [$tan phi = tan alpha thin\|cos tilde(H)_W\|\/x_W$], ) ], caption: figure.caption( position: top, [ The four latitude witnesses measured on Dialface ObjID 18. ]), kind: "quarto-float-tbl", supplement: "Table", ) == Hour-Point Regressions and Angular Unit Calibration On each day-line, the azimuth $theta_j$ of seasonal hour $j$ is regressed against the hour index: #math.equation(block: true, numbering: equation-numbering, [ $ theta_j = a +\(j - 6\)thin frac(H\(delta\), 6)\,#h(2em) cos H = - tan phi tan delta . $ ]) #emph[Reading.] The azimuthal position $theta_j$ of the $j$-th hour mark is a linear function of the index $\(j - 6\)$, whose slope determines the half-day arc $H\(delta\)\/6$. To eliminate shared engraving errors, two calibrations are applied: + #strong[Angular Unit Calibration:] The equinoctial division $H_E$ should theoretically equal $90^compose$. ObjID 18 exhibits $H_E = 85.66^compose plus.minus 0.39^compose$, indicating a scale factor $c = 85.66\/90 = 0.9510$ (a $- 4.9 %$ compression). All arcs are calibrated: $tilde(H) = H\/c$. + #strong[$epsilon$-Free Inversion:] Pairing each solstitial circle's placement $x = tan alpha tan delta'$ with its half-day arc $cos tilde(H) = - tan phi tan delta'$ cancels the realized declination $tan delta'$: #math.equation(block: true, numbering: equation-numbering, [ $ tan phi = tan alpha thin frac(\|cos tilde(H)\|, \|x\|) . $ ]) #emph[Reading.] The latitude is recovered without assuming the epoch obliquity or an exact circle placement (#ref(, supplement: [Figure])). #figure([ #box(image("fig_hourpoint_phi.png")) ], caption: figure.caption( position: bottom, [ Left: weighted regression of hour-point azimuths against hour index. Middle: standardized residuals. Right: per-line latitude estimates compared with structural witnesses. ]), kind: "quarto-float-fig", supplement: "Figure", ) == Joint Consensus and Error Isolation Combining all four witnesses through a joint measurement bootstrap and maximum likelihood estimation under a random-effects hierarchical model ($W_i = phi + b_i + e_i$, where $e tilde.op cal(N)\(0\,hat(Sigma)\)$ and $b_i tilde.op cal(N)\(0\,tau^2\)$): - #strong[Consensus Latitude:] $hat(phi) = 41.45^compose$, $68 %$ CI $\[41.16^compose\,41.75^compose\]$, artisan spread $tau = 0.36^compose$. - #strong[Klima Proportion:] Stated in the shadow-table convention ($g = 60$), $s = 53\;02$ ($68 %$ range $52\;28$--$53\;37$), ratio interval $\[8 : 9\,9 : 10\]$. This directly brackets Ptolemy's entries for #strong[Hellespont] ($s = 52\;02$) and #strong[Rome] ($s = 53\;50$). - #strong[Construction Error Diagnosis:] The summer division witness ($57.14^compose$) deviates by #strong[$14 sigma$] from the leave-one-out consensus of the other three. Three independent anomalies converge on this feature: the summer obliquity is elevated ($24.7^compose plus.minus 0.2^compose$), the equinoctial scale is compressed, and the afternoon marks are systematically wide (#ref(, supplement: [Figure])). The summer division is definitively isolated as an ancient stonecutting error. #figure([ #box(image("fig_hour_steps.png")) ], caption: figure.caption( position: bottom, [ Angular steps between adjacent hour marks along the equinoctial day-line. ]), kind: "quarto-float-fig", supplement: "Figure", ) = The Day-Line Proportions and the Workshop Rule $x = 1 : 4$ Normalizing day-line axial distances by the equinox invariant $ell_E = d$: $ ell_S\/d = 1.325 plus.minus 0.019 quad\[upright(bold(4 : 3))\]\,#h(2em) ell_W\/d = 0.800 plus.minus 0.013 quad\[upright(bold(4 : 5))\]. $ The three seasonal marks jointly satisfy the single proportional ratio: #math.equation(block: true, numbering: equation-numbering, [ $ ell_W : ell_E : ell_S = 12 : 15 : 20\, $ ]) #emph[Reading.] The seasonal noon marks stand in the exact integer ratio $12 : 15 : 20$ (within $0.6 sigma$), corresponding to the Hellenistic workshop rule $x = tan alpha tan epsilon = 1\/4$. = Metrological Audit #ref(, supplement: [Table]) provides a complete trace of every deduced parameter, its empirical foundation, and its dominant uncertainty. #figure([ #table( columns: (25%, 25%, 25%, 25%), align: (left,left,left,left,), table.header([Deduced Quantity], [Value / Proportion], [Empirical Foundation], [Dominant Uncertainty],), table.hline(), [#strong[Consensus Latitude] $phi$], [$41.45^compose$ ($68 %$ CI: $41.16^compose$--$41.75^compose$)], [Front plane + cone axis + winter division], [Artisan stonecutting $tau = 0.36^compose$], [#strong[Klima Ratio] $s : g$], [$53\;02 : 60$ ($8 : 9\,9 : 10$)], [Joint bootstrap consensus], [Artisan spread], [#strong[Witness Front Plane]], [$41.11^compose plus.minus 0.02^compose$], [Upper dressed plane, 12,829 points], [Stone dressing], [#strong[Witness Cone Axis]], [$41.85^compose plus.minus 0.04^compose$], [Day-line normals vs.~bottom seat], [Stone dressing], [#strong[Witness Winter Division]], [$39.63^compose plus.minus 2.74^compose$], [Calibrated arc $times$ circle placement], [Engraved division], [#strong[Isolated Error]], [Summer division ($14 sigma$ LOO)], [Residual + $H_E$ + $epsilon_(upright(S u S o))$], [Ancient carving error], [#strong[Noon Mark Ratio]], [$12 : 15 : 20$ ($lt.eq 0.6 sigma$)], [3 day-line fits + apex], [WiSo fragment (9 centres)], [#strong[Workshop Rule] $x$], [$0.247 plus.minus 0.011$ ($1 : 4$)], [Solstitial relations], [WiSo fragment], [#strong[Cone Opening] $rho$], [$0.554 plus.minus 0.021$ ($4 : 7\,5 : 9\,9 : 16$)], [Surface cone regression], [WiSo fragment], [#strong[Nodus Distance] $d$], [$168.7 thin upright(m m)$], [Equinox invariant $ell_E = d$], [Apex extrapolation], [#strong[Hour Line Curvature]], [Circular arcs ($r = 113$--$280 thin upright(m m)$)], [11 arc fits ($0.20$--$0.71 thin upright(m m)$ RMS)], [Weathering noise floor], [#strong[Unit Calibration] $c$], [$0.9510 plus.minus 0.0043$ ($- 4.9 %$)], [11 points on Equi ($H_E = 85.66^compose$)], [Engraver's unit], ) ], caption: figure.caption( position: top, [ Metrological audit of the reconstruction of Dialface ObjID 18 (British Museum inv. 2547). ]), kind: "quarto-float-tbl", supplement: "Table", ) = Conclusion The empirical reconstruction of Dialface ObjID 18 demonstrates that ancient stone sundials can be recovered with sub-millimetre metrological rigor when governed by gnomonic domain theory. By decomposing the artifact into independent construction witnesses, calibrating the engraved angular unit via the equinoctial invariant, and isolating carving anomalies through leave-one-out testing, the intended design proportions --- klima $s = 53\;02$ (Rome/Hellespont), workshop rule $x = 1 : 4$ ($12 : 15 : 20$), and circular arc hour lines --- are established with mathematical certainty. #heading(level: 1, numbering: none)[References] #bibliography(("references.bib"))