=== RESEARCH ===
{'issue': 302, 'kind': 'docs', 'defect_status': 'confirmed', 'category': 'api-coverage-backfill', 'target_files': ['docs/src/structural_identification.md', 'docs/src/ia_irf.md', 'docs/src/lp.md', 'docs/src/gmm.md'], 'summary': 'Backfill a one-line prose + `@ref` (and, for estimators, a short recipe line) for the API-only exports on their natural narrative pages — concretely the 8 named functions on structural_identification.md / ia_irf.md / lp.md now, with the 13 GMM/SMM symbols deferred to gmm.md once T197 creates it.', 'current_state': 'Defect still present. All 8 named user-facing exports are confirmed exported and confirmed to have NO narrative-page mention at current tree (release/v0.6.6 tip). Exports: `identify_cholesky` (src/MacroEconometricModels.jl:637; def src/core/identification.jl:19), `identify_long_run` (export :640; def identification.jl:202), `compute_irf` (export :642; def identification.jl:45), `estimate_lp_multi`+`estimate_lp_cholesky`+`compare_var_lp` (export :733; defs src/lp/core.jl:322/337/604), `estimate_propensity_score` (export :756; def src/lp/propensity.jl:19), `estimate_lp_gmm` (export :766; def src/gmm/gmm.jl:623). Coverage grep over docs/src/*.md: `identify_cholesky`/`identify_long_run` appear ONLY in the reference page docs/src/api.md (Quick Reference Table rows 101/103), never on a narrative page; `compute_irf`, `estimate_lp_cholesky`, `estimate_lp_multi`, `compare_var_lp`, `estimate_lp_gmm`, `estimate_propensity_score` appear on NO docs/src page at all (lp.md uses only `estimate_lp`/`estimate_lp_iv`/`structural_lp`/`estimate_propensity_lp`/`doubly_robust_lp`, never these). gmm.md does NOT exist (confirmed by ls) so the 13 GMM/SMM symbols have no narrative home yet. All target functions ARE covered by @autodocs in api_functions.md (Pages=["core/identification.jl"] :242, ["lp/core.jl"] :314, ["lp/propensity.jl"] :346, ["gmm/gmm.jl"] :469), so [`fn`](@ref) cross-references will resolve. The "105 count" from the 2026-07-03 audit (docs/plans/2026-07-03-documentation-audit-report.md:386,404-406) is audit-time and may have drifted, but the underlying coverage gap for the named symbols is real.', 'proposed_change': 'Add brief narrative mentions on the natural owning pages. Additions are prose + `@ref`; estimators get one short recipe line. Do NOT create new pages (per issue instruction 4).\n\n1) docs/src/structural_identification.md — `identify_cholesky` in the "## Cholesky (Recursive)" section (currently at line 84; re-grep, lines drift): after the existing `@example sid` block (the one at ~97-100 that already defines `model = estimate_var(Y, 2; ...)`), add a sentence + inline call, e.g. append inside that same `@example sid` block `B0 = identify_cholesky(model)  # lower-triangular impact matrix B0 = chol(Sigma)` and one prose line: "The impact matrix itself is available directly via [`identify_cholesky`](@ref)." Similarly in "## Long-Run (Blanchard-Quah)" (currently line 188) add a prose line "The long-run identification is computed by [`identify_long_run`](@ref), which returns the Blanchard-Quah impact matrix." (bare `@ref` is sufficient for these accessor-style functions per issue instr. 3; an example line is a bonus since `model` is in scope in that page\'s `@example` blocks).\n\n2) docs/src/ia_irf.md — `compute_irf`: add one prose sentence in the methods/interpretation area (e.g. near the IRF-methods table region ~line 82-87 of innovation_accounting.md\'s analog, or after the first `irf(model, 20)` example ~line 22 here): "Internally, `irf` builds the structural IRF from the reduced-form MA coefficients and the identified rotation via [`compute_irf`](@ref)`(model, Q, horizon)`, which is exposed for advanced users who supply their own `Q`." Bare `@ref` only (utility building block).\n\n3) docs/src/lp.md — add mentions on the natural sections (re-grep anchors; current: "## Standard Local Projections" 96, "## Propensity Score Local Projections" 472, "## Structural Local Projections" 586, "## LP vs. VAR" 845):\n   - `estimate_lp_cholesky` and `estimate_lp_multi`: in "## Standard Local Projections" add one line each — "For Cholesky-identified structural LP-IRFs in one call, use [`estimate_lp_cholesky`](@ref); to estimate responses to several shock variables at once, use [`estimate_lp_multi`](@ref)."\n   - `compare_var_lp`: in "## LP vs. VAR" (line 845) add a recipe line: "```julia\\ncmp = compare_var_lp(Y, 20; lags=4)\\n```\\nThe [`compare_var_lp`](@ref) helper estimates both a VAR and an LP on the same data and returns their IRFs side by side for the bias/variance comparison discussed above." (Prefer a `julia` fenced block, NOT `@example`, unless a `@setup Y` is already in scope on lp.md — verify; the page\'s other `@example` blocks reference `Y`, so an `@example` block is acceptable if the setup defines `Y`.)\n   - `estimate_propensity_score`: in "## Propensity Score Local Projections" (line 472) add "The propensity scores are fit internally by [`estimate_propensity_score`](@ref); call it directly if you need the fitted logit scores outside the LP pipeline."\n   - `estimate_lp_gmm`: in "## Structural Local Projections" (line 586) add "[`estimate_lp_gmm`](@ref) fits GMM/IV-style local projections using the moment conditions in `lp_gmm_moments`." (This function lives in src/gmm/gmm.jl:623 but is an LP estimator; per issue instr. 2 it belongs on lp.md, not gmm.md.)\n\n4) docs/src/gmm.md — the 13 GMM/SMM symbols (AbstractGMMModel, GMMModel, GMMWeighting [MEM.jl:550]; estimate_gmm, gmm_objective, gmm_summary [:763]; linear_gmm_solve, gmm_sandwich_vcov, andrews_lu_mmsc [:767]; SMMModel, estimate_smm, autocovariance_moments, autocovariance_moment_contributions [:769]) must each be mentioned there. gmm.md does NOT exist yet — this bullet is BLOCKED on T197 (#296). When implementing T203, confirm gmm.md exists and grep it for all 13; if T197 already covers them, this bullet is verification-only (issue acceptance already says "confirm all 13 are mentioned there").\n\n5) Residue (the "~105" backfill): regenerate the API-only set mechanically per issue instruction 1 — take the export list from src/MacroEconometricModels.jl, subtract every symbol occurring on any docs/src/*.md NARRATIVE page (exclude api.md/api_functions.md/api_types.md from the "narrative" set), subtract symbols now covered by gmm.md (T197). For each remaining user-facing estimator add a one-line recipe on its owning page; for terse accessors/utilities a bare `@ref` sentence suffices, or justify the residue explicitly in the PR body (issue accepts an explicitly-justified residue). Keep additions brief and on the right page; follow docs/docrule.md Cross-Reference Requirements and Section Pattern.', 'verify': "Per edited page: `julia --project=docs docs/verify_examples.jl docs/src/structural_identification.md`, `... docs/src/ia_irf.md`, `... docs/src/lp.md`, and (once T197 lands) `... docs/src/gmm.md` — each must report OK. If any addition uses `@example` rather than a plain `julia` fence, verify_examples actually executes it, so confirm `Y`/`model` are already in that page's `@setup`/prior `@example` scope before adding. A no-run sanity check that the coverage gap is closed: re-grep each symbol on its owning narrative page (e.g. `grep -c identify_cholesky docs/src/structural_identification.md` > 0). Do NOT run makedocs or the test suite for this task.", 'dependencies': [296, 295], 'collisions': ['docs/src/lp.md — #287 (T188 multivariate MED sweep, edits lp defaults)', 'docs/src/lp.md — #292 (T193 multivariate/panel LOW polish sweep)', 'docs/src/structural_identification.md — #290 (T191 identification+IA MED sweep)', 'docs/src/structural_identification.md — #293 (T194 identification+IA LOW polish sweep)', 'docs/src/ia_irf.md — #290 (T191 identification+IA MED sweep)', 'docs/src/ia_irf.md — #293 (T194 identification+IA LOW polish sweep)', 'docs/src/gmm.md — #296 (T197 creates the page; hard dependency, not a merge conflict)', 'docs/src/api.md/api_functions.md — #301 (T202 splits the API reference; related, but T203 edits narrative pages so no direct overlap)'], 'effort': 'L', 'risk': 'low'}

=== VERIFY ===
{'issue': 302, 'verdict': 'CORRECTED', 'assessment': "Defect is REAL and reproduced at the current tree (HEAD 9ad4818 on release/v0.6.6), not stale. Verified independently: (a) all 8 named exports exist at the exact cited lines in src/MacroEconometricModels.jl (637/640/642/733/756/766); (b) grep over docs/src/*.md shows identify_cholesky/identify_long_run only in api.md (rows 101/103) and the other 6 on no page; (c) gmm.md does not exist (ls); (d) api_functions.md @autodocs Pages directives at :242/:314/:346/:469 guarantee @ref resolution; (e) all section anchors and @setup/@example variable scope (model in structural_identification.md 97-100 & 202-205; Y in lp.md @setup 16-23; model in ia_irf.md @setup) are confirmed. Function-prose descriptions are accurate against source for identify_cholesky (returns L=chol(Σ), the impact matrix), compute_irf (irf DOES call it at src/core/irf.jl:56; computes from MA coeffs + rotation Q), estimate_lp_multi, estimate_lp_cholesky, compare_var_lp (sig compare_var_lp(Y,horizon;lags=4) matches the recipe exactly, returns NamedTuple), estimate_propensity_score (fits logit/probit scores), and estimate_lp_gmm (uses lp_gmm_moments). The approach obeys docrule.md (Section Pattern, Cross-Reference format, no hedging). HOWEVER the spec contains one factual error: identify_long_run does NOT return the impact matrix — it returns the orthogonal rotation Q (verified QQ'=I; compute_Q(:long_run) returns it and compute_irf forms impact=chol(Σ)·Q). Collisions #287/#290/#292/#293/#295/#296/#301 all confirmed OPEN; bullet 4 (gmm.md) genuinely blocked on #296.", 'corrections': "MUST-FIX (bullet 1, identify_long_run): The proposed sentence 'The long-run identification is computed by [`identify_long_run`](@ref), which returns the Blanchard-Quah impact matrix.' is FACTUALLY WRONG. `identify_long_run(model)` returns `safe_cholesky(model.Sigma) \\ P` = L⁻¹P (src/core/identification.jl:202-218); `compute_Q(:long_run)` returns this value (identification.jl:302) and `compute_irf` uses it AS `Q` (impact = chol(Σ)·Q). I verified QQ'=I, so it is the orthogonal ROTATION, not the impact matrix — the OPPOSITE convention from `identify_cholesky` (which does return the impact matrix L). Rewrite to, e.g.: 'The long-run identification is computed by [`identify_long_run`](@ref), which returns the orthogonal rotation `Q` implementing the Blanchard–Quah restriction (the structural impact matrix is then `chol(Σ)·Q`).' Do NOT describe both accessors as 'returns the impact matrix'. The identify_cholesky prose (bullet 1) is correct as-is.\n\nREFINEMENT (bullet 3, compare_var_lp): Y IS in the `@setup lp` scope (lp.md:16-23), so per docrule Anti-Pattern 12 use an `@example lp` block, not a bare `julia` fence. BUT `compare_var_lp` returns a plain NamedTuple with no `report()` method, so ending the block with a bare `cmp = compare_var_lp(Y, 20; lags=4)` dumps a raw NamedTuple of three arrays — violates Anti-Pattern 9 ('raw output without interpretation'). End the block with `nothing # hide` (keep the prose) or display a specific field via `round.(cmp.difference, digits=3)`.\n\nMINOR (bullet 1, identify_cholesky example): appending `B0 = identify_cholesky(model)` as the last line of the @example sid block (97-100) will print the 3×3 matrix; add `nothing # hide` or interpret it to match page style. `model` is guaranteed in scope (re-defined at line 98).\n\nSEQUENCING: bullet 4 (13 GMM/SMM symbols on gmm.md) is BLOCKED — gmm.md is created by #296 (T197, OPEN); do not attempt until it lands, then verification-only. Re-grep all anchor line numbers at implementation time — #287/#290/#292/#293 are page sweeps on lp.md and structural_identification.md/ia_irf.md that will drift lines. Note #301 (T202) may split api_functions.md, but @ref resolves by symbol not page, so cross-refs remain valid.", 'collision_issues': [287, 290, 292, 293, 295, 296, 301], 'discriminating_power': 'n/a (documentation task, no test assertions)', 'final_effort': 'L'}