=== RESEARCH ===
{'issue': 283, 'kind': 'docs', 'defect_status': 'confirmed', 'category': 'prose-fix', 'target_files': ['docs/src/did.md', 'docs/src/event_study.md'], 'summary': "Correct two wrong keyword-table defaults: did.md leads 3→0 and event_study.md lags 0→4, matching current src signatures; full sweep of both pages' keyword tables finds no other drift.", 'current_state': 'Both defects are STILL present at the release/v0.6.6 tip. (1) docs/src/did.md:240 keyword table for estimate_did reads `| `leads` | `Int` | `3` | Pre-treatment event-time window ``K`` |`, but source signature src/did/estimation.jl:69 (docstring copy at :17, prose at :38) is `leads::Int=0`. (2) docs/src/event_study.md:156 keyword table for estimate_event_study_lp reads `| `lags` | `Int` | `0` | Lagged outcome controls |`, but source signature src/did/event_study.jl:54 (docstring copy at :24, prose at :40) is `lags::Int=4`. FULL SWEEP performed: every other row in the did.md table (lines 239-246: method=:twfe, horizon=5, control_group=:never_treated, cluster=:unit, conf_level=0.95, base_period=:varying, n_boot=200) matches src/did/estimation.jl:66-76 exactly; every other row in the event_study.md estimate_event_study_lp table (lines 155,157-159: leads=3, covariates=String[], cluster=:unit, conf_level=0.95) matches src/did/event_study.jl:52-57; and the SECOND keyword table on event_study.md (lines 262-282, estimate_lp_did) is fully correct against src/did/lpdid.jl:60-80 (pre_window=3, post_window=H, ylags=0, dylags=0, covariates=String[], nonabsorbing=nothing, notyet/nevertreated/firsttreat/oneoff/reweight/nocomp/only_pooled/only_event=false, pmd=nothing, cluster=:unit, conf_level=0.95, post_pooled/pre_pooled=nothing). Only the two flagged rows are wrong.', 'proposed_change': 'Two single-cell Markdown-table edits (Default column only): (1) docs/src/did.md:240 — change `| `leads` | `Int` | `3` | Pre-treatment event-time window ``K`` |` to `| `leads` | `Int` | `0` | Pre-treatment event-time window ``K`` |`. Source of truth: src/did/estimation.jl:69 `leads::Int=0`. (2) docs/src/event_study.md:156 — change `| `lags` | `Int` | `0` | Lagged outcome controls |` to `| `lags` | `Int` | `4` | Lagged outcome controls |`. Source of truth: src/did/event_study.jl:54 `lags::Int=4`. Do NOT touch any other rows — the full-sweep audit above shows every other documented default already matches its src signature. No @example output regression risk: all executed `@example did` / `@example event` blocks pass explicit `leads=`/`lags=` arguments (e.g. did.md:231 `leads=3, horizon=3`; event_study.md:30 `leads=3, lags=2`, :133 `lags=2`), so they never depend on the documented default and their rendered output is unchanged by these prose edits. No page relocation, no new page, no page-type retrofit — docs/make.jl:50-51 pages entries ("Difference-in-Differences" => "did.md", "Event Study LP" => "event_study.md") stay put and no cross-reference moves. docrule §Tables (defaults copied from current src signature) is the governing convention.', 'verify': 'julia --project=docs docs/verify_examples.jl docs/src/did.md && julia --project=docs docs/verify_examples.jl docs/src/event_study.md (both expect OK). Edits touch only Markdown table default-cells, so verify is a formality confirming the pages still build.', 'dependencies': [], 'collisions': ['docs/src/did.md — #288 ([T189] cross-section/panel MED sweep; audit report line 252 targets did.md:433-435 last-expression @example renders — different region from the keyword table at :240, but same file, sequence to avoid patch conflicts)', 'docs/src/event_study.md — #288 ([T189] cross-section/panel MED sweep may touch event_study.md last-expression renders; different region from the :156 table row)', 'docs/lint_docs.jl — #304 ([T205] keyword-table-default lint; adds a CI check that mechanically catches exactly this drift class — related, not a same-file edit; land #283 before/with #304 so the new lint passes)'], 'effort': 'S', 'risk': 'low'}

=== VERIFY ===
{'issue': 283, 'verdict': 'CONFIRMED', 'assessment': 'Both defects are real and STILL present at the current working-tree (branch release/v0.6.6). (1) docs/src/did.md:240 documents `leads` default as `3`, but src/did/estimation.jl:69 signature is `leads::Int=0`. (2) docs/src/event_study.md:156 documents `lags` default as `0`, but src/did/event_study.jl:54 signature is `lags::Int=4`. I independently re-read all four cited source loci plus both full keyword tables. The full-sweep claim holds: every other row in the did.md estimate_did table (239-246) matches estimation.jl:66-76; every other row in the event_study.md estimate_event_study_lp table (155-159) matches event_study.jl:52-57; and all 19 rows of the second event_study.md table (estimate_lp_did, 262-282) match lpdid.jl:62-80 exactly. The two proposed single-cell edits are exactly right and obey docrule §Tables (docrule.md:256-263: Default column keeps backtick code formatting; both `0` and `4` preserve backticks; description fragments untouched). event_study.md:176 (`lags`) is a 3-column struct-field return table with no Default column, so not a false extra defect. No @example output regression: all executed blocks pass explicit leads=/lags= args, and markdown table cells have no runtime effect anyway. Fix is correct AND complete.', 'corrections': '', 'collision_issues': [288], 'discriminating_power': 'n/a — docs-only prose/default-cell edits, no test assertions involved.', 'final_effort': 'S'}