# A reproducible pipeline for TESS transit timing: archive re-query and synthetic recovery tests

**Status:** Draft manuscript for human verification. Not submitted anywhere. This is a methods paper covering an archive re-query and synthetic recovery tests. It makes no discovery claim.

**Author:** Jacob Derifield. No institutional affiliation is claimed in this draft.

**Date:** 2026-10-22

**Revision note (2026-10-23):** The reported results remain the synthetic tests dated 2026-10-22. This revision scopes the no-real-data statements to those results and records the real sector 56 products and diagnostic records committed after the paper date. No numeric result, figure, data file, or script was changed.

**Revision note (2026-10-25):** This revision replaces the no-real-fit statements with the committed single-transit results for KELT-11 b (TIC 55092869, sector 9) and the HD 209458 b (TIC 420814525, sector 56) control, and records the committed milestone gate as PASS. Both fits fix the published period and are not new epochs, detections, or period measurements. No numeric result, figure, data file, pipeline script, or citation was changed.

## Abstract

The Transiting Exoplanet Survey Satellite (TESS) has produced a large public archive of light curves and target pixel files. Independent timing work on that archive needs two things that are often implicit: a selection rule that can be re-run, and a measurement path whose bias and uncertainty have been tested. We describe a small pipeline that does both and record every input and output in a version-controlled repository. The archive component re-queries the NASA Exoplanet Archive and the Mikulski Archive for Space Telescopes (MAST) and applies a frozen four-gate selection rule. The query returned 598 confirmed transiting planet rows. Of these, 545 rows passed the two-sector gate and correspond to 479 unique TIC identifiers. A target docket built from the same snapshot contains 304 rows across 268 unique TICs. The photometric component reads a SPOC-shaped light curve, applies a fixed quality mask, performs threshold aperture photometry on a target pixel file, fits a trapezoid transit model, folds the light curve, and measures per-transit times. The photometric tests in Sections 4.1 to 4.5 use labelled synthetic fixtures, not TESS observations. The repository also holds real sector 56 and sector 9 products with two single-transit fits that fix the published period. For KELT-11 b (TIC 55092869, sector 9) the fitted mid-transit time is 1553.816219 BTJD with a formal one-sigma of 80.3 s, an offset of 229.8 s (2.86 reported sigma) from the published prediction, and a residual RMS of 694.6 ppm. The HD 209458 b control (TIC 420814525, sector 56) gives a fitted mid-transit time of 2840.878747 BTJD, a formal one-sigma of 2.3 s, an offset of -13.0 s (-5.62 reported sigma), and a residual RMS of 586.0 ppm. Both are single-transit fits with the published period fixed; neither is a new epoch, a detection, or a period measurement. The control offset shows that the formal sigma is not externally calibrated, and no combined uncertainty is claimed. The committed milestone gate record reports PASS, with five criteria passed and none failed. On a synthetic 19,441-cadence light curve, the fit recovered the injected period, depth, duration, and baseline within about two reported sigma. Eight synthetic transit events were measured with offsets between -6.25 s and +2.66 s from the reference ephemeris and a linear consistency fit with chi-square per degree of freedom 0.427. In a 12-injection recovery campaign, the timing bias was -0.055 s against a median reported uncertainty of 1.665 s, a ratio of 0.033, below the pre-declared 0.2 threshold. The campaign scatter was 1.218 s and the pull RMS was 0.627. These are recovery results on synthetic data. The archive component is a re-tabulation of public summary metadata. The paper does not derive a new ephemeris, does not confirm a planet, and does not claim a timing detection.

**Keywords:** TESS; transit timing; reproducibility; aperture photometry; injection-recovery; methods

## 1. Introduction

TESS was designed to find transiting planets around bright, nearby stars (Ricker et al. 2015). Its data are processed by the TESS Science Processing Operations Center (SPOC), which delivers light curves, target pixel files, and data validation products (Jenkins et al. 2016). The archive is public, and the derived products are widely reused.

Reuse is not the same as reproducibility. A timing measurement depends on target selection, quality masking, aperture choice, detrending, the transit model, and the treatment of correlated noise. Each choice can move the result. A paper that reports a mid-transit time without recording those choices is difficult to check, and a pipeline that has only been run on real data cannot separate a code error from an astrophysical signal.

This paper takes a deliberately narrow approach. It asks two questions. First, can a fixed selection rule be re-run from public archive metadata and produce a traceable candidate list? Second, can a small timing pipeline recover injected transit times within its own reported uncertainty? The answers are yes for the archive snapshot and yes for the synthetic tests described here. Neither answer is a discovery.

The paper is therefore a methods and reanalysis paper. The archive part is a re-query and re-tabulation of public summary metadata. The photometric tests reported in Sections 4.1 to 4.5 use synthetic fixtures. A separate pair of single-transit fits on real sector 9 and sector 56 products is reported in Section 2.4; both fix the published period and neither is a discovery.

The contributions are:

1. A frozen selection rule with inclusive thresholds, a deterministic sort order, and a one-sided sector flag that is recorded but not treated as proof of novelty.
2. A provenance record for the archive query, including request times, HTTP statuses, raw response files, and SHA-256 digests.
3. An end-to-end photometric path tested on labelled synthetic fixtures, with the quality mask, aperture, fit, and timing steps recorded as machine-readable outputs.
4. An injection-recovery campaign that measures timing bias against the reported uncertainty and passes a pre-declared gate.
5. A traceability table that maps every reported number to a committed file and field.

The paper does not claim that any target in the shortlist is suitable for a timing measurement. It does not claim that any sector is unused. It does not claim a transit timing variation.

## 2. Data and provenance

### 2.1 Public archive metadata

The archive query ran at 2026-10-22T06:15:21Z against two read-only services. The first was the NASA Exoplanet Archive TAP `sync` endpoint, table `pscomppars`. The ADQL selected confirmed transiting planets with TESS magnitude at most 11 and orbital period at most 10 days, ordered by TESS magnitude, period, and TIC identifier. The selection code then applies a deterministic sort that adds planet name as the final tie-break. The query returned HTTP 200 and 598 rows. The raw response is `research/tess-timing/data/raw/exoplanet_pscomppars_20261022T061521Z.json`, with SHA-256 `9c70efbe750513193742b4b4cb8f52eb1edb16bd67e439b0c0539a92438ef532`. That digest is over the committed LF-normalized blob. A checkout that converts the file to CRLF, as a default Windows checkout does, hashes the working-tree copy differently even though the committed bytes are unchanged; the record and this paper use the committed-blob digest.

The second service was MAST `Mast.Caom.Filtered`, queried for TESS timeseries metadata in 14 batches of up to 40 TIC identifiers (13 of 40 and one of 11) with page size 20,000. All 14 requests returned HTTP 200. The responses contained 6,557 rows. The parser used 5,014 rows and dropped 1,543 rows whose time span exceeded 40 days, because a longer span is likely to be a combined or anomalous product. The parser recorded 527 targets. The raw response bodies are the 14 `mast_batch_*` files under `research/tess-timing/data/raw/`.

TIC identifiers refer to the TESS Input Catalog (Stassun et al. 2019). The archive is a snapshot, not a permanent catalogue. The counts describe the state of the services at the recorded request time.

### 2.2 Synthetic fixtures

The photometric tests reported in this paper use three local synthetic FITS inputs and one synthetic multi-transit CSV:

| Input | Size (bytes) | SHA-256 |
| --- | ---: | --- |
| `synthetic_lightcurve.fits` | 8,640 | `e3a9d3c04ba22fe480d1355f68373ac3d93cd11e423ef68826faf9a104d7002e` |
| `synthetic_tpf.fits` | 92,160 | `c9b30da8a94a2c99995256a5a80f19389eeceb88ae8fc099e40f37bcf8eeb005` |
| `synthetic_tpf_lightcurve.fits` | 8,640 | `d8b72185f204fd4c96f71dc5d827ca9f1f7bc4cd168f949e79ba7eb2b73a80f2` |
| `synthetic_transit.csv` | 816,547 | `a524ef7f6dafddd840ff7aa028972f50157568c0e445c369aaca28b695b7f177` |

The multi-transit CSV is 816,547 bytes with 19,441 cadences. The first three files are loader and aperture fixtures. The twelve-row light curve contains no injected transit signal. The target pixel file is a 21 by 21 pixel image with 12 cadences. The multi-transit CSV is a separate 27.0 d synthetic light curve generated from a seeded trapezoid model. Its injected mid-transit time is 3000.6 BTJD, its period is 3.5 d, its depth is 0.012, its first-to-fourth contact duration is 0.16 d, its baseline offset is 0.0002, and its per-cadence Gaussian noise is 0.0002. The seed is 20261022.

Every synthetic file is labelled as synthetic in the accompanying JSON record and, where a figure is produced, on the figure itself. These files are test data. They are not observations, not SPOC products, and not evidence about any star.

### 2.3 Real sector 56 products and diagnostic records

The synthetic results in Sections 4.1 to 4.5 use the fixtures in Section 2.2. The repository also holds one real product set for HD 209458 b (TIC 420814525), sector 56: `research/tess-timing/data/real-run/lightcurve.fits`, `research/tess-timing/data/real-run/tpf.fits`, `research/tess-timing/data/real-run/acquisition.json`, and `research/tess-timing/data/real-run/manifest.jsonl`. The acquisition is recorded in `docs/TESS-REAL-TARGET.md`.

Separate diagnostic records describe what was computed on that pair. `docs/TESS-REAL-LIGHTCURVE.md` describes the delivered light curve, with its machine-readable record in `research/tess-timing/data/real-lc-run/diagnostics.json`. `docs/TESS-REAL-APERTURE.md` describes threshold aperture photometry compared with SAP and PDCSAP, with records in `research/tess-timing/data/real-aperture-run/real_aperture.json` and `research/tess-timing/data/real-aperture-run/real_aperture.csv`. `docs/TESS-REAL-WINDOWS.md` lists the predicted windows in `research/tess-timing/data/real-windows-run/windows.json`. `docs/TESS-REAL-WINDOW-QC.md` gives per-window cadence and background statistics. `docs/TESS-REAL-DETREND.md` describes a deterministic detrending diagnostic, with records in `research/tess-timing/data/real-detrend-run/detrend.json` and `research/tess-timing/data/real-detrend-run/detrend.csv`.

The diagnostic records above do not fit a transit model and do not measure a timing. They make no detection, confirmation, or novelty claim. The single-transit fits are a separate product, described in Section 2.4. The committed milestone gate record for the same target and sector reports PASS; Section 2.4 gives the gate status and the fit values. The archive shortlist remains a summary-table product. It does not inspect data quality, contamination, crowding, or transit detectability.

### 2.4 Real single-transit fits

Two single-transit fits are recorded after the paper date. The KELT-11 b record is `research/tess-timing/data/second-target-run/analysis.json`, described in `docs/TESS-SECOND-TARGET.md`. The HD 209458 b control record is `research/tess-timing/data/sector56-control-run/analysis.json`. Both use the same aperture, quality mask, running-median detrending, and single-transit model; the only inputs that differ are the target-sector product pair and the published ephemeris. Limb darkening, impact parameter, and dilution are fixed at zero as method settings, not measured values. The published period is fixed, and the fit window is selected by the published ephemeris, so neither fit measures a period or searches for other transits.

For KELT-11 b (TIC 55092869, sector 9) the fitted mid-transit time is 1553.816219 BTJD with a formal one-sigma uncertainty of 80.3 s. The offset from the published prediction is 229.8 s, or 2.86 reported sigma, and the residual RMS is 694.6 ppm. For the HD 209458 b control (TIC 420814525, sector 56) the fitted mid-transit time is 2840.878747 BTJD with a formal one-sigma uncertainty of 2.3 s. The offset from the published prediction is -13.0 s, or -5.62 reported sigma, and the residual RMS is 586.0 ppm.

Both are single-transit fits with the published period fixed. They are not new epochs, detections, confirmations, or timing-variation measurements, and they do not replace the published ephemerides. The control offset of -5.62 reported sigma shows that the formal least-squares sigma is not externally calibrated; the KELT-11 b offset should be read the same way. `docs/TESS-REAL-REDNOISE.md` records correlated out-of-transit noise in the sector 56 series, with binned scatter above the white-noise expectation. No term from that diagnostic is added to either fit uncertainty, and no combined uncertainty is claimed.

The committed milestone gate record `docs/data/milestone-gate.json`, tabulated in `docs/FIRST-MILESTONE-GATE.md`, reports overall PASS: all five criteria pass, and the live entry run took 248.93046880001202 s, within the ten-minute limit. The gate record tests the wired acquisition and fit for TIC 55092869, sector 9, and does not test target selection or novelty.

## 3. Methods

### 3.1 Target selection

The selection rule is implemented in `research/tess-timing/src/tess_timing/selection.py` and is frozen in the committed run record. A candidate passes when all four gates hold:

| Gate | Test | Boundary |
| --- | --- | --- |
| Confirmed transiting planet | archive `tran_flag == 1` | not applicable |
| TESS magnitude | `sy_tmag <= 11.0` | 11.0 passes |
| Orbital period | `pl_orbper <= 10.0` d | 10.0 passes |
| TESS sectors | at least two unique sector numbers | 2 passes |

The boundaries are inclusive. A missing magnitude or period does not pass. Sectors are counted from MAST timeseries metadata, so an observation with no timeseries product is not counted. Rows are deduplicated by sector number.

The sort order is deterministic: TESS magnitude ascending, then period ascending, then TIC ascending, then planet name ascending. Archive row order cannot change the output.

Sector novelty is a flag, not a gate. A row is marked `POSTDATES_REFERENCE_YEAR` when at least one recorded sector start year is later than the year parsed from the archive's transit-midpoint reference. A sector that started after the reference year cannot have been part of that fit. The flag does not prove that the published fit omitted the sector. Confirming absence requires reading the cited ephemeris table. Every other case is marked `UNVERIFIED`.

### 3.2 Light-curve loading and quality mask

The loader reads a SPOC-shaped FITS table with `TIME`, `SAP_FLUX`, `SAP_FLUX_ERR`, `PDCSAP_FLUX`, `PDCSAP_FLUX_ERR`, and `QUALITY`. It removes a cadence when `(QUALITY & 175) != 0`. The mask value 175 selects attitude tweak, safe mode, coarse point, Earth point, desaturation, and manual exclusion. It then removes cadences with non-finite time, quality, flux, or uncertainty.

Each retained flux column is divided by its own median. The matching uncertainty column is divided by the same median, so the errors are in relative-flux units.

Gaps are counted on the finite time values before masking. A gap is a consecutive time difference greater than 1.5 times the median positive time difference. In the fixture the nominal cadence is 120 s, so the gap threshold is 180 s.

No detrending is applied. There is no spline, no cotrending basis vector, and no simultaneous model. The only corrections are the quality mask and the median normalization. The resulting shape is not interpreted as a transit or as astrophysical variability.

### 3.3 Aperture photometry

The aperture code reads a local target pixel file and builds a per-pixel median reference image from finite, positively weighted samples. It finds the brightest pixel and grows an eight-connected threshold aperture from that pixel. The threshold is the background plus 5 percent of the peak background-subtracted flux. In the fixture, 10 e-/s + 0.05 * 400 e-/s = 30 e-/s.

The local background is the per-cadence median of a 2.0 to 3.5 pixel annulus. The inner radius is inclusive and the outer radius is exclusive. The annulus is clipped at 3 sigma for 3 iterations and requires at least 3 pixels. In the fixture the annulus has 28 pixels and excludes the aperture.

The extracted flux is the sum of the aperture pixels minus the aperture area times the local background. Its uncertainty is the quadrature sum of the aperture pixel uncertainties and the background uncertainty. The background term is `1.2533 * sigma_annulus / sqrt(N_annulus)` per pixel, multiplied by the aperture area. The aperture series and each mission series are normalized by their medians on a common mask before comparison.

### 3.4 Transit models and fitting

Two models are used, for different purposes.

The toy fit uses a trapezoid in relative flux:

```text
F(t) = 1 + baseline - depth * shape(t)
```

The folded time is `phase = (((t - t0) / P + 0.5) mod 1 - 0.5) * P`, measured in days. With `half_total = duration / 2` and `half_flat = duration * (1 - ingress_fraction) / 2`, the shape is 1 for `|phase| <= half_flat`, falls linearly to 0 between `half_flat` and `half_total`, and is 0 outside. The ingress plus egress fraction is fixed at 0.2. A coarse box matched-filter search initializes a `scipy.optimize.least_squares` fit with five free parameters: `t0`, period, depth, duration, and baseline offset. The covariance is `(J^T J)^-1` from the Jacobian at the optimum, scaled by the reduced chi-square of the flux residuals. The reported one-sigma uncertainties are the square roots of its diagonal.

This trapezoid is not a physical transit model. It has no projected circular orbit, no limb darkening, and no Mandel-Agol integration. It is a simple shape whose depth, duration, period, and timing can be checked by hand.

The injection campaign uses a separate circular-orbit model with quadratic limb darkening and dilution. The model integrates the blocked stellar flux on a fixed planet-centred polar midpoint grid. The intensity law is `I(mu) / I(0) = 1 - u1 (1 - mu) - u2 (1 - mu)^2`, with `mu = sqrt(1 - r^2)` and `I = 0` for `r >= 1`. The observed relative flux is `1 - delta(t) / (1 + dilution)`. The implementation is numerical, not the analytic Mandel-Agol solution (Mandel and Agol 2002), and its tests are against analytic limits and tolerances rather than stored output.

### 3.5 Epoch measurement

The epoch code folds the synthetic light curve on a committed reference ephemeris. The cycle number is `floor((time - t0) / period + 0.5)`, and the phase is `time - t0 - cycle * period`, so the phase lies in `[-period/2, period/2)`. The folded curve is binned into 140 phase bins.

For each transit event, a local window of half-width `max(0.5, 4 * duration) = 0.640 d` is selected around the reference mid-transit time. The local fit frees only a mid-transit offset and a local baseline. The period, depth, duration, and ingress fraction are fixed at the reference values. The fit requires at least 20 local cadences and at least 5 in-transit cadences. The one-sigma offset uncertainty comes from `(J^T J)^-1 * chi_square / degrees_of_freedom`. The reference `t0` and period uncertainties are propagated when forming the pull against the reference.

A weighted least-squares line `t = t0 + period * cycle` is fitted to the measured epochs as a consistency check. Its covariance is scaled by the reduced chi-square. This line fit is not an independent period measurement, because each per-transit time was measured with the reference period fixed.

### 3.6 Injection-recovery campaign

The injection campaign uses the circular-orbit model and a seeded NumPy generator. It runs 12 injections on a grid of three mid-transit offsets (-0.005, 0, and +0.005 d), two noise levels (0.00006 and 0.0001 in relative flux), and two antithetic signs. Each cell draws one standard-normal vector and adds it with a positive and a negative sign, so each pair has zero mean noise.

Each synthetic light curve has 50 cadences at 120 s, spanning 0.068 d. The fixed parameters are period 5.0 d, radius ratio 0.1, duration 0.04 d, impact parameter 0.3, `u1 = 0.3`, `u2 = 0.25`, dilution 0, and baseline offset 0.0003. The fit frees `t0`, radius ratio, duration, baseline offset, and jitter. The campaign records the recovered `t0`, its reported one-sigma uncertainty, the error in days and seconds, and the pull. The pre-declared gate is the absolute timing bias divided by the median reported `t0` uncertainty, with a threshold of 0.2.

The campaign runtime is 162.639 s. The runtime is pinned in `runtime-ledger.json` so a repeat run is byte-identical.

## 4. Results

### 4.1 Archive selection snapshot

The archive query evaluated 598 rows. Of these, 545 passed the selection rule and 53 failed only the two-sector gate. The 545 selected rows correspond to 479 unique TIC identifiers. The 598 evaluated rows correspond to 531 unique TICs. Those two counts are not interchangeable: multiple planets can share a host, and the evaluated set includes rows that did not pass.

Of the 545 shortlist rows, 304 are flagged `POSTDATES_REFERENCE_YEAR` and are included in the docket. The remaining 241 are held as `UNVERIFIED` and are not in the docket. The docket contains 304 rows across 268 unique TICs. The docket is a reading list, not a ranking.

The predicted-epoch worksheet applies the docket ephemerides to the recorded sector windows. It produces 1,986 predictions across 106 unique sectors. All 1,986 fall inside a recorded sector window by construction, 1,965 have a propagated uncertainty, and 21 do not because the docket does not record the needed uncertainty. An inside-window flag is a bookkeeping check. It is not evidence that a transit was observed.

| Quantity | Value |
| --- | ---: |
| Rows returned by the Exoplanet Archive query | 598 |
| Rows selected | 545 |
| Rows failing the two-sector gate | 53 |
| Unique TICs among evaluated rows | 531 |
| Unique TICs among selected rows | 479 |
| Docket rows | 304 |
| Unique TICs in the docket | 268 |
| Shortlist rows held `UNVERIFIED` (not in the docket) | 241 |
| Predicted epochs | 1,986 |
| Unique sectors in the prediction set | 106 |
| Predictions with a propagated uncertainty | 1,965 |
| Predictions without a propagated uncertainty | 21 |
| MAST rows returned | 6,557 |
| MAST rows used | 5,014 |
| MAST rows dropped for a span over 40 d | 1,543 |
| MAST targets recorded by the parser | 527 |

Table 1. Archive, docket, and prediction counts. Every value is stored in `research/tess-timing/data/paper-numbers.json` with its source path and field.

### 4.2 Light-curve and aperture diagnostics

The twelve-row loader fixture starts with 12 cadences. The quality mask removes 3, a non-finite flux removes 1 more, and 8 are retained. One gap is recorded, containing 5 missing cadences. The longest gap is 720 s against a 180 s threshold. The raw SAP median is 105.5 e-/s and the raw PDCSAP median is 211.0 e-/s. Both normalized medians are 1.0.

The aperture fixture has a 21 by 21 pixel image with 12 cadences. The aperture contains 9 pixels, rows 9 to 11 and columns 9 to 11, with centroid row 10.0 and column 10.0. It does not touch the image edge. The annulus contains 28 pixels with a background of 10 e-/s in every cadence.

At the first cadence the aperture flux is 1600 e-/s with a 41.1096 e-/s uncertainty, a relative error of 2.57 percent. Over the 12 cadences the relative error ranges from 2.54 to 2.60 percent. On 12 matched pairs with a maximum time offset of 0.0 s, the aperture series has a Pearson correlation of 1.0 with SAP and 0.9998469 with PDCSAP. The RMS differences are 753.131 ppm against SAP and 300.633 ppm against PDCSAP. The maximum absolute differences are 0.001065 and 0.000423 in relative flux.

These are diagnostics on a synthetic star. They show that the aperture path is internally consistent with the mission columns on the fixture. They are not a validation of the SPOC pipeline and not a measurement of a real target.

![Three-panel TESS methods figure: quality-masked light curve, aperture photometry against mission columns, and the median pixel image with aperture and annulus](figures/tess-methods.svg)

Figure 1. The committed methods figure, generated by `research/tess-timing/scripts/make_note_figure.py` from the committed CSV and JSON records and the synthetic target pixel file. The top panel shows the 8 retained light-curve cadences, the gap, and the absence of detrending. The lower-left panel shows the aperture series with one-sigma error bars against SAP and PDCSAP. The lower-right panel shows the median pixel image with the 9-pixel aperture and 28-pixel annulus. The figure is synthetic throughout.

| Quantity | Value |
| --- | ---: |
| Input cadences | 12 |
| Removed by the quality mask | 3 |
| Removed for a non-finite flux | 1 |
| Retained cadences | 8 |
| Gaps | 1 |
| Missing cadences in gaps | 5 |
| Longest gap | 720 s |
| Gap threshold | 180 s |
| SAP raw median | 105.5 e-/s |
| PDCSAP raw median | 211.0 e-/s |
| Aperture pixels | 9 |
| Annulus pixels | 28 |
| Aperture threshold | 30 e-/s |
| First aperture flux | 1600 +/- 41.1096 e-/s |
| First relative error | 2.57 percent |
| Relative error range | 2.54 to 2.60 percent |
| SAP Pearson r | 1.0 |
| PDCSAP Pearson r | 0.9998469 |
| SAP RMS difference | 753.131 ppm |
| PDCSAP RMS difference | 300.633 ppm |
| SAP maximum absolute difference | 0.001065 |
| PDCSAP maximum absolute difference | 0.000423 |

Table 2. Light-curve and aperture diagnostics on the synthetic fixtures.

### 4.3 Recovery of a synthetic transit

The trapezoid fit uses 19,441 cadences, of which 920 are in transit. There are 19,436 degrees of freedom. The RMS is 199.595 ppm and the chi-square per degree of freedom is 0.99621. The optimizer converged.

The fit places the mid-transit time at 3014.6000106 BTJD with a one-sigma uncertainty of 0.0000205 d. The fit epoch is four cycles after the injected reference epoch. The injected model predicts 3014.6000000 BTJD at that cycle, so the offset is 1.06e-5 d, or 0.52 times the reported `t0` uncertainty.

The recovered period is 3.4999951 +/- 0.0000025 d, a difference of -1.97 sigma from the injected 3.5 d. The recovered depth is 0.01199967 +/- 0.00000738, a difference of -0.04 sigma from 0.012. The recovered duration is 0.15999277 +/- 0.00004553 d, a difference of -0.16 sigma from 0.16 d. The recovered baseline offset is 0.00019933 +/- 0.00000147, a difference of -0.46 sigma from 0.0002.

| Parameter | Injected | Recovered | One-sigma uncertainty | Offset / sigma |
| --- | ---: | ---: | ---: | ---: |
| `t0` at cycle 4 (BTJD) | 3014.6000000 | 3014.6000106 | 0.0000205 | +0.52 |
| Period (d) | 3.5 | 3.4999951 | 0.0000025 | -1.97 |
| Depth | 0.012 | 0.01199967 | 0.00000738 | -0.04 |
| Duration (d) | 0.16 | 0.15999277 | 0.00004553 | -0.16 |
| Baseline offset | 0.0002 | 0.00019933 | 0.00000147 | -0.46 |

Table 3. Injected and recovered parameters for the synthetic trapezoid fit. The `t0` comparison is at the fitted cycle, four periods after the injected reference epoch.

The agreement is expected because the same trapezoid generated the data and fitted it. This is a code-recovery check, not evidence that the model is correct for a real transit.

![Toy trapezoid fit to a synthetic multi-transit light curve](figures/transit-fit.svg)

Figure 2. The committed transit-fit figure, generated by `research/tess-timing/scripts/toy_transit_fit.py`. The top panel shows the 27 d synthetic light curve in display bins with the fitted model. The bottom panel shows the phase-folded curve with the fit and the injected model. The figure is synthetic throughout.

### 4.4 Per-transit timing on the synthetic fixture

The epoch code measures all 8 transit events in the 27 d fixture. The reference ephemeris is the committed trapezoid fit. All eight windows contain 115 in-transit cadences. The first window is truncated at the start of the light curve but still samples the transit fully.

The measured offsets from the reference prediction range from -6.25 s to +2.66 s. The pulls against the reference range from -1.19 to +0.52. The linear consistency fit gives `t0 = 3014.6000113 +/- 0.0000133` BTJD and period `3.499995199 +/- 0.000005696` d. The chi-square is 2.5609 for 6 degrees of freedom, or 0.427 per degree of freedom.

The fixture truth check shifts the measured `t0` by four whole periods to compare with the injected epoch. The shifted value is 3000.6000305 BTJD, an offset of 3.048e-5 d from the injected 3000.6 BTJD, with a pull of 1.16. The measured period differs from the injected 3.5 d by -4.801e-6 d, with a pull of -0.84. The cycle shift is a whole-period relabelling, not a physical epoch.

| Cycle | Mid-transit (BTJD) | Uncertainty (s) | Offset vs reference (s) | Pull vs reference | Status |
| ---: | ---: | ---: | ---: | ---: | --- |
| -4 | 3000.600052 | 4.82 | +1.92 | 0.37 | measured |
| -3 | 3004.100003 | 4.75 | -1.94 | -0.38 | measured |
| -2 | 3007.600025 | 4.85 | +0.40 | 0.08 | measured |
| -1 | 3011.100013 | 4.97 | -0.24 | -0.04 | measured |
| 0 | 3014.600038 | 4.59 | +2.33 | 0.47 | measured |
| +1 | 3018.099933 | 4.92 | -6.25 | -1.19 | measured |
| +2 | 3021.600032 | 4.76 | +2.66 | 0.52 | measured |
| +3 | 3025.100009 | 5.10 | +1.12 | 0.21 | measured |

Table 4. Measured transit times on the synthetic fixture. Offsets are measured minus the reference prediction. The pull includes the propagated reference uncertainty. The local window is truncated at the start of the light curve for cycle -4.

The per-transit times are conditional on the reference period. The line fit is a consistency check, not an independent period measurement. Its residuals are not a detection of a timing variation.

![Phase-folded synthetic light curve and timing residuals](figures/epoch-fold.svg)

Figure 3. The committed epoch-fold figure, generated by `research/tess-timing/scripts/make_epoch_fold.py`. The top panel shows every cadence folded on the committed reference ephemeris. The bottom panel shows the measured epoch minus the linear consistency fit, with one-sigma bars. The figure is synthetic throughout.

### 4.5 Injection-recovery timing bias

The 12-injection campaign recovered all 12 mid-transit times. All 12 fits converged. The aggregate bias is -0.055 s. The median reported `t0` uncertainty is 1.665 s, so the absolute bias divided by the median uncertainty is 0.033. The pre-declared gate threshold is 0.2, so the campaign passes.

The scatter of the recovered minus injected times is 1.218 s, or 0.732 times the median reported uncertainty. The pull mean is -0.078 and the pull RMS is 0.627. The largest absolute pull is 1.288. Two of the 12 injections fall within 0.2 sigma, 83.3 percent fall within 1 sigma, and 100 percent fall within 2 sigma.

| Quantity | Value |
| --- | ---: |
| Injections | 12 |
| Timing bias | -0.055 s |
| Median reported `t0` uncertainty | 1.665 s |
| Absolute bias / median uncertainty | 0.033 |
| Scatter | 1.218 s |
| Scatter / median uncertainty | 0.732 |
| Pull mean | -0.078 |
| Pull RMS | 0.627 |
| Largest absolute pull | 1.288 |
| Within 0.2 sigma | 2 of 12 |
| Within 1 sigma | 83.3 percent |
| Within 2 sigma | 100 percent |
| Gate threshold | 0.2 |
| Gate result | pass |

Table 5. Injection-recovery aggregates for the synthetic timing campaign.

![Synthetic transit injection-recovery curve](../research/tess-timing/data/injection-run/injection.svg)

Figure 4. The committed injection-recovery figure, generated by `research/tess-timing/scripts/run_injection.py`. The left panel compares recovered and injected mid-transit offsets. The right panel shows the recovered minus injected `t0` against the reported one-sigma uncertainty, with the 0.2 times median sigma band. The figure is synthetic throughout.

## 5. Discussion

### 5.1 What the results do and do not support

The results support three limited statements. First, the archive selection rule is reproducible from the committed query and raw responses. Second, the photometric path runs end to end on labelled synthetic inputs and returns the values recorded in the machine-readable outputs. Third, the timing path recovers injected mid-transit times with a bias that is small compared with its reported uncertainty on the tested grid.

For the synthetic results, the noise is white, the trapezoid fit is not a physical model, the injection campaign has 12 points and does not calibrate the uncertainty distribution in detail, and the epoch measurements use a fixed reference period. The real-data results in Section 2.4 are two single-transit fits with the published period fixed. They do not support a planet detection, a transit confirmation, a new epoch, a timing variation, or an independent period measurement. The control offset shows that their formal sigma is not externally calibrated. The archive shortlist is a snapshot and does not test detectability.

The archive counts need care. The 545 selected rows correspond to 479 unique TICs, while the 598 evaluated rows correspond to 531 unique TICs. Counting planet rows as independent hosts would overstate the number of stars. The 304 docket rows correspond to 268 unique TICs. The sector flag is one-sided: a sector that started after the reference year cannot have been in that fit, but the archive summary does not prove that the published fit omitted it.

### 5.2 Requirements for a real-data timing reanalysis

A real timing reanalysis would need this sequence:

1. Select one shortlisted target and one sector, preferably a sector whose start year postdates the ephemeris reference.
2. Download and record the target pixel file and the 120 s light curve with `research/tess-timing/scripts/provenance.py add`. The record must include the TIC, sector, cadence, product type, URL, aperture label, and quality-mask label.
3. Run the aperture path on the real products, and compare the aperture series with SAP and PDCSAP on one common mask.
4. Inspect the quality flags, the scattered-light background, and the gaps before any fit.
5. Detrend the out-of-transit flux with a stated spline, cotrending basis vector set, or simultaneous model. Repeat the fit with an alternative detrending to show how much the result moves.
6. Only then fit a physical transit model. Report a mid-transit time with its uncertainty and covariance, and check it against the published ephemeris before any novelty statement.

A target and sector were selected by the committed docket-walk rule and recorded in `docs/TESS-REAL-TARGET.md` and `research/tess-timing/data/real-run/acquisition.json`. Steps 1 to 4 were performed for HD 209458 b (TIC 420814525), sector 56, as diagnostics: the products were downloaded and recorded, the aperture path was compared with SAP and PDCSAP, and the quality flags, background, and gaps were inspected. Step 5 detrending was performed as a diagnostic only, without an in-transit mask and without a result tied to a transit model, in `docs/TESS-REAL-DETREND.md`. Step 6 was performed as two single-transit fits, with the published period fixed and the fit window set by the published ephemeris, in `docs/TESS-SECOND-TARGET.md` and Section 2.4. Those fits report a mid-transit time and a formal covariance, and the KELT-11 b result is checked against the published ephemeris. They do not measure the period, establish a new epoch, or constitute a timing-variation measurement. The HD 209458 b control offset of -5.62 reported sigma shows that the formal sigma is not externally calibrated, and no combined uncertainty is claimed. The committed milestone gate record `docs/data/milestone-gate.json` reports PASS: all five criteria pass and the live runtime is within the ten-minute limit. None of these diagnostics or fits establishes a detection, a confirmation, or a novelty claim.

### 5.3 Reproducibility

The manuscript numbers are collected by:

```bash
python research/tess-timing/scripts/paper_numbers.py
```

That command reads the committed outputs and writes `research/tess-timing/data/paper-numbers.json`. Each entry records the source path and field, or the arithmetic used to derive it. The provenance audit checks that record:

```bash
python research/tess-timing/scripts/audit_paper_numbers.py --check
```

The audit resolves and compares every simple JSON or TOML field, records the arithmetic for each derived value, and names every transcribed value whose source it does not machine-read. At this revision it classifies 155 values as resolved, 31 as derived, and 12 as transcribed. The classes, the named exceptions, and the source digests are in `research/tess-timing/data/paper-numbers-audit.json`.

The committed artifacts are checked by:

```bash
python research/tess-timing/scripts/verify_artifacts.py --check
```

The check covers 38 artifacts. It reports a SHA-256 for each and a PASS or FAIL against the committed manifest.

The test suite is run by:

```bash
python -m pytest research/tess-timing
```

All tests are offline. They cover the selection boundaries, the quality mask, the aperture path, the transit fit, the epoch fold, the injection campaign, the provenance manifest, and the manuscript number collector.

The offline checks are collected into one command:

```bash
python research/tess-timing/scripts/check_paper.py
```

It runs the artifact digest check, the citation-register check, the number collector into a temporary record under `.scratch/` with a byte comparison against the committed record, the figure digest check, and the key paper tests. It prints one PASS or FAIL summary and exits nonzero if any check fails. It makes no network request, does not run the injection campaign, and does not write to tracked files. The analysis dependencies are declared in `research/tess-timing/pyproject.toml`: NumPy, SciPy, and Astropy, with pytest in the `test` extra. The tested Python version is 3.12.

## 6. Conclusions

A small, explicitly documented pipeline can re-query a public TESS target list, recover injected transit times within its reported uncertainty on synthetic fixtures, and run single-transit fits on real TESS products with the published period fixed. The archive snapshot is traceable to raw responses and digests. The photometric and timing results are traceable to committed JSON and CSV records. The synthetic recovery campaign passes a pre-declared bias gate, with a bias of -0.055 s against a median reported uncertainty of 1.665 s.

These are methods results. The paper reports two real single-transit fits with the published period fixed; they are not new epochs or detections, and the control offset shows that the formal sigma is not externally calibrated. The paper makes no discovery claim. Its useful output is a reproducible baseline and a docket for a human to take into a real target-and-sector analysis.

## Data availability

All inputs and outputs are in the repository `JDerifield-Physics`. The public archive responses are under `research/tess-timing/data/raw/`. The synthetic fixtures and run records are under `research/tess-timing/data/`. The real sector 56 light curve and target pixel file for HD 209458 b (TIC 420814525) are under `research/tess-timing/data/real-run/`, with the acquisition record in `research/tess-timing/data/real-run/acquisition.json` and `docs/TESS-REAL-TARGET.md`. The real light-curve diagnostic is `research/tess-timing/data/real-lc-run/diagnostics.json` (see `docs/TESS-REAL-LIGHTCURVE.md`). The real aperture record is `research/tess-timing/data/real-aperture-run/real_aperture.json` and `research/tess-timing/data/real-aperture-run/real_aperture.csv` (see `docs/TESS-REAL-APERTURE.md`). The predicted windows are `research/tess-timing/data/real-windows-run/windows.json` (see `docs/TESS-REAL-WINDOWS.md` and `docs/TESS-REAL-WINDOW-QC.md`). The detrending diagnostic is `research/tess-timing/data/real-detrend-run/detrend.json` and `research/tess-timing/data/real-detrend-run/detrend.csv` (see `docs/TESS-REAL-DETREND.md`). The KELT-11 b sector 9 products are under `research/tess-timing/data/real-run-2/`. The real single-transit fits are `research/tess-timing/data/second-target-run/analysis.json` and `research/tess-timing/data/sector56-control-run/analysis.json` (see `docs/TESS-SECOND-TARGET.md`). The correlated-noise diagnostic for the sector 56 series is `research/tess-timing/data/real-rednoise/rednoise.json` (see `docs/TESS-REAL-REDNOISE.md`). The committed milestone gate record is `docs/data/milestone-gate.json`, tabulated in `docs/FIRST-MILESTONE-GATE.md`, and reports PASS. The manuscript number record is `research/tess-timing/data/paper-numbers.json`. Both real fits are single-transit fits with the published period fixed and are not new epochs. The archive services are public and require no credential.

## Code availability

The pipeline is in `research/tess-timing/`. The scripts named in the figure captions generate the figures. The package version is 0.1.0. The analysis uses Python 3.12 with NumPy, SciPy, and Astropy (Harris et al. 2020; Virtanen et al. 2020; Astropy Collaboration 2022). The tests use pytest. The dependencies are declared in `research/tess-timing/pyproject.toml`, with pytest in the `test` extra. The full offline paper check is:

```bash
python research/tess-timing/scripts/check_paper.py
```

It exits nonzero if any of the offline checks fails.

The real-data diagnostics are generated by `research/tess-timing/scripts/real_lightcurve_diagnostics.py`, `research/tess-timing/scripts/real_aperture.py`, `research/tess-timing/scripts/real_window_qc.py`, and `research/tess-timing/scripts/real_detrend.py`. Acquisition is handled by `research/tess-timing/scripts/acquire_real_target.py` and `research/tess-timing/scripts/fetch_products.py`. The real single-transit fits are generated by `research/tess-timing/scripts/second_target_analysis.py`, with acquisition in `research/tess-timing/scripts/acquire_second_target.py`; the gate runs use `research/tess-timing/scripts/run_target.py` and `research/tess-timing/scripts/measure_target.py`. Their records are described in the `docs/TESS-REAL-*.md` files and `docs/TESS-REAL-DETREND.md`.

## References

Astropy Collaboration, Price-Whelan, A. M., Lim, P. L., et al. 2022, "The Astropy Project: Sustaining and Growing a Community-oriented Open-source Project and the Latest Major Release (v5.0) of the Core Package", The Astrophysical Journal, 935, 167. DOI: 10.3847/1538-4357/ac7c74.

Harris, C. R., Millman, K. J., van der Walt, S. J., et al. 2020, "Array programming with NumPy", Nature, 585, 357-362. DOI: 10.1038/s41586-020-2649-2.

Jenkins, J. M., Twicken, J. D., McCauliff, S., et al. 2016, "The TESS science processing operations center", SPIE Proceedings, 9913, 99133E. DOI: 10.1117/12.2233418.

Mandel, K., and Agol, E. 2002, "Analytic Light Curves for Planetary Transit Searches", The Astrophysical Journal, 580, L171-L175. DOI: 10.1086/345520.

NASA Exoplanet Archive. "Planetary Systems Composite Parameters (pscomppars)", IPAC, Caltech. Accessed 2026-10-22. https://exoplanetarchive.ipac.caltech.edu/

Ricker, G. R., Winn, J. N., Vanderspek, R., et al. 2015, "Transiting Exoplanet Survey Satellite", Journal of Astronomical Telescopes, Instruments, and Systems, 1, 014003. DOI: 10.1117/1.JATIS.1.1.014003.

Stassun, K. G., Oelkers, R. J., Paegert, M., et al. 2019, "The Revised TESS Input Catalog and Candidate Target List", The Astronomical Journal, 158, 138. DOI: 10.3847/1538-3881/ab3467.

Virtanen, P., Gommers, R., Oliphant, T. E., et al. 2020, "SciPy 1.0: fundamental algorithms for scientific computing in Python", Nature Methods, 17, 261-272. DOI: 10.1038/s41592-019-0686-2.

Mikulski Archive for Space Telescopes (MAST), Space Telescope Science Institute. Accessed 2026-10-22. https://mast.stsci.edu/

## Appendix A. Traceability of reported numbers

Every number in Sections 2.4 and 4.1 to 4.5 has an entry in `research/tess-timing/data/paper-numbers.json`. The entries below are the ones used most directly. A source path is relative to the repository root. Where a simple JSON or TOML field is given, `research/tess-timing/scripts/audit_paper_numbers.py` resolves and compares it. Where a derivation is given, the arithmetic is recorded in the JSON entry. Values that are transcribed from a named source, or that need a special case, are listed by name in `research/tess-timing/data/paper-numbers-audit.json`; the paper does not claim that every declared field is machine-read.

| Reported quantity | JSON key | Value | Source |
| --- | --- | ---: | --- |
| Archive rows evaluated | `archive_rows_evaluated` | 598 | `data/fetch-run/TARGETS.json`, `counts.evaluated` |
| Archive rows selected | `archive_rows_selected` | 545 | `data/fetch-run/TARGETS.json`, `counts.selected` |
| Sector-gate failures | `archive_rows_failed_sector_gate` | 53 | `data/fetch-run/TARGETS.json`, `counts.exclusion_reason_counts.sector_count` |
| Evaluated unique TICs | `archive_evaluated_unique_tic` | 531 | `data/fetch-run/TARGETS.json`, `counts.unique_tic_ids` |
| Selected unique TICs | `archive_selected_unique_tic` | 479 | `data/fetch-run/TARGETS.json`, `shortlist[].tic_id` |
| Docket rows | `docket_rows` | 304 | `data/target-docket/docket.json`, `counts.docket_rows` |
| Docket unique TICs | `docket_unique_tic` | 268 | `data/target-docket/docket.json`, `candidates[].tic_id` |
| Shortlist rows held `UNVERIFIED` (not in the docket) | `shortlist_held_unverified` | 241 | `data/target-docket/docket.json`, `counts.unverified` |
| Predicted epochs | `epoch_predictions` | 1,986 | `data/epoch-sheet/epochs.json`, `counts.predictions` |
| Prediction sectors | `epoch_unique_sectors` | 106 | `data/epoch-sheet/epochs.json`, `counts.unique_sectors` |
| Predictions with uncertainty | `epoch_predictions_with_uncertainty` | 1,965 | `data/epoch-sheet/epochs.json`, `counts.predictions_with_uncertainty` |
| Predictions without uncertainty | `epoch_predictions_without_uncertainty` | 21 | `data/epoch-sheet/epochs.json`, `counts.predictions_without_uncertainty` |
| MAST rows returned | `mast_rows_returned` | 6,557 | `data/fetch-run/TARGETS.json`, `counts.mast_rows` |
| MAST rows used | `mast_rows_used` | 5,014 | `data/fetch-run/TARGETS.json`, `mast_parse.used` |
| MAST long spans dropped | `mast_rows_long_span_dropped` | 1,543 | `data/fetch-run/TARGETS.json`, `mast_parse.long_span` |
| MAST targets | `mast_targets` | 527 | `data/fetch-run/TARGETS.json`, `mast_parse.targets` |
| Light-curve input cadences | `lightcurve_input_rows` | 12 | `data/lightcurve-run/synthetic_lightcurve.json`, `cadence_counts.input_rows` |
| Quality-mask removals | `lightcurve_removed_by_quality_mask` | 3 | `data/lightcurve-run/synthetic_lightcurve.json`, `cadence_counts.removed_by_quality_mask` |
| Non-finite flux removals | `lightcurve_removed_nonfinite_flux` | 1 | `data/lightcurve-run/synthetic_lightcurve.json`, `cadence_counts.removed_nonfinite_flux` |
| Retained cadences | `lightcurve_retained` | 8 | `data/lightcurve-run/synthetic_lightcurve.json`, `cadence_counts.retained` |
| Longest gap | `lightcurve_longest_gap_seconds` | 720 s | `data/lightcurve-run/synthetic_lightcurve.json`, `gaps.longest_gap_seconds` |
| Gap threshold | `lightcurve_gap_threshold_seconds` | 180 s | `data/lightcurve-run/synthetic_lightcurve.json`, `gaps.gap_threshold_seconds` |
| Aperture pixels | `aperture_pixels` | 9 | `data/aperture-run/synthetic_tpf.json`, `aperture.aperture_pixel_count` |
| Annulus pixels | `aperture_annulus_pixels` | 28 | `data/aperture-run/synthetic_tpf.json`, `aperture.annulus_pixel_count` |
| First aperture flux | `aperture_first_flux` | 1600 e-/s | `data/aperture-run/synthetic_tpf.csv`, row 1, `aperture_flux` |
| First aperture error | `aperture_first_flux_error` | 41.1096 e-/s | `data/aperture-run/synthetic_tpf.csv`, row 1, `aperture_flux_err` |
| First relative error | `aperture_first_relative_error` | 0.025694 | `data/aperture-run/synthetic_tpf.csv`, `aperture_flux_err / aperture_flux` |
| SAP Pearson r | `aperture_sap_pearson_r` | 1.0 | `data/aperture-run/synthetic_tpf.json`, `comparison.sap.pearson_r` |
| PDCSAP Pearson r | `aperture_pdcsap_pearson_r` | 0.9998469 | `data/aperture-run/synthetic_tpf.json`, `comparison.pdcsap.pearson_r` |
| SAP RMS | `aperture_sap_rms_ppm` | 753.131 ppm | `data/aperture-run/synthetic_tpf.json`, `comparison.sap.rms_difference_ppm` |
| PDCSAP RMS | `aperture_pdcsap_rms_ppm` | 300.633 ppm | `data/aperture-run/synthetic_tpf.json`, `comparison.pdcsap.rms_difference_ppm` |
| Transit fit cadences | `transit_cadence_count` | 19,441 | `data/transit-fit-run/transit_fit.json`, `fit.cadence_count` |
| In-transit cadences | `transit_in_transit_cadences` | 920 | `data/transit-fit-run/transit_fit.json`, `fit.in_transit_cadences` |
| Fit RMS | `transit_rms_ppm` | 199.595 ppm | `data/transit-fit-run/transit_fit.json`, `fit.rms_ppm` |
| Fit chi-square per dof | `transit_chi_square_per_dof` | 0.99621 | `data/transit-fit-run/transit_fit.json`, `fit.chi_square_per_dof` |
| Fit period | `transit_fit_period` | 3.4999951 d | `data/transit-fit-run/transit_fit.json`, `fit.parameters.period` |
| Fit period uncertainty | `transit_fit_period_uncertainty` | 0.0000025 d | `data/transit-fit-run/transit_fit.json`, `fit.uncertainties.period` |
| Fit depth | `transit_fit_depth` | 0.01199967 | `data/transit-fit-run/transit_fit.json`, `fit.parameters.depth` |
| Fit duration | `transit_fit_duration` | 0.15999277 d | `data/transit-fit-run/transit_fit.json`, `fit.parameters.duration` |
| Measured epochs | `epoch_events_measured` | 8 | `data/epoch-fold-run/epoch_measurements.json`, `counts.events_measured` |
| Line-fit period | `epoch_line_period` | 3.499995199 d | `data/epoch-fold-run/epoch_measurements.json`, `linear_fit.period_days` |
| Line-fit chi-square per dof | `epoch_line_chi_square_per_dof` | 0.427 | `data/epoch-fold-run/epoch_measurements.json`, `linear_fit.chi_square_per_dof` |
| Injection bias | `injection_bias_seconds` | -0.055 s | `data/injection-run/injection.json`, `aggregates.bias_seconds` |
| Median reported sigma | `injection_median_sigma_seconds` | 1.665 s | `data/injection-run/injection.json`, `aggregates.median_reported_sigma_t0_seconds` |
| Bias / median sigma | `injection_bias_over_median_sigma` | 0.033 | `data/injection-run/injection.json`, `aggregates.bias_over_median_sigma` |
| Injection scatter | `injection_scatter_seconds` | 1.218 s | `data/injection-run/injection.json`, `aggregates.scatter_seconds` |
| Pull RMS | `injection_pull_rms` | 0.627 | `data/injection-run/injection.json`, `aggregates.pull_rms` |
| Gate threshold | `injection_gate_threshold` | 0.2 | `data/injection-run/injection.json`, `gate.threshold` |
| Gate result | `injection_gate_passes` | true | `data/injection-run/injection.json`, `gate.passes` |
| KELT-11 b fitted mid-transit | `kelt11_fit_t0_btjd` | 1553.816219 BTJD | `data/second-target-run/analysis.json`, `fit.parameters.t0` |
| KELT-11 b formal `t0` sigma | `kelt11_fit_t0_uncertainty_seconds` | 80.3 s | `data/second-target-run/analysis.json`, `fit.uncertainties.t0 * 86400` |
| KELT-11 b offset from prediction | `kelt11_offset_seconds` | 229.8 s | `data/second-target-run/analysis.json`, `fit.offset_vs_prediction_seconds` |
| KELT-11 b offset in reported sigma | `kelt11_offset_sigma` | 2.86 | `data/second-target-run/analysis.json`, `fit.offset_sigma` |
| KELT-11 b residual RMS | `kelt11_rms_ppm` | 694.6 ppm | `data/second-target-run/analysis.json`, `fit.rms_ppm` |
| HD 209458 b fitted mid-transit | `hd209458_fit_t0_btjd` | 2840.878747 BTJD | `data/sector56-control-run/analysis.json`, `fit.parameters.t0` |
| HD 209458 b formal `t0` sigma | `hd209458_fit_t0_uncertainty_seconds` | 2.3 s | `data/sector56-control-run/analysis.json`, `fit.uncertainties.t0 * 86400` |
| HD 209458 b offset from prediction | `hd209458_offset_seconds` | -13.0 s | `data/sector56-control-run/analysis.json`, `fit.offset_vs_prediction_seconds` |
| HD 209458 b offset in reported sigma | `hd209458_offset_sigma` | -5.62 | `data/sector56-control-run/analysis.json`, `fit.offset_sigma` |
| HD 209458 b residual RMS | `hd209458_rms_ppm` | 586.0 ppm | `data/sector56-control-run/analysis.json`, `fit.rms_ppm` |
| Milestone gate criteria passed | `milestone_gate_passed` | 5 | `docs/data/milestone-gate.json`, `overall.passed` |
| Milestone gate criteria failed | `milestone_gate_failed` | 0 | `docs/data/milestone-gate.json`, `overall.failed` |
| Milestone gate live runtime | `milestone_gate_live_runtime_seconds` | 248.93046880001202 s | `docs/data/milestone-gate.json`, `entry_run.runtime_seconds` |

Table A1. Principal traceability entries. The full set of 198 quantities, plus four figure digests in a separate `figures` object, is in `research/tess-timing/data/paper-numbers.json`. Rounding in the text does not change the stored value.

Two source records deserve a note. The archive JSON stores `counts.unique_tic_ids` as 531, which is the number of unique TICs among all 598 evaluated rows. It is not the number of unique hosts among the 545 selected rows; that number is 479 and is derived from the shortlist array. The transit fit JSON stores the fit epoch near the middle of the light curve, 3014.6000106 BTJD. The text compares it with the injected model at the same cycle, fourteen days after the injected reference epoch, rather than shifting by the fitted period. Both choices avoid treating a whole-period relabelling as a physical measurement.
