diff --git a/backend/app/analysis/common.py b/backend/app/analysis/common.py index 3c278c5b..b5abc89b 100644 --- a/backend/app/analysis/common.py +++ b/backend/app/analysis/common.py @@ -64,13 +64,18 @@ def today_param(env: Env) -> str: def build(env: Env, params: dict[str, Any], used: Sequence[str], *, status: str = "ok", reason_code: str | None = None, reason: str | None = None, table: Mapping[str, Any] | None = None, values: Mapping[str, Any] | None = None, verdict: Mapping[str, Any] | None = None, criterion: str, - phrase: str, caveats: Sequence[Mapping[str, str]] = ()) -> AnalysisResult: - """组装一份结论:形状严格按 contract.AnalysisResult,params 补上查过的目录事实。""" + phrase: str, caveats: Sequence[Mapping[str, str]] = (), + formats: Mapping[str, str] | None = None, named: Mapping[str, str] | None = None) -> AnalysisResult: + """组装一份结论:形状严格按 contract.AnalysisResult,params 补上查过的目录事实。formats 是结果表各列的换算(占比、 + 变化率的列记 pct,比率的变化记 pp),named 是具名的数的换算(value_formats):都只留记了的,为空时整项不写。""" record = env.facts.record() out_params = {k: v for k, v in params.items() if v is not None} if record: out_params["catalog"] = record - return { + out_table = dict(table) if table is not None else None + if out_table is not None and (table_formats := column_formats(formats or {})): + out_table["formats"] = table_formats + out: AnalysisResult = { "op": env.op, "mode": env.mode, "method": METHODS[(env.op, env.mode)], @@ -81,7 +86,7 @@ def build(env: Env, params: dict[str, Any], used: Sequence[str], *, status: str "status": status, # type: ignore[typeddict-item] "reason_code": reason_code, "reason": reason, - "table": dict(table) if table is not None else None, # type: ignore[typeddict-item] + "table": out_table, # type: ignore[typeddict-item] "values": dict(values or {}), "verdict": dict(verdict) if verdict is not None else None, # type: ignore[typeddict-item] "criterion": criterion, @@ -89,6 +94,9 @@ def build(env: Env, params: dict[str, Any], used: Sequence[str], *, status: str "caveats": [dict(c) for c in caveats], # type: ignore[misc] "hypothesis": env.hypothesis, } + if named_formats := value_formats(named or {}): + out["value_formats"] = named_formats + return out def refuse(env: Env, params: dict[str, Any], used: Sequence[str], code: str, reason: str, *, @@ -155,9 +163,19 @@ def column_types(columns: Sequence[str], *, dims: Mapping[str, str | None] | Non return out +def column_formats(formats: Mapping[str, str]) -> dict[str, str]: + """结果表的 formats(ResultTable.formats):列 id → 换算。只留记了换算的列,都为空时整项不写(结论和以前一字不差)。""" + return {str(k): v for k, v in formats.items() if v} + + +def value_formats(values: Mapping[str, Any]) -> dict[str, str]: + """结论的 value_formats(AnalysisResult.value_formats):键 → 换算。只留记了换算的数,都为空时整项不写。""" + return {str(k): v for k, v in values.items() if v} + + def sign_word(value: Fraction | float | int) -> str | None: return "up" if value > 0 else "down" if value < 0 else None -__all__ = ["DERIVED_PARAMS", "Env", "build", "closes", "column_label", "column_types", "label_for", "need", "refuse", - "reserved_check", "sign_word", "today_param", "written_places"] +__all__ = ["DERIVED_PARAMS", "Env", "build", "closes", "column_formats", "column_label", "column_types", "label_for", + "need", "refuse", "reserved_check", "sign_word", "today_param", "value_formats", "written_places"] diff --git a/backend/app/analysis/contract.py b/backend/app/analysis/contract.py index d8d8c61a..8f2552ac 100644 --- a/backend/app/analysis/contract.py +++ b/backend/app/analysis/contract.py @@ -277,6 +277,10 @@ class ResultTable(TypedDict): # 列 id → 类型(写法同查询快照的 column_types;第 1 波 W1-a 加,可选):维度列照输入快照里那一列查询时记下的类型 # (文本型的码值 "1203" 才不会被渲染成「1,203」;输入没记类型的不写),数值列 number,说明、叫法这类文字列 text column_types: NotRequired[dict[str, str]] + # 列 id → 换算(第 2 波加,可选):占比、变化率、权重这类以比率存的列,渲染时按它换算,换算的写法同 [[m:]] 的后缀 + # (pct 显示成百分数、pp 显示成「+1.2 个百分点」)。引用这一列的一格、展开整表时没写换算的按它渲染,写作者自己写了换算的 + # 照他的(引用上记下实际用的换算,导出、可验证报告照它渲染) + formats: NotRequired[dict[str, str]] class AnalysisRequest(TypedDict, total=False): @@ -302,6 +306,9 @@ class AnalysisResult(TypedDict, total=False): reason: str | None table: ResultTable | None values: dict[str, Any] # 具名标量:[[a:A3.top_share]];数一律十进制字符串 + # 键 → 换算(第 2 波加,可选):占比、变化率这类以比率存的数,渲染时按它换算(写法同 ResultTable.formats)。 + # [[a:A3.top_share]] 没写换算的按它渲染,写作者自己写了换算的照他的 + value_formats: dict[str, str] verdict: Verdict | None criterion: str # 判定标准,一句,照实际阈值写 phrase: str # 判定语(app/analysis/phrases 渲染),[[a:A3]] 渲染成它 @@ -417,6 +424,16 @@ class ScopeBlock(TypedDict, total=False): #: 复算核对时不比的字段:hypothesis 是 agent 写的话,不是算出来的 NOT_RECOMPUTED = frozenset({"hypothesis"}) +#: 结论里记格式的两处:结果表的 formats(列 id → 换算)、values 的 value_formats(键 → 换算)。换算取值同 [[m:]] 的后缀, +#: 另加 pp(比率的变化按百分点写:「+1.2 个百分点」) +TABLE_FORMATS = "formats" +VALUE_FORMATS = "value_formats" +#: 比率的换算:pct 按百分数写(0.62 显示成 62.0%) +CONV_PCT = "pct" +#: 比率的变化按百分点写(0.012 显示成「+1.2 个百分点」,下降时带负号):[[m:]] 的后缀里原本没有这一种 +CONV_POINTS = "pp" +FORMAT_CONVS: tuple[str, ...] = (CONV_PCT, CONV_POINTS) + def same(a: Mapping[str, Any], b: Mapping[str, Any]) -> bool: """两份结论(封存的、复算的)是否逐字段相同(hypothesis 除外)。""" @@ -425,8 +442,10 @@ def same(a: Mapping[str, Any], b: Mapping[str, Any]) -> bool: __all__ = [ - "ARTIFACT_KIND", "CATALOG_PREFIX", "CAVEATS", "DEFAULTS", "LABELS", "LEDGER_KIND", "MARKER_KIND", "METHODS", "MODES", - "MODE_LABELS", "NODE_TYPE", "NOT_RECOMPUTED", "OPS", "OP_LABELS", "RANGES", "REASONS", "SETTINGS_KEY", "TOOL_NAMES", + "ARTIFACT_KIND", "CATALOG_PREFIX", "CAVEATS", "CONV_PCT", "CONV_POINTS", "DEFAULTS", "FORMAT_CONVS", "LABELS", + "LEDGER_KIND", "MARKER_KIND", "METHODS", "MODES", + "MODE_LABELS", "NODE_TYPE", "NOT_RECOMPUTED", "OPS", "OP_LABELS", "RANGES", "REASONS", "SETTINGS_KEY", + "TABLE_FORMATS", "TOOL_NAMES", "VALUE_FORMATS", "VERDICTS", "AnalysisInput", "AnalysisRequest", "AnalysisResult", "CallError", "Caveat", "Context", "InputSnapshot", "MetricComparability", "Probe", "Prober", "ResultTable", "ScopeBlock", "ScopeItem", "Verdict", "catalog_result", "effective_settings", "is_result", "ledger_entry", "method_label", "same", "settings_problem", diff --git a/backend/app/analysis/decompose.py b/backend/app/analysis/decompose.py index 104001b6..fe9f6649 100644 --- a/backend/app/analysis/decompose.py +++ b/backend/app/analysis/decompose.py @@ -29,7 +29,7 @@ from app.analysis import comparable as cmp from app.analysis import phrases as ph from app.analysis.common import (Env, build, closes, column_label, column_types, label_for, need, refuse, reserved_check, sign_word, today_param) -from app.analysis.contract import CallError +from app.analysis.contract import CONV_PCT, CONV_POINTS, CallError from app.analysis.inputs import Snap, as_list, hashable, same_value from app.analysis.numbers import canon, to_fraction @@ -227,6 +227,17 @@ def _parent(raw: Mapping[str, Any], env: Env, mode: str, dims: int) -> tuple[dic return {"of": name, "key": key}, dict(zip(columns, hit)), depth +#: 结果表里以比率存的列(占比、变化率、权重、比率本身):引用、展开时按百分数显示(ResultTable.formats 记 pct) +_RATE_COLUMNS = ("pct", "share") + + +def _rate_formats(columns: Sequence[str], rate: Sequence[str] = _RATE_COLUMNS, + points: Sequence[str] = ()) -> dict[str, str]: + """结果表各列记的换算:rate 里的列(占比、变化率、权重、比率本身)记 pct,points 里的列(比率的变化)记 pp。""" + return {**{c: CONV_PCT for c in rate if c in columns}, + **{c: CONV_POINTS for c in points if c in columns}} + + _FIXED_ADDITIVE = ("base", "target", "delta", "pct", "share", "flag") _FIXED_RATIO = ("n_base", "n_target", "d_base", "d_target", "w_base", "w_target", "r_base", "r_target", "mix", "rate", "total", "flag") @@ -470,7 +481,9 @@ def _additive_result(env: Env, params: dict[str, Any], used: list[str], segs: li skip = (("offset",) if code == "flat" else ()) + (("comparability",) if outcome is None else ()) phrase = ph.with_caveats(main, caveats, skip=skip) return build(env, params, used, table=table, values=values, verdict=verdict, - criterion=ph.criterion_additive(s, top_k_max=k_max, summed=summed), phrase=phrase, caveats=caveats) + criterion=ph.criterion_additive(s, top_k_max=k_max, summed=summed), phrase=phrase, caveats=caveats, + formats=_rate_formats(columns), + named={k: CONV_PCT for k in ("pct_total", "top_share", "top_k_share")}) # -------------------------------------------------------------------------- @@ -681,7 +694,13 @@ def _ratio_result(env: Env, params: dict[str, Any], used: list[str], segs: list[ "direction": sign_word(delta) if code in ("mix_driven", "rate_driven", "both") else None} return build(env, params, used, table=table, values=values, verdict=verdict, criterion=criterion, phrase=ph.with_caveats(main, caveats, skip=("comparability",) if outcome is None else ()), - caveats=caveats) + caveats=caveats, + # 权重、各段的比率按百分数显示;结构效应、自身效应、合计影响是比率的变化,按百分点 + formats=_rate_formats(columns, rate=("w_base", "w_target", "r_base", "r_target"), + points=("mix", "rate", "total")), + named={k: CONV_PCT for k in ("r_base_total", "r_target_total")} + | {k: CONV_POINTS for k in ("delta", "mix_total", "rate_total")} + | {"mix_share": CONV_PCT, "rate_share": CONV_PCT}) # -------------------------------------------------------------------------- @@ -811,7 +830,8 @@ def factor(raw: Mapping[str, Any], env: Env) -> Any: verdict = {"code": code, "subjects": subjects, "direction": sign_word(delta) if code != "flat" else None} return build(env, params, used, table=table, values=values, verdict=verdict, criterion=criterion, phrase=ph.with_caveats(main, caveats, skip=("comparability",) if outcome is None else ()), - caveats=caveats) + caveats=caveats, formats=_rate_formats(columns), + named={k: CONV_PCT for k in ("pct_total", "top_share")}) __all__ = ["HEADLINE_SHAPE", "PARENT_SHAPE", "SAME_QUERY", "SIMPSON_SHARE", "USED", "additive", "factor", "lmdi", diff --git a/backend/app/analysis/differ.py b/backend/app/analysis/differ.py index 668e31e5..1b959b3b 100644 --- a/backend/app/analysis/differ.py +++ b/backend/app/analysis/differ.py @@ -33,7 +33,7 @@ from typing import Any from app.analysis import phrases as ph from app.analysis import stats from app.analysis.common import Env, build, column_label, column_types, label_for, need, refuse, sign_word -from app.analysis.contract import CallError +from app.analysis.contract import CONV_PCT, CONV_POINTS, CallError from app.analysis.inputs import Snap, as_list, hashable, same_value from app.analysis.numbers import canon, to_fraction @@ -389,8 +389,13 @@ def _decide(env: Env, params: dict[str, Any], used: list[str], pairs: list[Pair] "test": shown.test, "pairs": str(len(pairs)), "differs": str(len(hits))} verdict = {"code": code, "subjects": subjects, "direction": direction} phrase = ph.with_caveats(main, caveats, skip=("multiple_comparisons",) if len(tested) > 1 else ()) + # 比率模式的组的比率按百分数显示,两组的差、差的区间是比率之差,按百分点(均值模式是量,照原样) + rate = ("a_value", "b_value") if mode == "rate" else () + points = ("diff", "ci_lo", "ci_hi") if mode == "rate" else () return build(env, params, used, table=table, values=values, verdict=verdict, criterion=criterion, phrase=phrase, - caveats=caveats) + caveats=caveats, formats={**{c: CONV_PCT for c in rate}, **{c: CONV_POINTS for c in points}}, + named={**{k: CONV_PCT for k in ("a", "b")}, **{k: CONV_POINTS for k in ("diff", "ci_lo", "ci_hi")}} + if mode == "rate" else {}) def _sensitivity(pairs: list[Pair], mode: str, alpha: Fraction, min_expected: Fraction, diff --git a/backend/app/analysis/series.py b/backend/app/analysis/series.py index c9b57687..ef536014 100644 --- a/backend/app/analysis/series.py +++ b/backend/app/analysis/series.py @@ -33,7 +33,7 @@ from app.analysis import phrases as ph from app.analysis import stats from app.analysis.common import (Env, build, column_label, column_types, label_for, need, refuse, reserved_check, sign_word, today_param) -from app.analysis.contract import CallError +from app.analysis.contract import CONV_PCT, CallError from app.analysis.inputs import Snap, same_value from app.analysis.numbers import canon, to_fraction @@ -258,8 +258,13 @@ def baseline(raw: Mapping[str, Any], env: Env) -> Any: "z": canon(z) if z is not None else None, "rank": str(stats.rank_desc(x, hv)), "n_history": str(n), "hist_min": canon(min(hv)), "hist_max": canon(max(hv))} verdict = {"code": code, "subjects": [], "direction": sign_word(x - m)} + # 按变化率比时,本期的变化率、中位数、常规波动范围、历史最小最大都是变化率,按百分数显示;按值本身比时照原样 + change = ("change",) if basis == "change" else () return build(env, params, used, table=table, values=values, verdict=verdict, criterion=criterion, - phrase=ph.with_caveats(main, caveats, skip=("comparability",)), caveats=caveats) + phrase=ph.with_caveats(main, caveats, skip=("comparability",)), caveats=caveats, + formats={c: CONV_PCT for c in change}, + named={k: CONV_PCT for k in ("x", "median", "band_lo", "band_hi", "hist_min", "hist_max") + if basis == "change"}) def _compare_gap(series: Series, ordinal: int, lag: int, unit: str) -> str: @@ -360,7 +365,9 @@ def trend(raw: Mapping[str, Any], env: Env) -> Any: verdict = {"code": code, "subjects": [], "direction": "up" if code == "rising" else "down" if code == "falling" else None} return build(env, params, used, table=table, values=values, verdict=verdict, criterion=criterion, - phrase=ph.with_caveats(main, caveats, skip=("comparability",)), caveats=caveats) + phrase=ph.with_caveats(main, caveats, skip=("comparability",)), caveats=caveats, + # 相对斜率是比率(每期变百分之几),按百分数显示;斜率本身、p 值、各期之比照原样 + named={"rel_slope": CONV_PCT}) def _tail_gap(series: Series, ordinal: int) -> str: diff --git a/backend/app/api/evidence.py b/backend/app/api/evidence.py index 5e6692a0..64562266 100644 --- a/backend/app/api/evidence.py +++ b/backend/app/api/evidence.py @@ -1188,12 +1188,17 @@ async def _analysis_chain(seg: dict[str, Any], cite: dict[str, Any], entry: dict def _analysis_calc(alias: str, result: dict[str, Any], cited: dict[str, Any], hidden: set[str]) -> dict[str, Any]: """计算一步:结果表(前 table_top_k 段加上被引用的那一行附近,最多 MAX_ANALYSIS_ROWS 行,高亮被引用的格)、具名的数(原值、 - 渲染出来的字)、关键数的代入式。结果表里万一有取自遮罩列的列(输入查询步骤里遮着的列名),照查询步骤写「已遮罩」。""" + 渲染出来的字)、关键数的代入式。数和格都按结论记的格式写出来(占比、变化率是百分数,比率的变化是百分点),和正文引用 + 之后显示的字一样;结果表的空格写「—」不写 null,面板照原样显示。结果表里万一有取自遮罩列的列(输入查询步骤里遮着的 + 列名),照查询步骤写「已遮罩」。""" values = result.get("values") if isinstance(result.get("values"), dict) else {} + named = result.get("value_formats") if isinstance(result.get("value_formats"), dict) else {} shown_values = [] for key, raw in values.items(): try: - text = render_cell(raw) + # 具名的数按结论记的格式写(占比、变化率是百分数),和引用之后正文显示的字一样 + conv = named.get(key) if isinstance(named.get(key), str) and named.get(key) else None + text = render_cell(raw, conv) except RenderError: text = MISSING shown_values.append({"key": str(key), "raw": raw, "rendered": text, @@ -1216,8 +1221,8 @@ def _analysis_calc(alias: str, result: dict[str, Any], cited: dict[str, Any], hi step["table"] = { "columns": columns, "labels": dict(table.get("labels") or {}) if isinstance(table.get("labels"), dict) else {}, "total_rows": len(rows), "row_index": picked, - "rows": [[MASKED if i in masked else v for i, v in enumerate(rows[r])] if isinstance(rows[r], list) else rows[r] - for r in picked], + "rows": [[MASKED if i in masked else _shown_cell(v, table, columns[i]) for i, v in enumerate(rows[r])] + if isinstance(rows[r], list) else rows[r] for r in picked], "masked": [columns[i] for i in sorted(masked)], "highlight": {"cells": [[row, str(cited.get("column"))]] if isinstance(row, int) else []}, **({"window_truncated": True} if len(index) > MAX_ANALYSIS_ROWS else {}), @@ -1225,6 +1230,22 @@ def _analysis_calc(alias: str, result: dict[str, Any], cited: dict[str, Any], hi return step +def _shown_cell(raw: Any, table: Mapping[str, Any], column: str) -> str: + """结果表的一格按结论记的格式写出来(占比、变化率是百分数,比率的变化是百分点),空格写「—」不写 null:面板照原样显示, + 读者看到的和正文引用那一格时一样。列类型照结果表的 column_types(文本列照原样,不按值猜);渲染不出来(不是 0 却显示成 0) + 的照原样写。""" + if raw is None: + return MISSING + formats = table.get("formats") if isinstance(table.get("formats"), dict) else {} + types = table.get("column_types") if isinstance(table.get("column_types"), dict) else {} + conv = formats.get(column) if isinstance(formats.get(column), str) and formats.get(column) else None + kind = types.get(column) if isinstance(types.get(column), str) else None + try: + return render_cell(raw, conv, kind=kind) + except RenderError: + return str(raw) + + async def _analysis_inputs(alias: str, result: dict[str, Any], catalog: dict[str, Any], doc: dict[str, Any], sealed: _Sealed, masks: _Masks, *, queries: bool = True ) -> tuple[list[dict[str, Any]], list[dict[str, Any]]]: @@ -1266,8 +1287,12 @@ async def _analysis_inputs(alias: str, result: dict[str, Any], catalog: dict[str sealed=sealed.trusted and query is not None) if role in totals and totals[role] in values: with contextlib.suppress(RenderError): - step["closure"] = {"mode": mode, "total_key": totals[role], "total": render_cell(values[totals[role]]), - "headline": render_cell(item.get("value")), "closed": not unclosed} + # 整体比率那一格和对照的那一格按结论记的格式写(比率拆解里都是比率,一起写成百分数),和具名的数、正文一致 + named = result.get("value_formats") if isinstance(result.get("value_formats"), dict) else {} + key = totals[role] + conv = named.get(key) if isinstance(named.get(key), str) and named.get(key) else None + step["closure"] = {"mode": mode, "total_key": key, "total": render_cell(values[key], conv), + "headline": render_cell(item.get("value"), conv), "closed": not unclosed} steps.append(step) if artifact and query is not None: wanted = cells.setdefault(artifact, []) diff --git a/backend/app/bundle/verifier.js b/backend/app/bundle/verifier.js index 0a24e27b..b89065fb 100644 --- a/backend/app/bundle/verifier.js +++ b/backend/app/bundle/verifier.js @@ -596,7 +596,8 @@ const shifted = (d, k) => ({ neg: d.neg, coef: d.coef, exp: d.exp + k }) - /** _render_numeric:万 / 亿留两位、去尾零,单位接在后面;pct、比率乘 100 加 %(不接单位);int、.N 改小数位 */ + /** _render_numeric:万 / 亿留两位、去尾零,单位接在后面;pct、比率乘 100 加 %(不接单位);pp 乘 100 写成「+1.2 个百分点」; + * int、.N 改小数位 */ function renderNumeric(d, unit, decimals, fmt, conv) { if (adjusted(d) >= MAX_DIGITS) throw new Unshown(T.shownTooLong) const ratio = fmt === 'percent_of_ratio' @@ -609,6 +610,20 @@ if (unit.includes('%') || unit.includes('%')) throw new Unshown(T.shownPctUnit) return `${digitsOf(shifted(d, 2), decimals != null ? Math.max(decimals - 2, 0) : 1, group, false)}%` } + if (conv === 'pp') { + // 比率的变化按百分点写:一位小数、正数带「+」(0 不带);不是 0 的值写出来成了 0.0 的多给小数位(最多 4 位), + // 不写假的 0(同服务端 engine/evidence._render_numeric 的 pp) + if (unit.includes('%') || unit.includes('%')) throw new Unshown(T.shownPctUnit) + const points = shifted(d, 2) + if (isZero(points)) return `${digitsOf(points, 1, group, false)} 个百分点` + let places = 1 + for (; places < 5; places++) { + if (!isZero(quantize(points, -places))) break + } + if (places >= 5) throw new Unshown(T.shownZero) + const out = digitsOf(points, places, group, false) + return `${out.startsWith('-') ? out : `+${out}`} 个百分点` + } let places if (conv === 'int') places = 0 else if (typeof conv === 'string' && CONV_PLACES.test(conv)) places = Number(conv.slice(1)) @@ -652,12 +667,13 @@ /** * render_cell(shown(raw)):快照里的一格。kind 是查询时记下的列类型,display 是报告文档记下的单元格显示规则版本 - * (2 版起 ISO 日期时间的 T 换成空格;3 版起标识列的数不分千位)。plain 是引用上记下的「这一格按标识列显示」: + * (2 版起 ISO 日期时间的 T 换成空格;3 版起标识列的数不分千位;4 版起引用分析结论时按结论记的格式换算)。 + * plain 是引用上记下的「这一格按标识列显示」: * 哪几列是标识列服务端按 SQL 和冻结的数据目录判(cell_format.plain_columns),本页解析不了 SQL,照引用上记的渲染—— * 它只决定分不分千位,值本身照样逐位比对。DECIMAL 落成的数字文本按数渲染、不经 float;文字压成一行,竖线换成 ¦ */ function renderCell(raw, token, conv, kind, display, plain = false) { - if (display !== 1 && display !== 2 && display !== 3) throw new Unshown(T.shownDisplay(display)) + if (display !== 1 && display !== 2 && display !== 3 && display !== 4) throw new Unshown(T.shownDisplay(display)) if (!PY_NUMERIC || !ISO_DATETIME) throw new Unshown(T.shownOld) const fmt = display >= 3 && plain === true ? 'plain' : 'thousands' let value = raw @@ -1556,6 +1572,12 @@ /** 引用上记的换算(|万、|pct 这类),没写是 null */ const convOf = (cite) => (own(cite, 'conv') === undefined ? null : cite.conv) + /** 分析结论给这一列 / 这个数记的换算(formats / value_formats:占比、变化率的列 pct,比率的变化 pp),没记是 null */ + const namedConv = (formats, key) => { + const found = isObj(formats) ? formats[key] : null + return typeof found === 'string' && found ? found : null + } + /** * 分析结论的一处引用(checkNumber 已核过工件的哈希和引用链):引用的值等于结论里记的那个值,正文显示的字等于按服务端 * 的规则渲染出来的字。判定语按文本格渲染(engine/evidence.render_cell 的 kind=text:压成一行、竖线换成 ¦),具名的数按 @@ -1586,7 +1608,10 @@ } if (!sameValue(cite.value, info.truth)) return { ...info, result: FAIL, reason: T.numAnalysisCell } const display = Object.prototype.hasOwnProperty.call(doc, 'cell_display') ? doc.cell_display : 1 - return checkShown(info, seg, () => renderCell(cell.raw, info.truthToken, convOf(cite), + // 没写换算、结论的结果表给这一列记了格式(formats:4 版显示规则起)、文档也按 4 版复核的,按它渲染(服务端同样); + // 写作者自己写了换算的照他的 + const conv = convOf(cite) ?? (display >= 4 ? namedConv(table.formats, cell.column) : null) + return checkShown(info, seg, () => renderCell(cell.raw, info.truthToken, conv, columnKind(table, cell.column), display, own(cite, 'plain') === true)) } if (loc.key != null) { @@ -1597,7 +1622,10 @@ info.truthToken = tokenAt(tokensOf(art), ['values', loc.key]) if (typeof raw === 'string' && typeof info.truth === 'number') info.truthText = pyStrip(raw) if (!sameValue(cite.value, info.truth)) return { ...info, result: FAIL, reason: T.numValueDiffers } - return checkShown(info, seg, () => renderCell(raw, info.truthToken, convOf(cite), null, 1)) + // 没写换算、结论给这个数记了格式(value_formats;4 版显示规则起)的按它渲染(服务端同样);写作者自己写了换算的照他的 + const display = Object.prototype.hasOwnProperty.call(doc, 'cell_display') ? doc.cell_display : 1 + const conv = convOf(cite) ?? (display >= 4 ? namedConv(result.value_formats, loc.key) : null) + return checkShown(info, seg, () => renderCell(raw, info.truthToken, conv, null, 1)) } if (typeof result.phrase !== 'string' || !result.phrase.trim()) return { ...info, result: FAIL, reason: T.numNoPhrase } info.truth = result.phrase diff --git a/backend/app/engine/evidence.py b/backend/app/engine/evidence.py index 6fd87d63..3de76df6 100644 --- a/backend/app/engine/evidence.py +++ b/backend/app/engine/evidence.py @@ -91,11 +91,15 @@ ENTITY_SYNTAXES = frozenset({1, 2}) #: 「没有第 N 行」重新解析得了,会被当成文档被改过(render_mismatch)。另外标识列(编码、编号、分组键,见 #: cell_format.plain_columns)的数不分千位:编码 1203 不写成「1,203」。真有格子因此改了写法的文档记 cell_display: 3, #: 引用上记 plain: true(离线核对页解析不了 SQL,照它渲染) +#: - 4:引用分析结论的结果表一格、具名的数时没写换算的,按结论给这一列 / 这个数记的格式渲染(占比、变化率按百分数, +#: 比率的变化按百分点:0.62 显示成 62.0%,不再照原样写 0.618556701),实际用的换算记在引用上(conv,导出页和可验证报告 +#: 照它渲染)。3 版及以前组装的文档里的引用照当年原样显示,复核按记下的版本,不因此判对不上 #: 新组装的文档里真有格子因为显示规则改了写法时才记 cell_display(参与内容哈希),记的是渲染得出这些格子的最低一版 -#: (只有日期时间被改写的记 2:标识列没有因此改写法的,3 版的整表截行不改格子的写法),没有的文档和以前一字不差。复核必须按 -#: 文档生成时的那一版:老文档存的是带 T 的字,拿新规则重新渲染对不上,会被当成文档被改过(render_mismatch) -CELL_DISPLAY = 3 -CELL_DISPLAYS = frozenset({1, 2, 3}) +#: (只有日期时间被改写的记 2:标识列没有因此改写法的,3 版的整表截行不改格子的写法,引用分析结论时本来就有换算的记 1);没有的 +#: 文档和以前一字不差。复核必须按文档生成时的那一版:老文档存的是带 T 的字,拿新规则重新渲染对不上,会被当成文档被改过 +#: (render_mismatch) +CELL_DISPLAY = 4 +CELL_DISPLAYS = frozenset({1, 2, 3, 4}) _ISO_DATETIME = re.compile(r"^(\d{4}-\d{2}-\d{2})T(\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?(?:Z|[+-]\d{2}:?\d{2})?)$") @@ -148,7 +152,7 @@ class Citation(TypedDict, total=False): status: Literal["resolved", "unresolved", "mismatch"] reason: str # unresolved 时为什么 unknown: bool # 实体:本次运行哪里都没有这个名字(可疑实体,不是写法错了) - conv: str # 换算:万 / 亿 / pct / int / .N + conv: str # 换算:万 / 亿 / pct / pp / int / .N(没写换算、按分析结论记的格式渲染的也照记,导出、可验证报告照它渲染) value: Any rendered: str source: dict[str, Any] # 引文:原文所在的检索快照、文档、片段 @@ -573,6 +577,11 @@ MISSING = "—" _CONV_SCALE = {"万": Decimal(10) ** 4, "亿": Decimal(10) ** 8} _CONV_PLACES = re.compile(r"^\.([0-6])$") +#: 比率的变化按百分点写(0.012 →「+1.2 个百分点」,-0.003 →「-0.3 个百分点」):分析结论的结果表、具名的数里的换算, +#: 算子记成 pp(analysis.contract.CONV_POINTS)。正数带「+」(和 pct 一样),不是 0 的值写出来成了 0.0 的多给小数位 +#: (最多 4 位),不写假的 0 +_CONV_POINTS = "pp" +_POINTS_SUFFIX = " 个百分点" #: 小数位最多写到多少。负数是取整到十位、百位……(round(x, -2) 的意思) MAX_PLACES = 100 #: 整数部分最多多少位。浮点数到头也就 309 位,再大的整数按规则一位位写出来没有意义 @@ -648,7 +657,7 @@ def render_number( - decimals:固定小数位;不写就按值本来的样子(整数不带小数点) - 单位直接接在数字后面:45,678.5元、8.7% - conv 是报告里写的换算:万 / 亿(保留两位、去尾零,单位接在后面:4.57万元)、 - pct(比率 ×100 加 %)、int(取整)、.N(N 位小数) + pct(比率 ×100 加 %)、pp(比率的变化 ×100 写成「+1.2 个百分点」)、int(取整)、.N(N 位小数) 值是 None 显示「—」。文本值原样(压成一行),不能换算。 @@ -696,13 +705,30 @@ def _render_numeric(d: Decimal, *, unit: str, decimals: int | None, fmt: str, co raise RenderError("该指标本身是百分数(单位为 %),不能再换算为 pct") places = max(decimals - 2, 0) if decimals is not None else 1 return _digits(_ctx(d).multiply(d, 100), places, group=group, zero=rounded) + "%" + if conv == _CONV_POINTS: + # 比率的变化按百分点写:一位小数、正数带「+」(0 不带);不是 0 的值写出来成了 0.0 的多给小数位(最多 4 位), + # 不写假的 0。说法照 phrases.points / ratio_change 里已有的百分点写法,只是表格里的数没有「上升 / 下降」可依, + # 正负靠符号 + if "%" in unit or "%" in unit: + raise RenderError("该指标本身是百分数(单位为 %),不能再换算为 pp") + points = _ctx(d).multiply(d, 100) + if points.is_zero(): + return _digits(points, 1, group=group) + _POINTS_SUFFIX + zero = f"{shown} 按 |pp 显示为 0,精度不够:请去掉换算,或改用 |.N 多保留几位小数" + for places in range(1, 5): + exp = -(places) + if points.quantize(Decimal(1).scaleb(exp), context=_ctx(points, places)).is_zero(): + continue + out = _digits(points, places, group=group, zero=zero) + return ("+" + out if not out.startswith("-") else out) + _POINTS_SUFFIX + raise RenderError(zero) if conv == "int": places: int | None = 0 elif conv and (m := _CONV_PLACES.match(conv)): places = int(m.group(1)) elif conv: - raise RenderError(f"无法识别的换算 |{conv},只支持 万 / 亿 / pct / int / .N(N 为 0–6)") + raise RenderError(f"无法识别的换算 |{conv},只支持 万 / 亿 / pct / pp / int / .N(N 为 0–6)") else: rounded = (f"{shown} 按口径卡的小数位({decimals})显示为 0,精度不够:请在口径卡中增加小数位" if decimals is not None else @@ -1468,8 +1494,8 @@ class _Snapshots: def table(self, alias: str, entry: dict[str, Any]) -> tuple[Any, str | None]: """按单元格、整表取的那张表:(表, 取不到的原因)。查询结果是查询快照本身;分析结论是它的结果表(形状同查询快照: - columns 是稳定的列 id,另带 labels 给人看的列名,整表的表头写它)。结果表另记了列类型(column_types)的照着渲染, - 没记的按值认(同老快照)。""" + columns 是稳定的列 id,另带 labels 给人看的列名,整表的表头写它)。结果表另记了列类型(column_types)、各列的换算 + (formats,占比、变化率这类以比率存的列)的照着渲染,没记的按值认(同老快照)。""" if entry.get("kind") != LEDGER_KIND: return self.get(alias, entry.get("artifact")) result, why = self.analysis(alias, entry) @@ -1480,9 +1506,11 @@ class _Snapshots: return None, f"{alias} 没有结果表" + ("(这次分析没有做成)" if result.get("status") == "refused" else "") labels = table.get("labels") types = table.get("column_types") + formats = table.get("formats") return {"columns": [str(c) for c in table.get("columns") or []], "rows": table["rows"], "labels": {str(k): str(v) for k, v in labels.items()} if isinstance(labels, dict) else {}, - **({"column_types": types} if isinstance(types, dict) else {})}, None + **({"column_types": types} if isinstance(types, dict) else {}), + **({"formats": {str(k): str(v) for k, v in formats.items()}} if isinstance(formats, dict) else {})}, None def hits(self, alias: str, artifact: Any) -> tuple[list[Any], str | None]: """检索快照里的命中:(命中列表, 取不到的原因)。""" @@ -1569,6 +1597,19 @@ def _noun(entry: dict[str, Any] | None) -> str: return "结果表" if (entry or {}).get("kind") == LEDGER_KIND else "查询结果" +def _column_conv(snapshot: Any, column: str, display: int = CELL_DISPLAY) -> str | None: + """分析结论的结果表给这一列记的换算(ResultTable.formats:占比、变化率的列记 pct,比率的变化记 pp)。查询快照没有这一项, + 一切照原样(None)。按分析结论记的格式显示是 4 版起的显示规则:老文档(3 版及以前)里的引用照当年原样显示,复核不因此 + 判对不上。""" + if display < 4: + return None + formats = snapshot.get("formats") if isinstance(snapshot, dict) else None + if not isinstance(formats, dict): + return None + found = formats.get(column) + return found if isinstance(found, str) and found else None + + def _resolve_cell(marker: dict[str, Any], catalog: dict[str, Any], snaps: _Snapshots, cells_allowed: bool) -> dict[str, Any]: ref = marker.get("ref") or "" @@ -1596,7 +1637,14 @@ def _resolve_cell(marker: dict[str, Any], catalog: dict[str, Any], snaps: _Snaps raw, column = locate_cell(snapshot, parsed["row"], parsed["column"]) kind = column_kind(snapshot, column) shown = snaps.shown(raw) + # 分析结论的结果表记了这一列的换算(占比、变化率这类以比率存的列;4 版显示规则起)、写作者没写换算的,按它渲染; + # 写作者自己写了换算的照他的。实际用的换算记进引用(导出页、可验证报告照它渲染) + conv = conv or _column_conv(snapshot, column, snaps.display) rendered = render_cell(shown, conv, kind=kind) + if conv and not marker.get("conv") and rendered != render_cell(shown, None, kind=kind): + # 按分析结论记的格式渲染、真改了写法(4 版起):文档的 cell_display 记成 4,引用上记 conv, + # 导出页和可验证报告照引用上的换算渲染 + snaps.needed = max(snaps.needed, 4) plain = column in snaps.plain(entry.get("artifact"), snapshot) \ and render_cell(shown, conv, kind=kind, plain=True) != rendered if plain: @@ -1840,6 +1888,7 @@ def _resolve_analysis(marker: dict[str, Any], catalog: dict[str, Any], snaps: _S cells_allowed: bool) -> dict[str, Any]: """[[a:A3]] → 判定语:分析结论里系统按模板渲染好的那一整句(判定是平台的算子算的,写作者只引用,00-总方案 D5)。 [[a:A3.top_share|pct]] → 具名标量:结论 values 里的一项(数一律十进制字符串),按单元格的规则渲染,换算同 [[m:]]。 + 没写换算、结论给这个数记了格式(value_formats)的按它渲染(0.62 显示成 62.0%,不是 0.62),实际用的换算记进引用。 判定语是一个片段(种类 analysis),里面的数和字都是系统写的:组装、复核都按带引用的片段整段涂白,不算裸数字。受管级别的 正式出具、契约没开「单元格引用」时,Agent 现场做的分析解析不了(ANALYSIS_CELLS_REASON),分析卡做的照常解析。""" @@ -1879,6 +1928,13 @@ def _resolve_analysis(marker: dict[str, Any], catalog: dict[str, Any], snaps: _S return _unresolved(marker, alias, LEDGER_KIND, _Reason( f"{alias} 中没有名为「{key}」的数", f"{alias} 里没有「{key}」,能引用的数:{names}(写成 [[{MARKER_KIND}:{alias}.键]])")) raw = values[key] + # 结论里给这个数记了换算(value_formats:占比、变化率这类以比率存的数;4 版显示规则起)而写作者没写换算的,按它渲染; + # 写作者自己写了换算的照他的。实际用的换算记进引用(导出页、可验证报告照它渲染) + named = result.get("value_formats") if isinstance(result.get("value_formats"), dict) else {} + if snaps.display >= 4 and not conv and isinstance(named.get(key), str) and named.get(key): + conv = named[key] + # 按分析结论记的格式渲染了(4 版起):文档记成 4,引用上记 conv(写了换算才真有换算,写法一定和以前不同) + snaps.needed = max(snaps.needed, 4) try: rendered = render_cell(raw, conv) except RenderError as e: @@ -4032,7 +4088,8 @@ def _query_prompt(entry: dict[str, Any], snaps: _Snapshots, cells_allowed: bool, ANALYSIS_PROMPT = ( "分析结论(系统按平台的方法算好的判定。判定语、具名的数、结果表都只能用引用标记写,系统照结论渲染、逐字核对):\n" "写法:判定语单独写 [[a:A1]],系统换成整句判定;具名的数写 [[a:A1.键]],换算同指标,比重、变化率这类比率写成 " - "[[a:A1.top_share|pct]] 显示成百分数;结果表的一格写 [[v:A1.r0.列]](行号从 0 数),要列出多行多列,单独一行写 " + "[[a:A1.top_share|pct]] 显示成百分数;比重、变化率不写换算也按百分数显示,比率的变化按百分点([[v:A1.r0.mix]] 显示成「1.2 " + "个百分点」);结果表的一格写 [[v:A1.r0.列]](行号从 0 数),要列出多行多列,单独一行写 " "[[table:A1 cols=列a,列b rows=0-4]];拿它当结论的依据,句末写 [[see:A1]]。" "「主要来自」「超出常规波动」「呈上升趋势」这类判断已经写在判定语里:引用判定语,不要自己改写判定;" "算不了的照实写算不了的原因。下面没有的编号、键、列不要编造。" @@ -4105,10 +4162,13 @@ def _analysis_prompt(entry: dict[str, Any], catalog: dict[str, Any], snaps: _Sna if see_only: return lines values = result.get("values") if isinstance(result.get("values"), dict) else {} + named = result.get("value_formats") if isinstance(result.get("value_formats"), dict) else {} shown = [] for key, raw in list(values.items())[:_PROMPT_VALUES]: try: - shown.append(f"{key}={render_cell(raw)}") + # 具名的数按结论记的格式写(占比、变化率是百分数):写作者在这里看到的就是引用之后显示的字 + conv = named.get(key) if isinstance(named.get(key), str) and named.get(key) else None + shown.append(f"{key}={render_cell(raw, conv)}") except RenderError: shown.append(f"{key}={MISSING}") if shown: @@ -4131,12 +4191,15 @@ def _analysis_prompt(entry: dict[str, Any], catalog: dict[str, Any], snaps: _Sna top = top if isinstance(top, int) and not isinstance(top, bool) and top > 0 else _TOP_K lines.append(f" 结果表(共 {len(rows)} 段):列 {named}") plain = snaps.plain(entry.get("artifact"), snapshot) + formats = snapshot.get("formats") if isinstance(snapshot.get("formats"), dict) else {} for r in range(min(top, len(rows))): cells = [] for c in columns: try: raw, _ = locate_cell(snapshot, r, c) - cells.append(f"{c}={render_cell(snaps.shown(raw), kind=column_kind(snapshot, c), plain=c in plain)}") + conv = formats.get(c) if isinstance(formats.get(c), str) and formats.get(c) else None + cells.append(f"{c}={render_cell(snaps.shown(raw), conv, kind=column_kind(snapshot, c), + plain=c in plain)}") except (CellError, RenderError): cells.append(f"{c}={MISSING}") lines.append(f" r{r}:" + ",".join(cells)) diff --git a/backend/tests/test_analysis_conclusion_formats.py b/backend/tests/test_analysis_conclusion_formats.py new file mode 100644 index 00000000..95198f83 --- /dev/null +++ b/backend/tests/test_analysis_conclusion_formats.py @@ -0,0 +1,357 @@ +"""分析结论里的占比、变化率、权重按原始小数显示(第 2 波复核 S1,显示规则 4 版)。 + +复核实测:结果表里占变化的比重、变化率以比率存(0.618556701031),正文引用 [[a:A1.top_share]]、[[v:A1.r0.share]]、 +[[table:A1 cols=region,pct,share]] 时照原样写「占比 3.5190412373」;判定语写「占 351.9%」,正文写「占比 3.5190412373」, +读的人把 0.62 当成 62% 的百分之一。现在算子给结果表的、以比率存的列记换算(ResultTable.formats:占比、变化率、权重记 pct, +比率的变化记 pp),结论的 values 里同样记一份(value_formats);引用、整表、写作目录、证据面板、导出、可验证报告都按它渲染, +实际用的换算记在引用上(导出页、可验证报告照它渲染)。写作者自己写了换算的照他的。3 版及以前组装的文档照当年原样显示, +复核不因此判对不上。 + +数据全是虚构的(华东、华南、华北、西南,销售额、订单数,虚构零售库 shop)。 +""" +from __future__ import annotations + +import json +from typing import Any + +import pytest +from httpx import ASGITransport, AsyncClient + +from app.analysis.contract import CONV_PCT, CONV_POINTS, ledger_entry +from app.core import artifact_store +from app.engine import evidence as ev +from app.engine.evidence import build_catalog, compose_doc, iter_segments, render_cell, resolve_ref, verify_doc, \ + writer_catalog +from app.main import app as asgi +from tests.analysis_samples import analyze, snap +from tests.test_analysis_bundle import Files, GRAPH, RUN, RUN_ID, bundle_of, item, verdicts +from tests.test_analysis_evidence import SNAPSHOT, Store, real_result +from tests.test_analysis_evidence_api import seg_id, sealed_run + +WEEKS = [["华东", "2026-W41", 820], ["华东", "2026-W42", 700], ["华北", "2026-W41", 600], ["华北", "2026-W42", 560], + ["华南", "2026-W41", 700], ["华南", "2026-W42", 666], ["西南", "2026-W41", 100], ["西南", "2026-W42", 100]] +REGIONS = snap("Q2", "SELECT region, week, SUM(amount) AS gmv FROM orders GROUP BY region, week", + ["region", "week", "gmv"], WEEKS, types={"region": "text", "week": "text", "gmv": "number"}) + + +def run_sync(coro: Any) -> Any: + from tests.test_analysis_evidence import run_sync as wait + + return wait(coro) + + +def analyzed(op: str, mode: str | None, **params: Any) -> dict[str, Any]: + """真算一份结论(同 tests/analysis_samples.analyze:跑一次、复算一遍,逐字段相同)。""" + return run_sync(analyze(op, mode, snaps=[REGIONS], query="Q2", **params)) + + +def catalog_of(*, result: dict[str, Any] | None = None) -> tuple[Store, dict[str, Any]]: + """一次查询(Q1)加一份真算的按地区拆的分析结论(A1):(工件库, 写作目录)。结论带算子记的格式。""" + store = Store() + q = store.put(SNAPSHOT) + res = result or real_result("Q2") + a = store.put(res) + ledger = [{"kind": "query", "node_id": "fetch", "exec": 1, "artifact": q, "tool": "db_query__shop", + "source": "shop", "columns": ["region", "week", "gmv"], "rows": 8, "truncated": False}, + ledger_entry(res, node_id="an", exec_no=1, artifact=a, item="drop")] + return store, build_catalog(nodes={}, ledger=ledger, loader=store.load) + + +# -------------------------------------------------------------------------- +# 换算的写法:pct、pp +# -------------------------------------------------------------------------- + + +@pytest.mark.parametrize("value, conv, shown", [ + ("0.618556701", "pct", "61.9%"), + ("3.51904123734", "pct", "351.9%"), + ("-0.0142977693", "pct", "-1.4%"), + ("0.0123", "pp", "+1.2 个百分点"), + ("-0.121944594212", "pp", "-12.2 个百分点"), + ("0", "pp", "0.0 个百分点"), + ("0.00004", "pp", "+0.004 个百分点"), # 不是 0 的不写成 0.0 +]) +def test_pct_and_percentage_points_are_written_the_way_the_verdict_phrase_writes_them(value, conv, shown): + """pct 和 phrases.pct 一个写法(一位小数、不带正号);pp 是百分点(一位小数,不是 0 的 0.0 多给小数位), + 和判定语里「上升 0.4 个百分点」同一个说法。""" + assert render_cell(value, conv) == shown + + +def test_a_conversion_that_shows_a_nonzero_value_as_zero_still_fails(): + with pytest.raises(ev.RenderError, match="显示为 0"): + render_cell("0.0000001", "pp") + + +# -------------------------------------------------------------------------- +# 各算子记的格式 +# -------------------------------------------------------------------------- + + +def test_the_additive_decomposition_formats_shares_and_rates(): + result = analyzed("decompose", "additive", by=["region"], period="week", base="2026-W41", target="2026-W42", + measure="gmv", label="销售额") + assert result["table"]["formats"] == {"pct": CONV_PCT, "share": CONV_PCT} + assert result["value_formats"] == {"pct_total": CONV_PCT, "top_share": CONV_PCT, "top_k_share": CONV_PCT} + # 维度列、量(基期、本期、变化)没有换算 + assert set(result["table"]["formats"]) & {"region", "base", "target", "delta"} == set() + + +def test_the_ratio_decomposition_formats_weights_as_percent_and_effects_as_points(): + rows = [["华东", "2026-W41", 8, 100], ["华东", "2026-W42", 10, 120], ["华南", "2026-W41", 5, 130], + ["华南", "2026-W42", 4, 140]] + rates = snap("Q3", "SELECT region, week, refunds, orders FROM refunds GROUP BY region, week", + ["region", "week", "refunds", "orders"], rows, + types={"region": "text", "week": "text", "refunds": "number", "orders": "number"}) + result = run_sync(analyze("decompose", "ratio", snaps=[rates], query="Q3", by=["region"], period="week", + base="2026-W41", target="2026-W42", numerator="refunds", denominator="orders", + label="退款率")) + # 权重、各段的比率是比率本身 → pct;结构效应、自身效应、合计影响是比率的变化 → pp + assert result["table"]["formats"] == {"w_base": CONV_PCT, "w_target": CONV_PCT, "r_base": CONV_PCT, + "r_target": CONV_PCT, "mix": CONV_POINTS, "rate": CONV_POINTS, + "total": CONV_POINTS} + assert result["value_formats"]["r_base_total"] == CONV_PCT and result["value_formats"]["r_target_total"] == CONV_PCT + assert {result["value_formats"][k] for k in ("delta", "mix_total", "rate_total")} == {CONV_POINTS} + assert result["value_formats"]["mix_share"] == CONV_PCT + + +def test_the_factor_decomposition_formats_change_rates_and_shares(): + product = snap("Q4", "SELECT week, gmv, users, price FROM orders", ["week", "gmv", "users", "price"], + [["2026-W41", 1000, 100, 10], ["2026-W42", 1188, 110, 10.8]], + types={"week": "text", "gmv": "number", "users": "number", "price": "number"}) + result = run_sync(analyze("decompose", "factor", snaps=[product], query="Q4", period="week", base="2026-W41", + target="2026-W42", product="gmv", factors=["users", "price"], label="销售额")) + assert result["table"]["formats"] == {"pct": CONV_PCT, "share": CONV_PCT} + assert result["value_formats"] == {"pct_total": CONV_PCT, "top_share": CONV_PCT} + + +def test_the_baseline_formats_change_rates_only_when_it_compares_changes(): + weekly = snap("Q1", "SELECT week, SUM(amount) AS gmv FROM orders GROUP BY week", ["week", "gmv"], + [[f"2026-W{k:02d}", 2200 + (k % 5) * 10] for k in range(30, 42)] + [["2026-W42", 2138]], + types={"week": "text", "gmv": "number"}) + changes = run_sync(analyze("baseline", None, snaps=[weekly], query="Q1", period="week", measure="gmv", + label="销售额", grain="week")) + assert changes["table"]["formats"] == {"change": CONV_PCT} + assert {"x", "median", "band_lo", "band_hi"} <= set(changes["value_formats"]) + levels = run_sync(analyze("baseline", None, snaps=[weekly], query="Q1", period="week", measure="gmv", + label="销售额", grain="week", basis="level")) + # 按值本身比时是量,照原样显示(没有换算) + assert "formats" not in levels["table"] and "value_formats" not in levels + + +def test_the_trend_formats_the_relative_slope(): + weekly = snap("Q1", "SELECT week, SUM(amount) AS gmv FROM orders GROUP BY week", ["week", "gmv"], + [[f"2026-W{k:02d}", 100 + k] for k in range(30, 42)], types={"week": "text", "gmv": "number"}) + result = run_sync(analyze("trend", None, snaps=[weekly], query="Q1", period="week", measure="gmv", + label="销售额", grain="week")) + assert result["value_formats"] == {"rel_slope": CONV_PCT} + + +def test_the_differ_formats_rates_as_percent_and_differences_as_points(): + groups = snap("Q3", "SELECT region, refunds, orders FROM refunds GROUP BY region", ["region", "refunds", "orders"], + [["华东", 100, 2000], ["华南", 120, 1800], ["华北", 90, 2100], ["西南", 40, 1900]], + types={"region": "text", "refunds": "number", "orders": "number"}) + result = run_sync(analyze("differ", "rate", snaps=[groups], query="Q3", by=["region"], numerator="refunds", + denominator="orders", label="退款率")) + assert result["table"]["formats"] == {"a_value": CONV_PCT, "b_value": CONV_PCT, "diff": CONV_POINTS, + "ci_lo": CONV_POINTS, "ci_hi": CONV_POINTS} + assert {result["value_formats"][k] for k in ("a", "b")} == {CONV_PCT} + assert {result["value_formats"][k] for k in ("diff", "ci_lo", "ci_hi")} == {CONV_POINTS} + + +def test_a_run_twice_is_byte_for_byte_the_same_and_recompute_matches(): + """格式是结论的一部分:同样的输入两次 run 逐字节相同,复算和封存的逐字段相同(analysis_samples.analyze 顺带核对复算)。""" + first = analyzed("decompose", "additive", by=["region"], period="week", base="2026-W41", target="2026-W42", + measure="gmv", label="销售额") + second = analyzed("decompose", "additive", by=["region"], period="week", base="2026-W41", target="2026-W42", + measure="gmv", label="销售额") + assert artifact_store.canonical_json(first) == artifact_store.canonical_json(second) + assert first["table"]["formats"] == second["table"]["formats"] + + +# -------------------------------------------------------------------------- +# 引用:没写换算时取列 / 数的格式,写了照写作者的 +# -------------------------------------------------------------------------- + + +def test_citing_a_share_or_rate_without_a_conversion_uses_the_conclusion_format(): + store, catalog = catalog_of() + doc = compose_doc("华东占 [[a:A1.top_share]],变化率 [[v:A1.r0.pct]],占比 [[v:A1.r0.share]]," + "变化量 [[v:A1.r0.delta]]。[[see:A1]]", catalog, loader=store.load) + shown = {s["ref"]: s["text"] for s in iter_segments(doc) if s.get("ref")} + assert shown["a:A1.top_share"] == "61.9%" + assert shown["v:A1.r0.pct"] == "-14.6%" and shown["v:A1.r0.share"] == "61.9%" + assert shown["v:A1.r0.delta"] == "-120" # 量照原样 + cites = {s["ref"]: s["cite"] for s in iter_segments(doc) if s.get("ref")} + # 实际用的换算记在引用上(导出页、可验证报告照它渲染) + assert cites["a:A1.top_share"]["conv"] == "pct" and cites["v:A1.r0.share"]["conv"] == "pct" + assert "conv" not in cites["v:A1.r0.delta"] + assert doc["cell_display"] == 4 and doc["violations"] == [] + assert verify_doc(doc, catalog, loader=store.load)["ok"] + + +def test_a_writer_supplied_conversion_wins_over_the_conclusion_format(): + store, catalog = catalog_of() + cite = resolve_ref("a:A1.top_share|.2", catalog, loader=store.load) + assert cite["rendered"] == "0.62" and cite["conv"] == ".2" + cell = resolve_ref("v:A1.r0.share|pct", catalog, loader=store.load) + assert cell["rendered"] == "61.9%" + + +def test_a_whole_table_is_expanded_with_the_conclusion_formats(): + store, catalog = catalog_of() + doc = compose_doc("[[table:A1 cols=region,delta,pct,share rows=0-1]]", catalog, loader=store.load) + assert "| region | 变化 | 变化率 | 占变化的比重 |" in doc["markdown"] + assert "| 华东 | -120 | -14.6% | 61.9% |" in doc["markdown"] + assert "| 华北 | -40 | -6.7% | 20.6% |" in doc["markdown"] + assert verify_doc(doc, catalog, loader=store.load)["ok"] + + +def test_an_old_document_keeps_the_raw_decimals_and_still_verifies(monkeypatch): + """3 版及以前组装的文档:引用上是 0.618556701 这样的原样,复核按记下的版本渲染,不判对不上;按新规则重渲染会判对不上。""" + store, catalog = catalog_of() + monkeypatch.setattr(ev, "CELL_DISPLAY", 3) + old = compose_doc("占比 [[a:A1.top_share]],[[v:A1.r0.share]]。[[see:A1]]", catalog, loader=store.load) + monkeypatch.undo() + assert "cell_display" not in old + shown = {s["ref"]: s["text"] for s in iter_segments(old) if s.get("ref")} + assert shown["a:A1.top_share"] == "0.618556701" and shown["v:A1.r0.share"] == "0.618556701" + assert verify_doc(old, catalog, loader=store.load)["ok"] + # 拿 4 版复核这份老文档:引用上的字还是原样,照样对得上(引用上没记换算,按引用上的字渲染) + assert {s["ref"]: s["cite"].get("conv") for s in iter_segments(old) if s.get("ref")} == \ + {"a:A1.top_share": None, "v:A1.r0.share": None} + # 反过来:4 版组装的文档按 3 版复核,引用上的字是 61.9%,老规则渲染出来是原样,判对不上 + now = compose_doc("占比 [[a:A1.top_share]]。[[see:A1]]", catalog, loader=store.load) + mismatched = verify_doc({**now, "cell_display": 3}, catalog, loader=store.load) + assert mismatched["ok"] is False + assert [v["code"] for v in mismatched["violations"]] == ["render_mismatch"] + + +# -------------------------------------------------------------------------- +# 写作目录 +# -------------------------------------------------------------------------- + + +def test_the_writer_catalog_shows_the_shares_as_percentages(): + store, catalog = catalog_of() + text = writer_catalog(catalog, loader=store.load).text + section = text[text.index("分析结论("):text.index("查询结果(")] + assert "top_share=61.9%" in section and "top_share=0.618" not in section + assert "r0:region=华东,base=820,target=700,delta=-120,pct=-14.6%,share=61.9%" in section + assert "份额、变化率不写换算也按百分数显示" in section or "不写换算也按百分数显示" in section + + +# -------------------------------------------------------------------------- +# 证据面板接口 +# -------------------------------------------------------------------------- + + +@pytest.fixture +async def client(): + async with AsyncClient(transport=ASGITransport(app=asgi), base_url="http://test") as c: + yield c + + +async def test_the_panel_shows_the_named_value_and_the_table_cells_as_written(client): + made = await sealed_run("[[a:A1]]。占比 [[a:A1.top_share]],[[v:A1.r0.share]]。[[see:A1]]") + body = (await client.get( + f"/api/runs/{made['run']}/evidence/segments/{seg_id(made['doc'], 'a:A1.top_share')}")).json() + calc = body["chain"][2] + top = next(v for v in calc["values"] if v["key"] == "top_share") + assert top["raw"] == "0.618556701031" and top["rendered"] == "61.9%" + rows = calc["table"]["rows"] + share = calc["table"]["columns"].index("share") + rate = calc["table"]["columns"].index("pct") + flag = calc["table"]["columns"].index("flag") + assert [r[share] for r in rows] == ["61.9%", "20.6%", "17.5%", "0.0%"] + assert rows[0][rate] == "-14.6%" and rows[0][flag] == "—" # 空格写「—」,不写 null + assert body["chain"][0]["render_ok"] is True + + +# -------------------------------------------------------------------------- +# 导出页、可验证报告 +# -------------------------------------------------------------------------- + + +NODE_NS = {"__name__": "node-check"} +try: + import shutil + import subprocess + from pathlib import Path + + import app.bundle + import app.report_export + NODE = shutil.which("node") +except Exception: # pragma: no cover + NODE = None + +RUNTIME = Path(app.report_export.__file__).parent / "runtime.js" if NODE else None +VERIFIER = Path(app.bundle.__file__).parent / "verifier.js" if NODE else None +DOM = Path(__file__).parent.joinpath("test_analysis_pages.py").read_text(encoding="utf-8").split('DOM = r"""', 1)[1] \ + .split('"""', 1)[0] + + +def run_node(script: str, path: Path, payload: dict[str, Any]) -> Any: + done = subprocess.run([NODE, "-e", DOM + script, str(path)], input=json.dumps(payload), capture_output=True, + text=True, timeout=120) + assert done.returncode == 0, done.stderr[-3000:] + return json.loads(done.stdout) + + +RUN_RUNTIME = r""" +document.getElementById('report-data').textContent = input.data +new Function(fs.readFileSync(process.argv[1], 'utf8'))() +const out = {} +for (const seg of input.segs) { + const el = new El_('button') + for (const [k, v] of Object.entries(seg)) el.setAttribute(`data-${k}`, v) + el.textContent = seg.text + for (const f of document.getElementById('report').listeners.click || []) f({ target: el }) + out[seg.seg] = document.getElementById('detail-body').textContent +} +process.stdout.write(JSON.stringify(out)) +""" + +RUN_VERIFIER = r""" +document.getElementById('bundle-data').textContent = input.data +document.getElementById('seal-hash').textContent = input.seal +new Function(fs.readFileSync(process.argv[1], 'utf8'))() +setTimeout(() => { + const reports = document.getElementById('reports') + const out = { opened: {} } + for (const btn of find(reports, (n) => n.attrs['data-num'])) { + for (const f of btn.listeners.click || []) f() + out.opened[btn.attrs['data-num']] = document.getElementById('detail-body').textContent + } + out.verified = document.documentElement.attrs['data-verified'] ?? null + process.stdout.write(JSON.stringify(out)) +}, 200) +""" + + +@pytest.mark.skipif(NODE is None, reason="没有 node,无法执行页面上的脚本") +async def test_the_export_page_shows_percentages_in_the_calculation_step(): + made = await sealed_run("[[a:A1]]。占比 [[a:A1.top_share]],[[v:A1.r0.share]]。[[see:A1]]") + async with AsyncClient(transport=ASGITransport(app=asgi), base_url="http://test") as c: + html = (await c.get(f"/api/runs/{made['run']}/report.html")).text + import re + + data = re.search(r'', html, re.S).group(1) + phrase = seg_id(made["doc"], "a:A1") + out = run_node(RUN_RUNTIME, RUNTIME, {"data": data, "segs": [ + {"seg": phrase, "kind": "analysis", "state": "deterministic", "text": made["result"]["phrase"]}]}) + body = out[phrase].replace(" ", "").replace(" ", "") + # 具名的数、结果表的格按结论记的格式写:top_share 61.9%、变化率 -14.6%,没有原始小数、没有 null + assert "top_share61.9%" in body and "top_k_share82.5%" in body + assert "占变化的比重" in body and "-14.6%" in body + assert "0.618556701" not in body and "null" not in body + + +@pytest.mark.skipif(NODE is None, reason="没有 node,无法执行页面上的脚本") +def test_the_verifiable_report_renders_the_conclusion_format(): + bundle, _, _ = bundle_of("## 异动\n\n[[a:A1]]。华东占 [[a:A1.top_share]],占比 [[v:A1.r0.share]]。[[see:A1]]") + out = run_node(RUN_VERIFIER, VERIFIER, {"data": json.dumps(bundle), "seal": bundle["meta"]["manifest_hash"]}) + assert out["verified"] == "" + share = next(text for text in out["opened"].values() if "具名的数「top_share」" in text) + assert "正文显示61.9%(与按显示规则渲染的结果一致)" in share + cell = next(text for text in out["opened"].values() if "结果表 · 第 1 行 · share" in text) + assert "正文显示61.9%" in cell \ No newline at end of file diff --git a/backend/tests/test_analysis_evidence_api.py b/backend/tests/test_analysis_evidence_api.py index 322c3801..7a46e3f8 100644 --- a/backend/tests/test_analysis_evidence_api.py +++ b/backend/tests/test_analysis_evidence_api.py @@ -170,7 +170,7 @@ async def test_named_values_and_result_cells_point_at_what_they_cite(client): assert value["segment"]["text"] == "61.9%" and value["chain"][0]["render_ok"] is True calc = value["chain"][2] assert next(v for v in calc["values"] if v["key"] == "top_share") == { - "key": "top_share", "raw": "0.618556701031", "rendered": "0.618556701", "cited": True} + "key": "top_share", "raw": "0.618556701031", "rendered": "61.9%", "cited": True} assert value["chain"][-2]["text"] == "复算一致:按封存的输入重新计算,结论逐项相同" assert value["note"] == "这个数取自分析结论的具名的数,由系统按固定规则显示,未经模型转写" @@ -372,10 +372,10 @@ async def test_a_ratio_headline_closes_against_the_overall_ratio(client): made = await ratio_run() body = (await client.get(f"/api/runs/{made['run']}/evidence/segments/{seg_id(made['doc'], 'a:A1')}")).json() inputs = {s["role"]: s for s in body["chain"] if s["step"] == "analysis_input"} - assert inputs["headline_base"]["closure"] == {"mode": "ratio", "total_key": "r_base_total", "total": "0.035", - "headline": "0.035", "closed": True} - assert inputs["headline_target"]["closure"] == {"mode": "ratio", "total_key": "r_target_total", "total": "0.053", - "headline": "0.053", "closed": True} + assert inputs["headline_base"]["closure"] == {"mode": "ratio", "total_key": "r_base_total", "total": "3.5%", + "headline": "3.5%", "closed": True} + assert inputs["headline_target"]["closure"] == {"mode": "ratio", "total_key": "r_target_total", "total": "5.3%", + "headline": "5.3%", "closed": True} assert inputs["headline_base"]["role_label"] == "基期整体比率" assert inputs["headline_target"]["role_label"] == "本期整体比率" assert next(s for s in body["chain"] if s["step"] == "analysis_recompute")["status"] == "same" diff --git a/backend/tests/test_analysis_pages.py b/backend/tests/test_analysis_pages.py index f497873b..a7d19398 100644 --- a/backend/tests/test_analysis_pages.py +++ b/backend/tests/test_analysis_pages.py @@ -163,7 +163,8 @@ async def test_the_export_page_opens_the_analysis_steps_and_the_scope_numbers(): async def test_the_export_page_speaks_of_the_overall_ratio_for_a_ratio_decomposition(): """比率拆解的总数那一格是整体比率:导出页写「整体比率那一格」「整体比率 x 与各段分子之和 ÷ 分母之和 y 闭合」,不说 - 「各段之和」。可加拆解照旧(上一个用例的页面里没有「整体比率」)。""" + 「各段之和」。比率按结论记的格式写成百分数(3.5%,不是 0.035),两格一致。可加拆解照旧(上一个用例的页面里没有 + 「整体比率」)。""" made = await ratio_run() async with AsyncClient(transport=ASGITransport(app=asgi), base_url="http://test") as client: html = (await client.get(f"/api/runs/{made['run']}/report.html")).text @@ -172,9 +173,9 @@ async def test_the_export_page_speaks_of_the_overall_ratio_for_a_ratio_decomposi out = run_node(RUN_RUNTIME, RUNTIME, {"data": data, "segs": [ {"seg": phrase, "kind": "analysis", "state": "deterministic", "text": made["result"]["phrase"]}]}) body = out[phrase]["body"] - for text in ("基期整体比率", "整体比率那一格", "第 1 行「rate」 = 0.035", - "整体比率 0.035 与各段分子之和 ÷ 分母之和 0.035 闭合", - "整体比率 0.053 与各段分子之和 ÷ 分母之和 0.053 闭合"): + for text in ("基期整体比率", "整体比率那一格", "自身效应", "结构效应", + "整体比率 3.5% 与各段分子之和 ÷ 分母之和 3.5% 闭合", + "整体比率 5.3% 与各段分子之和 ÷ 分母之和 5.3% 闭合"): assert text in body, text assert "各段之和 0.0" not in body diff --git a/backend/tests/test_analysis_run.py b/backend/tests/test_analysis_run.py index 85b07b9a..c44d5423 100644 --- a/backend/tests/test_analysis_run.py +++ b/backend/tests/test_analysis_run.py @@ -44,8 +44,10 @@ async def _run(op, mode, params, *, probe=None, **kw): def _assert_shape(result): - """结论的字段、取值严格按契约。""" - assert set(result) == set(c.AnalysisResult.__annotations__) + """结论的字段、取值严格按契约。两样可选的(第 2 波 S1 加):结论的 value_formats(具名的数的换算)、结果表的 + formats(以比率存的列的换算)——都为空时整项不写,和以前的结论一字不差。""" + assert set(result) <= set(c.AnalysisResult.__annotations__) + assert set(c.AnalysisResult.__annotations__) - set(result) <= {"value_formats"} assert result["op"] in c.OPS and result["method"] == c.METHODS[(result["op"], result["mode"])] assert result["status"] in ("ok", "refused") if result["status"] == "refused": @@ -57,11 +59,15 @@ def _assert_shape(result): assert all(isinstance(s, list) and all(isinstance(x, str) for x in s) for s in result["verdict"]["subjects"]) assert result["verdict"]["direction"] in (None, "up", "down") table = result["table"] - assert set(table) == {"columns", "labels", "rows", "column_types"} + assert set(table) - {"formats"} == {"columns", "labels", "rows", "column_types"} assert set(table["labels"]) == set(table["columns"]) and set(table["column_types"]) <= set(table["columns"]) assert list(table["column_types"]) == [c for c in table["columns"] if c in table["column_types"]] assert set(table["column_types"].values()) <= {"number", "text", "date", "datetime", "time", "boolean"} assert all(len(r) == len(table["columns"]) for r in table["rows"]) + assert set(table.get("formats") or {}) <= set(table["columns"]) + assert set((table.get("formats") or {}).values()) <= set(c.FORMAT_CONVS) + assert set(result.get("value_formats") or {}) <= set(result["values"]) + assert set((result.get("value_formats") or {}).values()) <= set(c.FORMAT_CONVS) assert all(v is None or isinstance(v, str) for v in result["values"].values()) assert all(set(cv) == {"code", "text"} and cv["code"] in c.CAVEATS for cv in result["caveats"]) assert set(result["settings"]) <= set(c.DEFAULTS) diff --git a/backend/tests/test_bundle_shown.py b/backend/tests/test_bundle_shown.py index a29efb6f..617cec9b 100644 --- a/backend/tests/test_bundle_shown.py +++ b/backend/tests/test_bundle_shown.py @@ -413,7 +413,7 @@ def test_an_unknown_cell_display_version_cannot_pass(): bundle = formats_bundle() art, doc = doc_of(bundle) - doc["cell_display"] = 4 + doc["cell_display"] = 9 got = verdicts(reseal(bundle, art, doc)) cells = [n for n in got["numbers"] if n["ref"].startswith("v:")] assert cells and all(n["result"] == "na" and n["reason"].startswith("无法核对显示文字:") for n in cells) diff --git a/docs/en/analysis.md b/docs/en/analysis.md index f023a838..8e55d826 100644 --- a/docs/en/analysis.md +++ b/docs/en/analysis.md @@ -143,6 +143,7 @@ The built-in template 11, Anomaly Analysis (Traceable), is built this way: fetch ``` - The Analysis Conclusions section of the writing catalog lists each conclusion's number, verdict phrase, named values, the top 10 segments of its result table, and caveats or the reason it couldn't be done. +- The system shows shares and change rates in analysis conclusions as percentages (`[[a:A1.top_share]]` and `[[v:A1.r0.share]]` render as 62.0%), and changes in rates in percentage points (1.2 percentage points); writers cite them as usual and do not add a conversion. A conversion the writer does write is kept. - Conclusions from analysis cards can always be cited. In formal issuance at the governed level, analyses an agent ran on the spot with analysis tools follow the same rule as the cells it queried: they can be cited only when the issuance contract turns on Cell Citations (they can still serve as the basis at the end of a sentence). - The measure name in a verdict phrase comes from the agent or the template; the system first strips digits, percent signs, units, and citation markers from it and cuts it to 20 characters, so text written by the system never smuggles in numbers written by the model. diff --git a/docs/en/evidence.md b/docs/en/evidence.md index 3e437a2b..573892c3 100644 --- a/docs/en/evidence.md +++ b/docs/en/evidence.md @@ -98,7 +98,7 @@ In the report-writer node (`report`), the model writes only citation markers, an [[see:m:gmv,Q1,A1]] basis of a claim sentence; attached at the end of the sentence, not rendered ``` -Analysis conclusions are numbered A1, A2, … in ledger order, and the writing catalog has a separate Analysis Conclusions section. Judgment words such as "mainly from", "unusual", or "rising steadily" must cite a matching analysis conclusion and agree with its verdict; see [Analysis claim check](analysis.md#analysis-claim-check). +Analysis conclusions are numbered A1, A2, … in ledger order, and the writing catalog has a separate Analysis Conclusions section. The system shows shares and change rates in analysis conclusions as percentages (`[[a:A1.top_share]]` renders as 62.0%), and changes in rates in percentage points (1.2 percentage points); writers cite them as usual and do not add a conversion. Judgment words such as "mainly from", "unusual", or "rising steadily" must cite a matching analysis conclusion and agree with its verdict; see [Analysis claim check](analysis.md#analysis-claim-check). ### Handling violations diff --git a/docs/zh-CN/analysis.md b/docs/zh-CN/analysis.md index d0f442b6..9c8a0224 100644 --- a/docs/zh-CN/analysis.md +++ b/docs/zh-CN/analysis.md @@ -143,6 +143,7 @@ ``` - 写作目录里「分析结论」一段列出每份结论的编号、判定语、具名的数、结果表的前 10 段、附带说明或算不了的原因。 +- 分析结论里的占比、变化率由系统按百分数显示(`[[a:A1.top_share]]`、`[[v:A1.r0.share]]` 写出来是 62.0%),比率的变化按百分点(1.2 个百分点),写作者照常引用、不用自己写换算;自己写了换算的照他的。 - 分析卡的结论总能引用。受管级别的正式出具里,Agent 用分析工具现场做的分析和它查的格同一个规矩:出具契约开了「单元格引用」才能引用(句末依据照样能挂)。 - 判定语里的度量叫法是 Agent 或模板给的,系统先去掉里面的数字、百分号、单位和引用标记,截到 20 字以内:系统写的字里不会夹带模型写的数。 diff --git a/docs/zh-CN/evidence.md b/docs/zh-CN/evidence.md index 731e6b69..e4486049 100644 --- a/docs/zh-CN/evidence.md +++ b/docs/zh-CN/evidence.md @@ -98,7 +98,7 @@ flowchart LR [[see:m:gmv,Q1,A1]] 结论句的依据,挂在句末,不渲染 ``` -分析结论按台账先后编成 A1、A2……,写作目录里另有一段「分析结论」。「主要来自」「异常」「持续上升」这类判断词要挂对应的分析结论、判定对得上,见[分析说法核对](analysis.md#分析说法核对)。 +分析结论按台账先后编成 A1、A2……,写作目录里另有一段「分析结论」。分析结论里的占比、变化率由系统按百分数显示(`[[a:A1.top_share]]` 写出来是 62.0%),比率的变化按百分点(1.2 个百分点),写作者照常引用、不用自己写换算。「主要来自」「异常」「持续上升」这类判断词要挂对应的分析结论、判定对得上,见[分析说法核对](analysis.md#分析说法核对)。 ### 违规怎么处理 diff --git a/frontend/src/run/EvidenceAnalysis.tsx b/frontend/src/run/EvidenceAnalysis.tsx index b3f8a599..e831e7ee 100644 --- a/frontend/src/run/EvidenceAnalysis.tsx +++ b/frontend/src/run/EvidenceAnalysis.tsx @@ -192,7 +192,8 @@ function MethodPart({ step }: { step: EvidenceAnalysisStep }) { ) } -/** 计算:关键数的代入式、具名的数(被引用的那个描出来)、结果表(被引用的那一格高亮,遮罩的列写「已遮罩」) */ +/** 计算:关键数的代入式、具名的数(被引用的那个描出来)、结果表(被引用的那一格高亮,遮罩的列写「已遮罩」)。 + * 数与格都是服务端按结论记的格式写好的字(占比、变化率是百分数,空格是「—」),这里照原样显示 */ function CalcPart({ step }: { step: EvidenceAnalysisStep }) { const table = step.table && Array.isArray(step.table.columns) && Array.isArray(step.table.rows) ? step.table : null const labels = table?.labels ?? {} diff --git a/frontend/src/run/__tests__/evidence-analysis.json b/frontend/src/run/__tests__/evidence-analysis.json index a4780114..746cb12b 100644 --- a/frontend/src/run/__tests__/evidence-analysis.json +++ b/frontend/src/run/__tests__/evidence-analysis.json @@ -1,9 +1,9 @@ { "_comment": "分析能力一轮(W2-c)证据面板、正文的前端夹具:/tmp/agentlab-fix/w2c/test_zz_w2c_capture.py 生成(照 backend/tests/test_analysis_e2e_claims.py 的虚构零售库 shop,数据目录标了地区、渠道是属性;Agent、写作模型都换成脚本)。agent:Agent 查两次库、写错一次变化拆解、做变化拆解(A1 主要来自华东)、波动基线(A2 两周历史不够,算不了)、可比性检查(A3),报告引用 A1 的判定语、结果表的一格、具名的数,另有三句说法违规(主要来自华南、异常、由于),文档末尾系统写的分析范围;card:分析卡两项(A1 波动基线算不了、A2 按地区拆解),报告里有一张表引用结果表的格;metric:口径卡的环比用到两份同形查询,指标上挂着可比性。片段接口、证据图、审计、分析范围里每个编号的出处链(GET …/evidence/analyses/{alias})都是真后端答的。只用通用名", "agent": { - "run_id": "ed3de345aac143089fb3d0777d9056ec", + "run_id": "6d4d8c841a7d4900a3495f24bc932afa", "run_class": "exploratory", - "doc_artifact": "d115c361e8ae4f6d06bd4f839c6f6f6c62c0721575b048da7350834f8ce41389", + "doc_artifact": "32cc0cc3a309ef588a619cbf69d277710b6c0505b9c36ca880b50feaebca63dc", "doc": { "analysis_claims": { "lexicon": 1, @@ -109,7 +109,7 @@ "see": [ { "alias": "A1", - "eid": "ev:analysis:10fb652eb3e403a8", + "eid": "ev:analysis:a7edbc13c92c31a0", "kind": "analysis", "locator": {}, "ref": "A1", @@ -131,7 +131,7 @@ { "cite": { "alias": "A1", - "eid": "ev:analysis:10fb652eb3e403a8", + "eid": "ev:analysis:a7edbc13c92c31a0", "kind": "analysis", "locator": {}, "ref": "A1", @@ -202,7 +202,7 @@ { "cite": { "alias": "A1", - "eid": "ev:cell:164abd36aeac4c3b", + "eid": "ev:cell:a7deaec3f4ed6ab6", "kind": "cell", "locator": { "column": "delta", @@ -238,7 +238,7 @@ "cite": { "alias": "A1", "conv": "pct", - "eid": "ev:analysis:efc6267321553bc3", + "eid": "ev:analysis:5517f6de3df56204", "kind": "analysis", "locator": { "key": "top_share" @@ -290,7 +290,7 @@ "see": [ { "alias": "A1", - "eid": "ev:analysis:10fb652eb3e403a8", + "eid": "ev:analysis:a7edbc13c92c31a0", "kind": "analysis", "locator": {}, "ref": "A1", @@ -402,18 +402,753 @@ ] } ] + }, + { + "id": "b6", + "type": "paragraph", + "units": [ + { + "cites": [ + "A1" + ], + "id": "u6", + "kind": "claim", + "see": [], + "segments": [ + { + "id": "s17", + "kind": "structural", + "span": [ + 115, + 117 + ], + "state": "neutral", + "text": "\n\n" + }, + { + "id": "s18", + "kind": "text", + "span": [ + 117, + 121 + ], + "state": "neutral", + "text": "变化率 " + }, + { + "cite": { + "alias": "A1", + "conv": "pct", + "eid": "ev:cell:32d18640349e7717", + "kind": "cell", + "locator": { + "column": "pct", + "row": 0 + }, + "ref": "A1.r0.pct", + "rendered": "-30.0%", + "role": "value", + "status": "resolved", + "value": -0.3 + }, + "id": "s19", + "kind": "number", + "ref": "v:A1.r0.pct", + "span": [ + 121, + 127 + ], + "state": "deterministic", + "text": "-30.0%" + }, + { + "id": "s20", + "kind": "text", + "span": [ + 127, + 131 + ], + "state": "neutral", + "text": "、比重 " + }, + { + "cite": { + "alias": "A1", + "conv": "pct", + "eid": "ev:cell:b36848a6055a5628", + "kind": "cell", + "locator": { + "column": "share", + "row": 0 + }, + "ref": "A1.r0.share", + "rendered": "88.2%", + "role": "value", + "status": "resolved", + "value": 0.882352941176 + }, + "id": "s21", + "kind": "number", + "ref": "v:A1.r0.share", + "span": [ + 131, + 136 + ], + "state": "deterministic", + "text": "88.2%" + }, + { + "id": "s22", + "kind": "text", + "span": [ + 136, + 140 + ], + "state": "neutral", + "text": "、占比 " + }, + { + "cite": { + "alias": "A1", + "conv": "pct", + "eid": "ev:analysis:5517f6de3df56204", + "kind": "analysis", + "locator": { + "key": "top_share" + }, + "ref": "A1.top_share", + "rendered": "88.2%", + "role": "value", + "status": "resolved", + "value": 0.882352941176 + }, + "id": "s23", + "kind": "number", + "ref": "a:A1.top_share", + "span": [ + 140, + 145 + ], + "state": "deterministic", + "text": "88.2%" + }, + { + "id": "s24", + "kind": "text", + "span": [ + 145, + 146 + ], + "state": "neutral", + "text": "。" + } + ], + "span": [ + 117, + 146 + ] + } + ] + }, + { + "id": "b7", + "type": "table", + "units": [ + { + "cites": [], + "id": "u7", + "kind": "connective", + "loc": { + "col": 0, + "row": -1 + }, + "see": [], + "segments": [ + { + "id": "s25", + "kind": "structural", + "span": [ + 146, + 150 + ], + "state": "neutral", + "text": "\n\n| " + }, + { + "id": "s26", + "kind": "text", + "span": [ + 150, + 152 + ], + "state": "neutral", + "text": "地区" + } + ], + "span": [ + 150, + 152 + ] + }, + { + "cites": [], + "id": "u8", + "kind": "connective", + "loc": { + "col": 1, + "row": -1 + }, + "see": [], + "segments": [ + { + "id": "s27", + "kind": "structural", + "span": [ + 152, + 155 + ], + "state": "neutral", + "text": " | " + }, + { + "id": "s28", + "kind": "text", + "span": [ + 155, + 157 + ], + "state": "neutral", + "text": "变化" + } + ], + "span": [ + 155, + 157 + ] + }, + { + "cites": [], + "id": "u9", + "kind": "connective", + "loc": { + "col": 2, + "row": -1 + }, + "see": [], + "segments": [ + { + "id": "s29", + "kind": "structural", + "span": [ + 157, + 160 + ], + "state": "neutral", + "text": " | " + }, + { + "id": "s30", + "kind": "text", + "span": [ + 160, + 163 + ], + "state": "neutral", + "text": "变化率" + } + ], + "span": [ + 160, + 163 + ] + }, + { + "cites": [], + "id": "u10", + "kind": "connective", + "loc": { + "col": 3, + "row": -1 + }, + "see": [], + "segments": [ + { + "id": "s31", + "kind": "structural", + "span": [ + 163, + 166 + ], + "state": "neutral", + "text": " | " + }, + { + "id": "s32", + "kind": "text", + "span": [ + 166, + 172 + ], + "state": "neutral", + "text": "占变化的比重" + } + ], + "span": [ + 166, + 172 + ] + }, + { + "cites": [ + "A1" + ], + "id": "u11", + "kind": "claim", + "loc": { + "col": 0, + "row": 0 + }, + "see": [], + "segments": [ + { + "id": "s33", + "kind": "structural", + "span": [ + 172, + 203 + ], + "state": "neutral", + "text": " |\n| --- | --- | --- | --- |\n| " + }, + { + "cite": { + "alias": "A1", + "eid": "ev:cell:cf44ef048f0ff6cf", + "kind": "cell", + "locator": { + "column": "region", + "row": 0 + }, + "ref": "A1.r0.region", + "rendered": "华东", + "role": "value", + "status": "resolved", + "value": "华东" + }, + "id": "s34", + "kind": "value", + "ref": "v:A1.r0.region", + "span": [ + 203, + 205 + ], + "state": "deterministic", + "text": "华东" + } + ], + "span": [ + 203, + 205 + ] + }, + { + "cites": [ + "A1" + ], + "id": "u12", + "kind": "claim", + "loc": { + "col": 1, + "row": 0 + }, + "see": [], + "segments": [ + { + "id": "s35", + "kind": "structural", + "span": [ + 205, + 208 + ], + "state": "neutral", + "text": " | " + }, + { + "cite": { + "alias": "A1", + "eid": "ev:cell:a7deaec3f4ed6ab6", + "kind": "cell", + "locator": { + "column": "delta", + "row": 0 + }, + "ref": "A1.r0.delta", + "rendered": "-300", + "role": "value", + "status": "resolved", + "value": -300 + }, + "id": "s36", + "kind": "number", + "ref": "v:A1.r0.delta", + "span": [ + 208, + 212 + ], + "state": "deterministic", + "text": "-300" + } + ], + "span": [ + 208, + 212 + ] + }, + { + "cites": [ + "A1" + ], + "id": "u13", + "kind": "claim", + "loc": { + "col": 2, + "row": 0 + }, + "see": [], + "segments": [ + { + "id": "s37", + "kind": "structural", + "span": [ + 212, + 215 + ], + "state": "neutral", + "text": " | " + }, + { + "cite": { + "alias": "A1", + "conv": "pct", + "eid": "ev:cell:32d18640349e7717", + "kind": "cell", + "locator": { + "column": "pct", + "row": 0 + }, + "ref": "A1.r0.pct", + "rendered": "-30.0%", + "role": "value", + "status": "resolved", + "value": -0.3 + }, + "id": "s38", + "kind": "number", + "ref": "v:A1.r0.pct", + "span": [ + 215, + 221 + ], + "state": "deterministic", + "text": "-30.0%" + } + ], + "span": [ + 215, + 221 + ] + }, + { + "cites": [ + "A1" + ], + "id": "u14", + "kind": "claim", + "loc": { + "col": 3, + "row": 0 + }, + "see": [], + "segments": [ + { + "id": "s39", + "kind": "structural", + "span": [ + 221, + 224 + ], + "state": "neutral", + "text": " | " + }, + { + "cite": { + "alias": "A1", + "conv": "pct", + "eid": "ev:cell:b36848a6055a5628", + "kind": "cell", + "locator": { + "column": "share", + "row": 0 + }, + "ref": "A1.r0.share", + "rendered": "88.2%", + "role": "value", + "status": "resolved", + "value": 0.882352941176 + }, + "id": "s40", + "kind": "number", + "ref": "v:A1.r0.share", + "span": [ + 224, + 229 + ], + "state": "deterministic", + "text": "88.2%" + } + ], + "span": [ + 224, + 229 + ] + }, + { + "cites": [ + "A1" + ], + "id": "u15", + "kind": "claim", + "loc": { + "col": 0, + "row": 1 + }, + "see": [], + "segments": [ + { + "id": "s41", + "kind": "structural", + "span": [ + 229, + 234 + ], + "state": "neutral", + "text": " |\n| " + }, + { + "cite": { + "alias": "A1", + "eid": "ev:cell:15977323c7fb25b1", + "kind": "cell", + "locator": { + "column": "region", + "row": 1 + }, + "ref": "A1.r1.region", + "rendered": "华南", + "role": "value", + "status": "resolved", + "value": "华南" + }, + "id": "s42", + "kind": "value", + "ref": "v:A1.r1.region", + "span": [ + 234, + 236 + ], + "state": "deterministic", + "text": "华南" + } + ], + "span": [ + 234, + 236 + ] + }, + { + "cites": [ + "A1" + ], + "id": "u16", + "kind": "claim", + "loc": { + "col": 1, + "row": 1 + }, + "see": [], + "segments": [ + { + "id": "s43", + "kind": "structural", + "span": [ + 236, + 239 + ], + "state": "neutral", + "text": " | " + }, + { + "cite": { + "alias": "A1", + "eid": "ev:cell:50fa5438a057327a", + "kind": "cell", + "locator": { + "column": "delta", + "row": 1 + }, + "ref": "A1.r1.delta", + "rendered": "-20", + "role": "value", + "status": "resolved", + "value": -20 + }, + "id": "s44", + "kind": "number", + "ref": "v:A1.r1.delta", + "span": [ + 239, + 242 + ], + "state": "deterministic", + "text": "-20" + } + ], + "span": [ + 239, + 242 + ] + }, + { + "cites": [ + "A1" + ], + "id": "u17", + "kind": "claim", + "loc": { + "col": 2, + "row": 1 + }, + "see": [], + "segments": [ + { + "id": "s45", + "kind": "structural", + "span": [ + 242, + 245 + ], + "state": "neutral", + "text": " | " + }, + { + "cite": { + "alias": "A1", + "conv": "pct", + "eid": "ev:cell:1bb9cb78a05f83a2", + "kind": "cell", + "locator": { + "column": "pct", + "row": 1 + }, + "ref": "A1.r1.pct", + "rendered": "-2.5%", + "role": "value", + "status": "resolved", + "value": -0.025 + }, + "id": "s46", + "kind": "number", + "ref": "v:A1.r1.pct", + "span": [ + 245, + 250 + ], + "state": "deterministic", + "text": "-2.5%" + } + ], + "span": [ + 245, + 250 + ] + }, + { + "cites": [ + "A1" + ], + "id": "u18", + "kind": "claim", + "loc": { + "col": 3, + "row": 1 + }, + "see": [], + "segments": [ + { + "id": "s47", + "kind": "structural", + "span": [ + 250, + 253 + ], + "state": "neutral", + "text": " | " + }, + { + "cite": { + "alias": "A1", + "conv": "pct", + "eid": "ev:cell:379dcf4b1b6947b1", + "kind": "cell", + "locator": { + "column": "share", + "row": 1 + }, + "ref": "A1.r1.share", + "rendered": "5.9%", + "role": "value", + "status": "resolved", + "value": 0.0588235294118 + }, + "id": "s48", + "kind": "number", + "ref": "v:A1.r1.share", + "span": [ + 253, + 257 + ], + "state": "deterministic", + "text": "5.9%" + }, + { + "id": "s49", + "kind": "structural", + "span": [ + 257, + 259 + ], + "state": "neutral", + "text": " |" + } + ], + "span": [ + 253, + 257 + ] + } + ] } ], "catalog": { "A1": { "alias": "A1", - "artifact": "6d06b2913312497d982d4e36e0c94a57c377b990110bac960d72d64979d7c12d", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", "call_id": "call_3", - "eid": "ev:analysis:10fb652eb3e403a8", + "eid": "ev:analysis:a7edbc13c92c31a0", "exec": 1, "inputs": [ - "8fa60a625e4a072804462dd66dde6b1634f9fbd8244183e626a6fdcd8acb87fc", - "94f47ca377dfd4fddc3e4bdba0466cbefdd6c4b66beaf4468332a9dd51be7901" + "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", + "8322aa7cc7c2ad7d63887acb8d88d34ef6b1a9ed948afdb3acc9f7bd5328f460" ], "kind": "analysis", "label": "变化拆解(可加) · 销售额下降 340(-12.6%),主要来自华东(-300,占 88.2%)", @@ -436,12 +1171,12 @@ }, "A2": { "alias": "A2", - "artifact": "2e4139852d4ca46f8ee328ce44cb2ddde14f79e54c1371b3a77e15bf232b0122", + "artifact": "edaa673d3f04f17f8968ef35209c2ad6b281a9d54de71e383bed7df318ec5d99", "call_id": "call_4", - "eid": "ev:analysis:436f6b967aa1414c", + "eid": "ev:analysis:d89ecaae59a168f0", "exec": 1, "inputs": [ - "8fa60a625e4a072804462dd66dde6b1634f9fbd8244183e626a6fdcd8acb87fc" + "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3" ], "kind": "analysis", "label": "波动基线 · 波动基线没有做成:只有 0 期历史,至少要 8 期", @@ -454,12 +1189,12 @@ }, "A3": { "alias": "A3", - "artifact": "afa2ea2ba75e5eb20e7f3372e3a9dea164eddb0338fa51c6b2fd9a808c09072a", + "artifact": "df87e1917658e653f79ccac7e43e2cf70210b04dc2194bb849eb099303b66f23", "call_id": "call_5", - "eid": "ev:analysis:bb168f2c30497439", + "eid": "ev:analysis:066e85d56f331b63", "exec": 1, "inputs": [ - "94f47ca377dfd4fddc3e4bdba0466cbefdd6c4b66beaf4468332a9dd51be7901" + "8322aa7cc7c2ad7d63887acb8d88d34ef6b1a9ed948afdb3acc9f7bd5328f460" ], "kind": "analysis", "label": "可比性检查 · 两期可比,窗口长度、整期、星期构成核对不了", @@ -480,13 +1215,13 @@ }, "Q1": { "alias": "Q1", - "artifact": "8fa60a625e4a072804462dd66dde6b1634f9fbd8244183e626a6fdcd8acb87fc", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", "call_id": "call_0", "columns": [ "week", "gmv" ], - "eid": "ev:query:ad723c3d0c0ae28c", + "eid": "ev:query:9c920fc7352dde33", "exec": 1, "kind": "query", "label": "db_query__shop · 2 行", @@ -496,18 +1231,18 @@ "source": "shop", "tool": "db_query__shop", "truncated": false, - "via": "6c603c020e74d0ad9022eb472d9a8cb4e1c3fc95b60f276a53e0ebfce9ba16d8" + "via": "47b58ee48f462b179b07112a04e036570be292673abc8ed9886d93141d0ef2d3" }, "Q2": { "alias": "Q2", - "artifact": "94f47ca377dfd4fddc3e4bdba0466cbefdd6c4b66beaf4468332a9dd51be7901", + "artifact": "8322aa7cc7c2ad7d63887acb8d88d34ef6b1a9ed948afdb3acc9f7bd5328f460", "call_id": "call_1", "columns": [ "region", "week", "gmv" ], - "eid": "ev:query:c390b8b187033425", + "eid": "ev:query:42ab65ce25770550", "exec": 1, "kind": "query", "label": "db_query__shop · 8 行", @@ -517,34 +1252,35 @@ "source": "shop", "tool": "db_query__shop", "truncated": false, - "via": "6f9f2696d27966294fc257843c079ff745509f15bdfe64ef6ee23ca24318ddc5" + "via": "59b5ceca23fcd9ff344ce565b29b9d877af673dafbe98782b7b37aeaf1a9a665" } }, + "cell_display": 4, "entity_syntax": 2, - "markdown": "## 本周销售\n\n销售额下降 340(-12.6%),主要来自华东(-300,占 88.2%)。\n\n华东的变化为 -300,占总变化的 88.2%。\n\n其中下降主要来自华南。\n\n销售额出现异常下降。\n\n由于促销结束,订单有所减少。", + "markdown": "## 本周销售\n\n销售额下降 340(-12.6%),主要来自华东(-300,占 88.2%)。\n\n华东的变化为 -300,占总变化的 88.2%。\n\n其中下降主要来自华南。\n\n销售额出现异常下降。\n\n由于促销结束,订单有所减少。\n\n变化率 -30.0%、比重 88.2%、占比 88.2%。\n\n| 地区 | 变化 | 变化率 | 占变化的比重 |\n| --- | --- | --- | --- |\n| 华东 | -300 | -30.0% | 88.2% |\n| 华南 | -20 | -2.5% | 5.9% |", "node_id": "write", "provenance": 1, - "run_id": "ed3de345aac143089fb3d0777d9056ec", + "run_id": "6d4d8c841a7d4900a3495f24bc932afa", "schema": "agentlab.report/1", - "source": "## 本周销售\n\n[[a:A1]]。[[see:A1]]\n\n华东的变化为 [[v:A1.r0.delta]],占总变化的 [[a:A1.top_share|pct]]。\n\n其中下降主要来自华南。[[see:A1]]\n\n销售额出现异常下降。\n\n由于促销结束,订单有所减少。", + "source": "## 本周销售\n\n[[a:A1]]。[[see:A1]]\n\n华东的变化为 [[v:A1.r0.delta]],占总变化的 [[a:A1.top_share|pct]]。\n\n其中下降主要来自华南。[[see:A1]]\n\n销售额出现异常下降。\n\n由于促销结束,订单有所减少。\n\n变化率 [[v:A1.r0.pct]]、比重 [[v:A1.r0.share]]、占比 [[a:A1.top_share]]。\n\n[[table:A1 cols=region,delta,pct,share rows=0-1]]", "stats": { "analysis_claims": 3, - "claims": 5, - "connective": 0, + "claims": 14, + "connective": 4, "entities": 0, "headings": 1, - "numbers": 2, - "numbers_cited": 2, + "numbers": 11, + "numbers_cited": 11, "quotes": 0, "see": 2, - "segments": 17, + "segments": 50, "uncited_claims": 2, "uncited_numbers": 0, - "units": 6, + "units": 19, "unknown_entities": 0, "unresolved": 0, "unverified_entities": 0, - "values": 1, + "values": 3, "violations": 3 }, "violations": [ @@ -603,7 +1339,7 @@ "s3": { "report": { "node_id": "write", - "doc_artifact": "d115c361e8ae4f6d06bd4f839c6f6f6c62c0721575b048da7350834f8ce41389" + "doc_artifact": "32cc0cc3a309ef588a619cbf69d277710b6c0505b9c36ca880b50feaebca63dc" }, "segment": { "id": "s3", @@ -618,7 +1354,7 @@ "ref": "a:A1", "cite": { "alias": "A1", - "eid": "ev:analysis:10fb652eb3e403a8", + "eid": "ev:analysis:a7edbc13c92c31a0", "kind": "analysis", "locator": {}, "ref": "A1", @@ -659,8 +1395,8 @@ "call_id": "call_3", "node_id": "bot", "label": "问数据", - "artifact": "6d06b2913312497d982d4e36e0c94a57c377b990110bac960d72d64979d7c12d", - "eid": "ev:analysis:10fb652eb3e403a8", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", + "eid": "ev:analysis:a7edbc13c92c31a0", "eid_ok": true, "cited": { "what": "phrase" @@ -778,7 +1514,7 @@ { "key": "pct_total", "raw": "-0.125925925926", - "rendered": "-0.1259259259" + "rendered": "-12.6%" }, { "key": "segments", @@ -798,7 +1534,7 @@ { "key": "top_k_share", "raw": "0.882352941176", - "rendered": "0.8823529412" + "rendered": "88.2%" }, { "key": "top_key", @@ -808,7 +1544,7 @@ { "key": "top_share", "raw": "0.882352941176", - "rendered": "0.8823529412" + "rendered": "88.2%" } ], "formulas": [ @@ -854,39 +1590,39 @@ "rows": [ [ "华东", - "1000", + "1,000", "700", "-300", - "-0.3", - "0.882352941176", - null + "-30.0%", + "88.2%", + "—" ], [ "华南", "800", "780", "-20", - "-0.025", - "0.0588235294118", - null + "-2.5%", + "5.9%", + "—" ], [ "华北", "600", "590", "-10", - "-0.0166666666667", - "0.0294117647059", - null + "-1.7%", + "2.9%", + "—" ], [ "西南", "300", "290", "-10", - "-0.0333333333333", - "0.0294117647059", - null + "-3.3%", + "2.9%", + "—" ] ], "masked": [], @@ -901,7 +1637,7 @@ "ref": "Q1.r0.gmv", "role": "headline_base", "role_label": "基期总数", - "artifact": "8fa60a625e4a072804462dd66dde6b1634f9fbd8244183e626a6fdcd8acb87fc", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", "row": 0, "column": "gmv", "value": "2700", @@ -923,7 +1659,7 @@ "ref": "Q1.r1.gmv", "role": "headline_target", "role_label": "本期总数", - "artifact": "8fa60a625e4a072804462dd66dde6b1634f9fbd8244183e626a6fdcd8acb87fc", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", "row": 1, "column": "gmv", "value": "2360", @@ -945,7 +1681,7 @@ "ref": "Q2", "role": "data", "role_label": "数据", - "artifact": "94f47ca377dfd4fddc3e4bdba0466cbefdd6c4b66beaf4468332a9dd51be7901", + "artifact": "8322aa7cc7c2ad7d63887acb8d88d34ef6b1a9ed948afdb3acc9f7bd5328f460", "columns": [ "region", "week", @@ -959,7 +1695,7 @@ { "step": "query", "alias": "Q1", - "artifact": "8fa60a625e4a072804462dd66dde6b1634f9fbd8244183e626a6fdcd8acb87fc", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", "node_id": "bot", "tool": "db_query__shop", "source": "shop", @@ -1011,7 +1747,7 @@ "gmv": "number", "week": "text" }, - "schema_artifact": "4c3229daead9cdde26fab4b3156cfc17eba8cec291a35b54e2af392a8a694aec", + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", "catalog": [ { "table": "orders", @@ -1023,7 +1759,7 @@ { "step": "query", "alias": "Q2", - "artifact": "94f47ca377dfd4fddc3e4bdba0466cbefdd6c4b66beaf4468332a9dd51be7901", + "artifact": "8322aa7cc7c2ad7d63887acb8d88d34ef6b1a9ed948afdb3acc9f7bd5328f460", "node_id": "bot", "tool": "db_query__shop", "source": "shop", @@ -1211,7 +1947,7 @@ "region": "text", "week": "text" }, - "schema_artifact": "4c3229daead9cdde26fab4b3156cfc17eba8cec291a35b54e2af392a8a694aec", + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", "catalog": [ { "table": "orders", @@ -1231,7 +1967,7 @@ "step": "analysis_seal", "alias": "A1", "node_id": "bot", - "artifact": "6d06b2913312497d982d4e36e0c94a57c377b990110bac960d72d64979d7c12d", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", "ledger": true, "hash_ok": true, "eid_ok": true, @@ -1252,7 +1988,7 @@ "s7": { "report": { "node_id": "write", - "doc_artifact": "d115c361e8ae4f6d06bd4f839c6f6f6c62c0721575b048da7350834f8ce41389" + "doc_artifact": "32cc0cc3a309ef588a619cbf69d277710b6c0505b9c36ca880b50feaebca63dc" }, "segment": { "id": "s7", @@ -1267,7 +2003,7 @@ "ref": "v:A1.r0.delta", "cite": { "alias": "A1", - "eid": "ev:cell:164abd36aeac4c3b", + "eid": "ev:cell:a7deaec3f4ed6ab6", "kind": "cell", "locator": { "column": "delta", @@ -1312,8 +2048,8 @@ "call_id": "call_3", "node_id": "bot", "label": "问数据", - "artifact": "6d06b2913312497d982d4e36e0c94a57c377b990110bac960d72d64979d7c12d", - "eid": "ev:analysis:10fb652eb3e403a8", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", + "eid": "ev:analysis:a7edbc13c92c31a0", "eid_ok": true, "cited": { "what": "cell", @@ -1435,7 +2171,7 @@ { "key": "pct_total", "raw": "-0.125925925926", - "rendered": "-0.1259259259" + "rendered": "-12.6%" }, { "key": "segments", @@ -1455,7 +2191,7 @@ { "key": "top_k_share", "raw": "0.882352941176", - "rendered": "0.8823529412" + "rendered": "88.2%" }, { "key": "top_key", @@ -1465,7 +2201,7 @@ { "key": "top_share", "raw": "0.882352941176", - "rendered": "0.8823529412" + "rendered": "88.2%" } ], "formulas": [ @@ -1511,39 +2247,39 @@ "rows": [ [ "华东", - "1000", + "1,000", "700", "-300", - "-0.3", - "0.882352941176", - null + "-30.0%", + "88.2%", + "—" ], [ "华南", "800", "780", "-20", - "-0.025", - "0.0588235294118", - null + "-2.5%", + "5.9%", + "—" ], [ "华北", "600", "590", "-10", - "-0.0166666666667", - "0.0294117647059", - null + "-1.7%", + "2.9%", + "—" ], [ "西南", "300", "290", "-10", - "-0.0333333333333", - "0.0294117647059", - null + "-3.3%", + "2.9%", + "—" ] ], "masked": [], @@ -1563,7 +2299,7 @@ "ref": "Q1.r0.gmv", "role": "headline_base", "role_label": "基期总数", - "artifact": "8fa60a625e4a072804462dd66dde6b1634f9fbd8244183e626a6fdcd8acb87fc", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", "row": 0, "column": "gmv", "value": "2700", @@ -1585,7 +2321,7 @@ "ref": "Q1.r1.gmv", "role": "headline_target", "role_label": "本期总数", - "artifact": "8fa60a625e4a072804462dd66dde6b1634f9fbd8244183e626a6fdcd8acb87fc", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", "row": 1, "column": "gmv", "value": "2360", @@ -1607,7 +2343,7 @@ "ref": "Q2", "role": "data", "role_label": "数据", - "artifact": "94f47ca377dfd4fddc3e4bdba0466cbefdd6c4b66beaf4468332a9dd51be7901", + "artifact": "8322aa7cc7c2ad7d63887acb8d88d34ef6b1a9ed948afdb3acc9f7bd5328f460", "columns": [ "region", "week", @@ -1621,7 +2357,7 @@ { "step": "query", "alias": "Q1", - "artifact": "8fa60a625e4a072804462dd66dde6b1634f9fbd8244183e626a6fdcd8acb87fc", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", "node_id": "bot", "tool": "db_query__shop", "source": "shop", @@ -1673,7 +2409,7 @@ "gmv": "number", "week": "text" }, - "schema_artifact": "4c3229daead9cdde26fab4b3156cfc17eba8cec291a35b54e2af392a8a694aec", + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", "catalog": [ { "table": "orders", @@ -1685,7 +2421,7 @@ { "step": "query", "alias": "Q2", - "artifact": "94f47ca377dfd4fddc3e4bdba0466cbefdd6c4b66beaf4468332a9dd51be7901", + "artifact": "8322aa7cc7c2ad7d63887acb8d88d34ef6b1a9ed948afdb3acc9f7bd5328f460", "node_id": "bot", "tool": "db_query__shop", "source": "shop", @@ -1873,7 +2609,7 @@ "region": "text", "week": "text" }, - "schema_artifact": "4c3229daead9cdde26fab4b3156cfc17eba8cec291a35b54e2af392a8a694aec", + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", "catalog": [ { "table": "orders", @@ -1893,7 +2629,7 @@ "step": "analysis_seal", "alias": "A1", "node_id": "bot", - "artifact": "6d06b2913312497d982d4e36e0c94a57c377b990110bac960d72d64979d7c12d", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", "ledger": true, "hash_ok": true, "eid_ok": true, @@ -1914,7 +2650,7 @@ "s9": { "report": { "node_id": "write", - "doc_artifact": "d115c361e8ae4f6d06bd4f839c6f6f6c62c0721575b048da7350834f8ce41389" + "doc_artifact": "32cc0cc3a309ef588a619cbf69d277710b6c0505b9c36ca880b50feaebca63dc" }, "segment": { "id": "s9", @@ -1930,7 +2666,7 @@ "cite": { "alias": "A1", "conv": "pct", - "eid": "ev:analysis:efc6267321553bc3", + "eid": "ev:analysis:5517f6de3df56204", "kind": "analysis", "locator": { "key": "top_share" @@ -1974,8 +2710,8 @@ "call_id": "call_3", "node_id": "bot", "label": "问数据", - "artifact": "6d06b2913312497d982d4e36e0c94a57c377b990110bac960d72d64979d7c12d", - "eid": "ev:analysis:10fb652eb3e403a8", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", + "eid": "ev:analysis:a7edbc13c92c31a0", "eid_ok": true, "cited": { "what": "value", @@ -2096,7 +2832,7 @@ { "key": "pct_total", "raw": "-0.125925925926", - "rendered": "-0.1259259259" + "rendered": "-12.6%" }, { "key": "segments", @@ -2116,7 +2852,7 @@ { "key": "top_k_share", "raw": "0.882352941176", - "rendered": "0.8823529412" + "rendered": "88.2%" }, { "key": "top_key", @@ -2126,7 +2862,7 @@ { "key": "top_share", "raw": "0.882352941176", - "rendered": "0.8823529412", + "rendered": "88.2%", "cited": true } ], @@ -2173,39 +2909,39 @@ "rows": [ [ "华东", - "1000", + "1,000", "700", "-300", - "-0.3", - "0.882352941176", - null + "-30.0%", + "88.2%", + "—" ], [ "华南", "800", "780", "-20", - "-0.025", - "0.0588235294118", - null + "-2.5%", + "5.9%", + "—" ], [ "华北", "600", "590", "-10", - "-0.0166666666667", - "0.0294117647059", - null + "-1.7%", + "2.9%", + "—" ], [ "西南", "300", "290", "-10", - "-0.0333333333333", - "0.0294117647059", - null + "-3.3%", + "2.9%", + "—" ] ], "masked": [], @@ -2220,7 +2956,7 @@ "ref": "Q1.r0.gmv", "role": "headline_base", "role_label": "基期总数", - "artifact": "8fa60a625e4a072804462dd66dde6b1634f9fbd8244183e626a6fdcd8acb87fc", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", "row": 0, "column": "gmv", "value": "2700", @@ -2242,7 +2978,7 @@ "ref": "Q1.r1.gmv", "role": "headline_target", "role_label": "本期总数", - "artifact": "8fa60a625e4a072804462dd66dde6b1634f9fbd8244183e626a6fdcd8acb87fc", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", "row": 1, "column": "gmv", "value": "2360", @@ -2264,7 +3000,7 @@ "ref": "Q2", "role": "data", "role_label": "数据", - "artifact": "94f47ca377dfd4fddc3e4bdba0466cbefdd6c4b66beaf4468332a9dd51be7901", + "artifact": "8322aa7cc7c2ad7d63887acb8d88d34ef6b1a9ed948afdb3acc9f7bd5328f460", "columns": [ "region", "week", @@ -2278,7 +3014,7 @@ { "step": "query", "alias": "Q1", - "artifact": "8fa60a625e4a072804462dd66dde6b1634f9fbd8244183e626a6fdcd8acb87fc", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", "node_id": "bot", "tool": "db_query__shop", "source": "shop", @@ -2330,7 +3066,7 @@ "gmv": "number", "week": "text" }, - "schema_artifact": "4c3229daead9cdde26fab4b3156cfc17eba8cec291a35b54e2af392a8a694aec", + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", "catalog": [ { "table": "orders", @@ -2342,7 +3078,7 @@ { "step": "query", "alias": "Q2", - "artifact": "94f47ca377dfd4fddc3e4bdba0466cbefdd6c4b66beaf4468332a9dd51be7901", + "artifact": "8322aa7cc7c2ad7d63887acb8d88d34ef6b1a9ed948afdb3acc9f7bd5328f460", "node_id": "bot", "tool": "db_query__shop", "source": "shop", @@ -2530,7 +3266,7 @@ "region": "text", "week": "text" }, - "schema_artifact": "4c3229daead9cdde26fab4b3156cfc17eba8cec291a35b54e2af392a8a694aec", + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", "catalog": [ { "table": "orders", @@ -2550,7 +3286,7 @@ "step": "analysis_seal", "alias": "A1", "node_id": "bot", - "artifact": "6d06b2913312497d982d4e36e0c94a57c377b990110bac960d72d64979d7c12d", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", "ledger": true, "hash_ok": true, "eid_ok": true, @@ -2571,7 +3307,7 @@ "s12": { "report": { "node_id": "write", - "doc_artifact": "d115c361e8ae4f6d06bd4f839c6f6f6c62c0721575b048da7350834f8ce41389" + "doc_artifact": "32cc0cc3a309ef588a619cbf69d277710b6c0505b9c36ca880b50feaebca63dc" }, "segment": { "id": "s12", @@ -2639,7 +3375,7 @@ "s14": { "report": { "node_id": "write", - "doc_artifact": "d115c361e8ae4f6d06bd4f839c6f6f6c62c0721575b048da7350834f8ce41389" + "doc_artifact": "32cc0cc3a309ef588a619cbf69d277710b6c0505b9c36ca880b50feaebca63dc" }, "segment": { "id": "s14", @@ -2703,7 +3439,7 @@ "s16": { "report": { "node_id": "write", - "doc_artifact": "d115c361e8ae4f6d06bd4f839c6f6f6c62c0721575b048da7350834f8ce41389" + "doc_artifact": "32cc0cc3a309ef588a619cbf69d277710b6c0505b9c36ca880b50feaebca63dc" }, "segment": { "id": "s16", @@ -2762,21 +3498,7261 @@ "redacted": { "columns": [] } + }, + "s19": { + "report": { + "node_id": "write", + "doc_artifact": "32cc0cc3a309ef588a619cbf69d277710b6c0505b9c36ca880b50feaebca63dc" + }, + "segment": { + "id": "s19", + "text": "-30.0%", + "kind": "number", + "state": "deterministic", + "span": [ + 121, + 127 + ], + "unit": "u6", + "ref": "v:A1.r0.pct", + "cite": { + "alias": "A1", + "conv": "pct", + "eid": "ev:cell:32d18640349e7717", + "kind": "cell", + "locator": { + "column": "pct", + "row": 0 + }, + "ref": "A1.r0.pct", + "rendered": "-30.0%", + "role": "value", + "status": "resolved", + "value": -0.3 + } + }, + "unit": { + "id": "u6", + "kind": "claim", + "text": "变化率 -30.0%、比重 88.2%、占比 88.2%。", + "span": [ + 117, + 146 + ], + "cites": [ + "A1" + ], + "on_demand": { + "available": true, + "reason": null, + "message": null + } + }, + "block": { + "id": "b6", + "type": "paragraph" + }, + "chain": [ + { + "step": "analysis", + "alias": "A1", + "op": "decompose", + "mode": "additive", + "method_label": "变化拆解(可加)", + "origin": "agent", + "call_id": "call_3", + "node_id": "bot", + "label": "问数据", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", + "eid": "ev:analysis:a7edbc13c92c31a0", + "eid_ok": true, + "cited": { + "what": "cell", + "row": 0, + "column": "pct", + "raw": "-0.3" + }, + "rendered": "-30.0%", + "render_ok": true, + "hash_ok": true, + "status": "ok", + "reason_code": null, + "reason": null, + "phrase": "销售额下降 340(-12.6%),主要来自华东(-300,占 88.2%)", + "criterion": "一段占总变化的一半以上算主要来源,最多前 2 段合计占 80% 以上算集中,总变化不到基期的 0.5% 算基本持平,各段之和要和总数对得上才判断变化来自哪里", + "verdict": { + "code": "driver", + "direction": "down", + "subjects": [ + [ + "华东" + ] + ] + }, + "caveats": [ + { + "code": "comparability", + "text": "没能核对本期的数据是否到齐(期次写成「年-W周号」,认不出 SQL 是按哪种周号算的,不知道是哪几天)" + } + ], + "hypothesis": "下降是不是集中在某个地区", + "hypothesis_note": "Agent 写的假设:说明这次在验证什么,不是分析结论,也不进报告正文" + }, + { + "step": "analysis_method", + "alias": "A1", + "method": "decompose.additive@1", + "method_label": "变化拆解(可加)", + "params": { + "base": "2026-W41", + "by": [ + "region" + ], + "catalog": { + "labels": { + "region": "地区", + "week": "周" + }, + "measures": { + "gmv": "flow" + } + }, + "headline": { + "base": "Q1.r0.gmv", + "target": "Q1.r1.gmv" + }, + "label": "销售额", + "measure": "gmv", + "period": "week", + "query": "Q2", + "target": "2026-W42", + "today": "2026-10-21" + }, + "settings": [ + { + "key": "main_share", + "label": "「主要来源」的占比", + "value": 0.5 + }, + { + "key": "concentration", + "label": "「集中」的合计占比", + "value": 0.8 + }, + { + "key": "offset_ratio", + "label": "记为「抵消」的比例", + "value": 0.25 + }, + { + "key": "flat_pct", + "label": "「基本持平」的幅度", + "value": 0.005 + }, + { + "key": "table_top_k", + "label": "列出前几段", + "value": 10 + } + ], + "probes": [] + }, + { + "step": "analysis_calc", + "alias": "A1", + "values": [ + { + "key": "base_total", + "raw": "2700", + "rendered": "2,700" + }, + { + "key": "delta_total", + "raw": "-340", + "rendered": "-340" + }, + { + "key": "gross_down", + "raw": "-340", + "rendered": "-340" + }, + { + "key": "gross_up", + "raw": "0", + "rendered": "0" + }, + { + "key": "pct_total", + "raw": "-0.125925925926", + "rendered": "-12.6%" + }, + { + "key": "segments", + "raw": "4", + "rendered": "4" + }, + { + "key": "target_total", + "raw": "2360", + "rendered": "2,360" + }, + { + "key": "top_k", + "raw": "1", + "rendered": "1" + }, + { + "key": "top_k_share", + "raw": "0.882352941176", + "rendered": "88.2%" + }, + { + "key": "top_key", + "raw": "华东", + "rendered": "华东" + }, + { + "key": "top_share", + "raw": "0.882352941176", + "rendered": "88.2%" + } + ], + "formulas": [ + { + "label": "总变化", + "text": "总变化 = 本期合计 − 基期合计 = 2,360 − 2,700 = -340" + }, + { + "label": "变化率", + "text": "变化率 = 总变化 ÷ 基期合计 = -340 ÷ 2,700 = -12.6%" + }, + { + "label": "占比", + "text": "华东的占比 = 华东的变化 ÷ 总变化 = -300 ÷ (-340) = 88.2%" + } + ], + "table": { + "columns": [ + "region", + "base", + "target", + "delta", + "pct", + "share", + "flag" + ], + "labels": { + "base": "基期", + "delta": "变化", + "flag": "说明", + "pct": "变化率", + "region": "地区", + "share": "占变化的比重", + "target": "本期" + }, + "total_rows": 4, + "row_index": [ + 0, + 1, + 2, + 3 + ], + "rows": [ + [ + "华东", + "1,000", + "700", + "-300", + "-30.0%", + "88.2%", + "—" + ], + [ + "华南", + "800", + "780", + "-20", + "-2.5%", + "5.9%", + "—" + ], + [ + "华北", + "600", + "590", + "-10", + "-1.7%", + "2.9%", + "—" + ], + [ + "西南", + "300", + "290", + "-10", + "-3.3%", + "2.9%", + "—" + ] + ], + "masked": [], + "highlight": { + "cells": [ + [ + 0, + "pct" + ] + ] + } + } + }, + { + "step": "analysis_input", + "of": "A1", + "ref": "Q1.r0.gmv", + "role": "headline_base", + "role_label": "基期总数", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", + "row": 0, + "column": "gmv", + "value": "2700", + "query": "Q1", + "node_id": "bot", + "sealed": true, + "closure": { + "mode": "additive", + "total_key": "base_total", + "total": "2,700", + "headline": "2,700", + "closed": true + } + }, + { + "step": "analysis_input", + "of": "A1", + "ref": "Q1.r1.gmv", + "role": "headline_target", + "role_label": "本期总数", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", + "row": 1, + "column": "gmv", + "value": "2360", + "query": "Q1", + "node_id": "bot", + "sealed": true, + "closure": { + "mode": "additive", + "total_key": "target_total", + "total": "2,360", + "headline": "2,360", + "closed": true + } + }, + { + "step": "analysis_input", + "of": "A1", + "ref": "Q2", + "role": "data", + "role_label": "数据", + "artifact": "8322aa7cc7c2ad7d63887acb8d88d34ef6b1a9ed948afdb3acc9f7bd5328f460", + "columns": [ + "region", + "week", + "gmv" + ], + "rows": "all", + "query": "Q2", + "node_id": "bot", + "sealed": true + }, + { + "step": "query", + "alias": "Q1", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", + "node_id": "bot", + "tool": "db_query__shop", + "source": "shop", + "sql": "SELECT week, SUM(amount) AS gmv FROM orders GROUP BY week ORDER BY week", + "columns": [ + "week", + "gmv" + ], + "rows": [ + [ + "2026-W41", + 2700 + ], + [ + "2026-W42", + 2360 + ] + ], + "row_offset": 0, + "row_index": [ + 0, + 1 + ], + "total_rows": 2, + "truncated": false, + "highlight": { + "rows": [ + 0, + 1 + ], + "cols": [ + "gmv" + ], + "cells": [ + [ + 0, + "gmv" + ], + [ + 1, + "gmv" + ] + ] + }, + "masked": [], + "hash_ok": true, + "sealed": true, + "column_types": { + "gmv": "number", + "week": "text" + }, + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", + "catalog": [ + { + "table": "orders", + "version": 1 + } + ], + "input_of": "A1" + }, + { + "step": "query", + "alias": "Q2", + "artifact": "8322aa7cc7c2ad7d63887acb8d88d34ef6b1a9ed948afdb3acc9f7bd5328f460", + "node_id": "bot", + "tool": "db_query__shop", + "source": "shop", + "sql": "SELECT region, week, SUM(amount) AS gmv FROM orders GROUP BY region, week ORDER BY region, week", + "columns": [ + "region", + "week", + "gmv" + ], + "rows": [ + [ + "华东", + "2026-W41", + 1000 + ], + [ + "华东", + "2026-W42", + 700 + ], + [ + "华北", + "2026-W41", + 600 + ], + [ + "华北", + "2026-W42", + 590 + ], + [ + "华南", + "2026-W41", + 800 + ], + [ + "华南", + "2026-W42", + 780 + ], + [ + "西南", + "2026-W41", + 300 + ], + [ + "西南", + "2026-W42", + 290 + ] + ], + "row_offset": 0, + "row_index": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7 + ], + "total_rows": 8, + "truncated": false, + "highlight": { + "rows": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7 + ], + "cols": [ + "region", + "week", + "gmv" + ], + "cells": [ + [ + 0, + "region" + ], + [ + 1, + "region" + ], + [ + 2, + "region" + ], + [ + 3, + "region" + ], + [ + 4, + "region" + ], + [ + 5, + "region" + ], + [ + 6, + "region" + ], + [ + 7, + "region" + ], + [ + 0, + "week" + ], + [ + 1, + "week" + ], + [ + 2, + "week" + ], + [ + 3, + "week" + ], + [ + 4, + "week" + ], + [ + 5, + "week" + ], + [ + 6, + "week" + ], + [ + 7, + "week" + ], + [ + 0, + "gmv" + ], + [ + 1, + "gmv" + ], + [ + 2, + "gmv" + ], + [ + 3, + "gmv" + ], + [ + 4, + "gmv" + ], + [ + 5, + "gmv" + ], + [ + 6, + "gmv" + ], + [ + 7, + "gmv" + ] + ] + }, + "masked": [], + "hash_ok": true, + "sealed": true, + "column_types": { + "gmv": "number", + "region": "text", + "week": "text" + }, + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", + "catalog": [ + { + "table": "orders", + "version": 1 + } + ], + "input_of": "A1" + }, + { + "step": "analysis_recompute", + "alias": "A1", + "method": "decompose.additive@1", + "status": "same", + "text": "复算一致:按封存的输入重新计算,结论逐项相同" + }, + { + "step": "analysis_seal", + "alias": "A1", + "node_id": "bot", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", + "ledger": true, + "hash_ok": true, + "eid_ok": true, + "sealed": true + } + ], + "note": "该值由系统从分析结论的结果表中取出、按固定规则显示,未经模型转写", + "violations": [], + "seal": { + "sealed": true, + "ok": true, + "covered": true + }, + "redacted": { + "columns": [] + } + }, + "s21": { + "report": { + "node_id": "write", + "doc_artifact": "32cc0cc3a309ef588a619cbf69d277710b6c0505b9c36ca880b50feaebca63dc" + }, + "segment": { + "id": "s21", + "text": "88.2%", + "kind": "number", + "state": "deterministic", + "span": [ + 131, + 136 + ], + "unit": "u6", + "ref": "v:A1.r0.share", + "cite": { + "alias": "A1", + "conv": "pct", + "eid": "ev:cell:b36848a6055a5628", + "kind": "cell", + "locator": { + "column": "share", + "row": 0 + }, + "ref": "A1.r0.share", + "rendered": "88.2%", + "role": "value", + "status": "resolved", + "value": 0.882352941176 + } + }, + "unit": { + "id": "u6", + "kind": "claim", + "text": "变化率 -30.0%、比重 88.2%、占比 88.2%。", + "span": [ + 117, + 146 + ], + "cites": [ + "A1" + ], + "on_demand": { + "available": true, + "reason": null, + "message": null + } + }, + "block": { + "id": "b6", + "type": "paragraph" + }, + "chain": [ + { + "step": "analysis", + "alias": "A1", + "op": "decompose", + "mode": "additive", + "method_label": "变化拆解(可加)", + "origin": "agent", + "call_id": "call_3", + "node_id": "bot", + "label": "问数据", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", + "eid": "ev:analysis:a7edbc13c92c31a0", + "eid_ok": true, + "cited": { + "what": "cell", + "row": 0, + "column": "share", + "raw": "0.882352941176" + }, + "rendered": "88.2%", + "render_ok": true, + "hash_ok": true, + "status": "ok", + "reason_code": null, + "reason": null, + "phrase": "销售额下降 340(-12.6%),主要来自华东(-300,占 88.2%)", + "criterion": "一段占总变化的一半以上算主要来源,最多前 2 段合计占 80% 以上算集中,总变化不到基期的 0.5% 算基本持平,各段之和要和总数对得上才判断变化来自哪里", + "verdict": { + "code": "driver", + "direction": "down", + "subjects": [ + [ + "华东" + ] + ] + }, + "caveats": [ + { + "code": "comparability", + "text": "没能核对本期的数据是否到齐(期次写成「年-W周号」,认不出 SQL 是按哪种周号算的,不知道是哪几天)" + } + ], + "hypothesis": "下降是不是集中在某个地区", + "hypothesis_note": "Agent 写的假设:说明这次在验证什么,不是分析结论,也不进报告正文" + }, + { + "step": "analysis_method", + "alias": "A1", + "method": "decompose.additive@1", + "method_label": "变化拆解(可加)", + "params": { + "base": "2026-W41", + "by": [ + "region" + ], + "catalog": { + "labels": { + "region": "地区", + "week": "周" + }, + "measures": { + "gmv": "flow" + } + }, + "headline": { + "base": "Q1.r0.gmv", + "target": "Q1.r1.gmv" + }, + "label": "销售额", + "measure": "gmv", + "period": "week", + "query": "Q2", + "target": "2026-W42", + "today": "2026-10-21" + }, + "settings": [ + { + "key": "main_share", + "label": "「主要来源」的占比", + "value": 0.5 + }, + { + "key": "concentration", + "label": "「集中」的合计占比", + "value": 0.8 + }, + { + "key": "offset_ratio", + "label": "记为「抵消」的比例", + "value": 0.25 + }, + { + "key": "flat_pct", + "label": "「基本持平」的幅度", + "value": 0.005 + }, + { + "key": "table_top_k", + "label": "列出前几段", + "value": 10 + } + ], + "probes": [] + }, + { + "step": "analysis_calc", + "alias": "A1", + "values": [ + { + "key": "base_total", + "raw": "2700", + "rendered": "2,700" + }, + { + "key": "delta_total", + "raw": "-340", + "rendered": "-340" + }, + { + "key": "gross_down", + "raw": "-340", + "rendered": "-340" + }, + { + "key": "gross_up", + "raw": "0", + "rendered": "0" + }, + { + "key": "pct_total", + "raw": "-0.125925925926", + "rendered": "-12.6%" + }, + { + "key": "segments", + "raw": "4", + "rendered": "4" + }, + { + "key": "target_total", + "raw": "2360", + "rendered": "2,360" + }, + { + "key": "top_k", + "raw": "1", + "rendered": "1" + }, + { + "key": "top_k_share", + "raw": "0.882352941176", + "rendered": "88.2%" + }, + { + "key": "top_key", + "raw": "华东", + "rendered": "华东" + }, + { + "key": "top_share", + "raw": "0.882352941176", + "rendered": "88.2%" + } + ], + "formulas": [ + { + "label": "总变化", + "text": "总变化 = 本期合计 − 基期合计 = 2,360 − 2,700 = -340" + }, + { + "label": "变化率", + "text": "变化率 = 总变化 ÷ 基期合计 = -340 ÷ 2,700 = -12.6%" + }, + { + "label": "占比", + "text": "华东的占比 = 华东的变化 ÷ 总变化 = -300 ÷ (-340) = 88.2%" + } + ], + "table": { + "columns": [ + "region", + "base", + "target", + "delta", + "pct", + "share", + "flag" + ], + "labels": { + "base": "基期", + "delta": "变化", + "flag": "说明", + "pct": "变化率", + "region": "地区", + "share": "占变化的比重", + "target": "本期" + }, + "total_rows": 4, + "row_index": [ + 0, + 1, + 2, + 3 + ], + "rows": [ + [ + "华东", + "1,000", + "700", + "-300", + "-30.0%", + "88.2%", + "—" + ], + [ + "华南", + "800", + "780", + "-20", + "-2.5%", + "5.9%", + "—" + ], + [ + "华北", + "600", + "590", + "-10", + "-1.7%", + "2.9%", + "—" + ], + [ + "西南", + "300", + "290", + "-10", + "-3.3%", + "2.9%", + "—" + ] + ], + "masked": [], + "highlight": { + "cells": [ + [ + 0, + "share" + ] + ] + } + } + }, + { + "step": "analysis_input", + "of": "A1", + "ref": "Q1.r0.gmv", + "role": "headline_base", + "role_label": "基期总数", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", + "row": 0, + "column": "gmv", + "value": "2700", + "query": "Q1", + "node_id": "bot", + "sealed": true, + "closure": { + "mode": "additive", + "total_key": "base_total", + "total": "2,700", + "headline": "2,700", + "closed": true + } + }, + { + "step": "analysis_input", + "of": "A1", + "ref": "Q1.r1.gmv", + "role": "headline_target", + "role_label": "本期总数", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", + "row": 1, + "column": "gmv", + "value": "2360", + "query": "Q1", + "node_id": "bot", + "sealed": true, + "closure": { + "mode": "additive", + "total_key": "target_total", + "total": "2,360", + "headline": "2,360", + "closed": true + } + }, + { + "step": "analysis_input", + "of": "A1", + "ref": "Q2", + "role": "data", + "role_label": "数据", + "artifact": "8322aa7cc7c2ad7d63887acb8d88d34ef6b1a9ed948afdb3acc9f7bd5328f460", + "columns": [ + "region", + "week", + "gmv" + ], + "rows": "all", + "query": "Q2", + "node_id": "bot", + "sealed": true + }, + { + "step": "query", + "alias": "Q1", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", + "node_id": "bot", + "tool": "db_query__shop", + "source": "shop", + "sql": "SELECT week, SUM(amount) AS gmv FROM orders GROUP BY week ORDER BY week", + "columns": [ + "week", + "gmv" + ], + "rows": [ + [ + "2026-W41", + 2700 + ], + [ + "2026-W42", + 2360 + ] + ], + "row_offset": 0, + "row_index": [ + 0, + 1 + ], + "total_rows": 2, + "truncated": false, + "highlight": { + "rows": [ + 0, + 1 + ], + "cols": [ + "gmv" + ], + "cells": [ + [ + 0, + "gmv" + ], + [ + 1, + "gmv" + ] + ] + }, + "masked": [], + "hash_ok": true, + "sealed": true, + "column_types": { + "gmv": "number", + "week": "text" + }, + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", + "catalog": [ + { + "table": "orders", + "version": 1 + } + ], + "input_of": "A1" + }, + { + "step": "query", + "alias": "Q2", + "artifact": "8322aa7cc7c2ad7d63887acb8d88d34ef6b1a9ed948afdb3acc9f7bd5328f460", + "node_id": "bot", + "tool": "db_query__shop", + "source": "shop", + "sql": "SELECT region, week, SUM(amount) AS gmv FROM orders GROUP BY region, week ORDER BY region, week", + "columns": [ + "region", + "week", + "gmv" + ], + "rows": [ + [ + "华东", + "2026-W41", + 1000 + ], + [ + "华东", + "2026-W42", + 700 + ], + [ + "华北", + "2026-W41", + 600 + ], + [ + "华北", + "2026-W42", + 590 + ], + [ + "华南", + "2026-W41", + 800 + ], + [ + "华南", + "2026-W42", + 780 + ], + [ + "西南", + "2026-W41", + 300 + ], + [ + "西南", + "2026-W42", + 290 + ] + ], + "row_offset": 0, + "row_index": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7 + ], + "total_rows": 8, + "truncated": false, + "highlight": { + "rows": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7 + ], + "cols": [ + "region", + "week", + "gmv" + ], + "cells": [ + [ + 0, + "region" + ], + [ + 1, + "region" + ], + [ + 2, + "region" + ], + [ + 3, + "region" + ], + [ + 4, + "region" + ], + [ + 5, + "region" + ], + [ + 6, + "region" + ], + [ + 7, + "region" + ], + [ + 0, + "week" + ], + [ + 1, + "week" + ], + [ + 2, + "week" + ], + [ + 3, + "week" + ], + [ + 4, + "week" + ], + [ + 5, + "week" + ], + [ + 6, + "week" + ], + [ + 7, + "week" + ], + [ + 0, + "gmv" + ], + [ + 1, + "gmv" + ], + [ + 2, + "gmv" + ], + [ + 3, + "gmv" + ], + [ + 4, + "gmv" + ], + [ + 5, + "gmv" + ], + [ + 6, + "gmv" + ], + [ + 7, + "gmv" + ] + ] + }, + "masked": [], + "hash_ok": true, + "sealed": true, + "column_types": { + "gmv": "number", + "region": "text", + "week": "text" + }, + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", + "catalog": [ + { + "table": "orders", + "version": 1 + } + ], + "input_of": "A1" + }, + { + "step": "analysis_recompute", + "alias": "A1", + "method": "decompose.additive@1", + "status": "same", + "text": "复算一致:按封存的输入重新计算,结论逐项相同" + }, + { + "step": "analysis_seal", + "alias": "A1", + "node_id": "bot", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", + "ledger": true, + "hash_ok": true, + "eid_ok": true, + "sealed": true + } + ], + "note": "该值由系统从分析结论的结果表中取出、按固定规则显示,未经模型转写", + "violations": [], + "seal": { + "sealed": true, + "ok": true, + "covered": true + }, + "redacted": { + "columns": [] + } + }, + "s23": { + "report": { + "node_id": "write", + "doc_artifact": "32cc0cc3a309ef588a619cbf69d277710b6c0505b9c36ca880b50feaebca63dc" + }, + "segment": { + "id": "s23", + "text": "88.2%", + "kind": "number", + "state": "deterministic", + "span": [ + 140, + 145 + ], + "unit": "u6", + "ref": "a:A1.top_share", + "cite": { + "alias": "A1", + "conv": "pct", + "eid": "ev:analysis:5517f6de3df56204", + "kind": "analysis", + "locator": { + "key": "top_share" + }, + "ref": "A1.top_share", + "rendered": "88.2%", + "role": "value", + "status": "resolved", + "value": 0.882352941176 + } + }, + "unit": { + "id": "u6", + "kind": "claim", + "text": "变化率 -30.0%、比重 88.2%、占比 88.2%。", + "span": [ + 117, + 146 + ], + "cites": [ + "A1" + ], + "on_demand": { + "available": true, + "reason": null, + "message": null + } + }, + "block": { + "id": "b6", + "type": "paragraph" + }, + "chain": [ + { + "step": "analysis", + "alias": "A1", + "op": "decompose", + "mode": "additive", + "method_label": "变化拆解(可加)", + "origin": "agent", + "call_id": "call_3", + "node_id": "bot", + "label": "问数据", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", + "eid": "ev:analysis:a7edbc13c92c31a0", + "eid_ok": true, + "cited": { + "what": "value", + "key": "top_share", + "raw": "0.882352941176", + "conv": "pct" + }, + "rendered": "88.2%", + "render_ok": true, + "hash_ok": true, + "status": "ok", + "reason_code": null, + "reason": null, + "phrase": "销售额下降 340(-12.6%),主要来自华东(-300,占 88.2%)", + "criterion": "一段占总变化的一半以上算主要来源,最多前 2 段合计占 80% 以上算集中,总变化不到基期的 0.5% 算基本持平,各段之和要和总数对得上才判断变化来自哪里", + "verdict": { + "code": "driver", + "direction": "down", + "subjects": [ + [ + "华东" + ] + ] + }, + "caveats": [ + { + "code": "comparability", + "text": "没能核对本期的数据是否到齐(期次写成「年-W周号」,认不出 SQL 是按哪种周号算的,不知道是哪几天)" + } + ], + "hypothesis": "下降是不是集中在某个地区", + "hypothesis_note": "Agent 写的假设:说明这次在验证什么,不是分析结论,也不进报告正文" + }, + { + "step": "analysis_method", + "alias": "A1", + "method": "decompose.additive@1", + "method_label": "变化拆解(可加)", + "params": { + "base": "2026-W41", + "by": [ + "region" + ], + "catalog": { + "labels": { + "region": "地区", + "week": "周" + }, + "measures": { + "gmv": "flow" + } + }, + "headline": { + "base": "Q1.r0.gmv", + "target": "Q1.r1.gmv" + }, + "label": "销售额", + "measure": "gmv", + "period": "week", + "query": "Q2", + "target": "2026-W42", + "today": "2026-10-21" + }, + "settings": [ + { + "key": "main_share", + "label": "「主要来源」的占比", + "value": 0.5 + }, + { + "key": "concentration", + "label": "「集中」的合计占比", + "value": 0.8 + }, + { + "key": "offset_ratio", + "label": "记为「抵消」的比例", + "value": 0.25 + }, + { + "key": "flat_pct", + "label": "「基本持平」的幅度", + "value": 0.005 + }, + { + "key": "table_top_k", + "label": "列出前几段", + "value": 10 + } + ], + "probes": [] + }, + { + "step": "analysis_calc", + "alias": "A1", + "values": [ + { + "key": "base_total", + "raw": "2700", + "rendered": "2,700" + }, + { + "key": "delta_total", + "raw": "-340", + "rendered": "-340" + }, + { + "key": "gross_down", + "raw": "-340", + "rendered": "-340" + }, + { + "key": "gross_up", + "raw": "0", + "rendered": "0" + }, + { + "key": "pct_total", + "raw": "-0.125925925926", + "rendered": "-12.6%" + }, + { + "key": "segments", + "raw": "4", + "rendered": "4" + }, + { + "key": "target_total", + "raw": "2360", + "rendered": "2,360" + }, + { + "key": "top_k", + "raw": "1", + "rendered": "1" + }, + { + "key": "top_k_share", + "raw": "0.882352941176", + "rendered": "88.2%" + }, + { + "key": "top_key", + "raw": "华东", + "rendered": "华东" + }, + { + "key": "top_share", + "raw": "0.882352941176", + "rendered": "88.2%", + "cited": true + } + ], + "formulas": [ + { + "label": "总变化", + "text": "总变化 = 本期合计 − 基期合计 = 2,360 − 2,700 = -340" + }, + { + "label": "变化率", + "text": "变化率 = 总变化 ÷ 基期合计 = -340 ÷ 2,700 = -12.6%" + }, + { + "label": "占比", + "text": "华东的占比 = 华东的变化 ÷ 总变化 = -300 ÷ (-340) = 88.2%" + } + ], + "table": { + "columns": [ + "region", + "base", + "target", + "delta", + "pct", + "share", + "flag" + ], + "labels": { + "base": "基期", + "delta": "变化", + "flag": "说明", + "pct": "变化率", + "region": "地区", + "share": "占变化的比重", + "target": "本期" + }, + "total_rows": 4, + "row_index": [ + 0, + 1, + 2, + 3 + ], + "rows": [ + [ + "华东", + "1,000", + "700", + "-300", + "-30.0%", + "88.2%", + "—" + ], + [ + "华南", + "800", + "780", + "-20", + "-2.5%", + "5.9%", + "—" + ], + [ + "华北", + "600", + "590", + "-10", + "-1.7%", + "2.9%", + "—" + ], + [ + "西南", + "300", + "290", + "-10", + "-3.3%", + "2.9%", + "—" + ] + ], + "masked": [], + "highlight": { + "cells": [] + } + } + }, + { + "step": "analysis_input", + "of": "A1", + "ref": "Q1.r0.gmv", + "role": "headline_base", + "role_label": "基期总数", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", + "row": 0, + "column": "gmv", + "value": "2700", + "query": "Q1", + "node_id": "bot", + "sealed": true, + "closure": { + "mode": "additive", + "total_key": "base_total", + "total": "2,700", + "headline": "2,700", + "closed": true + } + }, + { + "step": "analysis_input", + "of": "A1", + "ref": "Q1.r1.gmv", + "role": "headline_target", + "role_label": "本期总数", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", + "row": 1, + "column": "gmv", + "value": "2360", + "query": "Q1", + "node_id": "bot", + "sealed": true, + "closure": { + "mode": "additive", + "total_key": "target_total", + "total": "2,360", + "headline": "2,360", + "closed": true + } + }, + { + "step": "analysis_input", + "of": "A1", + "ref": "Q2", + "role": "data", + "role_label": "数据", + "artifact": "8322aa7cc7c2ad7d63887acb8d88d34ef6b1a9ed948afdb3acc9f7bd5328f460", + "columns": [ + "region", + "week", + "gmv" + ], + "rows": "all", + "query": "Q2", + "node_id": "bot", + "sealed": true + }, + { + "step": "query", + "alias": "Q1", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", + "node_id": "bot", + "tool": "db_query__shop", + "source": "shop", + "sql": "SELECT week, SUM(amount) AS gmv FROM orders GROUP BY week ORDER BY week", + "columns": [ + "week", + "gmv" + ], + "rows": [ + [ + "2026-W41", + 2700 + ], + [ + "2026-W42", + 2360 + ] + ], + "row_offset": 0, + "row_index": [ + 0, + 1 + ], + "total_rows": 2, + "truncated": false, + "highlight": { + "rows": [ + 0, + 1 + ], + "cols": [ + "gmv" + ], + "cells": [ + [ + 0, + "gmv" + ], + [ + 1, + "gmv" + ] + ] + }, + "masked": [], + "hash_ok": true, + "sealed": true, + "column_types": { + "gmv": "number", + "week": "text" + }, + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", + "catalog": [ + { + "table": "orders", + "version": 1 + } + ], + "input_of": "A1" + }, + { + "step": "query", + "alias": "Q2", + "artifact": "8322aa7cc7c2ad7d63887acb8d88d34ef6b1a9ed948afdb3acc9f7bd5328f460", + "node_id": "bot", + "tool": "db_query__shop", + "source": "shop", + "sql": "SELECT region, week, SUM(amount) AS gmv FROM orders GROUP BY region, week ORDER BY region, week", + "columns": [ + "region", + "week", + "gmv" + ], + "rows": [ + [ + "华东", + "2026-W41", + 1000 + ], + [ + "华东", + "2026-W42", + 700 + ], + [ + "华北", + "2026-W41", + 600 + ], + [ + "华北", + "2026-W42", + 590 + ], + [ + "华南", + "2026-W41", + 800 + ], + [ + "华南", + "2026-W42", + 780 + ], + [ + "西南", + "2026-W41", + 300 + ], + [ + "西南", + "2026-W42", + 290 + ] + ], + "row_offset": 0, + "row_index": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7 + ], + "total_rows": 8, + "truncated": false, + "highlight": { + "rows": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7 + ], + "cols": [ + "region", + "week", + "gmv" + ], + "cells": [ + [ + 0, + "region" + ], + [ + 1, + "region" + ], + [ + 2, + "region" + ], + [ + 3, + "region" + ], + [ + 4, + "region" + ], + [ + 5, + "region" + ], + [ + 6, + "region" + ], + [ + 7, + "region" + ], + [ + 0, + "week" + ], + [ + 1, + "week" + ], + [ + 2, + "week" + ], + [ + 3, + "week" + ], + [ + 4, + "week" + ], + [ + 5, + "week" + ], + [ + 6, + "week" + ], + [ + 7, + "week" + ], + [ + 0, + "gmv" + ], + [ + 1, + "gmv" + ], + [ + 2, + "gmv" + ], + [ + 3, + "gmv" + ], + [ + 4, + "gmv" + ], + [ + 5, + "gmv" + ], + [ + 6, + "gmv" + ], + [ + 7, + "gmv" + ] + ] + }, + "masked": [], + "hash_ok": true, + "sealed": true, + "column_types": { + "gmv": "number", + "region": "text", + "week": "text" + }, + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", + "catalog": [ + { + "table": "orders", + "version": 1 + } + ], + "input_of": "A1" + }, + { + "step": "analysis_recompute", + "alias": "A1", + "method": "decompose.additive@1", + "status": "same", + "text": "复算一致:按封存的输入重新计算,结论逐项相同" + }, + { + "step": "analysis_seal", + "alias": "A1", + "node_id": "bot", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", + "ledger": true, + "hash_ok": true, + "eid_ok": true, + "sealed": true + } + ], + "note": "这个数取自分析结论的具名的数,由系统按固定规则显示,未经模型转写", + "violations": [], + "seal": { + "sealed": true, + "ok": true, + "covered": true + }, + "redacted": { + "columns": [] + } + }, + "s34": { + "report": { + "node_id": "write", + "doc_artifact": "32cc0cc3a309ef588a619cbf69d277710b6c0505b9c36ca880b50feaebca63dc" + }, + "segment": { + "id": "s34", + "text": "华东", + "kind": "value", + "state": "deterministic", + "span": [ + 203, + 205 + ], + "unit": "u11", + "ref": "v:A1.r0.region", + "cite": { + "alias": "A1", + "eid": "ev:cell:cf44ef048f0ff6cf", + "kind": "cell", + "locator": { + "column": "region", + "row": 0 + }, + "ref": "A1.r0.region", + "rendered": "华东", + "role": "value", + "status": "resolved", + "value": "华东" + } + }, + "unit": { + "id": "u11", + "kind": "claim", + "text": "华东", + "span": [ + 203, + 205 + ], + "cites": [ + "A1" + ], + "on_demand": { + "available": false, + "reason": "not_a_claim", + "message": "这句不是结论句(标题、连接性文字、表格单元格或代码),无需模型裁判" + } + }, + "block": { + "id": "b7", + "type": "table" + }, + "chain": [ + { + "step": "analysis", + "alias": "A1", + "op": "decompose", + "mode": "additive", + "method_label": "变化拆解(可加)", + "origin": "agent", + "call_id": "call_3", + "node_id": "bot", + "label": "问数据", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", + "eid": "ev:analysis:a7edbc13c92c31a0", + "eid_ok": true, + "cited": { + "what": "cell", + "row": 0, + "column": "region", + "raw": "华东" + }, + "rendered": "华东", + "render_ok": true, + "hash_ok": true, + "status": "ok", + "reason_code": null, + "reason": null, + "phrase": "销售额下降 340(-12.6%),主要来自华东(-300,占 88.2%)", + "criterion": "一段占总变化的一半以上算主要来源,最多前 2 段合计占 80% 以上算集中,总变化不到基期的 0.5% 算基本持平,各段之和要和总数对得上才判断变化来自哪里", + "verdict": { + "code": "driver", + "direction": "down", + "subjects": [ + [ + "华东" + ] + ] + }, + "caveats": [ + { + "code": "comparability", + "text": "没能核对本期的数据是否到齐(期次写成「年-W周号」,认不出 SQL 是按哪种周号算的,不知道是哪几天)" + } + ], + "hypothesis": "下降是不是集中在某个地区", + "hypothesis_note": "Agent 写的假设:说明这次在验证什么,不是分析结论,也不进报告正文" + }, + { + "step": "analysis_method", + "alias": "A1", + "method": "decompose.additive@1", + "method_label": "变化拆解(可加)", + "params": { + "base": "2026-W41", + "by": [ + "region" + ], + "catalog": { + "labels": { + "region": "地区", + "week": "周" + }, + "measures": { + "gmv": "flow" + } + }, + "headline": { + "base": "Q1.r0.gmv", + "target": "Q1.r1.gmv" + }, + "label": "销售额", + "measure": "gmv", + "period": "week", + "query": "Q2", + "target": "2026-W42", + "today": "2026-10-21" + }, + "settings": [ + { + "key": "main_share", + "label": "「主要来源」的占比", + "value": 0.5 + }, + { + "key": "concentration", + "label": "「集中」的合计占比", + "value": 0.8 + }, + { + "key": "offset_ratio", + "label": "记为「抵消」的比例", + "value": 0.25 + }, + { + "key": "flat_pct", + "label": "「基本持平」的幅度", + "value": 0.005 + }, + { + "key": "table_top_k", + "label": "列出前几段", + "value": 10 + } + ], + "probes": [] + }, + { + "step": "analysis_calc", + "alias": "A1", + "values": [ + { + "key": "base_total", + "raw": "2700", + "rendered": "2,700" + }, + { + "key": "delta_total", + "raw": "-340", + "rendered": "-340" + }, + { + "key": "gross_down", + "raw": "-340", + "rendered": "-340" + }, + { + "key": "gross_up", + "raw": "0", + "rendered": "0" + }, + { + "key": "pct_total", + "raw": "-0.125925925926", + "rendered": "-12.6%" + }, + { + "key": "segments", + "raw": "4", + "rendered": "4" + }, + { + "key": "target_total", + "raw": "2360", + "rendered": "2,360" + }, + { + "key": "top_k", + "raw": "1", + "rendered": "1" + }, + { + "key": "top_k_share", + "raw": "0.882352941176", + "rendered": "88.2%" + }, + { + "key": "top_key", + "raw": "华东", + "rendered": "华东" + }, + { + "key": "top_share", + "raw": "0.882352941176", + "rendered": "88.2%" + } + ], + "formulas": [ + { + "label": "总变化", + "text": "总变化 = 本期合计 − 基期合计 = 2,360 − 2,700 = -340" + }, + { + "label": "变化率", + "text": "变化率 = 总变化 ÷ 基期合计 = -340 ÷ 2,700 = -12.6%" + }, + { + "label": "占比", + "text": "华东的占比 = 华东的变化 ÷ 总变化 = -300 ÷ (-340) = 88.2%" + } + ], + "table": { + "columns": [ + "region", + "base", + "target", + "delta", + "pct", + "share", + "flag" + ], + "labels": { + "base": "基期", + "delta": "变化", + "flag": "说明", + "pct": "变化率", + "region": "地区", + "share": "占变化的比重", + "target": "本期" + }, + "total_rows": 4, + "row_index": [ + 0, + 1, + 2, + 3 + ], + "rows": [ + [ + "华东", + "1,000", + "700", + "-300", + "-30.0%", + "88.2%", + "—" + ], + [ + "华南", + "800", + "780", + "-20", + "-2.5%", + "5.9%", + "—" + ], + [ + "华北", + "600", + "590", + "-10", + "-1.7%", + "2.9%", + "—" + ], + [ + "西南", + "300", + "290", + "-10", + "-3.3%", + "2.9%", + "—" + ] + ], + "masked": [], + "highlight": { + "cells": [ + [ + 0, + "region" + ] + ] + } + } + }, + { + "step": "analysis_input", + "of": "A1", + "ref": "Q1.r0.gmv", + "role": "headline_base", + "role_label": "基期总数", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", + "row": 0, + "column": "gmv", + "value": "2700", + "query": "Q1", + "node_id": "bot", + "sealed": true, + "closure": { + "mode": "additive", + "total_key": "base_total", + "total": "2,700", + "headline": "2,700", + "closed": true + } + }, + { + "step": "analysis_input", + "of": "A1", + "ref": "Q1.r1.gmv", + "role": "headline_target", + "role_label": "本期总数", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", + "row": 1, + "column": "gmv", + "value": "2360", + "query": "Q1", + "node_id": "bot", + "sealed": true, + "closure": { + "mode": "additive", + "total_key": "target_total", + "total": "2,360", + "headline": "2,360", + "closed": true + } + }, + { + "step": "analysis_input", + "of": "A1", + "ref": "Q2", + "role": "data", + "role_label": "数据", + "artifact": "8322aa7cc7c2ad7d63887acb8d88d34ef6b1a9ed948afdb3acc9f7bd5328f460", + "columns": [ + "region", + "week", + "gmv" + ], + "rows": "all", + "query": "Q2", + "node_id": "bot", + "sealed": true + }, + { + "step": "query", + "alias": "Q1", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", + "node_id": "bot", + "tool": "db_query__shop", + "source": "shop", + "sql": "SELECT week, SUM(amount) AS gmv FROM orders GROUP BY week ORDER BY week", + "columns": [ + "week", + "gmv" + ], + "rows": [ + [ + "2026-W41", + 2700 + ], + [ + "2026-W42", + 2360 + ] + ], + "row_offset": 0, + "row_index": [ + 0, + 1 + ], + "total_rows": 2, + "truncated": false, + "highlight": { + "rows": [ + 0, + 1 + ], + "cols": [ + "gmv" + ], + "cells": [ + [ + 0, + "gmv" + ], + [ + 1, + "gmv" + ] + ] + }, + "masked": [], + "hash_ok": true, + "sealed": true, + "column_types": { + "gmv": "number", + "week": "text" + }, + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", + "catalog": [ + { + "table": "orders", + "version": 1 + } + ], + "input_of": "A1" + }, + { + "step": "query", + "alias": "Q2", + "artifact": "8322aa7cc7c2ad7d63887acb8d88d34ef6b1a9ed948afdb3acc9f7bd5328f460", + "node_id": "bot", + "tool": "db_query__shop", + "source": "shop", + "sql": "SELECT region, week, SUM(amount) AS gmv FROM orders GROUP BY region, week ORDER BY region, week", + "columns": [ + "region", + "week", + "gmv" + ], + "rows": [ + [ + "华东", + "2026-W41", + 1000 + ], + [ + "华东", + "2026-W42", + 700 + ], + [ + "华北", + "2026-W41", + 600 + ], + [ + "华北", + "2026-W42", + 590 + ], + [ + "华南", + "2026-W41", + 800 + ], + [ + "华南", + "2026-W42", + 780 + ], + [ + "西南", + "2026-W41", + 300 + ], + [ + "西南", + "2026-W42", + 290 + ] + ], + "row_offset": 0, + "row_index": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7 + ], + "total_rows": 8, + "truncated": false, + "highlight": { + "rows": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7 + ], + "cols": [ + "region", + "week", + "gmv" + ], + "cells": [ + [ + 0, + "region" + ], + [ + 1, + "region" + ], + [ + 2, + "region" + ], + [ + 3, + "region" + ], + [ + 4, + "region" + ], + [ + 5, + "region" + ], + [ + 6, + "region" + ], + [ + 7, + "region" + ], + [ + 0, + "week" + ], + [ + 1, + "week" + ], + [ + 2, + "week" + ], + [ + 3, + "week" + ], + [ + 4, + "week" + ], + [ + 5, + "week" + ], + [ + 6, + "week" + ], + [ + 7, + "week" + ], + [ + 0, + "gmv" + ], + [ + 1, + "gmv" + ], + [ + 2, + "gmv" + ], + [ + 3, + "gmv" + ], + [ + 4, + "gmv" + ], + [ + 5, + "gmv" + ], + [ + 6, + "gmv" + ], + [ + 7, + "gmv" + ] + ] + }, + "masked": [], + "hash_ok": true, + "sealed": true, + "column_types": { + "gmv": "number", + "region": "text", + "week": "text" + }, + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", + "catalog": [ + { + "table": "orders", + "version": 1 + } + ], + "input_of": "A1" + }, + { + "step": "analysis_recompute", + "alias": "A1", + "method": "decompose.additive@1", + "status": "same", + "text": "复算一致:按封存的输入重新计算,结论逐项相同" + }, + { + "step": "analysis_seal", + "alias": "A1", + "node_id": "bot", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", + "ledger": true, + "hash_ok": true, + "eid_ok": true, + "sealed": true + } + ], + "note": "该值由系统从分析结论的结果表中取出、按固定规则显示,未经模型转写", + "violations": [], + "seal": { + "sealed": true, + "ok": true, + "covered": true + }, + "redacted": { + "columns": [] + } + }, + "s36": { + "report": { + "node_id": "write", + "doc_artifact": "32cc0cc3a309ef588a619cbf69d277710b6c0505b9c36ca880b50feaebca63dc" + }, + "segment": { + "id": "s36", + "text": "-300", + "kind": "number", + "state": "deterministic", + "span": [ + 208, + 212 + ], + "unit": "u12", + "ref": "v:A1.r0.delta", + "cite": { + "alias": "A1", + "eid": "ev:cell:a7deaec3f4ed6ab6", + "kind": "cell", + "locator": { + "column": "delta", + "row": 0 + }, + "ref": "A1.r0.delta", + "rendered": "-300", + "role": "value", + "status": "resolved", + "value": -300 + } + }, + "unit": { + "id": "u12", + "kind": "claim", + "text": "-300", + "span": [ + 208, + 212 + ], + "cites": [ + "A1" + ], + "on_demand": { + "available": false, + "reason": "not_a_claim", + "message": "这句不是结论句(标题、连接性文字、表格单元格或代码),无需模型裁判" + } + }, + "block": { + "id": "b7", + "type": "table" + }, + "chain": [ + { + "step": "analysis", + "alias": "A1", + "op": "decompose", + "mode": "additive", + "method_label": "变化拆解(可加)", + "origin": "agent", + "call_id": "call_3", + "node_id": "bot", + "label": "问数据", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", + "eid": "ev:analysis:a7edbc13c92c31a0", + "eid_ok": true, + "cited": { + "what": "cell", + "row": 0, + "column": "delta", + "raw": "-300" + }, + "rendered": "-300", + "render_ok": true, + "hash_ok": true, + "status": "ok", + "reason_code": null, + "reason": null, + "phrase": "销售额下降 340(-12.6%),主要来自华东(-300,占 88.2%)", + "criterion": "一段占总变化的一半以上算主要来源,最多前 2 段合计占 80% 以上算集中,总变化不到基期的 0.5% 算基本持平,各段之和要和总数对得上才判断变化来自哪里", + "verdict": { + "code": "driver", + "direction": "down", + "subjects": [ + [ + "华东" + ] + ] + }, + "caveats": [ + { + "code": "comparability", + "text": "没能核对本期的数据是否到齐(期次写成「年-W周号」,认不出 SQL 是按哪种周号算的,不知道是哪几天)" + } + ], + "hypothesis": "下降是不是集中在某个地区", + "hypothesis_note": "Agent 写的假设:说明这次在验证什么,不是分析结论,也不进报告正文" + }, + { + "step": "analysis_method", + "alias": "A1", + "method": "decompose.additive@1", + "method_label": "变化拆解(可加)", + "params": { + "base": "2026-W41", + "by": [ + "region" + ], + "catalog": { + "labels": { + "region": "地区", + "week": "周" + }, + "measures": { + "gmv": "flow" + } + }, + "headline": { + "base": "Q1.r0.gmv", + "target": "Q1.r1.gmv" + }, + "label": "销售额", + "measure": "gmv", + "period": "week", + "query": "Q2", + "target": "2026-W42", + "today": "2026-10-21" + }, + "settings": [ + { + "key": "main_share", + "label": "「主要来源」的占比", + "value": 0.5 + }, + { + "key": "concentration", + "label": "「集中」的合计占比", + "value": 0.8 + }, + { + "key": "offset_ratio", + "label": "记为「抵消」的比例", + "value": 0.25 + }, + { + "key": "flat_pct", + "label": "「基本持平」的幅度", + "value": 0.005 + }, + { + "key": "table_top_k", + "label": "列出前几段", + "value": 10 + } + ], + "probes": [] + }, + { + "step": "analysis_calc", + "alias": "A1", + "values": [ + { + "key": "base_total", + "raw": "2700", + "rendered": "2,700" + }, + { + "key": "delta_total", + "raw": "-340", + "rendered": "-340" + }, + { + "key": "gross_down", + "raw": "-340", + "rendered": "-340" + }, + { + "key": "gross_up", + "raw": "0", + "rendered": "0" + }, + { + "key": "pct_total", + "raw": "-0.125925925926", + "rendered": "-12.6%" + }, + { + "key": "segments", + "raw": "4", + "rendered": "4" + }, + { + "key": "target_total", + "raw": "2360", + "rendered": "2,360" + }, + { + "key": "top_k", + "raw": "1", + "rendered": "1" + }, + { + "key": "top_k_share", + "raw": "0.882352941176", + "rendered": "88.2%" + }, + { + "key": "top_key", + "raw": "华东", + "rendered": "华东" + }, + { + "key": "top_share", + "raw": "0.882352941176", + "rendered": "88.2%" + } + ], + "formulas": [ + { + "label": "总变化", + "text": "总变化 = 本期合计 − 基期合计 = 2,360 − 2,700 = -340" + }, + { + "label": "变化率", + "text": "变化率 = 总变化 ÷ 基期合计 = -340 ÷ 2,700 = -12.6%" + }, + { + "label": "占比", + "text": "华东的占比 = 华东的变化 ÷ 总变化 = -300 ÷ (-340) = 88.2%" + } + ], + "table": { + "columns": [ + "region", + "base", + "target", + "delta", + "pct", + "share", + "flag" + ], + "labels": { + "base": "基期", + "delta": "变化", + "flag": "说明", + "pct": "变化率", + "region": "地区", + "share": "占变化的比重", + "target": "本期" + }, + "total_rows": 4, + "row_index": [ + 0, + 1, + 2, + 3 + ], + "rows": [ + [ + "华东", + "1,000", + "700", + "-300", + "-30.0%", + "88.2%", + "—" + ], + [ + "华南", + "800", + "780", + "-20", + "-2.5%", + "5.9%", + "—" + ], + [ + "华北", + "600", + "590", + "-10", + "-1.7%", + "2.9%", + "—" + ], + [ + "西南", + "300", + "290", + "-10", + "-3.3%", + "2.9%", + "—" + ] + ], + "masked": [], + "highlight": { + "cells": [ + [ + 0, + "delta" + ] + ] + } + } + }, + { + "step": "analysis_input", + "of": "A1", + "ref": "Q1.r0.gmv", + "role": "headline_base", + "role_label": "基期总数", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", + "row": 0, + "column": "gmv", + "value": "2700", + "query": "Q1", + "node_id": "bot", + "sealed": true, + "closure": { + "mode": "additive", + "total_key": "base_total", + "total": "2,700", + "headline": "2,700", + "closed": true + } + }, + { + "step": "analysis_input", + "of": "A1", + "ref": "Q1.r1.gmv", + "role": "headline_target", + "role_label": "本期总数", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", + "row": 1, + "column": "gmv", + "value": "2360", + "query": "Q1", + "node_id": "bot", + "sealed": true, + "closure": { + "mode": "additive", + "total_key": "target_total", + "total": "2,360", + "headline": "2,360", + "closed": true + } + }, + { + "step": "analysis_input", + "of": "A1", + "ref": "Q2", + "role": "data", + "role_label": "数据", + "artifact": "8322aa7cc7c2ad7d63887acb8d88d34ef6b1a9ed948afdb3acc9f7bd5328f460", + "columns": [ + "region", + "week", + "gmv" + ], + "rows": "all", + "query": "Q2", + "node_id": "bot", + "sealed": true + }, + { + "step": "query", + "alias": "Q1", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", + "node_id": "bot", + "tool": "db_query__shop", + "source": "shop", + "sql": "SELECT week, SUM(amount) AS gmv FROM orders GROUP BY week ORDER BY week", + "columns": [ + "week", + "gmv" + ], + "rows": [ + [ + "2026-W41", + 2700 + ], + [ + "2026-W42", + 2360 + ] + ], + "row_offset": 0, + "row_index": [ + 0, + 1 + ], + "total_rows": 2, + "truncated": false, + "highlight": { + "rows": [ + 0, + 1 + ], + "cols": [ + "gmv" + ], + "cells": [ + [ + 0, + "gmv" + ], + [ + 1, + "gmv" + ] + ] + }, + "masked": [], + "hash_ok": true, + "sealed": true, + "column_types": { + "gmv": "number", + "week": "text" + }, + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", + "catalog": [ + { + "table": "orders", + "version": 1 + } + ], + "input_of": "A1" + }, + { + "step": "query", + "alias": "Q2", + "artifact": "8322aa7cc7c2ad7d63887acb8d88d34ef6b1a9ed948afdb3acc9f7bd5328f460", + "node_id": "bot", + "tool": "db_query__shop", + "source": "shop", + "sql": "SELECT region, week, SUM(amount) AS gmv FROM orders GROUP BY region, week ORDER BY region, week", + "columns": [ + "region", + "week", + "gmv" + ], + "rows": [ + [ + "华东", + "2026-W41", + 1000 + ], + [ + "华东", + "2026-W42", + 700 + ], + [ + "华北", + "2026-W41", + 600 + ], + [ + "华北", + "2026-W42", + 590 + ], + [ + "华南", + "2026-W41", + 800 + ], + [ + "华南", + "2026-W42", + 780 + ], + [ + "西南", + "2026-W41", + 300 + ], + [ + "西南", + "2026-W42", + 290 + ] + ], + "row_offset": 0, + "row_index": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7 + ], + "total_rows": 8, + "truncated": false, + "highlight": { + "rows": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7 + ], + "cols": [ + "region", + "week", + "gmv" + ], + "cells": [ + [ + 0, + "region" + ], + [ + 1, + "region" + ], + [ + 2, + "region" + ], + [ + 3, + "region" + ], + [ + 4, + "region" + ], + [ + 5, + "region" + ], + [ + 6, + "region" + ], + [ + 7, + "region" + ], + [ + 0, + "week" + ], + [ + 1, + "week" + ], + [ + 2, + "week" + ], + [ + 3, + "week" + ], + [ + 4, + "week" + ], + [ + 5, + "week" + ], + [ + 6, + "week" + ], + [ + 7, + "week" + ], + [ + 0, + "gmv" + ], + [ + 1, + "gmv" + ], + [ + 2, + "gmv" + ], + [ + 3, + "gmv" + ], + [ + 4, + "gmv" + ], + [ + 5, + "gmv" + ], + [ + 6, + "gmv" + ], + [ + 7, + "gmv" + ] + ] + }, + "masked": [], + "hash_ok": true, + "sealed": true, + "column_types": { + "gmv": "number", + "region": "text", + "week": "text" + }, + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", + "catalog": [ + { + "table": "orders", + "version": 1 + } + ], + "input_of": "A1" + }, + { + "step": "analysis_recompute", + "alias": "A1", + "method": "decompose.additive@1", + "status": "same", + "text": "复算一致:按封存的输入重新计算,结论逐项相同" + }, + { + "step": "analysis_seal", + "alias": "A1", + "node_id": "bot", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", + "ledger": true, + "hash_ok": true, + "eid_ok": true, + "sealed": true + } + ], + "note": "该值由系统从分析结论的结果表中取出、按固定规则显示,未经模型转写", + "violations": [], + "seal": { + "sealed": true, + "ok": true, + "covered": true + }, + "redacted": { + "columns": [] + } + }, + "s38": { + "report": { + "node_id": "write", + "doc_artifact": "32cc0cc3a309ef588a619cbf69d277710b6c0505b9c36ca880b50feaebca63dc" + }, + "segment": { + "id": "s38", + "text": "-30.0%", + "kind": "number", + "state": "deterministic", + "span": [ + 215, + 221 + ], + "unit": "u13", + "ref": "v:A1.r0.pct", + "cite": { + "alias": "A1", + "conv": "pct", + "eid": "ev:cell:32d18640349e7717", + "kind": "cell", + "locator": { + "column": "pct", + "row": 0 + }, + "ref": "A1.r0.pct", + "rendered": "-30.0%", + "role": "value", + "status": "resolved", + "value": -0.3 + } + }, + "unit": { + "id": "u13", + "kind": "claim", + "text": "-30.0%", + "span": [ + 215, + 221 + ], + "cites": [ + "A1" + ], + "on_demand": { + "available": false, + "reason": "not_a_claim", + "message": "这句不是结论句(标题、连接性文字、表格单元格或代码),无需模型裁判" + } + }, + "block": { + "id": "b7", + "type": "table" + }, + "chain": [ + { + "step": "analysis", + "alias": "A1", + "op": "decompose", + "mode": "additive", + "method_label": "变化拆解(可加)", + "origin": "agent", + "call_id": "call_3", + "node_id": "bot", + "label": "问数据", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", + "eid": "ev:analysis:a7edbc13c92c31a0", + "eid_ok": true, + "cited": { + "what": "cell", + "row": 0, + "column": "pct", + "raw": "-0.3" + }, + "rendered": "-30.0%", + "render_ok": true, + "hash_ok": true, + "status": "ok", + "reason_code": null, + "reason": null, + "phrase": "销售额下降 340(-12.6%),主要来自华东(-300,占 88.2%)", + "criterion": "一段占总变化的一半以上算主要来源,最多前 2 段合计占 80% 以上算集中,总变化不到基期的 0.5% 算基本持平,各段之和要和总数对得上才判断变化来自哪里", + "verdict": { + "code": "driver", + "direction": "down", + "subjects": [ + [ + "华东" + ] + ] + }, + "caveats": [ + { + "code": "comparability", + "text": "没能核对本期的数据是否到齐(期次写成「年-W周号」,认不出 SQL 是按哪种周号算的,不知道是哪几天)" + } + ], + "hypothesis": "下降是不是集中在某个地区", + "hypothesis_note": "Agent 写的假设:说明这次在验证什么,不是分析结论,也不进报告正文" + }, + { + "step": "analysis_method", + "alias": "A1", + "method": "decompose.additive@1", + "method_label": "变化拆解(可加)", + "params": { + "base": "2026-W41", + "by": [ + "region" + ], + "catalog": { + "labels": { + "region": "地区", + "week": "周" + }, + "measures": { + "gmv": "flow" + } + }, + "headline": { + "base": "Q1.r0.gmv", + "target": "Q1.r1.gmv" + }, + "label": "销售额", + "measure": "gmv", + "period": "week", + "query": "Q2", + "target": "2026-W42", + "today": "2026-10-21" + }, + "settings": [ + { + "key": "main_share", + "label": "「主要来源」的占比", + "value": 0.5 + }, + { + "key": "concentration", + "label": "「集中」的合计占比", + "value": 0.8 + }, + { + "key": "offset_ratio", + "label": "记为「抵消」的比例", + "value": 0.25 + }, + { + "key": "flat_pct", + "label": "「基本持平」的幅度", + "value": 0.005 + }, + { + "key": "table_top_k", + "label": "列出前几段", + "value": 10 + } + ], + "probes": [] + }, + { + "step": "analysis_calc", + "alias": "A1", + "values": [ + { + "key": "base_total", + "raw": "2700", + "rendered": "2,700" + }, + { + "key": "delta_total", + "raw": "-340", + "rendered": "-340" + }, + { + "key": "gross_down", + "raw": "-340", + "rendered": "-340" + }, + { + "key": "gross_up", + "raw": "0", + "rendered": "0" + }, + { + "key": "pct_total", + "raw": "-0.125925925926", + "rendered": "-12.6%" + }, + { + "key": "segments", + "raw": "4", + "rendered": "4" + }, + { + "key": "target_total", + "raw": "2360", + "rendered": "2,360" + }, + { + "key": "top_k", + "raw": "1", + "rendered": "1" + }, + { + "key": "top_k_share", + "raw": "0.882352941176", + "rendered": "88.2%" + }, + { + "key": "top_key", + "raw": "华东", + "rendered": "华东" + }, + { + "key": "top_share", + "raw": "0.882352941176", + "rendered": "88.2%" + } + ], + "formulas": [ + { + "label": "总变化", + "text": "总变化 = 本期合计 − 基期合计 = 2,360 − 2,700 = -340" + }, + { + "label": "变化率", + "text": "变化率 = 总变化 ÷ 基期合计 = -340 ÷ 2,700 = -12.6%" + }, + { + "label": "占比", + "text": "华东的占比 = 华东的变化 ÷ 总变化 = -300 ÷ (-340) = 88.2%" + } + ], + "table": { + "columns": [ + "region", + "base", + "target", + "delta", + "pct", + "share", + "flag" + ], + "labels": { + "base": "基期", + "delta": "变化", + "flag": "说明", + "pct": "变化率", + "region": "地区", + "share": "占变化的比重", + "target": "本期" + }, + "total_rows": 4, + "row_index": [ + 0, + 1, + 2, + 3 + ], + "rows": [ + [ + "华东", + "1,000", + "700", + "-300", + "-30.0%", + "88.2%", + "—" + ], + [ + "华南", + "800", + "780", + "-20", + "-2.5%", + "5.9%", + "—" + ], + [ + "华北", + "600", + "590", + "-10", + "-1.7%", + "2.9%", + "—" + ], + [ + "西南", + "300", + "290", + "-10", + "-3.3%", + "2.9%", + "—" + ] + ], + "masked": [], + "highlight": { + "cells": [ + [ + 0, + "pct" + ] + ] + } + } + }, + { + "step": "analysis_input", + "of": "A1", + "ref": "Q1.r0.gmv", + "role": "headline_base", + "role_label": "基期总数", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", + "row": 0, + "column": "gmv", + "value": "2700", + "query": "Q1", + "node_id": "bot", + "sealed": true, + "closure": { + "mode": "additive", + "total_key": "base_total", + "total": "2,700", + "headline": "2,700", + "closed": true + } + }, + { + "step": "analysis_input", + "of": "A1", + "ref": "Q1.r1.gmv", + "role": "headline_target", + "role_label": "本期总数", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", + "row": 1, + "column": "gmv", + "value": "2360", + "query": "Q1", + "node_id": "bot", + "sealed": true, + "closure": { + "mode": "additive", + "total_key": "target_total", + "total": "2,360", + "headline": "2,360", + "closed": true + } + }, + { + "step": "analysis_input", + "of": "A1", + "ref": "Q2", + "role": "data", + "role_label": "数据", + "artifact": "8322aa7cc7c2ad7d63887acb8d88d34ef6b1a9ed948afdb3acc9f7bd5328f460", + "columns": [ + "region", + "week", + "gmv" + ], + "rows": "all", + "query": "Q2", + "node_id": "bot", + "sealed": true + }, + { + "step": "query", + "alias": "Q1", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", + "node_id": "bot", + "tool": "db_query__shop", + "source": "shop", + "sql": "SELECT week, SUM(amount) AS gmv FROM orders GROUP BY week ORDER BY week", + "columns": [ + "week", + "gmv" + ], + "rows": [ + [ + "2026-W41", + 2700 + ], + [ + "2026-W42", + 2360 + ] + ], + "row_offset": 0, + "row_index": [ + 0, + 1 + ], + "total_rows": 2, + "truncated": false, + "highlight": { + "rows": [ + 0, + 1 + ], + "cols": [ + "gmv" + ], + "cells": [ + [ + 0, + "gmv" + ], + [ + 1, + "gmv" + ] + ] + }, + "masked": [], + "hash_ok": true, + "sealed": true, + "column_types": { + "gmv": "number", + "week": "text" + }, + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", + "catalog": [ + { + "table": "orders", + "version": 1 + } + ], + "input_of": "A1" + }, + { + "step": "query", + "alias": "Q2", + "artifact": "8322aa7cc7c2ad7d63887acb8d88d34ef6b1a9ed948afdb3acc9f7bd5328f460", + "node_id": "bot", + "tool": "db_query__shop", + "source": "shop", + "sql": "SELECT region, week, SUM(amount) AS gmv FROM orders GROUP BY region, week ORDER BY region, week", + "columns": [ + "region", + "week", + "gmv" + ], + "rows": [ + [ + "华东", + "2026-W41", + 1000 + ], + [ + "华东", + "2026-W42", + 700 + ], + [ + "华北", + "2026-W41", + 600 + ], + [ + "华北", + "2026-W42", + 590 + ], + [ + "华南", + "2026-W41", + 800 + ], + [ + "华南", + "2026-W42", + 780 + ], + [ + "西南", + "2026-W41", + 300 + ], + [ + "西南", + "2026-W42", + 290 + ] + ], + "row_offset": 0, + "row_index": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7 + ], + "total_rows": 8, + "truncated": false, + "highlight": { + "rows": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7 + ], + "cols": [ + "region", + "week", + "gmv" + ], + "cells": [ + [ + 0, + "region" + ], + [ + 1, + "region" + ], + [ + 2, + "region" + ], + [ + 3, + "region" + ], + [ + 4, + "region" + ], + [ + 5, + "region" + ], + [ + 6, + "region" + ], + [ + 7, + "region" + ], + [ + 0, + "week" + ], + [ + 1, + "week" + ], + [ + 2, + "week" + ], + [ + 3, + "week" + ], + [ + 4, + "week" + ], + [ + 5, + "week" + ], + [ + 6, + "week" + ], + [ + 7, + "week" + ], + [ + 0, + "gmv" + ], + [ + 1, + "gmv" + ], + [ + 2, + "gmv" + ], + [ + 3, + "gmv" + ], + [ + 4, + "gmv" + ], + [ + 5, + "gmv" + ], + [ + 6, + "gmv" + ], + [ + 7, + "gmv" + ] + ] + }, + "masked": [], + "hash_ok": true, + "sealed": true, + "column_types": { + "gmv": "number", + "region": "text", + "week": "text" + }, + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", + "catalog": [ + { + "table": "orders", + "version": 1 + } + ], + "input_of": "A1" + }, + { + "step": "analysis_recompute", + "alias": "A1", + "method": "decompose.additive@1", + "status": "same", + "text": "复算一致:按封存的输入重新计算,结论逐项相同" + }, + { + "step": "analysis_seal", + "alias": "A1", + "node_id": "bot", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", + "ledger": true, + "hash_ok": true, + "eid_ok": true, + "sealed": true + } + ], + "note": "该值由系统从分析结论的结果表中取出、按固定规则显示,未经模型转写", + "violations": [], + "seal": { + "sealed": true, + "ok": true, + "covered": true + }, + "redacted": { + "columns": [] + } + }, + "s40": { + "report": { + "node_id": "write", + "doc_artifact": "32cc0cc3a309ef588a619cbf69d277710b6c0505b9c36ca880b50feaebca63dc" + }, + "segment": { + "id": "s40", + "text": "88.2%", + "kind": "number", + "state": "deterministic", + "span": [ + 224, + 229 + ], + "unit": "u14", + "ref": "v:A1.r0.share", + "cite": { + "alias": "A1", + "conv": "pct", + "eid": "ev:cell:b36848a6055a5628", + "kind": "cell", + "locator": { + "column": "share", + "row": 0 + }, + "ref": "A1.r0.share", + "rendered": "88.2%", + "role": "value", + "status": "resolved", + "value": 0.882352941176 + } + }, + "unit": { + "id": "u14", + "kind": "claim", + "text": "88.2%", + "span": [ + 224, + 229 + ], + "cites": [ + "A1" + ], + "on_demand": { + "available": false, + "reason": "not_a_claim", + "message": "这句不是结论句(标题、连接性文字、表格单元格或代码),无需模型裁判" + } + }, + "block": { + "id": "b7", + "type": "table" + }, + "chain": [ + { + "step": "analysis", + "alias": "A1", + "op": "decompose", + "mode": "additive", + "method_label": "变化拆解(可加)", + "origin": "agent", + "call_id": "call_3", + "node_id": "bot", + "label": "问数据", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", + "eid": "ev:analysis:a7edbc13c92c31a0", + "eid_ok": true, + "cited": { + "what": "cell", + "row": 0, + "column": "share", + "raw": "0.882352941176" + }, + "rendered": "88.2%", + "render_ok": true, + "hash_ok": true, + "status": "ok", + "reason_code": null, + "reason": null, + "phrase": "销售额下降 340(-12.6%),主要来自华东(-300,占 88.2%)", + "criterion": "一段占总变化的一半以上算主要来源,最多前 2 段合计占 80% 以上算集中,总变化不到基期的 0.5% 算基本持平,各段之和要和总数对得上才判断变化来自哪里", + "verdict": { + "code": "driver", + "direction": "down", + "subjects": [ + [ + "华东" + ] + ] + }, + "caveats": [ + { + "code": "comparability", + "text": "没能核对本期的数据是否到齐(期次写成「年-W周号」,认不出 SQL 是按哪种周号算的,不知道是哪几天)" + } + ], + "hypothesis": "下降是不是集中在某个地区", + "hypothesis_note": "Agent 写的假设:说明这次在验证什么,不是分析结论,也不进报告正文" + }, + { + "step": "analysis_method", + "alias": "A1", + "method": "decompose.additive@1", + "method_label": "变化拆解(可加)", + "params": { + "base": "2026-W41", + "by": [ + "region" + ], + "catalog": { + "labels": { + "region": "地区", + "week": "周" + }, + "measures": { + "gmv": "flow" + } + }, + "headline": { + "base": "Q1.r0.gmv", + "target": "Q1.r1.gmv" + }, + "label": "销售额", + "measure": "gmv", + "period": "week", + "query": "Q2", + "target": "2026-W42", + "today": "2026-10-21" + }, + "settings": [ + { + "key": "main_share", + "label": "「主要来源」的占比", + "value": 0.5 + }, + { + "key": "concentration", + "label": "「集中」的合计占比", + "value": 0.8 + }, + { + "key": "offset_ratio", + "label": "记为「抵消」的比例", + "value": 0.25 + }, + { + "key": "flat_pct", + "label": "「基本持平」的幅度", + "value": 0.005 + }, + { + "key": "table_top_k", + "label": "列出前几段", + "value": 10 + } + ], + "probes": [] + }, + { + "step": "analysis_calc", + "alias": "A1", + "values": [ + { + "key": "base_total", + "raw": "2700", + "rendered": "2,700" + }, + { + "key": "delta_total", + "raw": "-340", + "rendered": "-340" + }, + { + "key": "gross_down", + "raw": "-340", + "rendered": "-340" + }, + { + "key": "gross_up", + "raw": "0", + "rendered": "0" + }, + { + "key": "pct_total", + "raw": "-0.125925925926", + "rendered": "-12.6%" + }, + { + "key": "segments", + "raw": "4", + "rendered": "4" + }, + { + "key": "target_total", + "raw": "2360", + "rendered": "2,360" + }, + { + "key": "top_k", + "raw": "1", + "rendered": "1" + }, + { + "key": "top_k_share", + "raw": "0.882352941176", + "rendered": "88.2%" + }, + { + "key": "top_key", + "raw": "华东", + "rendered": "华东" + }, + { + "key": "top_share", + "raw": "0.882352941176", + "rendered": "88.2%" + } + ], + "formulas": [ + { + "label": "总变化", + "text": "总变化 = 本期合计 − 基期合计 = 2,360 − 2,700 = -340" + }, + { + "label": "变化率", + "text": "变化率 = 总变化 ÷ 基期合计 = -340 ÷ 2,700 = -12.6%" + }, + { + "label": "占比", + "text": "华东的占比 = 华东的变化 ÷ 总变化 = -300 ÷ (-340) = 88.2%" + } + ], + "table": { + "columns": [ + "region", + "base", + "target", + "delta", + "pct", + "share", + "flag" + ], + "labels": { + "base": "基期", + "delta": "变化", + "flag": "说明", + "pct": "变化率", + "region": "地区", + "share": "占变化的比重", + "target": "本期" + }, + "total_rows": 4, + "row_index": [ + 0, + 1, + 2, + 3 + ], + "rows": [ + [ + "华东", + "1,000", + "700", + "-300", + "-30.0%", + "88.2%", + "—" + ], + [ + "华南", + "800", + "780", + "-20", + "-2.5%", + "5.9%", + "—" + ], + [ + "华北", + "600", + "590", + "-10", + "-1.7%", + "2.9%", + "—" + ], + [ + "西南", + "300", + "290", + "-10", + "-3.3%", + "2.9%", + "—" + ] + ], + "masked": [], + "highlight": { + "cells": [ + [ + 0, + "share" + ] + ] + } + } + }, + { + "step": "analysis_input", + "of": "A1", + "ref": "Q1.r0.gmv", + "role": "headline_base", + "role_label": "基期总数", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", + "row": 0, + "column": "gmv", + "value": "2700", + "query": "Q1", + "node_id": "bot", + "sealed": true, + "closure": { + "mode": "additive", + "total_key": "base_total", + "total": "2,700", + "headline": "2,700", + "closed": true + } + }, + { + "step": "analysis_input", + "of": "A1", + "ref": "Q1.r1.gmv", + "role": "headline_target", + "role_label": "本期总数", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", + "row": 1, + "column": "gmv", + "value": "2360", + "query": "Q1", + "node_id": "bot", + "sealed": true, + "closure": { + "mode": "additive", + "total_key": "target_total", + "total": "2,360", + "headline": "2,360", + "closed": true + } + }, + { + "step": "analysis_input", + "of": "A1", + "ref": "Q2", + "role": "data", + "role_label": "数据", + "artifact": "8322aa7cc7c2ad7d63887acb8d88d34ef6b1a9ed948afdb3acc9f7bd5328f460", + "columns": [ + "region", + "week", + "gmv" + ], + "rows": "all", + "query": "Q2", + "node_id": "bot", + "sealed": true + }, + { + "step": "query", + "alias": "Q1", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", + "node_id": "bot", + "tool": "db_query__shop", + "source": "shop", + "sql": "SELECT week, SUM(amount) AS gmv FROM orders GROUP BY week ORDER BY week", + "columns": [ + "week", + "gmv" + ], + "rows": [ + [ + "2026-W41", + 2700 + ], + [ + "2026-W42", + 2360 + ] + ], + "row_offset": 0, + "row_index": [ + 0, + 1 + ], + "total_rows": 2, + "truncated": false, + "highlight": { + "rows": [ + 0, + 1 + ], + "cols": [ + "gmv" + ], + "cells": [ + [ + 0, + "gmv" + ], + [ + 1, + "gmv" + ] + ] + }, + "masked": [], + "hash_ok": true, + "sealed": true, + "column_types": { + "gmv": "number", + "week": "text" + }, + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", + "catalog": [ + { + "table": "orders", + "version": 1 + } + ], + "input_of": "A1" + }, + { + "step": "query", + "alias": "Q2", + "artifact": "8322aa7cc7c2ad7d63887acb8d88d34ef6b1a9ed948afdb3acc9f7bd5328f460", + "node_id": "bot", + "tool": "db_query__shop", + "source": "shop", + "sql": "SELECT region, week, SUM(amount) AS gmv FROM orders GROUP BY region, week ORDER BY region, week", + "columns": [ + "region", + "week", + "gmv" + ], + "rows": [ + [ + "华东", + "2026-W41", + 1000 + ], + [ + "华东", + "2026-W42", + 700 + ], + [ + "华北", + "2026-W41", + 600 + ], + [ + "华北", + "2026-W42", + 590 + ], + [ + "华南", + "2026-W41", + 800 + ], + [ + "华南", + "2026-W42", + 780 + ], + [ + "西南", + "2026-W41", + 300 + ], + [ + "西南", + "2026-W42", + 290 + ] + ], + "row_offset": 0, + "row_index": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7 + ], + "total_rows": 8, + "truncated": false, + "highlight": { + "rows": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7 + ], + "cols": [ + "region", + "week", + "gmv" + ], + "cells": [ + [ + 0, + "region" + ], + [ + 1, + "region" + ], + [ + 2, + "region" + ], + [ + 3, + "region" + ], + [ + 4, + "region" + ], + [ + 5, + "region" + ], + [ + 6, + "region" + ], + [ + 7, + "region" + ], + [ + 0, + "week" + ], + [ + 1, + "week" + ], + [ + 2, + "week" + ], + [ + 3, + "week" + ], + [ + 4, + "week" + ], + [ + 5, + "week" + ], + [ + 6, + "week" + ], + [ + 7, + "week" + ], + [ + 0, + "gmv" + ], + [ + 1, + "gmv" + ], + [ + 2, + "gmv" + ], + [ + 3, + "gmv" + ], + [ + 4, + "gmv" + ], + [ + 5, + "gmv" + ], + [ + 6, + "gmv" + ], + [ + 7, + "gmv" + ] + ] + }, + "masked": [], + "hash_ok": true, + "sealed": true, + "column_types": { + "gmv": "number", + "region": "text", + "week": "text" + }, + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", + "catalog": [ + { + "table": "orders", + "version": 1 + } + ], + "input_of": "A1" + }, + { + "step": "analysis_recompute", + "alias": "A1", + "method": "decompose.additive@1", + "status": "same", + "text": "复算一致:按封存的输入重新计算,结论逐项相同" + }, + { + "step": "analysis_seal", + "alias": "A1", + "node_id": "bot", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", + "ledger": true, + "hash_ok": true, + "eid_ok": true, + "sealed": true + } + ], + "note": "该值由系统从分析结论的结果表中取出、按固定规则显示,未经模型转写", + "violations": [], + "seal": { + "sealed": true, + "ok": true, + "covered": true + }, + "redacted": { + "columns": [] + } + }, + "s42": { + "report": { + "node_id": "write", + "doc_artifact": "32cc0cc3a309ef588a619cbf69d277710b6c0505b9c36ca880b50feaebca63dc" + }, + "segment": { + "id": "s42", + "text": "华南", + "kind": "value", + "state": "deterministic", + "span": [ + 234, + 236 + ], + "unit": "u15", + "ref": "v:A1.r1.region", + "cite": { + "alias": "A1", + "eid": "ev:cell:15977323c7fb25b1", + "kind": "cell", + "locator": { + "column": "region", + "row": 1 + }, + "ref": "A1.r1.region", + "rendered": "华南", + "role": "value", + "status": "resolved", + "value": "华南" + } + }, + "unit": { + "id": "u15", + "kind": "claim", + "text": "华南", + "span": [ + 234, + 236 + ], + "cites": [ + "A1" + ], + "on_demand": { + "available": false, + "reason": "not_a_claim", + "message": "这句不是结论句(标题、连接性文字、表格单元格或代码),无需模型裁判" + } + }, + "block": { + "id": "b7", + "type": "table" + }, + "chain": [ + { + "step": "analysis", + "alias": "A1", + "op": "decompose", + "mode": "additive", + "method_label": "变化拆解(可加)", + "origin": "agent", + "call_id": "call_3", + "node_id": "bot", + "label": "问数据", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", + "eid": "ev:analysis:a7edbc13c92c31a0", + "eid_ok": true, + "cited": { + "what": "cell", + "row": 1, + "column": "region", + "raw": "华南" + }, + "rendered": "华南", + "render_ok": true, + "hash_ok": true, + "status": "ok", + "reason_code": null, + "reason": null, + "phrase": "销售额下降 340(-12.6%),主要来自华东(-300,占 88.2%)", + "criterion": "一段占总变化的一半以上算主要来源,最多前 2 段合计占 80% 以上算集中,总变化不到基期的 0.5% 算基本持平,各段之和要和总数对得上才判断变化来自哪里", + "verdict": { + "code": "driver", + "direction": "down", + "subjects": [ + [ + "华东" + ] + ] + }, + "caveats": [ + { + "code": "comparability", + "text": "没能核对本期的数据是否到齐(期次写成「年-W周号」,认不出 SQL 是按哪种周号算的,不知道是哪几天)" + } + ], + "hypothesis": "下降是不是集中在某个地区", + "hypothesis_note": "Agent 写的假设:说明这次在验证什么,不是分析结论,也不进报告正文" + }, + { + "step": "analysis_method", + "alias": "A1", + "method": "decompose.additive@1", + "method_label": "变化拆解(可加)", + "params": { + "base": "2026-W41", + "by": [ + "region" + ], + "catalog": { + "labels": { + "region": "地区", + "week": "周" + }, + "measures": { + "gmv": "flow" + } + }, + "headline": { + "base": "Q1.r0.gmv", + "target": "Q1.r1.gmv" + }, + "label": "销售额", + "measure": "gmv", + "period": "week", + "query": "Q2", + "target": "2026-W42", + "today": "2026-10-21" + }, + "settings": [ + { + "key": "main_share", + "label": "「主要来源」的占比", + "value": 0.5 + }, + { + "key": "concentration", + "label": "「集中」的合计占比", + "value": 0.8 + }, + { + "key": "offset_ratio", + "label": "记为「抵消」的比例", + "value": 0.25 + }, + { + "key": "flat_pct", + "label": "「基本持平」的幅度", + "value": 0.005 + }, + { + "key": "table_top_k", + "label": "列出前几段", + "value": 10 + } + ], + "probes": [] + }, + { + "step": "analysis_calc", + "alias": "A1", + "values": [ + { + "key": "base_total", + "raw": "2700", + "rendered": "2,700" + }, + { + "key": "delta_total", + "raw": "-340", + "rendered": "-340" + }, + { + "key": "gross_down", + "raw": "-340", + "rendered": "-340" + }, + { + "key": "gross_up", + "raw": "0", + "rendered": "0" + }, + { + "key": "pct_total", + "raw": "-0.125925925926", + "rendered": "-12.6%" + }, + { + "key": "segments", + "raw": "4", + "rendered": "4" + }, + { + "key": "target_total", + "raw": "2360", + "rendered": "2,360" + }, + { + "key": "top_k", + "raw": "1", + "rendered": "1" + }, + { + "key": "top_k_share", + "raw": "0.882352941176", + "rendered": "88.2%" + }, + { + "key": "top_key", + "raw": "华东", + "rendered": "华东" + }, + { + "key": "top_share", + "raw": "0.882352941176", + "rendered": "88.2%" + } + ], + "formulas": [ + { + "label": "总变化", + "text": "总变化 = 本期合计 − 基期合计 = 2,360 − 2,700 = -340" + }, + { + "label": "变化率", + "text": "变化率 = 总变化 ÷ 基期合计 = -340 ÷ 2,700 = -12.6%" + }, + { + "label": "占比", + "text": "华东的占比 = 华东的变化 ÷ 总变化 = -300 ÷ (-340) = 88.2%" + } + ], + "table": { + "columns": [ + "region", + "base", + "target", + "delta", + "pct", + "share", + "flag" + ], + "labels": { + "base": "基期", + "delta": "变化", + "flag": "说明", + "pct": "变化率", + "region": "地区", + "share": "占变化的比重", + "target": "本期" + }, + "total_rows": 4, + "row_index": [ + 0, + 1, + 2, + 3 + ], + "rows": [ + [ + "华东", + "1,000", + "700", + "-300", + "-30.0%", + "88.2%", + "—" + ], + [ + "华南", + "800", + "780", + "-20", + "-2.5%", + "5.9%", + "—" + ], + [ + "华北", + "600", + "590", + "-10", + "-1.7%", + "2.9%", + "—" + ], + [ + "西南", + "300", + "290", + "-10", + "-3.3%", + "2.9%", + "—" + ] + ], + "masked": [], + "highlight": { + "cells": [ + [ + 1, + "region" + ] + ] + } + } + }, + { + "step": "analysis_input", + "of": "A1", + "ref": "Q1.r0.gmv", + "role": "headline_base", + "role_label": "基期总数", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", + "row": 0, + "column": "gmv", + "value": "2700", + "query": "Q1", + "node_id": "bot", + "sealed": true, + "closure": { + "mode": "additive", + "total_key": "base_total", + "total": "2,700", + "headline": "2,700", + "closed": true + } + }, + { + "step": "analysis_input", + "of": "A1", + "ref": "Q1.r1.gmv", + "role": "headline_target", + "role_label": "本期总数", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", + "row": 1, + "column": "gmv", + "value": "2360", + "query": "Q1", + "node_id": "bot", + "sealed": true, + "closure": { + "mode": "additive", + "total_key": "target_total", + "total": "2,360", + "headline": "2,360", + "closed": true + } + }, + { + "step": "analysis_input", + "of": "A1", + "ref": "Q2", + "role": "data", + "role_label": "数据", + "artifact": "8322aa7cc7c2ad7d63887acb8d88d34ef6b1a9ed948afdb3acc9f7bd5328f460", + "columns": [ + "region", + "week", + "gmv" + ], + "rows": "all", + "query": "Q2", + "node_id": "bot", + "sealed": true + }, + { + "step": "query", + "alias": "Q1", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", + "node_id": "bot", + "tool": "db_query__shop", + "source": "shop", + "sql": "SELECT week, SUM(amount) AS gmv FROM orders GROUP BY week ORDER BY week", + "columns": [ + "week", + "gmv" + ], + "rows": [ + [ + "2026-W41", + 2700 + ], + [ + "2026-W42", + 2360 + ] + ], + "row_offset": 0, + "row_index": [ + 0, + 1 + ], + "total_rows": 2, + "truncated": false, + "highlight": { + "rows": [ + 0, + 1 + ], + "cols": [ + "gmv" + ], + "cells": [ + [ + 0, + "gmv" + ], + [ + 1, + "gmv" + ] + ] + }, + "masked": [], + "hash_ok": true, + "sealed": true, + "column_types": { + "gmv": "number", + "week": "text" + }, + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", + "catalog": [ + { + "table": "orders", + "version": 1 + } + ], + "input_of": "A1" + }, + { + "step": "query", + "alias": "Q2", + "artifact": "8322aa7cc7c2ad7d63887acb8d88d34ef6b1a9ed948afdb3acc9f7bd5328f460", + "node_id": "bot", + "tool": "db_query__shop", + "source": "shop", + "sql": "SELECT region, week, SUM(amount) AS gmv FROM orders GROUP BY region, week ORDER BY region, week", + "columns": [ + "region", + "week", + "gmv" + ], + "rows": [ + [ + "华东", + "2026-W41", + 1000 + ], + [ + "华东", + "2026-W42", + 700 + ], + [ + "华北", + "2026-W41", + 600 + ], + [ + "华北", + "2026-W42", + 590 + ], + [ + "华南", + "2026-W41", + 800 + ], + [ + "华南", + "2026-W42", + 780 + ], + [ + "西南", + "2026-W41", + 300 + ], + [ + "西南", + "2026-W42", + 290 + ] + ], + "row_offset": 0, + "row_index": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7 + ], + "total_rows": 8, + "truncated": false, + "highlight": { + "rows": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7 + ], + "cols": [ + "region", + "week", + "gmv" + ], + "cells": [ + [ + 0, + "region" + ], + [ + 1, + "region" + ], + [ + 2, + "region" + ], + [ + 3, + "region" + ], + [ + 4, + "region" + ], + [ + 5, + "region" + ], + [ + 6, + "region" + ], + [ + 7, + "region" + ], + [ + 0, + "week" + ], + [ + 1, + "week" + ], + [ + 2, + "week" + ], + [ + 3, + "week" + ], + [ + 4, + "week" + ], + [ + 5, + "week" + ], + [ + 6, + "week" + ], + [ + 7, + "week" + ], + [ + 0, + "gmv" + ], + [ + 1, + "gmv" + ], + [ + 2, + "gmv" + ], + [ + 3, + "gmv" + ], + [ + 4, + "gmv" + ], + [ + 5, + "gmv" + ], + [ + 6, + "gmv" + ], + [ + 7, + "gmv" + ] + ] + }, + "masked": [], + "hash_ok": true, + "sealed": true, + "column_types": { + "gmv": "number", + "region": "text", + "week": "text" + }, + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", + "catalog": [ + { + "table": "orders", + "version": 1 + } + ], + "input_of": "A1" + }, + { + "step": "analysis_recompute", + "alias": "A1", + "method": "decompose.additive@1", + "status": "same", + "text": "复算一致:按封存的输入重新计算,结论逐项相同" + }, + { + "step": "analysis_seal", + "alias": "A1", + "node_id": "bot", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", + "ledger": true, + "hash_ok": true, + "eid_ok": true, + "sealed": true + } + ], + "note": "该值由系统从分析结论的结果表中取出、按固定规则显示,未经模型转写", + "violations": [], + "seal": { + "sealed": true, + "ok": true, + "covered": true + }, + "redacted": { + "columns": [] + } + }, + "s44": { + "report": { + "node_id": "write", + "doc_artifact": "32cc0cc3a309ef588a619cbf69d277710b6c0505b9c36ca880b50feaebca63dc" + }, + "segment": { + "id": "s44", + "text": "-20", + "kind": "number", + "state": "deterministic", + "span": [ + 239, + 242 + ], + "unit": "u16", + "ref": "v:A1.r1.delta", + "cite": { + "alias": "A1", + "eid": "ev:cell:50fa5438a057327a", + "kind": "cell", + "locator": { + "column": "delta", + "row": 1 + }, + "ref": "A1.r1.delta", + "rendered": "-20", + "role": "value", + "status": "resolved", + "value": -20 + } + }, + "unit": { + "id": "u16", + "kind": "claim", + "text": "-20", + "span": [ + 239, + 242 + ], + "cites": [ + "A1" + ], + "on_demand": { + "available": false, + "reason": "not_a_claim", + "message": "这句不是结论句(标题、连接性文字、表格单元格或代码),无需模型裁判" + } + }, + "block": { + "id": "b7", + "type": "table" + }, + "chain": [ + { + "step": "analysis", + "alias": "A1", + "op": "decompose", + "mode": "additive", + "method_label": "变化拆解(可加)", + "origin": "agent", + "call_id": "call_3", + "node_id": "bot", + "label": "问数据", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", + "eid": "ev:analysis:a7edbc13c92c31a0", + "eid_ok": true, + "cited": { + "what": "cell", + "row": 1, + "column": "delta", + "raw": "-20" + }, + "rendered": "-20", + "render_ok": true, + "hash_ok": true, + "status": "ok", + "reason_code": null, + "reason": null, + "phrase": "销售额下降 340(-12.6%),主要来自华东(-300,占 88.2%)", + "criterion": "一段占总变化的一半以上算主要来源,最多前 2 段合计占 80% 以上算集中,总变化不到基期的 0.5% 算基本持平,各段之和要和总数对得上才判断变化来自哪里", + "verdict": { + "code": "driver", + "direction": "down", + "subjects": [ + [ + "华东" + ] + ] + }, + "caveats": [ + { + "code": "comparability", + "text": "没能核对本期的数据是否到齐(期次写成「年-W周号」,认不出 SQL 是按哪种周号算的,不知道是哪几天)" + } + ], + "hypothesis": "下降是不是集中在某个地区", + "hypothesis_note": "Agent 写的假设:说明这次在验证什么,不是分析结论,也不进报告正文" + }, + { + "step": "analysis_method", + "alias": "A1", + "method": "decompose.additive@1", + "method_label": "变化拆解(可加)", + "params": { + "base": "2026-W41", + "by": [ + "region" + ], + "catalog": { + "labels": { + "region": "地区", + "week": "周" + }, + "measures": { + "gmv": "flow" + } + }, + "headline": { + "base": "Q1.r0.gmv", + "target": "Q1.r1.gmv" + }, + "label": "销售额", + "measure": "gmv", + "period": "week", + "query": "Q2", + "target": "2026-W42", + "today": "2026-10-21" + }, + "settings": [ + { + "key": "main_share", + "label": "「主要来源」的占比", + "value": 0.5 + }, + { + "key": "concentration", + "label": "「集中」的合计占比", + "value": 0.8 + }, + { + "key": "offset_ratio", + "label": "记为「抵消」的比例", + "value": 0.25 + }, + { + "key": "flat_pct", + "label": "「基本持平」的幅度", + "value": 0.005 + }, + { + "key": "table_top_k", + "label": "列出前几段", + "value": 10 + } + ], + "probes": [] + }, + { + "step": "analysis_calc", + "alias": "A1", + "values": [ + { + "key": "base_total", + "raw": "2700", + "rendered": "2,700" + }, + { + "key": "delta_total", + "raw": "-340", + "rendered": "-340" + }, + { + "key": "gross_down", + "raw": "-340", + "rendered": "-340" + }, + { + "key": "gross_up", + "raw": "0", + "rendered": "0" + }, + { + "key": "pct_total", + "raw": "-0.125925925926", + "rendered": "-12.6%" + }, + { + "key": "segments", + "raw": "4", + "rendered": "4" + }, + { + "key": "target_total", + "raw": "2360", + "rendered": "2,360" + }, + { + "key": "top_k", + "raw": "1", + "rendered": "1" + }, + { + "key": "top_k_share", + "raw": "0.882352941176", + "rendered": "88.2%" + }, + { + "key": "top_key", + "raw": "华东", + "rendered": "华东" + }, + { + "key": "top_share", + "raw": "0.882352941176", + "rendered": "88.2%" + } + ], + "formulas": [ + { + "label": "总变化", + "text": "总变化 = 本期合计 − 基期合计 = 2,360 − 2,700 = -340" + }, + { + "label": "变化率", + "text": "变化率 = 总变化 ÷ 基期合计 = -340 ÷ 2,700 = -12.6%" + }, + { + "label": "占比", + "text": "华东的占比 = 华东的变化 ÷ 总变化 = -300 ÷ (-340) = 88.2%" + } + ], + "table": { + "columns": [ + "region", + "base", + "target", + "delta", + "pct", + "share", + "flag" + ], + "labels": { + "base": "基期", + "delta": "变化", + "flag": "说明", + "pct": "变化率", + "region": "地区", + "share": "占变化的比重", + "target": "本期" + }, + "total_rows": 4, + "row_index": [ + 0, + 1, + 2, + 3 + ], + "rows": [ + [ + "华东", + "1,000", + "700", + "-300", + "-30.0%", + "88.2%", + "—" + ], + [ + "华南", + "800", + "780", + "-20", + "-2.5%", + "5.9%", + "—" + ], + [ + "华北", + "600", + "590", + "-10", + "-1.7%", + "2.9%", + "—" + ], + [ + "西南", + "300", + "290", + "-10", + "-3.3%", + "2.9%", + "—" + ] + ], + "masked": [], + "highlight": { + "cells": [ + [ + 1, + "delta" + ] + ] + } + } + }, + { + "step": "analysis_input", + "of": "A1", + "ref": "Q1.r0.gmv", + "role": "headline_base", + "role_label": "基期总数", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", + "row": 0, + "column": "gmv", + "value": "2700", + "query": "Q1", + "node_id": "bot", + "sealed": true, + "closure": { + "mode": "additive", + "total_key": "base_total", + "total": "2,700", + "headline": "2,700", + "closed": true + } + }, + { + "step": "analysis_input", + "of": "A1", + "ref": "Q1.r1.gmv", + "role": "headline_target", + "role_label": "本期总数", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", + "row": 1, + "column": "gmv", + "value": "2360", + "query": "Q1", + "node_id": "bot", + "sealed": true, + "closure": { + "mode": "additive", + "total_key": "target_total", + "total": "2,360", + "headline": "2,360", + "closed": true + } + }, + { + "step": "analysis_input", + "of": "A1", + "ref": "Q2", + "role": "data", + "role_label": "数据", + "artifact": "8322aa7cc7c2ad7d63887acb8d88d34ef6b1a9ed948afdb3acc9f7bd5328f460", + "columns": [ + "region", + "week", + "gmv" + ], + "rows": "all", + "query": "Q2", + "node_id": "bot", + "sealed": true + }, + { + "step": "query", + "alias": "Q1", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", + "node_id": "bot", + "tool": "db_query__shop", + "source": "shop", + "sql": "SELECT week, SUM(amount) AS gmv FROM orders GROUP BY week ORDER BY week", + "columns": [ + "week", + "gmv" + ], + "rows": [ + [ + "2026-W41", + 2700 + ], + [ + "2026-W42", + 2360 + ] + ], + "row_offset": 0, + "row_index": [ + 0, + 1 + ], + "total_rows": 2, + "truncated": false, + "highlight": { + "rows": [ + 0, + 1 + ], + "cols": [ + "gmv" + ], + "cells": [ + [ + 0, + "gmv" + ], + [ + 1, + "gmv" + ] + ] + }, + "masked": [], + "hash_ok": true, + "sealed": true, + "column_types": { + "gmv": "number", + "week": "text" + }, + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", + "catalog": [ + { + "table": "orders", + "version": 1 + } + ], + "input_of": "A1" + }, + { + "step": "query", + "alias": "Q2", + "artifact": "8322aa7cc7c2ad7d63887acb8d88d34ef6b1a9ed948afdb3acc9f7bd5328f460", + "node_id": "bot", + "tool": "db_query__shop", + "source": "shop", + "sql": "SELECT region, week, SUM(amount) AS gmv FROM orders GROUP BY region, week ORDER BY region, week", + "columns": [ + "region", + "week", + "gmv" + ], + "rows": [ + [ + "华东", + "2026-W41", + 1000 + ], + [ + "华东", + "2026-W42", + 700 + ], + [ + "华北", + "2026-W41", + 600 + ], + [ + "华北", + "2026-W42", + 590 + ], + [ + "华南", + "2026-W41", + 800 + ], + [ + "华南", + "2026-W42", + 780 + ], + [ + "西南", + "2026-W41", + 300 + ], + [ + "西南", + "2026-W42", + 290 + ] + ], + "row_offset": 0, + "row_index": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7 + ], + "total_rows": 8, + "truncated": false, + "highlight": { + "rows": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7 + ], + "cols": [ + "region", + "week", + "gmv" + ], + "cells": [ + [ + 0, + "region" + ], + [ + 1, + "region" + ], + [ + 2, + "region" + ], + [ + 3, + "region" + ], + [ + 4, + "region" + ], + [ + 5, + "region" + ], + [ + 6, + "region" + ], + [ + 7, + "region" + ], + [ + 0, + "week" + ], + [ + 1, + "week" + ], + [ + 2, + "week" + ], + [ + 3, + "week" + ], + [ + 4, + "week" + ], + [ + 5, + "week" + ], + [ + 6, + "week" + ], + [ + 7, + "week" + ], + [ + 0, + "gmv" + ], + [ + 1, + "gmv" + ], + [ + 2, + "gmv" + ], + [ + 3, + "gmv" + ], + [ + 4, + "gmv" + ], + [ + 5, + "gmv" + ], + [ + 6, + "gmv" + ], + [ + 7, + "gmv" + ] + ] + }, + "masked": [], + "hash_ok": true, + "sealed": true, + "column_types": { + "gmv": "number", + "region": "text", + "week": "text" + }, + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", + "catalog": [ + { + "table": "orders", + "version": 1 + } + ], + "input_of": "A1" + }, + { + "step": "analysis_recompute", + "alias": "A1", + "method": "decompose.additive@1", + "status": "same", + "text": "复算一致:按封存的输入重新计算,结论逐项相同" + }, + { + "step": "analysis_seal", + "alias": "A1", + "node_id": "bot", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", + "ledger": true, + "hash_ok": true, + "eid_ok": true, + "sealed": true + } + ], + "note": "该值由系统从分析结论的结果表中取出、按固定规则显示,未经模型转写", + "violations": [], + "seal": { + "sealed": true, + "ok": true, + "covered": true + }, + "redacted": { + "columns": [] + } + }, + "s46": { + "report": { + "node_id": "write", + "doc_artifact": "32cc0cc3a309ef588a619cbf69d277710b6c0505b9c36ca880b50feaebca63dc" + }, + "segment": { + "id": "s46", + "text": "-2.5%", + "kind": "number", + "state": "deterministic", + "span": [ + 245, + 250 + ], + "unit": "u17", + "ref": "v:A1.r1.pct", + "cite": { + "alias": "A1", + "conv": "pct", + "eid": "ev:cell:1bb9cb78a05f83a2", + "kind": "cell", + "locator": { + "column": "pct", + "row": 1 + }, + "ref": "A1.r1.pct", + "rendered": "-2.5%", + "role": "value", + "status": "resolved", + "value": -0.025 + } + }, + "unit": { + "id": "u17", + "kind": "claim", + "text": "-2.5%", + "span": [ + 245, + 250 + ], + "cites": [ + "A1" + ], + "on_demand": { + "available": false, + "reason": "not_a_claim", + "message": "这句不是结论句(标题、连接性文字、表格单元格或代码),无需模型裁判" + } + }, + "block": { + "id": "b7", + "type": "table" + }, + "chain": [ + { + "step": "analysis", + "alias": "A1", + "op": "decompose", + "mode": "additive", + "method_label": "变化拆解(可加)", + "origin": "agent", + "call_id": "call_3", + "node_id": "bot", + "label": "问数据", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", + "eid": "ev:analysis:a7edbc13c92c31a0", + "eid_ok": true, + "cited": { + "what": "cell", + "row": 1, + "column": "pct", + "raw": "-0.025" + }, + "rendered": "-2.5%", + "render_ok": true, + "hash_ok": true, + "status": "ok", + "reason_code": null, + "reason": null, + "phrase": "销售额下降 340(-12.6%),主要来自华东(-300,占 88.2%)", + "criterion": "一段占总变化的一半以上算主要来源,最多前 2 段合计占 80% 以上算集中,总变化不到基期的 0.5% 算基本持平,各段之和要和总数对得上才判断变化来自哪里", + "verdict": { + "code": "driver", + "direction": "down", + "subjects": [ + [ + "华东" + ] + ] + }, + "caveats": [ + { + "code": "comparability", + "text": "没能核对本期的数据是否到齐(期次写成「年-W周号」,认不出 SQL 是按哪种周号算的,不知道是哪几天)" + } + ], + "hypothesis": "下降是不是集中在某个地区", + "hypothesis_note": "Agent 写的假设:说明这次在验证什么,不是分析结论,也不进报告正文" + }, + { + "step": "analysis_method", + "alias": "A1", + "method": "decompose.additive@1", + "method_label": "变化拆解(可加)", + "params": { + "base": "2026-W41", + "by": [ + "region" + ], + "catalog": { + "labels": { + "region": "地区", + "week": "周" + }, + "measures": { + "gmv": "flow" + } + }, + "headline": { + "base": "Q1.r0.gmv", + "target": "Q1.r1.gmv" + }, + "label": "销售额", + "measure": "gmv", + "period": "week", + "query": "Q2", + "target": "2026-W42", + "today": "2026-10-21" + }, + "settings": [ + { + "key": "main_share", + "label": "「主要来源」的占比", + "value": 0.5 + }, + { + "key": "concentration", + "label": "「集中」的合计占比", + "value": 0.8 + }, + { + "key": "offset_ratio", + "label": "记为「抵消」的比例", + "value": 0.25 + }, + { + "key": "flat_pct", + "label": "「基本持平」的幅度", + "value": 0.005 + }, + { + "key": "table_top_k", + "label": "列出前几段", + "value": 10 + } + ], + "probes": [] + }, + { + "step": "analysis_calc", + "alias": "A1", + "values": [ + { + "key": "base_total", + "raw": "2700", + "rendered": "2,700" + }, + { + "key": "delta_total", + "raw": "-340", + "rendered": "-340" + }, + { + "key": "gross_down", + "raw": "-340", + "rendered": "-340" + }, + { + "key": "gross_up", + "raw": "0", + "rendered": "0" + }, + { + "key": "pct_total", + "raw": "-0.125925925926", + "rendered": "-12.6%" + }, + { + "key": "segments", + "raw": "4", + "rendered": "4" + }, + { + "key": "target_total", + "raw": "2360", + "rendered": "2,360" + }, + { + "key": "top_k", + "raw": "1", + "rendered": "1" + }, + { + "key": "top_k_share", + "raw": "0.882352941176", + "rendered": "88.2%" + }, + { + "key": "top_key", + "raw": "华东", + "rendered": "华东" + }, + { + "key": "top_share", + "raw": "0.882352941176", + "rendered": "88.2%" + } + ], + "formulas": [ + { + "label": "总变化", + "text": "总变化 = 本期合计 − 基期合计 = 2,360 − 2,700 = -340" + }, + { + "label": "变化率", + "text": "变化率 = 总变化 ÷ 基期合计 = -340 ÷ 2,700 = -12.6%" + }, + { + "label": "占比", + "text": "华东的占比 = 华东的变化 ÷ 总变化 = -300 ÷ (-340) = 88.2%" + } + ], + "table": { + "columns": [ + "region", + "base", + "target", + "delta", + "pct", + "share", + "flag" + ], + "labels": { + "base": "基期", + "delta": "变化", + "flag": "说明", + "pct": "变化率", + "region": "地区", + "share": "占变化的比重", + "target": "本期" + }, + "total_rows": 4, + "row_index": [ + 0, + 1, + 2, + 3 + ], + "rows": [ + [ + "华东", + "1,000", + "700", + "-300", + "-30.0%", + "88.2%", + "—" + ], + [ + "华南", + "800", + "780", + "-20", + "-2.5%", + "5.9%", + "—" + ], + [ + "华北", + "600", + "590", + "-10", + "-1.7%", + "2.9%", + "—" + ], + [ + "西南", + "300", + "290", + "-10", + "-3.3%", + "2.9%", + "—" + ] + ], + "masked": [], + "highlight": { + "cells": [ + [ + 1, + "pct" + ] + ] + } + } + }, + { + "step": "analysis_input", + "of": "A1", + "ref": "Q1.r0.gmv", + "role": "headline_base", + "role_label": "基期总数", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", + "row": 0, + "column": "gmv", + "value": "2700", + "query": "Q1", + "node_id": "bot", + "sealed": true, + "closure": { + "mode": "additive", + "total_key": "base_total", + "total": "2,700", + "headline": "2,700", + "closed": true + } + }, + { + "step": "analysis_input", + "of": "A1", + "ref": "Q1.r1.gmv", + "role": "headline_target", + "role_label": "本期总数", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", + "row": 1, + "column": "gmv", + "value": "2360", + "query": "Q1", + "node_id": "bot", + "sealed": true, + "closure": { + "mode": "additive", + "total_key": "target_total", + "total": "2,360", + "headline": "2,360", + "closed": true + } + }, + { + "step": "analysis_input", + "of": "A1", + "ref": "Q2", + "role": "data", + "role_label": "数据", + "artifact": "8322aa7cc7c2ad7d63887acb8d88d34ef6b1a9ed948afdb3acc9f7bd5328f460", + "columns": [ + "region", + "week", + "gmv" + ], + "rows": "all", + "query": "Q2", + "node_id": "bot", + "sealed": true + }, + { + "step": "query", + "alias": "Q1", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", + "node_id": "bot", + "tool": "db_query__shop", + "source": "shop", + "sql": "SELECT week, SUM(amount) AS gmv FROM orders GROUP BY week ORDER BY week", + "columns": [ + "week", + "gmv" + ], + "rows": [ + [ + "2026-W41", + 2700 + ], + [ + "2026-W42", + 2360 + ] + ], + "row_offset": 0, + "row_index": [ + 0, + 1 + ], + "total_rows": 2, + "truncated": false, + "highlight": { + "rows": [ + 0, + 1 + ], + "cols": [ + "gmv" + ], + "cells": [ + [ + 0, + "gmv" + ], + [ + 1, + "gmv" + ] + ] + }, + "masked": [], + "hash_ok": true, + "sealed": true, + "column_types": { + "gmv": "number", + "week": "text" + }, + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", + "catalog": [ + { + "table": "orders", + "version": 1 + } + ], + "input_of": "A1" + }, + { + "step": "query", + "alias": "Q2", + "artifact": "8322aa7cc7c2ad7d63887acb8d88d34ef6b1a9ed948afdb3acc9f7bd5328f460", + "node_id": "bot", + "tool": "db_query__shop", + "source": "shop", + "sql": "SELECT region, week, SUM(amount) AS gmv FROM orders GROUP BY region, week ORDER BY region, week", + "columns": [ + "region", + "week", + "gmv" + ], + "rows": [ + [ + "华东", + "2026-W41", + 1000 + ], + [ + "华东", + "2026-W42", + 700 + ], + [ + "华北", + "2026-W41", + 600 + ], + [ + "华北", + "2026-W42", + 590 + ], + [ + "华南", + "2026-W41", + 800 + ], + [ + "华南", + "2026-W42", + 780 + ], + [ + "西南", + "2026-W41", + 300 + ], + [ + "西南", + "2026-W42", + 290 + ] + ], + "row_offset": 0, + "row_index": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7 + ], + "total_rows": 8, + "truncated": false, + "highlight": { + "rows": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7 + ], + "cols": [ + "region", + "week", + "gmv" + ], + "cells": [ + [ + 0, + "region" + ], + [ + 1, + "region" + ], + [ + 2, + "region" + ], + [ + 3, + "region" + ], + [ + 4, + "region" + ], + [ + 5, + "region" + ], + [ + 6, + "region" + ], + [ + 7, + "region" + ], + [ + 0, + "week" + ], + [ + 1, + "week" + ], + [ + 2, + "week" + ], + [ + 3, + "week" + ], + [ + 4, + "week" + ], + [ + 5, + "week" + ], + [ + 6, + "week" + ], + [ + 7, + "week" + ], + [ + 0, + "gmv" + ], + [ + 1, + "gmv" + ], + [ + 2, + "gmv" + ], + [ + 3, + "gmv" + ], + [ + 4, + "gmv" + ], + [ + 5, + "gmv" + ], + [ + 6, + "gmv" + ], + [ + 7, + "gmv" + ] + ] + }, + "masked": [], + "hash_ok": true, + "sealed": true, + "column_types": { + "gmv": "number", + "region": "text", + "week": "text" + }, + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", + "catalog": [ + { + "table": "orders", + "version": 1 + } + ], + "input_of": "A1" + }, + { + "step": "analysis_recompute", + "alias": "A1", + "method": "decompose.additive@1", + "status": "same", + "text": "复算一致:按封存的输入重新计算,结论逐项相同" + }, + { + "step": "analysis_seal", + "alias": "A1", + "node_id": "bot", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", + "ledger": true, + "hash_ok": true, + "eid_ok": true, + "sealed": true + } + ], + "note": "该值由系统从分析结论的结果表中取出、按固定规则显示,未经模型转写", + "violations": [], + "seal": { + "sealed": true, + "ok": true, + "covered": true + }, + "redacted": { + "columns": [] + } + }, + "s48": { + "report": { + "node_id": "write", + "doc_artifact": "32cc0cc3a309ef588a619cbf69d277710b6c0505b9c36ca880b50feaebca63dc" + }, + "segment": { + "id": "s48", + "text": "5.9%", + "kind": "number", + "state": "deterministic", + "span": [ + 253, + 257 + ], + "unit": "u18", + "ref": "v:A1.r1.share", + "cite": { + "alias": "A1", + "conv": "pct", + "eid": "ev:cell:379dcf4b1b6947b1", + "kind": "cell", + "locator": { + "column": "share", + "row": 1 + }, + "ref": "A1.r1.share", + "rendered": "5.9%", + "role": "value", + "status": "resolved", + "value": 0.0588235294118 + } + }, + "unit": { + "id": "u18", + "kind": "claim", + "text": "5.9%", + "span": [ + 253, + 257 + ], + "cites": [ + "A1" + ], + "on_demand": { + "available": false, + "reason": "not_a_claim", + "message": "这句不是结论句(标题、连接性文字、表格单元格或代码),无需模型裁判" + } + }, + "block": { + "id": "b7", + "type": "table" + }, + "chain": [ + { + "step": "analysis", + "alias": "A1", + "op": "decompose", + "mode": "additive", + "method_label": "变化拆解(可加)", + "origin": "agent", + "call_id": "call_3", + "node_id": "bot", + "label": "问数据", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", + "eid": "ev:analysis:a7edbc13c92c31a0", + "eid_ok": true, + "cited": { + "what": "cell", + "row": 1, + "column": "share", + "raw": "0.0588235294118" + }, + "rendered": "5.9%", + "render_ok": true, + "hash_ok": true, + "status": "ok", + "reason_code": null, + "reason": null, + "phrase": "销售额下降 340(-12.6%),主要来自华东(-300,占 88.2%)", + "criterion": "一段占总变化的一半以上算主要来源,最多前 2 段合计占 80% 以上算集中,总变化不到基期的 0.5% 算基本持平,各段之和要和总数对得上才判断变化来自哪里", + "verdict": { + "code": "driver", + "direction": "down", + "subjects": [ + [ + "华东" + ] + ] + }, + "caveats": [ + { + "code": "comparability", + "text": "没能核对本期的数据是否到齐(期次写成「年-W周号」,认不出 SQL 是按哪种周号算的,不知道是哪几天)" + } + ], + "hypothesis": "下降是不是集中在某个地区", + "hypothesis_note": "Agent 写的假设:说明这次在验证什么,不是分析结论,也不进报告正文" + }, + { + "step": "analysis_method", + "alias": "A1", + "method": "decompose.additive@1", + "method_label": "变化拆解(可加)", + "params": { + "base": "2026-W41", + "by": [ + "region" + ], + "catalog": { + "labels": { + "region": "地区", + "week": "周" + }, + "measures": { + "gmv": "flow" + } + }, + "headline": { + "base": "Q1.r0.gmv", + "target": "Q1.r1.gmv" + }, + "label": "销售额", + "measure": "gmv", + "period": "week", + "query": "Q2", + "target": "2026-W42", + "today": "2026-10-21" + }, + "settings": [ + { + "key": "main_share", + "label": "「主要来源」的占比", + "value": 0.5 + }, + { + "key": "concentration", + "label": "「集中」的合计占比", + "value": 0.8 + }, + { + "key": "offset_ratio", + "label": "记为「抵消」的比例", + "value": 0.25 + }, + { + "key": "flat_pct", + "label": "「基本持平」的幅度", + "value": 0.005 + }, + { + "key": "table_top_k", + "label": "列出前几段", + "value": 10 + } + ], + "probes": [] + }, + { + "step": "analysis_calc", + "alias": "A1", + "values": [ + { + "key": "base_total", + "raw": "2700", + "rendered": "2,700" + }, + { + "key": "delta_total", + "raw": "-340", + "rendered": "-340" + }, + { + "key": "gross_down", + "raw": "-340", + "rendered": "-340" + }, + { + "key": "gross_up", + "raw": "0", + "rendered": "0" + }, + { + "key": "pct_total", + "raw": "-0.125925925926", + "rendered": "-12.6%" + }, + { + "key": "segments", + "raw": "4", + "rendered": "4" + }, + { + "key": "target_total", + "raw": "2360", + "rendered": "2,360" + }, + { + "key": "top_k", + "raw": "1", + "rendered": "1" + }, + { + "key": "top_k_share", + "raw": "0.882352941176", + "rendered": "88.2%" + }, + { + "key": "top_key", + "raw": "华东", + "rendered": "华东" + }, + { + "key": "top_share", + "raw": "0.882352941176", + "rendered": "88.2%" + } + ], + "formulas": [ + { + "label": "总变化", + "text": "总变化 = 本期合计 − 基期合计 = 2,360 − 2,700 = -340" + }, + { + "label": "变化率", + "text": "变化率 = 总变化 ÷ 基期合计 = -340 ÷ 2,700 = -12.6%" + }, + { + "label": "占比", + "text": "华东的占比 = 华东的变化 ÷ 总变化 = -300 ÷ (-340) = 88.2%" + } + ], + "table": { + "columns": [ + "region", + "base", + "target", + "delta", + "pct", + "share", + "flag" + ], + "labels": { + "base": "基期", + "delta": "变化", + "flag": "说明", + "pct": "变化率", + "region": "地区", + "share": "占变化的比重", + "target": "本期" + }, + "total_rows": 4, + "row_index": [ + 0, + 1, + 2, + 3 + ], + "rows": [ + [ + "华东", + "1,000", + "700", + "-300", + "-30.0%", + "88.2%", + "—" + ], + [ + "华南", + "800", + "780", + "-20", + "-2.5%", + "5.9%", + "—" + ], + [ + "华北", + "600", + "590", + "-10", + "-1.7%", + "2.9%", + "—" + ], + [ + "西南", + "300", + "290", + "-10", + "-3.3%", + "2.9%", + "—" + ] + ], + "masked": [], + "highlight": { + "cells": [ + [ + 1, + "share" + ] + ] + } + } + }, + { + "step": "analysis_input", + "of": "A1", + "ref": "Q1.r0.gmv", + "role": "headline_base", + "role_label": "基期总数", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", + "row": 0, + "column": "gmv", + "value": "2700", + "query": "Q1", + "node_id": "bot", + "sealed": true, + "closure": { + "mode": "additive", + "total_key": "base_total", + "total": "2,700", + "headline": "2,700", + "closed": true + } + }, + { + "step": "analysis_input", + "of": "A1", + "ref": "Q1.r1.gmv", + "role": "headline_target", + "role_label": "本期总数", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", + "row": 1, + "column": "gmv", + "value": "2360", + "query": "Q1", + "node_id": "bot", + "sealed": true, + "closure": { + "mode": "additive", + "total_key": "target_total", + "total": "2,360", + "headline": "2,360", + "closed": true + } + }, + { + "step": "analysis_input", + "of": "A1", + "ref": "Q2", + "role": "data", + "role_label": "数据", + "artifact": "8322aa7cc7c2ad7d63887acb8d88d34ef6b1a9ed948afdb3acc9f7bd5328f460", + "columns": [ + "region", + "week", + "gmv" + ], + "rows": "all", + "query": "Q2", + "node_id": "bot", + "sealed": true + }, + { + "step": "query", + "alias": "Q1", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", + "node_id": "bot", + "tool": "db_query__shop", + "source": "shop", + "sql": "SELECT week, SUM(amount) AS gmv FROM orders GROUP BY week ORDER BY week", + "columns": [ + "week", + "gmv" + ], + "rows": [ + [ + "2026-W41", + 2700 + ], + [ + "2026-W42", + 2360 + ] + ], + "row_offset": 0, + "row_index": [ + 0, + 1 + ], + "total_rows": 2, + "truncated": false, + "highlight": { + "rows": [ + 0, + 1 + ], + "cols": [ + "gmv" + ], + "cells": [ + [ + 0, + "gmv" + ], + [ + 1, + "gmv" + ] + ] + }, + "masked": [], + "hash_ok": true, + "sealed": true, + "column_types": { + "gmv": "number", + "week": "text" + }, + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", + "catalog": [ + { + "table": "orders", + "version": 1 + } + ], + "input_of": "A1" + }, + { + "step": "query", + "alias": "Q2", + "artifact": "8322aa7cc7c2ad7d63887acb8d88d34ef6b1a9ed948afdb3acc9f7bd5328f460", + "node_id": "bot", + "tool": "db_query__shop", + "source": "shop", + "sql": "SELECT region, week, SUM(amount) AS gmv FROM orders GROUP BY region, week ORDER BY region, week", + "columns": [ + "region", + "week", + "gmv" + ], + "rows": [ + [ + "华东", + "2026-W41", + 1000 + ], + [ + "华东", + "2026-W42", + 700 + ], + [ + "华北", + "2026-W41", + 600 + ], + [ + "华北", + "2026-W42", + 590 + ], + [ + "华南", + "2026-W41", + 800 + ], + [ + "华南", + "2026-W42", + 780 + ], + [ + "西南", + "2026-W41", + 300 + ], + [ + "西南", + "2026-W42", + 290 + ] + ], + "row_offset": 0, + "row_index": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7 + ], + "total_rows": 8, + "truncated": false, + "highlight": { + "rows": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7 + ], + "cols": [ + "region", + "week", + "gmv" + ], + "cells": [ + [ + 0, + "region" + ], + [ + 1, + "region" + ], + [ + 2, + "region" + ], + [ + 3, + "region" + ], + [ + 4, + "region" + ], + [ + 5, + "region" + ], + [ + 6, + "region" + ], + [ + 7, + "region" + ], + [ + 0, + "week" + ], + [ + 1, + "week" + ], + [ + 2, + "week" + ], + [ + 3, + "week" + ], + [ + 4, + "week" + ], + [ + 5, + "week" + ], + [ + 6, + "week" + ], + [ + 7, + "week" + ], + [ + 0, + "gmv" + ], + [ + 1, + "gmv" + ], + [ + 2, + "gmv" + ], + [ + 3, + "gmv" + ], + [ + 4, + "gmv" + ], + [ + 5, + "gmv" + ], + [ + 6, + "gmv" + ], + [ + 7, + "gmv" + ] + ] + }, + "masked": [], + "hash_ok": true, + "sealed": true, + "column_types": { + "gmv": "number", + "region": "text", + "week": "text" + }, + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", + "catalog": [ + { + "table": "orders", + "version": 1 + } + ], + "input_of": "A1" + }, + { + "step": "analysis_recompute", + "alias": "A1", + "method": "decompose.additive@1", + "status": "same", + "text": "复算一致:按封存的输入重新计算,结论逐项相同" + }, + { + "step": "analysis_seal", + "alias": "A1", + "node_id": "bot", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", + "ledger": true, + "hash_ok": true, + "eid_ok": true, + "sealed": true + } + ], + "note": "该值由系统从分析结论的结果表中取出、按固定规则显示,未经模型转写", + "violations": [], + "seal": { + "sealed": true, + "ok": true, + "covered": true + }, + "redacted": { + "columns": [] + } } }, "graph": { - "run_id": "ed3de345aac143089fb3d0777d9056ec", + "run_id": "6d4d8c841a7d4900a3495f24bc932afa", "schema": "agentlab.evidence/1", "seal": { "sealed": true, "ok": true, - "manifest_seq": 78, + "manifest_seq": 84, "legacy": false }, "reports": [ { "node_id": "write", - "doc_artifact": "d115c361e8ae4f6d06bd4f839c6f6f6c62c0721575b048da7350834f8ce41389", + "doc_artifact": "32cc0cc3a309ef588a619cbf69d277710b6c0505b9c36ca880b50feaebca63dc", "doc_sealed": true, "hash_ok": true, "ok": false, @@ -2786,22 +10762,22 @@ ], "stats": { "analysis_claims": 3, - "claims": 5, - "connective": 0, + "claims": 14, + "connective": 4, "entities": 0, "headings": 1, - "numbers": 2, - "numbers_cited": 2, + "numbers": 11, + "numbers_cited": 11, "quotes": 0, "see": 2, - "segments": 17, + "segments": 50, "uncited_claims": 2, "uncited_numbers": 0, - "units": 6, + "units": 19, "unknown_entities": 0, "unresolved": 0, "unverified_entities": 0, - "values": 1, + "values": 3, "violations": 3 }, "claims": "off", @@ -2813,21 +10789,41 @@ "evidence": [ { "alias": "A1", - "eid": "ev:analysis:10fb652eb3e403a8", + "eid": "ev:analysis:a7edbc13c92c31a0", "kind": "analysis", "label": "变化拆解(可加) · 销售额下降 340(-12.6%),主要来自华东(-300,占 88.2%)", "node_id": "bot", - "artifact": "6d06b2913312497d982d4e36e0c94a57c377b990110bac960d72d64979d7c12d", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", "sealed": true, "cited_by": [ "s3", "s7", - "s9" + "s9", + "s19", + "s21", + "s23", + "s34", + "s36", + "s38", + "s40", + "s42", + "s44", + "s46", + "s48" ], "units": [ "u1", "u2", - "u3" + "u3", + "u6", + "u11", + "u12", + "u13", + "u14", + "u15", + "u16", + "u17", + "u18" ], "report": "write", "op": "decompose", @@ -2838,11 +10834,11 @@ }, { "alias": "A2", - "eid": "ev:analysis:436f6b967aa1414c", + "eid": "ev:analysis:d89ecaae59a168f0", "kind": "analysis", "label": "波动基线 · 波动基线没有做成:只有 0 期历史,至少要 8 期", "node_id": "bot", - "artifact": "2e4139852d4ca46f8ee328ce44cb2ddde14f79e54c1371b3a77e15bf232b0122", + "artifact": "edaa673d3f04f17f8968ef35209c2ad6b281a9d54de71e383bed7df318ec5d99", "sealed": true, "cited_by": [], "units": [], @@ -2853,11 +10849,11 @@ }, { "alias": "A3", - "eid": "ev:analysis:bb168f2c30497439", + "eid": "ev:analysis:066e85d56f331b63", "kind": "analysis", "label": "可比性检查 · 两期可比,窗口长度、整期、星期构成核对不了", "node_id": "bot", - "artifact": "afa2ea2ba75e5eb20e7f3372e3a9dea164eddb0338fa51c6b2fd9a808c09072a", + "artifact": "df87e1917658e653f79ccac7e43e2cf70210b04dc2194bb849eb099303b66f23", "sealed": true, "cited_by": [], "units": [], @@ -2869,11 +10865,11 @@ }, { "alias": "Q1", - "eid": "ev:query:ad723c3d0c0ae28c", + "eid": "ev:query:9c920fc7352dde33", "kind": "query", "label": "db_query__shop · 2 行", "node_id": "bot", - "artifact": "8fa60a625e4a072804462dd66dde6b1634f9fbd8244183e626a6fdcd8acb87fc", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", "sealed": true, "cited_by": [], "units": [], @@ -2889,11 +10885,11 @@ }, { "alias": "Q2", - "eid": "ev:query:c390b8b187033425", + "eid": "ev:query:42ab65ce25770550", "kind": "query", "label": "db_query__shop · 8 行", "node_id": "bot", - "artifact": "94f47ca377dfd4fddc3e4bdba0466cbefdd6c4b66beaf4468332a9dd51be7901", + "artifact": "8322aa7cc7c2ad7d63887acb8d88d34ef6b1a9ed948afdb3acc9f7bd5328f460", "sealed": true, "cited_by": [], "units": [], @@ -2940,6 +10936,72 @@ "rel": "supports", "report": "write" }, + { + "from": "s19", + "to": "A1", + "rel": "cites", + "report": "write" + }, + { + "from": "s21", + "to": "A1", + "rel": "cites", + "report": "write" + }, + { + "from": "s23", + "to": "A1", + "rel": "cites", + "report": "write" + }, + { + "from": "s34", + "to": "A1", + "rel": "cites", + "report": "write" + }, + { + "from": "s36", + "to": "A1", + "rel": "cites", + "report": "write" + }, + { + "from": "s38", + "to": "A1", + "rel": "cites", + "report": "write" + }, + { + "from": "s40", + "to": "A1", + "rel": "cites", + "report": "write" + }, + { + "from": "s42", + "to": "A1", + "rel": "cites", + "report": "write" + }, + { + "from": "s44", + "to": "A1", + "rel": "cites", + "report": "write" + }, + { + "from": "s46", + "to": "A1", + "rel": "cites", + "report": "write" + }, + { + "from": "s48", + "to": "A1", + "rel": "cites", + "report": "write" + }, { "from": "A1", "to": "Q1", @@ -2969,18 +11031,60 @@ "to": "A1", "rel": "cell_of", "report": "write" + }, + { + "from": "A1.r0.pct", + "to": "A1", + "rel": "cell_of", + "report": "write" + }, + { + "from": "A1.r0.share", + "to": "A1", + "rel": "cell_of", + "report": "write" + }, + { + "from": "A1.r0.region", + "to": "A1", + "rel": "cell_of", + "report": "write" + }, + { + "from": "A1.r1.region", + "to": "A1", + "rel": "cell_of", + "report": "write" + }, + { + "from": "A1.r1.delta", + "to": "A1", + "rel": "cell_of", + "report": "write" + }, + { + "from": "A1.r1.pct", + "to": "A1", + "rel": "cell_of", + "report": "write" + }, + { + "from": "A1.r1.share", + "to": "A1", + "rel": "cell_of", + "report": "write" } ], "mode": "cited" }, "audit": { - "run_id": "ed3de345aac143089fb3d0777d9056ec", + "run_id": "6d4d8c841a7d4900a3495f24bc932afa", "schema": "agentlab.evidence.audit/1", "mode": "cited", "seal": { "sealed": true, "ok": true, - "manifest_seq": 78, + "manifest_seq": 84, "legacy": false, "events": 45, "message": "事件记录与封存时一致" @@ -2988,7 +11092,7 @@ "reports": [ { "node_id": "write", - "doc_artifact": "d115c361e8ae4f6d06bd4f839c6f6f6c62c0721575b048da7350834f8ce41389", + "doc_artifact": "32cc0cc3a309ef588a619cbf69d277710b6c0505b9c36ca880b50feaebca63dc", "hash_ok": true, "doc_sealed": true, "fields": [ @@ -2996,22 +11100,22 @@ ], "stats": { "analysis_claims": 3, - "claims": 5, - "connective": 0, + "claims": 14, + "connective": 4, "entities": 0, "headings": 1, - "numbers": 2, - "numbers_cited": 2, + "numbers": 11, + "numbers_cited": 11, "quotes": 0, "see": 2, - "segments": 17, + "segments": 50, "uncited_claims": 2, "uncited_numbers": 0, - "units": 6, + "units": 19, "unknown_entities": 0, "unresolved": 0, "unverified_entities": 0, - "values": 1, + "values": 3, "violations": 3 }, "claims": "off", @@ -3024,7 +11128,7 @@ { "key": "cited", "label": "有出处", - "count": 3, + "count": 14, "rows": [ { "group": "cited", @@ -3040,8 +11144,8 @@ "alias": "A1", "evidence_kind": "analysis", "evidence": "变化拆解(可加) · 销售额下降 340(-12.6%),主要来自华东(-300,占 88.2%)", - "eid": "ev:analysis:10fb652eb3e403a8", - "artifact": "6d06b2913312497d982d4e36e0c94a57c377b990110bac960d72d64979d7c12d", + "eid": "ev:analysis:a7edbc13c92c31a0", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", "node_id": "bot", "sealed": true, "span": [ @@ -3065,8 +11169,8 @@ "alias": "A1", "evidence_kind": "analysis", "evidence": "A1.r0.delta", - "eid": "ev:cell:164abd36aeac4c3b", - "artifact": "6d06b2913312497d982d4e36e0c94a57c377b990110bac960d72d64979d7c12d", + "eid": "ev:cell:a7deaec3f4ed6ab6", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", "node_id": "bot", "sealed": true, "span": [ @@ -3090,8 +11194,8 @@ "alias": "A1", "evidence_kind": "analysis", "evidence": "A1.top_share", - "eid": "ev:analysis:efc6267321553bc3", - "artifact": "6d06b2913312497d982d4e36e0c94a57c377b990110bac960d72d64979d7c12d", + "eid": "ev:analysis:5517f6de3df56204", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", "node_id": "bot", "sealed": true, "span": [ @@ -3100,6 +11204,281 @@ ], "sentence": "华东的变化为 -300,占总变化的 88.2%。", "note": "这个数取自分析结论的具名的数,由系统按固定规则显示,未经模型转写" + }, + { + "group": "cited", + "report": "write", + "field": "周报", + "segment": "s19", + "unit": "u6", + "kind": "number", + "text": "-30.0%", + "state": "deterministic", + "issue": null, + "ref": "v:A1.r0.pct", + "alias": "A1", + "evidence_kind": "analysis", + "evidence": "A1.r0.pct", + "eid": "ev:cell:32d18640349e7717", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", + "node_id": "bot", + "sealed": true, + "span": [ + 121, + 127 + ], + "sentence": "变化率 -30.0%、比重 88.2%、占比 88.2%。", + "note": "该值由系统从分析结论的结果表中取出、按固定规则显示,未经模型转写" + }, + { + "group": "cited", + "report": "write", + "field": "周报", + "segment": "s21", + "unit": "u6", + "kind": "number", + "text": "88.2%", + "state": "deterministic", + "issue": null, + "ref": "v:A1.r0.share", + "alias": "A1", + "evidence_kind": "analysis", + "evidence": "A1.r0.share", + "eid": "ev:cell:b36848a6055a5628", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", + "node_id": "bot", + "sealed": true, + "span": [ + 131, + 136 + ], + "sentence": "变化率 -30.0%、比重 88.2%、占比 88.2%。", + "note": "该值由系统从分析结论的结果表中取出、按固定规则显示,未经模型转写" + }, + { + "group": "cited", + "report": "write", + "field": "周报", + "segment": "s23", + "unit": "u6", + "kind": "number", + "text": "88.2%", + "state": "deterministic", + "issue": null, + "ref": "a:A1.top_share", + "alias": "A1", + "evidence_kind": "analysis", + "evidence": "A1.top_share", + "eid": "ev:analysis:5517f6de3df56204", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", + "node_id": "bot", + "sealed": true, + "span": [ + 140, + 145 + ], + "sentence": "变化率 -30.0%、比重 88.2%、占比 88.2%。", + "note": "这个数取自分析结论的具名的数,由系统按固定规则显示,未经模型转写" + }, + { + "group": "cited", + "report": "write", + "field": "周报", + "segment": "s34", + "unit": "u11", + "kind": "value", + "text": "华东", + "state": "deterministic", + "issue": null, + "ref": "v:A1.r0.region", + "alias": "A1", + "evidence_kind": "analysis", + "evidence": "A1.r0.region", + "eid": "ev:cell:cf44ef048f0ff6cf", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", + "node_id": "bot", + "sealed": true, + "span": [ + 203, + 205 + ], + "sentence": "华东", + "note": "该值由系统从分析结论的结果表中取出、按固定规则显示,未经模型转写" + }, + { + "group": "cited", + "report": "write", + "field": "周报", + "segment": "s36", + "unit": "u12", + "kind": "number", + "text": "-300", + "state": "deterministic", + "issue": null, + "ref": "v:A1.r0.delta", + "alias": "A1", + "evidence_kind": "analysis", + "evidence": "A1.r0.delta", + "eid": "ev:cell:a7deaec3f4ed6ab6", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", + "node_id": "bot", + "sealed": true, + "span": [ + 208, + 212 + ], + "sentence": "-300", + "note": "该值由系统从分析结论的结果表中取出、按固定规则显示,未经模型转写" + }, + { + "group": "cited", + "report": "write", + "field": "周报", + "segment": "s38", + "unit": "u13", + "kind": "number", + "text": "-30.0%", + "state": "deterministic", + "issue": null, + "ref": "v:A1.r0.pct", + "alias": "A1", + "evidence_kind": "analysis", + "evidence": "A1.r0.pct", + "eid": "ev:cell:32d18640349e7717", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", + "node_id": "bot", + "sealed": true, + "span": [ + 215, + 221 + ], + "sentence": "-30.0%", + "note": "该值由系统从分析结论的结果表中取出、按固定规则显示,未经模型转写" + }, + { + "group": "cited", + "report": "write", + "field": "周报", + "segment": "s40", + "unit": "u14", + "kind": "number", + "text": "88.2%", + "state": "deterministic", + "issue": null, + "ref": "v:A1.r0.share", + "alias": "A1", + "evidence_kind": "analysis", + "evidence": "A1.r0.share", + "eid": "ev:cell:b36848a6055a5628", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", + "node_id": "bot", + "sealed": true, + "span": [ + 224, + 229 + ], + "sentence": "88.2%", + "note": "该值由系统从分析结论的结果表中取出、按固定规则显示,未经模型转写" + }, + { + "group": "cited", + "report": "write", + "field": "周报", + "segment": "s42", + "unit": "u15", + "kind": "value", + "text": "华南", + "state": "deterministic", + "issue": null, + "ref": "v:A1.r1.region", + "alias": "A1", + "evidence_kind": "analysis", + "evidence": "A1.r1.region", + "eid": "ev:cell:15977323c7fb25b1", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", + "node_id": "bot", + "sealed": true, + "span": [ + 234, + 236 + ], + "sentence": "华南", + "note": "该值由系统从分析结论的结果表中取出、按固定规则显示,未经模型转写" + }, + { + "group": "cited", + "report": "write", + "field": "周报", + "segment": "s44", + "unit": "u16", + "kind": "number", + "text": "-20", + "state": "deterministic", + "issue": null, + "ref": "v:A1.r1.delta", + "alias": "A1", + "evidence_kind": "analysis", + "evidence": "A1.r1.delta", + "eid": "ev:cell:50fa5438a057327a", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", + "node_id": "bot", + "sealed": true, + "span": [ + 239, + 242 + ], + "sentence": "-20", + "note": "该值由系统从分析结论的结果表中取出、按固定规则显示,未经模型转写" + }, + { + "group": "cited", + "report": "write", + "field": "周报", + "segment": "s46", + "unit": "u17", + "kind": "number", + "text": "-2.5%", + "state": "deterministic", + "issue": null, + "ref": "v:A1.r1.pct", + "alias": "A1", + "evidence_kind": "analysis", + "evidence": "A1.r1.pct", + "eid": "ev:cell:1bb9cb78a05f83a2", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", + "node_id": "bot", + "sealed": true, + "span": [ + 245, + 250 + ], + "sentence": "-2.5%", + "note": "该值由系统从分析结论的结果表中取出、按固定规则显示,未经模型转写" + }, + { + "group": "cited", + "report": "write", + "field": "周报", + "segment": "s48", + "unit": "u18", + "kind": "number", + "text": "5.9%", + "state": "deterministic", + "issue": null, + "ref": "v:A1.r1.share", + "alias": "A1", + "evidence_kind": "analysis", + "evidence": "A1.r1.share", + "eid": "ev:cell:379dcf4b1b6947b1", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", + "node_id": "bot", + "sealed": true, + "span": [ + 253, + 257 + ], + "sentence": "5.9%", + "note": "该值由系统从分析结论的结果表中取出、按固定规则显示,未经模型转写" } ] }, @@ -3249,19 +11628,19 @@ } ], "counts": { - "cited": 3, + "cited": 14, "none": 5, "suspicious": 0, "candidate": 0 }, - "total": 8 + "total": 19 }, "analyses": { "A1": { - "run_id": "ed3de345aac143089fb3d0777d9056ec", + "run_id": "6d4d8c841a7d4900a3495f24bc932afa", "report": { "node_id": "write", - "doc_artifact": "d115c361e8ae4f6d06bd4f839c6f6f6c62c0721575b048da7350834f8ce41389" + "doc_artifact": "32cc0cc3a309ef588a619cbf69d277710b6c0505b9c36ca880b50feaebca63dc" }, "alias": "A1", "rendered": "销售额下降 340(-12.6%),主要来自华东(-300,占 88.2%)", @@ -3276,8 +11655,8 @@ "call_id": "call_3", "node_id": "bot", "label": "问数据", - "artifact": "6d06b2913312497d982d4e36e0c94a57c377b990110bac960d72d64979d7c12d", - "eid": "ev:analysis:10fb652eb3e403a8", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", + "eid": "ev:analysis:a7edbc13c92c31a0", "eid_ok": true, "cited": { "what": "phrase" @@ -3395,7 +11774,7 @@ { "key": "pct_total", "raw": "-0.125925925926", - "rendered": "-0.1259259259" + "rendered": "-12.6%" }, { "key": "segments", @@ -3415,7 +11794,7 @@ { "key": "top_k_share", "raw": "0.882352941176", - "rendered": "0.8823529412" + "rendered": "88.2%" }, { "key": "top_key", @@ -3425,7 +11804,7 @@ { "key": "top_share", "raw": "0.882352941176", - "rendered": "0.8823529412" + "rendered": "88.2%" } ], "formulas": [ @@ -3471,39 +11850,39 @@ "rows": [ [ "华东", - "1000", + "1,000", "700", "-300", - "-0.3", - "0.882352941176", - null + "-30.0%", + "88.2%", + "—" ], [ "华南", "800", "780", "-20", - "-0.025", - "0.0588235294118", - null + "-2.5%", + "5.9%", + "—" ], [ "华北", "600", "590", "-10", - "-0.0166666666667", - "0.0294117647059", - null + "-1.7%", + "2.9%", + "—" ], [ "西南", "300", "290", "-10", - "-0.0333333333333", - "0.0294117647059", - null + "-3.3%", + "2.9%", + "—" ] ], "masked": [], @@ -3518,7 +11897,7 @@ "ref": "Q1.r0.gmv", "role": "headline_base", "role_label": "基期总数", - "artifact": "8fa60a625e4a072804462dd66dde6b1634f9fbd8244183e626a6fdcd8acb87fc", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", "row": 0, "column": "gmv", "value": "2700", @@ -3540,7 +11919,7 @@ "ref": "Q1.r1.gmv", "role": "headline_target", "role_label": "本期总数", - "artifact": "8fa60a625e4a072804462dd66dde6b1634f9fbd8244183e626a6fdcd8acb87fc", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", "row": 1, "column": "gmv", "value": "2360", @@ -3562,7 +11941,7 @@ "ref": "Q2", "role": "data", "role_label": "数据", - "artifact": "94f47ca377dfd4fddc3e4bdba0466cbefdd6c4b66beaf4468332a9dd51be7901", + "artifact": "8322aa7cc7c2ad7d63887acb8d88d34ef6b1a9ed948afdb3acc9f7bd5328f460", "columns": [ "region", "week", @@ -3576,7 +11955,7 @@ { "step": "query", "alias": "Q1", - "artifact": "8fa60a625e4a072804462dd66dde6b1634f9fbd8244183e626a6fdcd8acb87fc", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", "node_id": "bot", "tool": "db_query__shop", "source": "shop", @@ -3628,7 +12007,7 @@ "gmv": "number", "week": "text" }, - "schema_artifact": "4c3229daead9cdde26fab4b3156cfc17eba8cec291a35b54e2af392a8a694aec", + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", "catalog": [ { "table": "orders", @@ -3640,7 +12019,7 @@ { "step": "query", "alias": "Q2", - "artifact": "94f47ca377dfd4fddc3e4bdba0466cbefdd6c4b66beaf4468332a9dd51be7901", + "artifact": "8322aa7cc7c2ad7d63887acb8d88d34ef6b1a9ed948afdb3acc9f7bd5328f460", "node_id": "bot", "tool": "db_query__shop", "source": "shop", @@ -3828,7 +12207,7 @@ "region": "text", "week": "text" }, - "schema_artifact": "4c3229daead9cdde26fab4b3156cfc17eba8cec291a35b54e2af392a8a694aec", + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", "catalog": [ { "table": "orders", @@ -3848,7 +12227,7 @@ "step": "analysis_seal", "alias": "A1", "node_id": "bot", - "artifact": "6d06b2913312497d982d4e36e0c94a57c377b990110bac960d72d64979d7c12d", + "artifact": "f5d1fc01d62f6e37c62984318f0cb354f47ecb7ab30e7565222afaff49ee4f91", "ledger": true, "hash_ok": true, "eid_ok": true, @@ -3865,10 +12244,10 @@ } }, "A2": { - "run_id": "ed3de345aac143089fb3d0777d9056ec", + "run_id": "6d4d8c841a7d4900a3495f24bc932afa", "report": { "node_id": "write", - "doc_artifact": "d115c361e8ae4f6d06bd4f839c6f6f6c62c0721575b048da7350834f8ce41389" + "doc_artifact": "32cc0cc3a309ef588a619cbf69d277710b6c0505b9c36ca880b50feaebca63dc" }, "alias": "A2", "rendered": "波动基线没有做成:只有 0 期历史,至少要 8 期", @@ -3883,8 +12262,8 @@ "call_id": "call_4", "node_id": "bot", "label": "问数据", - "artifact": "2e4139852d4ca46f8ee328ce44cb2ddde14f79e54c1371b3a77e15bf232b0122", - "eid": "ev:analysis:436f6b967aa1414c", + "artifact": "edaa673d3f04f17f8968ef35209c2ad6b281a9d54de71e383bed7df318ec5d99", + "eid": "ev:analysis:d89ecaae59a168f0", "eid_ok": true, "cited": { "what": "phrase" @@ -3955,7 +12334,7 @@ "ref": "Q1", "role": "data", "role_label": "数据", - "artifact": "8fa60a625e4a072804462dd66dde6b1634f9fbd8244183e626a6fdcd8acb87fc", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", "columns": [ "week", "gmv" @@ -3968,7 +12347,7 @@ { "step": "query", "alias": "Q1", - "artifact": "8fa60a625e4a072804462dd66dde6b1634f9fbd8244183e626a6fdcd8acb87fc", + "artifact": "4660b212dfdeb2fc6ce8ffe74562f14ebe48bbdbe4152e987e43482a343a47f3", "node_id": "bot", "tool": "db_query__shop", "source": "shop", @@ -4029,7 +12408,7 @@ "gmv": "number", "week": "text" }, - "schema_artifact": "4c3229daead9cdde26fab4b3156cfc17eba8cec291a35b54e2af392a8a694aec", + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", "catalog": [ { "table": "orders", @@ -4049,7 +12428,7 @@ "step": "analysis_seal", "alias": "A2", "node_id": "bot", - "artifact": "2e4139852d4ca46f8ee328ce44cb2ddde14f79e54c1371b3a77e15bf232b0122", + "artifact": "edaa673d3f04f17f8968ef35209c2ad6b281a9d54de71e383bed7df318ec5d99", "ledger": true, "hash_ok": true, "eid_ok": true, @@ -4066,10 +12445,10 @@ } }, "A3": { - "run_id": "ed3de345aac143089fb3d0777d9056ec", + "run_id": "6d4d8c841a7d4900a3495f24bc932afa", "report": { "node_id": "write", - "doc_artifact": "d115c361e8ae4f6d06bd4f839c6f6f6c62c0721575b048da7350834f8ce41389" + "doc_artifact": "32cc0cc3a309ef588a619cbf69d277710b6c0505b9c36ca880b50feaebca63dc" }, "alias": "A3", "rendered": "两期可比,窗口长度、整期、星期构成核对不了", @@ -4084,8 +12463,8 @@ "call_id": "call_5", "node_id": "bot", "label": "问数据", - "artifact": "afa2ea2ba75e5eb20e7f3372e3a9dea164eddb0338fa51c6b2fd9a808c09072a", - "eid": "ev:analysis:bb168f2c30497439", + "artifact": "df87e1917658e653f79ccac7e43e2cf70210b04dc2194bb849eb099303b66f23", + "eid": "ev:analysis:066e85d56f331b63", "eid_ok": true, "cited": { "what": "phrase" @@ -4188,37 +12567,37 @@ [ "同口径", "通过", - null, - null, - null + "—", + "—", + "—" ], [ "窗口长度", "核对不了", - null, - null, - null + "—", + "—", + "—" ], [ "整期", "核对不了", - null, - null, - null + "—", + "—", + "—" ], [ "星期构成", "核对不了", - null, - null, - null + "—", + "—", + "—" ], [ "数据问题", "通过", - null, - null, - null + "—", + "—", + "—" ] ], "masked": [], @@ -4233,7 +12612,7 @@ "ref": "Q2", "role": "data", "role_label": "数据", - "artifact": "94f47ca377dfd4fddc3e4bdba0466cbefdd6c4b66beaf4468332a9dd51be7901", + "artifact": "8322aa7cc7c2ad7d63887acb8d88d34ef6b1a9ed948afdb3acc9f7bd5328f460", "columns": [ "week", "gmv" @@ -4246,7 +12625,7 @@ { "step": "query", "alias": "Q2", - "artifact": "94f47ca377dfd4fddc3e4bdba0466cbefdd6c4b66beaf4468332a9dd51be7901", + "artifact": "8322aa7cc7c2ad7d63887acb8d88d34ef6b1a9ed948afdb3acc9f7bd5328f460", "node_id": "bot", "tool": "db_query__shop", "source": "shop", @@ -4401,7 +12780,7 @@ "region": "text", "week": "text" }, - "schema_artifact": "4c3229daead9cdde26fab4b3156cfc17eba8cec291a35b54e2af392a8a694aec", + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", "catalog": [ { "table": "orders", @@ -4421,7 +12800,7 @@ "step": "analysis_seal", "alias": "A3", "node_id": "bot", - "artifact": "afa2ea2ba75e5eb20e7f3372e3a9dea164eddb0338fa51c6b2fd9a808c09072a", + "artifact": "df87e1917658e653f79ccac7e43e2cf70210b04dc2194bb849eb099303b66f23", "ledger": true, "hash_ok": true, "eid_ok": true, @@ -4443,7 +12822,7 @@ "tier": "formal", "report": { "node_id": "write", - "doc_artifact": "d115c361e8ae4f6d06bd4f839c6f6f6c62c0721575b048da7350834f8ce41389" + "doc_artifact": "32cc0cc3a309ef588a619cbf69d277710b6c0505b9c36ca880b50feaebca63dc" }, "calibers": [], "metrics_checked": 0, @@ -4451,7 +12830,7 @@ "missing_expected": [], "unmatched_numbers": [], "unresolved": [], - "matched_numbers": 2, + "matched_numbers": 11, "matched": [ { "token": "-300", @@ -4465,7 +12844,7 @@ 57, 61 ], - "eid": "ev:cell:164abd36aeac4c3b" + "eid": "ev:cell:a7deaec3f4ed6ab6" }, { "token": "88.2%", @@ -4479,18 +12858,144 @@ 68, 73 ], - "eid": "ev:analysis:efc6267321553bc3" + "eid": "ev:analysis:5517f6de3df56204" + }, + { + "token": "-30.0%", + "metric": null, + "cell": "A1.r0.pct", + "segment": "s19", + "unit": "u6", + "start": 121, + "end": 127, + "span": [ + 121, + 127 + ], + "eid": "ev:cell:32d18640349e7717" + }, + { + "token": "88.2%", + "metric": null, + "cell": "A1.r0.share", + "segment": "s21", + "unit": "u6", + "start": 131, + "end": 136, + "span": [ + 131, + 136 + ], + "eid": "ev:cell:b36848a6055a5628" + }, + { + "token": "88.2%", + "metric": null, + "analysis": "A1.top_share", + "segment": "s23", + "unit": "u6", + "start": 140, + "end": 145, + "span": [ + 140, + 145 + ], + "eid": "ev:analysis:5517f6de3df56204" + }, + { + "token": "-300", + "metric": null, + "cell": "A1.r0.delta", + "segment": "s36", + "unit": "u12", + "start": 208, + "end": 212, + "span": [ + 208, + 212 + ], + "eid": "ev:cell:a7deaec3f4ed6ab6" + }, + { + "token": "-30.0%", + "metric": null, + "cell": "A1.r0.pct", + "segment": "s38", + "unit": "u13", + "start": 215, + "end": 221, + "span": [ + 215, + 221 + ], + "eid": "ev:cell:32d18640349e7717" + }, + { + "token": "88.2%", + "metric": null, + "cell": "A1.r0.share", + "segment": "s40", + "unit": "u14", + "start": 224, + "end": 229, + "span": [ + 224, + 229 + ], + "eid": "ev:cell:b36848a6055a5628" + }, + { + "token": "-20", + "metric": null, + "cell": "A1.r1.delta", + "segment": "s44", + "unit": "u16", + "start": 239, + "end": 242, + "span": [ + 239, + 242 + ], + "eid": "ev:cell:50fa5438a057327a" + }, + { + "token": "-2.5%", + "metric": null, + "cell": "A1.r1.pct", + "segment": "s46", + "unit": "u17", + "start": 245, + "end": 250, + "span": [ + 245, + 250 + ], + "eid": "ev:cell:1bb9cb78a05f83a2" + }, + { + "token": "5.9%", + "metric": null, + "cell": "A1.r1.share", + "segment": "s48", + "unit": "u18", + "start": 253, + "end": 257, + "span": [ + 253, + 257 + ], + "eid": "ev:cell:379dcf4b1b6947b1" } ], "stats": { - "units": 6, - "segments": 17, - "claims": 5, - "connective": 0, + "units": 19, + "segments": 50, + "claims": 14, + "connective": 4, "headings": 1, - "numbers": 2, - "numbers_cited": 2, - "values": 1, + "numbers": 11, + "numbers_cited": 11, + "values": 3, "entities": 0, "quotes": 0, "uncited_numbers": 0, @@ -4503,7 +13008,7 @@ "analysis_claims": 3 }, "gaps": [], - "declared_at": "2026-10-21T10:36:36.123894+00:00", + "declared_at": "2026-10-21T15:22:24.686033+00:00", "analysis_claims": { "mode": "check", "count": 3, @@ -4563,9 +13068,9 @@ } }, "card": { - "run_id": "ffeb7bfbcde6480fbddb573a6c6558af", + "run_id": "803b3fd6fc66470b8d0c8353cfd87899", "run_class": "exploratory", - "doc_artifact": "047519f5bcdfea3056d2a226585cb7c33969a9f6b908940672b6bfee16a8ec75", + "doc_artifact": "0dfdadc2c8c470f7840b80525ae902ccbe0787e5d362fdd5a3fd2b5e8e79edb9", "doc": { "analysis_claims": { "lexicon": 1, @@ -4660,7 +13165,7 @@ "see": [ { "alias": "A2", - "eid": "ev:analysis:b11cf44f63eaa443", + "eid": "ev:analysis:f872ae8bf6eeaee1", "kind": "analysis", "locator": {}, "ref": "A2", @@ -4682,7 +13187,7 @@ { "cite": { "alias": "A2", - "eid": "ev:analysis:b11cf44f63eaa443", + "eid": "ev:analysis:f872ae8bf6eeaee1", "kind": "analysis", "locator": {}, "ref": "A2", @@ -4743,7 +13248,7 @@ { "cite": { "alias": "A1", - "eid": "ev:analysis:88367707fd963815", + "eid": "ev:analysis:faa7de010775194d", "kind": "analysis", "locator": {}, "ref": "A1", @@ -4804,7 +13309,7 @@ { "cite": { "alias": "A2", - "eid": "ev:cell:8f04cbf82264a3bb", + "eid": "ev:cell:289f04710d52804d", "kind": "cell", "locator": { "column": "delta", @@ -4981,7 +13486,7 @@ { "cite": { "alias": "A2", - "eid": "ev:cell:8f04cbf82264a3bb", + "eid": "ev:cell:289f04710d52804d", "kind": "cell", "locator": { "column": "delta", @@ -5025,11 +13530,11 @@ "catalog": { "A1": { "alias": "A1", - "artifact": "c3ab06e1330c51f0567f410f6275a2726a38cad2bd092e145dc6c70260545e9b", - "eid": "ev:analysis:88367707fd963815", + "artifact": "a234a885f55bde88562ab83886da7a3f2c60f9cc352ce05ca6481d32166886f0", + "eid": "ev:analysis:faa7de010775194d", "exec": 1, "inputs": [ - "ec8a1a81d76fc960f4028b7e93e60e32cc84be7249edf18ef550970a6c59611e" + "d22f4912d7727581f89f306343bbe2fa8392d35f001de792afd9612d0c3a1c76" ], "item": "wow", "kind": "analysis", @@ -5043,12 +13548,12 @@ }, "A2": { "alias": "A2", - "artifact": "fce97813bea8e5e060681d5d44249705e86a6feb1f5912165984aec0c951f7dc", - "eid": "ev:analysis:b11cf44f63eaa443", + "artifact": "6bb7505a929ec15dce8676bcb6765c621a5d15c56ae66fa71b6da52183c343ac", + "eid": "ev:analysis:f872ae8bf6eeaee1", "exec": 1, "inputs": [ - "ec8a1a81d76fc960f4028b7e93e60e32cc84be7249edf18ef550970a6c59611e", - "81b47f64b0d0919842039e3492a594d69dea9a25e7f6b93ff0efc3d5bebbd0a9" + "d22f4912d7727581f89f306343bbe2fa8392d35f001de792afd9612d0c3a1c76", + "36ed6a1a4443227c0d747c5621516f59ce7a5cc345dec576c97e7f4c6ab6ebce" ], "item": "where", "kind": "analysis", @@ -5072,12 +13577,12 @@ }, "Q1": { "alias": "Q1", - "artifact": "ec8a1a81d76fc960f4028b7e93e60e32cc84be7249edf18ef550970a6c59611e", + "artifact": "d22f4912d7727581f89f306343bbe2fa8392d35f001de792afd9612d0c3a1c76", "columns": [ "week", "gmv" ], - "eid": "ev:query:30fcabb3fa33690b", + "eid": "ev:query:1697ecefc4f957ae", "exec": 1, "kind": "query", "label": "db_query__shop · 2 行", @@ -5087,17 +13592,17 @@ "source": "shop", "tool": "db_query__shop", "truncated": false, - "via": "b1dacecebc489f096e7582673486790ee51a258afc93144289992bfa7f9eb59d" + "via": "8c92a414da25b414b17fdadd1b9e2e2f767d20f0e9e788561d509af73046cc05" }, "Q2": { "alias": "Q2", - "artifact": "81b47f64b0d0919842039e3492a594d69dea9a25e7f6b93ff0efc3d5bebbd0a9", + "artifact": "36ed6a1a4443227c0d747c5621516f59ce7a5cc345dec576c97e7f4c6ab6ebce", "columns": [ "region", "week", "gmv" ], - "eid": "ev:query:d3b62a2e9c2b52a7", + "eid": "ev:query:9edc88bec38d5ca5", "exec": 1, "kind": "query", "label": "db_query__shop · 8 行", @@ -5107,14 +13612,14 @@ "source": "shop", "tool": "db_query__shop", "truncated": false, - "via": "452f5b41122353bb5a478d4ba092e8321eb371edced6dbc6ccd0c920291eff54" + "via": "e376922d642ba221ce1dd5d6a4e3f14735e0bdeab37e051924446564f1e7fa26" } }, "entity_syntax": 2, "markdown": "## 本周销售\n\n销售额下降 340(-12.6%),主要来自华东(-300,占 88.2%)。\n\n波动基线没有做成:只有 0 期历史,至少要 8 期\n\n华东的变化为 -300。\n\n| 地区 | 变化 |\n|---|---|\n| 华东 | -300 |", "node_id": "write", "provenance": 1, - "run_id": "ffeb7bfbcde6480fbddb573a6c6558af", + "run_id": "803b3fd6fc66470b8d0c8353cfd87899", "schema": "agentlab.report/1", "source": "## 本周销售\n\n[[a:A2]]。[[see:A2]]\n\n[[a:A1]]\n\n华东的变化为 [[v:A2.r0.delta]]。\n\n| 地区 | 变化 |\n|---|---|\n| 华东 | [[v:A2.r0.delta]] |", "stats": { @@ -5143,7 +13648,7 @@ "s3": { "report": { "node_id": "write", - "doc_artifact": "047519f5bcdfea3056d2a226585cb7c33969a9f6b908940672b6bfee16a8ec75" + "doc_artifact": "0dfdadc2c8c470f7840b80525ae902ccbe0787e5d362fdd5a3fd2b5e8e79edb9" }, "segment": { "id": "s3", @@ -5158,7 +13663,7 @@ "ref": "a:A2", "cite": { "alias": "A2", - "eid": "ev:analysis:b11cf44f63eaa443", + "eid": "ev:analysis:f872ae8bf6eeaee1", "kind": "analysis", "locator": {}, "ref": "A2", @@ -5199,8 +13704,8 @@ "item": "where", "node_id": "card", "label": "异动分析", - "artifact": "fce97813bea8e5e060681d5d44249705e86a6feb1f5912165984aec0c951f7dc", - "eid": "ev:analysis:b11cf44f63eaa443", + "artifact": "6bb7505a929ec15dce8676bcb6765c621a5d15c56ae66fa71b6da52183c343ac", + "eid": "ev:analysis:f872ae8bf6eeaee1", "eid_ok": true, "cited": { "what": "phrase" @@ -5318,7 +13823,7 @@ { "key": "pct_total", "raw": "-0.125925925926", - "rendered": "-0.1259259259" + "rendered": "-12.6%" }, { "key": "segments", @@ -5338,7 +13843,7 @@ { "key": "top_k_share", "raw": "0.882352941176", - "rendered": "0.8823529412" + "rendered": "88.2%" }, { "key": "top_key", @@ -5348,7 +13853,7 @@ { "key": "top_share", "raw": "0.882352941176", - "rendered": "0.8823529412" + "rendered": "88.2%" } ], "formulas": [ @@ -5394,39 +13899,39 @@ "rows": [ [ "华东", - "1000", + "1,000", "700", "-300", - "-0.3", - "0.882352941176", - null + "-30.0%", + "88.2%", + "—" ], [ "华南", "800", "780", "-20", - "-0.025", - "0.0588235294118", - null + "-2.5%", + "5.9%", + "—" ], [ "华北", "600", "590", "-10", - "-0.0166666666667", - "0.0294117647059", - null + "-1.7%", + "2.9%", + "—" ], [ "西南", "300", "290", "-10", - "-0.0333333333333", - "0.0294117647059", - null + "-3.3%", + "2.9%", + "—" ] ], "masked": [], @@ -5441,7 +13946,7 @@ "ref": "weekly.r0.gmv", "role": "headline_base", "role_label": "基期总数", - "artifact": "ec8a1a81d76fc960f4028b7e93e60e32cc84be7249edf18ef550970a6c59611e", + "artifact": "d22f4912d7727581f89f306343bbe2fa8392d35f001de792afd9612d0c3a1c76", "row": 0, "column": "gmv", "value": "2700", @@ -5463,7 +13968,7 @@ "ref": "weekly.r1.gmv", "role": "headline_target", "role_label": "本期总数", - "artifact": "ec8a1a81d76fc960f4028b7e93e60e32cc84be7249edf18ef550970a6c59611e", + "artifact": "d22f4912d7727581f89f306343bbe2fa8392d35f001de792afd9612d0c3a1c76", "row": 1, "column": "gmv", "value": "2360", @@ -5485,7 +13990,7 @@ "ref": "by_region", "role": "data", "role_label": "数据", - "artifact": "81b47f64b0d0919842039e3492a594d69dea9a25e7f6b93ff0efc3d5bebbd0a9", + "artifact": "36ed6a1a4443227c0d747c5621516f59ce7a5cc345dec576c97e7f4c6ab6ebce", "columns": [ "region", "week", @@ -5499,7 +14004,7 @@ { "step": "query", "alias": "Q1", - "artifact": "ec8a1a81d76fc960f4028b7e93e60e32cc84be7249edf18ef550970a6c59611e", + "artifact": "d22f4912d7727581f89f306343bbe2fa8392d35f001de792afd9612d0c3a1c76", "node_id": "weekly", "tool": "db_query__shop", "source": "shop", @@ -5551,7 +14056,7 @@ "gmv": "number", "week": "text" }, - "schema_artifact": "4c3229daead9cdde26fab4b3156cfc17eba8cec291a35b54e2af392a8a694aec", + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", "catalog": [ { "table": "orders", @@ -5563,7 +14068,7 @@ { "step": "query", "alias": "Q2", - "artifact": "81b47f64b0d0919842039e3492a594d69dea9a25e7f6b93ff0efc3d5bebbd0a9", + "artifact": "36ed6a1a4443227c0d747c5621516f59ce7a5cc345dec576c97e7f4c6ab6ebce", "node_id": "by_region", "tool": "db_query__shop", "source": "shop", @@ -5751,7 +14256,7 @@ "region": "text", "week": "text" }, - "schema_artifact": "4c3229daead9cdde26fab4b3156cfc17eba8cec291a35b54e2af392a8a694aec", + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", "catalog": [ { "table": "orders", @@ -5771,7 +14276,7 @@ "step": "analysis_seal", "alias": "A2", "node_id": "card", - "artifact": "fce97813bea8e5e060681d5d44249705e86a6feb1f5912165984aec0c951f7dc", + "artifact": "6bb7505a929ec15dce8676bcb6765c621a5d15c56ae66fa71b6da52183c343ac", "ledger": true, "hash_ok": true, "eid_ok": true, @@ -5792,7 +14297,7 @@ "s6": { "report": { "node_id": "write", - "doc_artifact": "047519f5bcdfea3056d2a226585cb7c33969a9f6b908940672b6bfee16a8ec75" + "doc_artifact": "0dfdadc2c8c470f7840b80525ae902ccbe0787e5d362fdd5a3fd2b5e8e79edb9" }, "segment": { "id": "s6", @@ -5807,7 +14312,7 @@ "ref": "a:A1", "cite": { "alias": "A1", - "eid": "ev:analysis:88367707fd963815", + "eid": "ev:analysis:faa7de010775194d", "kind": "analysis", "locator": {}, "ref": "A1", @@ -5848,8 +14353,8 @@ "item": "wow", "node_id": "card", "label": "异动分析", - "artifact": "c3ab06e1330c51f0567f410f6275a2726a38cad2bd092e145dc6c70260545e9b", - "eid": "ev:analysis:88367707fd963815", + "artifact": "a234a885f55bde88562ab83886da7a3f2c60f9cc352ce05ca6481d32166886f0", + "eid": "ev:analysis:faa7de010775194d", "eid_ok": true, "cited": { "what": "phrase" @@ -5917,7 +14422,7 @@ "ref": "weekly", "role": "data", "role_label": "数据", - "artifact": "ec8a1a81d76fc960f4028b7e93e60e32cc84be7249edf18ef550970a6c59611e", + "artifact": "d22f4912d7727581f89f306343bbe2fa8392d35f001de792afd9612d0c3a1c76", "columns": [ "week", "gmv" @@ -5930,7 +14435,7 @@ { "step": "query", "alias": "Q1", - "artifact": "ec8a1a81d76fc960f4028b7e93e60e32cc84be7249edf18ef550970a6c59611e", + "artifact": "d22f4912d7727581f89f306343bbe2fa8392d35f001de792afd9612d0c3a1c76", "node_id": "weekly", "tool": "db_query__shop", "source": "shop", @@ -5991,7 +14496,7 @@ "gmv": "number", "week": "text" }, - "schema_artifact": "4c3229daead9cdde26fab4b3156cfc17eba8cec291a35b54e2af392a8a694aec", + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", "catalog": [ { "table": "orders", @@ -6011,7 +14516,7 @@ "step": "analysis_seal", "alias": "A1", "node_id": "card", - "artifact": "c3ab06e1330c51f0567f410f6275a2726a38cad2bd092e145dc6c70260545e9b", + "artifact": "a234a885f55bde88562ab83886da7a3f2c60f9cc352ce05ca6481d32166886f0", "ledger": true, "hash_ok": true, "eid_ok": true, @@ -6032,7 +14537,7 @@ "s9": { "report": { "node_id": "write", - "doc_artifact": "047519f5bcdfea3056d2a226585cb7c33969a9f6b908940672b6bfee16a8ec75" + "doc_artifact": "0dfdadc2c8c470f7840b80525ae902ccbe0787e5d362fdd5a3fd2b5e8e79edb9" }, "segment": { "id": "s9", @@ -6047,7 +14552,7 @@ "ref": "v:A2.r0.delta", "cite": { "alias": "A2", - "eid": "ev:cell:8f04cbf82264a3bb", + "eid": "ev:cell:289f04710d52804d", "kind": "cell", "locator": { "column": "delta", @@ -6092,8 +14597,8 @@ "item": "where", "node_id": "card", "label": "异动分析", - "artifact": "fce97813bea8e5e060681d5d44249705e86a6feb1f5912165984aec0c951f7dc", - "eid": "ev:analysis:b11cf44f63eaa443", + "artifact": "6bb7505a929ec15dce8676bcb6765c621a5d15c56ae66fa71b6da52183c343ac", + "eid": "ev:analysis:f872ae8bf6eeaee1", "eid_ok": true, "cited": { "what": "cell", @@ -6215,7 +14720,7 @@ { "key": "pct_total", "raw": "-0.125925925926", - "rendered": "-0.1259259259" + "rendered": "-12.6%" }, { "key": "segments", @@ -6235,7 +14740,7 @@ { "key": "top_k_share", "raw": "0.882352941176", - "rendered": "0.8823529412" + "rendered": "88.2%" }, { "key": "top_key", @@ -6245,7 +14750,7 @@ { "key": "top_share", "raw": "0.882352941176", - "rendered": "0.8823529412" + "rendered": "88.2%" } ], "formulas": [ @@ -6291,39 +14796,39 @@ "rows": [ [ "华东", - "1000", + "1,000", "700", "-300", - "-0.3", - "0.882352941176", - null + "-30.0%", + "88.2%", + "—" ], [ "华南", "800", "780", "-20", - "-0.025", - "0.0588235294118", - null + "-2.5%", + "5.9%", + "—" ], [ "华北", "600", "590", "-10", - "-0.0166666666667", - "0.0294117647059", - null + "-1.7%", + "2.9%", + "—" ], [ "西南", "300", "290", "-10", - "-0.0333333333333", - "0.0294117647059", - null + "-3.3%", + "2.9%", + "—" ] ], "masked": [], @@ -6343,7 +14848,7 @@ "ref": "weekly.r0.gmv", "role": "headline_base", "role_label": "基期总数", - "artifact": "ec8a1a81d76fc960f4028b7e93e60e32cc84be7249edf18ef550970a6c59611e", + "artifact": "d22f4912d7727581f89f306343bbe2fa8392d35f001de792afd9612d0c3a1c76", "row": 0, "column": "gmv", "value": "2700", @@ -6365,7 +14870,7 @@ "ref": "weekly.r1.gmv", "role": "headline_target", "role_label": "本期总数", - "artifact": "ec8a1a81d76fc960f4028b7e93e60e32cc84be7249edf18ef550970a6c59611e", + "artifact": "d22f4912d7727581f89f306343bbe2fa8392d35f001de792afd9612d0c3a1c76", "row": 1, "column": "gmv", "value": "2360", @@ -6387,7 +14892,7 @@ "ref": "by_region", "role": "data", "role_label": "数据", - "artifact": "81b47f64b0d0919842039e3492a594d69dea9a25e7f6b93ff0efc3d5bebbd0a9", + "artifact": "36ed6a1a4443227c0d747c5621516f59ce7a5cc345dec576c97e7f4c6ab6ebce", "columns": [ "region", "week", @@ -6401,7 +14906,7 @@ { "step": "query", "alias": "Q1", - "artifact": "ec8a1a81d76fc960f4028b7e93e60e32cc84be7249edf18ef550970a6c59611e", + "artifact": "d22f4912d7727581f89f306343bbe2fa8392d35f001de792afd9612d0c3a1c76", "node_id": "weekly", "tool": "db_query__shop", "source": "shop", @@ -6453,7 +14958,7 @@ "gmv": "number", "week": "text" }, - "schema_artifact": "4c3229daead9cdde26fab4b3156cfc17eba8cec291a35b54e2af392a8a694aec", + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", "catalog": [ { "table": "orders", @@ -6465,7 +14970,7 @@ { "step": "query", "alias": "Q2", - "artifact": "81b47f64b0d0919842039e3492a594d69dea9a25e7f6b93ff0efc3d5bebbd0a9", + "artifact": "36ed6a1a4443227c0d747c5621516f59ce7a5cc345dec576c97e7f4c6ab6ebce", "node_id": "by_region", "tool": "db_query__shop", "source": "shop", @@ -6653,7 +15158,7 @@ "region": "text", "week": "text" }, - "schema_artifact": "4c3229daead9cdde26fab4b3156cfc17eba8cec291a35b54e2af392a8a694aec", + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", "catalog": [ { "table": "orders", @@ -6673,7 +15178,7 @@ "step": "analysis_seal", "alias": "A2", "node_id": "card", - "artifact": "fce97813bea8e5e060681d5d44249705e86a6feb1f5912165984aec0c951f7dc", + "artifact": "6bb7505a929ec15dce8676bcb6765c621a5d15c56ae66fa71b6da52183c343ac", "ledger": true, "hash_ok": true, "eid_ok": true, @@ -6694,7 +15199,7 @@ "s18": { "report": { "node_id": "write", - "doc_artifact": "047519f5bcdfea3056d2a226585cb7c33969a9f6b908940672b6bfee16a8ec75" + "doc_artifact": "0dfdadc2c8c470f7840b80525ae902ccbe0787e5d362fdd5a3fd2b5e8e79edb9" }, "segment": { "id": "s18", @@ -6709,7 +15214,7 @@ "ref": "v:A2.r0.delta", "cite": { "alias": "A2", - "eid": "ev:cell:8f04cbf82264a3bb", + "eid": "ev:cell:289f04710d52804d", "kind": "cell", "locator": { "column": "delta", @@ -6754,8 +15259,8 @@ "item": "where", "node_id": "card", "label": "异动分析", - "artifact": "fce97813bea8e5e060681d5d44249705e86a6feb1f5912165984aec0c951f7dc", - "eid": "ev:analysis:b11cf44f63eaa443", + "artifact": "6bb7505a929ec15dce8676bcb6765c621a5d15c56ae66fa71b6da52183c343ac", + "eid": "ev:analysis:f872ae8bf6eeaee1", "eid_ok": true, "cited": { "what": "cell", @@ -6877,7 +15382,7 @@ { "key": "pct_total", "raw": "-0.125925925926", - "rendered": "-0.1259259259" + "rendered": "-12.6%" }, { "key": "segments", @@ -6897,7 +15402,7 @@ { "key": "top_k_share", "raw": "0.882352941176", - "rendered": "0.8823529412" + "rendered": "88.2%" }, { "key": "top_key", @@ -6907,7 +15412,7 @@ { "key": "top_share", "raw": "0.882352941176", - "rendered": "0.8823529412" + "rendered": "88.2%" } ], "formulas": [ @@ -6953,39 +15458,39 @@ "rows": [ [ "华东", - "1000", + "1,000", "700", "-300", - "-0.3", - "0.882352941176", - null + "-30.0%", + "88.2%", + "—" ], [ "华南", "800", "780", "-20", - "-0.025", - "0.0588235294118", - null + "-2.5%", + "5.9%", + "—" ], [ "华北", "600", "590", "-10", - "-0.0166666666667", - "0.0294117647059", - null + "-1.7%", + "2.9%", + "—" ], [ "西南", "300", "290", "-10", - "-0.0333333333333", - "0.0294117647059", - null + "-3.3%", + "2.9%", + "—" ] ], "masked": [], @@ -7005,7 +15510,7 @@ "ref": "weekly.r0.gmv", "role": "headline_base", "role_label": "基期总数", - "artifact": "ec8a1a81d76fc960f4028b7e93e60e32cc84be7249edf18ef550970a6c59611e", + "artifact": "d22f4912d7727581f89f306343bbe2fa8392d35f001de792afd9612d0c3a1c76", "row": 0, "column": "gmv", "value": "2700", @@ -7027,7 +15532,7 @@ "ref": "weekly.r1.gmv", "role": "headline_target", "role_label": "本期总数", - "artifact": "ec8a1a81d76fc960f4028b7e93e60e32cc84be7249edf18ef550970a6c59611e", + "artifact": "d22f4912d7727581f89f306343bbe2fa8392d35f001de792afd9612d0c3a1c76", "row": 1, "column": "gmv", "value": "2360", @@ -7049,7 +15554,7 @@ "ref": "by_region", "role": "data", "role_label": "数据", - "artifact": "81b47f64b0d0919842039e3492a594d69dea9a25e7f6b93ff0efc3d5bebbd0a9", + "artifact": "36ed6a1a4443227c0d747c5621516f59ce7a5cc345dec576c97e7f4c6ab6ebce", "columns": [ "region", "week", @@ -7063,7 +15568,7 @@ { "step": "query", "alias": "Q1", - "artifact": "ec8a1a81d76fc960f4028b7e93e60e32cc84be7249edf18ef550970a6c59611e", + "artifact": "d22f4912d7727581f89f306343bbe2fa8392d35f001de792afd9612d0c3a1c76", "node_id": "weekly", "tool": "db_query__shop", "source": "shop", @@ -7115,7 +15620,7 @@ "gmv": "number", "week": "text" }, - "schema_artifact": "4c3229daead9cdde26fab4b3156cfc17eba8cec291a35b54e2af392a8a694aec", + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", "catalog": [ { "table": "orders", @@ -7127,7 +15632,7 @@ { "step": "query", "alias": "Q2", - "artifact": "81b47f64b0d0919842039e3492a594d69dea9a25e7f6b93ff0efc3d5bebbd0a9", + "artifact": "36ed6a1a4443227c0d747c5621516f59ce7a5cc345dec576c97e7f4c6ab6ebce", "node_id": "by_region", "tool": "db_query__shop", "source": "shop", @@ -7315,7 +15820,7 @@ "region": "text", "week": "text" }, - "schema_artifact": "4c3229daead9cdde26fab4b3156cfc17eba8cec291a35b54e2af392a8a694aec", + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", "catalog": [ { "table": "orders", @@ -7335,7 +15840,7 @@ "step": "analysis_seal", "alias": "A2", "node_id": "card", - "artifact": "fce97813bea8e5e060681d5d44249705e86a6feb1f5912165984aec0c951f7dc", + "artifact": "6bb7505a929ec15dce8676bcb6765c621a5d15c56ae66fa71b6da52183c343ac", "ledger": true, "hash_ok": true, "eid_ok": true, @@ -7355,7 +15860,7 @@ } }, "graph": { - "run_id": "ffeb7bfbcde6480fbddb573a6c6558af", + "run_id": "803b3fd6fc66470b8d0c8353cfd87899", "schema": "agentlab.evidence/1", "seal": { "sealed": true, @@ -7366,7 +15871,7 @@ "reports": [ { "node_id": "write", - "doc_artifact": "047519f5bcdfea3056d2a226585cb7c33969a9f6b908940672b6bfee16a8ec75", + "doc_artifact": "0dfdadc2c8c470f7840b80525ae902ccbe0787e5d362fdd5a3fd2b5e8e79edb9", "doc_sealed": true, "hash_ok": true, "ok": true, @@ -7403,11 +15908,11 @@ "evidence": [ { "alias": "A1", - "eid": "ev:analysis:88367707fd963815", + "eid": "ev:analysis:faa7de010775194d", "kind": "analysis", "label": "波动基线 · 波动基线没有做成:只有 0 期历史,至少要 8 期", "node_id": "card", - "artifact": "c3ab06e1330c51f0567f410f6275a2726a38cad2bd092e145dc6c70260545e9b", + "artifact": "a234a885f55bde88562ab83886da7a3f2c60f9cc352ce05ca6481d32166886f0", "sealed": true, "cited_by": [ "s6" @@ -7422,11 +15927,11 @@ }, { "alias": "A2", - "eid": "ev:analysis:b11cf44f63eaa443", + "eid": "ev:analysis:f872ae8bf6eeaee1", "kind": "analysis", "label": "变化拆解(可加) · 销售额下降 340(-12.6%),主要来自华东(-300,占 88.2%)", "node_id": "card", - "artifact": "fce97813bea8e5e060681d5d44249705e86a6feb1f5912165984aec0c951f7dc", + "artifact": "6bb7505a929ec15dce8676bcb6765c621a5d15c56ae66fa71b6da52183c343ac", "sealed": true, "cited_by": [ "s3", @@ -7447,11 +15952,11 @@ }, { "alias": "Q1", - "eid": "ev:query:30fcabb3fa33690b", + "eid": "ev:query:1697ecefc4f957ae", "kind": "query", "label": "db_query__shop · 2 行", "node_id": "weekly", - "artifact": "ec8a1a81d76fc960f4028b7e93e60e32cc84be7249edf18ef550970a6c59611e", + "artifact": "d22f4912d7727581f89f306343bbe2fa8392d35f001de792afd9612d0c3a1c76", "sealed": true, "cited_by": [], "units": [], @@ -7467,11 +15972,11 @@ }, { "alias": "Q2", - "eid": "ev:query:d3b62a2e9c2b52a7", + "eid": "ev:query:9edc88bec38d5ca5", "kind": "query", "label": "db_query__shop · 8 行", "node_id": "by_region", - "artifact": "81b47f64b0d0919842039e3492a594d69dea9a25e7f6b93ff0efc3d5bebbd0a9", + "artifact": "36ed6a1a4443227c0d747c5621516f59ce7a5cc345dec576c97e7f4c6ab6ebce", "sealed": true, "cited_by": [], "units": [], @@ -7546,7 +16051,7 @@ "mode": "cited" }, "audit": { - "run_id": "ffeb7bfbcde6480fbddb573a6c6558af", + "run_id": "803b3fd6fc66470b8d0c8353cfd87899", "schema": "agentlab.evidence.audit/1", "mode": "cited", "seal": { @@ -7560,7 +16065,7 @@ "reports": [ { "node_id": "write", - "doc_artifact": "047519f5bcdfea3056d2a226585cb7c33969a9f6b908940672b6bfee16a8ec75", + "doc_artifact": "0dfdadc2c8c470f7840b80525ae902ccbe0787e5d362fdd5a3fd2b5e8e79edb9", "hash_ok": true, "doc_sealed": true, "fields": [ @@ -7612,8 +16117,8 @@ "alias": "A2", "evidence_kind": "analysis", "evidence": "变化拆解(可加) · 销售额下降 340(-12.6%),主要来自华东(-300,占 88.2%)", - "eid": "ev:analysis:b11cf44f63eaa443", - "artifact": "fce97813bea8e5e060681d5d44249705e86a6feb1f5912165984aec0c951f7dc", + "eid": "ev:analysis:f872ae8bf6eeaee1", + "artifact": "6bb7505a929ec15dce8676bcb6765c621a5d15c56ae66fa71b6da52183c343ac", "node_id": "card", "sealed": true, "span": [ @@ -7637,8 +16142,8 @@ "alias": "A1", "evidence_kind": "analysis", "evidence": "波动基线 · 波动基线没有做成:只有 0 期历史,至少要 8 期", - "eid": "ev:analysis:88367707fd963815", - "artifact": "c3ab06e1330c51f0567f410f6275a2726a38cad2bd092e145dc6c70260545e9b", + "eid": "ev:analysis:faa7de010775194d", + "artifact": "a234a885f55bde88562ab83886da7a3f2c60f9cc352ce05ca6481d32166886f0", "node_id": "card", "sealed": true, "span": [ @@ -7662,8 +16167,8 @@ "alias": "A2", "evidence_kind": "analysis", "evidence": "A2.r0.delta", - "eid": "ev:cell:8f04cbf82264a3bb", - "artifact": "fce97813bea8e5e060681d5d44249705e86a6feb1f5912165984aec0c951f7dc", + "eid": "ev:cell:289f04710d52804d", + "artifact": "6bb7505a929ec15dce8676bcb6765c621a5d15c56ae66fa71b6da52183c343ac", "node_id": "card", "sealed": true, "span": [ @@ -7687,8 +16192,8 @@ "alias": "A2", "evidence_kind": "analysis", "evidence": "A2.r0.delta", - "eid": "ev:cell:8f04cbf82264a3bb", - "artifact": "fce97813bea8e5e060681d5d44249705e86a6feb1f5912165984aec0c951f7dc", + "eid": "ev:cell:289f04710d52804d", + "artifact": "6bb7505a929ec15dce8676bcb6765c621a5d15c56ae66fa71b6da52183c343ac", "node_id": "card", "sealed": true, "span": [ @@ -7729,10 +16234,10 @@ }, "analyses": { "A1": { - "run_id": "ffeb7bfbcde6480fbddb573a6c6558af", + "run_id": "803b3fd6fc66470b8d0c8353cfd87899", "report": { "node_id": "write", - "doc_artifact": "047519f5bcdfea3056d2a226585cb7c33969a9f6b908940672b6bfee16a8ec75" + "doc_artifact": "0dfdadc2c8c470f7840b80525ae902ccbe0787e5d362fdd5a3fd2b5e8e79edb9" }, "alias": "A1", "rendered": "波动基线没有做成:只有 0 期历史,至少要 8 期", @@ -7747,8 +16252,8 @@ "item": "wow", "node_id": "card", "label": "异动分析", - "artifact": "c3ab06e1330c51f0567f410f6275a2726a38cad2bd092e145dc6c70260545e9b", - "eid": "ev:analysis:88367707fd963815", + "artifact": "a234a885f55bde88562ab83886da7a3f2c60f9cc352ce05ca6481d32166886f0", + "eid": "ev:analysis:faa7de010775194d", "eid_ok": true, "cited": { "what": "phrase" @@ -7816,7 +16321,7 @@ "ref": "weekly", "role": "data", "role_label": "数据", - "artifact": "ec8a1a81d76fc960f4028b7e93e60e32cc84be7249edf18ef550970a6c59611e", + "artifact": "d22f4912d7727581f89f306343bbe2fa8392d35f001de792afd9612d0c3a1c76", "columns": [ "week", "gmv" @@ -7829,7 +16334,7 @@ { "step": "query", "alias": "Q1", - "artifact": "ec8a1a81d76fc960f4028b7e93e60e32cc84be7249edf18ef550970a6c59611e", + "artifact": "d22f4912d7727581f89f306343bbe2fa8392d35f001de792afd9612d0c3a1c76", "node_id": "weekly", "tool": "db_query__shop", "source": "shop", @@ -7890,7 +16395,7 @@ "gmv": "number", "week": "text" }, - "schema_artifact": "4c3229daead9cdde26fab4b3156cfc17eba8cec291a35b54e2af392a8a694aec", + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", "catalog": [ { "table": "orders", @@ -7910,7 +16415,7 @@ "step": "analysis_seal", "alias": "A1", "node_id": "card", - "artifact": "c3ab06e1330c51f0567f410f6275a2726a38cad2bd092e145dc6c70260545e9b", + "artifact": "a234a885f55bde88562ab83886da7a3f2c60f9cc352ce05ca6481d32166886f0", "ledger": true, "hash_ok": true, "eid_ok": true, @@ -7927,10 +16432,10 @@ } }, "A2": { - "run_id": "ffeb7bfbcde6480fbddb573a6c6558af", + "run_id": "803b3fd6fc66470b8d0c8353cfd87899", "report": { "node_id": "write", - "doc_artifact": "047519f5bcdfea3056d2a226585cb7c33969a9f6b908940672b6bfee16a8ec75" + "doc_artifact": "0dfdadc2c8c470f7840b80525ae902ccbe0787e5d362fdd5a3fd2b5e8e79edb9" }, "alias": "A2", "rendered": "销售额下降 340(-12.6%),主要来自华东(-300,占 88.2%)", @@ -7945,8 +16450,8 @@ "item": "where", "node_id": "card", "label": "异动分析", - "artifact": "fce97813bea8e5e060681d5d44249705e86a6feb1f5912165984aec0c951f7dc", - "eid": "ev:analysis:b11cf44f63eaa443", + "artifact": "6bb7505a929ec15dce8676bcb6765c621a5d15c56ae66fa71b6da52183c343ac", + "eid": "ev:analysis:f872ae8bf6eeaee1", "eid_ok": true, "cited": { "what": "phrase" @@ -8064,7 +16569,7 @@ { "key": "pct_total", "raw": "-0.125925925926", - "rendered": "-0.1259259259" + "rendered": "-12.6%" }, { "key": "segments", @@ -8084,7 +16589,7 @@ { "key": "top_k_share", "raw": "0.882352941176", - "rendered": "0.8823529412" + "rendered": "88.2%" }, { "key": "top_key", @@ -8094,7 +16599,7 @@ { "key": "top_share", "raw": "0.882352941176", - "rendered": "0.8823529412" + "rendered": "88.2%" } ], "formulas": [ @@ -8140,39 +16645,39 @@ "rows": [ [ "华东", - "1000", + "1,000", "700", "-300", - "-0.3", - "0.882352941176", - null + "-30.0%", + "88.2%", + "—" ], [ "华南", "800", "780", "-20", - "-0.025", - "0.0588235294118", - null + "-2.5%", + "5.9%", + "—" ], [ "华北", "600", "590", "-10", - "-0.0166666666667", - "0.0294117647059", - null + "-1.7%", + "2.9%", + "—" ], [ "西南", "300", "290", "-10", - "-0.0333333333333", - "0.0294117647059", - null + "-3.3%", + "2.9%", + "—" ] ], "masked": [], @@ -8187,7 +16692,7 @@ "ref": "weekly.r0.gmv", "role": "headline_base", "role_label": "基期总数", - "artifact": "ec8a1a81d76fc960f4028b7e93e60e32cc84be7249edf18ef550970a6c59611e", + "artifact": "d22f4912d7727581f89f306343bbe2fa8392d35f001de792afd9612d0c3a1c76", "row": 0, "column": "gmv", "value": "2700", @@ -8209,7 +16714,7 @@ "ref": "weekly.r1.gmv", "role": "headline_target", "role_label": "本期总数", - "artifact": "ec8a1a81d76fc960f4028b7e93e60e32cc84be7249edf18ef550970a6c59611e", + "artifact": "d22f4912d7727581f89f306343bbe2fa8392d35f001de792afd9612d0c3a1c76", "row": 1, "column": "gmv", "value": "2360", @@ -8231,7 +16736,7 @@ "ref": "by_region", "role": "data", "role_label": "数据", - "artifact": "81b47f64b0d0919842039e3492a594d69dea9a25e7f6b93ff0efc3d5bebbd0a9", + "artifact": "36ed6a1a4443227c0d747c5621516f59ce7a5cc345dec576c97e7f4c6ab6ebce", "columns": [ "region", "week", @@ -8245,7 +16750,7 @@ { "step": "query", "alias": "Q1", - "artifact": "ec8a1a81d76fc960f4028b7e93e60e32cc84be7249edf18ef550970a6c59611e", + "artifact": "d22f4912d7727581f89f306343bbe2fa8392d35f001de792afd9612d0c3a1c76", "node_id": "weekly", "tool": "db_query__shop", "source": "shop", @@ -8297,7 +16802,7 @@ "gmv": "number", "week": "text" }, - "schema_artifact": "4c3229daead9cdde26fab4b3156cfc17eba8cec291a35b54e2af392a8a694aec", + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", "catalog": [ { "table": "orders", @@ -8309,7 +16814,7 @@ { "step": "query", "alias": "Q2", - "artifact": "81b47f64b0d0919842039e3492a594d69dea9a25e7f6b93ff0efc3d5bebbd0a9", + "artifact": "36ed6a1a4443227c0d747c5621516f59ce7a5cc345dec576c97e7f4c6ab6ebce", "node_id": "by_region", "tool": "db_query__shop", "source": "shop", @@ -8497,7 +17002,7 @@ "region": "text", "week": "text" }, - "schema_artifact": "4c3229daead9cdde26fab4b3156cfc17eba8cec291a35b54e2af392a8a694aec", + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", "catalog": [ { "table": "orders", @@ -8517,7 +17022,7 @@ "step": "analysis_seal", "alias": "A2", "node_id": "card", - "artifact": "fce97813bea8e5e060681d5d44249705e86a6feb1f5912165984aec0c951f7dc", + "artifact": "6bb7505a929ec15dce8676bcb6765c621a5d15c56ae66fa71b6da52183c343ac", "ledger": true, "hash_ok": true, "eid_ok": true, @@ -8539,7 +17044,7 @@ "tier": "formal", "report": { "node_id": "write", - "doc_artifact": "047519f5bcdfea3056d2a226585cb7c33969a9f6b908940672b6bfee16a8ec75" + "doc_artifact": "0dfdadc2c8c470f7840b80525ae902ccbe0787e5d362fdd5a3fd2b5e8e79edb9" }, "calibers": [], "metrics_checked": 0, @@ -8561,7 +17066,7 @@ 84, 88 ], - "eid": "ev:cell:8f04cbf82264a3bb" + "eid": "ev:cell:289f04710d52804d" }, { "token": "-300", @@ -8575,7 +17080,7 @@ 120, 124 ], - "eid": "ev:cell:8f04cbf82264a3bb" + "eid": "ev:cell:289f04710d52804d" } ], "stats": { @@ -8599,13 +17104,13 @@ "analysis_claims": 0 }, "gaps": [], - "declared_at": "2026-10-21T10:36:36.611189+00:00" + "declared_at": "2026-10-21T15:22:25.297775+00:00" } }, "metric": { - "run_id": "153afe100eb0406e8be4d9dc7adac8d6", + "run_id": "9367b703c01d492891d1ae80113eb973", "run_class": "exploratory", - "doc_artifact": "e8572d3a890d844783f980891af048db3b71d7533b85ce3ca00926acc199fdca", + "doc_artifact": "e75fd02f25fef1593d17c4151f632755cdda3bcbfe7060c43ef4206fbcc218aa", "doc": { "analysis_claims": { "lexicon": 1, @@ -8637,7 +17142,7 @@ { "cite": { "alias": "m:wow", - "eid": "ev:metric:a2ec409041e4deb7", + "eid": "ev:metric:f800d62ed5db82c6", "kind": "metric", "locator": { "metric": "wow" @@ -8680,11 +17185,11 @@ "catalog": { "Q1": { "alias": "Q1", - "artifact": "5659261ab82f038f44106c558cab3c57aed2e86eb9eb0426d34c81cfc5029278", + "artifact": "7f6252ec2ffe6a8818000b03eba0804096439a0ea0f0a90d783d11efc2a97895", "columns": [ "gmv" ], - "eid": "ev:query:60498acf9bf713c7", + "eid": "ev:query:6f585173ecdd78d9", "exec": 1, "kind": "query", "label": "db_query__shop · 1 行", @@ -8694,15 +17199,15 @@ "source": "shop", "tool": "db_query__shop", "truncated": false, - "via": "03718830cc3618e9dd3bc6bb750cc06845e4e2cc35b90499c02826e79f8441c1" + "via": "87eb650424e1cc8ac89d2fbeb4b9125a5c18c9572d80d40ce905975bc8a20a5b" }, "Q2": { "alias": "Q2", - "artifact": "0f9d43f91a5ea754fca6cf494fc69b373fa1fadd85eaccf1dbca2b1d65542e2c", + "artifact": "843e7e96c4a5c036093203b54af6d7f11565aa9bb38db53b2df49c04ac2844ec", "columns": [ "gmv" ], - "eid": "ev:query:62b02f6bb6886f1c", + "eid": "ev:query:25033729f2cf3072", "exec": 1, "kind": "query", "label": "db_query__shop · 1 行", @@ -8712,20 +17217,20 @@ "source": "shop", "tool": "db_query__shop", "truncated": false, - "via": "e42968afbe8ea4ca5b056fb9535eda96efba5113e3feedcff683a8c84f4dbccb" + "via": "0e72565a4da0b50a98b25cb5541aaab205ccd3e079e782598490c2615f4321ee" }, "m:wow": { "alias": "m:wow", - "artifact": "bc5a8e29e70745eed2c7dfabc866532ba1ef1953cbc1cc8d77d9eb02da0cdf84", + "artifact": "ee4f584270883dad6b80a231a42f95212d4d166f5b61f6398973a3a16cbea115", "caliber": "周报口径", "comparability": { - "artifact": "f5d88bbccf1fdaf6ad3724cf6a2f5e0eea5defdd386e8c85cf663bc2ec14fde2", + "artifact": "95fae782d86479a4acd9888355ac5b8a47378a7fe2f49037c7a4416c93f2123c", "phrase": "两期可比,窗口长度、整期、星期构成核对不了", "reasons": [], "verdict": "comparable" }, "decimals": 3, - "eid": "ev:metric:a2ec409041e4deb7", + "eid": "ev:metric:f800d62ed5db82c6", "format": "percent_of_ratio", "kind": "metric", "label": "环比 = -12.6%", @@ -8745,7 +17250,7 @@ "markdown": "环比 -12.6%。", "node_id": "write", "provenance": 1, - "run_id": "153afe100eb0406e8be4d9dc7adac8d6", + "run_id": "9367b703c01d492891d1ae80113eb973", "schema": "agentlab.report/1", "source": "环比 [[m:wow]]。", "stats": { @@ -8774,7 +17279,7 @@ "s1": { "report": { "node_id": "write", - "doc_artifact": "e8572d3a890d844783f980891af048db3b71d7533b85ce3ca00926acc199fdca" + "doc_artifact": "e75fd02f25fef1593d17c4151f632755cdda3bcbfe7060c43ef4206fbcc218aa" }, "segment": { "id": "s1", @@ -8789,7 +17294,7 @@ "ref": "m:wow", "cite": { "alias": "m:wow", - "eid": "ev:metric:a2ec409041e4deb7", + "eid": "ev:metric:f800d62ed5db82c6", "kind": "metric", "locator": { "metric": "wow" @@ -8841,8 +17346,8 @@ "recompute_ok": true, "status": "ok", "node_id": "kpi", - "artifact": "bc5a8e29e70745eed2c7dfabc866532ba1ef1953cbc1cc8d77d9eb02da0cdf84", - "eid": "ev:metric:a2ec409041e4deb7", + "artifact": "ee4f584270883dad6b80a231a42f95212d4d166f5b61f6398973a3a16cbea115", + "eid": "ev:metric:f800d62ed5db82c6", "eid_ok": true, "hash_ok": true, "render_ok": true, @@ -8853,7 +17358,7 @@ "verdict": "comparable", "phrase": "两期可比,窗口长度、整期、星期构成核对不了", "reasons": [], - "artifact": "f5d88bbccf1fdaf6ad3724cf6a2f5e0eea5defdd386e8c85cf663bc2ec14fde2", + "artifact": "95fae782d86479a4acd9888355ac5b8a47378a7fe2f49037c7a4416c93f2123c", "hash_ok": true, "sealed": true, "method": "comparable@1", @@ -8870,8 +17375,8 @@ "origin": "metric", "node_id": "kpi", "label": "周报口径", - "artifact": "f5d88bbccf1fdaf6ad3724cf6a2f5e0eea5defdd386e8c85cf663bc2ec14fde2", - "eid": "ev:analysis:3cfd497192a30e70", + "artifact": "95fae782d86479a4acd9888355ac5b8a47378a7fe2f49037c7a4416c93f2123c", + "eid": "ev:analysis:fbedd7c089d2595c", "eid_ok": true, "cited": { "what": "phrase" @@ -8968,37 +17473,37 @@ [ "同口径", "通过", - null, - null, - null + "—", + "—", + "—" ], [ "窗口长度", "核对不了", - null, - null, - null + "—", + "—", + "—" ], [ "整期", "核对不了", "核对不了", "核对不了", - null + "—" ], [ "星期构成", "核对不了", - null, - null, - null + "—", + "—", + "—" ], [ "数据问题", "通过", - null, - null, - null + "—", + "—", + "—" ] ], "masked": [], @@ -9013,7 +17518,7 @@ "ref": "last_week", "role": "base", "role_label": "基期", - "artifact": "0f9d43f91a5ea754fca6cf494fc69b373fa1fadd85eaccf1dbca2b1d65542e2c", + "artifact": "843e7e96c4a5c036093203b54af6d7f11565aa9bb38db53b2df49c04ac2844ec", "columns": [ "gmv" ], @@ -9028,7 +17533,7 @@ "ref": "this_week", "role": "target", "role_label": "本期", - "artifact": "5659261ab82f038f44106c558cab3c57aed2e86eb9eb0426d34c81cfc5029278", + "artifact": "7f6252ec2ffe6a8818000b03eba0804096439a0ea0f0a90d783d11efc2a97895", "columns": [ "gmv" ], @@ -9048,7 +17553,7 @@ "step": "analysis_seal", "alias": "", "node_id": "kpi", - "artifact": "f5d88bbccf1fdaf6ad3724cf6a2f5e0eea5defdd386e8c85cf663bc2ec14fde2", + "artifact": "95fae782d86479a4acd9888355ac5b8a47378a7fe2f49037c7a4416c93f2123c", "ledger": false, "hash_ok": true, "eid_ok": true, @@ -9062,8 +17567,8 @@ }, { "step": "input", - "artifact": "5659261ab82f038f44106c558cab3c57aed2e86eb9eb0426d34c81cfc5029278", - "eid": "ev:cell:31abb0e1cb0cb3ca", + "artifact": "7f6252ec2ffe6a8818000b03eba0804096439a0ea0f0a90d783d11efc2a97895", + "eid": "ev:cell:b2aca6553acd6f1f", "locator": { "column": "gmv", "row": 0 @@ -9078,8 +17583,8 @@ }, { "step": "input", - "artifact": "0f9d43f91a5ea754fca6cf494fc69b373fa1fadd85eaccf1dbca2b1d65542e2c", - "eid": "ev:cell:f3221a76e3c58c31", + "artifact": "843e7e96c4a5c036093203b54af6d7f11565aa9bb38db53b2df49c04ac2844ec", + "eid": "ev:cell:85ff4ca6a21650c7", "locator": { "column": "gmv", "row": 0 @@ -9095,7 +17600,7 @@ { "step": "query", "alias": "Q1", - "artifact": "5659261ab82f038f44106c558cab3c57aed2e86eb9eb0426d34c81cfc5029278", + "artifact": "7f6252ec2ffe6a8818000b03eba0804096439a0ea0f0a90d783d11efc2a97895", "node_id": "this_week", "tool": "db_query__shop", "source": "shop", @@ -9134,7 +17639,7 @@ "column_types": { "gmv": "number" }, - "schema_artifact": "4c3229daead9cdde26fab4b3156cfc17eba8cec291a35b54e2af392a8a694aec", + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", "catalog": [ { "table": "orders", @@ -9145,7 +17650,7 @@ { "step": "query", "alias": "Q2", - "artifact": "0f9d43f91a5ea754fca6cf494fc69b373fa1fadd85eaccf1dbca2b1d65542e2c", + "artifact": "843e7e96c4a5c036093203b54af6d7f11565aa9bb38db53b2df49c04ac2844ec", "node_id": "last_week", "tool": "db_query__shop", "source": "shop", @@ -9184,7 +17689,7 @@ "column_types": { "gmv": "number" }, - "schema_artifact": "4c3229daead9cdde26fab4b3156cfc17eba8cec291a35b54e2af392a8a694aec", + "schema_artifact": "3324dd9c82f1d9ec2771f14ffbcf2344e459b9864e6a7e3106e516590f263f65", "catalog": [ { "table": "orders", @@ -9206,7 +17711,7 @@ } }, "graph": { - "run_id": "153afe100eb0406e8be4d9dc7adac8d6", + "run_id": "9367b703c01d492891d1ae80113eb973", "schema": "agentlab.evidence/1", "seal": { "sealed": true, @@ -9217,7 +17722,7 @@ "reports": [ { "node_id": "write", - "doc_artifact": "e8572d3a890d844783f980891af048db3b71d7533b85ce3ca00926acc199fdca", + "doc_artifact": "e75fd02f25fef1593d17c4151f632755cdda3bcbfe7060c43ef4206fbcc218aa", "doc_sealed": true, "hash_ok": true, "ok": true, @@ -9254,11 +17759,11 @@ "evidence": [ { "alias": "Q1", - "eid": "ev:query:60498acf9bf713c7", + "eid": "ev:query:6f585173ecdd78d9", "kind": "query", "label": "db_query__shop · 1 行", "node_id": "this_week", - "artifact": "5659261ab82f038f44106c558cab3c57aed2e86eb9eb0426d34c81cfc5029278", + "artifact": "7f6252ec2ffe6a8818000b03eba0804096439a0ea0f0a90d783d11efc2a97895", "sealed": true, "cited_by": [], "units": [], @@ -9273,11 +17778,11 @@ }, { "alias": "Q2", - "eid": "ev:query:62b02f6bb6886f1c", + "eid": "ev:query:25033729f2cf3072", "kind": "query", "label": "db_query__shop · 1 行", "node_id": "last_week", - "artifact": "0f9d43f91a5ea754fca6cf494fc69b373fa1fadd85eaccf1dbca2b1d65542e2c", + "artifact": "843e7e96c4a5c036093203b54af6d7f11565aa9bb38db53b2df49c04ac2844ec", "sealed": true, "cited_by": [], "units": [], @@ -9292,11 +17797,11 @@ }, { "alias": "m:wow", - "eid": "ev:metric:a2ec409041e4deb7", + "eid": "ev:metric:f800d62ed5db82c6", "kind": "metric", "label": "环比 = -12.6%", "node_id": "kpi", - "artifact": "bc5a8e29e70745eed2c7dfabc866532ba1ef1953cbc1cc8d77d9eb02da0cdf84", + "artifact": "ee4f584270883dad6b80a231a42f95212d4d166f5b61f6398973a3a16cbea115", "sealed": true, "cited_by": [ "s1" @@ -9346,7 +17851,7 @@ "mode": "cited" }, "audit": { - "run_id": "153afe100eb0406e8be4d9dc7adac8d6", + "run_id": "9367b703c01d492891d1ae80113eb973", "schema": "agentlab.evidence.audit/1", "mode": "cited", "seal": { @@ -9360,7 +17865,7 @@ "reports": [ { "node_id": "write", - "doc_artifact": "e8572d3a890d844783f980891af048db3b71d7533b85ce3ca00926acc199fdca", + "doc_artifact": "e75fd02f25fef1593d17c4151f632755cdda3bcbfe7060c43ef4206fbcc218aa", "hash_ok": true, "doc_sealed": true, "fields": [ @@ -9412,8 +17917,8 @@ "alias": "m:wow", "evidence_kind": "metric", "evidence": "环比 = -12.6%", - "eid": "ev:metric:a2ec409041e4deb7", - "artifact": "bc5a8e29e70745eed2c7dfabc866532ba1ef1953cbc1cc8d77d9eb02da0cdf84", + "eid": "ev:metric:f800d62ed5db82c6", + "artifact": "ee4f584270883dad6b80a231a42f95212d4d166f5b61f6398973a3a16cbea115", "node_id": "kpi", "sealed": true, "span": [ @@ -9458,7 +17963,7 @@ "tier": "formal", "report": { "node_id": "write", - "doc_artifact": "e8572d3a890d844783f980891af048db3b71d7533b85ce3ca00926acc199fdca" + "doc_artifact": "e75fd02f25fef1593d17c4151f632755cdda3bcbfe7060c43ef4206fbcc218aa" }, "calibers": [], "metrics_checked": 0, @@ -9480,7 +17985,7 @@ 3, 9 ], - "eid": "ev:metric:a2ec409041e4deb7" + "eid": "ev:metric:f800d62ed5db82c6" } ], "stats": { @@ -9504,7 +18009,7 @@ "analysis_claims": 0 }, "gaps": [], - "declared_at": "2026-10-21T10:36:37.326911+00:00" + "declared_at": "2026-10-21T15:22:25.849170+00:00" } } } diff --git a/scripts/check-evidence.mjs b/scripts/check-evidence.mjs index 738cd501..e3699549 100644 --- a/scripts/check-evidence.mjs +++ b/scripts/check-evidence.mjs @@ -614,6 +614,15 @@ await section('analysis', '分析结论:判定语、具名的数、结果表 check('计算一步:关键数的代入式照服务端', (await calc.locator('[data-ev-analysis-formulas]').innerText()).includes('华东的占比 = 华东的变化 ÷ 总变化 = -300 ÷ (-340) = 88.2%')) check('……具名的数、结果表(表头是给人看的列名)', await calc.locator('[data-ev-analysis-value="top_share"]').count() === 1 && (await calc.locator('[data-ev-analysis-table] th').allInnerTexts()).join('、').includes('占变化的比重')) + // 第 2 波 S1:占比、变化率按百分数显示(以前照原样写 0.8823529412),空格写「—」不写 null + check('……具名的数按结论记的格式写:占比 88.2%,不是 0.8823529412', + (await calc.locator('[data-ev-analysis-value="top_share"]').innerText()).includes('88.2%') + && !(await calc.locator('[data-ev-analysis-value="top_share"]').innerText()).includes('0.88')) + const calcRows = (await calc.locator('[data-ev-analysis-table] tbody tr').allInnerTexts()).map((t) => t.replace(/\s+/g, ' ')) + check('……结果表照结论记的格式写:变化率 -30.0%、占变化的比重 88.2%,空格写「—」', + calcRows[0].includes('-30.0%') && calcRows[0].includes('88.2%') && !calcRows[0].includes('null') + && !calcRows[0].includes('-0.3') && !(await calc.locator('[data-ev-analysis-table] tbody').innerText()).includes('null'), + calcRows[0]) const inputs = p.locator('[data-ev-analysis-input]') check('输入一步:每份一节(基期总数、本期总数、数据)', JSON.stringify(await inputs.evaluateAll((els) => els.map((e) => e.dataset.evAnalysisInput))) === JSON.stringify(['headline_base', 'headline_target', 'data'])) @@ -630,6 +639,14 @@ await section('analysis', '分析结论:判定语、具名的数、结果表 check('分析结论的数不走口径账本:没有「口径」一步', await p.locator('[data-ev-ledger]').count() === 0) check('面板底下写服务端的说明(判定只说明变化来自哪里)', (await p.locator('[data-ev-analysis-note]').innerText()).includes('判定只说明变化来自哪里')) + // 没写换算的具名的数、结果表的格:按结论记的格式显示(第 2 波 S1),正文、出处链、整表一致 + for (const [sid, text] of [['s19', '-30.0%'], ['s21', '88.2%'], ['s23', '88.2%']]) { + check(`没写换算的 ${sid === 's23' ? '具名的数 [[a:A1.top_share]]' : '结果表的格 [[v:A1.r0.' + (sid === 's19' ? 'pct' : 'share') + ']]'}按结论记的格式显示 ${text}`, + (await box.locator(`[data-seg="${sid}"]`).innerText()) === text, await box.locator(`[data-seg="${sid}"]`).innerText()) + } + check('……整表 [[table:A1 cols=region,delta,pct,share]] 的格也按格式写', (await box.locator('[data-seg="s38"]').innerText()) === '-30.0%' + && (await box.locator('[data-seg="s40"]').innerText()) === '88.2%') + // 具名的数、结果表的格:同一条链,「这一处引用的是」写清是哪一项,被引用的那个描出来 await box.locator('[data-seg="s9"]').click() await p.locator('[data-ev-analysis-cited="value"]').waitFor({ timeout: 8000 }) diff --git a/scripts/check-runs.mjs b/scripts/check-runs.mjs index 904f1c37..1809305a 100644 --- a/scripts/check-runs.mjs +++ b/scripts/check-runs.mjs @@ -2270,7 +2270,11 @@ await section('证据页签:分析说法违规的审计行写种类的叫法 && claimed.every((r) => r.label.includes(',') && !r.label.includes('无证据')), JSON.stringify(claimed.map((r) => r.label))) check('……别的无证据行照旧写「无证据」(没挂依据的两句结论)', rows.filter((r) => !r.issue && r.state === '?无证据').length === 2, JSON.stringify(rows.map((r) => `${r.issue}:${r.state}`))) - check('……有出处那一组:判定语、具名的数、结果表的格三行', rows.filter((r) => r.state.includes('有出处')).length === 3, JSON.stringify(rows.map((r) => r.state))) + // 第 2 波 S1 起报告多引了变化率、比重两格、一处没写换算的具名的数、整表展开的 8 格:有出处那一组的行数照夹具里 + // 审计的「有出处」一组数(不再写死 3) + const cited = a.audit.groups.find((g) => g.key === 'cited')?.count ?? 0 + check('……有出处那一组:判定语、具名的数、结果表的各格,行数和审计的一致', cited > 3 + && rows.filter((r) => r.state.includes('有出处')).length === cited, `${cited} / ${JSON.stringify(rows.map((r) => r.state))}`) await page.route(new RegExp(`/api/runs/${EV_A}/evidence/segments/`), (r) => { const sid = decodeURIComponent(new URL(r.request().url()).pathname.split('/').pop()) return a.segments[sid] ? r.fulfill({ json: a.segments[sid] }) : r.fulfill({ status: 404, json: { detail: '没有这个片段' } })