# Research log — UQO WP 24 "From Labor to Capital" Chronological record of completed steps, assumptions taken, residuals, unresolved problems and next actions (required by CLAUDE.md). Dates are 2026-10-27 unless stated. ## Stage A — Source audit (done) * Downloaded the NBER conference PDF (20 pp., July 4 2025 draft) and wrote `docs/source_audit.md` with page references for every primitive, definition and proposition (P1–P11). Observations: no proofs in the source, compute is an endowment, no capital/prices/ownership; P6's own caveat (p. 11) identifies scarce resources as the point of failure of the wage result. * Literature matrix and 118 verified references delivered by the bibliography task (`docs/literature_matrix.md`, `docs/references_verification.md`); 6 entries flagged PARTIAL, none invented. ## Stage B — Smallest exact benchmark (done) * `tasks.py` reproduces Restrepo's static economy with 4 bottleneck + 2 accessory task classes and CES σ_B = 0.5. On a grid Q ∈ {0,…,1e5}: A constant from Q = 5 on, Y linear in Q (slope = A to 1e-6), w_H = A·CEU(H) = 8A, w_L = 2A < 3A = A·CEU(L) (the accessory task with the highest α is not worth automating: the skill is in Restrepo's group 𝒩 and gets the discounted \widetilde{CEU}), labor share 1 → 4e-4, compute share → 1, total wages higher than pre-AGI. Tests in `tests/test_static.py` (P1–P6). * A nuance not in the source: the "discount" of P4 arises whenever the max-α task of a skill is not automated, even if nobody works in it (accessory output abandoned entirely because its marginal value Zγ_a is below the wage available in bottleneck tasks). * Observation on definitions: with a CES aggregator every task is a bottleneck unless the elasticity is infinite; accessory work in the sense of Definition 2 requires asymptotically linear entry. ## Stage C/D — Two-class, four-capital model and solver (done, with lessons) * Static block: SLSQP on scaled variables + Newton polish of the KKT equalities on the active set; the polished solution is independent of the warm start (banded FD Jacobian matches a dense one to 6e-10). Accepting the polish on its residual rather than on fsolve's status flag was necessary (10 % of calls were rejected with residuals of 1e-18). * Accounting identity GDP = factor payments holds to 1e-8 and a deliberately broken version (compute services counted as final output) is caught by `test_income_identity_fails_when_accounting_is_broken`. * Harrod-neutral trend growth on labor, land and the energy resource (TFP constant) gives an exact frozen-AI BGP (residual 2.5e-8 at the BGP guess). A first version with Hicks-neutral Z growing at g produced rentals growing at 1.5 %/yr — not a BGP — and was corrected. * **Lesson 1 (calibration must match the scenario's anticipated prices).** Calibrating the 2026 compute rental with the user cost of a *declining* price (g_pQ = 0.15) and then solving a scenario with a different g_pQ creates a jump at t = 0 (compute Euler off by 60 %), the task block switches regime (task 1 fully automated) and the Newton system becomes nearly singular along the (K_Q, r) direction. With the base point re-calibrated for each scenario's technology rates (`calibrate(overrides=…)`), the frozen case converges in 5 iterations to 1.8e-10. * **Lesson 2 (accessory tasks and energy).** With a linear accessory block and an energy constraint, the marginal value of compute is bounded below by Zγ_a/α_a while the marginal value of energy in the core (σ_T < 1) is bounded above; as ε_t → 0 compute would absorb all energy to produce accessory output and core output would collapse. Accessory tasks are therefore kept in the analytical replication only. * **Lesson 3 (scenario magnitudes).** g_pQ = 0.28 with a floor at 1e-5 and g_alpha = 0.2 produce compute stocks growing by e^40 within the horizon and no terminal state close to a BGP; the solver cannot find a 30-year path. The baseline uses g_pQ = 0.15 (floor 1e-3, Moore's law ends ≈ 2072), g_eps = 0.10, g_alpha = 0.15; the Epoch value (0.34) is a scenario. * Solver: banded Newton (colored FD Jacobian, band 2) with backtracking; homotopy in the size of the shock on T = 40; horizon continuation 40 → 80 → 140 → 200 → 275; truncation check with 50 extra years. A trust-region least-squares alternative (`solve_trf`) was tried and found much slower. ## Stage E — Asset pricing (implemented in `transition.py`) * Tobin's q per capital type, ex-dividend equity values, net payouts (negative = issuance), land prices by backward recursion with a Gordon terminal value, aggregate wealth = sum of claims. Decompositions in `analysis.py` (to do: Campbell–Shiller exact under perfect foresight). ## Stage F — Propositions (in progress) * Regime theorem drafted (see `paper/sections/theory.tex`): labor share → 0 is robust; wage level and the destination of income depend on whether compute is an endowment or a priced reproducible capital good and on the elasticity between the task composite and scarce complements. ## Stage G — Heterogeneous agents (implemented, GE loop to do) * `households.py`: EGM with housing-inclusive price index, Rouwenhorst(5), 3 discount types × 2 skills, 300-point grid; stationary solution in ≈ 1 s. At the reference prices β = (0.93, 0.97, 0.993) with masses (0.5, 0.3, 0.2) give wealth 8.3 × GDP, Gini 0.80, top-10 % share 65 %, top-1 % 13 % (data 32.5 %: not reachable without return heterogeneity — reported as an untargeted moment). ## Stage H — Data (done) * 162 targets retrieved (`data/processed/calibration_targets.csv`), all with URLs, vintages and sha256; FRED reached through a browser-fetch fallback (Akamai timeouts), documented in `data/raw/fred/_RETRIEVAL_NOTE.md`. ## Open problems / next actions 1. Run the scenario catalogue on the cluster; check horizon truncation for the explosive scenarios. 2. HA general-equilibrium loop (relaxation on the interest-rate path) for baseline + 3 scenarios. 3. Stochastic AGI-arrival extension (risk premia) in a two-regime version. 4. Empirical design section (industry exposure × margins/valuation) — design only.