from __future__ import annotations
import json
from pathlib import Path
ROOT=Path(__file__).resolve().parent
DOI="10.5281/zenodo.21904782"
DOI_URL=f"https://doi.org/{DOI}"
DOI_NOTICE=f"預留DOI：{DOI}；本地回填候選，Zenodo發布與網站部署僅由外層機器閘門執行。"

def p(value): return {"type":"paragraph","value":value}
def h(value): return {"type":"subheading","value":value}
def call(value): return {"type":"callout","value":value}
def li(*items,ordered=False): return {"type":"list","value":{"ordered":ordered,"items":list(items)}}
def table(rows): return {"type":"table","value":rows}
def fig(path,caption): return {"type":"figure","value":{"path":path,"caption":caption}}

def main():
    r=json.loads((ROOT/"outputs"/"analysis-results.json").read_text(encoding="utf-8")); latest=r["latest"]; rev=r["revisionAudit"]
    title="上游漲得更快，為何不能直接推論CPI？2025–2026年臺灣消費者、生產者與進出口物價指數落差的官方資料稽核"
    sections=[
      {"title":"摘要","blocks":[p(f'本研究建立2025年1月至2026年7月共{r["dataPeriod"]["months"]}個月的主計總處首發版年增率表，並以勞動部政府JSON白名單快照檢查資料版本。2026年7月CPI年增率為{latest["cpi_yoy"]:.2f}%，PPI為{latest["ppi_yoy"]:.2f}%，美元計價IPI與EPI分別為{latest["ipi_usd_yoy"]:.2f}%與{latest["epi_usd_yoy"]:.2f}%；相對CPI的算術點差分別為{latest["ppi_minus_cpi_pp"]:.2f}、{latest["ipi_minus_cpi_pp"]:.2f}與{latest["epi_minus_cpi_pp"]:.2f}個百分點。這些差值只描述同期年增率的距離，不是成本傳遞率。'),
        p(f'跨來源稽核有{rev["overlapMonths"]}個重疊月份；機器快照相對首發新聞稿的最大CPI與PPI絕對差分別為{rev["maxAbsoluteCpiDeltaPp"]:.2f}與{rev["maxAbsolutePpiDeltaPp"]:.2f}個百分點，顯示版本日期必須與數值一起保存。2025年5月至12月PPI連續8個月為負，而CPI全年各月均為正，構成「上游與消費端必然同向」的反例。短樣本、不同權數、美元／新臺幣幣別差異、基期效果與行政價格，使本文不能估計傳遞係數、預測未來CPI或判定政策效果。'),
        call(f'{DOI_NOTICE}本文為公開研究工作論文，未經外部同儕審查。')]},
      {"title":"Abstract","blocks":[p(f'This working paper constructs a {r["dataPeriod"]["months"]}-month release-vintage panel of Taiwan CPI, PPI, and U.S.-dollar-denominated import and export price inflation from January 2025 through July 2026, then cross-checks overlapping values against a whitelisted snapshot from an official machine-readable JSON endpoint. In July 2026 the four year-on-year rates were {latest["cpi_yoy"]:.2f}%, {latest["ppi_yoy"]:.2f}%, {latest["ipi_usd_yoy"]:.2f}%, and {latest["epi_usd_yoy"]:.2f}%, respectively. Their arithmetic gaps are descriptive distances, not pass-through estimates.'),
        p('The audit preserves release dates and later revision markers, presents counterexamples, and explicitly separates index scope, weighting, currency denomination, and vintage. With only nineteen observations and no identification design, the study makes no causal, forecasting, or policy-effect claim.') ]},
      {"title":"一、研究問題與新增價值","blocks":[p('2026年8月6日主計總處發布7月物價：CPI年增率仍在低個位數，但PPI與美元計價進出口物價年增率較高。公共討論很容易把這個落差縮寫成「上游成本遲早完整轉嫁」。本研究只問三個可重現問題：四項首發年增率如何演變？同期算術點差多大？後續機器資料是否與首發版完全相同？'),
        p('既有SHWRP-2026-028處理2002–2026金融壓力與糧價傳遞；本研究不同之處是只處理2025–2026全體物價指數、保留首發資料版本，並把跨官方端點的修訂差異納入核心結果。新增價值是測量與版本治理，不是另一個因果傳遞模型。'),
        li('問題一：2025-01至2026-07四項年增率的方向、範圍與最新值為何？','問題二：PPI、美元IPI、美元EPI相對CPI的同月點差為何？','問題三：首發新聞稿與2026-08-12機器快照的重疊數值是否一致？',ordered=True)]},
      {"title":"二、資料、權利與版本","blocks":[p('核心表逐月轉錄主計總處正式新聞稿標題，每列保留期間、發布日、CPI、PPI、美元IPI、美元EPI及直接網址。新聞稿標題是正式表格結構；精確數值可逐列回查。政府資料開放平臺另確認CPI XML資料集、欄位、月更新與政府資料開放授權條款。'),
        p('第二個量化來源是勞動部「每月國內主要經濟指標」JSON。擷取程式只保留日期、CPI/PPI指數及年增率五個欄位，完整回應不落地，只保存回應bytes與SHA-256。該資料集本身提醒使用者引用時回權責機關確認，因此它只用於修訂稽核，不取代主計總處首發版。'),
        p('中央銀行2026年6月理監事會資料提供能源、進口物價、服務通膨與供給面措施等替代解釋脈絡；IMF與臺灣既有學術研究只用來說明傳遞通常涉及部門、時間、匯率與通膨制度，不把其他國家係數移植到臺灣2026短樣本。'),
        call('權利邊界：公開包只含白名單衍生數值、原回應雜湊、原創程式與圖表；不含完整第三方HTML、PDF、試算表、圖像、聯絡資料或個人資料。')]},
      {"title":"三、清理與分析方法","blocks":[p('民國年轉西元後按月份排序；「漲」為正、「跌」為負。程式要求19個不重複月份且端點必須是2025-01與2026-07。每個上游指數與CPI的點差是同月年增率直接相減，單位為百分點。'),
        p('機器JSON保留r、p等原字串，再擷取第一個有號數值；快照值減首發值形成修訂差。2026年1–7月的未加權月平均只用作樣本描述，不等於以指數水準計算的官方累計平均。本文不插補、不季調、不做迴歸、顯著性檢定或預測。'),
        table([['量','公式','可解讀','不可解讀'],['同期點差','上游年增率−CPI年增率','同月百分點距離','傳遞係數或因果效果'],['修訂差','機器快照−首發版','資料版本變動','原始發布錯誤'],['未加權月平均','各月年增率算術平均','短期樣本摘要','官方累計平均']])]},
      {"title":"四、結果：四條序列與同期點差","blocks":[fig('figures/figure-1-four-index-yoy.svg','圖1　四項首發年增率。IPI與EPI為美元計價；不同指數不可視為同一價格鏈的相同母體。'),
        p(f'2026年7月四項首發年增率為CPI {latest["cpi_yoy"]:.2f}%、PPI {latest["ppi_yoy"]:.2f}%、美元IPI {latest["ipi_usd_yoy"]:.2f}%與美元EPI {latest["epi_usd_yoy"]:.2f}%。PPI在2026年1月仍為負值，3月轉正後上升；CPI在全19個月份都為正。'),
        fig('figures/figure-2-upstream-cpi-gaps.svg','圖2　相對CPI的同月年增率算術點差。此圖不是成本傳遞率。'),
        table([['2026-07指標','年增率','相對CPI點差'],['CPI',f'{latest["cpi_yoy"]:.2f}%','0.00 pp'],['PPI',f'{latest["ppi_yoy"]:.2f}%',f'{latest["ppi_minus_cpi_pp"]:.2f} pp'],['IPI（美元）',f'{latest["ipi_usd_yoy"]:.2f}%',f'{latest["ipi_minus_cpi_pp"]:.2f} pp'],['EPI（美元）',f'{latest["epi_usd_yoy"]:.2f}%',f'{latest["epi_minus_cpi_pp"]:.2f} pp']]),
        p('點差擴大只說明同期年增率分離。PPI包含生產端權數，IPI／EPI以美元計價，而CPI反映家戶消費籃子；它們不是同一商品、同一幣別或同一交易階段的一對一序列。')]},
      {"title":"五、版本修訂稽核","blocks":[fig('figures/figure-3-revision-audit.svg','圖3　勞動部機器快照減主計總處首發版的年增率差。正負差異均可能來自後續修訂或來源更新時點。'),
        p(f'白名單機器快照與首發版共有{rev["overlapMonths"]}個月份。最大CPI絕對差為{rev["maxAbsoluteCpiDeltaPp"]:.2f}個百分點，最大PPI絕對差為{rev["maxAbsolutePpiDeltaPp"]:.2f}個百分點；最大任一差異出現在{rev["largestAnyDeltaPeriod"]}。這不是「哪個來源錯誤」的判定，而是證明數值必須綁定版本日期。'),
        p('可重現研究若只記「官方資料」而不記首發頁、快照日期與原回應雜湊，同一程式在未來可能得到不同結果。本包因此同時保留首發版表、機器快照白名單、原回應雜湊與修訂差表。')]},
      {"title":"六、反例、替代解釋與不確定性","blocks":[h('反例'),p('2025年5月至12月PPI連續8個月為負，CPI卻在2025年每月均為正；2026年1月至2月也出現CPI為正而PPI為負。這直接反駁「PPI與CPI必然同月同向」的簡化命題，但不能反過來證明兩者沒有較長期關係。'),
        h('替代解釋'),li('範圍與權數：CPI是家戶消費籃子，PPI是生產端，進出口物價是跨境商品。','幣別：本研究使用的IPI、EPI首發值為美元計價；匯率變化會改變新臺幣成本。','時間：存貨、契約、調價頻率、毛利與競爭可能產生不同時滯。','政策與行政價格：能源與其他供給面措施可能改變部分價格的當期表現。','基期與組成：年增率會受一年前基期與產品結構改變影響。'),
        h('不確定性'),p('19個月不足以辨識時滯、結構變動、季節性或政策衝擊。來源數值仍可能再修訂；本結論只對包內版本與2026-08-12證據截止日成立。')]},
      {"title":"七、限制與倫理邊界","blocks":[p('本文沒有產品層級成本、零售掃描資料、企業毛利、契約、匯率分解或政策反事實，因此不能估計成本傳遞、企業吸收比例、通膨預測或政策效果。月年增率具有序列相依與共同基期；本文不報相關係數或p值，避免短樣本製造精確感。'),
        p('本文不評比具名企業或產品，不判定漲價合理性、違法、囤積、失敗或動機。所有資料為全國彙總，無個人資料與精確位置。若來源更新，應新增版本並保留本版，而非覆寫數值。'),
        p('重現順序為：執行白名單擷取程式、核對原回應雜湊、執行分析程式、重建內容與PDF，最後比對PDF的SHA-256。若官方端點日後更新，擷取結果不應被當作本版原始快照；重現者應使用包內白名單快照與擷取證明，並把即時端點結果視為另一個資料版本。數值差異應先檢查發布版本、單位、幣別、期間與四捨五入，再討論實質變化。這項程序可降低靜默修訂造成的不可重現風險，但不能證明首發值或後續值具有較高真實性。') ]},
      {"title":"八、結論","blocks":[p(f'截至2026年7月，PPI、美元IPI與美元EPI年增率均高於CPI，三個同月點差分別為{latest["ppi_minus_cpi_pp"]:.2f}、{latest["ipi_minus_cpi_pp"]:.2f}與{latest["epi_minus_cpi_pp"]:.2f}個百分點。最穩健的結論不是「CPI必然追上」，而是四種指數在範圍、權數、幣別與版本上不能直接等同。'),
        p('對公共溝通而言，發布任何物價數值時至少應同時標示指數名稱、計價幣別、比較期間、首發或修訂版本及擷取日期。後續若要研究傳遞，需更長期資料、匯率與能源控制、部門投入產出權數，以及可識別的事件設計。'),call(DOI_NOTICE)]},
      {"title":"資料與來源索引","blocks":[p('核心官方發布：行政院主計總處2026-08-06物價新聞稿：https://www.stat.gov.tw/News_Content.aspx?n=3703&s=236540'),p('官方機器資料：勞動部每月國內主要經濟指標JSON：https://apiservice.mol.gov.tw/OdService/download/A17030000J-000016-xC8'),p('獨立政策脈絡：中央銀行2026-06-18理監事會決議：https://www.cbc.gov.tw/tw/cp-971-192417-50f40-1.html'),p('方法脈絡：IMF Working Paper 2016/023；Lin and Wu (2012), DOI 10.1016/j.iref.2011.09.003。完整來源、授權、擷取時間與限制見source-registry.json。')]}
    ]
    content={"schemaVersion":1,"reportNumber":"SHWRP-2026-039","version":"1.0","title":title,"doi":DOI,"doiUrl":DOI_URL,"zenodoUrl":DOI_URL,"zenodoDepositId":21904782,"doiNotice":DOI_NOTICE,"sections":sections}
    (ROOT/"paper-content.json").write_text(json.dumps(content,ensure_ascii=False,indent=2)+"\n",encoding="utf-8")
    md=[f'# {title}','', '周秉漢／CHOU, BING-HAN', '', 'ORCID: 0009-0000-7018-5096', '', '上好味研究工作論文系列｜SHWRP-2026-039｜版本1.0｜2026-08-12｜未經外部同儕審查', '', f'**預留DOI：[{DOI}]({DOI_URL})。本地回填不代表Zenodo已發布；發布與網站部署僅由外層機器閘門執行。**','']
    for section in sections:
        md += ['## '+section['title'],'']
        for block in section['blocks']:
            t=block['type']; v=block['value']
            if t in ('paragraph','callout'): md += [v,'']
            elif t=='subheading': md += ['### '+v,'']
            elif t=='list': md += [('\n'.join((f'{i+1}.' if v['ordered'] else '-')+' '+item for i,item in enumerate(v['items']))),'']
            elif t=='table': md += [' | '.join(v[0]),' | '.join(['---']*len(v[0]))]+[' | '.join(row) for row in v[1:]]+['']
            elif t=='figure': md += [f'![{v["caption"]}]({v["path"]})','']
    md += ['---','','CC BY 4.0僅適用於作者有權授權的原創分析、文字、研究程式及原創圖表；第三方內容仍依來源條款。','']
    (ROOT/"paper.md").write_text('\n'.join(md),encoding="utf-8")
    claims={"schemaVersion":1,"reportNumber":"SHWRP-2026-039","version":"1.0","claims":[
      {"claimId":"C01","claim":f'2026年7月CPI、PPI、美元IPI、美元EPI年增率分別為{latest["cpi_yoy"]:.2f}%、{latest["ppi_yoy"]:.2f}%、{latest["ipi_usd_yoy"]:.2f}%、{latest["epi_usd_yoy"]:.2f}%。',"sources":["S01"],"sourceFields":["period","cpi_yoy","ppi_yoy","ipi_usd_yoy","epi_usd_yoy"],"cleaningRules":["漲正跌負","逐月首發版"],"analysisCode":"analysis.py","outputs":["outputs/analysis-results.json#latest"]},
      {"claimId":"C02","claim":f'2026年7月相對CPI點差為{latest["ppi_minus_cpi_pp"]:.2f}、{latest["ipi_minus_cpi_pp"]:.2f}、{latest["epi_minus_cpi_pp"]:.2f}個百分點。',"sources":["S01"],"sourceFields":["four index yoy fields"],"cleaningRules":["同月算術相減","不得解讀為傳遞率"],"analysisCode":"analysis.py","outputs":["outputs/monthly-price-spreads.csv#2026-07"]},
      {"claimId":"C03","claim":f'機器快照與首發版{rev["overlapMonths"]}個重疊月中，最大CPI與PPI絕對修訂差為{rev["maxAbsoluteCpiDeltaPp"]:.2f}與{rev["maxAbsolutePpiDeltaPp"]:.2f}個百分點。',"sources":["S01","S03"],"sourceFields":["cpi_yoy_raw","ppi_yoy_raw"],"cleaningRules":["擷取有號數值","快照減首發"],"analysisCode":"analysis.py","outputs":["outputs/revision-audit.csv","outputs/analysis-results.json#revisionAudit"]},
      {"claimId":"C04","claim":"2025年5月至12月PPI連續8個月為負，而2025年CPI各月均為正。","sources":["S01"],"sourceFields":["period","cpi_yoy","ppi_yoy"],"cleaningRules":["不插補"],"analysisCode":"analysis.py","outputs":["outputs/analysis-results.json#counterexamples"]}]}
    (ROOT/"claim-provenance.json").write_text(json.dumps(claims,ensure_ascii=False,indent=2)+"\n",encoding="utf-8")
    print(json.dumps({"status":"PASSED","sections":len(sections)},ensure_ascii=False))
if __name__=='__main__': main()
